Monitorare i log di App contenitore di Azure con Log Analytics

App contenitore di Azure si integra con Monitoraggio di Azure Log Analytics per monitorare e analizzare i log dell'app contenitore. Quando si seleziona questa soluzione per il monitoraggio dei log, l'ambiente App contenitore include un'area di lavoro Log Analytics che fornisce una posizione comune per archiviare i dati di sistema e di log applicazioni da tutte le app contenitore in esecuzione nell'ambiente.

È possibile accedere alle voci del log eseguendo query nelle tabelle di Log Analytics tramite il portale di Azure o una shell di comando usando interfaccia della riga di comando di Azure.

App contenitore di Azure offre tre tipi di log che consentono di monitorare e risolvere i problemi:

  • Log della console: l'applicazione genera questi log.
  • Log di sistema: il servizio App contenitore genera questi log.
  • Log HTTP: il livello di ingresso genera questi log quando la registrazione HTTP è abilitata tramite le impostazioni di diagnostica.

Log di sistema

Il servizio App contenitore fornisce messaggi di log di sistema a livello di app contenitore. I log di sistema generano i messaggi seguenti:

Origine TIPO Messaggio
Dapr Info Creazione del componente Dapr <nome componente> con ambito <dapr-component-scope> riuscita
Dapr Info Aggiornamento del componente Dapr <nome componente> con ambito <component-type> riuscito
Dapr Errore Errore durante la creazione del componente dapr <nome componente>
Montaggi del volume Info Volume montato correttamente <nome volume> per la revisione <ambito revisione>
Montaggi del volume Errore Errore durante il montaggio del volume <nome del volume>
Associazione del dominio Info Dominio associato correttamente <dominio> all’app contenitore <nome dell’app contenitore>
Autenticazione Info Autenticazione abilitata nell'app. Creazione della configurazione di autenticazione
Autenticazione Info Configurazione dell'autenticazione creata correttamente
Peso del traffico Info Impostazione del peso del traffico di <percentuale>% per la revisione <nome revisione\>
Provisioning delle revisioni Info Creazione di una nuova revisione: <nome revisione>
Provisioning delle revisioni Info <nome> revisione di cui è stato eseguito correttamente il provisioning
Provisioning delle revisioni Info Disattivazione delle revisioni precedenti da 'ActiveRevisionsMode=Single'
Provisioning delle revisioni Errore Errore durante il provisioning della revisione <nome revisione>. ErrorCode: <[ErrImagePull]|[Timeout]|[ContainerCrashing]>

È possibile accedere ai dati del log di sistema eseguendo una query sulla ContainerAppSystemLogs_CL tabella. Le colonne specifiche di App contenitore più comunemente usate nella tabella sono:

Colonna Descrizione
ContainerAppName_s Nome dell'app contenitore
EnvironmentName_s Nome dell'ambiente di Container Apps
Log_s Registra messaggio
RevisionName_s Nome della revisione

Log della console

I log della console provengono dai messaggi stderr e stdout dai contenitori nell'app contenitore e dai sidecar Dapr. È possibile visualizzare i log della console eseguendo una query sulla tabella ContainerAppConsoleLogs_CL.

Suggerimento

Instrumentare il codice con messaggi di log ben definiti consente di comprendere le prestazioni del codice e i problemi di debug. Per altre informazioni sulle procedure consigliate, vedere Progettare per le operazioni.

Le colonne specifiche di App contenitore più comunemente usate in ContainerAppConsoleLogs_CL includono:

Colonna Descrizione
ContainerAppName_s Nome dell'app contenitore
ContainerGroupName_g Nome della replica
ContainerId_s Identificatore del contenitore
ContainerImage_s Nome dell'immagine del contenitore
EnvironmentName_s Nome dell'ambiente di Container Apps
Log_s Registra messaggio
RevisionName_s Nome della revisione

Log HTTP

App contenitore di Azure può generare log HTTP usando le impostazioni di diagnostica di Monitoraggio di Azure nell’ambiente gestito di App contenitore di Azure.

Usare i log HTTP per esaminare il volume delle richieste, i percorsi, i metodi e i risultati della risposta durante la diagnosi del comportamento dell'API e del traffico Web.

Lo ContainerAppHTTPLogs schema contiene i campi e le descrizioni seguenti:

Campo TIPO Descrizione
Richiesta
Method string Metodo di richiesta HTTP (ad esempio, GET, POST).
Path string Percorso della richiesta, inclusa la stringa di query. I valori sensibili, ad esempio i token o le chiavi API, potrebbero essere visualizzati qui se i client li passano nella query, quindi gestire di conseguenza.
Authority string Intestazione HTTP Host (o pseudo-intestazione HTTP/2 :authority ) inviata dal client.
Protocol string Versione del protocollo osservata da ingresso, uno di HTTP/1.1, HTTP/2o HTTP/3.
UserAgent string Intestazione User-Agent del client.
XForwardedFor string Catena di IP client dall'intestazione X-Forwarded-For. Contiene indirizzi IP dell'utente finale, quindi considera come informazioni personali.
BytesReceived long Dimensioni del corpo della richiesta ricevuto dal client, in byte(%BYTES_RECEIVED%).
risposta
StatusCode int Codice di stato della risposta HTTP restituito al client. 0 indica il client disconnesso prima dell'avvio della risposta(%RESPONSE_CODE%).
ResponseCodeDetails string Token breve che spiega chi imposta il codice di stato e perché. Ad esempio, via_upstream, direct_responseroute_not_found, , upstream_per_try_timeout(elenco completo).
ResponseFlags string Uno o più codici brevi che descrivono le condizioni a livello di trasporto. Ad esempio, - (nessuno), UH (nessun upstream integro), UT (timeout dell'upstream), NR (nessun percorso) (elenco completo).
BytesSent long Dimensione del corpo della risposta inviato al client, in byte(%BYTES_SENT%).
Temporizzazione
StartTime datetime Ora (UTC) in ingresso ha iniziato l'elaborazione della richiesta (%START_TIME%).
RequestDuration long Tempo totale, in millisecondi, dall'inizio della richiesta all'ultimo byte di risposta inviato(%DURATION%).
Identifiers
RequestId string ID di correlazione della richiesta. Riflette l'intestazione x-request-id se il client ne ha fornito uno; in caso contrario, l'ingresso genera un valore. Non è garantito che sia un UUID.
ConnectionId string Identificatore della connessione downstream in cui è arrivata la richiesta. Più richieste nella stessa connessione condividono questo valore(%CONNECTION_ID%).
App/Routing
ContainerAppName string App contenitore che ha gestito la richiesta.
RevisionName string Revisione dell'app Container che ha gestito la richiesta.
ReplicaName string Replica (pod) che ha gestito la richiesta.
EnvironmentName string Ambiente di Container Apps che ospita l'app.
Upstream
UpstreamHost string Indirizzo (IP:port) dell'endpoint upstream che ha servito la richiesta(%UPSTREAM_HOST%).
UpstreamRequestAttemptCount int Numero di volte in cui la richiesta è stata tentata a monte, inclusi i nuovi tentativi. 0 significa che non è mai stato tentato.
Diagnostica in ingresso
EnvoyPodName string Nome del pod in ingresso che ha prodotto questo record. Utile per fare riferimento incrociato ai log di ingresso durante l'analisi degli eventi imprevisti.
EnvoyContainerId string ID del contenitore dell'istanza ingress. Utile per fare riferimento incrociato ai log di ingresso durante l'analisi degli eventi imprevisti.

Note

Dopo aver abilitato i log HTTP, possono essere necessari alcuni minuti prima che la tabella ContainerAppHTTPLogs venga visualizzata in Log Analytics.

Log HTTP delle query in Analisi dei log

Usate prima le seguenti query incentrate sul triage, quindi usate gli ulteriori esempi di analisi che seguono.

Visualizzare gli errori HTTP recenti

Usare questa query quando vengono visualizzati tassi di errore elevati nei dashboard, i clienti segnalano errori o si vuole valutare rapidamente ciò che ha esito negativo al momento.

ContainerAppHTTPLogs
| where TimeGenerated > ago(1h)
| where StatusCode >= 400
| project TimeGenerated, ContainerAppName, RevisionName, Method, Path,
  StatusCode, ResponseCodeDetails, RequestDuration, RequestId
| order by TimeGenerated desc
| take 100

Suggerimento

Verificare ResponseCodeDetails il motivo per cui una richiesta non è riuscita. Ad esempio, route_not_found indica una configurazione errata del routing, mentre via_upstream il contenitore ha restituito l'errore stesso.

Trova richieste lente

Usare questa query quando l'app si sente lenta, si sta analizzando un reclamo di latenza o si vuole verificare una correzione delle prestazioni.

ContainerAppHTTPLogs
| where TimeGenerated > ago(1h)
| where ContainerAppName == "<app-name>"
| top 50 by RequestDuration desc
| project TimeGenerated, Method, Path, StatusCode, RequestDuration,
  ReplicaName, UpstreamRequestAttemptCount, RequestId

Suggerimento

RequestDuration viene segnalato in millisecondi. Se vedi valori elevati insieme a UpstreamRequestAttemptCount > 1, la richiesta è stata ripetuta, il che aumenta il tempo totale.

Monitorare il volume delle richieste e il tasso di errore per revisione

Usa questa query dopo aver distribuito una nuova revisione e vuoi confermare che funzioni correttamente, oppure quando esegui una distribuzione blue/green e vuoi confrontare due revisioni una accanto all'altra.

ContainerAppHTTPLogs
| where TimeGenerated > ago(6h)
| where ContainerAppName == "<app-name>"
| summarize Requests = count(),
  Errors = countif(StatusCode >= 500),
  ErrorRatePct = round(100.0 * countif(StatusCode >= 500) / count(), 2),
  P95DurationMs = percentile(RequestDuration, 95)
  by RevisionName, bin(TimeGenerated, 5m)
| order by TimeGenerated desc
| render timechart

Suggerimento

Una nuova revisione che improvvisamente inizia a gestire richieste 0 di solito indica un problema di ponderazione del traffico nella configurazione Ingress. Una nuova revisione con un tasso di errore o un P95 superiore rispetto alla precedente indica una regressione del deployment; valuta un rollback.

Traccia una singola richiesta dall'inizio alla fine

Usa questa query quando un cliente segnala una specifica transazione non riuscita e fornisce l'ID della richiesta corrispondente (il valore dell'intestazione x-request-id che ha visualizzato). È necessario trovare la richiesta esatta e i log delle app correlati.

let _requestId = "<request-id>";
ContainerAppHTTPLogs
| where TimeGenerated > ago(24h)
| where RequestId == _requestId
| project TimeGenerated, ContainerAppName, RevisionName, ReplicaName,
  Method, Path, StatusCode, ResponseCodeDetails, ResponseFlags,
  RequestDuration, UpstreamHost, UserAgent, XForwardedFor

Suggerimento

Una volta ottenuto ReplicaName dalla riga precedente, eseguire un join con ContainerAppConsoleLogs_CL filtrato sulla stessa replica e su una piccola finestra temporale attorno a TimeGenerated per visualizzare le voci di log dell'app per quella richiesta.

Identificare gli endpoint con errori principali

Utilizza questa query quando visualizzi molti errori ma non sai da dove iniziare. Questa query consente di individuare i percorsi responsabili della maggior parte degli errori, in modo da poter classificare in ordine di priorità le correzioni in base all'impatto.

ContainerAppHTTPLogs
| where TimeGenerated > ago(24h)
| where StatusCode >= 400
| summarize Errors = count(),
  DistinctClientIPs = dcount(XForwardedFor),
  SampleStatusCodes = make_set(StatusCode, 5),
  ExampleDetails = take_any(ResponseCodeDetails)
  by ContainerAppName, Method, Path
| order by Errors desc
| take 20

Suggerimento

Un conteggio elevato DistinctClientIPs insieme agli errori suggerisce un problema reale che influisce su larga scala. Un numero basso indica in genere un singolo client malfunzionante (ad esempio, uno scanner o un ciclo di tentativi ripetuti difettoso).

Esaminare i record di log HTTP recenti

Usare questa query per esaminare i record di log HTTP recenti:

ContainerAppHTTPLogs
| where TimeGenerated > ago(2h)
| project TimeGenerated, Method, Path, StatusCode, ContainerAppName, EnvironmentName
| order by TimeGenerated desc
| take 100

Usare gli esempi seguenti per scenari comuni di analisi dei log HTTP.

Distribuzione del codice di stato

ContainerAppHTTPLogs
| where TimeGenerated > ago(24h)
| summarize Count = count() by toint(StatusCode)
| order by Count desc

Visualizzazione incentrata sugli errori (4xx/5xx)

ContainerAppHTTPLogs
| where TimeGenerated > ago(2h)
| extend StatusCodeInt = toint(StatusCode)
| where StatusCodeInt >= 400
| project
    Time=TimeGenerated,
    StatusCode=StatusCodeInt,
    Method,
    Path,
    Details=ResponseCodeDetails,
    EnvName=EnvironmentName,
    AppName=ContainerAppName,
    Revision=RevisionName
| top 100 by Time desc

Latenza (P50/P95/P99) per app e percorso

ContainerAppHTTPLogs
| where TimeGenerated > ago(2h)
| summarize
    Requests = count(),
    P50 = percentile(RequestDuration, 50),
    P95 = percentile(RequestDuration, 95),
    P99 = percentile(RequestDuration, 99)
  by ContainerAppName, Path
| order by P95 desc

Eseguire query sui log con Log Analytics

Log Analytics è uno strumento nel portale di Azure che è possibile usare per visualizzare e analizzare i dati di log. Usando Log Analytics, è possibile scrivere query Kusto e quindi ordinare, filtrare e visualizzare i risultati nei grafici per individuare le tendenze e identificare i problemi. È possibile lavorare in modo interattivo con i risultati della query o usarli con altre funzionalità, ad esempio avvisi, dashboard e cartelle di lavoro.

Portale di Azure

Avvia Log Analytics da Log nel menu laterale della pagina dell'app contenitore. È anche possibile avviare Log Analytics da Monitor > Logs.

Eseguire query sui log usando le tabelle elencate nella categoria Log personalizzati nella scheda Tabelle . Le tabelle in questa categoria sono ContainerAppSystemLogs_CL e ContainerAppConsoleLogs_CL.

Screenshot della pagina di query di Log Analytics che mostra tabelle log personalizzate.

Nella query Kusto seguente vengono visualizzate le voci di log della console per l'app contenitore denominata album-api.

ContainerAppConsoleLogs_CL
| where ContainerAppName_s == 'album-api'
| project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s
| take 100

Nella query Kusto seguente vengono visualizzate le voci di log di sistema per l'app contenitore denominata album-api.

ContainerAppSystemLogs_CL
| where ContainerAppName_s == 'album-api'
| project Time=TimeGenerated, EnvName=EnvironmentName_s, AppName=ContainerAppName_s, Revision=RevisionName_s, Message=Log_s
| take 100

Per ulteriori informazioni su Log Analytics e le query di log, vedere l'esercitazione di Log Analytics.

interfaccia della riga di comando di Azure o PowerShell

È possibile eseguire query sui log di App contenitore usando interfaccia della riga di comando di Azure.

Queste query di esempio di interfaccia della riga di comando di Azure restituiscono una tabella contenente i record di log per l'app contenitore denominata album-api. I parametri dopo l'operatore project specificano le colonne della tabella. La variabile $WORKSPACE_CUSTOMER_ID ha il GUID dell'area di lavoro Log Analytics.

Questo esempio esegue una query sulla tabella ContainerAppConsoleLogs_CL:

az monitor log-analytics query --workspace $WORKSPACE_CUSTOMER_ID --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'album-api' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s, LogLevel_s | take 5" --out table

Questo esempio esegue una query sulla tabella ContainerAppSystemLogs_CL:

az monitor log-analytics query --workspace $WORKSPACE_CUSTOMER_ID --analytics-query "ContainerAppSystemLogs_CL | where ContainerAppName_s == 'album-api' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Message=Log_s, LogLevel_s | take 5" --out table

Passaggi successivi