diff --git a/middleware/metrics/README.md b/middleware/metrics/README.md index 99b5a9f27..e9ea63f43 100644 --- a/middleware/metrics/README.md +++ b/middleware/metrics/README.md @@ -9,13 +9,17 @@ The following metrics are exported: * coredns_dns_request_duration_seconds * coredns_dns_request_size_bytes * coredns_dns_request_do_count_total +* coredns_dns_request_type_count_total * coredns_dns_response_size_bytes * coredns_dns_response_rcode_count_total Each counter has a label `zone` which is the zonename used for the request/response. and a label `qtype` which old the query type. The `dns_request_count_total` has extra labels: `proto` which holds the transport of the response ("udp" or "tcp") and the address family of the transport (1 -= IP (IP version 4), 2 = IP6 (IP version 6)). += IP (IP version 4), 2 = IP6 (IP version 6)). And `type_count_total` hold a per RR type counter, it +holds the most common ones (A, AAAA, MX, SOA, CNAME, PTR, TXT, NS, SRV, DS, DNSKEY, RRSIG, NSEC, +NSEC3) and "other" which lumps together all other types. + The `response_rcode_count_total` has an extra label `rcode` which holds the rcode of the response. The `*_size_bytes` counters also hold the protocol in the `proto` label ("udp" or "tcp"). diff --git a/middleware/metrics/handler.go b/middleware/metrics/handler.go index 019a02c3e..6b0401378 100644 --- a/middleware/metrics/handler.go +++ b/middleware/metrics/handler.go @@ -48,7 +48,32 @@ func Report(state middleware.State, zone, rcode string, size int, start time.Tim if state.Do() { requestDo.WithLabelValues(zone).Inc() } + typ := state.QType() + if _, known := monitorType[typ]; known { + requestType.WithLabelValues(zone, dns.Type(typ).String()) + } else { + requestType.WithLabelValues(zone, other) + } responseSize.WithLabelValues(zone, net).Observe(float64(size)) responseRcode.WithLabelValues(zone, rcode).Inc() } + +var monitorType = map[uint16]bool{ + dns.TypeAAAA: true, + dns.TypeA: true, + dns.TypeCNAME: true, + dns.TypeDNSKEY: true, + dns.TypeDS: true, + dns.TypeMX: true, + dns.TypeNSEC3: true, + dns.TypeNSEC: true, + dns.TypeNS: true, + dns.TypePTR: true, + dns.TypeRRSIG: true, + dns.TypeSOA: true, + dns.TypeSRV: true, + dns.TypeTXT: true, +} + +const other = "other" diff --git a/middleware/metrics/metrics.go b/middleware/metrics/metrics.go index 093f2a7dd..50aeaa52c 100644 --- a/middleware/metrics/metrics.go +++ b/middleware/metrics/metrics.go @@ -16,6 +16,7 @@ var ( requestDuration *prometheus.HistogramVec requestSize *prometheus.HistogramVec requestDo *prometheus.CounterVec + requestType *prometheus.CounterVec responseSize *prometheus.HistogramVec responseRcode *prometheus.CounterVec @@ -47,6 +48,8 @@ func (m *Metrics) Start() error { prometheus.MustRegister(requestDuration) prometheus.MustRegister(requestSize) prometheus.MustRegister(requestDo) + prometheus.MustRegister(requestType) + prometheus.MustRegister(responseSize) prometheus.MustRegister(responseRcode) @@ -97,6 +100,13 @@ func define() { Help: "Counter of DNS requests with DO bit set per zone.", }, []string{"zone"}) + requestType = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: middleware.Namespace, + Subsystem: subsystem, + Name: "request_type_count_total", + Help: "Counter of DNS requests per type, per zone.", + }, []string{"zone", "type"}) + responseSize = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Namespace: middleware.Namespace, Subsystem: subsystem,