aboutsummaryrefslogtreecommitdiff
path: root/plugin/metrics
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/metrics')
-rw-r--r--plugin/metrics/metrics.go10
-rw-r--r--plugin/metrics/setup.go11
-rw-r--r--plugin/metrics/test/scrape.go42
3 files changed, 58 insertions, 5 deletions
diff --git a/plugin/metrics/metrics.go b/plugin/metrics/metrics.go
index 8efeff1e7..6b496cccc 100644
--- a/plugin/metrics/metrics.go
+++ b/plugin/metrics/metrics.go
@@ -57,7 +57,15 @@ func New(addr string) *Metrics {
}
// MustRegister wraps m.Reg.MustRegister.
-func (m *Metrics) MustRegister(c prometheus.Collector) { m.Reg.MustRegister(c) }
+func (m *Metrics) MustRegister(c prometheus.Collector) {
+ err := m.Reg.Register(c)
+ if err != nil {
+ // ignore any duplicate error, but fatal on any other kind of error
+ if _, ok := err.(prometheus.AlreadyRegisteredError); !ok {
+ log.Fatalf("Cannot register metrics collector: %s", err)
+ }
+ }
+}
// AddZone adds zone z to m.
func (m *Metrics) AddZone(z string) {
diff --git a/plugin/metrics/setup.go b/plugin/metrics/setup.go
index c00f44a83..ffc0466f3 100644
--- a/plugin/metrics/setup.go
+++ b/plugin/metrics/setup.go
@@ -31,6 +31,13 @@ func setup(c *caddy.Controller) error {
return plugin.Error("prometheus", err)
}
+ // register the metrics to its address (ensure only one active metrics per address)
+ obj := uniqAddr.Set(m.Addr, m.OnStartup, m)
+ //propagate the real active Registry to current metrics
+ if om, ok := obj.(*Metrics); ok {
+ m.Reg = om.Reg
+ }
+
dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler {
m.Next = next
return m
@@ -55,10 +62,6 @@ func setup(c *caddy.Controller) error {
func prometheusParse(c *caddy.Controller) (*Metrics, error) {
var met = New(defaultAddr)
- defer func() {
- uniqAddr.Set(met.Addr, met.OnStartup)
- }()
-
i := 0
for c.Next() {
if i > 0 {
diff --git a/plugin/metrics/test/scrape.go b/plugin/metrics/test/scrape.go
index a21c0061d..185627491 100644
--- a/plugin/metrics/test/scrape.go
+++ b/plugin/metrics/test/scrape.go
@@ -27,6 +27,7 @@ import (
"io"
"mime"
"net/http"
+ "strconv"
"testing"
"github.com/matttproud/golang_protobuf_extensions/pbutil"
@@ -78,6 +79,47 @@ func Scrape(t *testing.T, url string) []*MetricFamily {
return result
}
+// ScrapeMetricAsInt provide a sum of all metrics collected for the name and label provided.
+// if the metric is not a numeric value, it will be counted a 0.
+func ScrapeMetricAsInt(t *testing.T, addr string, name string, label string, nometricvalue int) int {
+
+ valueToInt := func(m metric) int {
+ v := m.Value
+ r, err := strconv.Atoi(v)
+ if err != nil {
+ return 0
+ }
+ return r
+ }
+
+ met := Scrape(t, fmt.Sprintf("http://%s/metrics", addr))
+ found := false
+ tot := 0
+ for _, mf := range met {
+ if mf.Name == name {
+ // Sum all metrics available
+ for _, m := range mf.Metrics {
+ if label == "" {
+ tot += valueToInt(m.(metric))
+ found = true
+ continue
+ }
+ for _, v := range m.(metric).Labels {
+ if v == label {
+ tot += valueToInt(m.(metric))
+ found = true
+ }
+ }
+ }
+ }
+ }
+
+ if !found {
+ return nometricvalue
+ }
+ return tot
+}
+
// MetricValue returns the value associated with name as a string as well as the labels.
// It only returns the first metrics of the slice.
func MetricValue(name string, mfs []*MetricFamily) (string, map[string]string) {