Metrics and alerts
This document explains which Spooky metrics matter most in production and how operators should use them for alerting and dashboards.
Read This With
- Metrics Reference for exact series names
- Observability Operator Bundle for the packaged dashboards, recording rules, alerts, and SLOs
- Control API Reference when you need current runtime state rather than trend
Purpose
Spooky exposes many counters, gauges, and labeled request families. Operators should focus on the metrics that answer:
- is traffic succeeding
- is latency rising
- is admission or overload policy firing
- are backends healthy
- are retries and hedges increasing
- is the runtime generation and control plane behaving normally
For the full catalog, see Metrics Reference.
Distributed quota-specific interpretation lives in Distributed Quota. Use that page when you need to distinguish quota exhaustion, quota backend degradation, and overload shedding.
Primary Production Domains
The metrics surface is easiest to understand by domain.
Request outcome metrics
These answer whether traffic is succeeding or failing.
Key families:
spooky_requests_totalspooky_requests_successspooky_requests_failurespooky_upstream_requests_total{upstream,status_class,outcome}spooky_backend_requests_total{upstream,backend,status_class,outcome}
Use these to answer:
- which upstream is failing
- which backend is producing the failures
- whether failures are timeouts, overload, rate-limit, or backend errors
Latency metrics
These answer how long requests are taking.
Key families:
spooky_upstream_request_latency_ms_bucketspooky_upstream_request_latency_ms_sumspooky_upstream_request_latency_ms_countspooky_route_latency_ms_p50spooky_route_latency_ms_p95spooky_route_latency_ms_p99
Prefer the histogram family for service-level alerting and the route percentile gauges for quick route-level dashboards.
Admission and overload metrics
These answer whether the system is refusing work before dispatch.
Key families:
spooky_policy_deniedspooky_request_rate_limitedspooky_overload_shedspooky_overload_shed_by_reason_total{reason=...}spooky_inflight_wait_admit_total{scope=...}spooky_brownout_activespooky_circuit_breaker_rejected_total
These are especially important during load tests, incident response, and capacity tuning.
Backend health and lifecycle metrics
These answer whether upstream capacity is healthy.
Key families:
spooky_health_checks_totalspooky_health_checks_successspooky_health_checks_failurespooky_backend_timeoutsspooky_backend_errorsspooky_health_failures_total{reason=...}spooky_backend_dns_refresh_success_totalspooky_backend_dns_refresh_failure_totalspooky_backend_dns_address_set_changes_totalspooky_backend_client_rotations_total
These should be interpreted together with backend lifecycle snapshots from the control API.
Buffering and body-pressure metrics
These answer whether request or response streaming pressure is building.
Key families:
spooky_request_buffered_bytesspooky_request_buffered_high_watermark_bytesspooky_request_buffer_limit_rejectsspooky_response_prebuffer_limit_rejects
These are important leading indicators of backpressure or response-shaping issues before outright traffic failure.
Retry and hedge metrics
These answer whether resiliency behavior is activating.
Key families:
spooky_retries_totalspooky_retry_denied_total{reason=...}spooky_retry_attempts_total{reason=...}spooky_hedge_triggered_totalspooky_hedge_won_totalspooky_hedge_wasted_totalspooky_hedge_primary_won_after_trigger_total
Rising retries or hedges may be correct behavior, but sustained increases usually indicate backend degradation or timeout pressure.
Connection and ingress metrics
These answer whether the edge ingress path itself is healthy.
Key families:
spooky_active_connectionsspooky_connection_cap_rejectsspooky_ingress_packets_totalspooky_ingress_queue_dropsspooky_ingress_queue_drop_bytesspooky_ingress_queue_bytesspooky_ingress_bad_header_totalspooky_ingress_rate_limited_totalspooky_ingress_unroutable_totalspooky_ingress_draining_drops_total
These are key signals for edge saturation, malformed traffic, and drain behavior.
TLS metrics
These answer whether TLS negotiation is healthy on both downstream and upstream paths.
Key families:
spooky_downstream_tls_handshake_success_totalspooky_downstream_tls_handshake_failure_total{listener,reason}spooky_downstream_tls_certificate_selection_total{listener,selection}spooky_downstream_tls_alpn_total{listener,protocol}spooky_upstream_tls_failure_total{backend,phase,reason}
These are critical for certificate rollouts and protocol transition debugging.
Control-plane and runtime metrics
These answer whether the administrative surfaces and watchdog are stable.
Key families:
spooky_control_api_connection_limit_dropsspooky_watchdog_restart_requestsspooky_watchdog_restart_hooksspooky_watchdog_degraded_windowsspooky_runtime_panics
These are not request SLO metrics, but they are important for platform reliability.
First Dashboards To Build
Start with dashboards grouped by the domains above.
Recommended first dashboards:
- request success/failure by upstream
- backend outcome and timeout dashboard
- upstream latency percentile dashboard
- admission and overload dashboard
- retry and hedge activity dashboard
- backend DNS refresh and health dashboard
- ingress saturation and buffering dashboard
- TLS health dashboard
- runtime/control-plane health dashboard
The repository now ships these dashboards, so the normal operator path is to use the packaged dashboard set rather than inventing an ad hoc first dashboard stack.
First Alerts To Add
Request failure alerts
Alert on sustained increases in:
- upstream 5xx rate
- backend error outcome rate
- timeout outcome rate
Admission alerts
Alert on sustained growth in:
- overload shed by reason
- rate-limit denials where unexpected
- request buffer or response prebuffer rejects
Backend health alerts
Alert on:
- health-check failure rate increases
- backend timeout spikes
- backend DNS refresh failures
- upstream TLS failure increases
Ingress saturation alerts
Alert on:
- ingress queue drops
- ingress queue bytes remaining elevated
- connection cap rejects
- request buffered bytes remaining elevated
Control-plane alerts
Alert on:
- watchdog restart requests
- watchdog degraded windows
- runtime panics
- unexpected control API limiter drops
- runtime activation or rollback rejection growth
Metric Interpretation Rules
Use labeled families first
The coarse top-level counters are useful, but production dashboards should usually prefer the labeled upstream and backend families so the problem can be localized.
Use canonical reason labels
Reason labels are part of the stable observability contract. Build alerts and dashboards on canonical values rather than prose parsing.
Correlate metrics with control-plane snapshots
Metrics tell you trend and rate. Control-plane snapshots tell you current runtime state. Use both:
- metrics to detect an issue
- control API runtime and backend inventory to inspect current state
For runtime-managed changes and admin-plane incidents, also use:
GET /admin/runtime/history- audit records for actor and action attribution
Operator Expectations
Metrics should let operators answer:
- what is failing
- where it is failing
- why it is failing in canonical reason terms
- whether the problem is ingress, policy, backend, transport, TLS, or runtime control
If a dashboard requires reading implementation-specific logs to interpret a core metric, the dashboard likely needs to be redesigned around the canonical labeled families.