Как отлаживать неудачные запросы с client_disconnected_before_any_response

У нас есть HTTP(s) Load Balancer, созданный входом kubernetes, который указывает на бэкэнд, образованный набором модулей, запускающих nginx и Ruby on Rails.

Взглянув на журналы балансировки нагрузки, мы обнаружили все большее число запросов с кодом ответа 0 а также statusDetails знак равно client_disconnected_before_any_response,

Мы пытаемся понять, почему это происходит, но мы не нашли ничего подходящего. В журналах доступа и ошибок nginx ничего нет.

Это происходит для нескольких видов запросов, от GET до POST.

Мы также подозреваем, что иногда, несмотря на то, что запрос регистрируется с этой ошибкой, запросы фактически передаются бэкэнду. Например, мы видим ошибки PG::UniqueViolation из-за того, что идентичные запросы на регистрацию дважды отправляются на сервер в нашей конечной точке регистрации.

Любая помощь будет оценена. Спасибо!


ОБНОВЛЕНИЕ 1

В соответствии с запросом, здесь находится файл yaml для входного ресурса:


ОБНОВЛЕНИЕ 2

Я создал метрику Stackdriver на основе журнала, чтобы подсчитать количество запросов, которые представляют такое поведение. Вот диаграмма:

диаграмма

Большие пики примерно соответствуют временной метке для этих событий kubernetes:

События

Полная ошибка: Readiness probe failed: Get http://10.48.1.28:80/health_check: net/http: request canceled (Client.Timeout exceeded while awaiting headers)"

Так что иногда кажется, что проверка готовности стручков за бэкэндом не удается, но не всегда.

Вот определение готовности Probe

readinessProbe:
  failureThreshold: 3
  httpGet:
    httpHeaders:
    - name: X-Forwarded-Proto
      value: https
    - name: Host
      value: [redacted]
    path: /health_check
    port: 80
    scheme: HTTP
  initialDelaySeconds: 1
  periodSeconds: 30
  successThreshold: 1
  timeoutSeconds: 5

1 ответ

Код ответа 0 и statusDetails = client_disconnected_before_any_response означает, что клиент закрыл соединение до того, как балансировщик нагрузки сможет предоставить ответ согласно этой документации GCP.

Изучение причин, по которым он не отвечал вовремя, одной из причин может быть разница между тайм- аутами активности активности от nginx и балансировщиком нагрузки GCP, даже если это наиболее похоже на backend_connection_closed_before_data_sent_to_client, вызванное состоянием гонки 502 Bad Gateway.

Чтобы убедиться, что бэкэнд отвечает на запрос, и посмотреть, сколько времени это займет, вы можете повторить этот процесс пару раз (так как вы все еще получаете некоторые действительные ответы):

время отклика скручивания

$ curl -w "@curl.txt" -o /dev/null -s IP_HERE

содержимое curl.txt (сначала создайте и сохраните этот файл):

   time_namelookup:  %{time_namelookup}\n
      time_connect:  %{time_connect}\n
   time_appconnect:  %{time_appconnect}\n
  time_pretransfer:  %{time_pretransfer}\n
     time_redirect:  %{time_redirect}\n
time_starttransfer:  %{time_starttransfer}\n
                ----------\n
        time_total:  %{time_total}\n

В этом случае просмотрите код регистрации конечной точки для любого типа цикла, например, ошибок PG::UniqueViolation, о которых вы упоминали.