Приложение, которое уже использует официальный Sentry SDK — @sentry/browser, @sentry/node, sentry-python, sentry-php, sentry-java, любой другой, — может отправлять события в Buglapse без изменения кода: дайте SDK Sentry DSN проекта вместо DSN Sentry. События попадают в те же таблицы, что и события от @buglapse/*, так что инциденты, трейсы, логи, записи сессий, здоровье релизов, алерты и поиск работают так же.
Как включить
Владелец организации включает Sentry SDK в Организация → Интеграции. Включить можно на любом тарифе; DSN работает, пока тариф включает совместимость с Sentry SDK.
После этого у каждого проекта в Настройки → Общие появляется Sentry DSN:
https://{project-token}@{host}/{project-id}Подставьте его в опцию
dsnSDK. Больше ничего не меняется:tsSentry.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 / Laravel | sentry/sentry-laravel 4.29.0 | ◐Работает с оговоркой1 | ✓Работает | ✓Работает | –В SDK этого нет2 | Неприменимо | Неприменимо | 2026-10-14 |
| Python / Django | sentry-sdk 2.72.0 | ◐Работает с оговоркой1 | ✓Работает | ✓Работает | ✓Работает | Неприменимо | Неприменимо | 2026-10-14 |
| Go | github.com/getsentry/sentry-go 0.50.0 | ◐Работает с оговоркой1 | ✓Работает | ✓Работает | –В SDK этого нет2 | Неприменимо | Неприменимо | 2026-10-14 |
| Java / Spring Boot | sentry-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 этого нетПустая ячейка — к платформе неприменимо.
- captureMessage() of this SDK takes no parameters, so a message arrives without its template and is grouped by its text (numbers and ids parameterized).
- 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_atenvelope против времени получения), временные метки исправляются; поправка в секундах попадает в контекстclock_driftсобытия — так же, как для SDK Buglapse. - Загружаемая source map — до 50 МБ (или лимита тарифа), artifact bundle — до 512 МБ.
Чек-лист перехода
- Включите Sentry SDK в Организация → Интеграции.
- Замените DSN на Sentry DSN проекта (и цель
tunnel, если пользуетесь им). - Задайте для сборки
SENTRY_URL,SENTRY_AUTH_TOKEN,SENTRY_ORGиSENTRY_PROJECT, чтобы source maps и релизы уходили в Buglapse. - Вызовите тестовую ошибку и проверьте, что она появилась с читаемым стектрейсом.
- Привяжите репозиторий проекта, если нужны ссылки на код и Autofix.
- Уберите то, что здесь не читается, — профилирование, cron check-in, отзывы пользователей, вложения — или оставьте: SDK велят прекратить их отправку.