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-Encodingjest 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.DecompressionFailureAtResponsejako poniżej:
Informacje o kodzie błędu
messaging.adaptors.http.flow.DecompressionFailureAtResponsejest 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 Gatewaylub - 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 formatZapis 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
200w case; jednak aplikacja kliencka otrzyma502ponieważ 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.DecompressionFailureAtResponseitarget, 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.DecompressionFailureAtResponseX-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_logGdzie: 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
502z 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.DecompressionFailureAtResponseX-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.DecompressionFailureAtResponseoraz Ź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 Gatewayi 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-Encodingznajduje 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ść
gzipdo funkcjiContent-Encoding, który jest obsługiwane kodowanie w Apigee Edge. Jednakresponse_payload.zipjest wysyłany w postaci pliku ZIP. Dlatego odpowiedź kończy się niepowodzeniem i jest wyświetlany błąd502 Bad Gatewayz 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.logWyszukaj błędy
502w konkretnym okresie czas trwania (jeśli problem wystąpił w przeszłości) lub jeśli pojawiły 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 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 odpowiedź nie jest wysyłany w formacie GZIP, chociażContent-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. 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 checkorazCaused by: java.util.zip.DataFormatException: incorrect header checkw powyższym komunikacie o błędzie wskazuje, że ładunek odpowiedzi nie został wysłany w deflate i nie pasuje do kodowania określonego wContent-Encodingnagłówek deflate. W związku z tym Apigee Edge zgłasza wyjątek i zwraca kod stanu502z kod błędumessaging.adaptors.http.flow.DecompressionFailureAtResponsedo 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-Encodingw 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: gziporaz ładunek odpowiedzi wgzipformat: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
curluż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_logGdzie: 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