Felsöka Azure Event Hubs
Den här artikeln beskriver metoder för felundersökning, vanliga fel för autentiseringstyperna i Event Hubs-biblioteket och åtgärdssteg för att lösa dessa fel. Förutom de allmänna felsökningstekniker och vägledningar som gäller oavsett händelsehubbars användningsfall, omfattar följande artiklar specifika funktioner i Event Hubs-biblioteket:
- Felsök Azure Event Hubs producent
- Felsöka händelseprocessorn i Azure Event Hubs
- Felsöka Prestanda för Azure Event Hubs
Resten av den här artikeln beskriver allmänna felsökningstekniker och vägledning som gäller för alla användare av Event Hubs-biblioteket.
Hantera Event Hubs-undantag
Alla Event Hubs-undantag omsluts i en AmqpException. Dessa undantag har ofta en underliggande AMQP-felkod som anger om ett fel ska försökas igen. För återförsöksbara fel (d.v.s. amqp:connection:forced
eller amqp:link:detach-forced
) försöker klientbiblioteken återställa från dessa fel baserat på de återförsöksalternativ som anges när klienten instansieras. Om du vill konfigurera alternativ för återförsök, följ exemplet och publicera händelser till en specifik partition. När felet inte kan göras om finns det ett konfigurationsproblem som måste lösas.
Det rekommenderade sättet att lösa det specifika undantag som AMQP-undantaget representerar är att följa vägledningen för Event Hubs-meddelandefel.
Hitta relevant information i undantagsmeddelanden
En AmqpException- innehåller följande tre fält som beskriver felet:
- getErrorCondition: Det underliggande AMQP-felet. En beskrivning av felen finns i dokumentationen AmqpErrorCondition Enum eller OASIS AMQP 1.0-specifikationen.
- isTransient: Ett värde som anger om det är möjligt att försöka utföra samma åtgärd. SDK-klienter tillämpar återförsöksprincipen när felet är tillfälligt.
-
getErrorContext: Innehåller följande information om var AMQP-felet uppstod:
- LinkErrorContext: Fel som inträffar i länken skicka eller ta emot.
- SessionErrorContext: Fel som inträffar i sessionen.
- AmqpErrorContext: Fel som inträffar i anslutningen eller ett allmänt AMQP-fel.
Vanliga undantag
amqp:connection:forced och amqp:link:detach-forced
När anslutningen till Event Hubs är inaktiv kopplar tjänsten bort klienten efter en stund. Det här problemet är inget problem eftersom klienterna återupprättar en anslutning när en tjänståtgärd begärs. Mer information finns i AMQP-fel i Azure Service Bus.
Behörighetsproblem
En AmqpException
med en AmqpErrorCondition- på amqp:unauthorized-access
innebär att de angivna inloggningsuppgifterna inte tillåter att utföra åtgärden (mottagning eller sändning) med Event Hubs. Lös problemet genom att prova följande uppgifter:
- Dubbelkolla att du har rätt anslutningssträng. Mer information finns i Hämta en Event Hubs-anslutningssträng.
- Se till att din SAS-token (signatur för delad åtkomst) genereras korrekt. Mer information finns i Auktorisera åtkomst till Event Hubs-resurser med signaturer för delad åtkomst.
Andra möjliga lösningar finns i Felsöka autentiserings- och auktoriseringsproblem med Event Hubs.
Anslutningsproblem
Tidsgräns vid anslutning till tjänsten
Prova följande uppgifter för att lösa problem med tidsgränsen:
- Kontrollera att anslutningssträngen eller det fullständigt kvalificerade domännamnet som angavs när klienten skapades är korrekt. Mer information finns i Skaffa en anslutningssträng för Event Hubs.
- Kontrollera brandväggs- och portbehörigheterna i värdmiljön och kontrollera att AMQP-portarna 5671 och 5762 är öppna.
- Kontrollera att slutpunkten tillåts via brandväggen.
- Prova att använda WebSockets, som ansluter på port 443. Mer information finns i exemplet PublishEventsWithWebSocketsAndProxy.java.
- Se om nätverket blockerar specifika IP-adresser. Mer information finns i Vilka IP-adresser behöver jag tillåta?
- Om tillämpligt kontrollerar du proxykonfigurationen. Mer information finns i exemplet PublishEventsWithWebSocketsAndProxy.java.
- Mer information om hur du felsöker nätverksanslutningar finns i Felsöka anslutningsproblem – Azure Event Hubs.
TLS/SSL-handskakningsfel
Det här felet kan inträffa när en avlyssningsproxy används. För att verifiera rekommenderar vi att du testar i värdmiljön med proxyn inaktiverad.
Socket-överbelastningsfel
Program bör föredra att hantera Event Hubs-klienterna som en singleton, skapa och använda en enda instans under programmets livslängd. Den här rekommendationen är viktig eftersom varje klienttyp hanterar sin anslutning. När du skapar en ny Event Hubs-klient resulterar det i en ny AMQP-anslutning som använder en socket. Dessutom är det viktigt att klienter ärver från java.io.Closeable
, så att ditt program måste anropa close()
när det är klart med en klient.
Om du vill använda samma AMQP-anslutning när du skapar flera klienter kan du använda flaggan EventHubClientBuilder.shareConnection()
, hålla en referens till den EventHubClientBuilder
och skapa nya klienter från samma builder-instans.
Ansluta med en IoT-anslutningssträng
Eftersom översättning av en anslutningssträng kräver att du frågar IoT Hub-tjänsten kan Event Hubs-klientbiblioteket inte använda den direkt. I det IoTConnectionString.java exemplet beskrivs hur du frågar IoT Hub för att översätta en IoT-anslutningssträng till en som kan användas med Event Hubs.
Mer information finns i följande artiklar:
- Styra åtkomst till IoT Hub med signaturer för delad åtkomst
- Läsa meddelanden från enhet till moln från den inbyggda slutpunkten
Det går inte att lägga till komponenter i anslutningssträngen
De äldre Event Hubs-klienterna tillät kunder att lägga till komponenter i anslutningssträngen som hämtades från Azure-portalen. De äldre klienterna finns i paket com.microsoft.azure:azure-eventhubs och com.microsoft.azure:azure-eventhubs-eph. Den aktuella generationen stöder endast anslutningssträngar i det formulär som publiceras av Azure-portalen.
Lägg till "TransportType=AmqpWebSockets"
Information om hur du använder webbsocketer finns i exemplet PublishEventsWithSocketsAndProxy.java.
Lägg till "Authentication=Managed Identity"
Information om hur du autentiserar med hanterad identitet finns i exemplet PublishEventsWithAzureIdentity.java.
Mer information om biblioteket Azure.Identity
finns i blogginlägget Authentication och Azure SDK.
Aktivera och konfigurera loggning
Azure SDK för Java erbjuder en konsekvent loggningshistoria som hjälper dig att felsöka programfel och för att påskynda lösningen. De loggar som produceras registrerar flödet av en applikation innan det når sitt slutliga tillstånd för att hjälpa till att lokalisera grundproblemet. Vägledning om loggning finns i Konfigurera loggning i Azure SDK för Java och Felsökningsöversikt.
Förutom att aktivera loggning ger inställningen loggnivån till VERBOSE
eller DEBUG
insikter om bibliotekets tillstånd. I följande avsnitt visas exempelkonfigurationerna log4j2 och logback för att minska överdrivna meddelanden när utförlig loggning är aktiverad.
Konfigurera Log4J 2
Använd följande steg för att konfigurera Log4J 2:
- Lägg till beroendena i din pom.xml genom att använda de från loggningsexemplet pom.xml, i avsnittet "Beroenden som krävs för Log4j2".
- Lägg till log4j2.xml i mappen src/main/resources.
Konfigurera tillbakaloggning
Använd följande steg för att konfigurera tillbakaloggning:
- Lägg till beroendena i din pom.xml genom att använda de som finns i loggningsexemplet pom.xmli avsnittet "Beroenden som krävs för logback".
- Lägg till logback.xml i mappen src/main/resources.
Aktivera AMQP-transportloggning
Om det inte räcker med att aktivera klientloggning för att diagnostisera dina problem kan du aktivera loggning till en fil i det underliggande AMQP-biblioteket Qpid Proton-J-. Qpid Proton-J använder java.util.logging
. Du kan aktivera loggning genom att skapa en konfigurationsfil med innehållet som visas i nästa avsnitt. Du kan också ange proton.trace.level=ALL
och vilka konfigurationsalternativ du vill för java.util.logging.Handler
implementeringen. Implementeringsklasserna och deras alternativ finns i Package java.util.logging i Java 8 SDK-dokumentationen.
Om du vill spåra AMQP-transportramarna anger du miljövariabeln PN_TRACE_FRM=1
.
Exempelfil för "logging.properties"
Följande konfigurationsfil loggar TRACE-nivåutdata från Proton-J till proton-trace.log-filen:
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
Minska loggning
Ett sätt att minska loggningen är att ändra verbositeten. Ett annat sätt är att lägga till filter som exkluderar loggar från loggningsnamnspaket som com.azure.messaging.eventhubs
eller com.azure.core.amqp
. Exempel finns i XML-filerna i avsnitten Konfigurera Log4J 2 och Konfigurera loggback.
När du skickar en bugg är loggmeddelandena från klasser i följande paket intressanta:
com.azure.core.amqp.implementation
com.azure.core.amqp.implementation.handler
- Undantaget är att du kan ignorera meddelandet
onDelivery
iReceiveLinkHandler
.
- Undantaget är att du kan ignorera meddelandet
com.azure.messaging.eventhubs.implementation
Nästa steg
Om felsökningsguiden i den här artikeln inte hjälper dig att lösa problem när du använder Azure SDK för Java-klientbibliotek rekommenderar vi att du ange ett problem i Azure SDK för Java GitHub-lagringsplatsen.