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

Приложение, которое уже использует официальный Sentry SDK — @sentry/browser, @sentry/node, sentry-python, sentry-php, sentry-java, любой другой, — может отправлять события в Buglapse без изменения кода: дайте SDK Sentry DSN проекта вместо DSN Sentry. События попадают в те же таблицы, что и события от @buglapse/*, так что инциденты, трейсы, логи, записи сессий, здоровье релизов, алерты и поиск работают так же.

Как включить ​

  1. Владелец организации включает Sentry SDK в Организация → Интеграции. Включить можно на любом тарифе; DSN работает, пока тариф включает совместимость с Sentry SDK.

  2. После этого у каждого проекта в Настройки → Общие появляется Sentry DSN:

    https://{project-token}@{host}/{project-id}
  3. Подставьте его в опцию dsn SDK. Больше ничего не меняется:

    ts
    Sentry.init({
        dsn: 'https://{project-token}@{host}/{project-id}',
        release: '1.4.2',
    })

SDK отправляет события на /api/{project-id}/envelope/ (старые SDK — на /api/{project-id}/store/). Запрос отклоняется с 401 при неизвестном ключе или id проекта, который ему не соответствует, и с 403, если организация не включила интеграцию, тариф её не включает или разрешённые домены проекта не содержат домен страницы.

Если вы отправляете через tunnel, направьте и его на Buglapse — туннель пересылает на тот хост, для которого написан, что бы ни было в DSN.

Что поддерживается ​

Элемент SentryВ BuglapseПримечания
event (ошибки)Исключение → инцидентКадры, причины (chain), группы исключений, локальные переменные, хлебные крошки, теги, пользователь, контексты, fingerprint, event_id
event (сообщения)Исключение с именем MessageГруппируется по шаблону сообщения, если SDK его прислал (logentry.message + params)
transaction, spanСпаны / трейсыВключая span streaming (span v2)
logЛогиШаблон сообщения и его параметры сохраняются как атрибуты
replay_event + replay_recordingЗапись сессий
sessionСессии (здоровье релизов)
sessions (агрегаты серверных SDK)СессииСчётчики по минутам и статусам; без данных по пользователям
client_reportСтатистика и использование, «отброшено SDK»Не тарифицируется
profile, profile_chunk, attachment, check_in, feedback, user_report, метрикиОтбрасываютсяНе тарифицируются; SDK велят прекратить их отправку на час

Трейсы проходят через разные SDK: id трейсов и спанов Sentry SDK в том же формате, что у нас, так что два сервиса на Sentry SDK, отправляющие в два проекта одной организации, открываются одним водопадом без настройки, а @buglapse/node продолжает трейс из заголовка sentry-trace Sentry SDK. Для обратного направления — SDK Buglapse вызывает сервис на Sentry SDK — задайте propagateSentryTrace: true (Распределённый трейсинг).

Собственный event_id SDK сохраняется: то, что Sentry.lastEventId() показал пользователю, находит срабатывание через event_id: в поиске исключений.

Какие из этих данных хранятся, решает тариф, как и для @buglapse/*: тип, функцию которого тариф не включает (трейсы, логи, записи сессий), отклоняется, и SDK велят его придержать.

Проверенные платформы ​

Обещания таблицы выше проверяются запуском настоящих SDK против Buglapse: образец приложения на каждой платформе отправляет необработанную ошибку с причиной, сообщение, трейс с вложенным спаном и исходящим запросом, структурированный лог и свои сессии (браузерный — ещё и запись сессии), а каждая ячейка — то, что затем нашлось в хранилище: кадры, причина, родитель спана, шаблон лога, — а не сам факт принятия запроса.

ПлатформаSDKОшибкиТрейсыЛогиСессииЗаписи сессийSource mapsПроверено
PHP / Laravelsentry/sentry-laravel 4.29.0◐Работает с оговоркой1✓Работает✓Работает–В SDK этого нет2НеприменимоНеприменимо2026-10-14
Python / Djangosentry-sdk 2.72.0◐Работает с оговоркой1✓Работает✓Работает✓РаботаетНеприменимоНеприменимо2026-10-14
Gogithub.com/getsentry/sentry-go 0.50.0◐Работает с оговоркой1✓Работает✓Работает–В SDK этого нет2НеприменимоНеприменимо2026-10-14
Java / Spring Bootsentry-spring-boot-starter-jakarta 8.60.0✓Работает✓Работает✓Работает–В SDK этого нет2НеприменимоНеприменимо2026-10-14
Node.js@sentry/node 11.7.0✓Работает✓Работает✓Работает✓РаботаетНеприменимо✓Работает2026-10-13
Browser@sentry/browser 11.7.0✓Работает✓Работает✓Работает✓Работает✓Работает✓Работает2026-10-14

Работает Работает с оговоркой В SDK этого нетПустая ячейка — к платформе неприменимо.

  1. captureMessage() of this SDK takes no parameters, so a message arrives without its template and is grouped by its text (numbers and ids parameterized).
  2. The SDK sends no sessions, so there is no release health for this platform.

Ещё не проверялись: Flutter и React Native.

Каждая строка — указанная в ней версия SDK, последняя стабильная на день прогона. Более старые версии и другие платформы не запускались — они говорят на том же протоколе, но здесь за них никто не ручается. Стектрейсы, которым нужна символикация на сервере (iOS, нативные, ProGuard / R8), не символицируются ни на одной платформе, см. Мобильные и нативные.

Группировка ​

Buglapse группирует по своему правилу по умолчанию — тип исключения и кадры приложения (функция и файл, без номеров строк), а если пригодного стека нет — тип и параметризованное сообщение, — а не по алгоритму Sentry, так что инциденты не разделятся ровно так, как в Sentry.

Отпечаток, заданный в коде, учитывается, если тариф включает свою группировку:

ts
Sentry.withScope((scope) => {
    scope.setFingerprint(['{{ default }}', 'payment-provider'])
    Sentry.captureException(error)
})

{{ default }} означает собственную группировку Buglapse; отпечаток без него заменяет группировку целиком. До 10 элементов по 200 символов. Шаблон группировки проекта описан на странице Инциденты.

Source maps через sentry-cli ​

sentry-cli и плагины сборщиков @sentry/*-plugin (Vite, webpack, Rollup, esbuild) загружают карты в Buglapse так же, как в Sentry, — оставьте сборку как есть и поменяйте три настройки:

bash
SENTRY_URL=https://app.buglapse.com
SENTRY_AUTH_TOKEN=<персональный токен со скоупом project:releases>
SENTRY_ORG={organization}
SENTRY_PROJECT={project}

или в плагине сборщика:

ts
sentryVitePlugin({
    url: 'https://app.buglapse.com',
    authToken: process.env.SENTRY_AUTH_TOKEN,
    org: '{organization}',
    project: '{project}',
})

{organization} и {project} — слаги из адреса проекта в панели. Токен создаётся в Профиль → Токены; sentry-cli может предупредить, что он не похож на токен Sentry, — это работает. Тариф должен включать source maps, а у организации должна быть включена интеграция Sentry SDK.

Карты сопоставляются по Debug ID: плагин (или sentry-cli sourcemaps inject) записывает id в каждый бандл и его карту, SDK отправляет его с каждым событием, и Buglapse находит карту по нему — release не нужен, имя файла угадывать не надо, а две сборки одного релиза сохраняют свои карты.

bash
sentry-cli sourcemaps inject ./dist
sentry-cli sourcemaps upload ./dist

Карта без Debug ID тоже сохраняется, если при загрузке указан релиз (--release), — под путём минифицированного файла, и сопоставляется по release события и имени файла кадра, как описано на странице Source maps.

Команды релизов тоже работают:

КомандаЧто делает
sentry-cli releases new <version>Регистрирует релиз
sentry-cli releases set-commits <version> --autoСохраняет коммит, из которого собран релиз, — по нему кадры стека ссылаются на строку в репозитории, и по нему Autofix читает код. --auto сопоставляет remote рабочей копии с репозиторием, привязанным к проекту
sentry-cli releases finalize <version>Отмечает релиз развёрнутым
sentry-cli deploys new --release <version> -e productionОтмечает релиз развёрнутым (деплои отдельно не показываются)

Не поддерживаются: устаревшая загрузка файлов релиза по одному (старые версии sentry-cli, которые не собирают artifact bundles; карта без Debug ID и без релиза пропускается), releases list / info / delete, отладочные файлы (debug-files upload) и файлы маппинга ProGuard.

Мобильные и нативные ​

Стектрейсы, которым нужна символикация на сервере, остаются такими, какими их прислали: кадры iOS и нативные — адресами (dSYM и отладочные файлы не обрабатываются), минидампы не принимаются вовсе. Android-сборки, обфусцированные ProGuard / R8, сохраняют обфусцированные имена — файл маппинга не применяется. Чтобы такой краш не становился новым инцидентом с каждой сборкой, обфусцированные кадры помечаются как не относящиеся к приложению и не участвуют в группировке: инцидент определяется по кадрам, которые остались читаемыми, или по типу и сообщению исключения.

Кадры JavaScript в React Native раскодируются как любой другой JavaScript, по Debug ID.

Ограничения ​

  • Envelope после распаковки может весить не больше 20 МБ (иначе 413).
  • На лимиты сервер отвечает так же, как Sentry, — 429 с Retry-After, если ограничено всё в envelope, иначе X-Sentry-Rate-Limits по категориям, — так что SDK сам притормаживает. Динамическое сэмплирование отбрасывает события без 429.
  • Если часы клиента отстают или спешат больше чем на минуту (sent_at envelope против времени получения), временные метки исправляются; поправка в секундах попадает в контекст clock_drift события — так же, как для SDK Buglapse.
  • Загружаемая source map — до 50 МБ (или лимита тарифа), artifact bundle — до 512 МБ.

Чек-лист перехода ​

  1. Включите Sentry SDK в Организация → Интеграции.
  2. Замените DSN на Sentry DSN проекта (и цель tunnel, если пользуетесь им).
  3. Задайте для сборки SENTRY_URL, SENTRY_AUTH_TOKEN, SENTRY_ORG и SENTRY_PROJECT, чтобы source maps и релизы уходили в Buglapse.
  4. Вызовите тестовую ошибку и проверьте, что она появилась с читаемым стектрейсом.
  5. Привяжите репозиторий проекта, если нужны ссылки на код и Autofix.
  6. Уберите то, что здесь не читается, — профилирование, cron check-in, отзывы пользователей, вложения — или оставьте: SDK велят прекратить их отправку.