logbrew-flask 0.1.6 ou une version plus récente. Il capture les
spans de requête et les exceptions non gérées. Le handler de logging,
facultatif, relie les logs Python à la trace de la requête. Les métriques de
durée des requêtes sont aussi facultatives.
Le paquet exige Python 3.10 ou plus récent et Flask 3.1 ou plus récent.
Dans l’application, utilisez une clé d’ingestion serveur limitée au projet.
N’utilisez pas l’identifiant de compte qui autorise la CLI.
<project_id>, <trace_id> et <issue_id> par des ID issus de
LogBrew. Utilisez un projet de développement pour les requêtes de test. Les
exemples shell utilisent Bash.
Envoyer la première requête
1
Créer ou sélectionner une clé de projet
Connectez-vous avec la CLI. Utilisez ensuite un nouveau
projet ou un projet existant. N’exécutez pas les deux exemples. Pour un
nouveau projet, stockez sa clé d’ingestion dans un nouveau fichier que
seul son propriétaire peut lire :Pour un projet existant, récupérez son ID avec La CLI stocke la clé d’ingestion avec des permissions réservées au
propriétaire. Elle n’affiche ni la clé ni le chemin de son fichier. En
production, utilisez le gestionnaire de secrets de votre plateforme de
déploiement plutôt que ce fichier local.Si le résultat d’une requête de création est incertain, exécutez de
nouveau exactement la même commande.
logbrew projects --json.
Créez ensuite une clé serveur distincte :2
Installer l’intégration publiée
Créez ou activez l’environnement virtuel de l’application, puis installez
le paquet du framework. Il installe la dépendance compatible du SDK de
base.
3
Configurer l’identité de déploiement
Chargez la clé du projet en local sans l’afficher. Définissez un service,
un environnement et une version stables pour que chaque signal ait un
contexte de déploiement utile.
init_logbrew() lit d’abord les arguments explicites, puis la
configuration de l’application Flask, puis ces variables
d’environnement. Si aucun nom de service n’est configuré, il utilise le
nom d’import Flask.4
Initialiser Flask une seule fois
Pour une nouvelle application, enregistrez l’exemple sous Des appels répétés à
app.py. Ajoutez
la fonction d’initialisation après avoir créé l’application Flask. Le
handler de logging est facultatif. Il permet aux logs de l’application de
partager la trace et le span de la requête active.init_logbrew(app) renvoient la même extension
Flask. Ils n’installent pas de hooks de requête ou d’exception en double.
La fonction d’initialisation n’ajoute pas de handlers de logging. Ajoutez
le handler une seule fois au logger de l’application.5
Exécuter une requête
Démarrez l’application et appelez la route depuis un autre terminal.
Remplacez L’envoi s’exécute dans un worker en arrière-plan et ne bloque pas la
réponse.
app dans la commande si votre application utilise un autre nom
de module.6
Vérifier les preuves stockées
Lisez exactement le périmètre du projet et du déploiement. Cherchez la
trace de la requête de health check et le log corrélé émis par le handler de
logging de l’exemple.Copiez l’ID de trace renvoyé dans la commande d’investigation limitée :Une lecture qui correspond confirme que LogBrew a stocké le signal. Une
réponse locale
200 prouve seulement que Flask a traité la requête.Choisir les signaux nécessaires
La fonction d’initialisation démarre avec les traces de requête et les exceptions non gérées activées. Les métriques de requête et le transfert des logs Python sont des choix distincts.
Commencez avec les valeurs par défaut. Ajoutez les métriques de requête quand
vous avez besoin d’une vue de la latence. Ajoutez le handler de logging
uniquement aux loggers utiles à une investigation.
Par défaut, la fonction d’initialisation possède son propre transport HTTP.
Elle met chaque signal en file d’attente, et un worker en arrière-plan
commence l’envoi dès qu’un signal est dans la file. L’envoi ne bloque pas
la réponse. Les échecs de transport ne cassent pas la réponse Flask.
flush_on_response=True envoie plutôt les signaux en attente sur le chemin
de la réponse. Avec cette option, raise_flush_errors=True lève les erreurs
d’envoi. Utilisez ces 2 options uniquement pour un diagnostic contrôlé.
Contrôler le contenu des logs
Ajoutez un seulLogBrewLoggingHandler au logger qui émet les messages dont
vous avez besoin. Le handler ne remplace pas les handlers de console ou de
fichier de l’application. Il ne modifie ni Flask ni le module de logging de
Python. Ajouter 2 fois le même handler duplique les logs. Si l’application
utilise aussi le logger racine, vérifiez la propagation avant d’attacher un
second handler.
Un log émis dans une requête hérite de la trace et du span actifs. Un log émis
hors d’une requête n’a pas de trace de requête.
Le handler envoie le message formaté, le nom du logger et le niveau LogBrew. Il
envoie aussi le nom du fichier source, le module, la fonction, la ligne, ainsi
que les noms du thread et du processus, mais pas le chemin complet du fichier
source. Les valeurs primitives de extra={...} deviennent des métadonnées.
Relisez ces valeurs avant de logger depuis une requête exposée aux
utilisateurs.
Les enregistrements Python DEBUG deviennent info dans LogBrew. WARNING
devient warning, et CRITICAL devient critical. Le nom et le numéro du
niveau Python d’origine restent dans les métadonnées. Pour envoyer moins
d’enregistrements, donnez au handler son propre niveau, par exemple
LogBrewLoggingHandler(logbrew.client, level=logging.WARNING).
La console et LogBrew peuvent recevoir le même enregistrement. Par exemple,
configurez la console avant de créer l’application Flask :
exc_info inclut le type et le message de
l’exception. Le texte complet de l’exception est envoyé uniquement si le
handler a include_exception_text=True. Cette option est distincte de la capture
automatique des exceptions, qui n’envoie jamais le message de l’exception.
Ne mettez pas d’identifiants, de données personnelles ni de corps de requête
dans les messages de log ou d’exception.
Ce que capture l’intégration
Les noms de span utilisent la méthode HTTP et le modèle de route reconnu. Par
exemple,
/orders/100 et /orders/200 partagent GET /orders/<int:order_id>.
Une requête sans route reconnue utilise l’étiquette fixe <unmatched>. Un
traceparent manquant ou non valide démarre une nouvelle trace.
Les métadonnées du span contiennent la méthode, le modèle de route, le point
de terminaison Flask, le code de statut et la durée. Elles ne contiennent ni le chemin
concret ni la chaîne de requête.
À partir de la version 0.1.6, le span de requête couvre tout le traitement
Flask. Les hooks avant requête, les gestionnaires d’erreurs et le teardown
partagent la trace de la requête. Une réponse en streaming termine son span
quand le corps se termine ou se ferme.
Tester la capture des exceptions
Un statut4xx ou 5xx apparaît sur le span de requête. Le statut seul ne
prouve pas qu’une exception s’est produite. Lisez à la fois les traces et les
problèmes avant de diagnostiquer un échec. LogBrew ne remplace pas les
gestionnaires d’erreurs de Flask et ne modifie pas le statut de la réponse.
Dans un projet de développement, ajoutez une route temporaire. Appelez-la une
fois. Retirez-la avant de déployer :
500. Trouvez le nouveau problème et la métrique
de requête :
local capture check.
Relier le travail sortant à la requête
Le SDK Python fournit des helpers, appelés par l’application, pourrequests,
urllib, httpx, aiohttp, les bases de données, le cache et les files de
messages. Chaque helper crée un span enfant de la trace de la requête active.
Le SDK ne modifie pas ces bibliothèques globalement. Le
paquet logbrew-flask contient des
exemples.
Donnez à chaque helper un nom d’opération stable et un modèle de route ou de
requête SQL. Ne mettez pas d’ID d’enregistrement, de valeurs client, de
valeurs de paramètres SQL ni de contenu de message dans ces noms. Ajoutez des
spans enfants uniquement là où la dépendance compte pour la requête. Un span
pour chaque petit appel rend la trace plus difficile à lire. Les helpers HTTP
sortants ajoutent un seul en-tête W3C traceparent. Ils ne capturent ni les
URL complètes, ni les chaînes de requête, ni les corps, ni les cookies, ni des
en-têtes arbitraires. Les helpers de base de données, de cache et de file de
messages ne capturent ni les valeurs de paramètres, ni les résultats, ni les
valeurs du cache, ni le contenu des messages.
Confidentialité et cycle de vie des processus
La capture automatique de Flask omet les chemins de requête concrets, les chaînes de requête, les corps de requête et de réponse, les cookies, les en-têtes arbitraires, les valeurs brutes detraceparent, le baggage et le
tracestate.
La capture automatique des exceptions ne lit et n’envoie jamais
str(error). Elle utilise le résumé fixe Unhandled exception et marque
chaque message de la chaîne d’exceptions comme masqué. Les frames contiennent
le nom de base du fichier et une identité de code limitée. Ils ne contiennent
ni le texte brut du traceback, ni le code source, ni les variables locales, ni
des chemins absolus.
Créez l’application et le client LogBrew dans chaque processus worker. Le
chargement de l’application par worker, comportement par défaut de Gunicorn,
fonctionne. N’utilisez pas l’option Gunicorn --preload avec un client créé
dans le processus parent. Avec uWSGI, chargez l’application dans chaque
worker, par exemple avec --lazy-apps. Le client Python refuse d’être
réutilisé après un fork du processus.
Appelez logbrew.client.shutdown() depuis le hook d’arrêt par worker de votre
gestionnaire de processus. Cet appel envoie les signaux restants en attente
et ferme le client. Ne l’appelez pas après chaque requête. Après l’arrêt, le
client refuse les nouveaux signaux de ce worker.
Une réponse peut se terminer avant que le worker envoie ses derniers signaux
en attente. Pendant un déploiement ou une réduction du nombre d’instances, un
arrêt propre donne à ces signaux une dernière tentative d’envoi.
Corriger les erreurs de configuration
Pour les erreurs d’accès au compte, de clé et de relecture, consultez
Dépannage. Pour les autres environnements
d’exécution, consultez Intégration du SDK.
