Enable monitoring for non middleware

If monitoring is enabled for one zone, also enable it for when the

server reports REFUSED. Normally the metrics are only enabled if

you enter the middleware, with this you'll see REFUSED queries.

Each of these are reported agains the root zone otherwise
This commit is contained in:
Miek Gieben
2016-04-06 14:13:29 +01:00
parent 9f5e081a09
commit 7e05aa8069
2 changed files with 25 additions and 5 deletions

View File

@@ -22,14 +22,21 @@ func (m Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
rw := middleware.NewResponseRecorder(w) rw := middleware.NewResponseRecorder(w)
status, err := m.Next.ServeDNS(ctx, rw, r) status, err := m.Next.ServeDNS(ctx, rw, r)
m.Report(zone, qtype, rw) Report(zone, qtype, rw.Rcode(), rw.Size(), rw.Start())
return status, err return status, err
} }
func (m Metrics) Report(zone, qtype string, rw *middleware.ResponseRecorder) { // Report is a plain reporting function that the server can use for REFUSED and other
// queries that are turned down because they don't match any middleware.
func Report(zone, qtype, rcode string, size int, start time.Time) {
if requestCount == nil {
// no metrics are enabled
return
}
requestCount.WithLabelValues(zone, qtype).Inc() requestCount.WithLabelValues(zone, qtype).Inc()
requestDuration.WithLabelValues(zone, qtype).Observe(float64(time.Since(rw.Start()) / time.Second)) requestDuration.WithLabelValues(zone, qtype).Observe(float64(time.Since(start) / time.Second))
responseSize.WithLabelValues(zone, qtype).Observe(float64(rw.Size())) responseSize.WithLabelValues(zone, qtype).Observe(float64(size))
responseRcode.WithLabelValues(zone, rw.Rcode(), qtype).Inc() responseRcode.WithLabelValues(zone, rcode, qtype).Inc()
} }

View File

@@ -12,12 +12,15 @@ import (
"net" "net"
"os" "os"
"runtime" "runtime"
"strconv"
"sync" "sync"
"time" "time"
"golang.org/x/net/context" "golang.org/x/net/context"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/chaos" "github.com/miekg/coredns/middleware/chaos"
"github.com/miekg/coredns/middleware/prometheus"
"github.com/miekg/dns" "github.com/miekg/dns"
) )
@@ -329,8 +332,18 @@ func (s *Server) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
// DefaultErrorFunc responds to an HTTP request with a simple description // DefaultErrorFunc responds to an HTTP request with a simple description
// of the specified HTTP status code. // of the specified HTTP status code.
func DefaultErrorFunc(w dns.ResponseWriter, r *dns.Msg, rcode int) { func DefaultErrorFunc(w dns.ResponseWriter, r *dns.Msg, rcode int) {
// this code is duplicated a few times, TODO(miek)
rc := dns.RcodeToString[rcode]
if rc == "" {
rc = "RCODE" + strconv.Itoa(rcode)
}
answer := new(dns.Msg) answer := new(dns.Msg)
answer.SetRcode(r, rcode) answer.SetRcode(r, rcode)
state := middleware.State{W: w, Req: r}
// Default zone to "." here to not blow up this metric
metrics.Report(".", state.Type(), rc, answer.Len(), time.Now())
w.WriteMsg(answer) w.WriteMsg(answer)
} }