/** * Prometheus Metrics * * Proper Prometheus exposition format. Auto-tracks: * * forge_http_request_duration_seconds — histogram, per route + status + tenant * forge_http_requests_total — counter, per route + status + tenant * forge_http_active_requests — gauge, current in-flight * forge_rpc_duration_seconds — histogram, per target + method * forge_rpc_total — counter, per target + method + success/error * forge_circuit_breaker_state — gauge, 0=closed 1=open 2=half-open * forge_concurrency_limit — gauge, per-service adaptive limit * forge_concurrency_in_flight — gauge, per-service in-flight * forge_ws_connections_active — gauge, current WebSocket connections * forge_ws_messages_total — counter, WebSocket messages * forge_event_loop_lag_seconds — gauge with percentiles (p50, p95, p99) * * GET /metrics → text/plain Prometheus format * * Usage: * const metrics = new PrometheusMetrics('users', 0); * metrics.httpRequestDuration(0.045, { method: 'GET', path: '/users/:id', status: 200, tenant_id: 't_acme' }); * metrics.expose() → "# HELP forge_http_request_duration_seconds ..." */ import { monitorEventLoopDelay } from "node:perf_hooks"; interface ErrorLike { code?: string; statusCode?: number; } type LabelValue = string | number | boolean | null | undefined; interface Labels { [key: string]: LabelValue; } interface HistogramEntry { count: number; sum: number; buckets: number[]; bucketBounds: number[]; } /** P2: Normalize error codes to a finite set to prevent cardinality bombs */ export declare function normalizeErrorCode(err: ErrorLike): string; export declare class PrometheusMetrics { serviceName: string; workerId: number; startTime: number; httpBuckets: number[]; rpcBuckets: number[]; _counters: Map; _gauges: Map; _histograms: Map; _eventLoopMonitor: ReturnType | null; constructor(serviceName: string, workerId: number); httpRequestStart(): void; httpRequestEnd(durationSecs: number, labels?: Labels): void; rpcCall(durationSecs: number, labels?: Labels): void; wsConnectionOpen(): void; wsConnectionClose(): void; wsMessage(direction?: string): void; concurrencyUpdate(target: string, limit: number, inFlight: number): void; circuitBreakerState(target: string, state: string): void; counter(name: string, value?: number, labels?: Labels): void; gauge(name: string, value: number, labels?: Labels): void; histogram(name: string, value: number, labels?: Labels, buckets?: number[]): void; /** * Render all metrics in Prometheus text exposition format. */ expose(): string; _labelStr(labels: Labels): string; _counterInc(name: string, labels?: Labels, value?: number): void; _gaugeSet(name: string, value: number, labels?: Labels): void; _gaugeInc(name: string, labels?: Labels): void; _gaugeDec(name: string, labels?: Labels): void; _histogramObserve(name: string, value: number, labels: Labels | undefined, buckets: number[]): void; /** * OPS-8: Cleanup event loop monitor when metrics instance is no longer needed */ cleanup(): void; } export {}; //# sourceMappingURL=Prometheus.d.ts.map