8000 Fix: #222. Support custom registry for MetricsHandler. (#223) · sonlinux/client_python@24d4d95 · GitHub
[go: up one dir, main page]

Skip to content

Commit 24d4d95

Browse files
ioggstreambrian-brazil
authored andcommitted
Fix: prometheus#222. Support custom registry for MetricsHandler. (prometheus#223)
Pass a registry to start_http_server via a MetricsHandler factory implemented as a staticmethod of the existing class.
1 parent 9828994 commit 24d4d95

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

prometheus_client/exposition.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ def generate_latest(registry=core.REGISTRY):
8383

8484
class MetricsHandler(BaseHTTPRequestHandler):
8585
"""HTTP handler that gives metrics from ``core.REGISTRY``."""
86+
registry = core.REGISTRY
8687

8788
def do_GET(self):
88-
registry = core.REGISTRY
89+
registry = self.registry
8990
params = parse_qs(urlparse(self.path).query)
9091
if 'name[]' in params:
9192
registry = registry.restricted_registry(params['name[]'])
@@ -102,14 +103,30 @@ def do_GET(self):
102103
def log_message(self, format, *args):
103104
"""Log nothing."""
104105

106+
@staticmethod
107+
def factory(registry):
108+
"""Returns a dynamic MetricsHandler class tied
109+
to the passed registry.
110+
"""
111+
# This implementation relies on MetricsHandler.registry
112+
# (defined above and defaulted to core.REGISTRY).
113+
114+
# As we have unicode_literals, we need to create a str()
115+
# object for type().
116+
cls_name = str('MetricsHandler')
117+
MyMetricsHandler = type(cls_name, (MetricsHandler, object),
118+
{"registry": registry})
119+
return MyMetricsHandler
120+
105121

106122
class _ThreadingSimpleServer(ThreadingMixIn, HTTPServer):
107123
"""Thread per request HTTP server."""
108124

109125

110-
def start_http_server(port, addr=''):
126+
def start_http_server(port, addr='', registry=core.REGISTRY):
111127
"""Starts an HTTP server for prometheus metrics as a daemon thread"""
112-
httpd = _ThreadingSimpleServer((addr, port), MetricsHandler)
128+
CustomMetricsHandler = MetricsHandler.factory(registry)
129+
httpd = _ThreadingSimpleServer((addr, port), CustomMetricsHandler)
113130
t = threading.Thread(target=httpd.serve_forever)
114131
t.daemon = True
115132
t.start()

prometheus_client/multiprocess.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from . import core
1111

12+
1213
class MultiProcessCollector(object):
1314
"""Collector for files for multi-process mode."""
1415
def __init__(self, registry, path=None):

tests/test_exposition.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from prometheus_client import CollectorRegistry, generate_latest
1414
from prometheus_client import push_to_gateway, pushadd_to_gateway, delete_from_gateway
1515
from prometheus_client import CONTENT_TYPE_LATEST, instance_ip_grouping_key
16-
from prometheus_client.exposition import default_handler, basic_auth_handler
16+
from prometheus_client import core
17+
from prometheus_client.exposition import default_handler, basic_auth_handler, MetricsHandler
1718

1819
try:
1920
from BaseHTTPServer import BaseHTTPRequestHandler
@@ -195,6 +196,9 @@ def my_auth_handler(url, method, timeout, headers, data):
195196
def test_instance_ip_grouping_key(self):
196197
self.assertTrue('' != instance_ip_grouping_key()['instance'])
197198

199+
def test_metrics_handler(self):
200+
MyHandler = MetricsHandler.factory(core.REGISTRY)
201+
198202

199203
if __name__ == '__main__':
200204
unittest.main()

0 commit comments

Comments
 (0)
0