Felsökningsguide för Durable Functions

Den här artikeln hjälper dig att felsöka vanliga scenarier i Durable Functions appar. Hitta ditt symptom i följande lista och följ de länkade stegen för att diagnostisera och lösa problemet.

Vanliga symtom

I Exempel på KQL-frågor för diagnostik av Durable Functions finns information om de KQL-diagnostiska frågorna som du kan köra i Application Insights.

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 statusen för orkestreringen är inställd på "Väntar". När en tillgänglig appinstans plockar upp och framgångsrikt bearbetar orkestreringsmeddelandet, så övergår statusen till "Körs" (eller till något annat tillstånd än "Väntar").

Följ dessa steg för att felsöka orkestreringsinstanser som fastnar i tillståndet "Väntar" utan tidsbegränsning.

  1. Kontrollera Durable Task Framework-spårningarna efter varningar eller fel för det berörda orkestreringsinstans-ID:t. Använd frågan Spåra fel och varningar i Application Insights för att söka efter fel som är relaterade till din instans.

  2. Kontrollera kontrollköerna i Azure Storage för att se om orkestreringens "startmeddelande" fortfarande finns kvar i kön. I Azure-portalen går du till ditt lagringskonto, väljer Queues och letar efter köer med prefixet control. Bakgrund till hur kontrollköer fungerar finns i dokumentationen för kontrollköer hos Azure Storage-provider.

  3. Ändra appens plattformskonfiguration till 64-bitars. Orkestreringar startar ibland inte eftersom minnet tar slut i appen. Genom att växla till en 64-bitarsprocess kan appen allokera mer totalt minne. Den här ändringen gäller endast för App Service Basic-, Standard-, Premium- och Elastic Premium-abonnemang. Kostnadsfria planer eller förbrukningsplaner stöder inte 64-bitarsprocesser.

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

Normalt startar orkestreringarna inom några sekunder efter att de har schemalagts. Orkestrering kan dock ta längre tid att starta i vissa fall. Följ de här stegen för att felsöka när orkestrering tar mer än några sekunder att börja köra.

  1. Kontrollera om fördröjningen matchar en känd begränsning för Azure Storage-providern, till exempel ombalansering av partitioner eller timerbaserade avsökningsintervall.

  2. Kontrollera Durable Task Framework-spårningarna för fel eller varningar med ID för den berörda orkestreringsinstansen. Använd frågan Spåra fel och varningar i Application Insights för att söka efter fel som är relaterade till din instans.

Orkestreringen har fastnat i tillståndet Running

Om orkestreringsstatusen visar "Körs" längre än förväntat, eller om den verkar ha slutat att göra framsteg, väntar orkestreringen troligen på en uppgift som inte har slutförts. Den kan till exempel vänta på en hållbar timer, en aktivitetssyssla eller en extern händelse. Om schemalagda aktiviteter har slutförts men orkestreringen fortfarande inte avancerar kan det finnas ett problem som hindrar den från att fortsätta till nästa steg. Orkestreringar i det här tillståndet kallas ofta "fastnade orkestreringar".

Följ dessa steg för att felsöka fastnade orkestreringar:

  1. 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.

  2. Kontrollera Azure Storage kontokontrollköer för att se om några köer växer kontinuerligt. Använd meddelandefrågan Azure Storage i Application Insights för att identifiera problem med att avqueuera orkestreringsmeddelanden. Om problemet bara påverkar en enskild kontrollkö kan det tyda på ett problem på en specifik appinstans. I så fall kan det vara bra att skala upp eller ned för att flytta från den felaktiga vm-instansen.

  3. Filtrera Azure Storage-frågaresultat för meddelanden efter könamnet som partitions-ID för att upptäcka problem relaterade till den specifika kontrollköens partition.

  4. Kontrollera dokumentationen för Durable Functions Versionshantering. Icke-bakåtkompatibla ändringar i orkestreringsinstanser under flygning kan orsaka fastnade orkestreringar.

Orkestreringen tar längre tid än förväntat att slutföras

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

  1. Kontrollera Durable Task Framework-spårningarna efter varningar eller fel för det påverkade orkestreringsinstans-ID:t. Använd frågan Spåra fel och varningar i Application Insights för att söka efter fel som är relaterade till din instans.

  2. Om din app använder .NET in-process-modell, kan du överväga att aktivera förlängda sessioner. Utökade sessioner minimerar historikbelastningen, vilket kan göra bearbetningen långsammare.

  3. Identifiera flaskhalsar för prestanda och skalbarhet. Hög CPU-användning eller stor minnesförbrukning kan orsaka fördröjningar. Detaljerad vägledning finns i Prestanda och skala i Durable Functions.

Exempel på KQL-frågor för Durable Functions diagnostik

Felsöka problem genom att skriva anpassade KQL-frågor i Azure Application Insights-instansen som konfigurerats för din Azure Functions-app. Kolumndefinitioner som används i dessa frågor finns i kolumnreferensen.

Azure Storage meddelanden

När du använder standardprovidern Azure Storage styrs 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 du aktiverar Durable Task Framework-spårning loggas alla Azure Storage interaktioner till Application Insights. 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 publicera dessa Durable Task Framework-loggar till Application Insights-instansen genom att uppdatera loggningskonfigurationen i filen host.json. Mer information finns i artikeln om durable task framework-loggning.

Följande fråga inspekterar 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åra fel och varningar

Följande fråga söker efter fel och varningar för en viss orkestreringsinstans. 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 

Kontrollera kö- och partitions-ID-loggar

Följande fråga söker efter all aktivitet som är associerad med ett instanceId:s kontrollkö. 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 för Durable Functions-sökfrågor

I följande tabell visas de kolumner som projiceras av föregående frågor och deras beskrivningar.

Kolumn Beskrivning
pid Process-ID för funktionsappinstansen. Det här värdet är användbart för att kontrollera om processen återvanns när en orkestrering kördes.
uppgiftsnamn Namnet på händelsen som loggas.
eventType 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 i EventType.cs.
förlängd session Booleskt värde som anger om utökade sessioner är aktiverade.
konto Lagringskontot som används av appen.
details 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. Det här värdet finns inte i SendingMessage-händelser eftersom meddelande-ID:t genereras av Azure Storage after meddelandet skickas.
executionId ID för orchestratorns körning, som ändras så ofta 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 värde för ålder beroende på timerns varaktighet.
latencyMs Antalet millisekunder som krävs för en lagringsoperation.
dequeueCount Hur många gånger ett meddelande har ignorerats. 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.

Problem med anslutningshantering i förbrukningsplanen

Appar som körs i Azure Functions-förbrukningsplanen omfattas av anslutningsgränser. Vanliga symtom är:

  • Tillfälliga anslutningsfel vid anrop av aktivitetsfunktioner eller externa tjänster.
  • Orkestreringar som misslyckas sporadiskt under belastning.
  • Socket-överbelastningsfel i loggarna.

Minska anslutningsanvändningen genom att använda HttpClientFactory eller dela statiska klienter i stället för att skapa nya HttpClient instanser i varje funktionsanrop. Detaljerad vägledning om anslutningspooler och metodtips finns i Hantera anslutningar i Azure Functions.

Allmänna tips

Tips/Råd

Innan du går in på specifika felsökningssteg bör du 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. Anvisningar om hur du uppgraderar finns i Upgrade Durable Functions-tilläggsversion.

Fliken Diagnose och lösa problem i Azure-portalen kan hjälpa dig att övervaka och diagnostisera problem som rör ditt program och föreslå potentiella lösningar. Mer information finns i Azure Funktionsappdiagnostik.

Få support för Durable Functions-ärenden

Om du inte kan lösa problemet med hjälp av den här guiden kan du skicka ett supportärende genom att öppna bladet Ny supportbegäran på bladet Support + felsökning på funktionsappsidan i Azure portalen.

Skärmdump av sidan supportbegäran på Azure-portalen.

Öppna ett problem i någon av följande GitHub lagringsplatser för frågor och communitystöd. När du rapporterar en bugg ska du inkludera information som berörda instans-ID:er, tidsintervall i UTC som visar problemet, programnamnet (om möjligt) och distributionsregionen för att påskynda undersökningar.