Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Durable Functions biedt verschillende diagnostische hulpprogramma's voor het oplossen van problemen met orkestraties. In dit artikel wordt beschreven hoe u tracering en logboekregistratie configureert, veilige code voor opnieuw afspelen schrijft, gedistribueerde traceringen inspecteert en lokaal fouten opspoort.
In dit artikel leert u het volgende:
- Application Insights-tracering configureren voor levenscyclus-gebeurtenissen
- Orkestratie-instanties bevragen met Kusto
- Logboekregistratie van Durable Task Framework (DTFx) inschakelen voor diagnostische gegevens op laag niveau
- Gedistribueerde tracering instellen om end-to-end orkestratiestromen te visualiseren
- Replay-veilige logboeken schrijven in orchestratorfuncties
- Aangepaste orkestratiestatus rapporteren aan externe clients
- Fouten opsporen in orkestraties lokaal met onderbrekingspunten
Application Insights-tracering configureren
Application Insights is de aanbevolen manier om Durable Functions te bewaken. De Durable-extensie verzendt traceringsgebeurtenissen waarmee u de end-to-end-uitvoering van een orkestratie kunt traceren. U kunt deze traceringsgebeurtenissen vinden en er query's op uitvoeren met behulp van het hulpprogramma Application Insights Analytics in de Azure-portal.
Configuratie op logboekniveau
Configureer de uitgebreidheid van traceringsgegevens die worden verzonden naar Application Insights in uw host.json-bestand :
{
"logging": {
"logLevel": {
"Host.Triggers.DurableTask": "Information",
},
}
}
Standaard worden alle niet-herhalingstraceringsgebeurtenissen verzonden. U kunt het volume van gegevens verminderen door Host.Triggers.DurableTask in te stellen op "Warning" of "Error", waardoor alleen bijhoudingsgebeurtenissen worden verzonden voor uitzonderlijke situaties. Als u het verzenden van de uitgebreide herafspeelgebeurtenissen van orchestratie wilt inschakelen, stelt u logReplayEvents in op true in het host.json configuratiebestand.
Opmerking
Standaard verzamelt de Azure Functions-runtime steekproefsgewijs Application Insights-telemetriegegevens om overmatige gegevensoverdracht te voorkomen. Steekproeven kunnen ertoe leiden dat traceringsinformatie verloren gaat wanneer veel levenscyclusgebeurtenissen zich in een korte periode voordoen. In het artikel Azure Functions Monitoring wordt uitgelegd hoe u dit gedrag configureert.
Invoer- en uitvoerlogboekregistratie
Standaard worden de invoer en uitvoer van orchestrator-, activiteits- en entiteitsfuncties niet vastgelegd. Deze methode wordt aanbevolen omdat het loggen van invoer en uitvoer de kosten van Application Insights kan verhogen. Functie-invoer- en uitvoerladingen kunnen ook gevoelige informatie bevatten. In plaats daarvan wordt het aantal bytes voor functie-invoer en -uitvoer vastgelegd. Als u wilt dat de Durable Functions-extensie de volledige invoer- en uitvoergegevens logt, stelt u de eigenschap traceInputsAndOutputs in op true in het configuratiebestand host.json.
Queryindelingexemplaren
Gebruik de volgende Kusto-queries in Application Insights Analytics om orkestratie-exemplaren te inspecteren.
Query voor een enkele instantie
In de volgende query ziet u historische trackinggegevens voor een enkel exemplaar van de Hello Sequence functie-orkestratie. Hiermee wordt de uitvoering van herhalingen gefilterd, zodat alleen het logische uitvoeringspad wordt weergegeven. U kunt gebeurtenissen ordenen door te sorteren op timestamp en sequenceNumber, zoals wordt weergegeven in de volgende query:
let targetInstanceId = "ddd1aaa685034059b545eb004b15d4eb";
let start = datetime(2018-03-25T09:20:00);
traces
| where timestamp > start and timestamp < start + 30m
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = customDimensions["prop__functionName"]
| extend instanceId = customDimensions["prop__instanceId"]
| extend state = customDimensions["prop__state"]
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend sequenceNumber = tolong(customDimensions["prop__sequenceNumber"])
| where isReplay != true
| where instanceId == targetInstanceId
| sort by timestamp asc, sequenceNumber asc
| project timestamp, functionName, state, instanceId, sequenceNumber, appName = cloud_RoleName
Het resultaat is een lijst met gebeurtenissen die het uitvoeringspad van de orchestratie weergeven, inclusief activiteitsfuncties die zijn gerangschikt in oplopende volgorde op uitvoeringstijd.
Samenvattingsquery exemplaar
De volgende query toont de status van alle orchestratie-instanties die binnen een opgegeven tijdsbestek zijn uitgevoerd.
let start = datetime(2017-09-30T04:30:00);
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = tostring(customDimensions["prop__functionName"])
| extend instanceId = tostring(customDimensions["prop__instanceId"])
| extend state = tostring(customDimensions["prop__state"])
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend output = tostring(customDimensions["prop__output"])
| where isReplay != true
| summarize arg_max(timestamp, *) by instanceId
| project timestamp, instanceId, functionName, state, output, appName = cloud_RoleName
| order by timestamp asc
Het resultaat is een lijst met exemplaar-id's en hun huidige runtimestatus.
Referentie voor traceringsgegevens
Elke orchestratie-instantie genereert tracking events tijdens zijn levenscyclus. Elke levenscyclusgebeurtenis bevat een customDimensions payload met verschillende velden. Veldnamen worden allemaal voorafgegaan door prop__.
| Veldnaam | Beschrijving |
|---|---|
hubName |
De naam van het taakcentrum waarin uw orkestraties worden uitgevoerd. |
appName |
De naam van de functie-app. Dit veld is handig wanneer u meerdere functie-apps hebt die hetzelfde Application Insights-exemplaar delen. |
slotName |
De implementatiesite waarin de huidige functie-app wordt uitgevoerd. Dit veld is handig wanneer u implementatieslots gebruikt om uw orkestraties te versioneren. |
functionName |
De naam van de orchestrator- of activiteitsfunctie. |
functionType |
Het type van de functie, zoals Orchestrator of Activity. |
instanceId |
De unieke ID van de orkestratie-instantie. |
state |
De uitvoeringsstatus van de levenscyclus van de instantie. |
state.Scheduled |
De functie is gepland voor uitvoering, maar is nog niet gestart. |
state.Started |
De functie is gestart, maar is nog niet in afwachting of voltooid. |
state.Awaited |
De orchestrator heeft wat werk gepland en wacht totdat het is voltooid. |
state.Listening |
De orchestrator luistert naar een melding van een externe gebeurtenis. |
state.Completed |
De functie is succesvol voltooid. |
state.Failed |
De functie is mislukt door een fout. |
reason |
Aanvullende gegevens die zijn gekoppeld aan de tracerings gebeurtenis. Als een exemplaar bijvoorbeeld wacht op een melding van een externe gebeurtenis, geeft dit veld de naam aan van de gebeurtenis waarop wordt gewacht. Als een functie mislukt, bevat dit veld de foutdetails. |
isReplay |
Booleaanse waarde die aangeeft of de traceringsgebeurtenis voor opnieuw afgespeelde uitvoering is. |
extensionVersion |
De versie van de extensie Durable Task. De versie-informatie is vooral belangrijke gegevens wanneer mogelijke fouten in de extensie worden gerapporteerd. Langlopende exemplaren kunnen meerdere versies rapporteren als er een update plaatsvindt terwijl het exemplaar wordt uitgevoerd. |
sequenceNumber |
Uitvoeringsvolgnummer voor een gebeurtenis. In combinatie met de tijdstempel helpt dit de gebeurtenissen te orden op uitvoeringstijd. Houd er rekening mee dat dit getal opnieuw wordt ingesteld op nul als de host opnieuw wordt opgestart terwijl het exemplaar wordt uitgevoerd, dus het is belangrijk om altijd eerst te sorteren op tijdstempel en vervolgens sequenceNumber. |
Durable Task Framework-logboekregistratie (DTFx)
De durable-extensielogboeken zijn handig om inzicht te krijgen in het gedrag van uw indelingslogica. Deze logboeken bevatten echter niet altijd voldoende informatie om prestatie- en betrouwbaarheidsproblemen op frameworkniveau op te sporen. Vanaf v2.3.0 van de Durable-extensie zijn logboeken die worden verzonden door het onderliggende Durable Task Framework (DTFx) ook beschikbaar voor verzameling.
Wanneer u logboeken bekijkt die door de DTFx worden verzonden, is het belangrijk om te begrijpen dat de DTFx-engine twee onderdelen heeft: de kern-dispatch-engine (DurableTask.Core) en een van de vele ondersteunde opslagproviders.
| Onderdeel | Beschrijving |
|---|---|
DurableTask.Core |
Uitvoering van kernindeling en planningslogboeken op laag niveau en telemetrie. |
DurableTask.DurableTaskScheduler |
Back-endlogboeken die specifiek zijn voor de Durable Task Scheduler. |
DurableTask.AzureStorage |
Backend-logboeken die specifiek zijn voor de Azure Storage stateprovider. Deze logboeken bevatten gedetailleerde interacties met de interne wachtrijen, blobs, en opslagtabellen die worden gebruikt om de interne orchestratiestatus op te slaan en op te halen. |
DurableTask.Netherite |
Back-end logboeken die specifiek zijn voor de Netherite-opslagprovider, indien ingeschakeld. |
DurableTask.SqlServer |
Back-end logs die specifiek zijn voor de Microsoft SQL (MSSQL) opslagprovider, wanneer ingeschakeld. |
U kunt deze logboeken inschakelen door de sectie van het logging/logLevel host.json-bestand van uw functie-app bij te werken. In het volgende voorbeeld ziet u hoe u waarschuwings- en foutlogboeken van zowel DurableTask.Core als DurableTask.AzureStorage kunt inschakelen.
{
"version": "2.0",
"logging": {
"logLevel": {
"DurableTask.AzureStorage": "Warning",
"DurableTask.Core": "Warning"
}
}
}
Als Application Insights is ingeschakeld, worden deze logboeken automatisch toegevoegd aan de trace verzameling. U kunt ze op dezelfde manier doorzoeken als u andere trace logboeken zoekt met behulp van Kusto-query's.
Opmerking
Voor productietoepassingen raden we aan het inschakelen van DurableTask.Core en de juiste opslagproviderlogboeken (bijvoorbeeld DurableTask.AzureStorage) met het "Warning" filter. Hogere uitgebreidheidsfilters, zoals "Information" handig voor het opsporen van prestatieproblemen. Deze logboekgebeurtenissen kunnen echter groot zijn en kunnen de opslagkosten voor Application Insights-gegevens aanzienlijk verhogen.
De volgende Kusto-query laat zien hoe u query's kunt uitvoeren op DTFx-logboeken. Het belangrijkste onderdeel van de query is where customerDimensions.Category startswith "DurableTask", aangezien het de resultaten filtert naar logs in de DurableTask.Core- en DurableTask.AzureStorage-categorieën.
traces
| where customDimensions.Category startswith "DurableTask"
| project
timestamp,
severityLevel,
Category = customDimensions.Category,
EventId = customDimensions.EventId,
message,
customDimensions
| order by timestamp asc
Het resultaat is een set logboeken die zijn geschreven door de Durable Task Framework-logboekproviders.
Zie de documentatie over gestructureerde logging van het Durable Task Framework op GitHub voor meer informatie over welke logboekgebeurtenissen beschikbaar zijn.
Gedistribueerde tracering
Gedistribueerde tracering houdt aanvragen bij en laat zien hoe verschillende services met elkaar communiceren. In Durable Functions correleert het orkestraties, entiteiten en activiteiten. Gedistribueerde tracering toont de uitvoeringstijd voor elke orchestratiestap ten opzichte van de gehele orkestratie en identificeert waar problemen of uitzonderingen optreden. Deze functie wordt ondersteund in Application Insights voor alle talen en opslagproviders.
Prerequisites
Voor gedistribueerde tracering zijn specifieke minimale uitbreidingsversies vereist:
- Voor .NET Geïsoleerde apps, Microsoft.Azure.Functions.Worker.Extensions.DurableTask>= v1.4.0.
- Voor niet-.NET-apps, volg deze instructies om handmatig Microsoft.Azure.WebJobs.Extensions.DurableTask>= v3.2.0 voor nu te installeren. Gedistribueerde tracering is beschikbaar in extensiebundels >v4.24.x.
Gedistribueerde tracering instellen
Als u gedistribueerde tracering wilt configureren, werkt u de host.json Application Insights-resource bij en stelt u deze in.
host.json
{
"extensions": {
"durableTask": {
"tracing": {
"distributedTracingEnabled": true,
"version": "V2"
}
}
}
}
Analyses van toepassingen
Configureer uw functie-app met een Application Insights-resource.
De traceringen inspecteren
Navigeer in uw Application Insights-resource naar Transaction Search. Zoek in de resultaten naar Request en Dependency gebeurtenissen die beginnen met duurzame voorvoegsels (bijvoorbeeld orchestration:, activity:enzovoort). Als u een van deze gebeurtenissen selecteert, wordt een Gantt-diagram geopend waarin de end-to-end gedistribueerde tracering wordt weergegeven. In de grafiek wordt elke orkestratiestap weergegeven als een horizontale balk, met activiteits- en suborkestratieoproepen die zijn genest onder de bovenliggende orkestratie. De staaflengte vertegenwoordigt de duur van de wandklok van elke stap, zodat u eenvoudig knelpunten of onverwacht trage activiteiten kunt herkennen.
Opmerking
Ziet u uw traceringen niet in Application Insights? Wacht ongeveer vijf minuten nadat u uw toepassing hebt uitgevoerd om ervoor te zorgen dat alle gegevens worden doorgegeven aan de Application Insights-resource.
Logging met herhalingsbeveiliging in orkestraatorfuncties
Orchestrator-functies worden telkens opnieuw afgespeeld wanneer nieuwe invoer wordt ontvangen, wat betekent dat elke logboekinstructie in een orchestrator meerdere keren wordt uitgevoerd voor één logische uitvoering. Een functie met drie activiteitsoproepen produceert bijvoorbeeld logboekuitvoer zoals deze tijdens het opnieuw afspelen:
Calling F1.
Calling F1.
Calling F2.
Calling F1.
Calling F2.
Calling F3.
Calling F1.
Calling F2.
Calling F3.
Done!
Als u dubbele logregels wilt voorkomen, controleer dan de vlag 'wordt herhaald' zodat logs alleen worden uitgevoerd tijdens de eerste keer (niet-herhaling). In de volgende voorbeelden ziet u veilige logboekregistratie tegen herhaling in elke taal.
Vanaf Durable Functions 2.0 kunt u CreateReplaySafeLogger logvermeldingen automatisch filteren tijdens het opnieuw afspelen.
[FunctionName("FunctionChain")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
log = context.CreateReplaySafeLogger(log);
log.LogInformation("Calling F1.");
await context.CallActivityAsync("F1");
log.LogInformation("Calling F2.");
await context.CallActivityAsync("F2");
log.LogInformation("Calling F3");
await context.CallActivityAsync("F3");
log.LogInformation("Done!");
}
Bij replay-veilige logboekregistratie is de logboekuitvoer:
Calling F1.
Calling F2.
Calling F3.
Done!
Aangepaste orkestratiestatus
Gebruik de aangepaste orkestratiestatus om de voortgang van de werkstroom te rapporteren aan externe klanten. Veelvoorkomende patronen zijn voltooiingspercentages, stapbeschrijvingen en samenvattingen van fouten. Externe clients kunnen de aangepaste status bekijken via de HTTP-statusquery-API of taalspecifieke API-aanroepen.
De volgende code laat zien hoe u een aangepaste statuswaarde instelt in een orchestratorfunctie:
[FunctionName("SetStatusTest")]
public static async Task SetStatusTest([OrchestrationTrigger] IDurableOrchestrationContext context)
{
// ...do work...
// update the status of the orchestration with some arbitrary data
var customStatus = new { completionPercentage = 90.0, status = "Updating database records" };
context.SetCustomStatus(customStatus);
// ...do more work...
}
Opmerking
Het vorige C#-voorbeeld is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u DurableOrchestrationContext gebruiken in plaats van IDurableOrchestrationContext. Zie het artikel Durable Functions versies voor meer informatie over de verschillen tussen versies.
Terwijl de orkestratie wordt uitgevoerd, kunnen externe cliënten deze aangepaste status ophalen.
GET /runtime/webhooks/durabletask/instances/instance123?code=XYZ
Clients krijgen het volgende antwoord:
{
"runtimeStatus": "Running",
"input": null,
"customStatus": { "completionPercentage": 90.0, "status": "Updating database records" },
"output": null,
"createdTime": "2017-10-06T18:30:24Z",
"lastUpdatedTime": "2017-10-06T19:40:30Z"
}
Waarschuwing
De nettolading van de aangepaste status is beperkt tot 16 kB van UTF-16 JSON-tekst, omdat deze in een Azure-tabelopslag kolom moet passen. U kunt externe opslag gebruiken als u een grotere nettolading nodig hebt.
foutopsporing
Azure Functions biedt rechtstreeks ondersteuning voor het debuggen van functiecode, en dezelfde ondersteuning is van toepassing op Durable Functions, ongeacht of deze wordt uitgevoerd in Azure of lokaal. Gebruik de volgende werkstroom voor de beste foutopsporingservaring:
Start een nieuwe foutopsporingssessie met een nieuwe taakhub of wis de inhoud van de taakhub tussen sessies. Restberichten van eerdere uitvoeringen kunnen onverwachte heruitvoering veroorzaken.
Stel onderbrekingspunten in uw orchestrator- of activiteitsfuncties in. Gebruik voor orchestratorfuncties een voorwaardelijk onderbrekingspunt dat alleen wordt verbroken wanneer de waarde 'opnieuw afspelen' is
falseom te voorkomen dat hetzelfde onderbrekingspunt meerdere keren wordt bereikt tijdens het opnieuw afspelen.Doorloop uw code zoals gewoonlijk. Houd rekening met het volgende gedrag:
Replay:
Orchestrator-functies worden regelmatig opnieuw afgespeeld wanneer nieuwe invoer wordt ontvangen. Een enkele logische uitvoering van een orchestratorfunctie kan ertoe leiden dat hetzelfde onderbrekingspunt meerdere keren wordt bereikt, vooral als deze vroeg in de functiecode is ingesteld.Wachten:
Wanneer er eenawaitin een orchestratorfunctie wordt aangetroffen, wordt de controle teruggegeven aan de dispatcher van het Durable Task Framework. Als het de eerste keer is dat een bepaaldeawaittaak wordt aangetroffen, wordt de bijbehorende taak nooit hervat. Omdat de taak nooit wordt hervat, is stappen over het wachten (F10 in Visual Studio) niet mogelijk. Stappen werkt alleen wanneer een taak opnieuw wordt afgespeeld.Time-outs voor berichten:
Durable Functions maakt intern gebruik van wachtrijberichten om de uitvoering van orchestrator-, activiteits- en entiteitsfuncties te stimuleren. In een omgeving met meerdere VM's kunnen uitgebreide foutopsporingssessies ertoe leiden dat een andere VIRTUELE machine het bericht verwerkt, wat resulteert in dubbele uitvoering. Hoewel dit gedrag ook bestaat voor reguliere functies voor wachtrijtriggers, is deze context belangrijk om te markeren omdat de wachtrijen een implementatiedetails zijn.Stoppen en starten:
Berichten in Durable Functions worden behouden tussen foutopsporingssessies. Als u de foutopsporing stopt en het lokale hostproces beëindigt terwijl een duurzame functie wordt uitgevoerd, kan die functie automatisch opnieuw worden uitgevoerd in een toekomstige foutopsporingssessie.
Aanvullende hulpprogramma’s
Opslagstatus controleren
Durable Functions slaat standaard de status op in Azure Storage. U kunt indelingsstatus en berichten inspecteren met behulp van hulpprogramma's zoals Microsoft Azure Storage Explorer.
Waarschuwing
Hoewel het handig is om de uitvoeringsgeschiedenis in tabelopslag te bekijken, vermijdt u dat u afhankelijkheid van deze tabel maakt. Het kan veranderen naarmate de Durable Functions-extensie zich ontwikkelt.
Opmerking
U kunt andere opslagproviders configureren in plaats van de standaardprovider voor Azure Storage. Afhankelijk van de opslagprovider die is geconfigureerd voor uw app, moet u mogelijk verschillende hulpprogramma's gebruiken om de onderliggende status te inspecteren.
Monitor voor duurzame functies
Durable Functions Monitor is een grafisch hulpprogramma voor het bewaken, beheren en debuggen van orchestratie- en entiteitsinstanties. Het is beschikbaar als een Visual Studio Code-extensie of een zelfstandige app. Zie de Durable Functions Monitor Wiki voor installatie-instructies en een lijst met functies.
Diagnostiek van het Azure-portaal
De Azure-portal biedt ingebouwde diagnostische hulpprogramma's voor uw functie-apps.
Problemen vaststellen en oplossen: Diagnostische gegevens van Azure Function-apps zijn een nuttige resource voor het bewaken en diagnosticeren van mogelijke problemen in uw toepassing. Het biedt ook suggesties om problemen op te lossen op basis van de diagnose. Zie Azure Function App Diagnostics voor meer informatie.
Orchestratie-tracering: De Azure-portal biedt details over orchestratie-tracering om inzicht te hebben in de status van elk orchestratie-exemplaar en de uitvoering van begin tot eind te volgen. Wanneer u de lijst met functies in uw Azure Functions-app bekijkt, ziet u een kolom Monitor met koppelingen naar de traceringen. U moet Application Insights hebben ingeschakeld voor uw app om toegang te krijgen tot deze informatie.
Roslyn Analyzer (een tool voor .NET-ontwikkeling)
De Durable Functions Roslyn Analyzer is een live code analyzer waarmee C#-ontwikkelaars Durable Functions specifieke beperkingen voor het coderen van code kunnen volgen. Zie Durable Functions Roslyn Analyzer voor instructies over het inschakelen ervan in Visual Studio en Visual Studio Code.
Troubleshooting
Als u veelvoorkomende problemen wilt oplossen, zoals orchestraties die vastlopen, niet kunnen worden gestart of langzaam worden uitgevoerd, raadpleegt u de Durable Functions-handleiding voor probleemoplossing Durable Functions.