Operations
Deployment topology
Pod security
- All pods run non-root (uid 1000) with
readOnlyRootFilesystemand no privilege escalation. - API: preferred pod anti-affinity across nodes,
PodDisruptionBudgetwithmaxUnavailable: 1. - Worker:
PodDisruptionBudgetwithmaxUnavailable: 1. - Dispatcher:
PodDisruptionBudgetwithmaxUnavailable: 0β singleton protection. - NetworkPolicy: restricts ingress to service ports (8080, 9090, 9091); egress is open.
- Brand secrets: projected volume at
/secretson worker and API pods. - Config validation:
AppConfig::validate()runs at startup, failing fast on invalid config.
The dispatcherβs
maxUnavailable: 0 is deliberate β it is the single writer draining the
outbox. Evicting it during a node drain would stall dispatch, so the budget refuses.Health probes
engine-apiβs /health checks both the database and Temporal.
Metrics
All three binaries expose Prometheus metrics with purpose-tuned histogram buckets:Key series
API βhttp_requests_total, http_request_duration_seconds, workflows_started_total (by
workflow type), workflow_signals_total (by type and signal), rate_limiter_rejections_total.
Worker / activities β connector_requests_total and connector_request_duration_seconds
(by connector and status), connector_errors_total (by context, status, and whether the error
was retryable).
Dispatcher β dispatcher_iterations_total, dispatcher_batch_duration_seconds,
dispatcher_events_claimed_total, dispatcher_events_dispatched_total,
dispatcher_events_failed_total, dispatcher_events_swept_total, dispatcher_errors_total.
Dead letter queue
An event that failsmax_attempts times (default 20) moves to workflow_dispatch_dlq.
Operators can list, retry, or resolve DLQ items through the control-plane API.
Watch dispatcher_events_failed_total alongside DLQ depth: a growing DLQ with a flat failure
rate means a burst that already drained, while both climbing together means an ongoing outage.
Running locally
Related
- Control plane β outbox, DLQ, migration modes
- Configuration β the environment reference