Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Durable Functions est une extension d’Azure Functions qui vous permet de générer des orchestrations serverless à l’aide du code ordinaire. Pour plus d’informations sur Durable Functions, consultez la vue d’ensemble de Durable Functions.
Cet article fournit un guide pour résoudre les problèmes fréquents dans les scénarios courants des applications Durable Functions.
Remarque
Les ingénieurs du support technique Microsoft sont disponibles pour faciliter le diagnostic des problèmes liés à votre application. Si vous n’êtes pas en mesure de diagnostiquer votre problème à l’aide de ce guide, vous pouvez déposer un ticket de support en accédant au panneau Nouvelle demande de support dans la section Support + résolution des problèmes de la page de votre application de fonction dans le portail Azure.

Conseil / Astuce
Lors du débogage et du diagnostic des problèmes, il est recommandé de commencer par vous assurer que votre application utilise la dernière version de l’extension Durable Functions. La plupart du temps, l’utilisation de la dernière version atténue les problèmes connus déjà signalés par d’autres utilisateurs. Lisez l’article sur la version de l’extension Upgrade Durable Functions pour obtenir des instructions sur la mise à niveau de votre version d’extension.
L’onglet Diagnostiquer et résoudre les problèmes dans le portail Azure est une ressource utile pour surveiller et diagnostiquer les éventuels problèmes liés à votre application. Il fournit également des solutions potentielles à vos problèmes en fonction du diagnostic. Pour plus d’informations, consultez les diagnostics de l’application de fonction Azure .
Si les ressources ci-dessus n’ont pas résolu votre problème, les sections suivantes fournissent des conseils pour des symptômes d’application spécifiques :
L’orchestration est bloquée dans l’état Pending
Lorsque vous démarrez une orchestration, un message « start » est écrit dans une file d’attente interne gérée par l’extension Durable, et l’état de l’orchestration est défini sur « En attente ». Une fois le message d’orchestration récupéré et traité avec succès par une instance d’application disponible, l’état passe à « En cours d’exécution » (ou à un autre état non en attente).
Utilisez les étapes suivantes pour résoudre les problèmes liés aux instances d’orchestration qui restent bloquées indéfiniment dans l’état « En attente ».
Vérifiez les traces de l’infrastructure des tâches durables à la recherche d’avertissements ou d’erreurs pour l’ID de l’instance d’orchestration impactée. Vous trouverez un exemple de requête dans la section Erreurs/avertissements de trace.
Vérifiez les files d’attente de contrôle Azure Storage affectées à l’orchestrateur bloqué pour voir si son « message de démarrage » est toujours là. Pour plus d’informations sur les files d’attente de contrôle, consultez la documentation du fournisseur de stockage Azure sur la file d’attente de contrôle.
Remplacez la version de configuration de la plateforme de votre application par « 64 bits ». Parfois, les orchestrations ne démarrent pas, car l’application manque de mémoire. Le passage au processus 64 bits permet à l’application d’allouer plus de mémoire totale. Cela s’applique uniquement aux plans App Service Basic, Standard, Premium et Elastic Premium. Les plans gratuits ou de consommation ne prennent pas en charge les processus 64 bits.
L’orchestration démarre après un long délai
Normalement, les orchestrations démarrent dans les quelques secondes après leur planification. Toutefois, il existe certains cas où les orchestrations peuvent prendre plus de temps pour démarrer. Utilisez les étapes suivantes pour résoudre les problèmes lorsque les orchestrations prennent plus de quelques secondes pour démarrer l’exécution.
Reportez-vous à la documentation sur les orchestrations retardées dans Stockage Azure pour vérifier si le délai peut être dû à des limitations connues.
Vérifiez les traces de l’infrastructure des tâches durables à la recherche d’avertissements ou d’erreurs pour l’ID de l’instance d’orchestration impactée. Vous trouverez un exemple de requête dans la section Erreurs/avertissements de trace.
L’orchestration ne se termine pas / est bloquée dans l’état Running
Si une orchestration reste à l’état « En cours d’exécution » pendant une longue période, cela signifie généralement qu’elle attend une tâche de longue durée qui est planifiée pour se terminer. Par exemple, il peut s’agir d’attendre l’exécution d’une tâche de minuteur durable, d’une tâche d’activité ou d’une tâche d’événement externe. Toutefois, si vous observez que les tâches planifiées se sont terminées correctement, mais que l’orchestration ne progresse toujours pas, il peut y avoir un problème empêchant l’orchestration de passer à sa tâche suivante. Nous faisons souvent référence à des orchestrations dans cet état comme des « orchestrations bloquées ».
Pour résoudre les problèmes d’orchestrations bloquées, procédez comme suit :
Essayez de redémarrer l’application de fonction. Cette étape peut vous aider si l’orchestration est bloquée en raison d’un bogue temporaire ou d’un blocage dans l’application ou le code d’extension.
Vérifiez les files d’attente de contrôle du compte stockage Azure pour voir si des files d’attente augmentent en continu. Cette requête KQL de la messagerie Stockage Azure peut vous aider à identifier les problèmes liés au retrait des messages d’orchestration de la file d’attente. Si le problème n’affecte qu’une seule file d’attente de contrôle, il peut indiquer un problème existant uniquement sur une instance d’application spécifique, auquel cas effectuer un scale-up ou un scale-down pour retirer l’instance de machine virtuelle non saine pourrait vous aider.
Utilisez la requête Application Insights dans la section Messagerie stockage Azure pour filtrer le nom de cette file d’attente en tant qu’ID de partition et rechercher les problèmes liés à cette partition de file d’attente de contrôle.
Consultez les conseils fournis dans Les meilleures pratiques et outils de diagnostic pour Fonctions durables. Certains problèmes peuvent être causés par des anti-modèles Durable Functions connus.
Consultez la documentation relative au contrôle de version Durable Functions. Certains problèmes peuvent être causés par des changements cassants apportés aux instances d’orchestration se trouvant en version d’évaluation.
L’orchestration s’exécute lentement
Le traitement de données lourd, les erreurs internes et les ressources de calcul insuffisantes peuvent entraîner l’exécution d’orchestrations plus lentes que normales. Procédez comme suit pour résoudre les problèmes d’orchestration qui prennent plus de temps que prévu pour s’exécuter :
Vérifiez les traces de l’infrastructure des tâches durables à la recherche d’avertissements ou d’erreurs pour l’ID de l’instance d’orchestration impactée. Vous trouverez un exemple de requête dans la section Erreurs/avertissements de trace.
Si votre application utilise le modèle in-process .NET, envisagez d’activer les sessions étendues. Les sessions étendues peuvent réduire les charges d’historique, ce qui peut ralentir le traitement.
Vérifiez les goulots d’étranglement des performances et de l’extensibilité. Les performances des applications dépendent de nombreux facteurs. Par exemple, une utilisation élevée du processeur ou une grande consommation de mémoire peut entraîner des retards. Lisez les performances et la mise à l’échelle dans Durable Functions pour obtenir des conseils détaillés.
Exemples de requêtes
Cette section montre comment résoudre les problèmes en écrivant des requêtes KQL personnalisées dans l’instance Azure Application Insights configurée pour votre application Azure Functions.
Messagerie Stockage Azure
Lors de l'utilisation du fournisseur Azure Storage par défaut, le comportement de toutes les Durable Functions est piloté par les messages des files d’attente de Microsoft Azure Storage, et tous les états liés à une orchestration sont stockés dans le stockage de tables et de blobs. Lorsque le suivi Durable Task Framework est activé, toutes les interactions de stockage Azure sont journalisées dans Application Insights, et ces données sont cruciales pour le débogage des problèmes d’exécution et de performances.
À compter de la version 2.3.0 de l’extension Durable Functions, vous pouvez publier ces journaux Durable Task Framework sur votre instance Application Insights en mettant à jour votre configuration de journalisation dans le fichier host.json. Consultez l'article sur la journalisation du Durable Task Framework pour obtenir des informations et des instructions sur la procédure à suivre.
La requête suivante consiste à inspecter les interactions de stockage Azure de bout en bout pour une instance d’orchestration spécifique. Modifiez start et orchestrationInstanceID pour filtrer par intervalle de temps et ID d’instance.
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
Tracer les erreurs/avertissements
La requête suivante recherche des erreurs et des avertissements pour une instance d’orchestration donnée. Vous devez fournir une valeur pour 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
Journaux de file d’attente de contrôle/d’ID de partition
La requête suivante recherche toutes les activités associées à la file d'attente de contrôle de l'identifiant d'instance. Vous devez fournir la valeur de l’INSTANCEID dans orchestrationInstanceID et l’heure de début de la requête en 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
Informations de référence sur la colonne Application Insights
Vous trouverez ci-dessous une liste des colonnes projetées par les requêtes ci-dessus et leurs descriptions respectives.
| Colonne | Description |
|---|---|
| pid | ID de processus de l’instance de l’application de fonction. Cela est utile pour déterminer si le processus a été recyclé pendant l’exécution d’une orchestration. |
| nomDeTâche | Nom de l’événement en cours de journalisation. |
| typeÉvénement | Type de message, qui représente généralement le travail effectué par un orchestrateur. Une liste complète de ses valeurs possibles, et de leurs descriptions, est ici |
| extendedSession | Valeur booléenne indiquant si les sessions étendues sont activées. |
| account | Compte de stockage utilisé par l’application. |
| Détails | Informations supplémentaires sur un événement particulier, le cas échéant. |
| instanceId | ID d’une orchestration ou d’une instance d’entité donnée. |
| messageId | ID de stockage Azure unique pour un message de file d’attente donné. Cette valeur apparaît généralement dans les événements de trace ReceivedMessage, ProcessingMessage et DeletingMessage. Notez qu’il n’est pas présent dans les événements SendMessage, car l’ID de message est généré par stockage Azure après l’envoi du message. |
| executionId | ID d’exécution de l’orchestrateur, qui change à chaque appel de continue-as-new. |
| âge | Nombre de millisecondes depuis qu’un message a été mis en file d’attente. De grands nombres indiquent souvent des problèmes de performances. Une exception est le type de message TimerFired, qui peut avoir une valeur Age élevée en fonction de la durée du minuteur. |
| latencyMs | Nombre de millisecondes prises par une opération de stockage. |
| dequeueCount | Nombre de fois qu’un message a été enlevé de la file d’attente. Dans des circonstances normales, cette valeur est toujours 1. Si c’est plusieurs, il peut y avoir un problème. |
| partitionId | Nom de la file d’attente associée à ce journal. |
| totalEventCount | Nombre d’événements d’historique impliqués dans l’action actuelle. |
| taskHub | Nom de votre hub de tâches. |
| newEvents | Liste, séparée par des virgules, des événements d’historique en cours d’écriture dans la table de l’historique du stockage. |