Share via


Durable Functions hibaelhárítási útmutató

Durable Functions a Azure Functions kiterjesztése, amellyel kiszolgáló nélküli vezényléseket hozhat létre normál kóddal. A Durable Functions kapcsolatos további információkért tekintse meg a Durable Functions áttekintését.

Ez a cikk útmutatót nyújt Durable Functions alkalmazások gyakori forgatókönyveinek hibaelhárításához.

Megjegyzés

A Microsoft támogatási szakemberei segítséget nyújtanak az alkalmazással kapcsolatos problémák diagnosztizálásában. Ha ezzel az útmutatóval nem tudja diagnosztizálni a problémát, küldjön támogatási jegyet a függvényalkalmazás támogatási és hibaelhárítási szakaszának Új támogatási kérés paneljén a Azure Portal.

Képernyőkép az Azure Portal támogatási kérési oldaláról.

Tipp

A hibák hibakeresése és diagnosztizálása során javasoljuk, hogy először győződjön meg arról, hogy az alkalmazás a legújabb Durable Functions bővítményverziót használja. Az idő nagy részében a legújabb verzió használata csökkenti a többi felhasználó által már jelentett ismert problémákat. A bővítményverzió frissítésével kapcsolatos útmutatásért olvassa el a Frissítés Durable Functions bővítményverzió című cikket.

Az Azure Portal Problémák diagnosztizálása és megoldása lapja hasznos erőforrás az alkalmazással kapcsolatos lehetséges problémák monitorozásához és diagnosztizálásához. Emellett lehetséges megoldásokat is kínál a problémákra a diagnózis alapján. További részletekért tekintse meg az Azure-függvényalkalmazások diagnosztikát ismertető szakaszát.

Ha a fenti források nem oldják meg a problémát, az alábbi szakaszok adott alkalmazási tünetekre vonatkozó tanácsokat nyújtanak:

A vezénylés elakadt az Pending állapotban

Vezénylés indításakor a rendszer egy "start" üzenetet ír a Durable bővítmény által felügyelt belső üzenetsorba, és a vezénylés állapota "Függőben" értékre lesz állítva. Miután a vezénylési üzenetet egy elérhető alkalmazáspéldány felvette és sikeresen feldolgozta, az állapot "Futtatás" állapotra (vagy más, nem "Függőben" állapotra változik).

Az alábbi lépésekkel elháríthatja azokat a vezénylési példányokat, amelyek a "Függőben" állapotban maradnak határozatlan ideig.

  • Az érintett vezénylési példány azonosítójával kapcsolatos figyelmeztetésekért vagy hibákért tekintse meg a Durable Task Framework nyomkövetéseit. Mintalekérdezés a Nyomkövetési hibák/figyelmeztetések szakaszban található.

  • Ellenőrizze a elakadt vezénylőhöz rendelt Azure Storage-vezérlősorokat, és ellenőrizze, hogy a "kezdő üzenet" továbbra is ott van-e. A vezérlősorokról további információt az Azure Storage szolgáltatói vezérlősor dokumentációjában talál.

  • Módosítsa az alkalmazás platformkonfigurációs verzióját "64 bitesre". Néha a vezénylések nem indulnak el, mert az alkalmazás elfogy a memóriája. A 64 bites folyamatra váltás lehetővé teszi, hogy az alkalmazás több teljes memóriát foglaljon le. Ez csak az App Service Basic, Standard, Premium és Elastic Premium csomagokra vonatkozik. Az ingyenes vagy a használatalapú csomagok nem támogatják a 64 bites folyamatokat.

A vezénylés hosszú késleltetés után kezdődik

A vezénylések általában az ütemezésük után néhány másodpercen belül kezdődnek. Vannak azonban olyan esetek, amikor a vezénylések indítása hosszabb időt vehet igénybe. Az alábbi lépésekkel elháríthatja, hogy a vezénylések végrehajtása néhány másodpercnél tovább tart-e.

A vezénylés nem fejeződik be / elakadt az Running állapotban

Ha egy vezénylés hosszú ideig "Fut" állapotban marad, az általában azt jelenti, hogy egy hosszú ideig futó feladatra vár, amely ütemezetten befejeződik. Előfordulhat például, hogy egy tartós időzítőfeladatra, egy tevékenységtevékenységre vagy egy külső eseményfeladatra vár. Ha azonban azt tapasztalja, hogy az ütemezett tevékenységek sikeresen befejeződtek, de a vezénylés még mindig nem halad, akkor probléma lehet, amely megakadályozza, hogy a vezénylés a következő feladatra lépjen. Ebben az állapotban gyakran "elakadt vezényléseknek" nevezzük a vezényléseket.

A elakadt vezénylések hibaelhárításához kövesse az alábbi lépéseket:

  • Próbálja meg újraindítani a függvényalkalmazást. Ez a lépés segíthet, ha a vezénylés elakad egy átmeneti hiba vagy holtpont miatt az alkalmazásban vagy a bővítménykódban.

  • Ellenőrizze az Azure Storage-fiókvezérlő üzenetsorait, és ellenőrizze, hogy az üzenetsorok folyamatosan növekednek-e. Ez az Azure Storage üzenetkezelési KQL-lekérdezés segíthet azonosítani a vezénylési üzenetek lekérésével kapcsolatos problémákat. Ha a probléma csak egyetlen vezérlősorra van hatással, az olyan problémát jelezhet, amely csak egy adott alkalmazáspéldányon található, ebben az esetben a nem kifogástalan állapotú virtuálisgép-példányról való leskálázás segíthet.

  • Az Azure Storage Messaging szakaszban található Application Insights-lekérdezéssel partícióazonosítóként szűrheti az üzenetsor nevét, és megkeresheti a vezérlősorpartícióval kapcsolatos problémákat.

  • Tekintse meg az útmutatót Durable Functions ajánlott eljárások és diagnosztikai eszközök című témakörben. Bizonyos problémákat az ismert Durable Functions anti-minták okozhatnak.

  • Tekintse meg a Durable Functions verziószámozási dokumentációját. Egyes problémákat a repülés közbeni vezénylési példányok kompatibilitástörő változásai okozhatnak.

A vezénylés lassan fut

A súlyos adatfeldolgozás, a belső hibák és az elégtelen számítási erőforrások miatt a vezénylések a szokásosnál lassabban futhatnak. Az alábbi lépésekkel elháríthatja a vártnál tovább tartandó vezényléseket:

  • Az érintett vezénylési példány azonosítójával kapcsolatos figyelmeztetésekért vagy hibákért tekintse meg a Durable Task Framework nyomkövetéseit. Mintalekérdezés a Nyomkövetési hibák/figyelmeztetések szakaszban található.

  • Ha az alkalmazás a .NET folyamaton belüli modelljét használja, fontolja meg a bővített munkamenetek engedélyezését. A bővített munkamenetek minimalizálhatják az előzménybetöltéseket, ami lelassíthatja a feldolgozást.

  • Ellenőrizze, hogy van-e teljesítmény- és méretezhetőségi szűk keresztmetszet. Az alkalmazás teljesítménye számos tényezőtől függ. A magas processzorhasználat vagy a nagy memóriahasználat például késéseket okozhat. Részletes útmutatásért olvassa el a Teljesítmény és méretezés Durable Functions című témakört.

Mintalekérdezések

Ez a szakasz bemutatja, hogyan háríthatja el a problémákat egyéni KQL-lekérdezések írásával a Azure Functions alkalmazáshoz konfigurált Azure-alkalmazás Insights-példányban.

Azure Storage-üzenetkezelés

Az alapértelmezett Azure Storage-szolgáltató használatakor az összes Durable Functions viselkedést az Azure Storage üzenetsor-üzenetei vezérlik, és a vezényléshez kapcsolódó összes állapot a táblatárolóban és a blobtárolóban van tárolva. Ha engedélyezve van a tartós feladat-keretrendszer nyomkövetése, a rendszer minden Azure Storage-interakciót naplóz az Application Insightsba, és ezek az adatok kritikus fontosságúak a végrehajtással és a teljesítménnyel kapcsolatos problémák hibakereséséhez.

A Durable Functions bővítmény 2.3.0-s verziójától kezdve ezeket a Durable Task Framework-naplókat közzéteheti az Application Insights-példányban a naplózási konfiguráció host.json fájlban való frissítésével. Ennek módjával kapcsolatos információkért és útmutatásért tekintse meg a Durable Task Framework naplózási cikkét .

A következő lekérdezés egy adott vezénylési példány végpontok közötti Azure Storage-interakcióinak vizsgálatára vonatkozik. Szerkessze start és orchestrationInstanceID szűrje időtartomány és példányazonosító szerint.

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

Nyomkövetési hibák/figyelmeztetések

Az alábbi lekérdezés hibákat és figyelmeztetéseket keres egy adott vezénylési példányhoz. Meg kell adnia egy értéket a számára 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 

Üzenetsor/partícióazonosító naplóinak vezérlése

Az alábbi lekérdezés az instanceId vezérlősorához társított összes tevékenységet keresi. Meg kell adnia a példányazonosító orchestrationInstanceID értékét és a lekérdezés kezdési időpontját a fájlban 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-oszlophivatkozás

Az alábbiakban a fenti lekérdezések által vetített oszlopok és azok leírásai láthatók.

Oszlop Leírás
Pid A függvényalkalmazás-példány folyamatazonosítója. Ez hasznos annak meghatározásához, hogy a folyamat újra lett-e dolgozva egy vezénylés végrehajtása közben.
taskName A naplózott esemény neve.
eventType Az üzenet típusa, amely általában egy vezénylő által végzett munkát jelöli. Itt található a lehetséges értékek teljes listája és azok leírása
extendedSession Logikai érték, amely azt jelzi, hogy engedélyezve van-e a kiterjesztett munkamenetek .
account Az alkalmazás által használt tárfiók.
részletek Ha van ilyen, további információ egy adott eseményről.
instanceId Egy adott vezénylési vagy entitáspéldány azonosítója.
messageId Egy adott üzenetsor egyedi Azure Storage-azonosítója. Ez az érték leggyakrabban a ReceivedMessage, a ProcessingMessage és a DeletingMessage nyomkövetési eseményekben jelenik meg. Vegye figyelembe, hogy nem szerepel a SendMessage eseményekben, mert az üzenet elküldése után az Azure Storage hozza létre az üzenet azonosítóját.
executionId A vezénylő végrehajtásának azonosítója, amely a meghíváskor continue-as-new változik.
életkor Az üzenet beküldése óta eltelt ezredmásodpercek száma. A nagy számok gyakran teljesítményproblémákra utalnak. Kivételt képez a TimerFired üzenettípus, amely az időzítő időtartamától függően nagy Kor értékkel rendelkezhet.
latencyMs Az egyes tárolási műveletek által igénybe vett ezredmásodpercek száma.
dequeueCount Az üzenetek lekérdezésének száma. Normál körülmények között ez az érték mindig 1. Ha többről van szó, akkor lehet, hogy probléma van.
partitionId A naplóhoz társított üzenetsor neve.
totalEventCount Az aktuális műveletben érintett előzményesemények száma.
taskHub A feladatközpont neve.
newEvents Vesszővel tagolt lista azoknak az előzményeseményeknek a listájáról, amelyeket a tár előzménytáblájára írnak.