1919logger = logging .getLogger (__name__ )
2020
2121
22- def SetupPrometheusEndpointOnPort (port , addr = "" ):
22+ def GetRegistry ():
23+ if "prometheus_multiproc_dir" in os .environ :
24+ registry = prometheus_client .CollectorRegistry ()
25+ multiprocess .MultiProcessCollector (registry )
26+ else :
27+ registry = prometheus_client .REGISTRY
28+ return registry
29+
30+
31+ def SetupPrometheusEndpointOnPort (registry , port , addr = "" ):
2332 """Exports Prometheus metrics on an HTTPServer running in its own thread.
2433
2534 The server runs on the given port and is by default listenning on
@@ -43,7 +52,7 @@ def SetupPrometheusEndpointOnPort(port, addr=""):
4352 "autoreloader is active. Use the URL exporter, or start django "
4453 "with --noreload. See documentation/exports.md."
4554 )
46- prometheus_client .start_http_server (port , addr = addr )
55+ prometheus_client .start_http_server (port , addr = addr , registry = registry )
4756
4857
4958class PrometheusEndpointServer (threading .Thread ):
@@ -57,7 +66,7 @@ def run(self):
5766 self .httpd .serve_forever ()
5867
5968
60- def SetupPrometheusEndpointOnPortRange (port_range , addr = "" ):
69+ def SetupPrometheusEndpointOnPortRange (registry , port_range , addr = "" ):
6170 """Like SetupPrometheusEndpointOnPort, but tries several ports.
6271
6372 This is useful when you're running Django as a WSGI application
@@ -83,8 +92,10 @@ def SetupPrometheusEndpointOnPortRange(port_range, addr=""):
8392 "with --noreload. See documentation/exports.md."
8493 )
8594 for port in port_range :
95+ handler = prometheus_client .MetricsHandler
96+ handler .registry = registry
8697 try :
87- httpd = HTTPServer ((addr , port ), prometheus_client . MetricsHandler )
98+ httpd = HTTPServer ((addr , port ), handler )
8899 except OSError :
89100 # Python 2 raises socket.error, in Python 3 socket.error is an
90101 # alias for OSError
@@ -105,22 +116,19 @@ def SetupPrometheusExportsFromConfig():
105116 port = getattr (settings , "PROMETHEUS_METRICS_EXPORT_PORT" , None )
106117 port_range = getattr (settings , "PROMETHEUS_METRICS_EXPORT_PORT_RANGE" , None )
107118 addr = getattr (settings , "PROMETHEUS_METRICS_EXPORT_ADDRESS" , "" )
119+ registry = GetRegistry ()
108120 if port_range :
109- SetupPrometheusEndpointOnPortRange (port_range , addr )
121+ SetupPrometheusEndpointOnPortRange (registry , port_range , addr )
110122 elif port :
111- SetupPrometheusEndpointOnPort (port , addr )
123+ SetupPrometheusEndpointOnPort (registry , port , addr )
112124
113125
114126def ExportToDjangoView (request ):
115127 """Exports /metrics as a Django view.
116128
117129 You can use django_prometheus.urls to map /metrics to this view.
118130 """
119- if "prometheus_multiproc_dir" in os .environ :
120- registry = prometheus_client .CollectorRegistry ()
121- multiprocess .MultiProcessCollector (registry )
122- else :
123- registry = prometheus_client .REGISTRY
131+ registry = GetRegistry ()
124132 metrics_page = prometheus_client .generate_latest (registry )
125133 return HttpResponse (
126134 metrics_page , content_type = prometheus_client .CONTENT_TYPE_LATEST
0 commit comments