Monitorare le Funzioni di Azure e gli Event Hub

Il monitoraggio fornisce informazioni dettagliate sul comportamento e sull'integrità dei sistemi. Consente di ottenere una visualizzazione olistica dell'ambiente e delle tendenze storiche, correlare diversi fattori e misurare le variazioni delle prestazioni, del consumo o della frequenza degli errori.

Funzioni di Azure offre l'integrazione predefinita con Application Insights. Da Application Insights è possibile ottenere informazioni come il numero di istanze o richieste dell'app per le funzioni e i dati di telemetria delle dipendenze di una funzione. Quando si usano Funzioni insieme a Hub eventi di Azure, Application Insights può anche tenere traccia delle telemetrie delle dipendenze in uscita nell'hub eventi, calcolare il tempo di elaborazione e mostrare il flusso end-to-end del sistema connesso tramite Hub eventi.

Questo articolo presenta funzionalità utili e informazioni dettagliate che è possibile ottenere da Application Insights per la soluzione che usa Hub eventi insieme a Funzioni.

Mappa delle applicazioni

La mappa delle applicazioni mostra il modo in cui i componenti di un sistema interagiscono tra loro. Poiché Application Insights fornisce dati di telemetria delle dipendenze, può eseguire il mapping del flusso di eventi tra Funzioni di Azure e Hub eventi, incluso il numero medio di chiamate per ogni funzione e la durata media di un evento in Hub eventi. Vengono inoltre visualizzate le transazioni che contengono errori in rosso.

Dopo aver inviato il carico previsto al sistema, è possibile passare ad Application Insights nel portale di Azure e selezionare Mappa applicazioni nel riquadro di spostamento. La mappa seguente mostra tre funzioni, tre hub di eventi e guasti apparenti durante le operazioni di scrittura in un database downstream.

Screenshot di una mappa dell'applicazione che mostra tre funzioni, tre hub eventi e errori evidenti durante le scritture in un database downstream.

Dettagli delle transazioni end-to-end

I dettagli delle transazioni end-to-end mostrano in che modo i componenti del sistema interagiscono tra loro, in ordine cronologico. Questa visualizzazione mostra anche per quanto tempo è stato necessario elaborare un evento. È possibile esaminare i dati di telemetria di ogni componente in questa visualizzazione. In questo modo è possibile risolvere i problemi tra i componenti all'interno della stessa richiesta quando si verifica un problema.

Schermata della vista dei dettagli della transazione end-to-end in Application Insights. Mostra la sequenza temporale di una richiesta di una funzione, una dipendenza in uscita verso un Hub eventi, il tempo trascorso nella coda e l'esecuzione successiva.

Metriche e telemetria della piattaforma

È possibile usare le metriche generate dalla piattaforma in Monitoraggio di Azure per Hub eventi e Funzioni di Azure per monitorare il comportamento e l'integrità di una soluzione:

Le Funzioni di Azure si integrano con Application Insights per fornire telemetria avanzata e dettagliata e approfondimenti sull'host e sulle esecuzioni delle funzioni. Per ulteriori informazioni, vedere Analizzare i dati di telemetria delle Funzioni di Azure in Application Insights. Quando si usa Application Insights per monitorare una topologia, è disponibile un'ampia gamma di configurazioni. Per altre informazioni, vedere Configurare il monitoraggio per Funzioni di Azure.

L'esempio seguente mostra dati di telemetria aggiuntivi per le funzioni attivate da Hub eventi. È generato nella tabella traces:

Trigger Details: PartitionId: 6, Offset: 3985758552064-3985758624640, EnqueueTimeUtc: 2025-10-31T12:51:58.1750000+00:00-2025-10-31T12:52:03.8160000+00:00, SequenceNumber: 3712266-3712275, Count: 10

Questi dati sono utili perché contengono informazioni sul messaggio che ha attivato la funzione e possono essere usati per l'esecuzione di query e informazioni dettagliate. Include i dati seguenti per ogni volta che viene attivata la funzione:

  • ID partizione (6)
  • Intervallo dell'offset della partizione (3985758552064-3985758624640)
  • Intervallo temporale di accodamento in UTC (2025-10-31T12:51:58.1750000+00:00-2025-10-31T12:52:03.8160000+00:00)
  • Intervallo dei numeri di sequenza 3712266-3712275
  • Numero di messaggi (10)

Per esempi su come usare questi dati di telemetria, vedere la sezione Query di Application Insights di esempio di questo articolo.

È anche possibile usare dati di telemetria personalizzati per linguaggi diversi (libreria di classi C#, C# isolato, script C#, JavaScript, Java, PowerShell e Python). Questa registrazione viene visualizzata nella tabella delle tracce in Application Insights. È possibile creare voci personalizzate in Application Insights e aggiungere dimensioni personalizzate che è possibile usare per eseguire query sui dati e creare dashboard personalizzati.

Infine, quando l'app per le funzioni si connette a un hub eventi usando un'associazione di output, le voci vengono scritte anche nella tabella Dipendenze di Application Insights.

Screenshot della tabella delle dipendenze di Application Insights.

Per Hub di eventi, la correlazione viene inserita nel payload dell'evento e negli eventi si visualizza una proprietà Diagnostic-Id.

Schermata di un payload dell'evento che mostra una proprietà Diagnostic-Id nell'oggetto Properties, insieme a proprietà di sistema come il numero di sequenza, l'offset e l'ora di accodamento.

Questa proprietà usa il formato W3C Trace Context, utilizzato anche come ID operazione e collegamenti operazione nei dati di telemetria creati da Functions. Questo formato consente ad Application Insights di costruire la correlazione tra gli eventi dell'hub eventi e le esecuzioni di funzioni, anche quando vengono distribuite.

Diagramma che mostra come Application Insights correla i dati di telemetria tra due funzioni che elaborano un batch di eventi.

Esempi di query per "Application Insights"

L'elenco seguente contiene query di Application Insights che consentono di monitorare una soluzione che usa Hub eventi insieme a Funzioni di Azure. Queste query visualizzano informazioni dettagliate per le funzioni attivate dagli hub eventi che usano i dati di telemetria generati dall'estensione di Hub eventi.

Quando il campionamento è abilitato in Application Insights, potrebbero verificarsi lacune nei dati.

Informazioni dettagliate sull'elaborazione degli eventi

I dati vengono generati solo nel formato corretto quando viene usato l'invio in batch. Quando si usa l'invio batch, la funzione accetta più eventi per ogni esecuzione. È consigliabile usare questa modalità per migliorare le prestazioni. Tenere presente quanto segue:

  • Il dispatchTimeMilliseconds valore approssima l'intervallo di tempo tra il momento in cui l'evento è stato scritto nell'hub eventi e il momento in cui è stato prelevato dall'app per le funzioni per l'elaborazione.
  • dispatchTimeMilliseconds può essere negativo o altrimenti impreciso a causa della deviazione del clock tra il server hub eventi e l'app per le funzioni.
  • Le partizioni di Hub eventi vengono elaborate in sequenza. Un messaggio non viene inviato al codice funzione per l'elaborazione fino a quando non vengono elaborati tutti i messaggi precedenti. Monitorare il tempo di esecuzione delle funzioni perché tempi di esecuzione più lunghi causano ritardi di invio.
  • Il calcolo utilizza l'enqueueTime del primo messaggio nel batch. I tempi di invio potrebbero essere inferiori per altri messaggi nel batch.
  • dispatchTimeMilliseconds si basa su un momento specifico.
  • I numeri di sequenza sono specifici di ogni partizione e l'elaborazione duplicata può verificarsi perché Event Hubs non garantisce il recapito dei messaggi una e una sola volta.
traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| project timestamp, cloud_RoleInstance, operation_Name, processId =
customDimensions.ProcessId, partitionId, messageCount, sequenceNumberStart,
sequenceNumberEnd, enqueueTimeStart, enqueueTimeEnd, dispatchTimeMilliseconds

Lo screenshot seguente mostra i risultati della query.

Schermata dei risultati della query di Application Insights per la query dettagliata di elaborazione degli eventi.

Visualizzazione della latenza di trasmissione

Questa query visualizza il 50° e il 90° percentile della latenza di distribuzione degli eventi per una determinata funzione attivata da un hub di eventi. Per ulteriori informazioni e annotazioni, consultare la richiesta precedente.

traces
| where operation_Name == "<enter the name of your function here>"
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize percentiles(dispatchTimeMilliseconds, 50, 90) by bin(timestamp, 5m)
| render timechart

Lo screenshot seguente mostra i risultati della query.

Schermata di un grafico temporale che mostra la latenza di distribuzione del 50° e del 90° percentile in millisecondi nell'arco di 24 ore. La linea del 50° percentile rimane vicina a 25 ms. La linea del 90° percentile oscilla tra circa 50 ms e 460 ms.

Riepilogo della latenza di invio

Questa query è simile a quella precedente, ma mostra una visualizzazione di riepilogo.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize messageCount = sum(messageCount),
percentiles(dispatchTimeMilliseconds, 50, 90, 99, 99.9, 99.99) by operation_Name

Lo screenshot seguente mostra i risultati della query.

Schermata dei risultati della query di Application Insights per il riepilogo della latenza di distribuzione. Mostra il numero di messaggi e i percentili della latenza di distribuzione.

Distribuzione dei messaggi tra partizioni

Questa query mostra come visualizzare la distribuzione dei messaggi tra le partizioni.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

Lo screenshot seguente mostra i risultati della query.

Schermata dei risultati della query di Application Insights sulla distribuzione dei messaggi tra le partizioni.

Distribuzione dei messaggi tra istanze

Questa query illustra come visualizzare la distribuzione dei messaggi tra istanze.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

Lo screenshot seguente mostra i risultati della query.

Schermata dei risultati della query di Application Insights per la query sulla distribuzione dei messaggi tra le istanze.

Istanze in esecuzione e istanze allocate

Questa query mostra come visualizzare il numero di istanze di Funzioni di Azure che elaborano eventi dagli Hub di Eventi e il numero totale di istanze (elaborazione e attesa del noleggio). I due numeri devono in genere corrispondere.

traces
| where message startswith "Trigger Details: Parti"
| summarize type = "Executing Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
| union (
    traces
    | summarize type = "Allocated Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
)
| project timestamp, type, Count
| render timechart

Lo screenshot seguente mostra i risultati della query.

Schermata dei risultati della query in Application Insights per la query sulle istanze in esecuzione e sulle istanze allocate.

Tutti i dati di telemetria per un'esecuzione di funzione specifica

È possibile usare il campo operation_Id tra le diverse tabelle in Application Insights. Per Azure funzioni attivate da Hub eventi, la query seguente, ad esempio, restituisce le informazioni sul trigger, i dati di telemetria dai log all'interno del codice della funzione e le dipendenze e le eccezioni:

union isfuzzy=true requests, exceptions, traces, dependencies
| where * has "<enter the operation_Id of your function execution here>"
| order by timestamp asc

Lo screenshot seguente mostra i risultati della query.

Schermata del risultato di una query di Application Insights. Mostra tutti i dati di telemetria relativi a un singolo ID di operazione.

Latenza end-to-end per un evento

La proprietà enqueueTimeUtc nella traccia dei dettagli del trigger mostra l'ora di accodamento solo del primo evento di ogni batch elaborato dalla funzione. È possibile usare una query più avanzata per calcolare la latenza end-to-end per gli eventi che passano attraverso due funzioni connesse da un hub eventi. Questa query espande i link dell'operazione (se presenti) nella richiesta della seconda funzione e associa il relativo tempo di completamento all'ID dell'operazione corrispondente all'ora di inizio della prima funzione.

let start = view(){
requests
| where operation_Name == "FirstFunction"
| project start_t = timestamp, first_operation_Id = operation_Id
};
let link = view(){
requests
| where operation_Name == "SecondFunction"
| mv-expand ex = parse_json(tostring(customDimensions["_MS.links"]))
| extend parent = case(isnotempty(ex.operation_Id), ex.operation_Id, operation_Id )
| project first_operation_Id = parent, second_operation_Id = operation_Id
};
let finish = view(){
traces
| where customDimensions["EventName"] == "FunctionCompleted" and operation_Name
== "SecondFunction"
| project end_t = timestamp, second_operation_Id = operation_Id
};
start
| join kind=inner (
link
| join kind=inner finish on second_operation_Id
) on first_operation_Id
| project start_t, end_t, first_operation_Id, second_operation_Id
| summarize avg(datetime_diff('second', end_t, start_t))

Lo screenshot seguente mostra i risultati della query.

Screenshot dei risultati delle query di Application Insights per la query di latenza end-to-end.

Contributori

Microsoft mantiene questo articolo. I seguenti collaboratori hanno scritto questo articolo.

Autore principale:

Per visualizzare i profili LinkedIn non pubblici, accedere a LinkedIn.

Passaggi successivi