44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
import os
|
|
|
|
from django.http import HttpResponse
|
|
from django.views import View
|
|
|
|
import prometheus_client
|
|
from prometheus_client import multiprocess
|
|
from prometheus_client.exposition import _bake_output
|
|
|
|
|
|
class PrometheusDjangoView(View):
|
|
multiprocess_mode: bool = "PROMETHEUS_MULTIPROC_DIR" in os.environ or "prometheus_multiproc_dir" in os.environ
|
|
registry: prometheus_client.CollectorRegistry = None
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
if self.registry is None:
|
|
if self.multiprocess_mode:
|
|
self.registry = prometheus_client.CollectorRegistry()
|
|
multiprocess.MultiProcessCollector(self.registry)
|
|
else:
|
|
self.registry = prometheus_client.REGISTRY
|
|
accept_header = request.headers.get("Accept")
|
|
accept_encoding_header = request.headers.get("Accept-Encoding")
|
|
# Bake output
|
|
status, headers, output = _bake_output(
|
|
registry=self.registry,
|
|
accept_header=accept_header,
|
|
accept_encoding_header=accept_encoding_header,
|
|
params=request.GET,
|
|
disable_compression=False,
|
|
)
|
|
status = int(status.split(" ")[0])
|
|
return HttpResponse(
|
|
output,
|
|
status=status,
|
|
headers=headers,
|
|
)
|
|
|
|
def options(self, request, *args, **kwargs):
|
|
return HttpResponse(
|
|
status=200,
|
|
headers={"Allow": "OPTIONS,GET"},
|
|
)
|