Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
Krótki opis problemu
W odpowiedzi na wywołania interfejsu API aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 502 Bad Gateway
Może też pojawić się komunikat o błędzie podobny do tego poniżej:
{
"fault":{
"faultstring":"Decompression failure at response",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
}
}
}Możliwe przyczyny
Ten błąd występuje tylko wtedy, gdy:
- Kodowanie określone w nagłówku odpowiedzi HTTP (z serwera backendu lub serwera docelowego)
Content-Encodingjest prawidłowe i obsługiwane przez Apigee Edge. - Format ładunku wysłanego przez serwer backendu lub serwer docelowy w ramach odpowiedzi HTTP nie jest zgodny z formatem kodowania określonym w nagłówku
Content-Encoding.
BUT
Dzieje się tak, ponieważ Apigee Edge nie może zdekodować ładunku przy użyciu określonego kodowania, ponieważ format ładunku nie jest taki sam jak kodowanie określone w nagłówku Content-Encoding.
Oto kilka przykładów obsługiwanych wartości parametru Content-Encoding i sposobu, w jaki Apigee Edge oczekuje reprezentacji ładunku w tych przypadkach:
| Scenariusz | Content-Encoding | Reprezentacja ładunku |
|---|---|---|
| Pojedyncze kodowanie | gzip | Format Unix Zobacz RFC1952 GZIP Format. |
| Pojedyncze kodowanie | spuszczać powietrze, | Ten format używa struktury |
| Wiele kodowań | Wiele kodowań Na przykład w przypadku dwukrotnego kodowania może to być:
|
Wielokrotne kodowanie zastosowane do ładunku w podanej kolejności, w jakiej występuje w nagłówku. |
Możliwe przyczyny tego błędu:
| Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
|---|---|---|
| Format ładunku odpowiedzi nie pasuje do kodowania treści | Format ładunku odpowiedzi wysłanego przez serwer backendu lub serwer docelowy jest niezakodowany lub nie pasuje do kodowania określonego w nagłówku Content-Encoding. |
Użytkownicy publicznej i prywatnej chmury Edge |
Typowe etapy diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub technik:
Monitorowanie interfejsów API
Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsu API > Zbadaj.
- Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
- Sprawdź, czy filtr Proxy jest ustawiony na Wszystkie.
- Wykreśl kod błędu na osi czasu.
Wybierz komórkę z kodem błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponse, jak pokazano poniżej:
Informacje o kodzie błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponsesą wyświetlane w sposób pokazany poniżej:
Kliknij Wyświetl logi i rozwiń wiersz, w którym wystąpił błąd
502.
- W oknie Dzienniki zanotuj te informacje:
- Kod stanu:
502 - Źródło błędu:
target - Kod błędu:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Kod stanu:
- Jeśli pole Fault Source ma wartość
target, oznacza to, że format ładunku odpowiedzi nie pasuje do obsługiwanego kodowania określonego w nagłówku odpowiedzi serwera backenduContent-Encoding.
Narzędzie śledzenia
Aby zdiagnozować błąd za pomocą narzędzia Trace:
- Włącz śledzenie sesji i wybierz jedną z tych opcji:
- Poczekaj na wystąpienie błędu
502 Bad Gatewaylub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz
502 Bad Gateway.
- Poczekaj na wystąpienie błędu
Sprawdź, czy opcja Pokaż wszystkie informacje o przepływach jest włączona:
- Wybierz jedną z odpowiedzi, które nie przeszły testu, i sprawdź ślad.
- Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
Błąd zwykle występuje w przepływie bezpośrednio po fazie Response Received from target server (Odpowiedź otrzymana z serwera docelowego), jak pokazano poniżej:
-
Zanotuj wartości właściwości ze śladu:
- Content-Encoding:
gzip - Treść odpowiedzi:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
Przejdź do fazy błędu tuż po fazie Response Received from target server (Odpowiedź otrzymana z serwera docelowego):
Zanotuj właściwości:
- Błąd:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formatW error.cause jest podane, że ładunek odpowiedzi nie jest w formacie GZIP. Oznacza to, że Apigee Edge oczekiwał, że ładunek odpowiedzi będzie w formacie GZIP, zgodnie z tym, co zostało określone w nagłówku
Content-Encoding(ustalonym w poprzednim kroku).Dlatego Apigee Edge nie może zdekompresować ładunku za pomocą gzip i zwraca błądDecompression failure at response.
Zwróć uwagę, że w tym przypadku odpowiedź z serwera docelowego/backendu to
200, ale aplikacja kliencka otrzyma odpowiedź502, ponieważ błąd jest zwracany przez Apigee Edge.- Błąd:
W śladzie przejdź do fazy Odpowiedź wysłana do klienta i kliknij ją.
Zanotuj te informacje ze śladu:
- Kod stanu:
502 Bad Gateway. - Treść błędu:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Kod stanu:
Otwórz fazę AX (Analytics Data Recorded) w śladzie i kliknij ją.
- Przewiń w dół do sekcji Szczegóły fazy i Nagłówki błędów i określ wartości X-Apigee-fault-code i X-Apigee-fault-source, jak pokazano poniżej:
- Wartości X-Apigee-fault-code i X-Apigee-fault-source
będą miały postać
messaging.adaptors.http.flow.DecompressionFailureAtResponseitarget, co oznacza, że format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówkuContent-Encoding.Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników dostępu NGINX do określania kluczowych informacji o błędach HTTP
502. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Sprawdź, czy w określonym czasie wystąpiły jakieś
502błędy (jeśli problem pojawił się w przeszłości) lub czy nadal występują odpowiedzi z błędem502. Jeśli znajdziesz błędy
502z wartością X-Apigee-fault-code równąmessaging.adaptors.http.flow.DecompressionFailureAtResponse, określ wartość X-Apigee-fault-source.Przykładowy błąd 502 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości atrybutów X-Apigee-fault-code i X-Apigee-fault-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
Przyczyna: format ładunku odpowiedzi nie pasuje do kodowania treści
Domyślnie Apigee Edge zawsze dekompresuje ładunek, jeśli nagłówek odpowiedzi Content-Encoding zawiera prawidłowe i
obsługiwane kodowanie. Oczekuje się więc, że format ładunku odpowiedzi będzie zgodny z kodowaniem określonym w nagłówku odpowiedzi Content-Encoding.
Jeśli wystąpi niezgodność, pojawi się ten błąd.
Diagnostyka
- Określ kod błędu i źródło błędu zaobserwowanego za pomocą monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w typowych krokach diagnostycznych.
- Jeśli Fault Code to
messaging.adaptors.http.flow.DecompressionFailureAtResponse, a Fault Source ma wartośćtarget, oznacza to, że format ładunku odpowiedzi wysłanego przez serwer backendu lub serwer docelowy nie jest zgodny z obsługiwanym kodowaniem określonym w nagłówku odpowiedziContent-Encoding. Niezgodność możesz określić w ramach odpowiedzi HTTP, korzystając z jednej z tych metod:
Komunikat o błędzie
Aby sprawdzić poprawność za pomocą komunikatu o błędzie:
-
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z
faultstring.Przykładowy komunikat o błędzie:
"faultstring":"Decompression failure at response"
- W powyższym komunikacie o błędzie wyświetla się
"Decompression failure at response", co oznacza, że nie można zdekompresować odpowiedzi przy użyciu kodowania określonego w nagłówkuContent-Encoding.
Śledzenie
Aby sprawdzić poprawność za pomocą śladu:
- Określ Content-Type i error.cause, korzystając z Trace, zgodnie z opisem w Typowych krokach diagnostycznych.
Wartości z przykładowego śledzenia są następujące:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
Wartość w nagłówku odpowiedzi Content-Encoding to gzip, ale ładunek odpowiedzi nie jest w formacie GZIP (co wskazuje error.cause). Dlatego Apigee Edge odpowiada kodem
502 Bad Gatewayi kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
Rzeczywista prośba
Aby sprawdzić poprawność za pomocą rzeczywistego żądania:
Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego lub serwera backendu, wykonaj te czynności:
- Jeśli jesteś użytkownikiem chmury publicznej lub prywatnej, wyślij żądanie bezpośrednio do serwera backendu z tego serwera lub z dowolnego innego urządzenia, z którego możesz wysłać żądanie do serwera backendu.
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz też wysłać żądanie do serwera backendu z jednego z procesorów wiadomości.
- Sprawdź odpowiedź wysłaną przez serwer backendu i określ wartość przekazaną w nagłówku odpowiedzi
Content-Encoding.. - Określ format ładunku wysyłanego w ramach żądania.
- Jeśli wartość nagłówka
Content-Encodingznajduje się na liście obsługiwanych kodowań, ale format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówkuContent-Encoding, to jest to przyczyną problemu.Przykład:
curl -v https://HOSTALIAS/test
***trimmed*** > < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.zip Response Body(not in GZIP format)>W przykładzie powyżej odpowiedź wysyła wartość
gzipdo nagłówkaContent-Encoding, który jest obsługiwanym kodowaniem w Apigee Edge.response_payload.zipjest jednak wysyłany jako plik ZIP. Dlatego ta odpowiedź kończy się niepowodzeniem z błędem502 Bad Gatewayi kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse.
Dzienniki procesora komunikatów
Aby przeprowadzić weryfikację za pomocą logów procesora komunikatów:
Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów procesora komunikatów, aby określić kluczowe informacje o błędach HTTP
502.Sprawdź dziennik procesora komunikatów:
/opt/apigee/var/log/edge-message-processor/logs/system.logSprawdź, czy w określonym czasie wystąpiły jakieś błędy
502(jeśli problem pojawił się w przeszłości) lub czy nadal występują odpowiedzi z błędem502. Możesz użyć tego ciągu wyszukiwania:grep -ri "ZipException"
Znajdziesz w nim wiersze podobne do tych:
Scenariusz 1
Scenariusz 1. Odpowiedź interfejsu API zawiera nagłówek Content-Encoding: gzip
2021-08-02 06:50:25,433 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0 bytesWritten=203 age=469ms lastIO=0ms isOpen=true).onExceptionRead exception: {}java.util.zip.ZipException: Not in GZIP format---trimmed-- 2021-08-02 06:50:25,433 NIOThread@2 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:50:25,434 NIOThread@2 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format) 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatWiersz
java.util.zip.ZipException: Not in GZIP formatw powyższym komunikacie o błędzie wskazuje, że ładunek odpowiedzi nie jest wysyłany w formacie GZIP, mimo żeContent-Encodingjest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu502z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponsedo aplikacji klienckich.Scenariusz 2
Scenariusz 2. Odpowiedź interfejsu API zawiera nagłówek Content-Encoding: deflate
2021-08-02 06:35:21,215 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0 bytesWritten=202 age=439ms lastIO=2ms isOpen=true).onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check---trimmed---- Caused by:java.util.zip.DataFormatException: incorrect header check---trimmed--- 2021-08-02 06:35:21,215 NIOThread@0 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:35:21,216 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277, incorrect header check) 2021-08-02 06:35:21,216 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.util.zip.ZipException: incorrect header check occurred while writing to channel null 2021-08-02 06:35:21,217 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: incorrect header checkWiersze
java.util.zip.ZipException: incorrect header checkiCaused by: java.util.zip.DataFormatException: incorrect header checkw powyższym komunikacie o błędzie wskazują, że ładunek odpowiedzi nie jest wysyłany w formacie deflate i nie pasuje do kodowania określonego w nagłówkuContent-Encodingdeflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu502z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponsedo aplikacji klienckich.
-
Rozdzielczość
- Jeśli w przepływie proxy interfejsu API w Apigee Edge i na serwerze backendu nie jest potrzebny skompresowany ładunek odpowiedzi, nie przekazuj nagłówka
Content-Encoding. Jeśli konieczne jest skompresowanie ładunku odpowiedzi, przejdź do kroku 2. - Jeśli konieczne jest skompresowanie ładunku odpowiedzi, upewnij się, że serwer backendu zawsze wysyła te informacje:
- dowolne
obsługiwane kodowanie jako wartość nagłówka
Content-Encodingw odpowiedzi. - Ładunek odpowiedzi w obsługiwanym formacie do Apigee Edge jest zgodny z formatem kodowania określonym w nagłówku
Content-Encoding.
- dowolne
obsługiwane kodowanie jako wartość nagłówka
- W omówionym powyżej przykładzie ładunek odpowiedzi jest w formacie ZIP, ale nagłówek odpowiedzi określa
Content-Encoding: gzip. Możesz rozwiązać ten problem, wysyłając nagłówek odpowiedzi jakoContent-Encoding: gzip, a ładunek odpowiedzi w formaciegzip:curl -v https://HOSTALIAS/v1/test
> < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.gz Response Body(in GZIP format)>
Specyfikacja
Apigee Edge odpowiada kodem stanu 502 Bad Gateway z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse zgodnie ze specyfikacjami RFC:
| Specyfikacja |
|---|
| RFC 7231, sekcja 6.5.1 |
| RFC 7231, sekcja 3.1.2.2 |
Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.
musi zbierać informacje diagnostyczne;
Zbierz te informacje diagnostyczne, a potem skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa proxy interfejsu API
- Pełne polecenie
curlużyte do odtworzenia błędu502 - Plik śledzenia odpowiedzi interfejsu API
Jeśli jesteś użytkownikiem chmury Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie w przypadku nieudanych odpowiedzi
- Nazwa środowiska
- Pakiet proxy interfejsu API
- Plik śledzenia odpowiedzi interfejsu API
Logi dostępu NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora komunikatów
/opt/apigee/var/log/edge-message-processor/logs/system.log