Observability¶
Prometheus metrics¶
GET /metrics (set METRICS_TOKEN to require a bearer token):
| Metric | Description |
|---|---|
androcd_sync_total{app, result} |
Sync count, result="success" or "error" |
androcd_sync_duration_seconds{app} |
Histogram of sync durations |
androcd_apps_sync_status{status} |
Apps per sync status |
androcd_apps_health{health} |
Apps per health status |
androcd_git_poll_errors_total |
Failed git polls |
androcd_git_unchanged_total |
Polls short-circuited (remote HEAD unchanged) |
androcd_last_poll_timestamp_seconds |
Unix ts of the last poll |
androcd_reconcile_pass_seconds |
Histogram of full reconcile passes |
androcd_leader |
1 on the leader replica, 0 on standbys |
Alerting starters: time() - androcd_last_poll_timestamp_seconds > 300 (polling
stalled), androcd_apps_health{health="Degraded"} > 0, sum(androcd_leader) != 1.
Health endpoints¶
GET /healthz— pure liveness (process is up). Used by the container healthcheck.GET /readyz— readiness: returns503with reasons when the database is unreachable, git polling has stalled, or repositories are failing to sync. Point load balancers and monitoring here.
Notifications (Slack)¶
Set SLACK_WEBHOOK_URL to receive:
- 🚀 sync succeeded (commit + actions performed)
- ✗ sync failed
- ⚠️ app transitioned into Degraded
- ↻ manual rollback
- 🗑 app pruned
Live logs in the UI¶
The Logs tab streams CloudWatch events over Server-Sent Events — follow mode,
pause/resume, container selector. Requires logGroup on the container and
logs:DescribeLogStreams + logs:GetLogEvents + logs:FilterLogEvents permissions.
Task forensics¶
The Tasks tab shows running tasks (status, health, IP, AZ, started time) and stopped tasks with per-container exit codes and stop reasons — the first place to look when a deployment is crash-looping.
Structured logging¶
LOG_FORMAT=json switches controller logs to JSON (ts, level, logger, msg,
exc) for CloudWatch Logs Insights / Loki ingestion.
Deployment timeline & audit¶
The History tab renders a per-app deployment timeline — a vertical list of every
sync, newest first, each showing the outcome (synced / failed / dry-run), the Git commit,
the container images deployed, the duration, and the actions performed (or the error). The
raw data (commit, actions, outcome, message, durationMs, images) persists in
the sync_history table and is served by GET /api/apps/{name}/history.
The audit log adds the who/when/from-where dimension on top.
Deployment strategy state (Overview tab)¶
When a service opts into a non-rolling strategy (blue/green, canary, linear), the Overview tab surfaces a dedicated Deployment strategy panel:
- Colored strategy badge (Blue/Green, Canary, Linear).
- Bake time countdown — a live progress bar that ticks every 5 s from the
primary deployment's
updatedAttimestamp, showingXm YYs remainingandbake N%. When the deployment enters a new stage, the countdown restarts against the newupdatedAt. - CANARY / LINEAR sizing — canary slice %, linear step %, per-step bake time.
- Rollback alarms — the CloudWatch alarms wired for auto-rollback, with a clear
auto-rollbacksuffix whenalarms.rollback = true. - Lifecycle hooks — the full list of
AWS_LAMBDA/PAUSEhooks with the stages each fires at.
The deployments list below the panel now also carries rolloutStateReason as a
tooltip on each row — hover to see AWS's own explanation for the current stage
(e.g. "ECS deployment is bake in progress").