diff options
Diffstat (limited to 'plugin/metrics/handler.go')
-rw-r--r-- | plugin/metrics/handler.go | 34 |
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" } |