Вы просматриваете документацию 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-Encoding
HTTP-ответа (от внутреннего/целевого сервера), действительна и поддерживается 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.DecompressionFailureAtResponse
X-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.DecompressionFailureAtResponse
X-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 format
occurred 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