Operator metrics bases
metrics.base sets how rich Conduit's built-in metrics are when you scrape the Prometheus metrics endpoint. A value of minimal keeps query labels coarse and skips timing histograms which constitutes metrics with lower metric cardinality. standard adds fine labels (qtype, qclass, ip_family), phase and forward timing series, and process gauges — more detail, more series.
Operators usually need to answer: “Is minimal enough for my dashboards, or do I need standard?” This walkthrough runs the same DNS traffic under each base, scrapes /metrics, and shows the concrete differences so you can choose a base (or confirm a reload changed cardinality as you expected).
Prerequisites: Conduit built; upstream DNS resolver listening on 127.0.0.1:5300; Prometheus scrape available via curl (no Prometheus server required for this lab). Enable pools[].health if you want to confirm health series on minimal.
What you will practice
- Start Conduit with
base: minimal, send a few queries, and read the scrape - Switch to
base: standard(restart or overlay) and repeat under the same traffic pattern - Compare label sets on
conduit_queries_totaland whether phase/forward timing series appear
What you will see
| Base | Hot-path emphasis | After a few A queries you should see… |
|---|---|---|
minimal |
Volume + failures + lookup + health + topology + meta | conduit_queries_total with listener + protocol only; failure counters when applicable; no conduit_phase_duration_seconds; health gauges when probes run |
standard |
Rich labels + timing + process | conduit_queries_total with qtype, qclass, ip_family; phase and forward histograms/counters |
1. Minimal base
Save as conduit-metrics-minimal.yaml:
schema_version: 1
listeners:
listeners:
- address: "127.0.0.1:15353"
protocol: udp
pools:
- name: default
backends:
- address: "127.0.0.1:5300"
health:
enabled: true
interval_ms: 1000
metrics:
enabled: true
base: minimal
prometheus:
listen_address: "127.0.0.1:9090"
path: /metrics
conduitctl validate --file conduit-metrics-minimal.yaml
conduit /path/to/conduit-metrics-minimal.yaml
Send a few queries:
dig @127.0.0.1 -p 15353 +time=3 profiles-minimal.example.com A
dig @127.0.0.1 -p 15353 +time=3 profiles-minimal.example.com AAAA
Scrape and inspect query counters:
curl -sS "http://127.0.0.1:9090/metrics" | grep '^conduit_queries_total'
Expect lines with labels like listener="127.0.0.1:15353" and protocol="udp" — without qtype="A" on the same metric (minimal coarse labels).
Confirm phase histograms are absent:
curl -sS "http://127.0.0.1:9090/metrics" | grep conduit_phase_duration || echo "no phase histograms (expected for minimal)"
After ~1 health interval, confirm health series:
curl -sS "http://127.0.0.1:9090/metrics" | grep -E 'conduit_backend_health_observed|conduit_probe_results_total' | head
Stop Conduit before the next step (or use overlay apply if the control plane is enabled — see below).
2. Standard base
Copy the config to conduit-metrics-standard.yaml and change the base:
metrics:
enabled: true
base: standard
prometheus:
listen_address: "127.0.0.1:9090"
path: /metrics
With a control plane enabled, you can apply an overlay that only changes metrics.base without restart. Otherwise restart Conduit with the new file.
dig @127.0.0.1 -p 15353 +time=3 profiles-standard.example.com A
curl -sS "http://127.0.0.1:9090/metrics" | grep '^conduit_queries_total'
curl -sS "http://127.0.0.1:9090/metrics" | grep conduit_phase_duration | head
Expect qtype/qclass/ip_family on queries and phase/forward timing series present.
Legacy profile alias
metrics.profile: full still loads and maps to base: standard (with a deprecation warning). Prefer base: in new configs.
Related topics
- Metrics configurability
- Metrics beyond bases — categories, collect/emit, granularity after you pick a base
- Built-in metric registry
- Built-in metrics
- Metrics
- Metrics configurability — Legacy aliases
- Performance findings — directional takeaways (scrape, logging, dnstap, OTLP)
- Metrics scrape tax — same-host tax of minimal vs standard scrape
- Metrics collect vs emit — recording vs export
- Metrics scrape (split_io)
- Aggressive scrape cadence
- OTLP tax under load