Skip to content

Commit 9bd935b

Browse files
committed
Use specific exception for duplicate timeseries
Use sub-class of ValueError instead of ValueError, so that we can distinguish issues caused by wrong input (like invalid name format) from duplicate metrics being registered into the same registry. Signed-off-by: Takashi Kajinami <kajinamit@oss.nttdata.com>
1 parent 482656c commit 9bd935b

3 files changed

Lines changed: 33 additions & 26 deletions

File tree

prometheus_client/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
HistogramMetricFamily, InfoMetricFamily, Metric, StateSetMetricFamily,
55
SummaryMetricFamily, UnknownMetricFamily, UntypedMetricFamily,
66
)
7-
from .registry import CollectorRegistry, REGISTRY
7+
from .registry import CollectorRegistry, DuplicateTimeseries, REGISTRY
88
from .samples import BucketSpan, Exemplar, NativeHistogram, Sample, Timestamp
99

1010
__all__ = (
1111
'BucketSpan',
1212
'CollectorRegistry',
1313
'Counter',
1414
'CounterMetricFamily',
15+
'DuplicateTimeseries',
1516
'Enum',
1617
'Exemplar',
1718
'Gauge',

prometheus_client/registry.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import copy
22
from threading import Lock
3-
from typing import Dict, Iterable, List, Optional, Protocol
3+
from typing import Dict, Iterable, List, Optional, Protocol, Set
44

55
from .metrics_core import Metric
66

@@ -15,6 +15,14 @@ def collect(self) -> Iterable[Metric]:
1515
return []
1616

1717

18+
class DuplicateTimeseries(ValueError):
19+
def __init__(self, duplicates: Set[str]):
20+
msg = 'Duplicated timeseries in CollectorRegistry: {}'.format(
21+
duplicates)
22+
super().__init__(msg)
23+
self.duplicates: Set[str] = duplicates
24+
25+
1826
class CollectorRegistry:
1927
"""Metric collector registry.
2028
@@ -40,9 +48,7 @@ def register(self, collector: Collector) -> None:
4048
names = self._get_names(collector)
4149
duplicates = set(self._names_to_collectors).intersection(names)
4250
if duplicates:
43-
raise ValueError(
44-
'Duplicated timeseries in CollectorRegistry: {}'.format(
45-
duplicates))
51+
raise DuplicateTimeseries(duplicates)
4652
for name in names:
4753
self._names_to_collectors[name] = collector
4854
self._collector_to_names[collector] = names

tests/test_core.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
from prometheus_client import metrics
99
from prometheus_client.core import (
10-
CollectorRegistry, Counter, CounterMetricFamily, Enum, Gauge,
11-
GaugeHistogramMetricFamily, GaugeMetricFamily, Histogram,
10+
CollectorRegistry, Counter, CounterMetricFamily, DuplicateTimeseries,
11+
Enum, Gauge, GaugeHistogramMetricFamily, GaugeMetricFamily, Histogram,
1212
HistogramMetricFamily, Info, InfoMetricFamily, Metric, Sample,
1313
StateSetMetricFamily, Summary, SummaryMetricFamily, UntypedMetricFamily,
1414
)
@@ -916,41 +916,41 @@ class TestCollectorRegistry(unittest.TestCase):
916916
def test_duplicate_metrics_raises(self):
917917
registry = CollectorRegistry()
918918
Counter('c_total', 'help', registry=registry)
919-
self.assertRaises(ValueError, Counter, 'c_total', 'help', registry=registry)
920-
self.assertRaises(ValueError, Gauge, 'c_total', 'help', registry=registry)
921-
self.assertRaises(ValueError, Gauge, 'c_created', 'help', registry=registry)
919+
self.assertRaises(DuplicateTimeseries, Counter, 'c_total', 'help', registry=registry)
920+
self.assertRaises(DuplicateTimeseries, Gauge, 'c_total', 'help', registry=registry)
921+
self.assertRaises(DuplicateTimeseries, Gauge, 'c_created', 'help', registry=registry)
922922

923923
Gauge('g_created', 'help', registry=registry)
924-
self.assertRaises(ValueError, Gauge, 'g_created', 'help', registry=registry)
925-
self.assertRaises(ValueError, Counter, 'g', 'help', registry=registry)
924+
self.assertRaises(DuplicateTimeseries, Gauge, 'g_created', 'help', registry=registry)
925+
self.assertRaises(DuplicateTimeseries, Counter, 'g', 'help', registry=registry)
926926

927927
Summary('s', 'help', registry=registry)
928-
self.assertRaises(ValueError, Summary, 's', 'help', registry=registry)
929-
self.assertRaises(ValueError, Gauge, 's_created', 'help', registry=registry)
930-
self.assertRaises(ValueError, Gauge, 's_sum', 'help', registry=registry)
931-
self.assertRaises(ValueError, Gauge, 's_count', 'help', registry=registry)
928+
self.assertRaises(DuplicateTimeseries, Summary, 's', 'help', registry=registry)
929+
self.assertRaises(DuplicateTimeseries, Gauge, 's_created', 'help', registry=registry)
930+
self.assertRaises(DuplicateTimeseries, Gauge, 's_sum', 'help', registry=registry)
931+
self.assertRaises(DuplicateTimeseries, Gauge, 's_count', 'help', registry=registry)
932932
# We don't currently expose quantiles, but let's prevent future
933933
# clashes anyway.
934-
self.assertRaises(ValueError, Gauge, 's', 'help', registry=registry)
934+
self.assertRaises(DuplicateTimeseries, Gauge, 's', 'help', registry=registry)
935935

936936
Histogram('h', 'help', registry=registry)
937-
self.assertRaises(ValueError, Histogram, 'h', 'help', registry=registry)
937+
self.assertRaises(DuplicateTimeseries, Histogram, 'h', 'help', registry=registry)
938938
# Clashes aggaint various suffixes.
939-
self.assertRaises(ValueError, Summary, 'h', 'help', registry=registry)
940-
self.assertRaises(ValueError, Gauge, 'h_count', 'help', registry=registry)
941-
self.assertRaises(ValueError, Gauge, 'h_sum', 'help', registry=registry)
942-
self.assertRaises(ValueError, Gauge, 'h_bucket', 'help', registry=registry)
943-
self.assertRaises(ValueError, Gauge, 'h_created', 'help', registry=registry)
939+
self.assertRaises(DuplicateTimeseries, Summary, 'h', 'help', registry=registry)
940+
self.assertRaises(DuplicateTimeseries, Gauge, 'h_count', 'help', registry=registry)
941+
self.assertRaises(DuplicateTimeseries, Gauge, 'h_sum', 'help', registry=registry)
942+
self.assertRaises(DuplicateTimeseries, Gauge, 'h_bucket', 'help', registry=registry)
943+
self.assertRaises(DuplicateTimeseries, Gauge, 'h_created', 'help', registry=registry)
944944
# The name of the histogram itself is also taken.
945-
self.assertRaises(ValueError, Gauge, 'h', 'help', registry=registry)
945+
self.assertRaises(DuplicateTimeseries, Gauge, 'h', 'help', registry=registry)
946946

947947
Info('i', 'help', registry=registry)
948-
self.assertRaises(ValueError, Gauge, 'i_info', 'help', registry=registry)
948+
self.assertRaises(DuplicateTimeseries, Gauge, 'i_info', 'help', registry=registry)
949949

950950
def test_unregister_works(self):
951951
registry = CollectorRegistry()
952952
s = Summary('s', 'help', registry=registry)
953-
self.assertRaises(ValueError, Gauge, 's_count', 'help', registry=registry)
953+
self.assertRaises(DuplicateTimeseries, Gauge, 's_count', 'help', registry=registry)
954954
registry.unregister(s)
955955
Gauge('s_count', 'help', registry=registry)
956956

0 commit comments

Comments
 (0)