exposition.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import os
  2. from django.http import HttpResponse
  3. from django.views import View
  4. import prometheus_client
  5. from prometheus_client import multiprocess
  6. from prometheus_client.exposition import _bake_output
  7. class PrometheusDjangoView(View):
  8. multiprocess_mode: bool = "PROMETHEUS_MULTIPROC_DIR" in os.environ or "prometheus_multiproc_dir" in os.environ
  9. registry: prometheus_client.CollectorRegistry = None
  10. def get(self, request, *args, **kwargs):
  11. if self.registry is None:
  12. if self.multiprocess_mode:
  13. self.registry = prometheus_client.CollectorRegistry()
  14. multiprocess.MultiProcessCollector(self.registry)
  15. else:
  16. self.registry = prometheus_client.REGISTRY
  17. accept_header = request.headers.get("Accept")
  18. accept_encoding_header = request.headers.get("Accept-Encoding")
  19. # Bake output
  20. status, headers, output = _bake_output(
  21. registry=self.registry,
  22. accept_header=accept_header,
  23. accept_encoding_header=accept_encoding_header,
  24. params=request.GET,
  25. disable_compression=False,
  26. )
  27. status = int(status.split(" ")[0])
  28. return HttpResponse(
  29. output,
  30. status=status,
  31. headers=headers,
  32. )
  33. def options(self, request, *args, **kwargs):
  34. return HttpResponse(
  35. status=200,
  36. headers={"Allow": "OPTIONS,GET"},
  37. )