Обзор
sessionIntegration ведёт одну сессию на визит — знаменатель здоровья релизов: сколько было визитов и сколько из них прошли плохо. Она включена по умолчанию.
- Сессия начинается при инициализации SDK и живёт в
localStorage, так что перезагрузки и новые вкладки того же визита её разделяют. Она заканчивается после 30 минут бездействия; следующее событие или переход в SPA после этого начинает новую. - Она отправляется событием
sessionпри начале и каждый раз, когда её статус ухудшается: обработанная ошибка (captureException()) делает её errored, необработанная (GlobalErrorIntegration) — crashed. Один лишь выросший счётчик ошибок отправляется, когда страница скрывается. - Страница, которая ушла без чистого завершения, — упавшая вкладка («Опаньки…», нехватка памяти), принудительно закрытый браузер, выключенный компьютер — делает свою сессию abnormal (см. Аварийные завершения).
- Каждое другое событие несёт id сессии в
contexts['session.id']— так инцидент знает, сколько сессий он задел.
Сессии бесплатны: они никогда не входят в квоту и не сэмплируются. Что панель делает с ними — на странице Сессии.
Использование
Ничего делать не нужно — init() регистрирует её автоматически. Чтобы выключить:
ts
import { disable } from '@buglapse/browser'
disable('session')Со script-тегом выключите Сессии в Настройки → Скрипт загрузчика проекта.
| Опция | По умолчанию | Описание |
|---|---|---|
abnormalExits | true | Помечать сессию abnormal, если одна из её страниц ушла без чистого завершения. |
ts
import { init } from '@buglapse/browser'
import { sessionIntegration } from '@buglapse/browser/integrations'
init({
dsn: '{dsn}',
integrations: [sessionIntegration({ abnormalExits: false })],
})Аварийные завершения
Упавшая вкладка не выполняет кода, который мог бы о ней сообщить, поэтому это выясняется позже. Каждая страница держит в localStorage небольшой пульс (обновляется каждые 10 секунд) и удаляет его на pagehide — при переходе, закрытии вкладки или браузера. Пульс, который остановился больше чем на 2 минуты и не был удалён, принадлежит странице, ушедшей нечисто: любая страница вашего сайта, открытая потом, — другая вкладка или следующий визит — помечает сессию той страницы abnormal. Так что об этом сообщается, когда снова работает какая-нибудь страница сайта, а не в момент падения.
Это эвристика, как в Sentry: падение рендерера, принудительное закрытие, падение ОС или убитый процесс выглядят одинаково. Чтобы не было ложных срабатываний, о скрытой странице (фоновая вкладка, свёрнутое окно) не сообщается никогда — браузеры замедляют и замораживают скрытые страницы, а выгрузка такой страницы — не падение, — и ничего не сообщается сразу после пробуждения компьютера из сна.
Id сессии
getSessionId() возвращает id текущей сессии — например, чтобы передать визит на ваш бэкенд. Работает до init() и без интеграции; как и событие, чтение считается активностью и начинает новую сессию, если прошлая истекла.
ts
import { getSessionId } from '@buglapse/browser'
await fetch('/api/checkout', { method: 'POST', headers: { 'X-Session-Id': getSessionId() } })Сессия не зависит от трейсинга — это не id трейса, и к группировке спанов она отношения не имеет.