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): 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