42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import os
|
|
|
|
import aiohttp.web_request
|
|
from aiohttp import web
|
|
from prometheus_client import (
|
|
CONTENT_TYPE_LATEST,
|
|
CollectorRegistry,
|
|
generate_latest,
|
|
multiprocess,
|
|
)
|
|
|
|
from .. import utils
|
|
|
|
|
|
async def metrics(_request: aiohttp.web_request.Request) -> web.Response:
|
|
def _get_metrics() -> bytes:
|
|
# Check if multiprocess mode is enabled
|
|
if "PROMETHEUS_MULTIPROC_DIR" in os.environ:
|
|
# Create a new registry for this request to collect metrics from all processes
|
|
registry = CollectorRegistry(auto_describe=True)
|
|
multiprocess.MultiProcessCollector(registry) # type: ignore[no-untyped-call]
|
|
return generate_latest(registry)
|
|
else:
|
|
# Use default global registry if multiprocess mode is not enabled
|
|
return generate_latest()
|
|
|
|
loop = asyncio.get_running_loop()
|
|
data = await loop.run_in_executor(None, _get_metrics)
|
|
return web.Response(
|
|
body=data,
|
|
headers={"Content-Type": CONTENT_TYPE_LATEST, "Content-Length": str(len(data))},
|
|
)
|
|
|
|
|
|
class HttpServer(utils.http_server.HttpServer):
|
|
def __init__(self, host: str, port: int) -> None:
|
|
super().__init__(host, port)
|
|
self._app.add_routes([web.get("/metrics", metrics)])
|