Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
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żesz też zobaczyć komunikat o błędzie podobny do tego:
{ "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 odpowiedzi HTTP (z nagłówka backendu/serwera docelowego)
Content-Encoding
jest prawidłowe i obsługiwane przez Apigee Edge, - Format ładunku wysyłany przez backend/serwer docelowy w ramach odpowiedzi HTTP nie pasuje do formatu kodowania określonego w nagłówku
Content-Encoding
ALE
Dzieje się tak, ponieważ Apigee Edge nie dekoduje ładunku za pomocą podanego kodowania, ponieważ format ładunku nie jest w tym samym formacie co kodowanie określone w nagłówku Content-Encoding
.
Oto kilka przykładów obsługiwanych wartości Content-Encoding
i informacje o tym, jak Apigee Edge oczekuje reprezentacji ładunku w takich przypadkach:
Scenariusz | Content-Encoding | Reprezentacja ładunku |
---|---|---|
Pojedyncze kodowanie | gzip | Format Unix |
Pojedyncze kodowanie | deflate | Ten format wykorzystuje strukturę |
Wiele kodowania | Wiele kodowania Jeśli na przykład kodowanie zostało wykonane dwukrotnie, może to wyglądać tak:
|
Do ładunku zastosowano wiele kodowania w takiej kolejności, w jakiej wyświetla się 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 wysyłanego przez backend/serwer docelowy jest niezakodowany albo nie pasuje do kodowania określonego w nagłówku Content-Encoding . |
Użytkownicy chmury publicznej i prywatnej usługi Edge |
Najczęstsze kroki diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub metod:
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 interfejsów API > Zbadaj.
- Wybierz przedział czasu, w którym zaobserwowano błędy.
- Upewnij się, że filtr Serwer proxy jest ustawiony na wartość Wszystkie.
- Porównaj kod błędu z czasem.
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.DecompressionFailureAtResponse
są wyświetlane jak poniżej:Kliknij Wyświetl logi i rozwiń wiersz, w którym wystąpił błąd
502
.- W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
502
- Źródło błędu:
target
- Kod błędu:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- Kod stanu:
- Jeśli źródło błędu 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 do śledzenia
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz sesję śledzenia i wykonaj jedną z tych czynności:
- Poczekaj na wystąpienie błędu
502 Bad Gateway
lub - 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 Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:
- Wybierz 1 z odpowiedzi z wynikiem błędu i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
Błąd pojawia się zwykle w procesie tuż po etapie Odpowiedź otrzymana z serwera docelowego, jak pokazano poniżej:
-
Zapisz wartości właściwości ze śledzenia:
- Kodowanie treści:
gzip
- Treść odpowiedzi:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Kodowanie treści:
Przejdź do etapu błędu tuż po etapie Odpowiedź otrzymana z serwera docelowego:
Zwróć uwagę na te właściwości:
- błąd:
Decompression failure at response
- error.class:
com.apigee.errors.http.server.BadGateway
error.cause:
Not in GZIP format
Instrukcja error.cause wskazuje, że ładunek odpowiedzi nie jest w formacie GZIP. Oznacza to, że usługa Apigee Edge oczekiwała, że ładunek odpowiedzi będzie w formacie GZIP, co określono w nagłówku
Content-Encoding
(co zostało określone w poprzednim kroku).W związku z tym Apigee Edge nie może dekompresować ładunku za pomocą narzędzia gzip i zwraca błądDecompression failure at response
.
Zwróć uwagę, że w tym przypadku odpowiedź z serwera docelowego lub backendu to
200
, ale aplikacja kliencka otrzyma odpowiedź502
, ponieważ błąd jest zwracany przez Apigee Edge.- błąd:
Przejdź do etapu Odpowiedź wysłana do klienta w logu czasu i kliknij ją.
Zwróć uwagę na te informacje logu czasu:
- Kod stanu:
502 Bad Gateway
. - Treść błędu:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Kod stanu:
Przejdź do etapu AX (rejestrowane dane Analytics) w logu czasu i kliknij go.
- Przewiń w dół do sekcji Szczegóły fazy i Nagłówki błędów i określ wartości w polach X-Apigee-fault-code oraz X-Apigee-fault-source, jak pokazano poniżej:
- Będą widoczne wartości X-Apigee-fault-code i X-Apigee-fault-source jako
messaging.adaptors.http.flow.DecompressionFailureAtResponse
oraztarget
, 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.DecompressionFailureAtResponse
X-Apigee-fault-source target
NGINX
Aby zdiagnozować błąd przy użyciu logów dostępu NGINX:
- Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędach HTTP
502
. Sprawdź logi dostępu do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Sprawdź, czy w danym okresie wystąpiły jakieś błędy
502
(jeśli problem wystąpił w przeszłości) lub czy jakieś odpowiedzi wciąż kończą się niepowodzeniem (502
). Jeśli znajdziesz błędy
502
z kodem X-Apigee-fault-code zgodnym z wartościąmessaging.adaptors.http.flow.DecompressionFailureAtResponse
, sprawdź wartość źródła błędów X-Apigee.Przykładowy błąd 502 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodu X-Apigee-fault-code i X-Apigee-fault-code :
Nagłówki odpowiedzi Wartość X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-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. Dlatego format ładunku odpowiedzi powinien być zgodny z kodowaniem określonym w nagłówku odpowiedzi Content-Encoding
.
Jeśli występuje niezgodność, pojawia się ten błąd.
Diagnostyka
- Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego przy użyciu logów dostępu API monitorowania, narzędzia do śledzenia lub NGINX zgodnie z opisem w częstych krokach diagnostyki.
- Jeśli kod błędu to
messaging.adaptors.http.flow.DecompressionFailureAtResponse
, a źródło błędu ma wartośćtarget
, oznacza to, że format ładunku odpowiedzi wysłanego przez backend/serwer docelowy nie pasuje do obsługiwanego kodowania określonego w nagłówku odpowiedziContent-Encoding
. Możesz zidentyfikować niezgodność w odpowiedzi HTTP, korzystając z jednej z tych metod:
Komunikat o błędzie
Aby przeprowadzić weryfikację przy użyciu komunikatu o błędzie:
-
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z dokumentem
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 odpowiedzi nie udało się zdekompresować za pomocą kodowania określonego w nagłówkuContent-Encoding
.
Trace
Aby sprawdzić poprawność danych za pomocą logu czasu:
- Określ Content-Type i error.cause za pomocą śledzenia zgodnie z opisem w częstych krokach diagnostyki.
Wartości z przykładowego logu czasu są następujące:
- Kodowanie treści:
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 na to error.cause). Dlatego Apigee Edge w odpowiedzi wysyła
502 Bad Gateway
i kod błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- Kodowanie treści:
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 backendu, wykonaj te czynności:
- Jeśli jesteś użytkownikiem chmury publicznej/chmury prywatnej, wyślij żądanie bezpośrednio do serwera backendu z samego serwera backendu lub dowolnej innej maszyny, z której możesz je wysyłać do serwera backendu.
- Jeśli jesteś użytkownikiem Private Cloud, możesz też wysłać żądanie do serwera backendu z jednego z podmiotów przetwarzających wiadomości.
- Sprawdź odpowiedź wysłaną przez serwer backendu i ustal wartość przekazaną w nagłówku odpowiedzi
Content-Encoding.
- Określ format ładunku wysyłanego w ramach żądania.
- Jeśli wartość nagłówka
Content-Encoding
znajduje się na liście obsługiwanego kodowania, ale format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówkuContent-Encoding
, to jest 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)>Powyższa przykładowa odpowiedź wysyła wartość
gzip
do nagłówkaContent-Encoding
, które jest obsługiwanym kodowaniem w Apigee Edge.response_payload.zip
jest jednak wysyłana jako plik ZIP. Dlatego ta odpowiedź kończy się błędem502 Bad Gateway
z kodem błędu:messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
Logi procesora wiadomości
Aby sprawdzić poprawność danych za pomocą dzienników procesora wiadomości:
Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów procesora wiadomości, aby określić kluczowe informacje o błędach HTTP
502
.Sprawdź dziennik procesora wiadomości:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Sprawdź, czy w danym okresie wystąpiły jakieś błędy
502
(jeśli problem wystąpił w przeszłości) lub czy jakieś odpowiedzi wciąż kończą się niepowodzeniem z502
. Możesz użyć tego ciągu wyszukiwania:grep -ri "ZipException"
Znajdą się w nim wiersze z pliku system.log podobne do tych:
Scenariusz 1
Scenariusz 1. Odpowiedź interfejsu API ma 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 format
occurred 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 format
w powyższym komunikacie o błędzie oznacza, że ładunek odpowiedzi nie został wysłany w formacie GZIP, mimo żeContent-Encoding
jest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu502
z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse
.Scenariusz 2
Scenariusz 2. Odpowiedź interfejsu API ma 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 check
iCaused by: java.util.zip.DataFormatException: incorrect header check
w powyższym komunikacie o błędzie wskazują, że ładunek odpowiedzi nie został wysłany w formacie deflate i nie pasuje do kodowania określonego w nagłówkuContent-Encoding
tagu deflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu502
z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse
.
-
Rozdzielczość
- Jeśli nie potrzebujesz skompresowanego ładunku odpowiedzi w przepływie serwera proxy interfejsu API w Apigee Edge i na serwerze backendu, nie przekazuj nagłówka
Content-Encoding
. Jeśli musisz skompresować ładunek odpowiedzi, przejdź do kroku 2. - Jeśli musisz skompresować ładunek odpowiedzi, sprawdź, czy serwer backendu zawsze wysyła:
- Dowolne
obsługiwane kodowanie jako wartość nagłówka
Content-Encoding
w odpowiedzi - Ładunek odpowiedzi w obsługiwanym formacie Apigee Edge pasuje do formatu kodowania określonego w nagłówku
Content-Encoding
- Dowolne
obsługiwane kodowanie jako wartość nagłówka
- W podanym wyżej przykładzie ładunek odpowiedzi jest w formacie ZIP, ale w nagłówku odpowiedzi podano
Content-Encoding: gzip
. Aby rozwiązać ten problem, wyślij nagłówek odpowiedzi w formacieContent-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 w odpowiedzi przesyła kod stanu 502 Bad Gateway
z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse
zgodnie z tą specyfikacją RFC:
Specyfikacja |
---|
RFC 7231, sekcja 6.5.1 |
RFC 7231, sekcja 3.1.2.2 |
Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Musisz zebrać informacje diagnostyczne.
Musisz zebrać informacje diagnostyczne
Zbierz te informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa serwera proxy interfejsu API
- Wykonaj polecenie
curl
użyte do odtworzenia błędu502
- Plik śledzenia odpowiedzi interfejsu API
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Zaobserwowany pełny komunikat o błędzie dotyczący nieudanych odpowiedzi
- Nazwa środowiska
- Pakiet proxy API
- Plik śledzenia odpowiedzi interfejsu API
Logi dostępu NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log