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.
Durable Functions offre diversi strumenti di diagnostica per la risoluzione dei problemi di orchestrazione. Questo articolo illustra come configurare il rilevamento e la registrazione, scrivere codice sicuro per la riproduzione, esaminare le tracce distribuite ed eseguire il debug in locale.
In questo articolo vengono illustrate le operazioni seguenti:
- Configurare il rilevamento di Application Insights per gli eventi del ciclo di vita
- Eseguire query sulle istanze di orchestrazione con Kusto
- Abilitare la registrazione di Durable Task Framework (DTFx) per la diagnostica di basso livello
- Imposta il tracciamento distribuito per visualizzare flussi orchestrativi end-to-end
- Scrivere log sicuri al riavvio nelle funzioni di orchestrazione
- Segnalare lo stato di orchestrazione personalizzato ai client esterni
- Effettuare il debug di orchestrazioni in locale con punti di interruzione
Configurare il rilevamento di Application Insights
Application Insights è il modo consigliato per monitorare Durable Functions. L'estensione Durable genera eventi di rilevamento che consentono di tracciare l'esecuzione end-to-end di un'orchestrazione. È possibile trovare ed eseguire query su questi eventi di rilevamento usando lo strumento Application Insights Analytics nel portale di Azure.
Configurazione a livello di log
Configurare la verbosità dei dati di tracciamento inviati a Application Insights nel file host.json :
{
"logging": {
"logLevel": {
"Host.Triggers.DurableTask": "Information",
},
}
}
Per impostazione predefinita vengono generati tutti gli eventi di rilevamento senza riesecuzione. È possibile ridurre il volume di dati impostando su Host.Triggers.DurableTask"Warning" o "Error", il che significa che gli eventi di rilevamento vengono generati solo per situazioni eccezionali. Per abilitare l'emissione degli eventi di riproduzione verbosi dell'orchestrazione, impostare logReplayEvents su true nel file di configurazione host.json.
Annotazioni
Per impostazione predefinita, il runtime di Azure Functions campiona i dati di telemetria di Application Insights per evitare di emettere dati troppo frequentemente. Il campionamento può causare la perdita di informazioni di rilevamento quando si verificano molti eventi del ciclo di vita in un breve periodo di tempo. L'articolo Monitoraggio delle Azure Functions illustra come configurare questo comportamento.
Registrazione di input e output
Per impostazione predefinita, gli input e gli output delle funzioni orchestratore, attività ed entità non vengono registrati. Questo approccio è consigliato perché la registrazione di input e output potrebbe aumentare i costi di Application Insights. I payload di input e output delle funzioni possono contenere anche informazioni riservate. Vengono invece registrati il numero di byte per gli input e gli output delle funzioni. Se si desidera che l'estensione Durable Functions registri i payload di input e output completi, impostare la proprietà traceInputsAndOutputs su true nel file di configurazione host.json.
Eseguire query su istanze di orchestrazione
Usare le query Kusto seguenti in Application Insights Analytics per esaminare le istanze di orchestrazione.
Query per singola istanza
La query seguente mostra i dati di rilevamento cronologici per una singola istanza di orchestrazione della funzione Hello Sequence. Esclude la riesecuzione in modo da mostrare solo il percorso di esecuzione logico. È possibile ordinare gli eventi ordinando in base timestamp a e sequenceNumber come illustrato nella query seguente:
let targetInstanceId = "ddd1aaa685034059b545eb004b15d4eb";
let start = datetime(2018-03-25T09:20:00);
traces
| where timestamp > start and timestamp < start + 30m
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = customDimensions["prop__functionName"]
| extend instanceId = customDimensions["prop__instanceId"]
| extend state = customDimensions["prop__state"]
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend sequenceNumber = tolong(customDimensions["prop__sequenceNumber"])
| where isReplay != true
| where instanceId == targetInstanceId
| sort by timestamp asc, sequenceNumber asc
| project timestamp, functionName, state, instanceId, sequenceNumber, appName = cloud_RoleName
Il risultato è un elenco di eventi di traccia che mostrano il percorso di esecuzione dell'orchestrazione, incluse eventuali funzioni di attività ordinate per ora di esecuzione in ordine ascendente.
Query di riepilogo dell'istanza
La query seguente mostra lo stato di tutte le istanze di orchestrazione eseguite in un intervallo di tempo specificato.
let start = datetime(2017-09-30T04:30:00);
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = tostring(customDimensions["prop__functionName"])
| extend instanceId = tostring(customDimensions["prop__instanceId"])
| extend state = tostring(customDimensions["prop__state"])
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend output = tostring(customDimensions["prop__output"])
| where isReplay != true
| summarize arg_max(timestamp, *) by instanceId
| project timestamp, instanceId, functionName, state, output, appName = cloud_RoleName
| order by timestamp asc
Il risultato è un elenco di ID istanza e dello stato di runtime corrente.
Riferimento ai dati di rilevamento
Ogni istanza di orchestrazione genera eventi di monitoraggio mentre avanza nel suo ciclo di vita. Ogni evento del ciclo di vita contiene un payload customDimensions con diversi campi. Ai nomi dei campi viene anteposta la stringa prop__.
| Nome del campo | Descrizione |
|---|---|
hubName |
nome dell'hub attività in cui vengono eseguite le orchestrazioni. |
appName |
Nome dell'app per le funzioni. Questo campo è utile quando più app per le funzioni condividono la stessa istanza di Application Insights. |
slotName |
Slot di distribuzione in cui è in esecuzione l'app per le funzioni corrente. Questo campo è utile quando si usano slot di distribuzione per controllare le versioni delle orchestrazioni. |
functionName |
Nome della funzione di orchestrazione o dell'attività. |
functionType |
Tipo della funzione, ad esempio Orchestrator o Activity. |
instanceId |
L'ID univoco dell'istanza di orchestrazione. |
state |
Stato di esecuzione del ciclo di vita dell'istanza. |
state.Scheduled |
La funzione è stata pianificata per l'esecuzione, ma non è stata ancora avviata l'esecuzione. |
state.Started |
la funzione è stata avviata, ma non è ancora in stato di attesa o non è stata completata. |
state.Awaited |
L'orchestratore ha pianificato alcune operazioni e sta aspettando che vengano completate. |
state.Listening |
L'orchestratore è in ascolto di una notifica di evento esterno. |
state.Completed |
La funzione è stata completata correttamente. |
state.Failed |
La funzione non è riuscita a causa di un errore. |
reason |
Dati aggiuntivi associati all'evento di rilevamento. Ad esempio, se un'istanza è in attesa di una notifica di evento esterna, questo campo indica il nome dell'evento in attesa. Se una funzione ha esito negativo, questo campo contiene i dettagli dell'errore. |
isReplay |
Valore booleano che indica se l'evento di tracciamento è per l'esecuzione ripetuta. |
extensionVersion |
Versione dell'estensione Durable Task. Questi dati sono particolarmente importanti quando si segnalano possibili bug nell'estensione. Le istanze con esecuzione prolungata possono segnalare più versioni se si verifica un aggiornamento mentre l'istanza è in esecuzione. |
sequenceNumber |
Numero di sequenza di esecuzione per un evento. In combinazione con il timestamp, questo consente di ordinare gli eventi in base al tempo di esecuzione. Si noti che questo numero viene reimpostato su zero se l'host viene riavviato mentre l'istanza è in esecuzione, quindi è importante ordinare sempre in base al timestamp per primo, quindi sequenceNumber. |
Registrazione di Durable Task Framework (DTFx)
I log delle estensioni permanenti sono utili per comprendere il comportamento della logica di orchestrazione. Tuttavia, questi log non contengono sempre informazioni sufficienti per eseguire il debug di problemi di affidabilità e prestazioni a livello di framework. A partire dalla versione 2.3.0 dell'estensione Durable, per la raccolta sono disponibili anche i log generati da Durable Task Framework (DTFx) sottostante.
Quando si esaminano i log generati da DTFx, è importante comprendere che il motore DTFx ha due componenti: il motore di distribuzione principale (DurableTask.Core) e uno dei molti provider di archiviazione supportati.
| Componente | Descrizione |
|---|---|
DurableTask.Core |
Esecuzione dell'orchestrazione principale e log di pianificazione e dati di telemetria di basso livello. |
DurableTask.DurableTaskScheduler |
Log back-end specifici del Pianificatore di attività durevole. |
DurableTask.AzureStorage |
Log back-end specifici del provider di stato di Archiviazione di Azure. Questi log includono interazioni dettagliate con le code interne, i BLOB e le tabelle di archiviazione usate per archiviare e recuperare lo stato di orchestrazione interna. |
DurableTask.Netherite |
Log back-end specifici per il provider di archiviazione Netherite, se abilitato. |
DurableTask.SqlServer |
Log back-end specifici per il provider di archiviazione Microsoft SQL (MSSQL), se abilitato. |
È possibile abilitare questi log aggiornando la sezione logging/logLevel del file dell'app per le funzioni host.json. Nell'esempio seguente viene illustrato come abilitare i log degli avvisi e degli errori da DurableTask.Core e DurableTask.AzureStorage:
{
"version": "2.0",
"logging": {
"logLevel": {
"DurableTask.AzureStorage": "Warning",
"DurableTask.Core": "Warning"
}
}
}
Se Application Insights è abilitato, questi log vengono aggiunti automaticamente alla trace raccolta. È possibile cercarli nello stesso modo in cui si cercano altri trace log usando query Kusto.
Annotazioni
Per le applicazioni di produzione, è consigliabile usare il filtro DurableTask.Core per abilitare DurableTask.AzureStorage e i log del provider di archiviazione appropriato, ad esempio "Warning". I filtri di dettaglio più elevati, come "Information", sono utili per il debug dei problemi di prestazione. Tuttavia, questi eventi di log possono essere elevati e possono aumentare significativamente i costi di archiviazione dei dati di Application Insights.
La query Kusto seguente illustra come eseguire query per i log DTFx. La parte più importante della query è where customerDimensions.Category startswith "DurableTask" perché filtra i risultati nei log nelle categorie DurableTask.Core e DurableTask.AzureStorage.
traces
| where customDimensions.Category startswith "DurableTask"
| project
timestamp,
severityLevel,
Category = customDimensions.Category,
EventId = customDimensions.EventId,
message,
customDimensions
| order by timestamp asc
Il risultato è un set di log scritti dai provider di log Durable Task Framework.
Per ulteriori informazioni sugli eventi di log disponibili, consultare la documentazione sulla registrazione strutturata del Durable Task Framework su GitHub.
Tracciamento distribuito
La traccia distribuita tiene traccia delle richieste e mostra in che modo i diversi servizi interagiscono tra loro. In Durable Functions correla le orchestrazioni, le entità e le attività insieme. La traccia distribuita mostra il tempo di esecuzione per ogni passaggio di orchestrazione relativo all'intera orchestrazione e identifica dove si verificano problemi o eccezioni. Questa funzionalità è supportata in Application Insights per tutte le lingue e i provider di archiviazione.
Prerequisiti
Il tracing distribuito richiede specifiche versioni minime dell'estensione.
- Per le app isolate .NET, Microsoft.Azure.Functions.Worker.Extensions.DurableTask>= v1.4.0.
- Per le app non .NET, seguire queste istruzioni per installare manualmente Microsoft.Azure. WebJobs.Extensions.DurableTask>= v3.2.0 per il momento. La tracciabilità distribuita sarà disponibile nei pacchetti di estensioni >v4.24.x.
Configurazione della traccia distribuita
Per configurare il tracciamento distribuito, aggiornare host.json e impostare una risorsa di Application Insights.
host.json
{
"extensions": {
"durableTask": {
"tracing": {
"distributedTracingEnabled": true,
"version": "V2"
}
}
}
}
Approfondimenti sulle Applicazioni
Configurare l'app per le funzioni con una risorsa di Application Insights.
Controllo delle tracce
Nella risorsa di Application Insights passare a Ricerca transazioni. Nei risultati, cercare gli eventi Request e Dependency che iniziano con prefissi specifici di Durable (ad esempio, orchestration:, activity:, e così via). Se si seleziona uno di questi eventi, viene aperto un diagramma di Gantt che mostra la traccia distribuita end-to-end. Il grafico visualizza ogni passaggio di orchestrazione come barra orizzontale, con chiamate di attività e orchestrazione secondaria annidate sotto l'orchestrazione padre. La lunghezza della barra rappresenta la durata dell'orologio a parete di ogni passaggio, rendendo più semplice individuare colli di bottiglia o attività inaspettatamente lente.
Annotazioni
Non stai vedendo le tue tracce in Application Insights? Attendere circa cinque minuti dopo l'esecuzione dell'applicazione per assicurarsi che tutti i dati vengano propagati alla risorsa di Application Insights.
Registrazione sicura contro i replay nelle funzioni di orchestrator
Le funzioni dell'agente di orchestrazione vengono riprodotte ogni volta che viene ricevuto un nuovo input, ovvero qualsiasi istruzione di log in un agente di orchestrazione viene eseguita più volte per una singola esecuzione logica. Ad esempio, una funzione con tre chiamate di attività produce un output del log simile al seguente durante la riproduzione:
Calling F1.
Calling F1.
Calling F2.
Calling F1.
Calling F2.
Calling F3.
Calling F1.
Calling F2.
Calling F3.
Done!
Per evitare righe di log duplicate, controllare il flag "sta riproducendo" in modo che i log vengano eseguiti solo al primo passaggio (non di riproduzione). Gli esempi seguenti mostrano la registrazione sicura per la riproduzione in ogni lingua.
A partire da Durable Functions 2.0, Usare CreateReplaySafeLogger per filtrare automaticamente i statement di log durante la ri-esecuzione:
[FunctionName("FunctionChain")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
log = context.CreateReplaySafeLogger(log);
log.LogInformation("Calling F1.");
await context.CallActivityAsync("F1");
log.LogInformation("Calling F2.");
await context.CallActivityAsync("F2");
log.LogInformation("Calling F3");
await context.CallActivityAsync("F3");
log.LogInformation("Done!");
}
Con la registrazione sicura per la riproduzione, l'output del log è:
Calling F1.
Calling F2.
Calling F3.
Done!
Stato di orchestrazione personalizzato
Usare lo stato di orchestrazione personalizzato per segnalare lo stato del flusso di lavoro ai client esterni. I modelli comuni includono percentuali di completamento, descrizioni dei passaggi e riepiloghi degli errori. I client esterni possono visualizzare lo stato personalizzato tramite l'API di query sullo stato HTTP o le chiamate API specifiche del linguaggio.
Il codice seguente illustra come impostare un valore di stato personalizzato in una funzione dell'agente di orchestrazione:
[FunctionName("SetStatusTest")]
public static async Task SetStatusTest([OrchestrationTrigger] IDurableOrchestrationContext context)
{
// ...do work...
// update the status of the orchestration with some arbitrary data
var customStatus = new { completionPercentage = 90.0, status = "Updating database records" };
context.SetCustomStatus(customStatus);
// ...do more work...
}
Annotazioni
L'esempio C# precedente è relativo a Durable Functions 2.x. Per Durable Functions 1.x, è necessario usare DurableOrchestrationContext anziché IDurableOrchestrationContext. Per altre informazioni sulle differenze tra le versioni, vedere l'articolo Durable Functions Versions.
Mentre l'orchestrazione è in esecuzione, i client esterni possono recuperare questo stato personalizzato:
GET /runtime/webhooks/durabletask/instances/instance123?code=XYZ
I client ricevono la risposta seguente:
{
"runtimeStatus": "Running",
"input": null,
"customStatus": { "completionPercentage": 90.0, "status": "Updating database records" },
"output": null,
"createdTime": "2017-10-06T18:30:24Z",
"lastUpdatedTime": "2017-10-06T19:40:30Z"
}
Avvertimento
Il payload dello stato personalizzato è limitato a 16 KB di testo JSON UTF-16 perché deve essere incluso in una colonna Azure Table Storage. Se è necessario un payload più grande, è possibile usare l'archiviazione esterna.
Risoluzione dei problemi
Azure Functions supporta direttamente il debug del codice della funzione e lo stesso supporto viene inoltrato a Durable Functions, sia in esecuzione in Azure che in locale. Usare il flusso di lavoro seguente per un'esperienza di debug ottimale:
Avviare una nuova sessione di debug con un nuovo hub attività o cancellare il contenuto dell'hub attività tra le sessioni. I messaggi residui dalle esecuzioni precedenti possono causare una ri-esecuzione imprevista.
Impostare punti di interruzione nelle funzioni dell'agente di orchestrazione o dell'attività. Per le funzioni di orchestrazione, utilizzate un punto di interruzione condizionale che si attiva solo quando il valore "is replaying" è
false, per evitare di attivare lo stesso punto di interruzione più volte durante la riproduzione.Eseguire passo passo il codice come di consueto. Tenere presente i comportamenti seguenti:
Replay:
Le funzioni di orchestrazione vengono rieseguite regolarmente quando vengono ricevuti nuovi dati di input. Una singola esecuzione logica di una funzione dell'agente di orchestrazione può comportare il raggiungimento dello stesso punto di interruzione più volte, soprattutto se viene impostato all'inizio del codice della funzione.Attendono:
Ogni volta che viene rilevato unawaitin una funzione dell'agente di orchestrazione, la funzione cede il controllo al dispatcher Durable Task Framework. Se è la prima volta che viene rilevato un particolareawait, l'attività associata non viene mai ripresa. Poiché l'attività non viene mai ripresa, passare sopra l'await (F10 in Visual Studio) non è possibile. Questa operazione funziona solo se un'attività è in corso di riesecuzione.Timeout della messaggistica:
Durable Functions usa internamente i messaggi della coda per guidare l'esecuzione di funzioni di orchestrazione, attività ed entità. In un ambiente con più macchine virtuali, le sessioni di debug estese potrebbero causare l'elaborazione del messaggio da parte di un'altra macchina virtuale, con conseguente esecuzione duplicata. Sebbene questo comportamento esista anche per le normali funzioni di trigger della coda, è importante sottolineare questo contesto perché le code sono un dettaglio dell'implementazione.Arresto e avvio:
I messaggi in Durable Functions vengono mantenuti tra le sessioni di debug. Se si arresta il debug e si termina il processo host locale durante l'esecuzione di una funzione durevole, tale funzione potrebbe essere eseguita di nuovo automaticamente in una sessione di debug futura.
Strumenti aggiuntivi
Esaminare lo stato di archiviazione
Per impostazione predefinita, Durable Functions archivia lo stato in Azure Storage. È possibile esaminare lo stato e i messaggi di orchestrazione usando strumenti come Microsoft Azure Storage Explorer.
Screenshot che mostra Azure Storage Explorer con lo stato di orchestrazione di Durable Functions in tabelle e code.
Avvertimento
Sebbene sia utile esaminare la cronologia di esecuzioni in archiviazione tabelle, evitare di creare qualsiasi dipendenza in questa tabella, Potrebbe cambiare con l'evoluzione dell'estensione Durable Functions.
Annotazioni
È possibile configurare altri provider di archiviazione anziché il provider di Azure Storage predefinito. A seconda del provider di archiviazione configurato per l'app, potrebbe essere necessario usare diversi strumenti per controllare lo stato sottostante.
Monitoraggio delle funzioni durevoli
Durable Functions Monitor è uno strumento grafico per monitorare, gestire e eseguire il debug delle istanze di orchestrazione ed entità. È disponibile come estensione Visual Studio Code o come app autonoma. Per istruzioni sull'installazione e un elenco delle funzionalità, vedere il wiki Durable Functions Monitor Wiki.
Diagnostica del portale Azure
Il portale Azure offre strumenti di diagnostica predefiniti per le app per le funzioni.
Diagnosticare e risolvere i problemi: Diagnostica app per le funzioni di Azure è una risorsa utile per il monitoraggio e la diagnosi di potenziali problemi nell'applicazione. Fornisce anche suggerimenti per risolvere i problemi in base alla diagnosi. Per altre informazioni, vedere Diagnostica app di Azure Functions.
Tracce di orchestrazione: Il portale di Azure fornisce informazioni dettagliate sulla traccia dell'orchestrazione per comprendere lo stato di ogni istanza di orchestrazione e di tracciare l'esecuzione end-to-end. Quando si visualizza l'elenco delle funzioni all'interno dell'app Azure Functions, viene visualizzata una colonna Monitor che contiene collegamenti alle tracce. Per accedere a queste informazioni, è necessario che Application Insights sia abilitato per l'app.
Analizzatore Roslyn
L'analizzatore Durable Functions Roslyn è un analizzatore di codice live che guida gli sviluppatori C# a seguire i vincoli specifici di codice delle Durable Functions . Per istruzioni su come abilitarlo in Visual Studio e Visual Studio Code, vedere Durable Functions Roslyn Analyzer.
Risoluzione dei problemi
Per risolvere problemi comuni, ad esempio orchestrazioni bloccate, mancata avvio o esecuzione lenta, vedere la guida alla risoluzione dei problemi Durable Functions guida alla risoluzione dei problemi.