/* Closed metric catalog for the Warpgogol observability port (RFC-0337). Every metric emitted anywhere in the ecosystem MUST be declared here. Do not import node: modules — must be Workers-compatible. RFC-0337: initial implementation with smoke metric only. RFC-0340/0341/0343 append entries. RFC-0807: add back prefix metrics for service health monitoring. */ export type WarpgogolMetricKind = "counter" | "gauge" | "histogram"; export interface WarpgogolMetricSpec { name: string; kind: WarpgogolMetricKind; help: string; labelKeys: readonly string[]; unit?: string; buckets?: readonly number[]; } export const METRIC_NAME_PATTERN = /^warpgogol_(factory|probe|delivery|workers|back)_[a-z0-9_]+$/; export const FORBIDDEN_LABEL_KEYS: readonly string[] = [ "user_id", "session_id", "request_id", "run_id", "url", "path", "email", ]; export const WARPGOGOL_METRIC_REGISTRY: readonly WarpgogolMetricSpec[] = [ { name: "warpgogol_factory_smoke_total", kind: "counter", help: "Smoke-test counter emitted by observability.factory.smoke to verify the OTLP pipe end-to-end (RFC-0340).", labelKeys: [], unit: "1", }, { name: "warpgogol_factory_command_runs_total", kind: "counter", help: "Total kernel command executions by command name and outcome (RFC-0340).", labelKeys: ["command", "status", "site_id"], unit: "1", }, { name: "warpgogol_factory_command_duration_seconds", kind: "histogram", help: "Kernel command execution duration in seconds (RFC-0340).", labelKeys: ["command", "site_id"], unit: "s", buckets: [0.5, 1, 2, 5, 10, 30, 60, 120, 300, 600], }, { name: "warpgogol_factory_diagnostics_total", kind: "counter", help: "Total diagnostics emitted by kernel commands by severity (RFC-0340).", labelKeys: ["command", "severity", "site_id"], unit: "1", }, { name: "warpgogol_probe_up", kind: "gauge", help: "1 = site route is up (status 2xx/3xx AND sentinel ok); else 0 (RFC-0341).", labelKeys: ["site_id", "route"], unit: "1", }, { name: "warpgogol_probe_ttfb_seconds", kind: "gauge", help: "Last observed time-to-first-byte in seconds (RFC-0341).", labelKeys: ["site_id", "route"], unit: "s", }, { name: "warpgogol_probe_http_status_class_total", kind: "counter", help: "Total probe requests by HTTP status class (RFC-0341).", labelKeys: ["site_id", "route", "status_class"], unit: "1", }, { name: "warpgogol_probe_content_ok", kind: "gauge", help: "1 = content sentinel matched; 0 = sentinel failed (RFC-0341).", labelKeys: ["site_id", "route"], unit: "1", }, { name: "warpgogol_probe_cert_expiry_days", kind: "gauge", help: "Days until TLS certificate expiry (RFC-0341).", labelKeys: ["site_id"], unit: "d", }, { name: "warpgogol_probe_deep_ok", kind: "gauge", help: "Phase 2 deep probe result: 1 = ok, 0 = failed (RFC-0341 Phase 2).", labelKeys: ["site_id"], unit: "1", }, { name: "warpgogol_delivery_requests_total", kind: "counter", help: "Total HTTP requests served by Cloudflare per site, cache status, and status class (RFC-0343).", labelKeys: ["site_id", "cache_status", "status_class"], unit: "1", }, { name: "warpgogol_delivery_bytes_total", kind: "counter", help: "Total bytes served by Cloudflare per site (RFC-0343).", labelKeys: ["site_id"], unit: "By", }, { name: "warpgogol_workers_requests_total", kind: "counter", help: "Total Cloudflare Worker invocations per site (RFC-0343).", labelKeys: ["site_id"], unit: "1", }, { name: "warpgogol_workers_errors_total", kind: "counter", help: "Total Cloudflare Worker errors per site (RFC-0343).", labelKeys: ["site_id"], unit: "1", }, { name: "warpgogol_back_requests_total", kind: "counter", help: "Total HTTP requests served by backend services (RFC-0807).", labelKeys: ["service", "status_class"], unit: "1", }, { name: "warpgogol_back_up", kind: "gauge", help: "1 = service self-reports healthy; 0 = unhealthy (RFC-0807).", labelKeys: ["service"], unit: "1", }, { name: "warpgogol_back_last_run_total", kind: "counter", help: "Total scheduled runs by outcome (success/failure) (RFC-0807).", labelKeys: ["service", "status"], unit: "1", }, { name: "warpgogol_back_last_error_total", kind: "counter", help: "Total errors encountered by the service (RFC-0807).", labelKeys: ["service"], unit: "1", }, { name: "warpgogol_back_queue_depth", kind: "gauge", help: "Current queue depth (items pending processing) (RFC-0807).", labelKeys: ["service"], unit: "1", }, ]; export function findMetricSpec(name: string): WarpgogolMetricSpec | undefined { return WARPGOGOL_METRIC_REGISTRY.find((spec) => spec.name === name); } export function isMetricNameValid(name: string): boolean { return METRIC_NAME_PATTERN.test(name); } export function isLabelKeyForbidden(key: string): boolean { return FORBIDDEN_LABEL_KEYS.includes(key); }