Zum Inhalt

OpenTelemetry

🌐 Übersetzung durch KI und Menschen

Diese Übersetzung wurde von KI erstellt, angeleitet von Menschen. 🤝

Sie könnte Fehler enthalten, etwa Missverständnisse des ursprünglichen Sinns oder unnatürliche Formulierungen, usw. 🤖

Sie können diese Übersetzung verbessern, indem Sie uns helfen, die KI-LLM besser anzuleiten.

Englische Version

Wenn Ihre API läuft, möchten Sie vielleicht wissen, wie viel Traffic sie erhält, welche Requests langsam sind und wann Fehler auftreten.

Telemetrie umfasst Daten über das Verhalten Ihrer Anwendung, die Ihnen helfen, diese Fragen zu beantworten. Zu den gängigen Typen gehören:

  • Metriken: Messwerte, die Sie über einen Zeitraum zusammenfassen können, etwa Responsezeiten und die Anzahl der verarbeiteten Requests.
  • Traces: Aufzeichnungen einzelner Requests und der Operationen, die zu ihrer Verarbeitung ausgeführt werden. Jede zeitlich erfasste Operation wird als Span bezeichnet.
  • Logs: Aufzeichnungen von Events mit Zeitstempel, etwa das Starten einer Anwendung oder das Fehlschlagen einer Operation.

OpenTelemetry ist eine Sammlung von Standards und Werkzeugen zum Erfassen von Telemetriedaten und zum Senden dieser Daten an einen Monitoring-Dienst, wo Sie sie in Dashboards untersuchen können.

FastAPI bietet standardmäßig OpenTelemetry-Unterstützung für HTTP-Request-Traces, Metriken und Logs. WebSocket-Verbindungen liefern ebenfalls Traces und Logs. Um diese Daten anzuzeigen, konfigurieren Sie einen Monitoring-Dienst, der sie empfängt.

FastAPI installieren

Installieren Sie FastAPI mit den standard-Extras, die die Pakete zum Senden von Telemetriedaten enthalten:

$ uv add "fastapi[standard]"
---> 100%

Die Anwendung erstellen

Erstellen Sie eine Datei main.py:

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

Sie müssen keinen eigenen Code schreiben, um Telemetriedaten zu erfassen.

FastAPI Cloud

Wenn Sie mit fastapi[standard] auf FastAPI Cloud deployen, funktionieren Metriken automatisch. Sie müssen nichts weiter konfigurieren.

Mit einem Pro-Tarif können Sie die Anzahl der Requests, Fehlerraten und Responsezeiten im Metriken-Dashboard anzeigen.

FastAPI Cloud Pro-Metriken-Dashboard mit Beispieldaten

Andere Monitoring-Dienste

Um Telemetriedaten an einen anderen Monitoring-Dienst zu senden, konfigurieren Sie einen Endpunkt, der OTLP akzeptiert, das OpenTelemetry-Protokoll zum Senden von Telemetriedaten. Verwenden Sie den HTTP/protobuf-Basisendpunkt des Dienstes.

Setzen Sie diese Umgebungsvariablen und ersetzen Sie die Beispiel-URL durch Ihren Endpunkt:

export FASTAPI_OTEL_AUTO_CONFIGURE=true
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com

FASTAPI_OTEL_AUTO_CONFIGURE=true aktiviert FastAPIs automatische Einrichtung der Exporter. OTEL_SERVICE_NAME identifiziert Ihre Anwendung im Monitoring-Dienst. Der Endpunkt ist die Basis-URL für den Empfang von Daten. Unter dieser URL werden Traces an /v1/traces, Metriken an /v1/metrics und Logs an /v1/logs gesendet.

Wenn Ihr Dienst Authentifizierung erfordert, setzen Sie OTEL_EXPORTER_OTLP_HEADERS auf die von ihm vorgegebenen Header, zum Beispiel api-key=YOUR_API_KEY.

Die Anwendung ausführen

Starten Sie die Anwendung im selben Terminal:

$ uv run fastapi run

Senden Sie in einem anderen Terminal einen Request:

$ curl http://127.0.0.1:8000/items/1
{"item_id":1}

Öffnen Sie Ihren Monitoring-Dienst und suchen Sie nach my-api. Nach dem nächsten Export sehen Sie einen Trace mit einem GET /items/{item_id}-Span sowie Metriken zur Anzahl der Requests, zur Responsedauer und zu aktiven Requests.

Telemetrie anpassen

Provider und Exporter konfigurieren

Ein Provider stellt die Objekte bereit, die Traces, Metriken oder Logs aufzeichnen. Seine Konfiguration steuert, wie diese Daten verarbeitet und exportiert werden.

Telemetriebibliotheken können die globalen Provider von OpenTelemetry konfigurieren. Konfigurieren Sie die Bibliothek, bevor die Anwendung startet, und FastAPI verwendet diese Provider automatisch.

Standardmäßig verwendet FastAPI konfigurierte Provider, ohne Exporter hinzuzufügen. Wenn die automatische Einrichtung aktiviert und ein OTLP-Endpunkt in der Umgebung gesetzt ist, fügt FastAPI jedem aktivierten Provider einen Exporter für dieses Ziel hinzu. Vorhandene Exporter senden weiterhin Daten an ihre Ziele.

Wenn eine andere Bibliothek bereits den Export an dasselbe Ziel konfiguriert, lassen Sie FASTAPI_OTEL_AUTO_CONFIGURE ungesetzt oder setzen Sie die Variable auf false, um doppelte Telemetriedaten zu vermeiden.

Sie können auch einen Provider direkt im Dictionary telemetry übergeben. Dieser Provider verwendet beispielsweise den Konsolenexporter von OpenTelemetry, um Request-Spans in Ihrem Terminal auszugeben:

from fastapi import FastAPI
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter

tracer_provider = TracerProvider()
tracer_provider.add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))

app = FastAPI(telemetry={"tracer_provider": tracer_provider})


@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

Der Exporter sendet die Spans an ihr Ziel. BatchSpanProcessor gruppiert Spans und sendet sie im Hintergrund. Ersetzen Sie den Konsolenexporter durch einen Exporter Ihrer Monitoring-Bibliothek, um deren Ziel zu verwenden. Weitere Konfigurationsoptionen finden Sie im Leitfaden zur Python-Instrumentierung von OpenTelemetry.

Verwenden Sie meter_provider oder logger_provider im selben Dictionary, um einen Provider für Metriken oder Logs bereitzustellen. Die Anwendung oder Bibliothek, die einen Provider erstellt, verwaltet dessen Shutdown. FastAPI verwaltet die Exportkomponenten, die es hinzufügt.

Achtung

OpenTelemetry verwendet standardmäßig globale Provider. Eine unabhängige Telemetriekonfiguration für gemountete Unteranwendungen ist nicht garantiert.

Request-Operationen nachverfolgen

Standardmäßig enthalten Request-Traces Spans für das Auflösen von Abhängigkeiten, das Ausführen Ihrer Pfadoperation-Funktion, das Serialisieren der Response und das Ausführen jedes Tasks in FastAPIs BackgroundTasks. Diese Spans verwenden denselben Provider und dieselben Exporter.

Die Spans der Hintergrundtasks bleiben Teil des Request-Traces. Sie werden ausgeführt, nachdem der HTTP-Response-Span beendet ist, und erhöhen daher nicht die gemessene Responsezeit.

Um nur den HTTP-Request-Span aufzuzeichnen, setzen Sie operation_spans auf False:

from fastapi import FastAPI

app = FastAPI(telemetry={"operation_spans": False})


@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

WebSocket-Verbindungen nachverfolgen

Jede WebSocket-Verbindung hat einen Span wie WS /ws/{room}, der den Handler und das Aufräumen der Abhängigkeiten umfasst. Er verwendet dieselben Provider und Einstellungen, einschließlich operation_spans für das Auflösen von Abhängigkeiten und das Ausführen des Endpunkts.

HTTP-Request-Metriken erfassen nur HTTP-Requests. Normale WebSocket-Verbindungsabbrüche mit den Codes 1000 oder 1001 erzeugen keine Fehlerlogs.

Fehler untersuchen

FastAPI zeichnet unbehandelte Exceptions als OpenTelemetry-Logs auf, die mit dem Trace des Requests oder der Verbindung verknüpft sind. Fehlerlogs werden auch dann aufgezeichnet, wenn der Trace nicht durch Sampling erfasst wird.

Exception-Logs enthalten den Typ, die Nachricht und den Stacktrace der Exception. Nachrichten und Stacktraces können sensible Informationen enthalten. Verwenden Sie die Logprozessoren Ihres Providers, um diese zu filtern oder zu schwärzen, oder setzen Sie logs auf False, um diese Logs zu deaktivieren.

FastAPI zeichnet außerdem fehlgeschlagene Request-Validierungen als Warnungslogs mit der Route und der Fehleranzahl auf. Diese Logs enthalten nicht die ungültigen Eingabedaten.

Die aufzuzeichnenden Daten auswählen

Das Dictionary telemetry akzeptiert außerdem diese Einstellungen:

Einstellung Zweck Defaultwert
tracing Spans für HTTP-Requests und WebSocket-Verbindungen aufzeichnen True
metrics HTTP-Request-Metriken aufzeichnen True
logs Fehlgeschlagene Validierungen und unbehandelte Exceptions aufzeichnen True
operation_spans Spans für Request-Operationen hinzufügen True
exclude Requests überspringen, wenn eine Funktion, die den ASGI-Scope empfängt, True zurückgibt None
auto_configure Exporter für Endpunkte hinzufügen, die in Umgebungsvariablen gesetzt sind True, wenn FASTAPI_OTEL_AUTO_CONFIGURE=true, andernfalls False

Um beispielsweise Metriken zu erfassen und dabei Healthchecks auszuschließen:

from fastapi import FastAPI

app = FastAPI(
    telemetry={
        "tracing": False,
        "exclude": lambda scope: scope["path"] == "/health",
    }
)

Ein expliziter Wert für auto_configure im Dictionary telemetry überschreibt FASTAPI_OTEL_AUTO_CONFIGURE. Verwenden Sie telemetry={"auto_configure": True}, um die automatische Einrichtung im Code zu aktivieren, oder telemetry={"auto_configure": False}, um sie für eine Anwendung zu deaktivieren, selbst wenn die Umgebungsvariable sie aktiviert.