Dela via


Felsökningsguide för Durable Functions

Durable Functions är ett tillägg till Azure Functions som gör att du kan skapa serverlösa orkestreringar med vanlig kod. Mer information om Durable Functions finns i översikten över Durable Functions.

Den här artikeln innehåller en guide för felsökning av vanliga scenarier i Durable Functions-appar.

Anmärkning

Microsofts supporttekniker är tillgängliga för att hjälpa dig att diagnostisera problem med ditt program. Om du inte kan diagnostisera problemet med hjälp av den här guiden kan du skicka ett supportärende genom att gå till bladet Ny supportbegäran i avsnittet Support + felsökning på funktionsappsidan i Azure-portalen.

Skärmbild av sidan för supportbegäran i Azure-portalen.

Tips/Råd

När du felsöker och diagnostiserar problem rekommenderar vi att du börjar med att se till att din app använder den senaste versionen av Durable Functions-tillägget. För det mesta minskar användningen av den senaste versionen kända problem som redan rapporterats av andra användare. Mer information om hur du uppgraderar tilläggsversionen finns i artikeln Uppgradera Durable Functions-tillägget .

Fliken Diagnostisera och lösa problem i Azure-portalen är en användbar resurs för att övervaka och diagnostisera eventuella problem som rör ditt program. Det ger också potentiella lösningar på dina problem baserat på diagnosen. Mer information finns i Diagnostik för Azure-funktionsappen .

Om resurserna ovan inte löste problemet ger följande avsnitt råd om specifika programsymtom:

Orkestreringen har fastnat i tillståndet Pending

När du startar en orkestrering skrivs ett "start"-meddelande till en intern kö som hanteras av Durable-tillägget, och orkestreringens status anges till "Väntar". När orkestreringsmeddelandet hämtas och bearbetas av en tillgänglig appinstans, övergår statusen till "Körs" (eller till något annat tillstånd som inte är "Väntar").

Använd följande steg för att felsöka orkestreringsinstanser som förblir fast på obestämd tid i tillståndet "Väntar".

  • Kontrollera Durable Task Framework-spårningarna efter varningar eller fel för det påverkade orkestreringsinstans-ID:t. En exempelfråga finns i avsnittet Spårningsfel/varningar.

  • Kontrollera de Azure Storage-kontrollköer som tilldelats den fastnade orkestratorn för att se om dess "startmeddelande" fortfarande finns där För mer information om kontrollköer, se dokumentationen om Azure Storage-providerns kontrollkö.

  • Ändra appens plattformskonfigurationsversion till "64-bitars". Ibland startar inte orkestreringar eftersom minnet tar slut i appen. Om du byter till 64-bitarsprocess kan appen allokera mer totalt minne. Detta gäller endast för App Service Basic-, Standard-, Premium- och Elastic Premium-abonnemang. Kostnadsfria planer eller förbrukningsplaner stöder inte 64-bitarsprocesser.

Orkestreringen startar efter en lång fördröjning

Normalt startar orkestreringarna inom några sekunder efter att de har schemalagts. Det finns dock vissa fall där orkestreringar kan ta längre tid innan de startar. Använd följande steg för att felsöka när orkestreringar tar mer än några sekunder att börja köra.

Orkestreringen slutförs inte/har fastnat i tillståndet Running

Om en orkestrering förblir i tillståndet "Körs" under en längre tid innebär det vanligtvis att den väntar på en tidskrävande uppgift som är schemalagd att slutföras. Den kan till exempel vänta på att en varaktig timertidsuppgift, en aktivitetsuppgift eller en extern händelseuppgift ska slutföras. Men om du observerar att schemalagda aktiviteter har slutförts men orkestreringen fortfarande inte fortsätter kan det finnas ett problem som hindrar orkestreringen från att fortsätta till nästa uppgift. Vi refererar ofta till orkestreringar i det här tillståndet som "fastnade orkestreringar".

Använd följande steg för att felsöka fastnade orkestreringar:

  • Prova att starta om funktionsappen. Det här steget kan vara till hjälp om orkestreringen fastnar på grund av en tillfällig bugg eller ett dödläge i appen eller tilläggskoden.

  • Kontrollera azure storage-kontokontrollköerna för att se om några köer växer kontinuerligt. Den här KQL-frågan för Azure Storage-meddelanden kan hjälpa dig att identifiera problem med att avqueuera orkestreringsmeddelanden. Om problemet bara påverkar en enskild kontrollkö kan det tyda på ett problem som bara finns på en specifik appinstans, och i så fall kan det vara till hjälp att skala upp eller ned för att byta bort från den ohälsosamma VM-instansen.

  • Använd Application Insights-frågan i avsnittet Azure Storage Messaging för att filtrera efter könamnet som partitions-ID och leta efter eventuella problem som rör den kontrollköpartitionen.

  • Läs riktlinjerna i Metodtips och diagnostikverktyg för Durable Functions. Vissa problem kan orsakas av kända durable functions-antimönster.

  • Läs dokumentationen om Durable Functions-versionshantering. Vissa problem kan orsakas av kompatibilitetsbrytande ändringar i pågående orkestreringsinstanser.

Orkestreringen körs långsamt

Tung databearbetning, interna fel och otillräckliga beräkningsresurser kan göra att orkestreringarna körs långsammare än normalt. Använd följande steg för att felsöka orkestreringar som tar längre tid än förväntat att köra:

  • Kontrollera Durable Task Framework-spårningarna efter varningar eller fel för det berörda orkestreringsinstans-ID:t. En exempelfråga finns i avsnittet Spårningsfel/varningar.

  • Om din app använder .NET-in-processmodellen bör du överväga att aktivera utökade sessioner. Utökade sessioner kan minimera historikbelastningar, vilket kan göra bearbetningen långsammare.

  • Identifiera flaskhalsar för prestanda och skalbarhet. Programprestanda beror på många faktorer. Till exempel kan hög CPU-användning eller stor minnesförbrukning leda till fördröjningar. Läs Prestanda och skala i Durable Functions för detaljerad vägledning.

Exempelfrågor

Det här avsnittet visar hur du felsöker problem genom att skriva anpassade KQL-frågor i Azure Application Insights-instansen som konfigurerats för din Azure Functions-app.

Azure Storage-meddelanden

När du använder Azure Storage-standardprovidern drivs allt Durable Functions-beteende av Azure Storage-kömeddelanden och alla tillstånd som är relaterade till en orkestrering lagras i tabelllagring och bloblagring. När Durable Task Framework-spårning är aktiverat loggas alla Azure Storage-interaktioner till Application Insights, och dessa data är mycket viktiga för felsökning av körnings- och prestandaproblem.

Från och med v2.3.0 i Durable Functions-tillägget kan du ha dessa Durable Task Framework-loggar publicerade i Application Insights-instansen genom att uppdatera loggningskonfigurationen i host.json-filen. Se loggningsartikeln för Durable Task Framework för information och instruktioner om hur du gör detta.

Följande fråga gäller för att inspektera Azure Storage-interaktioner från slutpunkt till slutpunkt för en specifik orkestreringsinstans. Redigera start och orchestrationInstanceID filtrera efter tidsintervall och instans-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

Spårningsfel/varningar

Följande fråga söker efter fel och varningar för en viss orkestreringsinstans. Du måste ange ett värde för 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 

Kontrollkö / partitions-ID-loggar

Följande fråga söker efter all aktivitet som är associerad med ett instanceId:s kontrollkö. Du måste ange värdet för instanceID i orchestrationInstanceID och frågans starttid i 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

Application Insights-kolumnreferens

Nedan visas en lista över de kolumner som projiceras av frågorna ovan och deras respektive beskrivningar.

Kolumn Beskrivning
pid Process-ID för funktionsappinstansen. Detta är användbart för att avgöra om processen startades om medan en orkestrering utfördes.
uppgiftsnamn Namnet på händelsen som loggas.
evenemangstyp Typen av meddelande, som vanligtvis representerar arbete som utförs av en orkestrerare. En fullständig lista över möjliga värden och deras beskrivningar finns här
förlängd session Booleskt värde som anger om utökade sessioner är aktiverade.
konto Lagringskontot som används av appen.
Detaljer Ytterligare information om en viss händelse, om den är tillgänglig.
instanceId ID:t för en viss orkestrerings- eller entitetsinstans.
meddelande-id Det unika Azure Storage-ID:t för ett visst kömeddelande. Det här värdet visas oftast i Spårningshändelser för ReceivedMessage, ProcessingMessage och Ta bortMessage. Observera att den INTE finns i SendMessage-händelser eftersom meddelande-ID:t genereras av Azure Storage när vi har skickat meddelandet.
executionId ID för orchestrator-körningen, som ändras när continue-as-new anropas.
ålder Antalet millisekunder sedan ett meddelande angavs. Stora tal indikerar ofta prestandaproblem. Ett undantag är meddelandetypen TimerFired, som beroende på timerns varaktighet kan ha ett högt värde för ålder.
latens ms Antalet millisekunder som krävs för en lagringsoperation.
dequeueCount Antalet gånger ett meddelande har tagits bort. Under normala omständigheter är det här värdet alltid 1. Om det är mer än en kan det finnas ett problem.
partitionId Namnet på kön som är associerat med den här loggen.
totalEventCount Antalet historikhändelser som ingår i den aktuella åtgärden.
taskHub Namnet på aktivitetshubben.
nyaHändelser En kommaavgränsad lista över historikhändelser som skrivs till tabellen Historik i lagringen.