Skip to main content
The operator exports Prometheus metrics on its metrics endpoint. This page lists every dorgu_* family, its labels, and what it answers. Metrics are a dashboard view. For a one-off summary that anyone can paste into an issue, use dorgu report, which reads the cluster’s resources instead of /metrics. The set below is operator v0.13.0. dorgu_incidents_total, dorgu_proposals_total and dorgu_remediation_transitions_total exist from v0.12.0. Everything else is new in v0.13.0.

Scraping

With the chart defaults, the operator serves metrics over HTTPS on :8443 and authenticates every scrape. Bind the chart’s metrics-reader ClusterRole to whatever scrapes it. The values and the role binding are in Metrics and probes.
Every family is created at zero when the operator starts. A Prometheus counter with no series is simply absent, so a dashboard that loads before the first incident would show “no data” where the truth is “none yet”. Here 0 means zero events. Absent means the operator is not being scraped.
Every label value comes from a fixed set. None is ever an object name, a namespace, or text a model wrote, so cardinality stays bounded. A gate reason outside the known set is recorded as other.

The gate

dorgu_gate_decisions_total

The same refusal is also a condition and an Event. See refusals are recorded. Metric reasons are the kebab-case guardrail names. The condition reasons are the same names in CamelCase (blast-radius is BlastRadius).
deferred is not a refusal. Leave it out of any “refused” ratio.

Tickets, verification and heal credit

dorgu_heal_credit_total reasons: WorkloadPatchedByTicket (credited), and for credited="false": NothingPatched, ResourcesNotTicket, WorkloadDiverged, WorkloadUnreadable. They match the reasons on the HealCredited and WorkloadDiverged conditions. See heal credit. Only resolved is a clean heal. partial and self-resolved are real recoveries that Dorgu cannot claim, so count them separately.

Durations

dorgu_stage_duration_seconds is the time a fix spends in each part of its life: dorgu_incident_time_to_detect_seconds measures from the earliest contributing signal to the incident being recorded. Most signals are stamped when they are first observed, so it is mostly detector-to-record latency.

Incidents and proposals

class is one of resource, health, node, controlplane, deployment, dependency, scaling, security. scope is persona (the incident belongs to an ApplicationPersona) or unattributed.

The model

provider is claude or gemini. With AI off, these stay at zero.
A rising dorgu_llm_invalid_output_total means the model is not following the reply schema. The incident is still diagnosed by the rules, so nothing breaks, but you are paying for replies Dorgu discards.

Also exported

The controller-runtime metrics (controller_runtime_reconcile_total, work queue depth and so on) are exported from the same endpoint, because the operator is built on controller-runtime.

How Dorgu decides

What each stage, ticket and heal-credit label means

Helm values

Turn the endpoint on, secure it, and grant a scraper access