Перейти к содержимому

Обзор ​

Процесс 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() до того, как сервер получит первый запрос. Серверы, созданные раньше, тоже охватываются.

Опции ​

ОпцияТипПо умолчаниюОписание
spansbooleantrueЗаписывать каждый запрос корневым спаном http.server. С false у запросов всё равно своя область и контексты request.*.
sessionsbooleantrueСчитать каждый запрос сессией (см. Здоровье релизов). Не зависит от spans.
ignoreRequest(request: IncomingMessage) => boolean—Верните true, чтобы не инструментировать запрос (health check, статика) — ни области, ни спана, ни сессии.

tracesSampleRate применяется к спанам запросов, как к любому трейсу.

Для работы, которая начинается не с HTTP-запроса (задачи очереди, cron), оборачивайте каждую единицу работы в withScope() или asyncSpan(), чтобы дать ей ту же изоляцию.