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