refac: otel metrics handle 500

This commit is contained in:
Timothy Jaeryang Baek 2025-09-16 12:11:32 -05:00
parent e66e0526ed
commit b14617a653

View file

@ -163,20 +163,27 @@ def setup_metrics(app: FastAPI, resource: Resource) -> None:
@app.middleware("http") @app.middleware("http")
async def _metrics_middleware(request: Request, call_next): async def _metrics_middleware(request: Request, call_next):
start_time = time.perf_counter() start_time = time.perf_counter()
response = await call_next(request)
elapsed_ms = (time.perf_counter() - start_time) * 1000.0
# Route template e.g. "/items/{item_id}" instead of real path. status_code = None
route = request.scope.get("route") try:
route_path = getattr(route, "path", request.url.path) response = await call_next(request)
status_code = getattr(response, "status_code", 500)
return response
except Exception:
status_code = 500
raise
finally:
elapsed_ms = (time.perf_counter() - start_time) * 1000.0
attrs: Dict[str, str | int] = { # Route template e.g. "/items/{item_id}" instead of real path.
"http.method": request.method, route = request.scope.get("route")
"http.route": route_path, route_path = getattr(route, "path", request.url.path)
"http.status_code": response.status_code,
}
request_counter.add(1, attrs) attrs: Dict[str, str | int] = {
duration_histogram.record(elapsed_ms, attrs) "http.method": request.method,
"http.route": route_path,
"http.status_code": status_code,
}
return response request_counter.add(1, attrs)
duration_histogram.record(elapsed_ms, attrs)