11
11
from wsgiref .simple_server import make_server , WSGIRequestHandler
12
12
13
13
from . import core
14
+ import openmetrics .exposition
14
15
try :
15
16
from BaseHTTPServer import BaseHTTPRequestHandler , HTTPServer
16
17
from SocketServer import ThreadingMixIn
@@ -36,12 +37,13 @@ def make_wsgi_app(registry=core.REGISTRY):
36
37
def prometheus_app (environ , start_response ):
37
38
params = parse_qs (environ .get ('QUERY_STRING' , '' ))
38
39
r = registry
40
+ encoder , content_type = choose_encoder (environ .get ['HTTP_ACCEPT' ])
39
41
if 'name[]' in params :
40
42
r = r .restricted_registry (params ['name[]' ])
41
- output = generate_latest (r )
43
+ output = encoder (r )
42
44
43
45
status = str ('200 OK' )
44
- headers = [(str ('Content-type' ), CONTENT_TYPE_LATEST )]
46
+ headers = [(str ('Content-type' ), content_type )]
45
47
start_response (status , headers )
46
48
return [output ]
47
49
return prometheus_app
@@ -87,22 +89,32 @@ def generate_latest(registry=core.REGISTRY):
87
89
return '' .join (output ).encode ('utf-8' )
88
90
89
91
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
+
90
101
class MetricsHandler (BaseHTTPRequestHandler ):
91
102
"""HTTP handler that gives metrics from ``core.REGISTRY``."""
92
103
registry = core .REGISTRY
93
104
94
105
def do_GET (self ):
95
106
registry = self .registry
96
107
params = parse_qs (urlparse (self .path ).query )
108
+ encoder , content_type = choose_encoder (self .headers .get ('Accept' ))
97
109
if 'name[]' in params :
98
110
registry = registry .restricted_registry (params ['name[]' ])
99
111
try :
100
- output = generate_latest (registry )
112
+ output = encoder (registry )
101
113
except :
102
114
self .send_error (500 , 'error generating metric output' )
103
115
raise
104
116
self .send_response (200 )
105
- self .send_header ('Content-Type' , CONTENT_TYPE_LATEST )
117
+ self .send_header ('Content-Type' , content_type )
106
118
self .end_headers ()
107
119
self .wfile .write (output )
108
120
0 commit comments