diff --git a/plugin/template/README.md b/plugin/template/README.md index 1ec699511..015fd907d 100644 --- a/plugin/template/README.md +++ b/plugin/template/README.md @@ -64,11 +64,12 @@ The output of the template must be a [RFC 1035](https://tools.ietf.org/html/rfc1 If monitoring is enabled (via the *prometheus* directive) then the following metrics are exported: -* `coredns_template_matches_total{regex}` the total number of matched requests by regex. -* `coredns_template_template_failures_total{regex,section,template}` the number of times the Go templating failed. Regex, section and template label values can be used to map the error back to the config file. -* `coredns_template_rr_failures_total{regex,section,template}` the number of times the templated resource record was invalid and could not be parsed. Regex, section and template label values can be used to map the error back to the config file. +* `coredns_template_matches_total{server, regex}` the total number of matched requests by regex. +* `coredns_template_template_failures_total{server, regex,section,template}` the number of times the Go templating failed. Regex, section and template label values can be used to map the error back to the config file. +* `coredns_template_rr_failures_total{server, regex,section,template}` the number of times the templated resource record was invalid and could not be parsed. Regex, section and template label values can be used to map the error back to the config file. -Both failure cases indicate a problem with the template configuration. +Both failure cases indicate a problem with the template configuration. The `server` label indicates +the server incrementing the metric, see the *metrics* plugin for details. ## Examples diff --git a/plugin/template/metrics.go b/plugin/template/metrics.go index bc2594782..25474fc6c 100644 --- a/plugin/template/metrics.go +++ b/plugin/template/metrics.go @@ -10,33 +10,32 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -// Metrics for template. var ( - TemplateMatchesCount = prometheus.NewCounterVec(prometheus.CounterOpts{ + templateMatchesCount = prometheus.NewCounterVec(prometheus.CounterOpts{ Namespace: plugin.Namespace, Subsystem: "template", Name: "matches_total", Help: "Counter of template regex matches.", - }, []string{"zone", "class", "type"}) - TemplateFailureCount = prometheus.NewCounterVec(prometheus.CounterOpts{ + }, []string{"server", "zone", "class", "type"}) + templateFailureCount = prometheus.NewCounterVec(prometheus.CounterOpts{ Namespace: plugin.Namespace, Subsystem: "template", Name: "template_failures_total", Help: "Counter of go template failures.", - }, []string{"zone", "class", "type", "section", "template"}) - TemplateRRFailureCount = prometheus.NewCounterVec(prometheus.CounterOpts{ + }, []string{"server", "zone", "class", "type", "section", "template"}) + templateRRFailureCount = prometheus.NewCounterVec(prometheus.CounterOpts{ Namespace: plugin.Namespace, Subsystem: "template", Name: "rr_failures_total", Help: "Counter of mis-templated RRs.", - }, []string{"zone", "class", "type", "section", "template"}) + }, []string{"server", "zone", "class", "type", "section", "template"}) ) // OnStartupMetrics sets up the metrics on startup. func setupMetrics(c *caddy.Controller) error { c.OnStartup(func() error { metricsOnce.Do(func() { - metrics.MustRegister(c, TemplateMatchesCount, TemplateFailureCount, TemplateRRFailureCount) + metrics.MustRegister(c, templateMatchesCount, templateFailureCount, templateRRFailureCount) }) return nil }) diff --git a/plugin/template/template.go b/plugin/template/template.go index 13ffbc9ea..dc43fd420 100644 --- a/plugin/template/template.go +++ b/plugin/template/template.go @@ -8,6 +8,7 @@ import ( gotmpl "text/template" "github.com/coredns/coredns/plugin" + "github.com/coredns/coredns/plugin/metrics" "github.com/coredns/coredns/plugin/pkg/fall" "github.com/coredns/coredns/plugin/pkg/upstream" "github.com/coredns/coredns/request" @@ -66,7 +67,7 @@ func (h Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) continue } - TemplateMatchesCount.WithLabelValues(data.Zone, data.Class, data.Type).Inc() + templateMatchesCount.WithLabelValues(metrics.WithServer(ctx), data.Zone, data.Class, data.Type).Inc() if template.rcode == dns.RcodeServerFailure { return template.rcode, nil @@ -78,7 +79,7 @@ func (h Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) msg.Rcode = template.rcode for _, answer := range template.answer { - rr, err := executeRRTemplate("answer", answer, data) + rr, err := executeRRTemplate(metrics.WithServer(ctx), "answer", answer, data) if err != nil { return dns.RcodeServerFailure, err } @@ -89,14 +90,14 @@ func (h Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) } } for _, additional := range template.additional { - rr, err := executeRRTemplate("additional", additional, data) + rr, err := executeRRTemplate(metrics.WithServer(ctx), "additional", additional, data) if err != nil { return dns.RcodeServerFailure, err } msg.Extra = append(msg.Extra, rr) } for _, authority := range template.authority { - rr, err := executeRRTemplate("authority", authority, data) + rr, err := executeRRTemplate(metrics.WithServer(ctx), "authority", authority, data) if err != nil { return dns.RcodeServerFailure, err } @@ -114,16 +115,16 @@ func (h Handler) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) // Name implements the plugin.Handler interface. func (h Handler) Name() string { return "template" } -func executeRRTemplate(section string, template *gotmpl.Template, data templateData) (dns.RR, error) { +func executeRRTemplate(server, section string, template *gotmpl.Template, data templateData) (dns.RR, error) { buffer := &bytes.Buffer{} err := template.Execute(buffer, data) if err != nil { - TemplateFailureCount.WithLabelValues(data.Zone, data.Class, data.Type, section, template.Tree.Root.String()).Inc() + templateFailureCount.WithLabelValues(server, data.Zone, data.Class, data.Type, section, template.Tree.Root.String()).Inc() return nil, err } rr, err := dns.NewRR(buffer.String()) if err != nil { - TemplateRRFailureCount.WithLabelValues(data.Zone, data.Class, data.Type, section, template.Tree.Root.String()).Inc() + templateRRFailureCount.WithLabelValues(server, data.Zone, data.Class, data.Type, section, template.Tree.Root.String()).Inc() return rr, err } return rr, nil