Azure Functions en Event Hubs bewaken

Azure Event Hubs
Azure Functions
Azure Monitor

Bewaking biedt inzicht in het gedrag en de status van uw systemen en helpt bij het bouwen van een holistische weergave van de omgeving, historische trends, het correleren van diverse factoren en het meten van wijzigingen in prestaties, verbruik of foutpercentage.

Azure Functions biedt ingebouwde integratie met Application Insights. Vanuit Application Insights kunt u informatie ophalen, zoals het aantal exemplaren van de functie-app of de aanvraag- en afhankelijkheidstelemetrie van een functie. Wanneer u met Functions en Event Hubs werkt, kan Application Insights ook de uitgaande afhankelijkheidstelemetrieën naar de Event Hub bijhouden, de tijd berekenen die in de wachtrij is doorgebracht en de end-to-end-stroom weergeven van het systeem dat is verbonden via Event Hubs.

In deze sectie worden nuttige functies en inzichten beschreven die u kunt verkrijgen uit Application Insights voor uw Event Hubs plus Functions-oplossing.

Toepassingskaart

Toepassingsoverzicht laat zien hoe de onderdelen in een systeem met elkaar communiceren. Vanwege de afhankelijkheidstelemetrie die Application Insights biedt, wordt de stroom van gebeurtenissen tussen Azure Functions en Event Hubs in kaart gebracht, inclusief het gemiddelde van elke functie-uitvoering en de gemiddelde duur van een gebeurtenis in Event Hubs, evenals het weergeven van transacties die fouten bevatten die rood zijn gemarkeerd.

Nadat u de verwachte belasting naar uw systeem hebt verzonden, gaat u naar Application Insights in de Azure Portal en kiest u op de zijbalk toepassingsoverzicht. Hier ziet u een kaart met drie functies, drie Event Hubs en zichtbare fouten bij het schrijven naar een downstreamdatabase:

Toepassingskaart

End-to-end transactiedetails

End-to-end transactiedetails laten zien hoe uw systeemonderdelen met elkaar communiceren, in chronologische volgorde. In deze weergave ziet u ook hoe lang een gebeurtenis in de wachtrij heeft gezeten. U kunt ook inzoomen op de telemetrie van elk onderdeel vanuit deze weergave, zodat u gemakkelijker problemen kunt oplossen tussen onderdelen binnen dezelfde aanvraag wanneer er een probleem optrad.

End-to-end transactie

Metrische platformgegevens en telemetrie

Door het platform gegenereerde metrische gegevens in Azure Monitor voor Event Hubs en Azure Functions kunnen worden gebruikt voor het algemene bewaken van het gedrag en de status van de oplossing:

Azure Functions integreert met Application Insights om geavanceerde en gedetailleerde telemetrie en inzichten te bieden in de uitvoeringen van de Functions-host en -functie. Zie Azure Functions telemetrie analyseren in Application Insights voor meer informatie. Wanneer u Application Insights gebruikt om een topologie te bewaken, zijn er verschillende configuraties beschikbaar. Zie Bewaking configureren voor Azure Functions voor meer informatie.

Hier volgt een voorbeeld van extra telemetrie voor door Event Hubs geactiveerde functies die zijn gegenereerd in de traceringentabel :

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

Voor deze informatie moet u de Event Hubs-extensie 4.2.0 of een latere versie gebruiken. Deze gegevens zijn zeer nuttig omdat ze informatie bevatten over het bericht dat de uitvoering van de functie heeft geactiveerd en kunnen worden gebruikt voor het uitvoeren van query's en inzichten. Het bevat de volgende gegevens voor elke keer dat de functie wordt geactiveerd:

  • De partitie-id (6)
  • Het partitieverschilbereik (3985758552064-3985758624640)
  • Het tijdsbereik voor enqueue in UTC (2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00)
  • Het reeksnummerbereik 3712266-3712275
  • En het aantal berichten (10)

Raadpleeg de sectie Voorbeeldquery's van Application Insights voor voorbeelden van het gebruik van deze telemetrie.

Aangepaste telemetrie is ook mogelijk voor verschillende talen (C#-klassebibliotheek, C# Isolated, C# Script, JavaScript, Java, PowerShell en Python). Deze logboekregistratie wordt weergegeven in de traceertabel in Application Insights. U kunt uw eigen vermeldingen maken in Application Insights en aangepaste dimensies toevoegen die kunnen worden gebruikt voor het uitvoeren van query's op gegevens en het maken van aangepaste dashboards.

Ten slotte worden vermeldingen ook naar de tabel Application Insights-afhankelijkheden geschreven wanneer uw functie-app verbinding maakt met een Event Hub met behulp van een uitvoerbinding.

Tabel met afhankelijkheden

Voor Event Hubs wordt de correlatie geïnjecteerd in de nettolading van de gebeurtenis en ziet u de eigenschap Diagnostic-Id in gebeurtenissen:

Eigenschap Diagnostische id

Dit volgt de W3C Trace Context-indeling die ook wordt gebruikt als Bewerkings-id en Bewerkingskoppelingen in telemetrie die door Functions is gemaakt, waardoor Application Insights de correlatie tussen Event Hub-gebeurtenissen en functie-uitvoeringen kan samenstellen, zelfs wanneer deze zijn gedistribueerd.

Correlatie van batchgebeurtenissen

Voorbeeld van Application Insights-query's

Hieronder vindt u een lijst met nuttige Application Insights-query's bij het bewaken van Event Hubs met Azure Functions. Deze query geeft gedetailleerde informatie weer voor de door Event Hub geactiveerde functie met behulp van telemetrie die wordt verzonden door de Event Hubs-extensie 4.2.0 en hoger.

Wanneer steekproeven zijn ingeschakeld in Application Insights, kunnen er hiaten in de gegevens zijn.

Gedetailleerde informatie over gebeurtenisverwerking

De gegevens worden alleen in de juiste indeling verzonden wanneer verzending in batches wordt gebruikt. Batch-verzending betekent dat de functie meerdere gebeurtenissen accepteert voor elke uitvoering, wat wordt aanbevolen voor prestaties. Houd rekening met de volgende overwegingen:

  • De dispatchTimeMilliseconds waarde benadert de tijdsduur tussen het moment waarop de gebeurtenis naar de Event Hub is geschreven en het moment waarop deze door de functie-app is opgehaald voor verwerking.
  • dispatchTimeMilliseconds kan negatief of anderszins onnauwkeurig zijn vanwege klokdrift tussen de Event Hub-server en de functie-app.
  • Event Hubs-partities worden opeenvolgend verwerkt. Een bericht wordt pas verzonden naar de functiecode voor verwerking als alle vorige berichten zijn verwerkt. Bewaak de uitvoeringstijd van uw functies, omdat langere uitvoeringstijden leiden tot vertragingen bij de verzending.
  • De berekening maakt gebruik van de enqueueTime van het eerste bericht in de batch. Verzendtijden kunnen korter zijn voor andere berichten in de batch.
  • dispatchTimeMilliseconds is gebaseerd op het tijdstip.
  • Volgnummers zijn per partitie en dubbele verwerking kan optreden omdat Event Hubs niet exactly-once berichtbezorging garandeert.
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

Gedetailleerde gebeurtenisverwerking

Visualisatie van latentie verzenden

Deze query visualiseert de latentie van de verzending van gebeurtenissen in het 50e en 90e percentiel voor een bepaalde door Event Hub geactiveerde functie. Zie de bovenstaande query voor meer informatie en opmerkingen.

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

Visualisatie van verzendingslatentie

Overzicht van dispatchlatentie

Deze query is vergelijkbaar met de bovenstaande, maar toont een overzichtsweergave.

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

Samenvatting van verzendlatentie

Berichtdistributie over partities

Deze query laat zien hoe u berichtdistributie over partities kunt visualiseren.

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

Berichtdistributie over partities

Berichtdistributie over exemplaren

Deze query laat zien hoe u berichtdistributie over exemplaren kunt visualiseren.

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

Berichtdistributie over exemplaren

Instanties uitvoeren en toegewezen exemplaren

Deze query laat zien hoe u het aantal Azure Functions exemplaren kunt visualiseren dat gebeurtenissen van Event Hubs verwerkt, en het totale aantal exemplaren (verwerken en wachten op lease). Meestal moeten ze hetzelfde zijn.

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

Instanties uitvoeren en toegewezen exemplaren

Alle telemetriegegevens voor een specifieke functie-uitvoering

Het veld operation_Id kan worden gebruikt in de verschillende tabellen in Application Insights. Voor Event Hubs die worden geactiveerd Azure Functions resulteert de volgende query bijvoorbeeld in de triggergegevens, telemetrie uit logboeken in de functiecode en afhankelijkheden en uitzonderingen:

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

Alle telemetriegegevens voor een specifieke functie-uitvoering

End-to-end-latentie voor een gebeurtenis

Aangezien de eigenschap enqueueTimeUtc in de tracering van de triggerdetail alleen de tijd van de eerste gebeurtenis laat zien van elke batch die de functie heeft verwerkt, kan een geavanceerdere query worden gebruikt om de end-to-endlatentie van gebeurtenissen tussen twee functies met Event Hubs ertussen te berekenen. Met deze query worden de bewerkingskoppelingen (indien aanwezig) in de aanvraag van de tweede functie uitgebreid en wordt de eindtijd toegewezen aan dezelfde bijbehorende bewerkings-id van de eerste begintijd van de functie.

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

End-to-end-latentie voor een gebeurtenis

Medewerkers

Dit artikel wordt onderhouden door Microsoft. Het is oorspronkelijk geschreven door de volgende inzenders.

Hoofdauteur:

Als u niet-openbare LinkedIn-profielen wilt zien, meldt u zich aan bij LinkedIn.

Volgende stappen

Raadpleeg de volgende gerelateerde artikelen voor meer informatie: