Skip to main content
Prometheus exposition format, on the gateway’s own port.
Operator-authenticated, unlike /health. The numbers name agents, connections, and refusal codes. An open scrape endpoint would tell anyone who can reach the port which agents exist, how often they are refused, and when a human is reviewing a change.
prometheus.yml

What is exposed

Gauges are read when you scrape, from the components that own that state, so they cannot drift from it.

The questions they answer

Is Warden in my way?
Overhead is Warden’s own time: the whole pipeline minus the database, and minus any wait for a human — waiting for a reviewer is not a cost Warden is imposing. The budget is 5ms. It is recorded whatever the outcome, including refusals: a budget measured only over successes hides the paths where Warden does the most work. warden_database_seconds is the engine’s share, for when the two need separating. Is blocking approval viable?
Expiry rate. Filter on reason="approval": Debug Mode pauses share this metric, are far more numerous, and resolve in seconds, so leaving them in the denominator makes the rate read far lower than it is. Above roughly 30% and the answer is no: switch those connections to async mode, because agents are being blocked on humans who are not answering.
Median time to a decision — the number to quote when someone asks what review costs. What is Warden buying me?
Refusals by reason, per week. unbounded_operation and scope_unenforceable are the interesting ones: those are the operations that would have run against production. Is my agent hallucinating?
Reads that returned nothing from data that is not empty. A rising line for one agent usually means it is inventing values, and it is worth looking at before a customer is told they have no orders. Is the wedge sticky?
Is anything on fire right now? warden_scrape_errors_total above zero means a gauge could not be read — its series will be missing rather than wrong, so alert on the counter, not on the gap. warden_pending_operations climbing means reviewers are not keeping up. warden_agents_frozen above zero means a circuit breaker tripped and a human has not reinstated the agent.

Cardinality

Labels are bounded by configuration, not by traffic: agents and connections are declared in warden.yaml, classes and statuses are fixed sets, and codes come from the error taxonomy. Nothing from a request body becomes a label, so no agent can inflate your metric storage by issuing unusual statements.