Обзор
Процесс Node обрабатывает много запросов сразу на одном общем клиенте. httpServerIntegration выполняет обработчики каждого входящего запроса в его собственной области, так что у запроса свои:
- теги и контексты —
withScope()внутри обработчика влияет только на события этого запроса (глобальныеsetTag()/setUser()по-прежнему действуют на весь процесс — см. Теги и контекст); - след хлебных крошек — ошибка в одном запросе никогда не несёт крошки из другого;
- трейс — с включённым
spans(по умолчанию) каждый запрос — корневой спанhttp.serverс именемGET /users/42, и каждый спан, лог и ошибка, пойманные при его обработке, относятся к его трейсу. Запрос, несущий трейс, —traceparentот страницы или сервиса на SDK Buglapse илиsentry-traceот Sentry SDK, — продолжает его: спан становится дочерним спануhttp.clientвызывающей стороны и следует её решению о сэмплировании. См. Распределённый трейсинг.
Каждое событие, пойманное во время запроса, получает request.url, request.method и request.referrer. Спан также записывает http.method, http.url и http.status_code. Его статус — error для ответа 5xx и cancelled, если клиент отключился до отправки ответа.
Здоровье релизов
Каждый запрос — ещё и сессия: здоровье релизов для бэкенда, как визит в браузере. Запрос считается:
crashed— во время него поймана необработанная ошибка (необработанное исключение или отклонённый промис, который к тому же завершает процесс);errored— поймана обработанная ошибка (captureException()в middleware ошибок) или ответ был5xx;ok— иначе.
Запросы не отправляются по одному: они считаются по минутам и статусам, и раз в минуту каждый счётчик уходит одним агрегированным событием session с quantity. Счётчики также отправляются при flush(), когда у процесса заканчивается работа, и перед выходом при падении. Задайте release в init(), чтобы получить долю без падений по релизам; тогда Сессии проекта покажут бэкенд рядом с визитами браузера.
Агрегированные сессии никому конкретно не принадлежат, поэтому учитываются в доле сессий без падений, но не пользователей. Они бесплатны: сессии не сэмплируются и не входят в квоту.
Интеграция подключается к самим node:http / node:https, так что работает со всем, что построено поверх них: Express, Koa, Fastify, Node-адаптер Hono, собственный сервер Next.js.
Использование
ts
import { init } from '@buglapse/node'
import { httpServerIntegration } from '@buglapse/node/integrations'
init({
dsn: '{dsn}',
integrations: [
httpServerIntegration({
ignoreRequest: (request) => request.url === '/health',
}),
],
})Вызовите init() до того, как сервер получит первый запрос. Серверы, созданные раньше, тоже охватываются.
Опции
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
spans | boolean | true | Записывать каждый запрос корневым спаном http.server. С false у запросов всё равно своя область и контексты request.*. |
sessions | boolean | true | Считать каждый запрос сессией (см. Здоровье релизов). Не зависит от spans. |
ignoreRequest | (request: IncomingMessage) => boolean | — | Верните true, чтобы не инструментировать запрос (health check, статика) — ни области, ни спана, ни сессии. |
tracesSampleRate применяется к спанам запросов, как к любому трейсу.
Для работы, которая начинается не с HTTP-запроса (задачи очереди, cron), оборачивайте каждую единицу работы в withScope() или asyncSpan(), чтобы дать ей ту же изоляцию.