UNPKG

@ahmedhegazee/nestjs-telescope

Version:

Advanced observability and monitoring solution for NestJS applications with ML-powered analytics, enterprise features, and production-ready scaling

157 lines (156 loc) 4.77 kB
import { OnModuleInit } from '@nestjs/common'; import { Observable } from 'rxjs'; import { TelescopeService } from './telescope.service'; export interface CorrelationContext { traceId: string; requestId?: string; userId?: string; sessionId?: string; timestamp: Date; request?: any; query?: any; exception?: any; job?: any; cache?: any; performance: { totalDuration: number; requestDuration?: number; queryDuration?: number; cacheDuration?: number; jobDuration?: number; memoryUsage?: number; cpuUsage?: number; queryCount: number; cacheOperations: number; jobsTriggered: number; exceptionsThrown: number; }; bottlenecks: BottleneckAnalysis[]; recommendations: string[]; healthScore: number; } export interface BottleneckAnalysis { type: 'query' | 'cache' | 'job' | 'exception' | 'network' | 'cpu' | 'memory'; severity: 'low' | 'medium' | 'high' | 'critical'; component: string; duration: number; percentage: number; description: string; recommendation: string; } export interface PerformanceMetrics { totalRequests: number; averageResponseTime: number; p95ResponseTime: number; p99ResponseTime: number; errorRate: number; components: { database: { averageTime: number; slowQueries: number; connectionIssues: number; }; cache: { averageTime: number; hitRate: number; missRate: number; errorRate: number; }; jobs: { averageTime: number; failureRate: number; queueBacklog: number; }; exceptions: { rate: number; criticalCount: number; averageImpact: number; }; }; correlations: { queryToResponse: number; cacheToResponse: number; jobToResponse: number; exceptionToResponse: number; memoryToResponse: number; cpuToResponse: number; }; trends: { responseTime: { current: number; change: number; trend: 'up' | 'down' | 'stable'; }; errorRate: { current: number; change: number; trend: 'up' | 'down' | 'stable'; }; throughput: { current: number; change: number; trend: 'up' | 'down' | 'stable'; }; }; } export interface PerformanceAlert { id: string; type: 'bottleneck' | 'degradation' | 'anomaly' | 'threshold'; severity: 'low' | 'medium' | 'high' | 'critical'; message: string; timestamp: Date; traceId?: string; component: string; metrics: any; recommendations: string[]; acknowledged: boolean; } export declare class PerformanceCorrelationService implements OnModuleInit { private readonly telescopeService; private readonly logger; private readonly destroy$; private correlationHistory; private performanceMetrics; private alertHistory; private readonly correlationSubject; private readonly metricsSubject; private readonly alertsSubject; private activeTraces; private responseTimeHistory; private correlationCoefficients; constructor(telescopeService: TelescopeService); onModuleInit(): Promise<void>; private initializeMetrics; correlateWatcherData(watcherType: 'request' | 'query' | 'exception' | 'job' | 'cache', data: any): void; private extractTraceId; private updateTraceWithWatcherData; private finalizeCorrelation; private analyzeBottlenecks; private generateRecommendations; private calculateHealthScore; private updatePerformanceMetrics; private updateComponentMetrics; private updateCorrelations; private calculateCorrelation; private updateTrends; private calculateAverage; private checkPerformanceAlerts; private createAlert; private startPeriodicProcessing; private cleanupOldTraces; private cleanupOldData; getMetrics(): PerformanceMetrics; getMetricsStream(): Observable<PerformanceMetrics>; getCorrelationStream(): Observable<CorrelationContext>; getAlertsStream(): Observable<PerformanceAlert>; getRecentCorrelations(limit?: number): CorrelationContext[]; getCorrelationsByTraceId(traceId: string): CorrelationContext | undefined; getBottlenecksByComponent(component: string, limit?: number): BottleneckAnalysis[]; acknowledgeAlert(alertId: string): boolean; getActiveTraces(): Array<{ traceId: string; watchers: string[]; startTime: Date; }>; onDestroy(): void; }