@@ -83,9 +83,10 @@ def generate_latest(registry=core.REGISTRY):
8383
8484class 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
106122class _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 ()
0 commit comments