aboutsummaryrefslogtreecommitdiff
path: root/plugin/metrics/handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/metrics/handler.go')
-rw-r--r--plugin/metrics/handler.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/plugin/metrics/handler.go b/plugin/metrics/handler.go
new file mode 100644
index 000000000..bc9a6ec47
--- /dev/null
+++ b/plugin/metrics/handler.go
@@ -0,0 +1,34 @@
+package metrics
+
+import (
+ "github.com/coredns/coredns/plugin"
+ "github.com/coredns/coredns/plugin/metrics/vars"
+ "github.com/coredns/coredns/plugin/pkg/dnsrecorder"
+ "github.com/coredns/coredns/plugin/pkg/rcode"
+ "github.com/coredns/coredns/request"
+
+ "github.com/miekg/dns"
+ "golang.org/x/net/context"
+)
+
+// ServeDNS implements the Handler interface.
+func (m *Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+ state := request.Request{W: w, Req: r}
+
+ qname := state.QName()
+ zone := plugin.Zones(m.ZoneNames()).Matches(qname)
+ if zone == "" {
+ zone = "."
+ }
+
+ // Record response to get status code and size of the reply.
+ rw := dnsrecorder.New(w)
+ status, err := plugin.NextOrFailure(m.Name(), m.Next, ctx, rw, r)
+
+ vars.Report(state, zone, rcode.ToString(rw.Rcode), rw.Len, rw.Start)
+
+ return status, err
+}
+
+// Name implements the Handler interface.
+func (m *Metrics) Name() string { return "prometheus" }