7
7
import socket
8
8
import threading
9
9
from contextlib import closing
10
- from wsgiref .simple_server import make_server
10
+ from wsgiref .simple_server import make_server , WSGIRequestHandler
11
11
12
12
from . import core
13
13
try :
18
18
from urlparse import parse_qs , urlparse
19
19
except ImportError :
20
20
# Python 3
21
- unicode = str
22
21
from http .server import BaseHTTPRequestHandler , HTTPServer
23
22
from socketserver import ThreadingMixIn
24
23
from urllib .request import build_opener , Request , HTTPHandler
@@ -45,13 +44,18 @@ def prometheus_app(environ, start_response):
45
44
return prometheus_app
46
45
47
46
47
+ class _SilentHandler (WSGIRequestHandler ):
48
+ """WSGI handler that does not log requests."""
49
+
50
+ def log_message (self , format , * args ):
51
+ """Log nothing."""
52
+
53
+
48
54
def start_wsgi_server (port , addr = '' , registry = core .REGISTRY ):
49
55
"""Starts a WSGI server for prometheus metrics as a daemon thread."""
50
- class PrometheusMetricsServer (threading .Thread ):
51
- def run (self ):
52
- httpd = make_server (addr , port , make_wsgi_app (registry ))
53
- httpd .serve_forever ()
54
- t = PrometheusMetricsServer ()
56
+ app = make_wsgi_app (registry )
57
+ httpd = make_server (addr , port , app , handler_class = _SilentHandler )
58
+ t = threading .Thread (target = httpd .serve_forever )
55
59
t .daemon = True
56
60
t .start ()
57
61
@@ -76,6 +80,8 @@ def generate_latest(registry=core.REGISTRY):
76
80
77
81
78
82
class MetricsHandler (BaseHTTPRequestHandler ):
83
+ """HTTP handler that gives metrics from ``core.REGISTRY``."""
84
+
79
85
def do_GET (self ):
80
86
registry = core .REGISTRY
81
87
params = parse_qs (urlparse (self .path ).query )
@@ -92,18 +98,17 @@ def do_GET(self):
92
98
self .wfile .write (output )
93
99
94
100
def log_message (self , format , * args ):
95
- return
101
+ """Log nothing."""
102
+
103
+
104
+ class _ThreadingSimpleServer (ThreadingMixIn , HTTPServer ):
105
+ """Thread per request HTTP server."""
96
106
97
107
98
108
def start_http_server (port , addr = '' ):
99
109
"""Starts an HTTP server for prometheus metrics as a daemon thread"""
100
- class ThreadingSimpleServer (ThreadingMixIn , HTTPServer ):
101
- pass
102
- class PrometheusMetricsServer (threading .Thread ):
103
- def run (self ):
104
- httpd = ThreadingSimpleServer ((addr , port ), MetricsHandler )
105
- httpd .serve_forever ()
106
- t = PrometheusMetricsServer ()
110
+ httpd = _ThreadingSimpleServer ((addr , port ), MetricsHandler )
111
+ t = threading .Thread (target = httpd .serve_forever )
107
112
t .daemon = True
108
113
t .start ()
109
114
@@ -263,6 +268,7 @@ def _use_gateway(method, gateway, job, registry, grouping_key, timeout, handler)
263
268
handler (url = url , method = method , timeout = timeout ,
264
269
headers = headers , data = data )()
265
270
271
+
266
272
def instance_ip_grouping_key ():
267
273
'''Grouping key with instance set to the IP Address of this host.'''
268
274
with closing (socket .socket (socket .AF_INET , socket .SOCK_DGRAM )) as s :
0 commit comments