Observability
Status Conditions and Kubernetes Events are the primary status surface —
kubectl describe,kubectl wait --for=condition, and Flux’s notification-controller all read them. The four pillars below are additive operator-side detail; they explain how a reconcile behaved, but the condition on the StageSet is what tells you whether it is Ready.
The controller surfaces its behaviour through four pillars, each configured by a small set of binary flags that the Helm chart drives from values:
- Logging
— structured
log/slogoutput (JSON or text) for the controller and, through the logr bridge, controller-runtime itself. Read it withkubectl logsand filter withjq. - Tracing — OpenTelemetry spans exported over OTLP gRPC to a collector you point the controller at. Off until you set an endpoint.
- Metrics
— a
stageset_*family of Prometheus series on reconcile outcomes, stage applies, drift correction, deferred rollouts, and per-stage readiness, alongside the controller-runtime and workqueue series. Scrape with aServiceMonitoror a plain scrape config and query with PromQL. - Alerting
— an opt-in
PrometheusRulewith a starter alert set whose thresholds are tunable values, plus the Kubernetes Events the controller emits on StageSet transitions. Every alert links to a runbook .
Two further pages build on the metrics:
- Service level objectives
— the controller’s own
reconcile-availability and reconcile-latency SLOs, computed from the
stageset_*series, with their targets and error budgets. - Dashboard — a ready-made Grafana dashboard over the controller and workqueue series.
For each pillar you configure the controller binary’s flags, read or query its output, and drive both from the Helm chart values. The full flag list with defaults is on the configuration reference .