import { Observable } from 'rxjs';
import { RequestContext, ResponseContext } from './request-watcher.interceptor';
export interface RequestPerformanceMetrics {
    totalRequests: number;
    requestsPerSecond: number;
    averageResponseTime: number;
    medianResponseTime: number;
    p95ResponseTime: number;
    p99ResponseTime: number;
    slowRequestCount: number;
    errorCount: number;
    errorRate: number;
    byMethod: Record<string, MethodMetrics>;
    byStatusCode: Record<number, number>;
    byEndpoint: Record<string, EndpointMetrics>;
    timeWindow: TimeWindowMetrics;
}
export interface MethodMetrics {
    count: number;
    averageResponseTime: number;
    errorCount: number;
    errorRate: number;
}
export interface EndpointMetrics {
    count: number;
    averageResponseTime: number;
    errorCount: number;
    errorRate: number;
    lastAccessed: Date;
}
export interface TimeWindowMetrics {
    last5Minutes: number;
    last15Minutes: number;
    last30Minutes: number;
    last60Minutes: number;
}
export interface RequestDataPoint {
    requestContext: RequestContext;
    responseContext: ResponseContext;
    error: Error | null;
    timestamp: Date;
}
export declare class RequestMetricsService {
    private readonly logger;
    private readonly dataSubject;
    private readonly requestHistory;
    private readonly maxHistorySize;
    private readonly responseTimes;
    private readonly maxResponseTimesSamples;
    private currentMetrics;
    constructor();
    private setupMetricsProcessing;
    private startPeriodicCalculations;
    recordRequest(requestContext: RequestContext, responseContext: ResponseContext, error: Error | null): void;
    private updateMetrics;
    private calculateNewAverage;
    private calculatePercentile;
    private updateMethodMetrics;
    private updateStatusCodeMetrics;
    private updateEndpointMetrics;
    private normalizeEndpoint;
    private updateTimeWindowMetrics;
    private updateRequestsPerSecond;
    getMetrics(): RequestPerformanceMetrics;
    getMetricsStream(): Observable<RequestPerformanceMetrics>;
    getTopEndpoints(limit?: number): Array<{
        endpoint: string;
        metrics: EndpointMetrics;
    }>;
    getSlowestEndpoints(limit?: number): Array<{
        endpoint: string;
        metrics: EndpointMetrics;
    }>;
    getErrorProneEndpoints(limit?: number): Array<{
        endpoint: string;
        metrics: EndpointMetrics;
    }>;
    getRecentRequests(limit?: number): RequestDataPoint[];
    getRequestsInTimeWindow(windowMs: number): RequestDataPoint[];
    reset(): void;
}
