diff options
-rw-r--r-- | middleware/cache/README.md | 8 | ||||
-rw-r--r-- | middleware/cache/handler.go | 19 | ||||
-rw-r--r-- | middleware/dnssec/README.md | 2 | ||||
-rw-r--r-- | middleware/dnssec/dnssec.go | 2 | ||||
-rw-r--r-- | middleware/dnssec/handler.go | 16 | ||||
-rw-r--r-- | test/metrics_test.go | 22 |
6 files changed, 63 insertions, 6 deletions
diff --git a/middleware/cache/README.md b/middleware/cache/README.md index 8d068f1a3..0f47acb77 100644 --- a/middleware/cache/README.md +++ b/middleware/cache/README.md @@ -39,8 +39,12 @@ The minimum TTL allowed on resource records is 5 seconds. If monitoring is enabled (via the *prometheus* directive) then the following metrics are exported: -* coredns_cache_size{type} - total elements in the case, type is either "denial" or "success". -* coredns_cache_capacity{type} - total capacity of the cache, type is either "denial" or "success". +* coredns_cache_size{type} - Total elements in the cache by cache type. +* coredns_cache_capacity{type} - Total capacity of the cache by cache type. +* coredns_cache_hits_total{type} - Counter of cache hits by cache type. +* coredns_cache_misses_total - Counter of cache misses. + +Cache types are either "denial" or "success". ## Examples diff --git a/middleware/cache/handler.go b/middleware/cache/handler.go index 146ccbc56..aae7206e2 100644 --- a/middleware/cache/handler.go +++ b/middleware/cache/handler.go @@ -44,12 +44,15 @@ func (c *Cache) get(qname string, qtype uint16, do bool) (*item, bool, bool) { k := rawKey(qname, qtype, do) if i, ok := c.ncache.Get(k); ok { + cacheHits.WithLabelValues(Denial).Inc() return i.(*item), ok, i.(*item).expired(time.Now()) } if i, ok := c.pcache.Get(k); ok { + cacheHits.WithLabelValues(Success).Inc() return i.(*item), ok, i.(*item).expired(time.Now()) } + cacheMisses.Inc() return nil, false, false } @@ -67,6 +70,20 @@ var ( Name: "capacity", Help: "The cache's capacity.", }, []string{"type"}) + + cacheHits = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: middleware.Namespace, + Subsystem: subsystem, + Name: "hits_total", + Help: "The count of cache hits.", + }, []string{"type"}) + + cacheMisses = prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: middleware.Namespace, + Subsystem: subsystem, + Name: "misses_total", + Help: "The count of cache misses.", + }) ) const subsystem = "cache" @@ -74,4 +91,6 @@ const subsystem = "cache" func init() { prometheus.MustRegister(cacheSize) prometheus.MustRegister(cacheCapacity) + prometheus.MustRegister(cacheHits) + prometheus.MustRegister(cacheMisses) } diff --git a/middleware/dnssec/README.md b/middleware/dnssec/README.md index 810592585..18322f740 100644 --- a/middleware/dnssec/README.md +++ b/middleware/dnssec/README.md @@ -43,5 +43,7 @@ If monitoring is enabled (via the *prometheus* directive) then the following met * coredns_dnssec_cache_size{type} - total elements in the cache, type is "signature". * coredns_dnssec_cache_capacity{type} - total capacity of the cache, type is "signature". +* coredns_dnssec_cache_hits_total - Counter of cache hits. +* coredns_dnssec_cache_misses_total - Counter of cache misses. ## Examples diff --git a/middleware/dnssec/dnssec.go b/middleware/dnssec/dnssec.go index de907c985..e2c37e6ca 100644 --- a/middleware/dnssec/dnssec.go +++ b/middleware/dnssec/dnssec.go @@ -115,8 +115,10 @@ func (d Dnssec) set(key string, sigs []dns.RR) { func (d Dnssec) get(key string) ([]dns.RR, bool) { if s, ok := d.cache.Get(key); ok { + cacheHits.Inc() return s.([]dns.RR), true } + cacheMisses.Inc() return nil, false } diff --git a/middleware/dnssec/handler.go b/middleware/dnssec/handler.go index 2b7730083..4c1621c8b 100644 --- a/middleware/dnssec/handler.go +++ b/middleware/dnssec/handler.go @@ -53,6 +53,20 @@ var ( Name: "cache_capacity", Help: "The dnssec cache's capacity.", }, []string{"type"}) + + cacheHits = prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: middleware.Namespace, + Subsystem: subsystem, + Name: "cache_hits_total", + Help: "The count of cache hits.", + }) + + cacheMisses = prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: middleware.Namespace, + Subsystem: subsystem, + Name: "cache_misses_total", + Help: "The count of cache misses.", + }) ) // Name implements the Handler interface. @@ -63,4 +77,6 @@ const subsystem = "dnssec" func init() { prometheus.MustRegister(cacheSize) prometheus.MustRegister(cacheCapacity) + prometheus.MustRegister(cacheHits) + prometheus.MustRegister(cacheMisses) } diff --git a/test/metrics_test.go b/test/metrics_test.go index ee905e155..67e3a5d13 100644 --- a/test/metrics_test.go +++ b/test/metrics_test.go @@ -73,7 +73,8 @@ func TestMetricsRefused(t *testing.T) { } func TestMetricsCache(t *testing.T) { - metricName := "coredns_cache_size" + cacheSizeMetricName := "coredns_cache_size" + cacheHitMetricName := "coredns_cache_hits_total" corefile := `example.net:0 { proxy . 8.8.8.8:53 @@ -97,11 +98,24 @@ func TestMetricsCache(t *testing.T) { } data := mtest.Scrape(t, "http://"+metrics.ListenAddr+"/metrics") - // Get the value for the metrics where the one of the labels values matches "success". - got, _ := mtest.MetricValueLabel(metricName, cache.Success, data) + // Get the value for the cache size metric where the one of the labels values matches "success". + got, _ := mtest.MetricValueLabel(cacheSizeMetricName, cache.Success, data) if got != "1" { - t.Errorf("Expected value %s for %s, but got %s", "1", metricName, got) + t.Errorf("Expected value %s for %s, but got %s", "1", cacheSizeMetricName, got) + } + + // Second request for the same response to test hit counter. + if _, err = dns.Exchange(m, udp); err != nil { + t.Fatalf("Could not send message: %s", err) + } + + data = mtest.Scrape(t, "http://"+metrics.ListenAddr+"/metrics") + // Get the value for the cache hit counter where the one of the labels values matches "success". + got, _ = mtest.MetricValueLabel(cacheHitMetricName, cache.Success, data) + + if got != "1" { + t.Errorf("Expected value %s for %s, but got %s", "1", cacheHitMetricName, got) } } |