PerformanceAlert.ts•2.41 kB
export interface AlertId {
  readonly value: string;
}
export type AlertType =
  | 'connection_pool_high_utilization'
  | 'slow_query_detected'
  | 'high_cpu_usage'
  | 'high_memory_usage'
  | 'high_disk_usage'
  | 'connection_timeout'
  | 'query_timeout';
export type AlertSeverity = 'low' | 'medium' | 'high' | 'critical';
export type AlertStatus = 'active' | 'acknowledged' | 'resolved';
export class PerformanceAlert {
  private _status: AlertStatus = 'active';
  private _acknowledgedAt?: Date;
  private _resolvedAt?: Date;
  constructor(
    private readonly _id: AlertId,
    private readonly _type: AlertType,
    private readonly _severity: AlertSeverity,
    private readonly _message: string,
    private readonly _details: Record<string, any>,
    private readonly _createdAt: Date = new Date()
  ) {}
  get id(): AlertId {
    return this._id;
  }
  get type(): AlertType {
    return this._type;
  }
  get severity(): AlertSeverity {
    return this._severity;
  }
  get message(): string {
    return this._message;
  }
  get details(): Record<string, any> {
    return { ...this._details };
  }
  get createdAt(): Date {
    return this._createdAt;
  }
  get status(): AlertStatus {
    return this._status;
  }
  get acknowledgedAt(): Date | undefined {
    return this._acknowledgedAt;
  }
  get resolvedAt(): Date | undefined {
    return this._resolvedAt;
  }
  acknowledge(): void {
    if (this._status === 'resolved') {
      throw new Error('Cannot acknowledge a resolved alert');
    }
    this._status = 'acknowledged';
    this._acknowledgedAt = new Date();
  }
  resolve(): void {
    this._status = 'resolved';
    this._resolvedAt = new Date();
  }
  isActive(): boolean {
    return this._status === 'active';
  }
  isAcknowledged(): boolean {
    return this._status === 'acknowledged';
  }
  isResolved(): boolean {
    return this._status === 'resolved';
  }
  getDuration(): number {
    const endTime = this._resolvedAt || new Date();
    return endTime.getTime() - this._createdAt.getTime();
  }
  isCritical(): boolean {
    return this._severity === 'critical';
  }
  shouldEscalate(thresholdMinutes: number = 30): boolean {
    if (this._status !== 'active') return false;
    const now = new Date();
    const minutesSinceCreated = (now.getTime() - this._createdAt.getTime()) / (1000 * 60);
    return minutesSinceCreated > thresholdMinutes;
  }
}