Probleemoplossingsgids voor Durable Functions
Durable Functions is een uitbreiding van Azure Functions waarmee u serverloze indelingen kunt bouwen met behulp van gewone code. Zie het overzicht van Durable Functions voor meer informatie over Durable Functions.
Dit artikel bevat een handleiding voor het oplossen van problemen met veelvoorkomende scenario's in Durable Functions-apps.
Notitie
Microsoft-ondersteuningstechnici zijn beschikbaar om te helpen bij het diagnosticeren van problemen met uw toepassing. Als u uw probleem niet kunt vaststellen met behulp van deze handleiding, kunt u een ondersteuningsticket indienen door naar de blade Nieuwe ondersteuningsaanvraag te gaan in de sectie Ondersteuning en probleemoplossing van de pagina van uw functie-app in de Azure Portal.
Tip
Bij het opsporen en diagnosticeren van problemen is het raadzaam om ervoor te zorgen dat uw app de nieuwste Durable Functions extensieversie gebruikt. Meestal beperkt het gebruik van de nieuwste versie bekende problemen die al zijn gemeld door andere gebruikers. Lees het artikel Upgrade Durable Functions extensieversie voor instructies over het upgraden van uw extensieversie.
Het tabblad Problemen vaststellen en oplossen in de Azure Portal is een handige resource voor het controleren en diagnosticeren van mogelijke problemen met betrekking tot uw toepassing. Het biedt ook mogelijke oplossingen voor uw problemen op basis van de diagnose. Zie Diagnostische gegevens van Azure Function-apps voor meer informatie.
Als het probleem niet is opgelost met de bovenstaande resources, bieden de volgende secties advies voor specifieke toepassingssymptomen:
Indeling is vastgelopen in de Pending
status
Wanneer u een indeling start, wordt een 'start'-bericht geschreven naar een interne wachtrij die wordt beheerd door de Durable-extensie en wordt de status van de indeling ingesteld op 'In behandeling'. Nadat het indelingsbericht is opgehaald en verwerkt door een beschikbaar app-exemplaar, wordt de status overgezet naar 'Actief' (of naar een andere status die niet in behandeling is).
Gebruik de volgende stappen om problemen met indelingsexemplaren op te lossen die voor onbepaalde tijd vastzitten in de status 'In behandeling'.
Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten voor de id van het betrokken indelingsexemplaar. Een voorbeeldquery vindt u in de sectie Fouten/waarschuwingen traceren.
Controleer de Azure Storage-besturingselementwachtrijen die zijn toegewezen aan de vastgelopen orchestrator om te zien of het 'startbericht' er nog steeds is voor meer informatie over besturingswachtrijen, raadpleegt u de documentatie over de beheerwachtrij van de Azure Storage-provider.
Wijzig de platformconfiguratieversie van uw app in '64-bits'. Soms worden indelingen niet gestart omdat de app onvoldoende geheugen heeft. Als u overschakelt naar het 64-bits proces, kan de app meer totaal geheugen toewijzen. Dit geldt alleen voor App Service Basic-, Standard-, Premium- en Elastic Premium-abonnementen. Gratis of verbruiksabonnementen bieden geen ondersteuning voor 64-bits processen.
Indeling wordt gestart na een lange vertraging
Normaal gesproken beginnen indelingen binnen enkele seconden nadat ze zijn gepland. Er zijn echter bepaalde gevallen waarin indelingen langer kunnen duren om te starten. Gebruik de volgende stappen om problemen op te lossen wanneer het meer dan een paar seconden duurt voordat indelingen worden uitgevoerd.
Raadpleeg de documentatie over vertraagde indelingen in Azure Storage om te controleren of de vertraging kan worden veroorzaakt door bekende beperkingen.
Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten met de id van het betrokken indelingsexemplaar. Een voorbeeldquery vindt u in de sectie Fouten/waarschuwingen traceren.
Indeling wordt niet voltooid/is vastgelopen in de Running
status
Als een indeling gedurende een lange periode in de status 'Actief' blijft, betekent dit meestal dat deze wacht op een langlopende taak die is gepland om te worden voltooid. Het kan bijvoorbeeld wachten tot een duurzame timertaak, een activiteitstaak of een externe gebeurtenistaak is voltooid. Als u echter merkt dat geplande taken met succes zijn voltooid, maar de indeling nog steeds geen voortgang maakt, is er mogelijk een probleem dat verhindert dat de indeling doorgaat naar de volgende taak. Indelingen in deze status worden vaak 'vastgelopen indelingen' genoemd.
Gebruik de volgende stappen om vastgelopen indelingen op te lossen:
Start de functie-app opnieuw. Deze stap kan helpen als de indeling vastloopt vanwege een tijdelijke fout of impasse in de app of de extensiecode.
Controleer de azure storage-accountbeheerwachtrijen om te zien of er wachtrijen voortdurend groeien. Deze KQL-query voor Azure Storage-berichten kan helpen bij het identificeren van problemen met het verwijderen van indelingsberichten. Als het probleem slechts van invloed is op één beheerwachtrij, kan dit duiden op een probleem dat alleen op een specifiek app-exemplaar bestaat. In dat geval kan omhoog of omlaag schalen om het beschadigde VM-exemplaar te verwijderen, helpen.
Gebruik de Application Insights-query in de sectie Azure Storage Messaging om te filteren op die wachtrijnaam als partitie-id en te zoeken naar eventuele problemen met betrekking tot die beheerwachtrijpartitie.
Raadpleeg de richtlijnen in Durable Functions Best practice en diagnostische hulpprogramma's. Sommige problemen kunnen worden veroorzaakt door bekende Durable Functions antipatronen.
Raadpleeg de documentatie voor Durable Functions Versiebeheer. Sommige problemen kunnen worden veroorzaakt door wijzigingen die fouten veroorzaken in in-flight indelingsexemplaren.
Indeling wordt langzaam uitgevoerd
Zware gegevensverwerking, interne fouten en onvoldoende rekenresources kunnen ertoe leiden dat indelingen langzamer dan normaal worden uitgevoerd. Gebruik de volgende stappen om problemen op te lossen met indelingen die langer duren dan verwacht om uit te voeren:
Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten voor de id van het betrokken indelingsexemplaar. Een voorbeeldquery vindt u in de sectie Fouten/waarschuwingen traceren.
Als uw app gebruikmaakt van het in-process-model van .NET, kunt u overwegen om uitgebreide sessies in te schakelen. Uitgebreide sessies kunnen de belasting van de geschiedenis minimaliseren, waardoor de verwerking kan worden vertraagd.
Controleer op knelpunten voor prestaties en schaalbaarheid. De prestaties van toepassingen zijn afhankelijk van veel factoren. Een hoog CPU-gebruik of een groot geheugenverbruik kan bijvoorbeeld leiden tot vertragingen. Lees Prestaties en schalen in Durable Functions voor gedetailleerde richtlijnen.
Voorbeeldquery's
In deze sectie wordt beschreven hoe u problemen kunt oplossen door aangepaste KQL-query's te schrijven in het Azure-toepassing Insights-exemplaar dat is geconfigureerd voor uw Azure Functions-app.
Azure Storage Messaging
Wanneer u de standaard Azure Storage-provider gebruikt, wordt al Durable Functions gedrag aangestuurd door Azure Storage-wachtrijberichten en wordt alle status met betrekking tot een indeling opgeslagen in table storage en blob storage. Wanneer Durable Task Framework-tracering is ingeschakeld, worden alle Azure Storage-interacties vastgelegd in Application Insights. Deze gegevens zijn van cruciaal belang voor het opsporen van problemen met de uitvoering en prestaties.
Vanaf v2.3.0 van de extensie Durable Functions kunt u deze Durable Task Framework-logboeken publiceren naar uw Application Insights-exemplaar door de logboekconfiguratie in het bestand host.json bij te werken. Zie het artikel Durable Task Framework-logboekregistratie voor informatie en instructies over hoe u dit doet.
De volgende query is voor het inspecteren van end-to-end Azure Storage-interacties voor een specifiek indelingsexemplaar. Bewerk start
en orchestrationInstanceID
om te filteren op tijdsbereik en exemplaar-id.
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
let orchestrationInstanceID = "XXXXXXX"; //edit this
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = customDimensions["prop__PartitionId"]
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Fouten/waarschuwingen traceren
Met de volgende query wordt gezocht naar fouten en waarschuwingen voor een bepaald indelingsexemplaar. U moet een waarde opgeven voor orchestrationInstanceID
.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX);
traces
| where timestamp > start and timestamp < start + 1h
| extend instanceId = iif(isnull(customDimensions["prop__InstanceId"] ) , customDimensions["prop__instanceId"], customDimensions["prop__InstanceId"] )
| extend logLevel = customDimensions["LogLevel"]
| extend functionName = customDimensions["prop__functionName"]
| extend status = customDimensions["prop__status"]
| extend details = customDimensions["prop__Details"]
| extend reason = customDimensions["prop__reason"]
| where severityLevel > 1 // to see all logs of severity level "Information" or greater.
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
Logboeken voor beheerwachtrij/partitie-id's
Met de volgende query wordt gezocht naar alle activiteiten die zijn gekoppeld aan de beheerwachtrij van een instanceId. U moet de waarde voor de instanceID in orchestrationInstanceID
en de begintijd van de query opgeven in start
.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
traces // determine control queue for this orchestrator
| where timestamp > start and timestamp < start + 1h
| extend instanceId = customDimensions["prop__TargetInstanceId"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| where partitionId contains "control"
| where instanceId == orchestrationInstanceID
| join kind = rightsemi(
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
) on partitionId
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Verwijzing naar Application Insights-kolommen
Hieronder vindt u een lijst met de kolommen die worden geprojecteerd door de bovenstaande query's en de bijbehorende beschrijvingen.
Kolom | Beschrijving |
---|---|
Pid | Proces-id van het exemplaar van de functie-app. Dit is handig om te bepalen of het proces is gerecycled terwijl een indeling werd uitgevoerd. |
taskName | De naam van de gebeurtenis die wordt geregistreerd. |
eventType | Het type bericht, dat meestal werk vertegenwoordigt dat door een orchestrator wordt uitgevoerd. Een volledige lijst met de mogelijke waarden en hun beschrijvingen vindt u hier |
extendedSession | Booleaanse waarde die aangeeft of uitgebreide sessies zijn ingeschakeld. |
account | Het opslagaccount dat door de app wordt gebruikt. |
details | Aanvullende informatie over een bepaalde gebeurtenis, indien beschikbaar. |
instanceId | De id voor een bepaalde indeling of entiteitsexemplaar. |
messageId | De unieke Azure Storage-id voor een bepaald wachtrijbericht. Deze waarde wordt meestal weergegeven in de traceringsgebeurtenissen ReceivedMessage, ProcessingMessage en DeletingMessage. Houd er rekening mee dat deze NIET aanwezig is in SendMessage-gebeurtenissen omdat de bericht-id wordt gegenereerd door Azure Storage nadat we het bericht hebben verzonden. |
executionId | De id van de orchestratoruitvoering, die wordt gewijzigd wanneer continue-as-new wordt aangeroepen. |
leeftijd | Het aantal milliseconden sinds een bericht is beëindigd. Grote getallen duiden vaak op prestatieproblemen. Een uitzondering hierop is het berichttype TimerFired, dat een grote leeftijdswaarde kan hebben, afhankelijk van de duur van de timer. |
latentieM's | Het aantal milliseconden dat is gebruikt door een opslagbewerking. |
dequeueCount | Het aantal keren dat een bericht uit de wachtrij is verwijderd. Onder normale omstandigheden is deze waarde altijd 1. Als het meer dan één is, is er mogelijk een probleem. |
partitionId | De naam van de wachtrij die aan dit logboek is gekoppeld. |
totalEventCount | Het aantal geschiedenis gebeurtenissen dat betrokken is bij de huidige actie. |
taskHub | De naam van uw taakhub. |
newEvents | Een door komma's gescheiden lijst met geschiedenisgebeurtenissen die naar de tabel Geschiedenis in de opslag worden geschreven. |