Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Krótki opis problemu
Aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway
z kodem błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponse
jako odpowiedź na interfejs API
połączeń.
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 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/serwera docelowego)
Atrybut
Content-Encoding
jest prawidłowy i . obsługiwane przez Apigee Edge, - Format ładunku wysyłany przez serwer backendu/serwer docelowy w ramach odpowiedzi HTTP
nie
pasuje do formatu kodowania określonego w
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 parametrze
Nagłówek Content-Encoding
.
Oto kilka przykładów obsługiwanych wartości Content-Encoding
oraz sposób działania Apigee Edge
oczekuje, że ładunek będzie reprezentowany w tych przypadkach:
Scenariusz | Content-Encoding | Reprezentacja ładunku |
---|---|---|
Pojedyncze kodowanie | gzip | Format uniksowy Zobacz RFC1952 GZIP Format. |
Pojedyncze kodowanie | Deflate | Ten format wykorzystuje strukturę |
Wielokrotne kodowanie | Wielokrotne kodowanie Jeśli na przykład kodowanie jest wykonywane 2 razy, może to być:
|
Do ładunku zastosowano wiele kodowania, w podanej kolejności, w jakiej występuje w nagłówku. |
Możliwe przyczyny tego błędu są następujące:
Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
---|---|---|
Format ładunku odpowiedzi nie pasuje do kodowania Content | Format ładunku odpowiedzi wysłanego przez serwer backendu/serwer docelowy to
niezakodowane lub nie
pasuje do kodowania określonego w nagłówku Content-Encoding . |
Użytkownicy chmury publicznej i prywatnej Edge |
Typowe kroki diagnostyki
Użyj jednego z tych narzędzi lub metod, aby zdiagnozować ten błąd:
Monitorowanie interfejsów API
Aby zdiagnozować błąd za pomocą monitorowania interfejsów API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z uprawnieniami odpowiednią rolę.
Przełącz się na organizację, w której chcesz zbadać problem.
- Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
- Wybierz okres, w którym zaobserwowano błędy.
- Upewnij się, że filtr Serwer proxy jest ustawiony na Wszystkie.
- Porównaj Kod błędu z czasem.
Wybierz komórkę, która ma kod błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponse
jako poniżej:Informacje o kodzie błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponse
jest wyświetlany w następujący sposób: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ługiwane kodowanie określone w nagłówku odpowiedzi serwera backenduContent-Encoding
.
Narzędzie śledzenia
Aby zdiagnozować błąd za pomocą narzędzia śledzenia:
- Włącz sesję śledzenia.
oraz:
- Poczekaj, aż wystąpi błąd
502 Bad Gateway
lub - Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz te dane.
502 Bad Gateway
- Poczekaj, aż wystąpi błąd
Sprawdź, czy opcja Show all FlowInfos jest włączona:
- Wybierz jedną z odpowiedzi zakończonych niepowodzeniem i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd .
Błąd pojawia się zazwyczaj zaraz po Faza Odebrano odpowiedź z serwera docelowego, jak pokazano poniżej:
-
Zanotuj wartości właściwości ze logu czasu:
- Kodowanie treści:
gzip
- Treść odpowiedzi:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Kodowanie treści:
Przejdź do fazy błędu tuż po otrzymaniu odpowiedzi z serwera docelowego faza:
Zwróć uwagę na właściwości:
- błąd:
Decompression failure at response
- error.class::
com.apigee.errors.http.server.BadGateway
error.cause:
Not in GZIP format
Zapis error.cause wskazuje, że ładunek odpowiedzi nie jest w formacie GZIP. Oznacza to, że Apigee Edge oczekiwał, że ładunek odpowiedzi będzie w formacie GZIP została określona w nagłówku
Content-Encoding
(określono w poprzednim kroku).Dlatego Apigee Edge nie może dekompresować ładunku za pomocą narzędzia gzip i zwraca błądDecompression failure at response
.
Zwróć uwagę, że odpowiedź serwera docelowego/backendowego to
200
w case; jednak aplikacja kliencka otrzyma502
ponieważ Apigee zwraca błąd.- błąd:
Przejdź do etapu Odpowiedź wysłana do klienta i kliknij ją.
Zanotuj te informacje ze śledzenia:
- 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 fazy AX (zarejestrowane dane Analytics) w śledzeniu i kliknij ją.
- Przewiń w dół do sekcji Phase Details (Szczegóły etapu), Error Headers (Nagłówki błędów). Wyznacz wartości X-Apigee-fault-code i X-Apigee-fault-source jak poniżej:
- Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source.
jako
messaging.adaptors.http.flow.DecompressionFailureAtResponse
itarget
, co oznacza, że format ładunku odpowiedzi nie pasuje do kodowanie określone 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żywać logów dostępu NGINX do:
określenie najważniejszych informacji o błędach HTTP
502
. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: wartości ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Wyszukaj błędy (
502
) w danym okresie (jeśli problem wystąpił w przeszłości) lub jeśli jakieś odpowiedzi nadal występują502
Jeśli znajdziesz błędy
502
z kodem błędu X-Apigee-fault-code pasujący do wartościmessaging.adaptors.http.flow.DecompressionFailureAtResponse
, a następnie określ wartość źródła X-Apigee-fault-source..Przykładowy błąd 502 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z logu dostępu NGINX zawiera następujące wartości dla: 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 Content-Encoding
Domyślnie Apigee Edge zawsze dekompresuje ładunek, jeśli nagłówek odpowiedzi
Content-Encoding
zawiera prawidłowe i a
obsługiwane kodowanie. Można więc oczekiwać, że format ładunku odpowiedzi
powinno być zgodne z kodowaniem określonym w nagłówku odpowiedzi Content-Encoding
.
Ten błąd pojawia się w przypadku niezgodności.
Diagnostyka
- Określ kod błędu i źródło błędu dla błędu zaobserwowanego za pomocą interfejsu API. Logi monitorowania, narzędzia śledzenia lub logi dostępu NGINX zgodnie z opisem w artykule Najczęstsze czynności diagnostyczne.
- Jeśli kod błędu to
messaging.adaptors.http.flow.DecompressionFailureAtResponse
oraz Źródło błędu ma wartośćtarget
, a następnie ten wskazuje, że format ładunku odpowiedzi wysłanego przez serwer backendu/serwer docelowy nie pasuje do obsługiwane kodowanie określone w nagłówku odpowiedziContent-Encoding
. Możesz określić niezgodność w ramach odpowiedzi HTTP, używając jednego z tych argumentów metody:
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, przeczytaj
faultstring
.Przykładowy komunikat o błędzie:
"faultstring":"Decompression failure at response"
- W powyższym komunikacie o błędzie pojawia się
"Decompression failure at response"
, co oznacza, że odpowiedź nie można zdekompresować przy użyciu kodowania określonego wContent-Encoding
.
Śledzenie
Aby przeprowadzić weryfikację za pomocą logu czasu:
- Określ Content-Type i error.cause. za pomocą Trace zgodnie z opisem w sekcji Typowe kroki 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. ładunek odpowiedzi nie jest w formacie GZIP, (jak wskazuje error.cause). Dlatego Apigee Edge przekazuje odpowiedź
502 Bad Gateway
i kod błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse
- Kodowanie treści:
Rzeczywiste żądanie
Aby przeprowadzić weryfikację na podstawie rzeczywistego żądania:
Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego/backendu aplikacji, a następnie wykonaj te czynności:
- Jeśli korzystasz z chmury publicznej lub Private Cloud, prześlij prośbę bezpośrednio do serwera backendu z serwera backendu lub jakiegokolwiek innego na którym możesz wysłać żądanie do serwera backendu.
- Jeśli jesteś użytkownikiem Private Cloud, możesz też wysłać prośbę z jednego z procesorów komunikatów.
- Zbadaj odpowiedź wysłaną przez serwer backendu i określ wartość
przekazywane w nagłówku odpowiedzi
Content-Encoding.
- Określ format ładunku wysłanego w ramach żądania.
- Jeśli wartość nagłówka
Content-Encoding
znajduje się na liście obsługiwane kodowanie, ale format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówkuContent-Encoding
, to jest właśnie 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 funkcjiContent-Encoding
, który jest obsługiwane kodowanie w Apigee Edge. Jednakresponse_payload.zip
jest wysyłany w postaci pliku ZIP. Dlatego odpowiedź kończy się niepowodzeniem i jest wyświetlany błąd502 Bad Gateway
z kodem błędu:messaging.adaptors.http.flow.DecompressionFailureAtResponse
Logi procesora wiadomości
Aby przeprowadzić weryfikację za pomocą logów procesora wiadomości:
Jeśli jesteś użytkownikiem Private Cloud, możesz używać logów procesora wiadomości w celu ustalenia najważniejszych informacji o błędach HTTP
502
.Sprawdź dziennik procesora wiadomości:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Wyszukaj błędy
502
w konkretnym okresie czas trwania (jeśli problem wystąpił w przeszłości) lub jeśli pojawią się jakieś odpowiedzi; nadal występują błędy z użyciem funkcji502
. Możesz użyć takiego ciągu wyszukiwania:grep -ri "ZipException"
Znajdziesz w nim wiersze z pliku system.log podobne do tych:
Scenariusz 1
Scenariusz 1. Gdy 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 wskazuje, że odpowiedź nie jest wysyłany w formacie GZIP, chociażContent-Encoding
jest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu502
z kodem błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse
do aplikacji klienckich.Scenariusz 2
Scenariusz 2. Gdy 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 checkLinie
java.util.zip.ZipException: incorrect header check
orazCaused by: java.util.zip.DataFormatException: incorrect header check
w powyższym komunikacie o błędzie wskazuje, że ładunek odpowiedzi nie został wysłany w deflate i nie pasuje do kodowania określonego wContent-Encoding
nagłówek deflate. W związku z tym Apigee Edge zgłasza wyjątek i zwraca kod stanu502
z kod błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse
do aplikacji klienckich.
-
Rozdzielczość
- Jeśli nie ma potrzeby skompresowanego ładunku odpowiedzi w procesie serwera proxy interfejsu API w Apigee Edge
i na serwerze backendu, nie przekazuj nagłówka
Content-Encoding
. Jeśli chcesz skompresować ładunek odpowiedzi, przejdź do kroku 2. - Jeśli musisz skompresować ładunek odpowiedzi, upewnij się, że serwer backendu
zawsze wysyła to:
- Dowolny
obsługiwane kodowanie jako wartość nagłówka
Content-Encoding
w polu odpowiedź - Ładunek odpowiedzi w obsługiwanym formacie Apigee Edge jest zgodny z kodowaniem
format określony w nagłówku
Content-Encoding
- Dowolny
obsługiwane kodowanie jako wartość nagłówka
- W przykładzie powyżej ładunek odpowiedzi jest w formacie ZIP, ale jej nagłówek
określa
Content-Encoding: gzip
. Możesz rozwiązać problem, wysyłając odpowiedź nagłówek jakoContent-Encoding: gzip
oraz ładunek odpowiedzi wgzip
format: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 wysyła kod stanu 502 Bad Gateway
zawierający kod błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponse
zgodnie z poniższym RFC
specyfikacje:
Specyfikacja |
---|
RFC 7231, sekcja 6.5.1 |
RFC 7231, sekcja 3.1.2.2 |
Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, wejdź na Musi zbierać informacje diagnostyczne.
Musi zbierać informacje diagnostyczne
Zbierz te informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem Public Cloud, 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:
- Pełny komunikat o błędzie zaobserwowany dla odpowiedzi zakończonych niepowodzeniem
- Nazwa środowiska
- Pakiet serwera proxy interfejsu 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 przez wartości rzeczywiste.
- Dzienniki systemowe procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log