|
6 | 6 | import socket
|
7 | 7 | import sys
|
8 | 8 | import threading
|
9 |
| -from wsgiref.simple_server import make_server, WSGIRequestHandler |
| 9 | +from wsgiref.simple_server import make_server, WSGIServer, WSGIRequestHandler |
10 | 10 |
|
11 | 11 | from .openmetrics import exposition as openmetrics
|
12 | 12 | from .registry import REGISTRY
|
@@ -64,15 +64,26 @@ def log_message(self, format, *args):
|
64 | 64 | """Log nothing."""
|
65 | 65 |
|
66 | 66 |
|
| 67 | +class ThreadingWSGIServer(ThreadingMixIn, WSGIServer): |
| 68 | + """Thread per request HTTP server.""" |
| 69 | + # Make worker threads "fire and forget". Beginning with Python 3.7 this |
| 70 | + # prevents a memory leak because ``ThreadingMixIn`` starts to gather all |
| 71 | + # non-daemon threads in a list in order to join on them at server close. |
| 72 | + daemon_threads = True |
| 73 | + |
| 74 | + |
67 | 75 | def start_wsgi_server(port, addr='', registry=REGISTRY):
|
68 | 76 | """Starts a WSGI server for prometheus metrics as a daemon thread."""
|
69 | 77 | app = make_wsgi_app(registry)
|
70 |
| - httpd = make_server(addr, port, app, handler_class=_SilentHandler) |
| 78 | + httpd = make_server(addr, port, app, ThreadingWSGIServer, handler_class=_SilentHandler) |
71 | 79 | t = threading.Thread(target=httpd.serve_forever)
|
72 | 80 | t.daemon = True
|
73 | 81 | t.start()
|
74 | 82 |
|
75 | 83 |
|
| 84 | +start_http_server = start_wsgi_server |
| 85 | + |
| 86 | + |
76 | 87 | def generate_latest(registry=REGISTRY):
|
77 | 88 | """Returns the metrics from the registry in latest text format as a string."""
|
78 | 89 |
|
@@ -181,25 +192,6 @@ def factory(cls, registry):
|
181 | 192 | return MyMetricsHandler
|
182 | 193 |
|
183 | 194 |
|
184 |
| -class _ThreadingSimpleServer(ThreadingMixIn, HTTPServer): |
185 |
| - """Thread per request HTTP server.""" |
186 |
| - # Make worker threads "fire and forget". Beginning with Python 3.7 this |
187 |
| - # prevents a memory leak because ``ThreadingMixIn`` starts to gather all |
188 |
| - # non-daemon threads in a list in order to join on them at server close. |
189 |
| - # Enabling daemon threads virtually makes ``_ThreadingSimpleServer`` the |
190 |
| - # same as Python 3.7's ``ThreadingHTTPServer``. |
191 |
| - daemon_threads = True |
192 |
| - |
193 |
| - |
194 |
| -def start_http_server(port, addr='', registry=REGISTRY): |
195 |
| - """Starts an HTTP server for prometheus metrics as a daemon thread""" |
196 |
| - CustomMetricsHandler = MetricsHandler.factory(registry) |
197 |
| - httpd = _ThreadingSimpleServer((addr, port), CustomMetricsHandler) |
198 |
| - t = threading.Thread(target=httpd.serve_forever) |
199 |
| - t.daemon = True |
200 |
| - t.start() |
201 |
| - |
202 |
| - |
203 | 195 | def write_to_textfile(path, registry):
|
204 | 196 | """Write metrics to the given path.
|
205 | 197 |
|
|
0 commit comments