Stai visualizzando la documentazione di Apigee Edge.
Vai alla
documentazione di Apigee X. informazioni
Sintomo
L'applicazione client riceve un codice di stato HTTP 502 Bad Gateway
con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse
in risposta alle chiamate API.
Messaggio di errore
L'applicazione client riceve il seguente codice di risposta:
HTTP/1.1 502 Bad Gateway
Inoltre, potrebbe essere visualizzato un messaggio di errore simile a quello mostrato di seguito:
{ "fault":{ "faultstring":"Decompression failure at response", "detail":{ "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse" } } }
Possibili cause
Questo errore si verifica solo se:
- La codifica specificata nell'intestazione della risposta HTTP (dal server di backend/di destinazione)
Content-Encoding
è valida e supportata da Apigee Edge, - Il formato del payload inviato dal server di backend/target come parte della risposta HTTP
non corrisponde al formato di codifica specificato nell'intestazione
Content-Encoding
MA
Questo perché Apigee Edge non riesce a decodificare il payload utilizzando la codifica specificata, poiché il formato del payload non ha lo stesso formato della codifica specificata nell'intestazione Content-Encoding
.
Ecco alcuni esempi di valori Content-Encoding
supportati e di come Apigee Edge prevede che sia la rappresentazione del payload in questi casi:
Scenario | Content-Encoding | Rappresentazione del payload |
---|---|---|
Codifica singola | gzip | Il formato Unix Consulta il formato GZIP RFC1952. |
Codifica singola | sgonfiare | Questo formato utilizza la struttura |
Codifica multipla | Codifica multipla Ad esempio, nei casi in cui la codifica viene eseguita due volte, può essere:
|
Più codifica applicata al payload nell'ordine specificato, così come appare nell'intestazione. |
Le possibili cause di questo errore sono le seguenti:
Causa | Descrizione | Istruzioni per la risoluzione dei problemi applicabili a |
---|---|---|
Il formato del payload della risposta non corrisponde al Content-Encoding | Il formato del payload della risposta inviato dal server di backend/di destinazione non è codificato o non corrisponde alla codifica specificata nell'intestazione Content-Encoding . |
Utenti di cloud pubblico e privato perimetrale |
Passaggi di diagnosi più comuni
Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:
Monitoraggio delle API
Per diagnosticare l'errore utilizzando il monitoraggio delle API:
- Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.
- Vai alla pagina Analizza > Monitoraggio API > Esamina.
- Seleziona il periodo di tempo specifico in cui hai riscontrato gli errori.
- Assicurati che il filtro Proxy sia impostato su Tutti.
- Traccia Codice di errore su Ora.
Seleziona una cella con il codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtResponse
come mostrato di seguito:Le informazioni sul codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtResponse
vengono visualizzate come mostrato di seguito:Fai clic su Visualizza log ed espandi la riga in cui viene visualizzato l'errore
502
.- Nella finestra Log, prendi nota dei seguenti dettagli:
- Codice di stato:
502
- Origine errore:
target
- Codice di errore:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- Codice di stato:
- Se Origine dell'errore ha il valore
target
, significa che il formato del payload della risposta non corrisponde alla codifica supportata specificata nell'intestazione della rispostaContent-Encoding
del server di backend.
Strumento Traccia
Per diagnosticare l'errore utilizzando lo strumento Trace:
- Abilita la sessione di traccia
e:
- Attendi che si verifichi l'errore
502 Bad Gateway
oppure - Se riesci a riprodurre il problema, effettua la chiamata API e riproduci
502 Bad Gateway
.
- Attendi che si verifichi l'errore
Assicurati che l'opzione Mostra tutte le FlowInfos sia abilitata:
- Seleziona una delle risposte con errori ed esamina la traccia.
- Naviga tra le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
In genere, troverai l'errore in un flusso subito dopo la fase Risposta ricevuta dal server di destinazione, come mostrato di seguito:
-
Prendi nota dei valori delle proprietà della traccia:
- Codifica dei contenuti:
gzip
- Corpo dei contenuti della risposta:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Codifica dei contenuti:
Vai alla fase di errore subito dopo la fase Risposta ricevuta dal server di destinazione:
( visualizza immagine ingrandita)
Nota le proprietà:
- errore:
Decompression failure at response
- error.class:
com.apigee.errors.http.server.BadGateway
error.cause:
Not in GZIP format
Il campo error.cause indica che il payload della risposta non è in formato GZIP. Ciò significa che Apigee Edge prevedeva che il payload della risposta fosse in formato GZIP, come specificato nell'intestazione
Content-Encoding
(determinata nel passaggio precedente).Di conseguenza, Apigee Edge non può decomprimere il payload utilizzando gzip e restituisce l'erroreDecompression failure at response
.
Tieni presente che in questo caso la risposta del server di destinazione/backend è
200
; tuttavia, l'applicazione client riceverà una risposta502
poiché l'errore viene restituito da Apigee Edge.- errore:
Passa alla fase Risposta inviata al client nella traccia e fai clic su di essa.
( visualizza immagine ingrandita)
Prendi nota dei seguenti dettagli dalla traccia:
- Codice di stato:
502 Bad Gateway
. - Contenuto dell'errore:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Codice di stato:
Vai alla fase AX (Analytics Data Recorded) nella traccia e fai clic.
- Scorri verso il basso fino alla sezione Dettagli fase, Intestazioni degli errori e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:
- Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source come
messaging.adaptors.http.flow.DecompressionFailureAtResponse
etarget
, a indicare che il formato del payload della risposta non corrispondeva alla codifica specificata nell'intestazioneContent-Encoding
.Intestazioni della risposta Valore X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
NGINX
Per diagnosticare l'errore utilizzando i log degli accessi di NGINX:
- Se sei un utente Private Cloud, puoi utilizzare i log degli accessi di NGINX per determinare le informazioni chiave sugli errori HTTP
502
. Controlla i log degli accessi di NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.
- Cerca per vedere se si sono verificati errori
502
durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora risposte con errori in502
. Se riscontri errori
502
con X-Apigee-fault-code corrispondente al valore dimessaging.adaptors.http.flow.DecompressionFailureAtResponse
, determina il valore di X-Apigee-fault-source.Esempio di errore 502 dal log degli accessi di NGINX:
La voce di esempio sopra riportata dal log degli accessi di NGINX ha i seguenti valori per X-Apigee-fault-code e X-Apigee-fault-source:
Intestazioni della risposta Valore X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
Causa: il formato del payload della risposta non corrisponde al Content-Encoding
Per impostazione predefinita, Apigee Edge decomprime sempre il payload se l'intestazione della risposta Content-Encoding
contiene una codifica valida e una
supportata. Pertanto, è previsto che il formato del payload della risposta dovrebbe corrispondere alla codifica specificata nell'intestazione della risposta Content-Encoding
.
In caso di mancata corrispondenza, viene visualizzato questo errore.
Diagnostica
- Determina il codice di errore e l'origine dell'errore per l'errore osservato mediante l'utilizzo di API Monitoring, strumento Trace o log degli accessi NGINX, come spiegato nella sezione Passaggi comuni della diagnostica.
- Se il codice di errore è
messaging.adaptors.http.flow.DecompressionFailureAtResponse
e l'origine dell'errore ha il valoretarget
, questo indica che il formato del payload della risposta inviato dal server di backend/di destinazione non corrisponde alla codifica supportata specificata nell'intestazione della rispostaContent-Encoding
. Puoi determinare la mancata corrispondenza nell'ambito della risposta HTTP utilizzando uno dei seguenti metodi:
Messaggio di errore
Per eseguire la convalida utilizzando il messaggio di errore:
-
Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, fai riferimento all'
faultstring
.Esempio di messaggio di errore:
"faultstring":"Decompression failure at response"
- Nel messaggio di errore precedente, viene visualizzato
"Decompression failure at response"
, il che significa che non è stato possibile decomprimere la risposta utilizzando la codifica specificata nell'intestazioneContent-Encoding
.
Traccia
Per eseguire la convalida utilizzando Trace:
- Determinare Content-Type e error.cause utilizzando Trace, come spiegato nella sezione Passaggi comuni della diagnosi.
I valori della traccia di esempio sono i seguenti:
- Codifica dei contenuti:
gzip
- error.cause:
Not in GZIP format
Il valore nell'intestazione della risposta Content-Encoding è gzip; tuttavia, il payload della risposta non è in formato GZIP (come indicato da error.cause). Di conseguenza, Apigee Edge risponde con
502 Bad Gateway
e il codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- Codifica dei contenuti:
Richiesta effettiva
Per eseguire la convalida utilizzando la richiesta effettiva:
Se hai accesso alla richiesta effettiva fatta all'applicazione server di destinazione/backend, segui questi passaggi:
- Se sei un utente di cloud pubblico/private cloud, effettua una richiesta direttamente al server di backend dal server di backend stesso o da qualsiasi altra macchina da cui hai l'autorizzazione per effettuare la richiesta al server di backend.
- Se sei un utente Private Cloud, puoi anche effettuare la richiesta al server di backend da uno dei processori di messaggi.
- Esamina la risposta inviata dal server di backend e determina il valore passato nell'intestazione della risposta
Content-Encoding.
- Determina il formato del payload inviato come parte della richiesta.
- Se il valore dell'intestazione
Content-Encoding
è nell'elenco della codifica supportata, ma il formato del payload della risposta non corrisponde alla codifica specificata nell'intestazioneContent-Encoding
, questa è la causa del problema.Esempio:
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)>La risposta di esempio precedente invia il valore
gzip
all'intestazioneContent-Encoding
, che è una codifica supportata in Apigee Edge. Tuttavia,response_payload.zip
viene inviato come file ZIP. Pertanto, questa risposta non va a buon fine e viene generato un errore502 Bad Gateway
con il codice di errore:messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
Log del processore di messaggi
Per eseguire la convalida utilizzando i log del processore di messaggi:
Se sei un utente Private Cloud, puoi utilizzare i log del processore di messaggi per determinare le informazioni chiave sugli errori HTTP
502
.Controlla il log del processore di messaggi:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Cerca per vedere se si sono verificati errori
502
durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora risposte con problemi di502
. Puoi utilizzare la seguente stringa di ricerca:grep -ri "ZipException"
Troverai righe di system.log simili alle seguenti:
Scenario n. 1
Scenario 1: quando la risposta dell'API ha l'intestazione 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 formatLa riga
java.util.zip.ZipException: Not in GZIP format
nel messaggio di errore riportato sopra indica che il payload della risposta non viene inviato in formato GZIP, sebbeneContent-Encoding
sia specificato come gzip. Di conseguenza, Apigee Edge genera l'eccezione e restituisce alle applicazioni client un codice di stato502
con codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtResponse
.Scenario 2
Scenario 2: quando la risposta dell'API ha l'intestazione 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 checkLe righe
java.util.zip.ZipException: incorrect header check
eCaused by: java.util.zip.DataFormatException: incorrect header check
nel messaggio di errore precedente indicano che il payload della risposta non viene inviato in formato deflate e non corrisponde alla codifica specificata nell'intestazioneContent-Encoding
di deflate. Di conseguenza, Apigee Edge genera l'eccezione e restituisce alle applicazioni client un codice di stato502
con codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtResponse
.
-
Risoluzione
- Se non è necessario il payload di risposta compresso nel flusso proxy API in Apigee Edge e nel server di backend, non passare l'intestazione
Content-Encoding
. Se è necessario comprimere il payload della risposta, vai al passaggio 2. - Se è necessario comprimere il payload della risposta, assicurati che il server di backend invii sempre quanto segue:
- Qualsiasi
codifica supportata come valore per l'intestazione
Content-Encoding
nella risposta - Il payload della risposta nel formato supportato su Apigee Edge corrisponde al formato di codifica specificato nell'intestazione
Content-Encoding
- Qualsiasi
codifica supportata come valore per l'intestazione
- Nell'esempio discusso sopra, il payload della risposta è in formato ZIP, ma l'intestazione della risposta specifica
Content-Encoding: gzip
. Puoi risolvere il problema inviando l'intestazione della risposta comeContent-Encoding: gzip
e il payload della risposta in formatogzip
: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)>
Specifiche
Apigee Edge risponde con il codice di stato 502 Bad Gateway
con il codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse
in base alle seguenti specifiche RFC:
Specifiche |
---|
RFC 7231, sezione 6.5.1 |
RFC 7231, sezione 3.1.2.2 |
Se hai ancora bisogno di aiuto dall'Assistenza Apigee, vai a È necessario raccogliere dati diagnostici.
Devi raccogliere dati diagnostici
Raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza Apigee Edge:
Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:
- Nome dell'organizzazione.
- Nome ambiente
- Nome proxy API
- Comando
curl
completo utilizzato per riprodurre l'errore502
- File di traccia per le risposte dell'API
Se sei un utente Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato per le risposte con errori
- Nome ambiente
- Bundle del proxy API
- File di traccia per le risposte dell'API
Log degli accessi NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.
- Log di sistema del processore di messaggi
/opt/apigee/var/log/edge-message-processor/logs/system.log