UNPKG

@ahmedhegazee/nestjs-telescope

Version:

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

122 lines (121 loc) 3.62 kB
import { Observable } from 'rxjs'; import { QueryContext } from './query-watcher.interceptor'; import { ConnectionPoolMetrics } from './connection-pool-monitor.service'; export interface QueryPerformanceMetrics { totalQueries: number; slowQueries: number; verySlowQueries: number; errorQueries: number; averageQueryTime: number; medianQueryTime: number; p95QueryTime: number; p99QueryTime: number; queriesPerSecond: number; queryTimePercentiles: { p50: number; p75: number; p90: number; p95: number; p99: number; }; operationBreakdown: { select: QueryOperationMetrics; insert: QueryOperationMetrics; update: QueryOperationMetrics; delete: QueryOperationMetrics; raw: QueryOperationMetrics; }; tableMetrics: Record<string, TableMetrics>; timeWindowMetrics: { last5Minutes: QueryWindowMetrics; last15Minutes: QueryWindowMetrics; last30Minutes: QueryWindowMetrics; last60Minutes: QueryWindowMetrics; }; topSlowQueries: SlowQueryInfo[]; nPlusOneDetections: number; connectionPoolMetrics?: ConnectionPoolMetrics; } export interface QueryOperationMetrics { count: number; averageTime: number; errorCount: number; errorRate: number; slowCount: number; slowRate: number; } export interface TableMetrics { queryCount: number; averageQueryTime: number; slowQueryCount: number; errorCount: number; mostCommonOperations: Array<{ operation: string; count: number; averageTime: number; }>; lastAccessed: Date; } export interface QueryWindowMetrics { queryCount: number; averageTime: number; slowQueryCount: number; errorCount: number; queriesPerSecond: number; } export interface SlowQueryInfo { sql: string; averageTime: number; count: number; lastExecuted: Date; tableName?: string; operation: string; } export interface QueryDataPoint { context: QueryContext; timestamp: Date; } export declare class QueryMetricsService { private readonly logger; private readonly destroy$; private readonly dataSubject; private readonly queryHistory; private readonly queryTimes; private readonly maxHistorySize; private readonly maxTimesSamples; private currentMetrics; constructor(); private initializeOperationMetrics; private initializeWindowMetrics; private setupMetricsProcessing; private startPeriodicCalculations; recordQuery(context: QueryContext): void; private updateMetrics; private calculateNewAverage; private updateOperationMetrics; private updateTableMetrics; private updateTopSlowQueries; private normalizeQuery; private updateTimeWindowMetrics; private updateQueriesPerSecond; private updatePercentiles; private calculatePercentile; private cleanupOldData; recordNPlusOneDetection(): void; updateConnectionPoolMetrics(connectionMetrics: ConnectionPoolMetrics): void; getMetrics(): QueryPerformanceMetrics; getMetricsStream(): Observable<QueryPerformanceMetrics>; getSlowQueries(limit?: number): SlowQueryInfo[]; getTableMetrics(tableName: string): TableMetrics | undefined; getTopTables(limit?: number): Array<{ tableName: string; metrics: TableMetrics; }>; getSlowestTables(limit?: number): Array<{ tableName: string; metrics: TableMetrics; }>; getRecentQueries(limit?: number): QueryDataPoint[]; reset(): void; destroy(): void; }