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 Durable Functions översikt.

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

Anteckning

Microsofts supporttekniker är tillgängliga för att hjälpa till att diagnostisera problem med ditt program. Om du inte kan diagnostisera problemet med hjälp av den här guiden kan du skapa en supportbegäran genom att öppna bladet Ny supportbegäran i avsnittet Support + felsökning på funktionsappsidan i Azure Portal.

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

Tips

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. Läs artikeln Upgrade Durable Functions extension version (Uppgradera Durable Functions-tilläggsversion) för anvisningar om hur du uppgraderar din tilläggsversion.

Fliken Diagnostisera och lösa problem i Azure Portal ä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äntande).

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

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

  • Kontrollera De Azure Storage-kontrollköer som har tilldelats den fastnade dirigeraren för att se om dess "startmeddelande" fortfarande finns kvar. Mer information om kontrollköer finns i dokumentationen om Azure Storage-providerkontrollköer.

  • Ändra appens plattformskonfigurationsversion till "64-bitars". Ibland startar inte orkestreringarna eftersom programmet får slut på minne. Genom att växla till 64-bitarsprocess kan appen allokera mer totalt minne. Detta gäller endast för App Service Basic-, Standard-, Premium- och Elastic Premium-planer. 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 att starta. 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 aktivitet som är schemalagd att slutföras. Den kan till exempel vänta på att en varaktig timeraktivitet, en aktivitetsaktivitet eller en extern händelseaktivitet ska slutföras. Men om du ser att schemalagda aktiviteter har slutförts men orkestreringen fortfarande inte pågår, kan det finnas ett problem som hindrar orkestreringen från att fortsätta till nästa uppgift. Vi kallar ofta orkestreringar i det här tillståndet för "fastnade orkestreringar".

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

  • Prova att starta om funktionsappen. Det här steget kan hjälpa dig 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, i vilket fall det kan vara till hjälp att skala upp eller ned för att flytta bort den felaktiga VM-instansen.

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

  • Läs vägledningen i Durable Functions metodtips och diagnostikverktyg. Vissa problem kan orsakas av kända Durable Functions antimönster.

  • Läs dokumentationen om Durable Functions versionshantering. Vissa problem kan orsakas av icke-bakåtkompatibla orkestreringsinstanser.

Orkestrering 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:

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

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

  • Kontrollera prestanda- och skalbarhetsflaskhalsar. Programprestanda beror på många faktorer. Till exempel kan hög CPU-användning eller stor minnesförbrukning leda till fördröjningar. Mer information finns i Prestanda och skalning i Durable Functions.

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 styrs allt Durable Functions beteende av Azure Storage-kömeddelanden och alla tillstånd som är relaterade till en orkestrering lagras i tabellagring och bloblagring. När Durable Task Framework-spårning är aktiverat loggas alla Azure Storage-interaktioner i 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 till Application Insights-instansen genom att uppdatera loggningskonfigurationen i filen host.json. Se loggningsartikeln för Durable Task Framework för information och instruktioner om hur du gör detta.

Följande fråga handlar om 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 kontrollkön för ett instanceId. 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 återvanns medan en orkestrering kördes.
taskName Namnet på händelsen som loggas.
Händelsetyp Typen av meddelande, som vanligtvis representerar arbete som utförts av en orkestrerare. En fullständig lista över möjliga värden och deras beskrivningar finns här
extendedSession Booleskt värde som anger om utökade sessioner är aktiverade.
konto Lagringskontot som används av appen.
information Ytterligare information om en viss händelse, om tillgänglig.
instanceId ID:t för en viss orkestrerings- eller entitetsinstans.
messageId Det unika Azure Storage-ID:t för ett angivet kömeddelande. Det här värdet visas oftast i Spårningshändelser för ReceivedMessage, ProcessingMessage och Ta bortMessage. Observera att det INTE finns i SendMessage-händelser eftersom meddelande-ID:t genereras av Azure Storage när vi har skickat meddelandet.
executionId ID:t för orchestrator-körningen, som ändras när den continue-as-new anropas.
ålder Antalet millisekunder sedan ett meddelande angavs. Stora tal indikerar ofta prestandaproblem. Ett undantag är meddelandetypen TimerFired, som kan ha ett stort åldersvärde beroende på timerns varaktighet.
latencyMs Antalet millisekunder som tagits av en viss lagringsåtgärd.
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 associerad med den här loggen.
totalEventCount Antalet historikhändelser som ingår i den aktuella åtgärden.
taskHub Namnet på aktivitetshubben.
newEvents En kommaavgränsad lista över historikhändelser som skrivs till tabellen Historik i lagringen.