Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния 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.
НО
Это связано с тем, что Apigee Edge не может декодировать полезные данные с использованием указанной кодировки, поскольку формат полезных данных не совпадает с форматом кодировки, указанной в заголовке Content-Encoding .
Вот несколько примеров поддерживаемых значений Content-Encoding и того, каким Apigee Edge ожидает представление полезной нагрузки в этих случаях:
| Сценарий | Кодирование контента | Представление полезной нагрузки |
|---|---|---|
| Единая кодировка | gzip | Формат Unix См. Формат GZIP RFC1952 . |
| Единая кодировка | сдувать | В этом формате используется структура |
| Множественное кодирование | Множественное кодирование Например, в случаях, когда кодирование выполняется дважды, это может быть:
| К полезным данным применяется множественное кодирование в заданном порядке, как оно указано в заголовке. |
Возможные причины этой ошибки следующие:
| Причина | Описание | Инструкции по устранению неполадок применимы для |
|---|---|---|
| Формат полезных данных ответа не соответствует Content-Encoding. | Формат полезных данных ответа, отправленных внутренним или целевым сервером, либо не закодирован, либо не соответствует кодировке, указанной в заголовке Content-Encoding . | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.

- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра прокси установлено значение «Все» .
- Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
messaging.adaptors.http.flow.DecompressionFailureAtResponse, как показано ниже:( просмотреть увеличенное изображение )

Информация о коде ошибки
messaging.adaptors.http.flow.DecompressionFailureAtResponseотображается, как показано ниже:( просмотреть увеличенное изображение )

Нажмите «Просмотреть журналы» и разверните строку с ошибкой
502.( просмотреть увеличенное изображение )

- В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
502 - Источник неисправности:
target - Код ошибки:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Код состояния:
- Если источник сбоя имеет значение
target, это указывает на то, что формат полезных данных ответа не соответствует поддерживаемой кодировке , указанной в заголовке ответаContent-Encodingвнутреннего сервера.
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки:
- Включите сеанс трассировки и выполните одно из следующих действий:
- Дождитесь появления ошибки
502 Bad Gatewayили - Если вы можете воспроизвести проблему, выполните вызов API и воспроизведите
502 Bad Gateway.
- Дождитесь появления ошибки
Убедитесь, что параметр «Показать все FlowInfos» включен:

- Выберите один из неправильных ответов и изучите трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаруживаете ошибку в потоке сразу после фазы получения ответа от целевого сервера, как показано ниже:
( просмотреть увеличенное изображение )

Обратите внимание на значения свойств из трассировки:
- Кодирование контента:
gzip - Тело содержимого ответа:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Кодирование контента:
Перейдите к этапу ошибки сразу после этапа получения ответа от целевого сервера :
( просмотреть увеличенное изображение )

Обратите внимание на свойства:
- ошибка:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway ошибка.причина:
Not in GZIP formatВ error.cause указано, что полезные данные ответа не в формате GZIP. Это означает, что Apigee Edge ожидал, что полезные данные ответа будут в формате GZIP, как было указано в заголовке
Content-Encoding(определенном на предыдущем шаге). Поэтому Apigee Edge не может распаковать полезные данные с помощью gzip и возвращает ошибкуDecompression failure at response.
Обратите внимание, что ответ от целевого/внутреннего сервера в этом случае равен
200; однако клиентское приложение получит ответ502поскольку Apigee Edge возвращает ошибку.- ошибка:
Перейдите к этапу «Ответ, отправленный клиенту» в трассировке и щелкните его.
( просмотреть увеличенное изображение )

Обратите внимание на следующие детали трассировки:
- Код состояния:
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-код неисправности messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-источник-ошибки target
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа 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-код неисправности messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-источник-ошибки 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 с помощью Trace , как описано в разделе «Общие шаги диагностики» .
Значения выборки трассировки следующие:
- Кодирование контента:
gzip - ошибка.причина:
Not in GZIP format
Значение в заголовке ответа Content-Encoding — gzip ; однако полезные данные ответа не имеют формата GZIP (на что указывает error.cause ). Поэтому Apigee Edge отвечает
502 Bad Gatewayи кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Кодирование контента:
Фактический запрос
Чтобы подтвердить использование фактического запроса:
Если у вас есть доступ к фактическому запросу, сделанному к приложению целевого/внутреннего сервера, выполните следующие шаги:
- Если вы являетесь пользователем публичного или частного облака , отправьте запрос непосредственно на внутренний сервер с самого внутреннего сервера или любого другого компьютера, с которого вам разрешено отправлять запросы на внутренний сервер.
- Если вы являетесь пользователем частного облака , вы также можете отправить запрос на внутренний сервер от одного из процессоров сообщений.
- Изучите ответ, отправленный внутренним сервером, и определите значение, переданное в заголовке ответа
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.
Журналы процессора сообщений
Для проверки с использованием журналов процессора сообщений:
Если вы являетесь пользователем частного облака , вы можете использовать журналы процессора сообщений для определения ключевой информации об ошибках HTTP
502.Проверьте журнал процессора сообщений:
/opt/apigee/var/log/edge-message-processor/logs/system.logВыполните поиск, чтобы узнать, возникли ли какие-либо ошибки
502в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо ответы с ошибкой502по-прежнему. Вы можете использовать следующую строку поиска:grep -ri "ZipException"
Вы найдете строки из system.log, подобные следующим:
Сценарий №1
Сценарий № 1. Когда ответ API имеет заголовок 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 formatСтрока
java.util.zip.ZipException: Not in GZIP formatв приведенном выше сообщении об ошибке указывает на то, что полезные данные ответа не отправляются в формате GZIP, хотяContent-Encodingуказан как gzip. Поэтому Apigee Edge генерирует исключение и возвращает код состояния502с кодом ошибкиmessaging.adaptors.http.flow.DecompressionFailureAtResponseклиентским приложениям.Сценарий №2
Сценарий № 2. Когда ответ API имеет заголовок 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 checkСтроки
java.util.zip.ZipException: incorrect header checkиCaused by: java.util.zip.DataFormatException: incorrect header checkв приведенном выше сообщении об ошибке указывают на то, что полезные данные ответа не отправляются в дефлированном формате и не соответствуют кодировке. указанный в заголовкеContent-Encodingфайла deflate. Поэтому 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 :
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя API-прокси
- Полная команда
curl, используемая для воспроизведения ошибки502 - Файл трассировки ответов API
Если вы являетесь пользователем частного облака , предоставьте следующую информацию:
- Полное сообщение об ошибке наблюдается для неверных ответов
- Имя среды
- Пакет API-прокси
- Файл трассировки ответов API
Журналы доступа NGINX
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_logГде: ORG , ENV и PORT# заменяются фактическими значениями.
- Системные журналы процессора сообщений
/opt/apigee/var/log/edge-message-processor/logs/system.log