logbrew-flask 0.1.6 o versioni successive. Il pacchetto acquisisce gli
span delle richieste e le eccezioni non gestite. L’handler di logging facoltativo collega
i log Python alla traccia della richiesta. Anche le metriche sulla durata
delle richieste sono facoltative.
Il pacchetto richiede Python 3.10 o versioni successive e Flask 3.1 o versioni
successive.
Nell’applicazione usa una chiave di ingestione server limitata al progetto.
Non usare la credenziale dell’account che autorizza la CLI.
<project_id>, <trace_id> e <issue_id> con gli ID presi da
LogBrew. Usa un progetto di sviluppo per le richieste di test. Gli esempi di
shell usano Bash.
Invia la prima richiesta
1
Crea o seleziona una chiave del progetto
Accedi con la CLI. Poi usa un progetto nuovo o un
progetto esistente. Non eseguire entrambi gli esempi. Per un nuovo
progetto, salva la sua chiave di ingestione in un nuovo file leggibile
solo dal proprietario:Per un progetto esistente, ricava il suo ID da La CLI salva la chiave di ingestione con permessi riservati al
proprietario. Non stampa la chiave né il percorso del file. In
produzione, al posto di questo file locale usa il gestore dei segreti
della tua piattaforma di deploy.Se l’esito di una richiesta di creazione è incerto, esegui di nuovo
esattamente lo stesso comando.
logbrew projects --json.
Poi crea una chiave server separata:2
Installa l'integrazione pubblicata
Crea o attiva l’ambiente virtuale dell’applicazione, poi installa il
pacchetto del framework. Il pacchetto installa la dipendenza compatibile
dell’SDK principale.
3
Configura l'identità del deploy
Carica la chiave del progetto in locale senza stamparla. Imposta servizio,
ambiente e release stabili, così ogni segnale ha un contesto di deploy
utile.
init_logbrew() controlla prima gli argomenti espliciti, poi la
configurazione dell’applicazione Flask, poi queste variabili d’ambiente.
Se non è configurato un nome di servizio, usa il nome di importazione di
Flask.4
Inizializza Flask una sola volta
Per una nuova app, salva l’esempio come Le chiamate ripetute a
app.py. Aggiungi la funzione di
inizializzazione dopo aver creato l’applicazione Flask. L’handler di
logging è facoltativo. Permette ai log dell’applicazione di condividere la
traccia e lo span della richiesta attiva.init_logbrew(app) restituiscono la stessa
estensione Flask. Non installano hook duplicati per richieste o eccezioni.
La funzione di inizializzazione non aggiunge handler di logging. Aggiungi
l’handler una sola volta al logger della tua app.5
Esegui una richiesta
Avvia l’app e chiama la route da un altro terminale. Sostituisci L’invio avviene su un worker in background e non tiene aperta la
risposta.
app nel
comando se la tua applicazione usa un nome di modulo diverso.6
Verifica le prove memorizzate
Leggi l’ambito esatto del progetto e del deploy. Cerca la traccia della
richiesta di health check e il log correlato inviato dall’handler di
logging dell’esempio.Copia l’ID traccia restituito nel comando di indagine circoscritta:Una lettura con risultati corrispondenti conferma che LogBrew ha
memorizzato il segnale. Una risposta
200 in locale dimostra solo che
Flask ha gestito la richiesta.Scegli i segnali che ti servono
La funzione di inizializzazione parte con le tracce delle richieste e le eccezioni non gestite attive. Le metriche delle richieste e l’inoltro dei log Python sono scelte separate.
Parti dai valori predefiniti. Aggiungi le metriche delle richieste quando ti
serve una vista sulla latenza. Aggiungi l’handler di logging solo ai logger
utili a un’indagine.
Per impostazione predefinita, la funzione di inizializzazione gestisce un
proprio trasporto HTTP. Mette in coda ogni evento, e un worker in background
avvia l’invio appena c’è un evento in coda. L’invio non tiene aperta la
risposta. Gli errori di trasporto non interrompono la risposta di Flask.
Con
flush_on_response=True, invece, gli eventi in coda partono sul percorso
della risposta. Con questa opzione, raise_flush_errors=True solleva gli
errori di invio. Usa entrambe solo per una diagnosi controllata.
Controlla il contenuto dei log
Aggiungi un soloLogBrewLoggingHandler al logger che produce i messaggi che
ti servono. L’handler non sostituisce gli handler della console o dei file
dell’app. Non applica patch a Flask né al modulo logging di Python. Se aggiungi
lo stesso handler due volte, i log si duplicano. Se l’app usa anche il logger
radice, controlla la propagazione prima di collegare un secondo handler.
Un log dentro una richiesta eredita la traccia e lo span attivi. Un log fuori
da una richiesta non ha una traccia di richiesta.
L’handler invia il messaggio formattato, il nome del logger e il livello
LogBrew. Invia anche il nome del file sorgente, il modulo, la funzione, la
riga e i nomi di thread e processo, ma non il percorso completo del sorgente.
I valori primitivi di extra={...} diventano metadati. Controlla questi
valori prima di scrivere log da una richiesta rivolta agli utenti.
I record Python DEBUG diventano info in LogBrew. WARNING diventa
warning e CRITICAL diventa critical. Il nome e il numero originali del
livello Python restano nei metadati. Per inviare meno record, assegna
all’handler un proprio livello, ad esempio
LogBrewLoggingHandler(logbrew.client, level=logging.WARNING).
La console e LogBrew possono ricevere lo stesso record. Ad esempio, configura
la console prima di creare l’app Flask:
exc_info include il tipo e il messaggio
dell’eccezione. L’handler invia il testo completo dell’eccezione solo con
include_exception_text=True. Questo è separato dall’acquisizione automatica
delle eccezioni, che non invia mai il messaggio dell’eccezione. Non inserire
credenziali, dati personali o corpi delle richieste nei messaggi di log o di
eccezione.
Cosa acquisisce l’integrazione
I nomi degli span usano il metodo HTTP e il modello di route corrispondente.
Ad esempio,
/orders/100 e /orders/200 condividono
GET /orders/<int:order_id>. Una richiesta senza route corrispondente usa
l’etichetta fissa <unmatched>. Un traceparent mancante o non valido avvia
una nuova traccia.
I metadati dello span contengono metodo, modello di route, endpoint, codice di
stato e durata. Non contengono il percorso concreto né una stringa di query.
Nella versione 0.1.6 e successive, lo span della richiesta copre l’intero
dispatch di Flask. Gli hook before-request, gli handler degli errori e il
teardown condividono la traccia della richiesta. Una risposta in streaming
chiude il suo span quando il corpo termina o si chiude.
Testa l’acquisizione delle eccezioni
Uno stato4xx o 5xx compare sullo span della richiesta. Lo stato da solo
non dimostra che si sia verificata un’eccezione. Leggi sia le tracce sia i
problemi prima di diagnosticare un errore. LogBrew non sostituisce gli
handler degli errori di Flask e non cambia lo stato della risposta.
In un progetto di sviluppo, aggiungi una route temporanea. Chiamala una volta.
Rimuovila prima del deploy:
500. Trova il nuovo problema e la metrica
della richiesta:
local capture check.
Collega il lavoro in uscita alla richiesta
L’SDK Python offre helper, gestiti dalla tua app, perrequests, urllib,
httpx, aiohttp, database, cache e code. Ogni helper crea uno span figlio
della traccia della richiesta attiva. L’SDK non applica patch globali a queste
librerie. Il pacchetto logbrew-flask
mostra alcuni esempi.
Dai a ogni helper un nome di operazione stabile e un modello di route o di
istruzione. Non inserire in questi nomi ID di record, valori dei clienti,
valori di bind SQL o payload dei messaggi. Aggiungi span figli solo dove la
dipendenza conta per la richiesta. Uno span per ogni piccola chiamata rende la
traccia più difficile da leggere. Gli helper HTTP in uscita aggiungono un
header W3C traceparent. Non acquisiscono URL completi, stringhe di query,
corpi, cookie o header arbitrari. Gli helper per database, cache e code non
acquisiscono valori di bind, risultati, valori della cache o payload delle
code.
Privacy e ciclo di vita del processo
L’acquisizione automatica di Flask omette i percorsi concreti delle richieste, le stringhe di query, i corpi di richieste e risposte, i cookie, gli header arbitrari, i valori grezzi ditraceparent, il baggage e il tracestate.
L’acquisizione automatica delle eccezioni non legge e non invia mai
str(error). Usa il riepilogo fisso Unhandled exception e contrassegna come
oscurato ogni messaggio della catena di eccezioni. I frame contengono il nome
base del file e un’identità del codice limitata. Non contengono il testo
grezzo del traceback, codice sorgente, variabili locali o percorsi assoluti.
Crea l’app e il client LogBrew all’interno di ogni processo worker. Il
caricamento predefinito dell’app per worker di Gunicorn funziona. Non usare
--preload di Gunicorn con un client creato nel processo padre. Con uWSGI,
usa il caricamento dell’app per worker, ad esempio --lazy-apps. Il client
Python rifiuta il riutilizzo dopo il fork di un processo.
Chiama logbrew.client.shutdown() dall’hook di arresto per worker del gestore
dei processi. Invia gli eventi rimasti in coda e chiude il client. Non
chiamarlo dopo ogni richiesta. Dopo l’arresto, il client rifiuta nuovi eventi
da quel worker.
Una risposta può terminare prima che il worker invii gli ultimi eventi in
coda. Durante un deploy o una riduzione delle istanze, un arresto controllato
dà a quegli eventi un ultimo tentativo di invio.
Risolvi gli errori di configurazione
Per gli errori di accesso all’account, delle chiavi e di rilettura, consulta
Risoluzione degli errori. Per altri runtime,
consulta Invia telemetria con l’SDK.
