Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
Sintomo
L'applicazione client riceve un codice di stato HTTP 502 Bad Gateway con codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtResponse come risposta alle chiamate
API.
Messaggio di errore
L'applicazione client riceve il seguente codice di risposta:
HTTP/1.1 502 Bad Gateway
Inoltre, potresti visualizzare 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/di destinazione come parte della risposta HTTP
non
corrisponde al formato di codifica specificato nell'intestazione
Content-Encoding
MA
Ciò accade perché Apigee Edge non riesce a decodificare il payload utilizzando la codifica specificata, in quanto
il formato del payload non è lo stesso della codifica specificata nell'intestazione
Content-Encoding.
Ecco alcuni esempi di valori di Content-Encoding supportati e di come Apigee Edge
si aspetta che la rappresentazione del payload sia in questi casi:
| Scenario | Content-Encoding | Rappresentazione del payload |
|---|---|---|
| Codifica singola | gzip | Il formato Consulta RFC1952 GZIP Format. |
| Codifica singola | deflate | Questo formato utilizza la struttura |
| Codifica multipla | Codifica multipla Ad esempio, nei casi in cui la codifica viene eseguita due volte, può essere:
|
Più codifiche applicate al payload nell'ordine indicato 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 a Content-Encoding | Il formato del payload di risposta inviato dal server di backend/di destinazione non è codificato o non corrisponde alla codifica specificata nell'intestazione Content-Encoding. |
Utenti di Edge Public e Private Cloud |
Passaggi di diagnostica comuni
Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:
Monitoraggio delle API
Per diagnosticare l'errore utilizzando API Monitoring:
- 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 osservato gli errori.
- Assicurati che il filtro Proxy sia impostato su Tutti.
- Traccia il codice di errore rispetto al tempo.
Seleziona una cella con il codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtResponsecome mostrato di seguito:( visualizza immagine più grande)
Le informazioni sul codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtResponsevengono visualizzate come mostrato di seguito:( visualizza immagine più grande)
Fai clic su Visualizza log ed espandi la riga che non è riuscita a essere caricata a causa dell'errore
502.( visualizza immagine più grande)
- Nella finestra Log, prendi nota dei seguenti dettagli:
- Codice di stato:
502 - Origine del guasto:
target - Codice errore:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Codice di stato:
- Se Fault Source ha il valore
target, significa che il formato del payload di risposta non corrisponde alla codifica supportata specificata nell'intestazione della risposta del server di backendContent-Encoding.
Strumento Traccia
Per diagnosticare l'errore utilizzando lo strumento Trace:
- Attiva l'opzione Traccia sessione
e una delle seguenti opzioni:
- Attendi che si verifichi l'errore
502 Bad Gatewayoppure - 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 informazioni sul flusso sia abilitata:
- Seleziona una delle risposte non riuscite ed esamina la traccia.
- Esamina le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
In genere, l'errore si verifica in un flusso subito dopo la fase Risposta ricevuta dal server di destinazione, come mostrato di seguito:
( visualizza immagine più grande)
-
Prendi nota dei valori delle proprietà dalla traccia:
- Content-Encoding:
gzip - Corpo del contenuto della risposta:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
Vai alla fase di errore subito dopo la fase Risposta ricevuta dal server di destinazione:
( visualizza immagine più grande)
Prendi nota delle proprietà:
- Errore:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formaterror.cause indica che il payload della risposta non è in formato GZIP. Ciò significa che Apigee Edge si aspettava che il payload della risposta fosse in formato GZIP come specificato nell'intestazione
Content-Encoding(determinata nel passaggio precedente).Pertanto, 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 risposta502poiché l'errore viene restituito da Apigee Edge.- Errore:
Vai alla fase Risposta inviata al client nella traccia e fai clic.
( visualizza immagine più grande)
Prendi nota dei seguenti dettagli della traccia:
- Codice di stato:
502 Bad Gateway. - Contenuti errore:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Codice di stato:
Vai alla fase AX (dati di Analytics registrati) nella traccia e fai clic.
- Scorri verso il basso fino alla sezione Dettagli fase, Intestazioni errori e
determina i valori di X-Apigee-fault-code e X-Apigee-fault-source
come mostrato di seguito:
( visualizza immagine più grande)
- Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source
come
messaging.adaptors.http.flow.DecompressionFailureAtResponseetarget, a indicare che il formato del payload della risposta non corrisponde alla codifica specificata nell'intestazioneContent-Encoding.Intestazioni della risposta Valore X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
Per diagnosticare l'errore utilizzando i log di accesso NGINX:
- Se sei un utente di Private Cloud, puoi utilizzare i log di accesso NGINX per
determinare le informazioni chiave sugli errori HTTP
502. Controlla i log di accesso di NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.
- Cerca se si sono verificati errori
502durante un periodo di tempo specifico (se il problema si è verificato in passato) o se alcune risposte continuano a non riuscire con502. Se trovi errori
502con 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 di accesso NGINX:
La voce di esempio riportata sopra del log di accesso 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.DecompressionFailureAtResponseX-Apigee-fault-source target
Causa: il formato del payload della risposta non corrisponde a Content-Encoding
Per impostazione predefinita, Apigee Edge decomprime sempre il payload se l'intestazione della risposta
Content-Encoding contiene una codifica valida e
supportata. Pertanto, è previsto che il formato del payload della risposta
corrisponda alla codifica specificata nell'intestazione della risposta Content-Encoding.
In caso di mancata corrispondenza, viene visualizzato questo errore.
Diagnosi
- Determina il codice di errore e l'origine dell'errore osservato utilizzando il monitoraggio API, lo strumento Trace o i log di accesso NGINX, come spiegato in Passaggi comuni per la diagnosi.
- Se il codice di errore è
messaging.adaptors.http.flow.DecompressionFailureAtResponsee l'origine errore ha il valoretarget, significa 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 come parte della risposta HTTP utilizzando uno dei seguenti metodi:
Messaggio di errore
Per la convalida tramite il messaggio di errore:
-
Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, fai riferimento a
faultstring.Messaggio di errore di esempio:
"faultstring":"Decompression failure at response"
- Nel messaggio di errore precedente, viene visualizzato
"Decompression failure at response", il che implica che la risposta non è stato possibile decomprimerla utilizzando la codifica specificata nell'intestazioneContent-Encoding.
Traccia
Per convalidare utilizzando Trace:
- Determina Content-Type e error.cause utilizzando Trace come spiegato in Passaggi comuni per la diagnosi.
I valori della traccia di esempio sono i seguenti:
- Content-Encoding:
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). Pertanto, Apigee Edge risponde con
502 Bad Gatewaye il codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
Richiesta effettiva
Per convalidare utilizzando la richiesta effettiva:
Se hai accesso alla richiesta effettiva inviata all'applicazione server di destinazione/di backend, segui questi passaggi:
- Se sei un utente di cloud pubblico/cloud privato, invia una richiesta direttamente al server di backend dal server di backend stesso o da qualsiasi altro computer da cui ti è consentito inviare la richiesta al server di backend.
- Se sei un utente di Private Cloud, puoi anche inviare la richiesta al server di backend da uno dei Message Processor.
- Esamina la risposta inviata dal server di backend e determina il valore
trasmesso nell'intestazione della risposta
Content-Encoding. - Determina il formato del payload inviato nell'ambito 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, allora 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 riportata sopra invia il valore
gzipall'intestazioneContent-Encoding, che è una codifica supportata in Apigee Edge. Tuttavia, ilresponse_payload.zipviene inviato come file ZIP. Pertanto, questa risposta non va a buon fine e restituisce un errore502 Bad Gatewaycon il codice di errore:messaging.adaptors.http.flow.DecompressionFailureAtResponse.
Log del processore di messaggi
Per la convalida utilizzando i log del processore di messaggi:
Se sei un utente di 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.logCerca se si sono verificati errori
502durante un periodo di tempo specifico (se il problema si è verificato in passato) o se alcune risposte continuano a non riuscire con502. Puoi utilizzare la seguente stringa di ricerca:grep -ri "ZipException"
Troverai righe di system.log simili alle seguenti:
Scenario 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 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 formatLa riga
java.util.zip.ZipException: Not in GZIP formatnel messaggio di errore riportato sopra indica che il payload della risposta non viene inviato in formato GZIP, anche seContent-Encodingè specificato come gzip. Pertanto, Apigee Edge genera l'eccezione e restituisce un codice di stato502con codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtResponsealle applicazioni client.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 checkeCaused by: java.util.zip.DataFormatException: incorrect header checknel messaggio di errore riportato sopra indicano che il payload della risposta non viene inviato in formato deflate e non corrisponde alla codifica specificata nell'intestazioneContent-Encodingdi deflate. Pertanto, Apigee Edge genera l'eccezione e restituisce un codice di stato502con il codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtResponsealle applicazioni client.
-
Risoluzione
- Se non è necessario il payload della risposta compressa nel flusso del 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:
- Una qualsiasi delle
codifiche supportate come valore dell'intestazione
Content-Encodingnella risposta - Il payload della risposta nel formato supportato per Apigee Edge corrisponde al formato di codifica specificato nell'intestazione
Content-Encoding.
- Una qualsiasi delle
codifiche supportate come valore dell'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: gzipe 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)>
Specifica
Apigee Edge risponde con il codice di stato 502 Bad Gateway con codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtResponse in base alle seguenti specifiche RFC:
| Specifica |
|---|
| RFC 7231, sezione 6.5.1 |
| RFC 7231, sezione 3.1.2.2 |
Se hai ancora bisogno di assistenza da parte dell'assistenza Apigee, vai a Informazioni di diagnostica da raccogliere.
Deve raccogliere informazioni diagnostiche
Raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza Apigee Edge:
Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:
- Nome organizzazione
- Nome ambiente
- Nome del proxy API
- Comando
curlcompleto utilizzato per riprodurre l'errore502 - File di traccia per le risposte API
Se sei un utente di Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato per le risposte non riuscite
- Nome ambiente
- Bundle proxy API
- File di traccia per le risposte API
Log di accesso NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDove: 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