logbrew-flask 0.1.6 oder neuer. Das Paket erfasst
Anfrage-Spans und unbehandelte Ausnahmen. Der optionale Logging-Handler
verbindet Python-Logs mit dem Trace der Anfrage. Metriken zur Anfragedauer
sind ebenfalls optional.
Das Paket erfordert Python 3.10 oder neuer und Flask 3.1 oder neuer.
Verwenden Sie in der Anwendung einen Server-Ingest-Schlüssel, der auf das
Projekt beschränkt ist. Verwenden Sie nicht die Konto-Zugangsdaten, mit
denen die CLI arbeitet.
<project_id>, <trace_id> und <issue_id> durch IDs aus
LogBrew. Verwenden Sie für die Testanfragen ein Entwicklungsprojekt. Die
Shell-Beispiele verwenden Bash.
Erste Anfrage senden
1
Projektschlüssel erstellen oder auswählen
Melden Sie sich mit der CLI an. Verwenden Sie dann ein
neues oder ein bestehendes Projekt. Führen Sie nicht beide Beispiele aus.
Speichern Sie für ein neues Projekt den Ingest-Schlüssel in einer neuen
Datei, die nur der Eigentümer lesen kann:Für ein bestehendes Projekt lesen Sie die ID aus
Die CLI speichert den Ingest-Schlüssel mit Rechten nur für den
Eigentümer. Sie gibt weder den Schlüssel noch den Dateipfad aus.
Verwenden Sie in der Produktionsumgebung statt dieser lokalen Datei den
Secret Manager Ihrer Bereitstellungsplattform.Ist das Ergebnis einer Erstellungsanfrage unklar, führen Sie genau
denselben Befehl erneut aus.
logbrew projects --json. Erstellen Sie dann einen eigenen
Server-Schlüssel:2
Veröffentlichte Integration installieren
Erstellen oder aktivieren Sie die virtuelle Umgebung der Anwendung, und
installieren Sie dann das Framework-Paket. Es installiert die passende
Abhängigkeit zum Core-SDK.
3
Bereitstellungsidentität konfigurieren
Laden Sie den Projektschlüssel lokal, ohne ihn auszugeben. Legen Sie
stabile Werte für Dienst, Umgebung und Release fest, damit jedes Signal
nützlichen Bereitstellungskontext hat.
init_logbrew() prüft zuerst explizite Argumente, dann die
Konfiguration der Flask-Anwendung und dann diese Umgebungsvariablen. Ist
kein Dienstname konfiguriert, verwendet es den Importnamen von Flask.4
Flask einmal initialisieren
Speichern Sie das Beispiel für eine neue App als Wiederholte Aufrufe von
app.py. Fügen Sie den
Initialisierer ein, nachdem Sie die Flask-Anwendung erstellt haben. Der
Logging-Handler ist optional. Mit ihm teilen Anwendungs-Logs den aktiven
Trace und Span der Anfrage.init_logbrew(app) liefern dieselbe
Flask-Erweiterung. Sie installieren keine doppelten Hooks für Anfragen
oder Ausnahmen. Der Initialisierer fügt keine Logging-Handler hinzu.
Fügen Sie den Handler einmal zum Logger der App hinzu.5
Eine Anfrage ausführen
Starten Sie die App, und rufen Sie die Route aus einem anderen Terminal
auf. Ersetzen Sie Die Übermittlung läuft in einem Hintergrund-Worker und hält die Antwort
nicht offen.
app im Befehl, wenn Ihre Anwendung einen anderen
Modulnamen verwendet.6
Gespeicherte Belege prüfen
Lesen Sie genau den Bereich aus Projekt und Bereitstellung. Suchen Sie den
Trace der Health-Anfrage und das zugehörige Log aus dem Logging-Handler
des Beispiels.Kopieren Sie die gelieferte Trace-ID in den begrenzten
Untersuchungsbefehl:Ein passender Lesezugriff bestätigt, dass LogBrew das Signal gespeichert
hat. Eine lokale
200-Antwort beweist nur, dass Flask die Anfrage
verarbeitet hat.Benötigte Signale wählen
Der Initialisierer startet mit aktivierten Anfrage-Traces und unbehandelten Ausnahmen. Anfrage-Metriken und die Weiterleitung von Python-Logs wählen Sie separat.
Beginnen Sie mit den Standardwerten. Ergänzen Sie Anfrage-Metriken, wenn Sie
eine Latenzansicht brauchen. Hängen Sie den Logging-Handler nur an die Logger,
die einer Untersuchung helfen.
Standardmäßig besitzt der Initialisierer einen eigenen HTTP-Transport. Er
stellt jedes Ereignis in eine Queue, und ein Hintergrund-Worker beginnt mit der
Übermittlung, sobald ein Ereignis in der Queue liegt. Die Übermittlung hält die
Antwort nicht offen. Transportfehler unterbrechen die Flask-Antwort nicht.
flush_on_response=True sendet Ereignisse aus der Queue stattdessen im
Antwortpfad. Mit dieser Option löst raise_flush_errors=True
Übermittlungsfehler aus. Verwenden Sie beide nur für eine kontrollierte
Diagnose.
Log-Inhalte steuern
Fügen Sie einenLogBrewLoggingHandler zu dem Logger hinzu, der die
benötigten Nachrichten schreibt. Der Handler ersetzt nicht die Konsolen- oder
Datei-Handler der App. Er verändert weder Flask noch das Logging-Modul von
Python. Fügen Sie denselben Handler zweimal hinzu, entstehen doppelte Logs.
Nutzt die App auch den Root-Logger, prüfen Sie die Weitergabe, bevor Sie einen
zweiten Handler anhängen.
Ein Log innerhalb einer Anfrage übernimmt den aktiven Trace und Span. Ein Log
außerhalb einer Anfrage hat keinen Anfrage-Trace.
Der Handler sendet die formatierte Nachricht, den Logger-Namen und den
LogBrew-Level. Er sendet außerdem Dateiname, Modul, Funktion, Zeile sowie die
Namen von Thread und Prozess, aber nicht den vollständigen Quellpfad.
Einfache Werte aus extra={...} werden zu Metadaten. Prüfen Sie diese Werte,
bevor Sie aus einer Anfrage loggen, die Nutzer auslösen.
Python-Einträge mit DEBUG werden in LogBrew zu info. WARNING wird zu
warning, und CRITICAL wird zu critical. Name und Nummer des
ursprünglichen Python-Levels bleiben in den Metadaten erhalten. Um weniger
Einträge zu senden, geben Sie dem Handler einen eigenen Level, zum Beispiel
LogBrewLoggingHandler(logbrew.client, level=logging.WARNING).
Die Konsole und LogBrew können denselben Eintrag erhalten. Konfigurieren Sie
zum Beispiel die Konsole, bevor Sie die Flask-App erstellen:
exc_info enthält den Typ und die Meldung der Ausnahme.
Den vollständigen Ausnahmetext sendet der Handler nur mit
include_exception_text=True. Das ist unabhängig von der automatischen
Erfassung von Ausnahmen, die die Ausnahmemeldung nie sendet. Schreiben Sie
keine Zugangsdaten, personenbezogenen Daten oder Anfrage-Bodys in Log- oder
Ausnahmemeldungen.
Was die Integration erfasst
Span-Namen verwenden die HTTP-Methode und das passende Routen-Template. Zum
Beispiel teilen sich
/orders/100 und /orders/200 den Namen
GET /orders/<int:order_id>. Eine Anfrage ohne passende Route verwendet die
feste Bezeichnung <unmatched>. Ein fehlender oder ungültiger traceparent
startet einen neuen Trace.
Die Span-Metadaten enthalten Methode, Routen-Template, Endpunkt, Statuscode und
Dauer. Sie enthalten weder den konkreten Pfad noch einen Query-String.
Ab Version 0.1.6 deckt der Anfrage-Span den gesamten Flask-Dispatch ab.
Before-Request-Hooks, Fehler-Handler und Teardown teilen den Trace der
Anfrage. Bei einer gestreamten Antwort endet der Span, wenn der Body fertig
oder geschlossen ist.
Erfassung von Ausnahmen testen
Ein Status4xx oder 5xx erscheint am Anfrage-Span. Der Status allein
beweist nicht, dass eine Ausnahme aufgetreten ist. Lesen Sie Traces und Issues,
bevor Sie einen Fehler diagnostizieren. LogBrew ersetzt keine Fehler-Handler
von Flask und ändert den Antwortstatus nicht.
Fügen Sie in einem Entwicklungsprojekt eine temporäre Route hinzu. Rufen Sie
sie einmal auf. Entfernen Sie sie vor der Bereitstellung:
500. Suchen Sie das neue Issue und die
Anfrage-Metrik:
local capture check nicht enthalten.
Ausgehende Arbeit mit der Anfrage verbinden
Das Python-SDK hat Hilfsfunktionen fürrequests, urllib, httpx,
aiohttp sowie Datenbank-, Cache- und Queue-Arbeit, die Ihre App selbst
aufruft. Jede Hilfsfunktion erstellt einen Child-Span des aktiven
Anfrage-Trace. Das SDK verändert diese Bibliotheken nicht global. Das
Paket logbrew-flask zeigt
Beispiele.
Geben Sie jeder Hilfsfunktion einen stabilen Operationsnamen und ein Routen-
oder Statement-Template. Schreiben Sie keine Datensatz-IDs, Kundenwerte,
SQL-Bind-Werte oder Nachrichteninhalte in diese Namen. Ergänzen Sie
Child-Spans nur dort, wo die Abhängigkeit für die Anfrage wichtig ist. Ein
Span für jeden kleinen Aufruf macht den Trace schwerer lesbar. Hilfsfunktionen
für ausgehende HTTP-Aufrufe fügen einen W3C-traceparent-Header hinzu. Sie
erfassen keine vollständigen URLs, Query-Strings, Bodys, Cookies oder
beliebigen Header. Hilfsfunktionen für Datenbank, Cache und Queue erfassen
keine Bind-Werte, Ergebnisse, Cache-Werte oder Queue-Inhalte.
Datenschutz und Prozesslebenszyklus
Die automatische Flask-Erfassung lässt konkrete Anfragepfade, Query-Strings, Anfrage- und Antwort-Bodys, Cookies, beliebige Header, rohetraceparent-Werte, Baggage und Tracestate weg.
Die automatische Erfassung von Ausnahmen liest oder sendet nie str(error).
Sie verwendet die feste Zusammenfassung Unhandled exception und markiert
jede Meldung der Ausnahmekette als geschwärzt. Frames enthalten den
Dateinamen ohne Pfad und eine begrenzte Code-Identität. Sie enthalten keinen
rohen Traceback-Text, keinen Quellcode, keine lokalen Variablen und keine
absoluten Pfade.
Erstellen Sie die App und den LogBrew-Client in jedem Worker-Prozess.
Das Standardverhalten von Gunicorn, die App pro Worker zu laden, funktioniert.
Verwenden Sie Gunicorn --preload nicht mit einem Client, der im
Elternprozess erstellt wurde. Laden Sie die App in uWSGI pro Worker, zum
Beispiel mit --lazy-apps. Der Python-Client lehnt die Wiederverwendung nach
einem Prozess-Fork ab.
Rufen Sie logbrew.client.shutdown() im Shutdown-Hook des Prozessmanagers
für jeden Worker auf. Der Aufruf sendet die verbleibenden Ereignisse aus der
Queue und schließt den Client. Rufen Sie ihn nicht nach jeder Anfrage auf.
Nach dem Shutdown lehnt der Client neue Ereignisse dieses Workers ab.
Eine Antwort kann fertig sein, bevor der Worker seine letzten Ereignisse aus
der Queue sendet. Bei einer Bereitstellung oder beim Herunterskalieren gibt ein
geordneter Shutdown diesen Ereignissen einen letzten Übermittlungsversuch.
Einrichtungsprobleme beheben
Zu Fehlern bei Kontozugriff, Schlüsseln und dem Zurücklesen siehe
Fehlerbehebung. Für andere Laufzeitumgebungen
siehe SDK-Integration.
