1111from wsgiref .simple_server import make_server , WSGIRequestHandler
1212
1313from . import core
14+ import openmetrics .exposition
1415try :
1516 from BaseHTTPServer import BaseHTTPRequestHandler , HTTPServer
1617 from SocketServer import ThreadingMixIn
@@ -36,12 +37,13 @@ def make_wsgi_app(registry=core.REGISTRY):
3637 def prometheus_app (environ , start_response ):
3738 params = parse_qs (environ .get ('QUERY_STRING' , '' ))
3839 r = registry
40+ encoder , content_type = choose_encoder (environ .get ['HTTP_ACCEPT' ])
3941 if 'name[]' in params :
4042 r = r .restricted_registry (params ['name[]' ])
41- output = generate_latest (r )
43+ output = encoder (r )
4244
4345 status = str ('200 OK' )
44- headers = [(str ('Content-type' ), CONTENT_TYPE_LATEST )]
46+ headers = [(str ('Content-type' ), content_type )]
4547 start_response (status , headers )
4648 return [output ]
4749 return prometheus_app
@@ -87,22 +89,32 @@ def generate_latest(registry=core.REGISTRY):
8789 return '' .join (output ).encode ('utf-8' )
8890
8991
92+ def choose_encoder (accept_header ):
93+ accept_header = accept_header or ''
94+ for accepted in accept_header .split (',' ):
95+ if accepted == 'text/openmetrics; version=0.0.1' :
96+ return (openmetrics .exposition .generate_latest ,
97+ openmetrics .exposition .CONTENT_TYPE_LATEST )
98+ return (generate_latest , CONTENT_TYPE_LATEST )
99+
100+
90101class MetricsHandler (BaseHTTPRequestHandler ):
91102 """HTTP handler that gives metrics from ``core.REGISTRY``."""
92103 registry = core .REGISTRY
93104
94105 def do_GET (self ):
95106 registry = self .registry
96107 params = parse_qs (urlparse (self .path ).query )
108+ encoder , content_type = choose_encoder (self .headers .get ('Accept' ))
97109 if 'name[]' in params :
98110 registry = registry .restricted_registry (params ['name[]' ])
99111 try :
100- output = generate_latest (registry )
112+ output = encoder (registry )
101113 except :
102114 self .send_error (500 , 'error generating metric output' )
103115 raise
104116 self .send_response (200 )
105- self .send_header ('Content-Type' , CONTENT_TYPE_LATEST )
117+ self .send_header ('Content-Type' , content_type )
106118 self .end_headers ()
107119 self .wfile .write (output )
108120
0 commit comments