8000 [#674] Made the registry restriction handle newly added metrics. (#675) · ethervoid/client_python@e92fa05 · GitHub
[go: up one dir, main page]

Skip to content

Commit e92fa05

Browse files
authored
[prometheus#674] Made the registry restriction handle newly added metrics. (prometheus#675)
* Made the registry restriction handle new metrics. * Made `restricted_metric()` private. Signed-off-by: Pavel <pavel@lexyr.com>
1 parent 9a24236 commit e92fa05

File tree

3 files changed

+37
-25
lines changed

3 files changed

+37
-25
lines changed

prometheus_client/metrics_core.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ def __repr__(self):
5858
self.samples,
5959
)
6060

61+
def _restricted_metric(self, names):
62+
"""Build a snapshot of a metric with samples restricted to a given set of names."""
63+
samples = [s for s in self.samples if s[0] in names]
64+
if samples:
65+
m = Metric(self.name, self.documentation, self.type)
66+
m.samples = samples
67+
return m
68+
return None
69+
6170

6271
class UnknownMetricFamily(Metric):
6372
"""A single unknown metric and its samples.

prometheus_client/registry.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -94,28 +94,7 @@ def restricted_registry(self, names):
9494
9595
Experimental."""
9696
names = set(names)
97-
collectors = set()
98-
metrics = []
99-
with self._lock:
100-
if 'target_info' in names and self._target_info:
101-
metrics.append(self._target_info_metric())
102-
names.remove('target_info')
103-
for name in names:
104-
if name in self._names_to_collectors:
105-
collectors.add(self._names_to_collectors[name])
106-
for collector in collectors:
107-
for metric in collector.collect():
108-
samples = [s for s in metric.samples if s[0] in names]
109-
if samples:
110-
m = Metric(metric.name, metric.documentation, metric.type)
111-
m.samples = samples
112-
metrics.append(m)
113-
114-
class RestrictedRegistry(object):
115-
def collect(self):
116-
return metrics
117-
118-
return RestrictedRegistry()
97+
return RestrictedRegistry(names, self)
11998

12099
def set_target_info(self, labels):
121100
with self._lock:
@@ -150,4 +129,16 @@ def get_sample_value(self, name, labels=None):
150129
return None
151130

152131

132+
class RestrictedRegistry(object):
133+
def __init__(self, names, registry):
134+
self._name_set = set(names)
135+
self._registry = registry
136+
137+
def collect(self):
138+
for metric in self._registry.collect():
139+
m = metric._restricted_metric(self._name_set)
140+
if m:
141+
yield m
142+
143+
153144
REGISTRY = CollectorRegistry(auto_describe=True)

tests/test_core.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,19 @@ def test_restricted_registry(self):
796796

797797
m = Metric('s', 'help', 'summary')
798798
m.samples = [Sample('s_sum', {}, 7)]
799-
self.assertEqual([m], registry.restricted_registry(['s_sum']).collect())
799+
self.assertEqual([m], list(registry.restricted_registry(['s_sum']).collect()))
800+
801+
def test_restricted_registry_adds_new_metrics(self):
802+
registry = CollectorRegistry()
803+
Counter('c_total', 'help', registry=registry)
804+
805+
restricted_registry = registry.restricted_registry(['s_sum'])
806+
807+
Summary('s', 'help', registry=registry).observe(7)
808+
m = Metric('s', 'help', 'summary')
809+
m.samples = [Sample('s_sum', {}, 7)]
810+
811+
self.assertEqual([m], list(restricted_registry.collect()))
800812

801813
def test_target_info_injected(self):
802814
registry = CollectorRegistry(target_info={'foo': 'bar'})
@@ -820,11 +832,11 @@ def test_target_info_restricted_registry(self):
820832

821833
m = Metric('s', 'help', 'summary')
822834
m.samples = [Sample('s_sum', {}, 7)]
823-
self.assertEqual([m], registry.restricted_registry(['s_sum']).collect())
835+
self.assertEqual([m], list(registry.restricted_registry(['s_sum']).collect()))
824836

825837
m = Metric('target', 'Target metadata', 'info')
826838
m.samples = [Sample('target_info', {'foo': 'bar'}, 1)]
827-
self.assertEqual([m], registry.restricted_registry(['target_info']).collect())
839+
self.assertEqual([m], list(registry.restricted_registry(['target_info']).collect()))
828840

829841

830842
if __name__ == '__main__':

0 commit comments

Comments
 (0)
0