Как установить атрибут диапазона OpenTelemetry для маршрута FastAPI?
Добавление тега к диапазону трассировки может быть очень полезным для последующего анализа данных трассировки и их разрезания по желаемому тегу.
После прочтения документации OpenTelemetry я не смог придумать способ добавить настраиваемый тег в диапазон.
Вот мой пример приложения FastAPI, уже оснащенного OpenTelemetry:
"""main.py"""
from typing import Dict
import fastapi
from opentelemetry import trace
from opentelemetry.sdk.trace.export import (
ConsoleSpanExporter,
SimpleExportSpanProcessor,
)
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.sdk.trace import TracerProvider
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(SimpleExportSpanProcessor(ConsoleSpanExporter()))
app = fastapi.FastAPI()
@app.get("/user/{id}")
async def get_user(id: int) -> Dict[str, str]:
"""Test endpoint."""
return {"message": "hello user!"}
FastAPIInstrumentor.instrument_app(app)
Вы можете запустить его с помощью
uvicorn main:app --reload
Как я могу добавить идентификатор пользователя в диапазон?
1 ответ
Решение
После прочтения исходного кода инструментария ASGI OpenTelemetryMiddleware (здесь) я понял, что вы можете просто получить текущий диапазон, установить тег (или атрибут), и текущий диапазон будет возвращен со всеми его атрибутами.
@app.get("/user/{id}")
async def get_user(id: int) -> Dict[str, str]:
"""Test endpoint."""
# Instrument the user id as a span tag
current_span = trace.get_current_span()
if current_span:
current_span.set_attribute("user_id", id)
return {"message": "hello user!"}