Speko Docs

Observability

Health probes, Prometheus metrics, and what telemetry the gateway exports.

Health probes

Both are unauthenticated:

  • GET /healthz200 {"status":"ok"}
  • GET /readyz200 {"status":"ready"}, or 503 {"status":"draining"} during shutdown

Prometheus metrics

GET /metrics (authenticated, unlike the probes) serves the standard text format:

MetricTypeMeaning
speko_gateway_sessions_activegaugeCurrently open sessions
speko_gateway_sessions_totalcounterSessions ever created
speko_gateway_draininggauge1 while shutting down
speko_gateway_auth_failures_totalcounterLocal auth rejections
speko_gateway_input_queue_messages / ..._bytesgaugeInput backpressure
speko_gateway_telemetry_dropped_totalcounterTelemetry events dropped under pressure
speko_gateway_warm_plan_hits_total, ..._misses_total, ..._expired_total, ..._refill_failures_totalcounterWarm-pool effectiveness
speko_gateway_warm_plan_depth, ..._routesgaugeWarm-pool state

Telemetry

The gateway exports content-free events to Speko — no audio, no transcripts, no prompts, no tool arguments, no credentials, ever:

EventPayload
session.openedprovider connection latency ({"provider_open_ms": N})
agent.eventcanonical event type and sequence number
usage.observedprovider request correlation ID
usage.reportedaccepted usage quantity
session.closedno payload
errorerror class, source, retryability, provider HTTP status

Delivery is asynchronous and bounded (queue 1024, batches of 64, 3 attempts); under pressure events are dropped and counted rather than blocking media.

SPEKO_TELEMETRY_DISABLED=true suppresses anonymous and optional events. On managed routes, usage.reported, usage.observed, and the terminal event still flow — they are the billing record. BYOK routes have no mandatory events.

Conversation profiler

The optional LiveKit ConversationProbe posts content-free markers to the gateway's local POST /v1/turn-events route. The gateway forwards managed markers to gateway.speko.dev/v1/turn-events with authentication, or BYOK markers to /v1/anonymous-turn-events without an authorization header.

Markers cover conversation and turn boundaries, speech timing, final-transcript timing, LLM first-token/completion, tool timing, TTS first audio, playback, interruptions, and attached route IDs. They never contain transcripts, prompts, model output, tool names or arguments, synthesized text, or audio. Conversation and turn IDs are random and opaque. Delivery is optional, bounded, and disabled by SPEKO_TELEMETRY_DISABLED=true.

Heartbeats and the dashboard

When a Speko API key is configured, the gateway heartbeats its instance identity, capacity, and session counters to the control plane every SPEKO_INSTANCE_HEARTBEAT_INTERVAL (default 20 s). Set SPEKO_WORKLOAD_ID (and optionally SPEKO_WORKLOAD_TYPE) to group instances into a named workload in the dashboard.

On this page