From 29ebb580db1caa1f1237b44e1abd24bfdfadd692 Mon Sep 17 00:00:00 2001 From: Bernerd Schaefer Date: Wed, 19 Feb 2014 14:53:34 +0100 Subject: [PATCH] Add Reset(map[string]string) to Metric interface Change-Id: I289cf8796adbd6ff55f23bba7730145329de00e1 --- prometheus/counter.go | 8 ++++++++ prometheus/counter_test.go | 18 ++++++++++++++++++ prometheus/gauge.go | 8 ++++++++ prometheus/gauge_test.go | 18 ++++++++++++++++++ prometheus/histogram.go | 17 +++++++++++++++++ prometheus/metric.go | 2 ++ 6 files changed, 71 insertions(+) diff --git a/prometheus/counter.go b/prometheus/counter.go index 3d8b3e6..1ed3e82 100644 --- a/prometheus/counter.go +++ b/prometheus/counter.go @@ -65,6 +65,14 @@ func (metric *counter) Set(labels map[string]string, value float64) float64 { return value } +func (metric *counter) Reset(labels map[string]string) { + metric.mutex.Lock() + defer metric.mutex.Unlock() + + signature := labelsToSignature(labels) + delete(metric.values, signature) +} + func (metric *counter) ResetAll() { metric.mutex.Lock() defer metric.mutex.Unlock() diff --git a/prometheus/counter_test.go b/prometheus/counter_test.go index e9db571..8f0dffd 100644 --- a/prometheus/counter_test.go +++ b/prometheus/counter_test.go @@ -70,6 +70,24 @@ func testCounter(t tester) { value: `{"type":"counter","value":[{"labels":{},"value":5}]}`, }, }, + { + in: input{ + steps: []func(g Counter){ + func(g Counter) { + g.Set(map[string]string{"handler": "/foo"}, 13) + }, + func(g Counter) { + g.Set(map[string]string{"handler": "/bar"}, 17) + }, + func(g Counter) { + g.Reset(map[string]string{"handler": "/bar"}) + }, + }, + }, + out: output{ + value: `{"type":"counter","value":[{"labels":{"handler":"/foo"},"value":13}]}`, + }, + }, { in: input{ steps: []func(g Counter){ diff --git a/prometheus/gauge.go b/prometheus/gauge.go index 93eb174..5a2c782 100644 --- a/prometheus/gauge.go +++ b/prometheus/gauge.go @@ -72,6 +72,14 @@ func (metric *gauge) Set(labels map[string]string, value float64) float64 { return value } +func (metric *gauge) Reset(labels map[string]string) { + metric.mutex.Lock() + defer metric.mutex.Unlock() + + signature := labelsToSignature(labels) + delete(metric.values, signature) +} + func (metric *gauge) ResetAll() { metric.mutex.Lock() defer metric.mutex.Unlock() diff --git a/prometheus/gauge_test.go b/prometheus/gauge_test.go index 103bbc5..1380ad7 100644 --- a/prometheus/gauge_test.go +++ b/prometheus/gauge_test.go @@ -70,6 +70,24 @@ func testGauge(t tester) { value: `{"type":"gauge","value":[{"labels":{},"value":5}]}`, }, }, + { + in: input{ + steps: []func(g Gauge){ + func(g Gauge) { + g.Set(map[string]string{"handler": "/foo"}, 13) + }, + func(g Gauge) { + g.Set(map[string]string{"handler": "/bar"}, 17) + }, + func(g Gauge) { + g.Reset(map[string]string{"handler": "/bar"}) + }, + }, + }, + out: output{ + value: `{"type":"gauge","value":[{"labels":{"handler":"/foo"},"value":13}]}`, + }, + }, { in: input{ steps: []func(g Gauge){ diff --git a/prometheus/histogram.go b/prometheus/histogram.go index 3d5f9e7..18a8db8 100644 --- a/prometheus/histogram.go +++ b/prometheus/histogram.go @@ -296,6 +296,23 @@ func (h *histogram) Purge() { h.lastPurge = time.Now() } +func (h *histogram) Reset(labels map[string]string) { + h.mutex.Lock() + defer h.mutex.Unlock() + + signature := labelsToSignature(labels) + value, ok := h.values[signature] + + if !ok { + return + } + + for _, bucket := range value.buckets { + bucket.Reset() + } + delete(h.values, signature) +} + func (h *histogram) ResetAll() { h.mutex.Lock() defer h.mutex.Unlock() diff --git a/prometheus/metric.go b/prometheus/metric.go index 70c3500..1ccfa8a 100644 --- a/prometheus/metric.go +++ b/prometheus/metric.go @@ -16,6 +16,8 @@ import ( type Metric interface { // Produce a JSON representation of the metric. json.Marshaler + // Reset removes any stored values associated with a given labelset. + Reset(labels map[string]string) // Reset the parent metrics and delete all child metrics. ResetAll() // Produce a human-consumable representation of the metric.