Skip to content

Orbit dispatcher SLO alerts

Covers OrbitServiceGkgDispatcherErrorSLOViolation, OrbitServiceGkgDispatcherTrafficCessation and OrbitServiceGkgDispatcherTrafficAbsent.

The dispatcher is a singleton. It runs graph schema migrations and periodic tasks, reads the datalake ClickHouse and Siphon CDC events, and publishes indexing jobs to NATS.

No user-facing errors: queries keep working, data goes stale. These alerts are severity s3 and do not page. They post to #f_orbit_alerts.

OrbitServiceGkgDispatcherErrorSLOViolation

Section titled “OrbitServiceGkgDispatcherErrorSLOViolation”

Scheduler task runs are ending with outcome="error".

OrbitServiceGkgDispatcherTrafficCessation / TrafficAbsent

Section titled “OrbitServiceGkgDispatcherTrafficCessation / TrafficAbsent”

No scheduler tasks are running. Since the dispatcher is the only source of indexing jobs, all indexing dries up downstream. TrafficCessation means task runs recently dropped to zero, TrafficAbsent means they have been missing for longer.

The gkg_dispatcher SLI in metrics-catalog/services/orbit.jsonnet counts gkg_scheduler_task_runs_total, errors are runs with outcome="error".

  • Silence via Alertmanager filtered on the alertname.
  • Every deploy causes a short traffic gap: the dispatcher uses the Recreate strategy, so there is no overlap between old and new pod. A cessation alert right after a merge to argocd-apps is usually just that.
  • s3, no paging. User impact is data freshness lag, growing with time. In-flight jobs on NATS keep draining, so the effect is delayed.

The alerts fire on these recording rules in the mimir-analytics-eventsdot datasource (Grafana Explore):

# Error ratio
gitlab_component_errors:ratio_1h{type="orbit", component="gkg_dispatcher", monitor="global"}
# Request rate (traffic cessation fires when this drops to zero)
gitlab_component_ops:rate_1h{type="orbit", component="gkg_dispatcher", monitor="global"}
  • Orbit Overview dashboard, gkg_dispatcher row: task run rate and error rate.
  • Pod state: kubectl --context gke_gl-orbit-prd_us-east1_orbit-prd -n gkg get deploy/gkg-dispatcher.
  • Logs: Kibana, orbit index, filter json.mode: dispatch-indexing. Task outcomes are logged per run.
SymptomCauseAction
Readiness 503 right after a deployA schema migration is running, or the migration lock is heldWait for the migration, then check dispatcher logs. Migration locks live in the NATS KV bucket indexing_locks
Task errors reading the datalakeDatalake ClickHouse slow or unreachable, or Siphon CDC behindCheck the Siphon dashboard and datalake health
Fails to start after a stream or KV config changeJetStream does not apply config changes to existing streams or buckets in placeDelete the stream or KV bucket, restart the pod so Orbit recreates it (Common signatures)
get_graph_status logs KV bucket ... not registeredKV bucket not created at startupCosmetic, do not roll back for this alone
OOMUnoptimized query execution in a periodic taskMore memory as a stopgap, report to context_systems

Scheduler cadence locks (one dispatcher replica runs each task) are also in the indexing_locks KV bucket, inspect with nats-box.

  • Deploy-related gap: none needed, the replacement pod picks up.
  • Stuck migration or lock: check dispatcher logs, inspect and if necessary clear the lock in the indexing_locks KV bucket, restart the pod.
  • Rollback across a SCHEMA_VERSION is a manual operation, see Recent changes and rollback.
  • Datalake ClickHouse and Siphon CDC (job sources), NATS JetStream (job sink and locks). The dispatcher cannot scale past 1 replica.