From af00f21275999583a76ac190a150ae882cc56ba1 Mon Sep 17 00:00:00 2001 From: Ellen Musick Date: Mon, 5 Aug 2019 14:49:48 -0700 Subject: [PATCH 1/2] Add reset method to CollectorRegistry and MetricWrapperBase The reset method sets the metric values back to their initial state. This enables workflows like pushing values to an external aggregator. This code has not been proven to be thread safe yet, additional tests are needed. --- prometheus_client/metrics.py | 8 +++ prometheus_client/registry.py | 10 +++ tests/test_core.py | 129 ++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) diff --git a/prometheus_client/metrics.py b/prometheus_client/metrics.py index b5dfe952..96efe211 100644 --- a/prometheus_client/metrics.py +++ b/prometheus_client/metrics.py @@ -73,6 +73,14 @@ def collect(self): metric.add_sample(self._name + suffix, labels, value) return [metric] + def reset(self): + if self._is_parent(): + with self._lock: + for labels, metric in self._metrics.items(): + metric.reset() + elif self._is_observable(): + self._metric_init() + def __init__(self, name, documentation, diff --git a/prometheus_client/registry.py b/prometheus_client/registry.py index fa2717fb..9f476f54 100644 --- a/prometheus_client/registry.py +++ b/prometheus_client/registry.py @@ -75,6 +75,16 @@ def collect(self): for metric in collector.collect(): yield metric + def reset(self): + """Clears value for each metric in each collector in the registry.""" + collectors = None + with self._lock: + collectors = self._collector_to_names + for collector in collectors: + if hasattr(collector, 'reset'): + collector.reset() + + def restricted_registry(self, names): """Returns object that only collects some metrics. diff --git a/tests/test_core.py b/tests/test_core.py index 9ad947cd..a407d0d7 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -671,6 +671,135 @@ def test_unregister_works(self): registry.unregister(s) Gauge('s_count', 'help', registry=registry) + def test_reset_registry(self): + registry = CollectorRegistry() + + gauge = Gauge('g', 'help', registry=registry) + gauge.inc() + self.assertEqual(1, registry.get_sample_value('g')) + + counter = Counter('c_total', 'help', registry=registry) + counter.inc() + self.assertEqual(1, registry.get_sample_value('c_total')) + + summary = Summary('s', 'help', registry=registry) + summary.observe(10) + self.assertEqual(1, registry.get_sample_value('s_count')) + self.assertEqual(10, registry.get_sample_value('s_sum')) + + histogram = Histogram('h', 'help', registry=registry) + histogram.observe(2) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0'})) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '2.5'})) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '5.0'})) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '+Inf'})) + self.assertEqual(1, registry.get_sample_value('h_count')) + self.assertEqual(2, registry.get_sample_value('h_sum')) + + + registry.reset() + + self.assertEqual(0, registry.get_sample_value('g')) + + self.assertEqual(0, registry.get_sample_value('c_total')) + + self.assertEqual(0, registry.get_sample_value('s_count')) + self.assertEqual(0, registry.get_sample_value('s_sum')) + + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '2.5'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '5.0'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '+Inf'})) + self.assertEqual(0, registry.get_sample_value('h_count')) + self.assertEqual(0, registry.get_sample_value('h_sum')) + + # -------------------------- + + gauge.inc() + gauge.inc() + gauge.inc() + gauge.dec() + self.assertEqual(2, registry.get_sample_value('g')) + + counter.inc() + counter.inc() + counter.inc() + self.assertEqual(3, registry.get_sample_value('c_total')) + + summary.observe(10) + summary.observe(5) + self.assertEqual(2, registry.get_sample_value('s_count')) + self.assertEqual(15, registry.get_sample_value('s_sum')) + + histogram.observe(2) + histogram.observe(6) + histogram.observe(1) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '1.0'})) + self.assertEqual(2, registry.get_sample_value('h_bucket', {'le': '2.5'})) + self.assertEqual(2, registry.get_sample_value('h_bucket', {'le': '5.0'})) + self.assertEqual(3, registry.get_sample_value('h_bucket', {'le': '+Inf'})) + self.assertEqual(3, registry.get_sample_value('h_count')) + self.assertEqual(9, registry.get_sample_value('h_sum')) + + + registry.reset() + + self.assertEqual(0, registry.get_sample_value('g')) + + self.assertEqual(0, registry.get_sample_value('c_total')) + + self.assertEqual(0, registry.get_sample_value('s_count')) + self.assertEqual(0, registry.get_sample_value('s_sum')) + + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '2.5'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '5.0'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '+Inf'})) + self.assertEqual(0, registry.get_sample_value('h_count')) + self.assertEqual(0, registry.get_sample_value('h_sum')) + + def test_reset_registry_with_labels(self): + registry = CollectorRegistry() + + gauge = Gauge('g', 'help', ['l'], registry=registry) + gauge.labels('a').inc() + self.assertEqual(1, registry.get_sample_value('g', {'l': 'a'})) + + counter = Counter('c_total', 'help', ['l'], registry=registry) + counter.labels('a').inc() + self.assertEqual(1, registry.get_sample_value('c_total', {'l': 'a'})) + + summary = Summary('s', 'help', ['l'], registry=registry) + summary.labels('a').observe(10) + self.assertEqual(1, registry.get_sample_value('s_count', {'l': 'a'})) + self.assertEqual(10, registry.get_sample_value('s_sum', {'l': 'a'})) + + histogram = Histogram('h', 'help', ['l'], registry=registry) + histogram.labels('a').observe(2) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0', 'l': 'a'})) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '2.5', 'l': 'a'})) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '5.0', 'l': 'a'})) + self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '+Inf', 'l': 'a'})) + self.assertEqual(1, registry.get_sample_value('h_count', {'l': 'a'})) + self.assertEqual(2, registry.get_sample_value('h_sum', {'l': 'a'})) + + + registry.reset() + + self.assertEqual(0, registry.get_sample_value('g', {'l': 'a'})) + + self.assertEqual(0, registry.get_sample_value('c_total', {'l': 'a'})) + + self.assertEqual(0, registry.get_sample_value('s_count', {'l': 'a'})) + self.assertEqual(0, registry.get_sample_value('s_sum', {'l': 'a'})) + + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0', 'l': 'a'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '2.5', 'l': 'a'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '5.0', 'l': 'a'})) + self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '+Inf', 'l': 'a'})) + self.assertEqual(0, registry.get_sample_value('h_count', {'l': 'a'})) + self.assertEqual(0, registry.get_sample_value('h_sum', {'l': 'a'})) + def custom_collector(self, metric_family, registry): class CustomCollector(object): def collect(self): From a33e35c117062a654af3ecfa97e85c5231be7119 Mon Sep 17 00:00:00 2001 From: Morgan Nomura Date: Wed, 15 Apr 2020 11:45:45 -0700 Subject: [PATCH 2/2] add textio.yml with team name --- textio.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 textio.yml diff --git a/textio.yml b/textio.yml new file mode 100644 index 00000000..59ff19e4 --- /dev/null +++ b/textio.yml @@ -0,0 +1 @@ +team: infrastructure