Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса HTTP 502 Bad Gateway с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 502 Bad Gateway
Кроме того, вы можете увидеть сообщение об ошибке, похожее на приведенное ниже:
{
"fault":{
"faultstring":"Decompression failure at response",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
}
}
}Возможные причины
Эта ошибка возникает только в следующих случаях:
- Кодировка, указанная в заголовке
Content-EncodingHTTP-ответа (от бэкенда/целевого сервера), действительна и поддерживается Apigee Edge. - Формат полезной нагрузки, отправленной целевым сервером в составе HTTP-ответа, не соответствует формату кодировки, указанному в заголовке
Content-Encoding.
BUT
Это происходит потому, что Apigee Edge не удается декодировать полезную нагрузку с помощью указанной кодировки, поскольку формат полезной нагрузки не совпадает с форматом кодировки, указанным в заголовке Content-Encoding.
Ниже приведены примеры поддерживаемых значений Content-Encoding и ожидаемого представления полезной нагрузки в Apigee Edge:
| Сценарий | Content-Encoding | Представление полезной нагрузки |
|---|---|---|
| Одна кодировка | gzip | Формат Unix Подробнее о формате GZIP согласно RFC1952… |
| Одна кодировка | deflate | В этом формате используется структура |
| Несколько кодировок | Несколько кодировок Например, если кодирование выполняется дважды, это может быть:
|
Несколько типов кодировки, примененных к полезной нагрузке в том порядке, в котором они указаны в заголовке. |
Возможные причины ошибки:
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Формат полезной нагрузки ответа не соответствует кодировке контента | Формат полезной нагрузки ответа, отправленной сервером назначения, не закодирован или не соответствует кодировке, указанной в заголовке Content-Encoding. |
Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Мониторинг API
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.
- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра Прокси задано значение Все.
- Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки
messaging.adaptors.http.flow.DecompressionFailureAtResponse, как показано ниже.( посмотреть изображение в полном размере)
Информация о коде ошибки
messaging.adaptors.http.flow.DecompressionFailureAtResponseбудет показана, как на изображении ниже.( посмотреть изображение в полном размере)
Нажмите Посмотреть журналы и разверните строку, в которой произошла ошибка
502.( посмотреть изображение в полном размере)
- В окне Журналы обратите внимание на следующие сведения:
- Код статуса:
502. - Источник ошибки:
target - Код ошибки:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Код статуса:
- Если в поле Fault Source указано значение
target, это означает, что формат полезной нагрузки ответа не соответствует поддерживаемой кодировке, указанной в заголовке ответа внутреннего сервераContent-Encoding.
Инструмент "Трассировка"
Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:
- Включите сеанс трассировки и один из следующих вариантов:
- Дождитесь ошибки
502 Bad Gatewayили - Если вы можете воспроизвести проблему, сделайте вызов API и воспроизведите
502 Bad Gateway.
- Дождитесь ошибки
Убедитесь, что включен параметр Показывать все FlowInfo:
- Выберите один из ответов с ошибкой и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка возникает в потоке сразу после этапа Получен ответ от целевого сервера, как показано ниже.
( посмотреть изображение в полном размере)
-
Запишите значения свойств из трассировки:
- Content-Encoding:
gzip - Тело ответа:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
Перейдите к этапу ошибки сразу после этапа Получен ответ от целевого сервера:
( посмотреть изображение в полном размере)
Обратите внимание на следующие свойства:
- Ошибка:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formatВ поле error.cause указано, что полезная нагрузка ответа не в формате GZIP. Это означает, что Apigee Edge ожидал, что полезная нагрузка ответа будет в формате GZIP, как указано в заголовке
Content-Encoding(определено на предыдущем шаге).Поэтому Apigee Edge не может распаковать полезную нагрузку с помощью gzip и возвращает ошибкуDecompression failure at response.
Обратите внимание, что в этом случае целевой/внутренний сервер возвращает ответ
200, однако клиентское приложение получит ответ502, поскольку ошибка возвращается Apigee Edge.- Ошибка:
Найдите в трассировке этап Response Sent to Client (Ответ отправлен клиенту) и нажмите на него.
( посмотреть изображение в полном размере)
Обратите внимание на следующие детали трассировки:
- Код статуса:
502 Bad Gateway. - Контент с ошибкой:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Код статуса:
Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
- Прокрутите страницу вниз до раздела Сведения об этапе, Заголовки ошибок и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
( посмотреть изображение в полном размере)
- Значения X-Apigee-fault-code и X-Apigee-fault-source будут
messaging.adaptors.http.flow.DecompressionFailureAtResponseиtargetсоответственно. Это означает, что формат полезной нагрузки ответа не соответствует кодировке, указанной в заголовкеContent-Encoding.Заголовки ответа Значение X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
nginx
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP
502. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, возникали ли ошибки
502за определенный период времени (если проблема возникла в прошлом) или есть ли ответы, которые по-прежнему не удается получить с кодом502. Если вы обнаружите ошибки
502с кодом X-Apigee-fault-code, соответствующим значениюmessaging.adaptors.http.flow.DecompressionFailureAtResponse, определите значение X-Apigee-fault-source.Пример ошибки 502 из журнала доступа NGINX
В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:
Заголовки ответа Значение X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
Причина: формат полезной нагрузки ответа не соответствует Content-Encoding
По умолчанию Apigee Edge всегда распаковывает полезную нагрузку, если заголовок ответа Content-Encoding содержит допустимую и
поддерживаемую кодировку. Таким образом, ожидается, что формат полезной нагрузки ответа будет соответствовать кодировке, указанной в заголовке ответа Content-Encoding.
Если данные не совпадают, вы увидите сообщение об ошибке.
диагностика;
- Определите код ошибки и источник ошибки, используя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные этапы диагностики.
- Если код ошибки –
messaging.adaptors.http.flow.DecompressionFailureAtResponse, а источник ошибки –target, это означает, что формат полезной нагрузки ответа, отправленного целевым сервером, не соответствует поддерживаемой кодировке, указанной в заголовке ответаContent-Encoding. Вы можете определить несоответствие как часть HTTP-ответа одним из следующих способов:
Сообщение об ошибке
Чтобы проверить данные с помощью сообщения об ошибке:
-
Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к
faultstring.Пример сообщения об ошибке
"faultstring":"Decompression failure at response"
- В приведенном выше сообщении об ошибке указано
"Decompression failure at response", что означает, что ответ не удалось распаковать с помощью кодировки, указанной в заголовкеContent-Encoding.
Трассировка
Чтобы проверить данные с помощью трассировки:
- Определите Content-Type и error.cause с помощью трассировки, как описано в разделе Распространенные действия по диагностике.
Значения из примера трассировки:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
Значение в заголовке ответа Content-Encoding – gzip, однако полезная нагрузка ответа не в формате GZIP (как указано в error.cause). Поэтому Apigee Edge возвращает код ошибки
messaging.adaptors.http.flow.DecompressionFailureAtResponseи объект502 Bad Gateway.- Content-Encoding:
Фактический запрос
Чтобы проверить запрос:
Если у вас есть доступ к фактическому запросу, отправленному целевому или внутреннему серверному приложению, выполните следующие действия:
- Если вы используете общедоступное или частное облако, отправьте запрос непосредственно на серверную часть с самого сервера или с любого другого устройства, с которого разрешено отправлять запросы на серверную часть.
- Если вы используете частное облако, вы также можете отправить запрос на серверную часть с одного из процессоров сообщений.
- Проверьте ответ, отправленный внутренним сервером, и определите значение, переданное в заголовке ответа
Content-Encoding.. - Определите формат полезной нагрузки, отправляемой в составе запроса.
- Если значение заголовка
Content-Encodingесть в списке поддерживаемых кодировок, но формат полезной нагрузки ответа не соответствует кодировке, указанной в заголовкеContent-Encoding, то это и является причиной проблемы.Пример
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)>В приведенном выше примере ответа значение
gzipотправляется в заголовокContent-Encoding, который представляет собой поддерживаемую кодировку в Apigee Edge. Однако файлresponse_payload.zipбудет отправлен в виде ZIP-архива. Поэтому этот ответ не проходит проверку и возвращает ошибку502 Bad Gatewayс кодомmessaging.adaptors.http.flow.DecompressionFailureAtResponse.
Журналы процессора сообщений
Чтобы проверить данные с помощью журналов Message Processor, выполните следующие действия:
Если вы используете Private Cloud, то можете определить ключевую информацию об ошибках HTTP
502с помощью журналов Message Processor.Проверьте журнал обработчика сообщений:
/opt/apigee/var/log/edge-message-processor/logs/system.logВыполните поиск, чтобы узнать, возникали ли ошибки
502в течение определенного периода времени (если проблема возникла в прошлом) или есть ли ответы, которые по-прежнему завершаются с ошибкой502. Вы можете использовать следующую строку поиска:grep -ri "ZipException"
В файле system.log вы найдете строки, похожие на приведенные ниже.
Сценарий 1
Сценарий 1. Заголовок Content-Encoding: gzip в ответе API
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 formatСтрока
java.util.zip.ZipException: Not in GZIP formatв сообщении об ошибке выше указывает, что полезная нагрузка ответа не отправлена в формате GZIP, хотяContent-Encodingуказан как gzip. Поэтому Apigee Edge вызывает исключение и возвращает клиентским приложениям код статуса502с кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtResponse.Сценарий 2
Сценарий 2. Заголовок Content-Encoding в ответе API имеет значение 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 checkСтроки
java.util.zip.ZipException: incorrect header checkиCaused by: java.util.zip.DataFormatException: incorrect header checkв приведенном выше сообщении об ошибке указывают, что полезная нагрузка ответа не отправляется в формате deflate и не соответствует кодировке, указанной в заголовкеContent-Encodingdeflate. Поэтому Apigee Edge вызывает исключение и возвращает клиентским приложениям код статуса502с кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtResponse.
-
Разрешение
- Если сжатая полезная нагрузка ответа не нужна в потоке прокси-сервера API в Apigee Edge и на бэкенд-сервере, не передавайте заголовок
Content-Encoding. Если необходимо сжать полезную нагрузку ответа, перейдите к шагу 2. - Если вам нужно сжать полезную нагрузку ответа, убедитесь, что сервер всегда отправляет следующее:
- Любую из
поддерживаемых кодировок в качестве значения заголовка
Content-Encodingв ответе. - Полезная нагрузка ответа в поддерживаемом формате для Apigee Edge соответствует формату кодировки, указанному в заголовке
Content-Encoding.
- Любую из
поддерживаемых кодировок в качестве значения заголовка
- В примере выше полезная нагрузка ответа имеет формат ZIP, но в заголовке ответа указано
Content-Encoding: gzip. Чтобы устранить проблему, отправьте заголовок ответа какContent-Encoding: gzip, а полезную нагрузку ответа – в форматеgzip: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)>
Спецификация
Apigee Edge отвечает кодом статуса 502 Bad Gateway с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse в соответствии со следующими спецификациями RFC:
| Спецификация |
|---|
| RFC 7231, раздел 6.5.1 |
| RFC 7231, раздел 3.1.2.2 |
Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите к разделу Сбор диагностической информации.
Необходимо собрать диагностическую информацию
Соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.
Если вы пользователь общедоступного облака, предоставьте следующую информацию:
- Название организации
- Название среды
- Название прокси API
- Команда
curl, использованная для воспроизведения ошибки502 - Файл трассировки для ответов API
Если вы используете частное облако, предоставьте следующую информацию:
- Полное сообщение об ошибке, полученное в ответе
- Название среды
- Пакет прокси API
- Файл трассировки для ответов API
Журналы доступа NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Системные журналы Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log