Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
- Orkestreringen har stannat kvar i vänteläge
- Orkestreringar startar efter en lång fördröjning
- Orkestreringen har fastnat i tillståndet 'Running'
- Orkestreringen tar längre tid än förväntat att slutföras
- Anslutningsfel i Consumption-planen
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.
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.
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.Ä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.
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.
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:
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ö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.
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.
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:
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.
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.
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.
Ö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.