Живой кейс: воспроизвести баг «интермиттентный 502» - лог, гипотезы, минимальные шаги

в проде периодически (через ~6–12 часов) падают некоторые endpoint’ы с 502, но после перезапуска сервиса всё временно стабильно. Логи показывают: connect EPROTO и upstream read timeout, но не всегда. Предложите пошаговую стратегию воспроизведения + 3 реальные гипотезы (и как быстро их подтвердить). Не давайте только общий список - давайте конкретные команды/шаги.

TLS handshake/EPROTO from upstream (например, сервис A меняет cert/expired cert) → соединение падает. Quick check: curl -v https://upstream-host с сервера прокси в момент инцидента (или run periodically). Команды: openssl s_client -connect upstream-host:443 -showcerts - посмотреть cert validity. Если cert expired/intermittent, это будет видно.

upstream overcrowding / ephemeral port exhaustion. Check netstat/ss for TIME_WAIT count, sysctl -a | grep net.ipv4.ip_local_port_range, lsof -p <pid> and ss -s. Для воспроизведения - запустить нагрузочный скрипт (wrk/k6) и смотреть когда порт pool исчерпывается. Quick mitigation: уменьшить keepalive timeout или увеличить ephemeral port range.

memory leak в upstream service → GC pauses → таймауты. Проверяем метрики memory/GC на upstream (heap, p95 latency). Для проверки — воспроизвести load и снять heapdump при росте RSS. Tooling: curl /metrics (если prometheus), jmap/heapdump или node clinic.

Шаги: 1) включить детальный TLS logging на прокси, 2) запустить нагрузочный тест 30–60m чтобы воспроизвести, 3) собрать netstat/ss snapshots при инциденте.

делаем canary test: 1) настроить secondary upstream (backup) и включить healthchecks (fast) - при падении primary - переключение позволит не терять availability; 2) собираем tcpdump -w при инциденте (ограничьте фильтр по ip/port) это даст raw trace TLS handshake; 3) correlate with deploys/cron jobs, часто background tasks (backup, rotate certs) совпадают с таймингом проблем.

Ещё проверьте: не было ли межвузловой MITM или смены ALPN - EPROTO может означать mismatch TLS versions. Логи nginx/HAProxy + openssl помогут.

Добавьте circuit-breaker + retry с backoff

Конкретные команды для начала:

  • openssl s_client -connect upstream:443 -servername upstream

  • ss -s; ss -tanp | grep :443

  • tcpdump -i any host <upstream-ip> and port 443 -w /tmp/tls.pcap

  • curl -v --http2 https://upstream
    Дальше смотрим pcap в Wireshark, проверяем TLS alerts.