@@ -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