@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
TypeScript
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;
}