Files
2026-07-13 13:39:38 +08:00

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)])