Övervaka Azure Functions och Event Hubs

Azure Event Hubs
Azure Functions
Azure Monitor

Övervakning ger insikter om systemens beteende och hälsa och hjälper dig att skapa en holistisk vy över miljön, historiska trender, korrelera olika faktorer och mäta förändringar i prestanda, förbrukning eller felfrekvens.

Azure Functions erbjuder inbyggd integrering med Application Insights. Från Application Insights kan du hämta information, till exempel antalet funktionsappinstanser eller telemetri för begäranden och beroenden för en funktion. När du arbetar med Functions och Event Hubs kan Application Insights också spåra utgående beroendets telemetri till händelsehubben, beräkna tiden i kön och visa flödet från slutpunkt till slutpunkt för systemet som är anslutet via Event Hubs.

Det här avsnittet innehåller användbara funktioner och insikter som du kan få från Application Insights för din Event Hubs plus Functions-lösning.

Programkarta

Programkarta visar hur komponenterna i ett system interagerar med varandra. På grund av den beroendetelemetri som Application Insights tillhandahåller mappar den ut flödet av händelser mellan Azure Functions och Händelsehubbar, inklusive medelvärdet för varje funktionskörning och genomsnittlig varaktighet för en händelse i Event Hubs, samt visar transaktioner som innehåller fel markerade i rött.

När du har skickat den förväntade belastningen till systemet kan du gå till Application Insights i Azure Portal och välja på Programkarta i sidofältet. Här är en karta som visar tre funktioner, tre händelsehubbar och uppenbara fel när du skriver till en underordnad databas:

Programkarta

Transaktionsinformation från slutpunkt till slutpunkt

Transaktionsinformation från slutpunkt till slutpunkt visar hur dina systemkomponenter interagerar med varandra i kronologisk ordning. Den här vyn visar också hur länge en händelse har tillbringats i kön. Du kan också granska telemetrin för varje komponent från den här vyn, vilket gör det enklare att felsöka mellan komponenter i samma begäran när ett problem uppstod.

Transaktion från slutpunkt till slutpunkt

Plattformsmått och telemetri

Plattformsgenererade mått i Azure Monitor för Event Hubs och Azure Functions kan användas för övergripande övervakning av lösningens beteende och hälsa:

Azure Functions integreras med Application Insights för att tillhandahålla avancerad och detaljerad telemetri och insikter om Functions-värd- och funktionskörningar. Mer information finns i Analysera Azure Functions telemetri i Application Insights. När du använder Application Insights för att övervaka en topologi finns det en mängd olika konfigurationer tillgängliga. Mer information finns i Så här konfigurerar du övervakning för Azure Functions.

Följande är ett exempel på extra telemetri för event hubs-utlösta funktioner som genereras i spårningstabellen :

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

Den här informationen kräver att du använder Event Hubs-tillägget 4.2.0 eller en senare version. Dessa data är mycket användbara eftersom de innehåller information om meddelandet som utlöste funktionskörningen och kan användas för frågor och insikter. Den innehåller följande data för varje gång funktionen utlöses:

  • Partitions-ID (6)
  • Partitionens förskjutningsintervall (3985758552064-3985758624640)
  • Tidsintervallet Enqueue i UTC (2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00)
  • Sekvensnummerintervallet 3712266-3712275
  • Och antalet meddelanden (10)

I avsnittet Exempel på Application Insights-frågor finns exempel på hur du använder den här telemetrin.

Anpassad telemetri är också möjlig för olika språk (C#-klassbibliotek, C# Isolerad, C#-skript, JavaScript, Java, PowerShell och Python). Den här loggningen visas i spårningstabellen i Application Insights. Du kan skapa egna poster i Application Insights och lägga till anpassade dimensioner som kan användas för att fråga efter data och skapa anpassade instrumentpaneler.

När funktionsappen slutligen ansluter till en händelsehubb med en utdatabindning skrivs även poster till tabellen Application Insights-beroenden.

Tabellen Beroenden

För Event Hubs matas korrelationen in i händelsenyttolasten och du ser en egenskap för diagnostik-ID i händelser:

Egenskap för diagnostik-ID

Detta följer formatet för W3C-spårningskontext som även används som åtgärds-ID och åtgärdslänkar i telemetri som skapats av Functions, vilket gör att Application Insights kan konstruera korrelationen mellan händelsehubbens händelser och funktionskörningar, även när de distribueras.

Korrelation för Batch-händelser

Exempel på Application Insights-frågor

Nedan visas en lista över användbara Application Insights-frågor när du övervakar Event Hubs med Azure Functions. Den här frågan visar detaljerad information för händelsehubbens utlösta funktion med telemetri som genereras av Event Hubs-tillägget 4.2.0 och senare.

När sampling är aktiverat i Application Insights kan det finnas luckor i data.

Detaljerad information om händelsebearbetning

Data genereras endast i rätt format när batchskick används. Batch-sändning innebär att funktionen accepterar flera händelser för varje körning, vilket rekommenderas för prestanda. Tänk på följande faktorer:

  • Värdet dispatchTimeMilliseconds beräknar tiden mellan när händelsen skrevs till händelsehubben och när den hämtades av funktionsappen för bearbetning.
  • dispatchTimeMilliseconds kan vara negativt eller på annat sätt felaktigt på grund av klockavvikelse mellan händelsehubbens server och funktionsappen.
  • Event Hubs-partitioner bearbetas sekventiellt. Ett meddelande skickas inte till funktionskoden för bearbetning förrän alla tidigare meddelanden har bearbetats. Övervaka körningstiden för dina funktioner eftersom längre körningstider orsakar leveransfördröjningar.
  • Beräkningen använder enqueueTime för det första meddelandet i batchen. Sändningstiderna kan vara lägre för andra meddelanden i batchen.
  • dispatchTimeMilliseconds baseras på tidpunkten.
  • Sekvensnummer är per partition och dubblettbearbetning kan inträffa eftersom Event Hubs inte garanterar meddelandeleverans exakt en gång.
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

Detaljerad händelsebearbetning

Visualisering av svarstid för utskick

Den här frågan visualiserar svarstiden för den 50:e och 90:e percentilen för händelsesändning för en viss händelsehubbutlöst funktion. Mer information och anteckningar finns i frågan ovan.

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

Visualisering av svarstid för sändning

Sammanfattning av sändningssvarstid

Den här frågan liknar ovan men visar en sammanfattningsvy.

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

Sammanfattning av leveransfördröjning

Meddelandedistribution mellan partitioner

Den här frågan visar hur du visualiserar meddelandedistribution mellan partitioner.

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

Meddelandedistribution mellan partitioner

Meddelandedistribution mellan instanser

Den här frågan visar hur du visualiserar meddelandedistribution mellan instanser.

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

Meddelandedistribution mellan instanser

Köra instanser och allokerade instanser

Den här frågan visar hur du visualiserar antalet Azure Functions instanser som bearbetar händelser från Event Hubs och det totala antalet instanser (bearbetning och väntar på lån). För det mesta bör de vara desamma.

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

Köra instanser och allokerade instanser

All telemetri för en specifik funktionskörning

Fältet operation_Id kan användas i de olika tabellerna i Application Insights. För Event Hubs som utlöses Azure Functions resulterar till exempel följande fråga i utlösarinformation, telemetri från loggar i funktionskoden och beroenden och undantag:

union isfuzzy=true requests, exceptions, traces, dependencies
| where * has "<ENTER THE OPERATION_ID OF YOUR FUNCTION EXECUTION HERE>"
| order by timestamp asc

All telemetri för en specifik funktionskörning

Svarstid från slutpunkt till slutpunkt för en händelse

Eftersom egenskapen enqueueTimeUtc i utlösarinformationsspårningen visar den köande tiden för endast den första händelsen i varje batch som funktionen bearbetade, kan en mer avancerad fråga användas för att beräkna svarstiden från slutpunkt till slutpunkt för händelser mellan två funktioner med Event Hubs däremellan. Den här frågan expanderar åtgärdslänkarna (om sådana finns) i den andra funktionens begäran och mappar dess sluttid till samma motsvarande åtgärds-ID för den första funktionens starttid.

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))

Svarstid från slutpunkt till slutpunkt för en händelse

Deltagare

Den här artikeln underhålls av Microsoft. Den skrevs ursprungligen av följande deltagare.

Huvudförfattare:

Om du vill se icke-offentliga LinkedIn-profiler loggar du in på LinkedIn.

Nästa steg

Om du vill veta mer kan du läsa följande relaterade artiklar: