Você está vendo a documentação do Apigee Edge.
Acesse a
documentação da Apigee X. informações
Sintoma
O aplicativo cliente recebe um código de status HTTP de 502 Bad Gateway
com código de erro
protocol.http.TooBigLine
como resposta para chamadas de API.
Mensagem de erro
O aplicativo cliente recebe este código de resposta:
HTTP/1.1 502 Bad Gateway
Além disso, talvez você veja a seguinte mensagem de erro:
{ "fault":{ "faultstring":"response line size exceeding 2,048", "detail":{ "errorcode":"protocol.http.TooBigLine" } } }
Causas possíveis
Esse erro vai ocorrer se o tamanho da Linha de resposta enviada pelo servidor de destino/back-end para o Apigee Edge como parte da resposta HTTP for maior que o limite máximo permitido no Apigee Edge.
Antes de analisar as possíveis causas desse erro, vamos entender o que significa a linha de resposta e como verificar o tamanho dela.
Noções básicas sobre a linha de resposta
Uma resposta HTTP típica consiste em três partes:
- Linha de status (chamada de Linha de resposta na Apigee)
- ( Conjunto de cabeçalhos HTTP)
- [ Corpo ]
A linha de resposta consiste em três partes: versão do protocolo seguida de um código de status numérico e a frase textual associada, conforme mostrado abaixo:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Quando uma resposta HTTP é enviada pelo aplicativo do servidor de destino/back-end, a primeira linha enviada representa a Linha de resposta, conforme descrito acima. Isso é seguido pelos cabeçalhos e corpo/payload da resposta.A captura de tela de amostra a seguir mostra uma solicitação curl
típica, a parte Solicitação e a parte Resposta (junto com a linha de resposta).
Noções básicas sobre o tamanho da linha de resposta
No exemplo discutido acima, a linha início (primeira linha) na resposta, também chamada de linha de resposta, é a seguinte:
HTTP/1.1 200 OK
Essa linha de resposta tem um tamanho igual a
~15 bytes
porque contém15 ASCII characters
. Como isso está dentro do limite permitido no Apigee Edge, a resposta é enviada de volta ao cliente sem nenhum erro pelo Apigee Edge.- Da mesma forma, se você observar o
faultstring
na mensagem de erro mostrada acima, ele contém"response line size exceeding 2,048"
. Isso indica que a linha de resposta na resposta HTTP enviada pelo servidor de destino/back-end excedeu 2.048 bytes.
Noções básicas sobre a linha de resposta grande
De acordo com a definição de linha de status (chamada de linha de resposta aqui) e as solicitações e respostas HTTP típicas, o tamanho seria muito menor do que o limite padrão definido de 2 k no Apigee Edge. Por isso, talvez não atinjamos o limite. No entanto, veja alguns cenários possíveis em que você pode exceder esse limite:
- O servidor de destino/back-end não é um sistema HTTP. Ele pode ser uma resposta que não seja HTTP.
- O servidor de destino/back-end tem problemas e envia uma linha de resposta longa como parte da resposta HTTP.
Leia mais sobre isso em Como receber o error protocol.http.TooBigLine, "tamanho da linha de resposta superior a 2.048.
Estas são as possíveis causas do erro:
Causa | Descrição | Instruções de solução de problemas aplicáveis para |
---|---|---|
O tamanho da linha de resposta é maior que o limite permitido | O tamanho da Linha de resposta enviada pelo servidor de destino/back-end como parte da resposta HTTP para o Apigee Edge é maior que o limite permitido no Apigee Edge | Usuários de nuvens públicas e privadas de borda |
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 monitoramento de APIs:
- Faça login na interface do Apigee Edge como usuário com um papel apropriado.
Alterne para a organização em que você quer investigar o problema.
- Navegue até a página Analisar > Monitoramento de API > Investigar.
- Selecione o período específico em que você observou os erros.
- Selecione o filtro Proxy para restringir o código da falha.
- Trace o Código de falha em relação a Time.
Selecione uma célula com o código de falha
protocol.http.TooBigLine
, conforme mostrado abaixo:Você verá as informações sobre o código de falha
protocol.http.TooBigLine
, conforme mostrado abaixo:Clique em Ver registros e expanda a linha da solicitação com falha.
- Na janela Registros, observe os seguintes detalhes:
- Código de status:
502
- Origem da falha:
target
- Código de falha:
protocol.http.TooBigLine
.
- Código de status:
- Se a Origem da falha tiver o valor
target
e o Código de falha tiver o valorprotocol.http.TooBigLine
, isso indica que a resposta HTTP do servidor de destino/ back-end tem um tamanho de linha de resposta maior que o limite máximo permitido no Apigee Edge.
Ferramenta de rastreamento
- Ative a sessão de rastreamento
e:
- Aguarde a ocorrência do erro
502 Bad Gateway
. - Se você conseguir reproduzir o problema, faça a chamada de API e reproduza o erro
502 Bad Gateway
.
- Aguarde a ocorrência do erro
- Selecione uma das solicitações com falha e examine o rastro.
- Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
Normalmente, você encontra o erro no Erro
flowinfo
logo após a fase Solicitação enviada para o servidor de destino, conforme mostrado abaixo:Observe os valores do erro do trace:
- erro:
response line exceeding 2,048
- error.class:
com.apigee.errors.http.server.BadGateway
Isso indica que o Apigee Edge (componente de processador de mensagens) gera o erro assim que recebe a resposta do servidor de back-end devido a um tamanho de linha de resposta que excede o limite permitido.
- erro:
Você veria a mensagem de erro enviada ao cliente na fase Resposta enviada ao cliente, conforme mostrado abaixo:
- Observe os valores do erro do rastro:
- Erro:
502 Bad Gateway
. - Conteúdo do erro:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Erro:
Também é possível navegar para a fase AX (Dados do Analytics gravados) no rastreamento e clicar nela para ver os detalhes do erro.
Observe o valor do seguinte:
Cabeçalhos de solicitação Valor X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
Conteúdo do erro : corpo {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
Para diagnosticar o erro usando os registros de acesso do NGINX:
- Se você for um usuário da nuvem privada, poderá usar os registros de acesso do NGINX para
determinar as principais informações sobre os erros HTTP
502
. Verifique os registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Onde:ORG, ENV e PORT# são substituídos por valores reais.
- Pesquise se há erros
502
durante um período específico (se o problema aconteceu anteriormente) ou se há alguma solicitação que ainda falha com502
. Se você encontrar erros
502
com o X-Apigee-fault-code correspondente ao valor deprotocol.http.TooBigLine
, determine o valor de X-Apigee-fault-source.A entrada de amostra 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 protocol.http.TooBigLine
X-Apigee-fault-source target
Causa: o tamanho da linha de resposta é maior do que o limite permitido
Diagnóstico
- Determine o código de falha e a origem da falha do erro observado usando o monitoramento da API, a ferramenta de rastreamento ou os registros de acesso do NGINX, conforme explicado nas etapas comuns de diagnóstico.
- Se a Origem de falha tiver o valor
target
, isso indica que o tamanho da linha de resposta enviado pelo aplicativo do servidor de destino/back-end para a Apigee é maior que o limite permitido no Apigee Edge. Confirme se o tamanho da linha de resposta excedeu o limite permitido de 2 KB usando um dos seguintes métodos:
Mensagem de erro
Para validar usando a mensagem de erro, siga estas etapas:
Se você tiver acesso à mensagem de erro completa recebida do Apigee Edge, consulte
faultstring
.Exemplo de mensagem de erro:
"faultstring":"response line size exceeding 2,048"
O
faultstring
acima indica que o tamanho da linha de resposta excedeu o limite permitido de 2 KB.Solicitação real
Para validar usando a solicitação real, faça o seguinte:
Se você tiver acesso à solicitação real feita ao aplicativo do servidor de destino/back-end, execute as seguintes etapas:
- Verificar o tamanho da linha de resposta
- Se você achar que o tamanho do URI é maior que o
limite permitido no Apigee Edge, essa será a causa do
problema.
Exemplo de resposta do servidor de destino/back-end:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
No caso acima, a linha de resposta
HTTP/1.1 200 1111…<trimmed>...11111111
é maior que 2 KB, ou seja, contém mais de 2 K caracteres ASCII.Se você estiver usando outro cliente, revise os registros dele e tente descobrir o tamanho da linha de resposta enviada ao Apigee Edge.
Registros do processador de mensagens
Para validar usando os registros do processador de mensagens:
Se você for um usuário da nuvem privada, poderá usar os registros do processador de mensagens para validar se o tamanho da linha de resposta excedeu o limite permitido no Apigee Edge.
- Determine o código da mensagem da solicitação com falha usando o monitoramento de APIs, a ferramenta Trace ou os registros de acesso do NGINX, conforme explicado em Etapas comuns de diagnóstico.
Procure o ID da mensagem no log do Processador de mensagens:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Você vai encontrar linhas de
system.log
semelhantes às seguintes:2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
O texto
message = response line size exceeding 2,048
na mensagem de erro acima indica que o tamanho da linha de resposta é maior que 2 KB. Portanto, o Apigee Edge gera a exceção e retorna um código de status502
com código de falhaprotocol.http.TooBigline
para aplicativos clientes.
Resolução
Corrigir tamanho
Opção 1 [recomendada]: corrigir o aplicativo de servidor de destino/back-end para não enviar linhas de resposta maiores que o limite permitido
- Analise o motivo para o cliente específico enviar uma linha de resposta com tamanho maior que o limite permitido, conforme definido em Limites.
- Se não for desejável, modifique seu aplicativo de servidor de destino/back-end para que ele envie uma linha de resposta menor que o limite permitido.
- Se for desejável e você quiser enviar uma linha de resposta com tamanho maior que o limite permitido, siga as próximas opções.
CwC
Opção 2: usar a propriedade CwC para aumentar o limite da linha de resposta
A Apigee fornece uma propriedade CwC que permite aumentar o limite de tamanho da linha de resposta. Para mais detalhes, consulte Definir o limite da linha de resposta no processador de mensagens.
Limites
A Apigee espera que o aplicativo cliente e o servidor de back-end não enviem linhas de solicitação/resposta com tamanhos maiores que o limite permitido, conforme documentado para o Limite de linha de solicitação/resposta em Limites do Apigee Edge.
- Se você for um usuário da nuvem pública, o limite máximo de tamanho de solicitação e linha de resposta será conforme documentado em Tamanho da solicitação/linha de resposta em Limites do Apigee Edge.
- Se você for um usuário da nuvem privada , talvez tenha modificado o limite máximo padrão para o tamanho da solicitação e da linha de resposta, mesmo que isso não seja uma prática recomendada. É possível determinar o limite máximo de tamanho da linha de resposta seguindo as instruções em Como verificar o limite atual.
Como verificar o limite atual?
Esta seção explica como verificar se a propriedade HTTPResponse.line.limit
foi atualizada com um novo valor nos processadores de mensagens.
- Na máquina do processador de mensagens, pesquise a propriedade
HTTPResponse.line.limit
no diretório/opt/apigee/edge-message-processor/conf
e verifique qual valor foi definido conforme mostrado abaixo:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- O resultado do exemplo do comando acima é o seguinte:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
No exemplo de saída acima, observe que a propriedade
HTTPResponse.line.limit
foi definida com o valor2k
emhttp.properties
.Isso indica que o limite para o tamanho da linha de resposta configurado na Apigee para nuvem privada é de 2 KB.
Se você ainda precisar de ajuda do suporte da Apigee, acesse Precisamos coletar 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 curl completo usado para reproduzir o erro
502
- Arquivo de rastreamento das solicitações de API
Se você for um usuário da nuvem privada, forneça as seguintes informações:
- Concluir a mensagem de erro observada para as solicitações com falha
- Nome da organização
- Nome do ambiente
- Pacote de proxy de API
- Arquivo de rastreamento das solicitações de API com falha
- Completar o comando
curl
usado para reproduzir o erro502
Registros de acesso do NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Onde: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