Как установить атрибут OpenTelemetry span для маршрута FastAPI?

#fastapi #telemetry #open-telemetry

#fastapi #телеметрия #открыть-телеметрия

Вопрос:

Добавление тега к диапазону трассировки может быть очень полезным для последующего анализа данных трассировки и нарезки их нужным тегом.

Прочитав документы OpenTelemetry, я не смог найти способ добавить пользовательский тег к span.

Вот мой пример приложения 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:

Прочитав исходный код OpenTelemetryMiddleware инструментария ASGI (здесь ), я понял, что вы можете просто получить текущий диапазон, установить тег (или атрибут), и текущий диапазон будет возвращен со всеми его атрибутами.

 @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!"}