diff options
Diffstat (limited to 'middleware/prometheus/handler.go')
-rw-r--r-- | middleware/prometheus/handler.go | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/middleware/prometheus/handler.go b/middleware/prometheus/handler.go new file mode 100644 index 000000000..eb82b8aff --- /dev/null +++ b/middleware/prometheus/handler.go @@ -0,0 +1,31 @@ +package metrics + +import ( + "strconv" + "time" + + "github.com/miekg/coredns/middleware" + "github.com/miekg/dns" +) + +func (m *Metrics) ServeDNS(w dns.ResponseWriter, r *dns.Msg) (int, error) { + context := middleware.Context{W: w, Req: r} + + qname := context.Name() + qtype := context.Type() + zone := middleware.Zones(m.ZoneNames).Matches(qname) + if zone == "" { + zone = "." + } + + // Record response to get status code and size of the reply. + rw := middleware.NewResponseRecorder(w) + status, err := m.Next.ServeDNS(rw, r) + + requestCount.WithLabelValues(zone, qtype).Inc() + requestDuration.WithLabelValues(zone).Observe(float64(time.Since(rw.Start()) / time.Second)) + responseSize.WithLabelValues(zone).Observe(float64(rw.Size())) + responseRcode.WithLabelValues(zone, strconv.Itoa(rw.Rcode())).Inc() + + return status, err +} |