Dash0 Raises $110M Series B at $1B Valuation
Monitor FluxCD GitOps controllers with OpenTelemetry: scrape Prometheus metrics, export distributed traces, and collect structured logs for full visibility into reconciliation cycles, resource health, and deployment state.
FluxCD is a set of continuous and progressive delivery solutions for Kubernetes, built on GitOps principles. It keeps your Kubernetes cluster in sync with sources of configuration such as Git repositories, Helm charts, and OCI artifacts, and automatically applies changes when the desired state evolves.
This Dash0 integration enables deep observability into FluxCD's GitOps Toolkit controllers — including the source, kustomize, helm, and notification controllers — so you can track reconciliation performance, detect drift, and respond to failures before they impact workloads.
For more information, visit the FluxCD Project Page.
Gain full visibility into your GitOps delivery pipeline with this integration:
This guide covers three observability signals for FluxCD:
8080. The OpenTelemetry Collector scrapes these and forwards them to Dash0 using the gotk_ metric prefix.filelog receiver.Before setting up FluxCD monitoring, ensure:
flux check reports healthy)flux-system namespaceflux-system namespaceYou'll need an OpenTelemetry Collector deployed. Consider using:
Helm Chart for The OpenTelemetry Collector
FluxCD controllers expose Prometheus metrics on port 8080 in the flux-system namespace.
Option 1: Static scrape config (OTel Operator or Helm Chart)
A standard FluxCD installation creates Kubernetes Services for source-controller and notification-controller, but those Services expose port 80 (the artifact/webhook port), not port 8080 (the metrics port). You need to create metrics Services for all four controllers:
Then configure the OpenTelemetry Collector's Prometheus receiver to scrape all four controllers:
Option 2: Dash0 Operator
First create a Dash0Monitoring resource in the flux-system namespace to enable Prometheus scraping. The instrumentWorkloads.mode: none setting is required because the flux-system namespace enforces a restricted PodSecurity policy that the operator's instrumentation init container does not satisfy. Then annotate the FluxCD controller deployments so the operator's collector discovers their pods:
For more options, see the Prometheus Receiver documentation.
FluxCD's notification controller can export distributed traces to an OpenTelemetry collector via its built-in otel provider. The controller converts Flux events into OTel spans that follow the Flux object dependency chain: source objects (GitRepository, HelmChart, OCIRepository, Bucket) produce root spans, and downstream objects (Kustomization, HelmRelease) become child spans within the same trace. Trace IDs use the format <AlertUID>:<revision>, so every span across a reconciliation cycle is correlated back to the originating source revision.
Create a Provider in the flux-system namespace pointing to your OpenTelemetry Collector's OpenTelemetry Protocol (OTLP) HTTP endpoint:
If you are using the Dash0 Operator, replace <otel-collector-endpoint> with its stable internal service address: dash0-operator-opentelemetry-collector-service.dash0-system.svc.cluster.local.
Then create an Alert that selects the Flux resources you want to trace:
If your collector requires authentication, create a Secret with the credentials:
Then add secretRef to your Provider spec:
HelmRepository events are excluded from tracing by design — they are not considered primary sources.For the full provider specification, see the FluxCD OTel Provider documentation.
FluxCD controllers write structured JSON logs to stderr. Each log line includes fields like controllerKind, name, namespace, reconcileID, level, and msg, making them easy to filter and correlate with metrics.
Dash0 Operator
If you applied a Dash0Monitoring resource to the flux-system namespace (as shown in the Collector Configuration section above), the Dash0 Operator automatically collects pod logs from all controllers in that namespace via the filelog receiver. No additional configuration is required.
OTel Operator or Helm Chart
To collect FluxCD controller logs manually, add a filelog receiver targeting the flux-system namespace to your OpenTelemetry Collector configuration:
Log and trace correlation
FluxCD logs and traces share the same dimensions — controllerKind, name, and namespace — so you can correlate them in Dash0 by filtering on those fields within the same time window. The reconcileID field in logs identifies a single reconciliation cycle and maps to the span hierarchy generated by the otel provider for the same resource. Note that reconcileID is not an OTel trace ID, so there is no automatic one-click correlation between a log line and its corresponding trace — use the resource name, kind, and timestamp to bridge them.
Metrics
flux-system targetsgotk_gotk_reconcile_duration_seconds only appears after at least one Flux resource (e.g. a GitRepository or Kustomization) has been reconciled. If you see only gotk_token_cached_items initially, create a Flux resource and wait for the first reconciliation interval.
Key metrics to verify:
| Metric | Description |
|---|---|
gotk_reconcile_duration_seconds | Reconciliation duration per controller and resource |
gotk_token_cached_items | Items currently held in the token cache |
Traces
<namespace>/<alert-name> — for example, flux-system/otel-alertLogs
namespace: flux-system to see all controller logscontrollerKind and name fields to narrow down to a specific resource