Мониторинг 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/sse → 503 → логи 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
curl /health/sseснаружи.- Дождаться DOWN в StillOnline (два провала).
- Triage: app vs proxy vs publisher.
- Пост на странице статуса за 15 мин — «Live-обновления задержаны».
- 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-лента = выручка.
Связанные материалы
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.