SO
technitium-exporter
Prometheus exporter for Technitium DNS Server. Written in Go, zero dependencies, ~6 MB static binary.
Supported architectures
| Architecture | Docker tag |
|---|---|
linux/amd64 (x86_64) |
sonirico/technitium-exporter:latest |
linux/arm64 (Raspberry Pi 4/5, Apple Silicon) |
sonirico/technitium-exporter:latest |
The image is multi-arch. Docker will automatically pull the right variant for your platform.
Features
- Scrapes
/api/dashboard/stats/getfor all available metrics (24 metrics total) - Query stats: total, NOERROR, SERVFAIL, NXDOMAIN, refused, blocked, dropped, cached, authoritative, recursive
- Infrastructure: zones, cache entries, block/allow list counts
- Query type breakdown (A, AAAA, HTTPS, PTR, etc.)
- Protocol breakdown (UDP, TCP, TLS, HTTPS, QUIC)
- Top clients, top domains, top blocked domains
- Update availability flag
- Starts in milliseconds (static Go binary, no runtime dependencies)
- Final image is
FROM scratchโ no shell, no OS, just the binary + CA certs
Quick start
docker run -d \
-e TECHNITIUM_API=http://your-dns:5380 \
-e TECHNITIUM_TOKEN=your-api-token \
-p 9080:9080 \
sonirico/technitium-exporter:latestMetrics at http://localhost:9080/metrics.
Configuration
| Variable | Default | Description |
|---|---|---|
TECHNITIUM_API |
http://localhost:5380 |
Technitium DNS base URL |
TECHNITIUM_TOKEN |
(empty) | API token (create one) |
PORT |
9080 |
Port to listen on |
Kubernetes sidecar
Run as a sidecar in the same pod as Technitium DNS:
- name: technitium-exporter
image: sonirico/technitium-exporter:0.1.0
env:
- name: TECHNITIUM_API
value: "http://localhost:5380"
- name: TECHNITIUM_TOKEN
valueFrom:
secretKeyRef:
name: technitium-exporter-token
key: token
ports:
- containerPort: 9080
name: metrics
resources:
requests:
memory: "16Mi"
cpu: "5m"
limits:
memory: "32Mi"
cpu: "50m"
livenessProbe:
httpGet:
path: /metrics
port: 9080
initialDelaySeconds: 5
periodSeconds: 30Exposed metrics
| Metric | Type | Labels | Description |
|---|---|---|---|
technitium_stats_queries_total |
gauge | Total DNS queries | |
technitium_stats_no_error_total |
gauge | Queries resolved (NOERROR) | |
technitium_stats_server_failure_total |
gauge | SERVFAIL responses | |
technitium_stats_nx_domain_total |
gauge | NXDOMAIN responses | |
technitium_stats_refused_total |
gauge | Refused queries | |
technitium_stats_authoritative_total |
gauge | Authoritative answers | |
technitium_stats_recursive_total |
gauge | Recursive answers | |
technitium_stats_cached_total |
gauge | Cached answers | |
technitium_stats_blocked_total |
gauge | Blocked queries | |
technitium_stats_dropped_total |
gauge | Dropped queries | |
technitium_stats_clients_total |
gauge | Unique clients | |
technitium_stats_zones |
gauge | Authoritative zones | |
technitium_stats_cached_entries |
gauge | DNS cache entries | |
technitium_stats_allowed_zones |
gauge | Allowed zones | |
technitium_stats_blocked_zones |
gauge | Blocked zones | |
technitium_stats_allow_list_zones |
gauge | Domains in allow lists | |
technitium_stats_block_list_zones |
gauge | Domains in block lists | |
technitium_record_type_count |
gauge | record_type |
Queries by DNS record type (see below) |
technitium_protocol_type_count |
gauge | protocol |
Queries by transport protocol (see below) |
technitium_top_clients |
gauge | name, rank |
Top clients by query count |
technitium_top_domains |
gauge | name, rank |
Top domains by query count |
technitium_top_blocked |
gauge | name, rank |
Top blocked domains |
technitium_update_available |
gauge | 1 if a DNS server update is available | |
technitium_exporter_up |
gauge | 1 if the exporter can reach the API |
Record type label values
The record_type label on technitium_record_type_count reflects whatever types your server sees. Common values:
A, AAAA, HTTPS, PTR, SRV, TXT, CNAME, MX, NS, SOA, SVCB, ANY
Example output:
technitium_record_type_count{record_type="A"} 4521
technitium_record_type_count{record_type="AAAA"} 1893
technitium_record_type_count{record_type="HTTPS"} 312
technitium_record_type_count{record_type="PTR"} 87
Protocol label values
The protocol label on technitium_protocol_type_count tracks the transport used by clients:
| Label value | Meaning |
|---|---|
Udp |
Standard DNS over UDP (port 53) |
Tcp |
DNS over TCP (port 53) |
Tls |
DNS-over-TLS (DoT, port 853) |
Https |
DNS-over-HTTPS (DoH) |
Quic |
DNS-over-QUIC (DoQ) |
Example output:
technitium_protocol_type_count{protocol="Udp"} 8934
technitium_protocol_type_count{protocol="Tcp"} 421
technitium_protocol_type_count{protocol="Https"} 12
Grafana dashboard
A ready-to-use Grafana dashboard is included in grafana-dashboard.json.
Import it in Grafana:
- Go to Dashboards > New > Import
- Paste this URL and click Load:
Or upload the JSON file manually.https://raw.githubusercontent.com/sonirico/technitium-exporter/main/grafana-dashboard.json
It includes:
- Overview row: total queries, allowed (green), blocked (red), cached, clients, block rate %
- Allowed vs Blocked time series + donut breakdown
- Resolution: authoritative vs recursive vs cached (stacked bars)
- Record type and protocol distribution (donut charts)
- Top clients (bar gauge + table)
- Top queried domains (table + bar gauge, green)
- Top blocked domains (table + bar gauge, red)
- Update available indicator, dropped queries, exporter health
Build from source
go build -ldflags="-s -w" -o technitium-exporter .Build Docker image
docker buildx build --platform linux/amd64,linux/arm64 \
-t sonirico/technitium-exporter:latest --push .License
MIT