← Блог

Мониторинг Server-Sent Events без убийства соединений

Страница статуса зелёная, а live-уведомления молчат десять минут. Ложный зелёный SSE: probe один раз получил 200 на handshake или half-open TCP без событий. Честный мониторинг — companion GET /health/sse, а не долбёжка /events.

Краткий ответ

StillOnline не вешает долгий GET на /events. Добавьте GET /health/sse: 200, если последнее событие свежее N секунд, 503 при stale pipeline. Free: один URL, ~5 мин, код ответа.

SSE — one-way HTTP с text/event-stream. Внешний монитор шлёт короткие GET по расписанию. База: дизайн health · WebSocket.

1. Почему наивные HTTP-пробы ломают SSE

ОшибкаЧто ломаетсяЛучше
GET /events каждые 5 минНовое соединение, метрики/health/sse
GET /Лендинг жив, поток мёртвFreshness JSON
200 на первый байтHandshake OK, событий нет503 по age

Triage: алерт → curl /health/sse503 → логи SSE worker.

2. Sidecar /health/sse vs синтетический reader

Sidecar — GET с last_event_seconds_ago. Синтетика — долгий EventSource в worker. StillOnline — только sidecar.

app.get("/health/sse", (req, res) => {
  const ageSec = (Date.now() - lastEventAt) / 1000;
  if (ageSec > 120) return res.status(503).json({ status: "stale", ageSec });
  res.json({ status: "ok", ageSec });
});

Обновляйте lastEventAt на каждую запись в SSE handler. Stale → 503, иначе StillOnline Free не увидит сбой.

3. nginx, CDN и buffering

proxy_buffering off, proxy_cache off, X-Accel-Buffering: no. Heartbeat : keepalive при тишине. proxy_read_timeout > интервал heartbeat.

4. Workflow: detect → alert → status page

  1. curl /health/sse снаружи.
  2. Дождаться DOWN в StillOnline (два провала).
  3. Triage: app vs proxy vs publisher.
  4. Пост на странице статуса за 15 мин — «Live-обновления задержаны».
  5. Resolve после 200 и проверки EventSource в браузере.

5. StillOnline runbook для SSE

URL: https://api.product.com/health/sse, не /events. Без auth. Один канал на Free. Порог freshness > тихого heartbeat, иначе ложные 503.

Репетиция: остановите publisher в staging, HTTP жив.

Что дальше

Sidecar, nginx, StillOnline. Синтетический reader — если live-лента = выручка.

Дашборд StillOnline.

Связанные материалы

FAQ

Интервал StillOnline для SSE?

~5 мин на Free. Порог stale — 60–120 с при нормальном heartbeat.

Stall vs hard outage?

Stall: 503 + высокий ageSec, HTTP жив. Hard: refused / 502/503 на edge.

StillOnline открывает SSE?

Нет — только GET на /health/sse.

Нужен синтетический reader?

Для MVP — sidecar + StillOnline достаточно.

/events или /health/sse в StillOnline?

Только /health/sse.

Связь с WebSocket?

Тот же sidecar-паттерн 200/503.