metrics.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package tunneldns
  2. import (
  3. "context"
  4. "sync"
  5. "github.com/coredns/coredns/plugin"
  6. "github.com/coredns/coredns/plugin/metrics"
  7. "github.com/coredns/coredns/plugin/metrics/vars"
  8. "github.com/coredns/coredns/plugin/pkg/dnstest"
  9. "github.com/coredns/coredns/plugin/pkg/rcode"
  10. "github.com/coredns/coredns/request"
  11. "github.com/miekg/dns"
  12. "github.com/prometheus/client_golang/prometheus"
  13. )
  14. var once sync.Once
  15. // MetricsPlugin is an adapter for CoreDNS and built-in metrics
  16. type MetricsPlugin struct {
  17. Next plugin.Handler
  18. }
  19. // NewMetricsPlugin creates a plugin with configured metrics
  20. func NewMetricsPlugin(next plugin.Handler) *MetricsPlugin {
  21. once.Do(func() {
  22. prometheus.MustRegister(vars.RequestCount)
  23. prometheus.MustRegister(vars.RequestDuration)
  24. prometheus.MustRegister(vars.RequestSize)
  25. prometheus.MustRegister(vars.RequestDo)
  26. prometheus.MustRegister(vars.ResponseSize)
  27. prometheus.MustRegister(vars.ResponseRcode)
  28. })
  29. return &MetricsPlugin{Next: next}
  30. }
  31. // ServeDNS implements the CoreDNS plugin interface
  32. func (p MetricsPlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
  33. state := request.Request{W: w, Req: r}
  34. rw := dnstest.NewRecorder(w)
  35. status, err := plugin.NextOrFailure(p.Name(), p.Next, ctx, rw, r)
  36. // Update built-in metrics
  37. server := metrics.WithServer(ctx)
  38. vars.Report(server, state, ".", rcode.ToString(rw.Rcode), rw.Len, rw.Start)
  39. return status, err
  40. }
  41. // Name implements the CoreDNS plugin interface
  42. func (p MetricsPlugin) Name() string { return "metrics" }