Integration · Python

Python-Monitoring und APM

Starten Sie Ihre Anwendung mit opentelemetry-instrument, und Obseria zeigt Traces, Fehler und Runtime-Metriken für Django-, Flask-, FastAPI- und Celery-Services, korreliert mit Logs und Infrastruktur.
Obseria Apps und Funktionen: Observability, APM, Infrastruktur und Integrationen
Obseria Home-Dashboard mit Service-Zustand, offenen Problemen, SLO-Erfüllung und Ingestion
Obseria Trace-Explorer mit Span-Liste und Span-Attributen
Überblick

Warum Python mit Obseria überwachen

Start ohne Code

opentelemetry-bootstrap erkennt installierte Bibliotheken und installiert passende Instrumentierungen; opentelemetry-instrument aktiviert sie beim Start.

Web-Apps und Worker in einem Trace

Requests, Celery-Tasks und ausgehende Aufrufe werden verknüpft; Hintergrundverarbeitung ist kein blinder Fleck mehr.

Fehler mit Kontext

Exceptions werden mit Stacktrace, Request-Attributen und dem verursachenden Release am Span erfasst.

Abdeckung

Python-Frameworks und Bibliotheken, die Obseria überwacht

  • Django. Views, Middleware und ORM-Queries werden mit Routen-Template und Statuscode getract.
  • Flask und FastAPI. WSGI- und ASGI-Anwendungen erhalten Server-Spans je Endpoint, auch für async Handler.
  • Celery. Spans für Veröffentlichung und Ausführung von Tasks verbinden Producer, Broker und Worker.
  • requests, httpx, urllib3 und aiohttp. Ausgehende HTTP-Aufrufe propagieren den W3C-Trace-Kontext.
  • psycopg, SQLAlchemy, PyMySQL und redis-py. Datenbank- und Cache-Operationen erscheinen als Client-Spans mit Dauer.
  • boto3 und botocore. AWS-SDK-Aufrufe werden inklusive Service- und Operationsnamen getract.
Auf einen Blick

Die Python-Kennzahlen, auf die es ankommt

Obseria erfasst diese Werte automatisch und zeigt sie in fertigen Dashboards und Alerts.

Tempo und Nachfrage

Zeigt, wie schnell Ihre Python-Dienste antworten und wie viele Anfragen sie gleichzeitig bearbeiten.

  • http.server.request.duration
  • http.server.active_requests

Tempo externer Dienste

Zeigt, wie lange Ihre Anwendung auf andere Dienste und Partner wartet, und deckt langsame externe Abhängigkeiten auf.

  • http.client.request.duration

Verbrauch an Ressourcen

Macht sichtbar, wie viel Rechenleistung und Speicher Ihre Anwendung benötigt, als Grundlage für passende Server und Kostenkontrolle.

  • process.runtime.cpython.cpu.utilization
  • process.runtime.cpython.memory

Interne Arbeitslast

Zeigt, wie oft die Anwendung Speicher aufräumt und parallele Aufgaben wechselt, beides versteckte Ursachen für Verzögerungen.

  • process.runtime.cpython.gc_count
  • process.runtime.cpython.thread_count
  • process.runtime.cpython.context_switches
Alle 8 Metriken im Detail anzeigen
MetrikEinheitAussage
http.server.request.durationsLatenz eingehender Requests je Route und Statuscode.
http.server.active_requests{request}Laufende Requests; Wachstum bei gleichem Durchsatz heißt: Requests hängen.
http.client.request.durationsLatenz ausgehender HTTP-Aufrufe zu nachgelagerten Services.
process.runtime.cpython.cpu.utilization1CPU-Nutzung des Python-Prozesses, wegen des GIL oft auf einen Kern begrenzt.
process.runtime.cpython.memoryByResidenter und virtueller Speicher des Interpreter-Prozesses.
process.runtime.cpython.gc_count{count}Garbage Collections je Generation.
process.runtime.cpython.thread_count{thread}Aktive Threads im Prozess.
process.runtime.cpython.context_switches{switch}Freiwillige und unfreiwillige Kontextwechsel, ein Hinweis auf Contention.
Einrichtung

Python-Monitoring in wenigen Minuten einrichten

  1. Schritt 1

    Distro installieren

    Installieren Sie opentelemetry-distro und den OTLP-Exporter per pip und führen Sie opentelemetry-bootstrap für Ihre Bibliotheken aus.

  2. Schritt 2

    Per Umgebung konfigurieren

    Setzen Sie OTEL_SERVICE_NAME, den OTLP-Endpoint von Obseria und Ihr Token.

  3. Schritt 3

    Startbefehl umschließen

    Stellen Sie Ihrem gewohnten Befehl opentelemetry-instrument voran, etwa für Gunicorn oder Uvicorn.

Beispielkonfiguration · BASH
pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install

export OTEL_SERVICE_NAME="billing-api"
export OTEL_RESOURCE_ATTRIBUTES="deployment.environment.name=production"
export OTEL_TRACES_EXPORTER="otlp"
export OTEL_METRICS_EXPORTER="otlp"
export OTEL_LOGS_EXPORTER="otlp"
export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED="true"
export OTEL_EXPORTER_OTLP_ENDPOINT="${OBSERIA_OTLP_ENDPOINT}"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20${OBSERIA_TOKEN}"

opentelemetry-instrument uvicorn app.main:app --host 0.0.0.0 --port 8000

Sofort einsatzbereit

Dashboards, Alerts und SLOs, die bereitstehen, sobald die ersten Daten ankommen.

  • Python-Service-Health mit RED-Metriken
  • Celery-Tasks: Durchsatz, Fehler, Dauer
  • Alert auf p95-Latenz je Endpoint
  • Alert bei neuen Exception-Typen nach Deploy
  • Langsamste Datenbank-Queries je Service
Leitfaden

Python-Monitoring: Darauf kommt es an

Warum Python-Monitoring wichtig ist

Python betreibt Web-APIs mit Django, Flask und FastAPI, Datenpipelines, Machine-Learning-Services und unzählige Hintergrund-Worker auf Basis von Celery. Diese Workloads verhalten sich sehr unterschiedlich: Eine synchrone Django-Anwendung skaliert über Worker-Prozesse, ein FastAPI-Service hängt an einer asynchronen Event Loop, und ein Celery-Worker ist auf einen gesunden Broker angewiesen. Python-Monitoring muss alle drei abdecken und miteinander verbinden, denn eine langsame API-Antwort hat ihre Ursache oft in einer Queue oder einem Datenbankaufruf weiter unten.

OpenTelemetry bietet Zero-Code-Instrumentierung für Python. Der Befehl opentelemetry-bootstrap prüft die installierten Pakete und ergänzt passende Instrumentierungsbibliotheken, opentelemetry-instrument aktiviert sie beim Start des Interpreters. So wird Python APM möglich, ohne den Anwendungscode anzufassen.

Signale für das Python Performance Monitoring

  • Latenz und Fehler: http.server.request.duration je Route sowie an Spans erfasste Exceptions liefern die RED-Sicht je Service.
  • Parallelität: http.server.active_requests zeigt laufende Requests. Steigt der Wert bei gleichbleibendem Durchsatz, sind Worker blockiert.
  • CPU und GIL: process.runtime.cpython.cpu.utilization nahe einem Kern pro Prozess bedeutet CPU-gebundenen Code, den zusätzliche Threads nicht beschleunigen.
  • Speicher und GC: process.runtime.cpython.memory und process.runtime.cpython.gc_count machen Leaks und allokationsintensive Codepfade sichtbar.
  • Abhängigkeiten: Client-Spans für Datenbanken, Caches und HTTP-APIs zeigen, wohin die Request-Zeit tatsächlich fließt.

Typische Performance-Probleme in Python

Blockierende Aufrufe in async Code

Ein synchroner Datenbanktreiber oder time.sleep in einem async def-Handler blockiert die Event Loop eines FastAPI- oder aiohttp-Service. Alle Requests dieses Workers werden gleichzeitig langsamer. Traces zeigen lange Lücken ohne Child-Spans, Profile die blockierende Funktion.

Erschöpfte Worker

Gunicorn und uWSGI arbeiten mit einer festen Anzahl von Workern. Belegen langsame Upstream-Aufrufe diese Worker, warten neue Requests im Backlog. Steigende aktive Requests und Timeouts am Load Balancer sind die typischen Anzeichen.

N+1-Queries im ORM

Django ORM und SQLAlchemy machen es leicht, pro Zeile eine eigene Query abzusetzen. Trace-Wasserfälle mit Dutzenden identischer SQL-Spans machen das Problem offensichtlich; die Lösung ist meist select_related oder Eager Loading.

Speicherwachstum in langlebigen Workern

Celery-Worker und Datenjobs, die Referenzen auf große Objekte halten, wachsen, bis das Betriebssystem sie beendet. Speicher pro Prozess im Zeitverlauf zusammen mit der Task-Dauer zeigt, welcher Task verantwortlich ist.

Stille Task-Fehler

Hintergrund-Tasks, die scheitern und unbemerkt wiederholt werden, verbergen Probleme so lange, bis Daten fehlen. Getracte Task-Ausführungen mit Fehlerstatus machen Fehler und Retries neben dem auslösenden Request sichtbar.

Langsame Kaltstarts nach dem Deployment

Python importiert Module teils verzögert, und Frameworks füllen Caches erst bei der ersten Nutzung. Die ersten Requests je Worker nach einem Rollout können daher deutlich langsamer sein. Ein Vergleich der Latenz je service.version trennt Aufwärmeffekte von echten Regressionen.

Teure Serialisierung

Große Antworten mit verschachtelten Objekten verbringen viel Zeit in der JSON-Serialisierung oder in Pydantic-Validierung. Im Trace erscheint das als Zeit im Server-Span ohne passende Child-Spans; ein CPU-Profil zeigt die betroffenen Funktionen und macht gezielte Optimierung möglich.

Best Practices für Python APM

  1. Führen Sie opentelemetry-bootstrap im Build aus, damit die Instrumentierungen zu Ihren Abhängigkeiten passen.
  2. Initialisieren Sie OpenTelemetry bei Pre-Fork-Servern wie Gunicorn in jedem Worker, wie in der Dokumentation von OpenTelemetry Python beschrieben.
  3. Aktivieren Sie die Logging-Instrumentierung, um Log-Einträge um Trace-IDs zu ergänzen.
  4. Ergänzen Sie eigene Spans für teure Geschäftsschritte, etwa Modell-Inferenz oder Berichtserstellung.
  5. Nutzen Sie Tail-based Sampling, um alle fehlerhaften und langsamen Traces zu behalten.

So unterstützt Obseria das Python-Monitoring

Obseria verarbeitet OpenTelemetry-Traces, -Metriken und -Logs aus Python per OTLP. Ihre Instrumentierung bleibt offen, und Daten lassen sich jederzeit exportieren. Der Obseria Agent ergänzt Host- und Container-Kontext und läuft auf Kubernetes als DaemonSet. TopoGraph zeigt, wie APIs, Celery-Worker, Broker und Datenbanken voneinander abhängen. Continuous Profiling mit unter 1 % Overhead findet heiße Funktionen. Steigen die Fehler nach einem Release, korreliert Obseria Intelligence Deployment, ausfallende Abhängigkeit und betroffene Endpoints und erklärt die Ursache mit einer Beweiskette. Dashboards, Alerts und SLOs sind inklusive.

Häufige Fragen zum Python-Monitoring

Nein. opentelemetry-instrument aktiviert beim Start die Instrumentierung unterstützter Bibliotheken. Eigene Spans über die OpenTelemetry API sind optional.

Für Django, Flask, FastAPI, Starlette, Celery und viele Clients wie requests, httpx, psycopg, SQLAlchemy, redis-py und boto3 gibt es offizielle OpenTelemetry-Instrumentierungen.

Ja. Stellen Sie dem Startbefehl opentelemetry-instrument voran. Für Gunicorn mit vorgeforkten Workern folgen Sie dem Post-Fork-Muster aus der Dokumentation von OpenTelemetry Python.

Ja. Die Celery-Instrumentierung erzeugt Spans für Veröffentlichung und Ausführung von Tasks und propagiert den Kontext über den Broker. Der Task erscheint im Trace des auslösenden Requests.

Ja. Mit aktivierter Logging-Instrumentierung enthalten Log-Einträge Trace- und Span-IDs, und Obseria verknüpft jede Logzeile mit ihrem Trace.

Starten Sie heute mit dem Python-Monitoring

Binden Sie Python in Minuten per OpenTelemetry oder Obseria Agent an. 14 Tage kostenlos.