GitHunt
SO

sonirico/technitium-exporter

WITH ARM SUPPORT ๐Ÿ™ƒ

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/get for 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:latest

Metrics 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: 30

Exposed 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:

  1. Go to Dashboards > New > Import
  2. Paste this URL and click Load:
    https://raw.githubusercontent.com/sonirico/technitium-exporter/main/grafana-dashboard.json
    
    Or upload the JSON file manually.

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

sonirico/technitium-exporter | GitHunt