UNPKG

@ahmedhegazee/nestjs-telescope

Version:

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

159 lines (158 loc) 4.64 kB
import { OnModuleInit } from '@nestjs/common'; import { Observable } from 'rxjs'; import { TelescopeConfig } from '../interfaces/telescope-config.interface'; export interface DatabaseConfig { enabled: boolean; type: 'postgresql' | 'mysql' | 'mongodb' | 'sqlite'; connection: { host: string; port: number; database: string; username: string; password: string; ssl?: boolean; poolSize?: number; timeout?: number; }; optimization: { autoIndexing: boolean; queryOptimization: boolean; connectionPooling: boolean; queryCaching: boolean; slowQueryThreshold: number; maxQueryTime: number; }; monitoring: { enabled: boolean; metricsInterval: number; slowQueryLogging: boolean; performanceAlerts: boolean; }; } export interface QueryMetrics { queryHash: string; sql: string; executionTime: number; rowsReturned: number; rowsAffected: number; timestamp: Date; connectionId: string; userId?: string; application: string; slow: boolean; optimized: boolean; } export interface IndexSuggestion { id: string; table: string; columns: string[]; type: 'btree' | 'hash' | 'gin' | 'gist' | 'brin'; reason: string; estimatedImprovement: number; creationCost: number; priority: 'low' | 'medium' | 'high' | 'critical'; status: 'pending' | 'created' | 'failed' | 'ignored'; } export interface DatabasePerformance { connections: { active: number; idle: number; max: number; utilization: number; }; queries: { total: number; slow: number; averageTime: number; peakTime: number; throughput: number; }; storage: { size: number; growth: number; fragmentation: number; }; cache: { hitRate: number; size: number; evictions: number; }; locks: { active: number; waiting: number; deadlocks: number; }; } export interface OptimizationResult { success: boolean; operation: string; duration: number; improvements: { queryTime: number; throughput: number; resourceUsage: number; }; recommendations: string[]; errors?: string[]; } export declare class DatabaseOptimizerService implements OnModuleInit { private readonly telescopeConfig; private readonly logger; private readonly queryMetrics; private readonly indexSuggestions; private readonly performanceSubject; private readonly optimizationSubject; private readonly config; private monitoringInterval; private optimizationInterval; constructor(telescopeConfig: TelescopeConfig); onModuleInit(): Promise<void>; private getDefaultDatabaseConfig; private initializeOptimizer; private initializeConnectionPool; private initializeQueryCache; private analyzeExistingIndexes; private startMonitoring; private startOptimization; recordQuery(queryMetrics: QueryMetrics): Promise<void>; private analyzeSlowQuery; private generateIndexSuggestions; private analyzeQueryPattern; private determineIndexType; private estimateIndexImprovement; private estimateIndexCreationCost; private determineIndexPriority; getDatabasePerformance(): Promise<DatabasePerformance>; private getConnectionMetrics; private getQueryMetrics; private getStorageMetrics; private getCacheMetrics; private getLockMetrics; private checkPerformanceAlerts; private runOptimizationCycle; private analyzeQueryPatterns; private processIndexSuggestions; private createIndex; private optimizeSlowQueries; private optimizeQuery; private analyzeQueryOptimization; private generateOptimizedQuery; private testQueryOptimization; private cleanupOldData; private updateStatistics; getPerformanceUpdates(): Observable<DatabasePerformance>; getOptimizationUpdates(): Observable<OptimizationResult>; getIndexSuggestions(): IndexSuggestion[]; createIndexManually(suggestion: Omit<IndexSuggestion, 'id' | 'status'>): Promise<OptimizationResult>; getQueryAnalysis(queryHash: string): Promise<{ metrics: QueryMetrics[]; analysis: { totalExecutions: number; averageTime: number; slowExecutions: number; slowRate: number; trend: 'improving' | 'degrading' | 'stable'; }; } | null>; shutdown(): Promise<void>; }