/**
 * 성능 모니터링 서비스
 * 시스템 성능 지표 수집, 분석, 알림 기능 제공
 */
import Database from 'better-sqlite3';
export interface PerformanceMetrics {
    timestamp: Date;
    memory: {
        rss: number;
        heapTotal: number;
        heapUsed: number;
        external: number;
        usagePercent: number;
    };
    cpu: {
        user: number;
        system: number;
        percent: number;
    };
    database: {
        size: number;
        memoryCount: number;
        queryTime: number;
    };
    uptime: number;
    search?: {
        total: number;
        averageTime: number;
        byType: {
            text: number;
            vector: number;
            hybrid: number;
        };
        cacheHitRate: number;
        embeddingSearchRate: number;
    };
}
export interface AlertThresholds {
    memoryUsagePercent: number;
    cpuUsagePercent: number;
    databaseSizeMB: number;
    queryTimeMs: number;
}
export interface PerformanceAlert {
    id: string;
    type: 'memory' | 'cpu' | 'database' | 'query';
    severity: 'warning' | 'critical';
    message: string;
    value: number;
    threshold: number;
    timestamp: Date;
    resolved: boolean;
}
export declare class PerformanceMonitor {
    private db;
    private thresholds;
    private alerts;
    private metricsHistory;
    private maxHistorySize;
    private monitoringInterval;
    private scheduledCpuUsage;
    private scheduledMeasurementTime;
    private onDemandCpuUsage;
    private onDemandMeasurementTime;
    private latestCpuSnapshot;
    private lastCpuPercent;
    constructor(thresholds?: Partial<AlertThresholds>);
    /**
     * RSS·힙 압력 비율의 분모(바이트).
     * Docker/Kubernetes 등 OS가 부과한 메모리 상한이 있으면 `process.constrainedMemory()`를 쓰고,
     * 없거나 비정상 값이면 호스트 `os.totalmem()`으로 폴백한다.
     */
    private getMemoryPressureDenominatorBytes;
    private memoryRatioToPercent;
    /**
     * 모니터링 시작
     */
    initialize(db: Database.Database): void;
    /**
     * 데이터베이스 설정
     */
    setDatabase(db: Database.Database | null): void;
    /**
     * 성능 지표 수집
     *
     * tick=true: 스케줄된 모니터링 호출 — scheduled baseline을 갱신하고 lastCpuPercent를 기록합니다.
     * tick=false(기본): 온디맨드 읽기 — on-demand baseline만 갱신하여 scheduled baseline과 간섭하지 않습니다.
     */
    collectMetrics(options?: {
        tick?: boolean;
    }): Promise<any>;
    /**
     * 알림 검사
     */
    private checkAlerts;
    /**
     * 지표 히스토리에 추가
     */
    private addToHistory;
    /**
     * 알림 해결
     */
    resolveAlert(alertId: string): boolean;
    /**
     * 현재 성능 지표 조회
     */
    getMetrics(): Promise<PerformanceMetrics>;
    /**
     * 성능 지표 히스토리 조회
     */
    getMetricsHistory(limit?: number): PerformanceMetrics[];
    /**
     * 활성 알림 조회
     */
    getAlerts(): PerformanceAlert[];
    getActiveAlerts(): PerformanceAlert[];
    getAllAlerts(): PerformanceAlert[];
    /**
     * 알림 초기화
     */
    clearAlerts(): void;
    /**
     * 성능 리포트 생성
     */
    getPerformanceReport(): Promise<{
        summary: {
            current: PerformanceMetrics | null;
            alerts: {
                active: number;
                total: number;
            };
            trends: {
                memoryTrend: 'increasing' | 'decreasing' | 'stable';
                dbSizeTrend: 'increasing' | 'decreasing' | 'stable';
            };
        };
        metrics: PerformanceMetrics[];
        alerts: PerformanceAlert[];
        recommendations: string[];
        analytics: ReturnType<PerformanceMonitor['getMetricsAnalytics']>;
        timestamp: Date;
    }>;
    /**
     * 권장사항 생성
     */
    private generateRecommendations;
    /**
     * 모니터링 시작
     */
    startMonitoring(intervalMs?: number): void;
    /**
     * 모니터링 중지
     */
    stopMonitoring(): void;
    /**
     * 모니터링 상태 확인
     */
    isMonitoring(): boolean;
    /**
     * 검색 통계 기록
     */
    recordSearch(type: 'text' | 'vector' | 'hybrid', duration: number, cacheHit?: boolean): void;
    /**
     * 검색 메트릭 조회
     */
    getSearchMetrics(): {
        totalSearches: number;
        averageSearchTime: number;
        searchByType: {
            text: number;
            vector: number;
            hybrid: number;
        };
        cacheHitRate: number;
        embeddingSearchRate: number;
    };
    /**
     * 메모리 메트릭 조회
     *
     * 비율 분모는 `getMemoryPressureDenominatorBytes()`와 동일(cgroup 한도 우선).
     * - `usagePercent` / `rssUsagePercent`: RSS가 프로세스에 부여된 메모리 예산에서 차지하는 비율(100% 초과 가능).
     * - `heapShareOfBudgetPercent`: V8 heapUsed가 동일 예산 대비 차지하는 비율이며, **heapUsed/heapTotal(V8 충전률)과는 다름**.
     * - `heapUsagePercent`: `heapShareOfBudgetPercent`와 동일(하위 호환). 신규 코드는 `heapShareOfBudgetPercent` 사용.
     */
    getMemoryMetrics(): {
        heapUsed: number;
        heapTotal: number;
        rss: number;
        external: number;
        /** RSS ÷ 예산 바이트 × 100 — `collectMetrics`·메모리 알림과 동일 축. 100% 초과 가능 */
        usagePercent: number;
        /** `usagePercent`와 동일 */
        rssUsagePercent: number;
        /** heapUsed ÷ 예산 바이트 × 100 (V8 heapTotal 대비 충전률 아님) */
        heapShareOfBudgetPercent: number;
        /** @deprecated `heapShareOfBudgetPercent`와 동일. 이름이 오해를 부를 수 있어 대체 필드 추가 */
        heapUsagePercent: number;
    };
    /**
     * 시스템 메트릭 조회
     */
    getSystemMetrics(): {
        uptime: number;
        cpuUsage: number;
        loadAverage: number[];
    };
    /**
     * 데이터베이스 메트릭 조회
     */
    getDatabaseMetrics(): Promise<{
        totalMemories: number;
        memoryByType: Record<string, number>;
        averageMemorySize: number;
        databaseSize: number;
    }>;
    /**
     * 통계 초기화
     */
    resetStats(): void;
    /**
     * 시스템 건강 상태 확인
     */
    isHealthy(): Promise<boolean>;
    /**
     * 메트릭 내보내기
     */
    exportMetrics(): Promise<string>;
    /**
     * 메트릭 가져오기
     */
    importMetrics(json: string): Promise<void>;
    /**
     * 성능 통계 요약
     */
    getPerformanceSummary(): {
        current: PerformanceMetrics | null;
        alerts: {
            active: number;
            total: number;
        };
        trends: {
            memoryTrend: 'increasing' | 'decreasing' | 'stable';
            dbSizeTrend: 'increasing' | 'decreasing' | 'stable';
        };
    };
    getMetricsAnalytics(limit?: number): {
        memory: {
            averageHeapUsedMB: number;
            peakHeapUsedMB: number;
            averageUsagePercent: number;
            history: number[];
        };
        cpu: {
            averagePercent: number;
            peakPercent: number;
            history: number[];
        };
        database: {
            averageSizeMB: number;
            lastSizeMB: number;
            growthRate: number;
        };
        search: {
            totalSearches: number;
            averageSearchTime: number;
            cacheHitRate: number;
            textShare: number;
            vectorShare: number;
            hybridShare: number;
        };
    };
    /**
     * 트렌드 분석
     */
    private analyzeTrend;
    /**
     * 임계값 업데이트
     */
    updateThresholds(newThresholds: Partial<AlertThresholds>): void;
    /**
     * 바이트를 읽기 쉬운 형식으로 변환
     */
    private formatBytes;
    /**
     * CPU 사용률 계산 (dual-baseline 설계)
     * 직전 baseline 이후의 (∆user + ∆system) / wallClock 으로 실제 사용률을 계산합니다.
     *
     * tick=true (scheduled): scheduledCpuUsage baseline 사용·갱신. lastCpuPercent도 갱신됩니다.
     * tick=false (on-demand): onDemandCpuUsage baseline 사용·갱신.
     *   scheduledCpuUsage는 건드리지 않아 scheduled tick의 측정 창이 보존됩니다.
     */
    private calculateCpuUsage;
    /**
     * 심각한 알림 처리
     */
    private handleCriticalAlert;
    /**
     * 데이터베이스 최적화
     */
    private optimizeDatabase;
    /**
     * 알림 통계 조회
     */
    getAlertStats(): {
        total: number;
        active: number;
        resolved: number;
        byType: Record<string, number>;
        bySeverity: Record<string, number>;
        recent: PerformanceAlert[];
    };
    /**
     * 알림 정리 (오래된 해결된 알림 제거)
     */
    cleanupOldAlerts(maxAgeHours?: number): void;
    /**
     * 메트릭 기록 (WAL 체크포인트 스케줄러 및 락 모니터용)
     */
    recordMetric(name: string, value: number): void;
    /**
     * 카운터 증가 (WAL 체크포인트 스케줄러 및 락 모니터용)
     */
    incrementCounter(name: string): void;
    /**
     * 로깅
     */
    private log;
}
export declare function getPerformanceMonitor(): PerformanceMonitor;
export declare function createPerformanceMonitor(thresholds?: Partial<AlertThresholds>): PerformanceMonitor;
//# sourceMappingURL=performance-monitor.d.ts.map