Skip to content

Commit 6481c9a

Browse files
committed
properly expose metrics so exemplars are available
1 parent 0d9584f commit 6481c9a

File tree

2 files changed

+10
-12
lines changed

2 files changed

+10
-12
lines changed

packages/service-library/src/servicelib/aiohttp/monitoring.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from collections.abc import Awaitable, Callable
77
from typing import Final
88

9-
import prometheus_client
109
from aiohttp import web
11-
from prometheus_client import (
10+
from prometheus_client.exposition import (
1211
CONTENT_TYPE_LATEST,
12+
generate_latest,
1313
)
1414
from prometheus_client.registry import CollectorRegistry
1515
from servicelib.aiohttp.typing_extension import Handler
@@ -41,9 +41,7 @@ async def metrics_handler(request: web.Request):
4141
registry = get_collector_registry(request.app)
4242

4343
# NOTE: Cannot use ProcessPoolExecutor because registry is not pickable
44-
result = await request.loop.run_in_executor(
45-
None, prometheus_client.generate_latest, registry
46-
)
44+
result = await request.loop.run_in_executor(None, generate_latest, registry)
4745
response = web.Response(body=result)
4846
response.content_type = CONTENT_TYPE_LATEST
4947
return response

packages/service-library/src/servicelib/fastapi/monitoring.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# pylint: disable=protected-access
22

3+
import asyncio
34
import logging
45
from collections.abc import AsyncIterator
56
from typing import Final
67

7-
import prometheus_client
88
from fastapi import FastAPI, Request, Response, status
99
from fastapi_lifespan_manager import State
1010
from prometheus_client import CollectorRegistry
11+
from prometheus_client.exposition import CONTENT_TYPE_LATEST, generate_latest
1112
from servicelib.prometheus_metrics import (
1213
PrometheusMetrics,
1314
get_prometheus_metrics,
@@ -77,16 +78,15 @@ def initialize_prometheus_instrumentation(app: FastAPI) -> None:
7778
def _startup(app: FastAPI) -> None:
7879
@app.get("/metrics", include_in_schema=False)
7980
async def metrics_endpoint(request: Request) -> Response:
80-
"""
81-
Exposes the Prometheus metrics endpoint.
82-
"""
8381
prometheus_metrics = request.app.state.prometheus_metrics
8482
assert isinstance(prometheus_metrics, PrometheusMetrics) # nosec
85-
return Response(
86-
content=prometheus_client.generate_latest(prometheus_metrics.registry),
87-
media_type="text/plain",
83+
84+
content = await asyncio.get_event_loop().run_in_executor(
85+
None, generate_latest, prometheus_metrics.registry
8886
)
8987

88+
return Response(content=content, headers={"Content-Type": CONTENT_TYPE_LATEST})
89+
9090

9191
def _shutdown(app: FastAPI) -> None:
9292
prometheus_metrics = app.state.prometheus_metrics

0 commit comments

Comments
 (0)