Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
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