Você está lendo a documentação do Apigee Edge.
Acesse a documentação da
Apigee X. info
Sintoma
O aplicativo cliente recebe um código de status HTTP 502 Bad Gateway com o código de erro
messaging.adaptors.http.flow.DecompressionFailureAtResponse como resposta às chamadas
da API.
Mensagem de erro
O aplicativo cliente recebe o seguinte código de resposta:
HTTP/1.1 502 Bad Gateway
Além disso, você pode receber uma mensagem de erro semelhante a esta:
{
"fault":{
"faultstring":"Decompression failure at response",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
}
}
}Causas possíveis
Esse erro só ocorrerá se:
- A codificação especificada no cabeçalho
Content-Encodingda resposta HTTP (do servidor de back-end/destino) é válida e compatível com o Apigee Edge, - O formato de payload enviado pelo servidor de back-end/destino como parte da resposta HTTP
não corresponde
ao formato de codificação especificado no cabeçalho
Content-Encoding
MAS
Isso acontece porque o Apigee Edge não decodifica o payload usando a codificação especificada, já que o formato do payload não é o mesmo da codificação especificada no cabeçalho Content-Encoding.
Confira alguns exemplos de valores de Content-Encoding compatíveis e como o Apigee Edge espera que a representação de payload seja nesses casos:
| Cenário | Content-Encoding | Representação de payload |
|---|---|---|
| Codificação única | gzip | O formato Unix Consulte Formato GZIP RFC1952. |
| Codificação única | deflate | Esse formato usa a estrutura |
| Codificação múltipla | Codificação múltipla Por exemplo, em casos em que a codificação é feita duas vezes, ela pode ser:
|
Várias codificações aplicadas ao payload na ordem em que aparecem no cabeçalho. |
Confira as possíveis causas para esse erro:
| Causa | Descrição | Instruções de solução de problemas aplicáveis para |
|---|---|---|
| O formato do payload da resposta não corresponde ao Content-Encoding | O formato do payload de resposta enviado pelo servidor de back-end/destino não está codificado ou não corresponde à codificação especificada no cabeçalho Content-Encoding. |
Usuários da nuvem pública e privada do Edge |
Etapas comuns do diagnóstico
Use uma das seguintes ferramentas/técnicas para diagnosticar esse erro:
Monitoramento de APIs
Para diagnosticar o erro usando o API Monitoring:
- Faça login na interface do Apigee Edge como um usuário com um papel adequado.
Mude para a organização em que você quer investigar o problema.
- Acesse a página Analisar > Monitoramento de APIs > Investigar.
- Selecione o período específico em que você observou os erros.
- Verifique se o filtro Proxy está definido como Todos.
- Crie um gráfico com Código de falha e Tempo.
Selecione uma célula com o código de falha
messaging.adaptors.http.flow.DecompressionFailureAtResponse, conforme mostrado abaixo:
As informações sobre o código de falha
messaging.adaptors.http.flow.DecompressionFailureAtResponsesão mostradas conforme abaixo:
Clique em Ver registros e expanda a linha com falha no erro
502.
- Na janela Registros, observe os seguintes detalhes:
- Código de status:
502 - Origem da falha:
target - Código de falha:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Código de status:
- Se a Origem da falha tiver o valor
target, isso indica que o formato do payload da resposta não corresponde à codificação compatível especificada no cabeçalho de resposta do servidor de back-endContent-Encoding.
Ferramenta Trace
Para diagnosticar o erro usando a ferramenta Trace:
- Ative a sessão de rastreamento e faça uma destas ações:
- Aguarde o erro
502 Bad Gatewayocorrer ou - Se for possível reproduzir o problema, faça a chamada de API e reproduza
502 Bad Gateway.
- Aguarde o erro
Verifique se a opção Mostrar todos os FlowInfos está ativada:
- Selecione uma das respostas com falha e examine o rastreamento.
- Navegue pelas diferentes fases do rastreamento e localize onde a falha ocorreu.
Normalmente, o erro é encontrado em um fluxo logo após a fase Resposta recebida do servidor de destino, conforme mostrado abaixo:
-
Anote os valores das propriedades do rastreamento:
- Content-Encoding:
gzip - Corpo do conteúdo da resposta:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
Navegue até a fase de erro logo após a fase Resposta recebida do servidor de destino:
Observe as propriedades:
- Erro:
Decompression failure at response - error.class::
com.apigee.errors.http.server.BadGateway error.cause::
Not in GZIP formatO error.cause afirma que o payload da resposta não está no formato GZIP. Isso significa que o Apigee Edge esperava que o payload da resposta estivesse no formato GZIP, conforme especificado no cabeçalho
Content-Encoding(determinado na etapa anterior).Portanto, o Apigee Edge não pode descompactar o payload usando gzip e retorna o erroDecompression failure at response.
A resposta do servidor de destino/back-end é
200neste caso. No entanto, o aplicativo cliente vai receber uma resposta502porque o erro é retornado pelo Apigee Edge.- Erro:
Navegue até a fase Resposta enviada ao cliente no rastreamento e clique nela.
Observe os seguintes detalhes do rastreamento:
- Código de status:
502 Bad Gateway. - Conteúdo do erro:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Código de status:
Navegue até a fase AX (dados do Analytics registrados) no rastreamento e clique nela.
- Role a tela para baixo até as seções Detalhes da fase e Cabeçalhos de erro e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:
- Você vai ver os valores de X-Apigee-fault-code e X-Apigee-fault-source
como
messaging.adaptors.http.flow.DecompressionFailureAtResponseetarget, indicando que o formato da carga útil da resposta não correspondeu à codificação especificada no cabeçalhoContent-Encoding.Cabeçalhos de resposta Valor X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
Para diagnosticar o erro usando registros de acesso do NGINX:
- Se você for um usuário do Private Cloud, poderá usar os registros de acesso do NGINX para determinar as principais informações sobre erros HTTP
502. Verifique os registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logEm que:ORG, ENV e PORT# são substituídos por valores reais.
- Pesquise para ver se há erros de
502durante um período específico (se o problema aconteceu no passado) ou se ainda há respostas com falha em502. Se você encontrar erros de
502com o X-Apigee-fault-code correspondente ao valor demessaging.adaptors.http.flow.DecompressionFailureAtResponse, determine o valor de X-Apigee-fault-source.Exemplo de erro 502 do registro de acesso do NGINX:
A entrada de exemplo acima do registro de acesso do NGINX tem os seguintes valores para X-Apigee-fault-code e X-Apigee-fault-source:
Cabeçalhos de resposta Valor X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
Causa: o formato do payload da resposta não corresponde ao Content-Encoding
Por padrão, o Apigee Edge sempre descompacta o payload se o cabeçalho de resposta
Content-Encoding contiver uma
codificação válida e compatível. Portanto, espera-se que o formato do payload da resposta corresponda à codificação especificada no cabeçalho de resposta Content-Encoding.
Se houver uma incompatibilidade, você vai receber esse erro.
Diagnóstico
- Determine o código de falha e a origem da falha do erro observado usando o monitoramento de APIs, a ferramenta Trace ou os registros de acesso do NGINX, conforme explicado em Etapas comuns de diagnóstico.
- Se o código de falha for
messaging.adaptors.http.flow.DecompressionFailureAtResponsee a origem da falha tiver o valortarget, isso indica que o formato do payload da resposta enviado pelo servidor de back-end/destino não corresponde à codificação compatível especificada no cabeçalho de respostaContent-Encoding. É possível determinar a incompatibilidade como parte da resposta HTTP usando um dos seguintes métodos:
Mensagem de erro
Para validar usando a mensagem de erro:
-
Se você tiver acesso à mensagem de erro completa recebida do Apigee Edge, consulte
faultstring.Exemplo de mensagem de erro:
"faultstring":"Decompression failure at response"
- Na mensagem de erro acima, aparece
"Decompression failure at response", o que implica que a resposta não pôde ser descompactada usando a codificação especificada no cabeçalhoContent-Encoding.
Trace
Para validar usando o Trace:
- Determine o Content-Type e o error.cause usando o Trace conforme explicado em Etapas comuns de diagnóstico.
Os valores do rastreamento de amostra são os seguintes:
- Content-Encoding:
gzip - error.cause::
Not in GZIP format
O valor no cabeçalho de resposta Content-Encoding é gzip. No entanto, o payload da resposta não está no formato GZIP, conforme indicado por error.cause. Portanto, o Apigee Edge responde com
502 Bad Gatewaye o código de erromessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
Solicitação real
Para validar usando a solicitação real:
Se você tiver acesso à solicitação real feita ao aplicativo de servidor de destino/backend, siga estas etapas:
- Se você for um usuário de nuvem pública/privada, faça uma solicitação diretamente ao servidor de back-end no próprio servidor ou em qualquer outra máquina em que você tenha permissão para fazer a solicitação.
- Se você for um usuário da nuvem privada, também poderá fazer a solicitação ao servidor de back-end de um dos processadores de mensagens.
- Examine a resposta enviada pelo servidor de back-end e determine o valor
transmitido no cabeçalho de resposta
Content-Encoding.. - Determine o formato do payload enviado como parte da solicitação.
- Se o valor do cabeçalho
Content-Encodingestiver na lista de codificações compatíveis, mas o formato do payload da resposta não corresponder à codificação especificada no cabeçalhoContent-Encoding, essa será a causa do problema.Exemplo:
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)>A resposta de exemplo acima envia o valor
gzippara o cabeçalhoContent-Encoding, que é uma codificação compatível no Apigee Edge. No entanto, oresponse_payload.zipé enviado como um arquivo ZIP. Portanto, essa resposta falha com um erro502 Bad Gatewaye o código de erromessaging.adaptors.http.flow.DecompressionFailureAtResponse.
Registros do processador de mensagens
Para validar usando registros do processador de mensagens:
Se você for um usuário do Cloud privado, poderá usar os registros do processador de mensagens para determinar as principais informações sobre erros HTTP
502.Verifique o registro do processador de mensagens:
/opt/apigee/var/log/edge-message-processor/logs/system.logPesquise para ver se há erros de
502durante um período específico (se o problema aconteceu no passado) ou se ainda há respostas com falha de502. Use a seguinte string de pesquisa:grep -ri "ZipException"
Você vai encontrar linhas de system.log semelhantes a estas:
Cenário 1
Cenário 1: quando a resposta da API tem o cabeçalho "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 formatA linha
java.util.zip.ZipException: Not in GZIP formatna mensagem de erro acima indica que o payload da resposta não é enviado no formato GZIP, embora oContent-Encodingseja especificado como gzip. Portanto, o Apigee Edge gera a exceção e retorna um código de status502com o código de falhamessaging.adaptors.http.flow.DecompressionFailureAtResponsepara aplicativos clientes.Cenário 2
Cenário 2: quando a resposta da API tem o cabeçalho "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 checkAs linhas
java.util.zip.ZipException: incorrect header checkeCaused by: java.util.zip.DataFormatException: incorrect header checkna mensagem de erro acima indicam que o payload da resposta não é enviado no formato deflate e não corresponde à codificação especificada no cabeçalhoContent-Encodingde deflate. Portanto, o Apigee Edge gera a exceção e retorna um código de status502com o código de falhamessaging.adaptors.http.flow.DecompressionFailureAtResponsepara aplicativos clientes.
-
Resolução
- Se não houver necessidade do payload de resposta compactada no fluxo de proxy de API no Apigee Edge
e no servidor de back-end, não transmita o cabeçalho
Content-Encoding. Se for necessário compactar o payload da resposta, vá para a etapa 2. - Se for necessário compactar o payload da resposta, verifique se o servidor de back-end
sempre envia o seguinte:
- Qualquer uma das
codificações compatíveis como valor do cabeçalho
Content-Encodingna resposta - O payload de resposta no formato compatível com o Apigee Edge corresponde ao formato de codificação especificado no cabeçalho
Content-Encoding
- Qualquer uma das
codificações compatíveis como valor do cabeçalho
- No exemplo acima, o payload da resposta está no formato ZIP, mas o cabeçalho de resposta especifica
Content-Encoding: gzip. Para corrigir o problema, envie o cabeçalho de resposta comoContent-Encoding: gzipe o payload de resposta no 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)>
Especificação
O Apigee Edge responde com o código de status 502 Bad Gateway e o código de erro
messaging.adaptors.http.flow.DecompressionFailureAtResponse, de acordo com as seguintes especificações
da RFC:
| Especificação |
|---|
| RFC 7231, seção 6.5.1 |
| RFC 7231, seção 3.1.2.2 |
Se você ainda precisar de ajuda do suporte da Apigee, acesse Precisa de informações de diagnóstico.
É necessário coletar informações de diagnóstico
Reúna as seguintes informações de diagnóstico e entre em contato com o suporte do Apigee Edge:
Se você for um usuário da nuvem pública, forneça as seguintes informações:
- Nome da organização
- Nome do ambiente
- Nome do proxy de API
- Comando
curlcompleto usado para reproduzir o erro502 - Arquivo de rastreamento para as respostas da API
Se você for um usuário da nuvem privada, forneça as seguintes informações:
- Mensagem de erro completa observada para as respostas com falha
- Nome do ambiente
- Pacote de proxy de API
- Arquivo de rastreamento para as respostas da API
Registros de acesso do NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logEm que:ORG, ENV e PORT# são substituídos por valores reais.
- Registros do sistema do processador de mensagens
/opt/apigee/var/log/edge-message-processor/logs/system.log