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