exposition.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from __future__ import annotations
  2. from aiohttp import hdrs, web
  3. from aiohttp.typedefs import Handler
  4. from ..exposition import _bake_output
  5. from ..registry import Collector, REGISTRY
  6. def make_aiohttp_handler(
  7. registry: Collector = REGISTRY,
  8. disable_compression: bool = False,
  9. ) -> Handler:
  10. """Create a aiohttp handler which serves the metrics from a registry."""
  11. async def prometheus_handler(request: web.Request) -> web.Response:
  12. # Prepare parameters
  13. params = {key: request.query.getall(key) for key in request.query.keys()}
  14. accept_header = ",".join(request.headers.getall(hdrs.ACCEPT, []))
  15. accept_encoding_header = ""
  16. # Bake output
  17. status, headers, output = _bake_output(
  18. registry,
  19. accept_header,
  20. accept_encoding_header,
  21. params,
  22. # use AIOHTTP's compression
  23. disable_compression=True,
  24. )
  25. response = web.Response(
  26. status=int(status.split(" ")[0]),
  27. headers=headers,
  28. body=output,
  29. )
  30. if not disable_compression:
  31. response.enable_compression()
  32. return response
  33. return prometheus_handler