aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--middleware/prometheus/handler.go17
-rw-r--r--server/server.go13
2 files changed, 25 insertions, 5 deletions
diff --git a/middleware/prometheus/handler.go b/middleware/prometheus/handler.go
index 866cda6a7..b3ef79554 100644
--- a/middleware/prometheus/handler.go
+++ b/middleware/prometheus/handler.go
@@ -22,14 +22,21 @@ func (m Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
rw := middleware.NewResponseRecorder(w)
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
}
-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()
- requestDuration.WithLabelValues(zone, qtype).Observe(float64(time.Since(rw.Start()) / time.Second))
- responseSize.WithLabelValues(zone, qtype).Observe(float64(rw.Size()))
- responseRcode.WithLabelValues(zone, rw.Rcode(), qtype).Inc()
+ requestDuration.WithLabelValues(zone, qtype).Observe(float64(time.Since(start) / time.Second))
+ responseSize.WithLabelValues(zone, qtype).Observe(float64(size))
+ responseRcode.WithLabelValues(zone, rcode, qtype).Inc()
}
diff --git a/server/server.go b/server/server.go
index c186c82d2..60727f2e8 100644
--- a/server/server.go
+++ b/server/server.go
@@ -12,12 +12,15 @@ import (
"net"
"os"
"runtime"
+ "strconv"
"sync"
"time"
"golang.org/x/net/context"
+ "github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/chaos"
+ "github.com/miekg/coredns/middleware/prometheus"
"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
// of the specified HTTP status code.
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.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)
}