Résoudre les problèmes liés à Azure Event Hubs
Cet article traite des techniques d’investigation des défaillances, des erreurs courantes pour les types d’informations d’identification dans la bibliothèque Event Hubs et des étapes d’atténuation pour résoudre ces erreurs. Outre les techniques de dépannage générales et les conseils qui s’appliquent indépendamment du cas d’usage d’Event Hubs, les articles suivants couvrent des fonctionnalités spécifiques de la bibliothèque Event Hubs :
- Dépanner le producteur Azure Event Hubs
- résoudre les problèmes liés au processeur d’événements Azure Event Hubs
- résoudre les problèmes de performances d’Azure Event Hubs
Le reste de cet article traite des techniques de dépannage générales et des conseils qui s’appliquent à tous les utilisateurs de la bibliothèque Event Hubs.
Gérer les exceptions d’Event Hubs
Toutes les exceptions Event Hubs sont encapsulées dans un AmqpException. Ces exceptions ont souvent un code d’erreur AMQP sous-jacent qui spécifie si une erreur doit être retentée. Pour les erreurs retenables (autrement dit, amqp:connection:forced
ou amqp:link:detach-forced
), les bibliothèques clientes tentent de récupérer à partir de ces erreurs en fonction des options de nouvelle tentative spécifiées lors de l’instanciation du client. Pour configurer les options de nouvelle tentative, suivez l'exemple pour publier des événements vers des partitions spécifiques. Si l’erreur n’est pas récurrable, il existe un problème de configuration qui doit être résolu.
La manière recommandée de résoudre l’exception spécifique représentée par l’exception AMQP consiste à suivre les consignes exceptions de messagerie d’Event Hubs.
Rechercher des informations pertinentes dans les messages d’exception
Un AmqpException contient les trois champs suivants, qui décrivent l’erreur :
- getErrorCondition: erreur AMQP sous-jacente. Pour une description des erreurs, consultez la documentation l’énumération AmqpErrorCondition ou la spécification OASIS AMQP 1.0.
- isTransient: valeur qui indique si la tentative d’exécution de la même opération est possible. Les clients du Kit de développement logiciel (SDK) appliquent la stratégie de nouvelle tentative lorsque l’erreur est temporaire.
- getErrorContext: contient les informations suivantes sur l’origine de l’erreur AMQP :
- LinkErrorContext: erreurs qui se produisent dans le lien d’envoi ou de réception.
- SessionErrorContext: erreurs qui se produisent dans la session.
- AmqpErrorContext: erreurs qui se produisent dans la connexion ou une erreur AMQP générale.
Exceptions couramment rencontrées
amqp:connection:forced et amqp:link:detach-forced
Lorsque la connexion à Event Hubs est inactive, le service déconnecte le client après un certain temps. Ce problème n’est pas un problème, car les clients rétablissent une connexion lorsqu’une opération de service est demandée. Pour plus d’informations, consultez les erreurs AMQP dans Azure Service Bus.
Problèmes d’autorisation
Un AmqpException
avec une AmqpErrorCondition de amqp:unauthorized-access
signifie que les informations d’identification fournies ne permettent pas d’effectuer l’action (la réception ou l’envoi) avec Event Hubs. Pour résoudre ce problème, essayez les tâches suivantes :
- Vérifiez que vous disposez de la chaîne de connexion correcte. Pour plus d’informations, voir Obtenir une chaîne de connexion Event Hubs.
- Vérifiez que votre jeton de signature d’accès partagé (SAP) est généré correctement. Pour plus d’informations, consultez Autoriser l’accès aux ressources Event Hubs à l’aide de signatures d’accès partagé.
Pour obtenir d’autres solutions possibles, consultez Résoudre les problèmes d’authentification et d’autorisation avec Event Hubs.
Problèmes de connectivité
Délai d’expiration lors de la connexion au service
Pour résoudre les problèmes de délai d’expiration, procédez comme suit :
- Vérifiez que la chaîne de connexion ou le nom de domaine complet spécifié lors de la création du client est correct. Pour plus d’informations, voir Obtenir une chaîne de connexion Event Hubs.
- Vérifiez les autorisations de pare-feu et de port dans votre environnement d’hébergement et vérifiez que les ports AMQP 5671 et 5762 sont ouverts.
- Vérifiez que le point de terminaison est autorisé via le pare-feu.
- Essayez d’utiliser webSockets, qui se connecte sur le port 443. Pour plus d’informations, consultez l’exemple PublishEventsWithWebSocketsAndProxy.java.
- Vérifiez si votre réseau bloque des adresses IP spécifiques. Pour plus d’informations, consultez Quelles adresses IP dois-je autoriser ?
- Le cas échéant, vérifiez la configuration du proxy. Pour plus d’informations, consultez l’exemple PublishEventsWithWebSocketsAndProxy.java.
- Pour plus d’informations sur la résolution des problèmes de connectivité réseau, consultez Résoudre les problèmes de connectivité - Azure Event Hubs.
Échecs de négociation TLS/SSL
Cette erreur peut se produire lorsqu’un proxy d’interception est utilisé. Pour vérifier, nous vous recommandons de tester dans votre environnement d’hébergement avec le proxy désactivé.
Erreurs d’épuisement du socket
Les applications doivent préférer traiter les clients Event Hubs en tant que singleton, en créant et en utilisant une seule instance tout au long de la durée de vie de leur application. Cette recommandation est importante, car chaque type de client gère sa connexion. Lorsque vous créez un client Event Hubs, il génère une nouvelle connexion AMQP, qui utilise un socket. En outre, il est essentiel que les clients héritent de java.io.Closeable
, donc votre application doit appeler close()
lorsqu'elle a fini d'utiliser un client.
Pour utiliser la même connexion AMQP lors de la création de plusieurs clients, vous pouvez utiliser l’indicateur EventHubClientBuilder.shareConnection()
, contenir une référence à ce EventHubClientBuilder
et créer de nouveaux clients à partir de cette même instance de générateur.
Se connecter à l’aide d’une chaîne de connexion IoT
Étant donné que la traduction d’une chaîne de connexion nécessite l’interrogation du service IoT Hub, la bibliothèque cliente Event Hubs ne peut pas l’utiliser directement. L’exemple IoTConnectionString.java décrit comment interroger IoT Hub pour traduire une chaîne de connexion IoT en une chaîne de connexion IoT qui peut être utilisée avec Event Hubs.
Pour plus d’informations, consultez les articles suivants :
- Contrôler l’accès à IoT Hub à l’aide de signatures d’accès partagé
- Lire les messages depuis l'appareil vers le cloud à partir du point de terminaison intégré
Impossible d’ajouter des composants à la chaîne de connexion
Les clients Event Hubs hérités ont autorisé les clients à ajouter des composants à la chaîne de connexion récupérée à partir du portail Azure. Les clients hérités se trouvent dans des packages com.microsoft.azure :azure-eventhubs et com.microsoft.azure :azure-eventhubs-eph. La génération actuelle prend en charge les chaînes de connexion uniquement dans le formulaire publié par le portail Azure.
Ajouter « TransportType=AmqpWebSockets »
Pour utiliser des sockets web, consultez l’exemple de PublishEventsWithSocketsAndProxy.java.
Ajouter « Authentification=Identité Gérée »
Pour vous authentifier avec l’identité managée, consultez l’exemple PublishEventsWithAzureIdentity.java.
Pour plus d’informations sur la bibliothèque de Azure.Identity
, consultez notre billet de blog sur l’authentification et le kit de développement logiciel (SDK) Azure.
Activer et configurer la journalisation
Le Kit de développement logiciel (SDK) Azure pour Java offre un article de journalisation cohérent pour vous aider à résoudre les erreurs d’application et à accélérer leur résolution. Les journaux générés capturent le flux d’une application avant d’atteindre l’état du terminal pour aider à localiser le problème racine. Pour obtenir des conseils sur la journalisation, consultez Configurer la journalisation dans le Kit de développement logiciel (SDK) Azure pour Java et Vue d’ensemble de la résolution des problèmes.
Outre l’activation de la journalisation, la définition du niveau de journalisation sur VERBOSE
ou DEBUG
fournit des insights sur l’état de la bibliothèque. Les sections suivantes montrent des exemples de configurations log4j2 et logback pour réduire les messages excessifs lorsque la journalisation détaillée est activée.
Configurer Log4J 2
Procédez comme suit pour configurer Log4J 2 :
- Ajoutez les dépendances dans votre pom.xml en utilisant celles de l’exemple de journalisation pom.xml, dans la section « Dépendances requises pour Log4j2 ».
- Ajoutez log4j2.xml à votre dossier src/main/resources.
Configurer logback
Pour configurer logback, procédez comme suit :
- Ajoutez les dépendances dans votre pom.xml en utilisant celles du pom.xml d’exemple de journalisation, dans la section « Dependencies required for logback »
- Ajoutez logback.xml à votre dossier src/main/resources.
Activer le journal de transport AMQP
Si l'activation du journal client n'est pas suffisante pour diagnostiquer vos problèmes, vous pouvez activer la journalisation vers un fichier dans la bibliothèque AMQP sous-jacente, Qpid Proton-J. Qpid Proton-J utilise java.util.logging
. Vous pouvez activer la journalisation en créant un fichier de configuration avec le contenu indiqué dans la section suivante. Vous pouvez également définir proton.trace.level=ALL
et les options de configuration souhaitées pour l’implémentation java.util.logging.Handler
. Pour connaître les classes d’implémentation et leurs options, consultez package java.util.logging dans la documentation du Kit de développement logiciel (SDK) Java 8.
Pour tracer les trames de transport AMQP, définissez la variable d’environnement PN_TRACE_FRM=1
.
Fichier d’exemple « logging.properties »
Le fichier de configuration suivant enregistre la sortie du niveau TRACE de Proton-J au fichier proton-trace.log :
handlers=java.util.logging.FileHandler
.level=OFF
proton.trace.level=ALL
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.pattern=proton-trace.log
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s: %5$s %n
Réduire le journal
Une façon de réduire la journalisation est de modifier le niveau de détail. Une autre méthode consiste à ajouter des filtres qui excluent les journaux provenant de packages de noms de journaux tels que com.azure.messaging.eventhubs
ou com.azure.core.amqp
. Pour obtenir des exemples, consultez les fichiers XML dans les sections Configurer Log4J 2 et Configurer logback.
Lorsque vous soumettez un rapport de bug, les messages de logs provenant de classes dans les paquets suivants sont intéressants :
com.azure.core.amqp.implementation
com.azure.core.amqp.implementation.handler
- L’exception est que vous pouvez ignorer le message
onDelivery
dansReceiveLinkHandler
.
- L’exception est que vous pouvez ignorer le message
com.azure.messaging.eventhubs.implementation
Étapes suivantes
Si les conseils de dépannage de cet article ne permettent pas de résoudre les problèmes liés à l'utilisation des bibliothèques clientes Azure SDK for Java, nous vous recommandons de déposer un problème dans le référentiel GitHub Azure SDK for Java.