Redigera

Dela via


Ö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 telemetrin för utgående beroenden till händelsehubben, beräkna bearbetningstiden 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 beroendetelemetrin som Application Insights tillhandahåller mappar den ut flödet av händelser mellan Azure Functions och Event Hubs, 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 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

Omfattande transaktionsinformation

Transaktionsinformation från slutpunkt till slutpunkt visar hur systemkomponenterna interagerar med varandra i kronologisk ordning. Den här vyn visar också hur länge en händelse har använts i bearbetningen. Du kan också granska telemetrin för varje komponent från den här vyn, vilket gör det enklare att felsöka flera 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 Event Hubs-mått i Azure Monitor är av intresse för att samla in användbara insikter för händelsehubbar (till exempel aggregeringar av inkommande begäranden, utgående begäranden, begränsade begäranden, lyckade begäranden, inkommande meddelanden, utgående meddelanden, insamlade meddelanden, inkommande byte, utgående byte, insamlade byte, användarfel).

  • Azure Functions-mått delar många av måtten från Azure App Service, med tillägg av antalet funktionskörningar och funktionskörningsenheter som kan användas för att förstå användningen och kostnaden för förbrukningsplanen. Andra mått av intresse är anslutningar, indata, utdata, genomsnittlig minnesarbetsuppsättning, antal trådar, begäranden och svarstid.

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 Telemetri för Azure Functions 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 Konfigurera övervakning för Azure Functions.

Följande är ett exempel på extra telemetri för händelsehubbar 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 :t (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 ansluter till en händelsehubb med hjälp av en utdatabindning skrivs även poster till tabellen Application Insights Dependencies.

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 W3C Trace Context-formatet 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ändelsehubbhä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 batchutskick 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 klockdrift 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 sändningsfö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 leverans av meddelanden 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 leveranssvarstid

Den här frågan visualiserar svarstiden för den 50:e och 90:e percentilhändelsen för en viss händelsehubbutlöst funktion. Mer information och anteckningar finns i ovanstående fråga.

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äntan 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-utlösta Azure Functions resulterar följande fråga till exempel 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ösardetaljspårningen visar den köande tiden för endast den första händelsen för 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 några) 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. Det har ursprungligen skrivits av följande medarbetare.

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: