Приём событий по протоколу Sentry

Перевести приложение с Sentry — сменой одного DSN

VseOK принимает события по тому же протоколу, что и Sentry. Если в приложении уже стоит официальный sentry-sdk, переезд — это одна строка конфигурации: ни новой библиотеки, ни правок в коде, ни повторной инструментации.

10 000 событий в месяц на бесплатном тарифе. Карта не нужна.

main.py
import sentry_sdk

sentry_sdk.init(
    # ↓ единственное изменение во всём проекте
    dsn="https://<public_key>@ingest.vseok.ru/<short_id>",
    release="myapp@1.0.0",
    environment="production",
)
1 DSNи ни строки кода сверх этого
РФвесь стек в российской юрисдикции
152-ФЗскрабинг ПДн до записи в хранилище
3–4×дешевле Sentry на объёме

Как это работает

Три шага от установки до первого алерта

Реализованы оба ингест-эндпоинта Sentry: POST /api/{project}/envelope/ для актуальных SDK (включая gzip-сжатые тела) и POST /api/{project}/store/ для старых. Авторизация читается из X-Sentry-Auth или ?sentry_key=.

1

Создайте проект

Регистрация, проект, вкладка «Подключение» — там лежит готовый DSN. Первый зарегистрированный пользователь становится администратором.

2

Подставьте DSN

В существующий sentry_sdk.init() — или используйте SDK VseOK для Python, Node.js, PHP и Ruby.

3

Получайте алерты

Новый issue и регрессия уведомляют всегда. Каналы: Telegram, webhook и email — каждый проверяется кнопкой из интерфейса.

app.py
import sentry_sdk

sentry_sdk.init(
    dsn="https://<public_key>@ingest.vseok.ru/<short_id>",
    release="myapp@1.0.0",      # привязывает ошибки к сборке
    environment="production",
)

# Дальше — обычный код sentry-sdk, менять нечего:
sentry_sdk.set_user({"id": "user-42"})
sentry_sdk.set_tag("region", "msk")

try:
    1 / 0
except ZeroDivisionError:
    sentry_sdk.capture_exception()
instrument.js
import * as Sentry from "@sentry/node";

Sentry.init({
  dsn: "https://<public_key>@ingest.vseok.ru/<short_id>",
  release: "myapp@1.0.0",
  environment: "production",
});

// Стек-фреймы V8 разбираются на сервере, библиотечные — сворачиваются.
Sentry.captureException(new Error("cart checkout failed"));
worker.py
import vseok_sdk

client = vseok_sdk.VseOKClient(
    dsn="https://<public_key>@ingest.vseok.ru/<project_id>",
    environment="production",
    release="myapp@1.0.0",
)

client.set_user("user-42")                          # скрабится как ПДн
client.set_tag("region", "msk")
client.add_breadcrumb("cart loaded", category="http")

try:
    risky_call()
except Exception:
    client.capture_exception()      # трейс прикрепляется сам

# Доставка неблокирующая: если VseOK недоступен, приложение
# не падает и не ждёт — события уходят с бэкоффом позже.
client.shutdown()                    # флаш очереди перед выходом

Почему у проекта два DSN. Официальные SDK Sentry разбирают путь DSN как целое число и падают с BadDsn на UUID — поэтому у каждого проекта есть числовой short_id для них и UUID-DSN для собственных SDK VseOK. Оба показаны на вкладке «Подключение».

Возможности

Что уже работает

Ниже — только то, что есть в продукте сегодня. Планы вынесены отдельно, в раздел «Что в работе».

Совместимость с SDK Sentry

Исключения, capture_message, стек-фреймы, release, environment, server_name, пользователь, теги, breadcrumbs и контекст рантайма раскладываются в схему VseOK. Типы событий, для которых хранилища нет (сессии, транзакции, профили), принимаются и отбрасываются — SDK не уходит в бесконечные ретраи.

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

События фингерпринтятся по типу исключения и месту в коде. Если SDK не передал culprit, сервер выводит его из самого внутреннего прикладного фрейма — два несвязанных ZeroDivisionError в разных файлах остаются разными issue, а не склеиваются в один.

Разобранные стектрейсы

Сырые трейсы Python, Node/V8, PHP и Ruby разбираются на структурированные фреймы при чтении: библиотечные свёрнуты, строка исходника показана там, где её захватил SDK. Источник истины — сырой текст, поэтому улучшение парсера бесплатно переобрабатывает старые события.

Алерты: Telegram, webhook, email

Новый issue и регрессия уведомляют всегда. Правило по объёму добавляет порог «N событий за M минут» — на проект или на конкретный issue. Кулдаун на issue означает, что авария на тысячу событий даёт одно уведомление, а не тысячу. Webhook совместим со Slack/Mattermost, каждый канал проверяется из интерфейса реальным путём доставки.

Регрессии

Закрытый issue, получивший новое событие, переоткрывается с алертом. Истёкшее окно «игнорировать 24 часа» тоже считается регрессией — заглушить шум не значит спрятать то, что никогда не прекращалось.

Поиск и триаж

Фильтры по статусу, уровню, окружению, релизу и полнотекстовый запрос; сортировка по свежести или частоте; постраничный вывод. Resolve, ignore с окном авто-переоткрытия, удаление и массовые операции.

Скрабинг ПДн (152-ФЗ)

Email, телефоны, номера, похожие на карточные, и IP редактируются; значения под чувствительными ключами (password, token, authorization, api_key…) выбрасываются — до записи события в Redis, так что персональные данные не доходят ни до одного хранилища.

Защита от всплесков

Ограничение частоты на проект в фиксированном окне: ниже мягкого порога принимаем всё, между мягким и жёстким — линейно убывающую долю, выше жёсткого отвечаем 429 с Retry-After. Пороги масштабируются тарифом.

Приём, который не теряет события

Горячий путь приёма трогает только Redis — ни Postgres, ни ClickHouse. Сбой базы физически не может привести к потере отчёта об ошибке: фингерпринтинг, upsert issue и запись события идут асинхронно в воркере, с очередью недоставленных.

Статистика на сервере

Счётчики событий, временные ряды и разбивка по уровням агрегируются в ClickHouse, а не в браузере. Сроки хранения задаёт TTL таблицы, стримы Redis ограничены по длине и не могут расти бесконечно.

SDK и HTTP-контракт

Собственные клиенты для Python (декоратор, Flask/Django/FastAPI), Node.js (middleware Express), PHP (Laravel reportable) и Ruby (Rack для Rails/Sinatra). Любой другой язык подключается по описанному HTTP-контракту.

Организации, участники и роли

Проекты принадлежат организации, а не человеку, который их создал. Роли owner / admin / member: владелец управляет ролями, администратор приглашает участников, участник работает с issues. Проект чужой организации отвечает 404, а не 403 — существование чужих данных не подтверждается.

Тарифы, квоты и оплата

Лимиты берутся из тарифа организации, а не из общих настроек развёртывания. Расход считается в момент приёма — принято, перерасход, отброшено по квоте и по лимиту частоты видно в реальном времени. Оплата картой через ЮKassa, на месяц или на год, подписка активируется по подтверждению платежа.

Идемпотентная доставка

Повторы уходят с бэкоффом и уважают Retry-After. Поскольку event_id стабилен, ретрай доставки, которая на самом деле дошла, дедуплицируется на сервере, а не удваивает счёт.

РФ-специфика

Не «догоняем Sentry», а делаем то, чего Sentry для России не может

У Sentry нет российского юрлица, оплаты российскими картами, договора и локализации персональных данных. Это не отставание в фичах — это то, что нельзя закрыть настройкой.

Данные в юрисдикции РФ

Весь стек размещается в российских облаках (Yandex / VK / Selectel) или на вашем железе. Это заложено в архитектуру, а не добавлено галочкой.

152-ФЗ by design

Скрабинг персональных данных выполняется на приёме, до записи в хранилище. Удаление проекта или субъекта ПДн идёт фоновой задачей со SLA «в течение 30 дней», как требует закон; доступ отзывается сразу.

Отечественные интеграции

Уведомления в Telegram и Mattermost вместо Slack и PagerDuty. В планах — VK Teams, git через GitLab/Gitea вместо GitHub, SSO через Keycloak.

Договор и закрывающие документы

Оплата в рублях, договор с российским юрлицом, счёт и акт. Поддержка на русском от людей, которые писали этот код.

Комплаенс для госсектора

Развёртывание on-prem одной командой, журнал аудита доступа, ГОСТ-TLS и совместимость с требованиями ФСТЭК — по составу работ в рамках внедрения.

Ядро под MIT

Базовую установку можно поднять самостоятельно и посмотреть в код. Vendor lock-in отсутствует конструктивно: данные ваши, схема открыта.

Что в работе (и ещё не работает)

  • Source maps для JS — читаемые трейсы минифицированного кода;
  • релизы и deploys: «в каком релизе появилось впервые», suspect commits через GitLab;
  • cron- и uptime-мониторинг: check-in плановых задач и HTTP-пробы;
  • SSO через Keycloak/LDAP и журнал аудита доступа;
  • подача в реестр российского ПО (сейчас не в реестре);
  • distributed tracing, session replay, профилирование, AI-анализ первопричины.

Тарифы

Платите за события, а не за места

Участники не тарифицируются нигде, кроме бесплатного плана: алерты должны видеть все, а не тот, у кого нашлась лицензия.

Оплата картой — сразу из дашборда. Тариф подключается на месяц или на год через ЮKassa, без переписки и счетов вручную. Расход квоты виден на странице «Тарифы и оплата» в реальном времени.

Free

Пет-проекты и первое знакомство

0₽ / мес

навсегда

  • 10 000 событий в месяц
  • хранение 7 дней
  • 2 проекта, 3 участника
  • алерты в Telegram, webhook, email
  • лимит 60 / 300 событий в минуту
Зарегистрироваться

Старт

Один продукт, небольшая команда

1 490₽ / мес

при оплате за год

  • 100 000 событий в месяц
  • хранение 30 дней
  • 10 проектов, участников без ограничений
  • правила алертов по объёму
  • лимит 300 / 3 000 событий в минуту
Начать с Free

Бизнес

Продуктовая компания, требования ИБ

14 900₽ / мес

≈ в 4 раза дешевле Sentry на этом объёме

  • 2 000 000 событий в месяц
  • хранение 90 дней
  • проектов и участников без ограничений
  • выделенный инстанс — от 39 000 ₽ / мес
  • лимит 3 000 / 30 000 событий в минуту
Обсудить условия

Цены указаны за месяц при оплате за год (год списывается целиком: «Старт» — 17 880 ₽, «Команда» — 58 800 ₽, «Бизнес» — 178 800 ₽). При оплате по месяцам действует коэффициент 1,2. На бесплатном тарифе события сверх квоты отбрасываются. На платных — принимаются и считаются по 0,02 ₽ за событие вплоть до трёхкратного объёма пакета, после чего отбрасываются: у перерасхода есть потолок, поэтому счёта на десятки тысяч рублей после одной аварии не будет. Текущий расход, перерасход и отброшенное видны в дашборде. Более длинный срок хранения — по запросу; новый срок применяется к новым событиям, уже сохранённые не переписываются.

Лимиты по тарифам
Тариф События / мес Хранение Проекты Участники Лимит / мин (soft / hard) Цена, ₽ / мес
Free 10 0007 дней23 60 / 3000
Старт 100 00030 дней10 300 / 3 0001 490
Команда 500 00090 дней 1 000 / 10 0004 900
Бизнес 2 000 00090 дней 3 000 / 30 00014 900
On-prem Standard до 50 млнлюбое по конфигурации690 000 ₽ / год
On-prem Enterprise без лимиталюбое по конфигурацииот 1 800 000 ₽ / год
Сравнение с альтернативами
События / мес VseOK Sentry Cloud GlitchTip Cloud
100 000 1 490 ₽ — Старт ≈ 3 430 ₽ — Team + PAYG ≈ 1 170 ₽
500 000 4 900 ₽ — Команда ≈ 14 600 ₽ — Team + PAYG ≈ 3 900 ₽
2 000 000 14 900 ₽ — Бизнес ≈ 60 800 ₽ — Business + PAYG ≈ 19 500 ₽ — пакет 3 млн
Договор с юрлицом РФ, счёт, акт данетнет
Данные в юрисдикции РФ данетнет
Оплата в рублях данетнет
Поддержка на русском данетсообщество
Развёртывание on-prem даEnterpriseда (self-hosted)

Цены конкурентов — оценка по публичным прайс-листам на июль 2026 при курсе 78 ₽/$. Для Sentry учтена подписка плюс pay-as-you-go по ставке $0,0003625 за событие (тир 50–100 тыс). Мы честно показываем, что GlitchTip Cloud дешевле нас на средних объёмах: у него нет российского юрлица, договора, локализации ПДн и поддержки — именно за это разница в цене. Перед подписанием договора цифры стоит перепроверить в актуальных прайсах.

On-premise · Enterprise

Для госсектора, служб ИБ и всех, кому нельзя в облако

Полная установка в вашем контуре: без выхода в интернет, с вашими политиками доступа и вашим сроком хранения.

690 000 ₽ / годStandard — до 50 млн событий в месяц
от 1 800 000 ₽ / годEnterprise — без лимита по объёму
150 000 – 400 000 ₽внедрение и миграция с Sentry, разово
  • Офлайн-установка. Дистрибутив с образами контейнеров, разворачивается в закрытом контуре без доступа к внешним реестрам.
  • Любой срок хранения. Retention задаёте вы, а не тариф; горячий уровень на NVMe, холодный — в объектном хранилище.
  • SSO и журнал аудита. Интеграция с Keycloak / LDAP и журнал доступа — в составе внедрения (см. «Что в работе»).
  • Реестр российского ПО. Готовим подачу: реализация прав на ПО из реестра освобождена от НДС (пп. 26 п. 2 ст. 149 НК), а для госзакупок приоритет реестрового ПО обязателен. С 1 марта 2026 действуют правила ПП №1236 с уровнями «базовый / доверенное ПО».
  • 152-ФЗ и ФСТЭК. Скрабинг ПДн на приёме, удаление по требованию субъекта, ГОСТ-TLS и совместимость с требованиями ФСТЭК — по составу работ.
  • Обновления и поддержка. SLA, разбор инцидентов и обновления версий входят в подписку. Ядро под MIT — код открыт для вашей проверки.

Заявка на on-prem

Ответим в рабочий день: пришлём состав дистрибутива, требования к железу и проект договора.

Или напишите напрямую: sales@vseok.ru

FAQ

Частые вопросы

Правда достаточно сменить DSN?

Для официальных SDK Sentry — да. Реализованы оба ингест-эндпоинта: /api/{project}/envelope/ для актуальных SDK, включая gzip-сжатые тела, и /api/{project}/store/ для старых. Исключения, capture_message, стек-фреймы, release, environment, server_name, пользователь, теги, breadcrumbs и контекст рантайма раскладываются в схему VseOK.

Что не перенесётся: source maps (в работе), а также транзакции, профили и session replay — таких хранилищ у нас пока нет. Эти элементы envelope принимаются и отбрасываются, чтобы SDK не пытался их переслать заново.

Почему у проекта два DSN?

Официальные SDK Sentry разбирают путь DSN как целое число и падают с BadDsn, если там UUID. Поэтому у каждого проекта есть числовой short_id — его подставляют в sentry_sdk, — и UUID-DSN, который используют собственные SDK VseOK. Оба видны на вкладке «Подключение».

Что будет, если я выйду за лимит тарифа?

На платном тарифе приём не прекращается: события сверх пакета принимаются и считаются по 0,02 ₽ за событие. У перерасхода есть жёсткий потолок — три объёма пакета, после которого события отбрасываются. Это сознательное решение с двух сторон: открытый перерасход превращает одну аварию клиента в счёт, который нельзя оплатить, а полное отключение приёма — в потерю данных именно в тот момент, когда они нужнее всего.

На бесплатном тарифе события сверх квоты отбрасываются сразу. Сколько принято, сколько ушло в перерасход и сколько отброшено — видно на странице «Тарифы и оплата»; просевший график всегда объясним, а не выглядит как «VseOK теряет ошибки».

Что происходит при всплеске ошибок?

Работает защита от всплесков — ограничение частоты на проект в фиксированном окне. Ниже мягкого порога принимается всё; между мягким и жёстким — линейно убывающая доля событий; выше жёсткого сервер отвечает 429 с Retry-After, и SDK повторяет позже. Пороги масштабируются тарифом: от 60/300 в минуту на Free до 3 000/30 000 на «Бизнесе».

Error tracking по своей природе бурстовый: инцидент — это тысяча событий в минуту из одного проекта. Средняя нагрузка тарифа «Бизнес» — меньше одного события в секунду, поэтому потолки считаются от пика, а не от среднего.

Как именно соблюдается 152-ФЗ?

Технически — скрабингом на приёме: email, телефоны, номера, похожие на карточные, и IP-адреса редактируются, а значения под чувствительными ключами (password, token, authorization, api_key) удаляются до того, как событие попадает в Redis. Персональные данные не доходят ни до одного постоянного хранилища.

Организационно — данные размещаются в РФ, есть уведомление в РКН об обработке ПДн, политика обработки, договор поручения обработки с клиентом и удаление по требованию субъекта (доступ отзывается сразу, физическое удаление — в течение 30 дней).

Не потеряются ли события, если у вас упадёт база?

Нет. Горячий путь приёма пишет только в Redis и не обращается ни к Postgres, ни к ClickHouse — сбой базы не может привести к потере отчёта об ошибке. Фингерпринтинг, upsert issue и запись события выполняет асинхронный воркер, у которого есть очередь недоставленных сообщений и повторный захват «зависших» записей. Эндпоинт /health отдаёт состояние каждой зависимости и глубину очередей и возвращает 503 при деградации, чтобы оркестратор мог отреагировать.

Сколько хранятся события и можно ли дольше?

По тарифу: 7 дней на Free, 30 на «Старте», 90 на «Команде» и «Бизнесе». Опции — 180 дней (+40% к тарифу) и 365 дней (+80%); в on-prem срок задаёте вы. Истечение выполняет TTL таблицы ClickHouse, то есть данные удаляются по правилу, а не по расписанию, которое может не сработать.

Важная деталь: смена тарифа не переписывает уже сохранённые события — новый срок хранения применяется к новым.

Чем это лучше бесплатного self-hosted Sentry или GlitchTip?

Мы прямо считаем, что главный конкурент — «поставим сами на своей ноде», поэтому цена выстроена ниже стоимости владения собственным инстансом: нода на 15–25 тысяч рублей в месяц плюс время инженера на обновления, бэкапы и разбор инцидентов. Сверху — договор, закрывающие документы, локализация ПДн и поддержка на русском.

Если своя нода вас устраивает — ядро VseOK под MIT, разворачивается через docker compose, и мы не считаем это проигрышем.

Можно поставить у себя и не зависеть от вашего облака?

Да. Ядро распространяется под лицензией MIT — самостоятельную установку можно поднять и обслуживать без нас. В on-prem-подписку входит другое: дистрибутив для офлайн-установки в закрытом контуре, SSO и журнал аудита, любой срок хранения, обновления, SLA и поддержка. Схема данных открыта, экспорт возможен — заблокировать вас внутри продукта нам технически нечем.

Как оплатить и какие документы вы даёте?

Тариф подключается прямо из дашборда: страница «Тарифы и оплата», выбор периода (месяц или год) и оплата картой через ЮKassa. Подписка активируется по подтверждению платежа, история платежей остаётся в интерфейсе. Бесплатный тариф доступен сразу при регистрации, карта не нужна.

Для юридических лиц — договор с российским юрлицом, оплата по счёту в рублях, счёт и акт. Для on-prem и Enterprise условия оформляются отдельным договором: оставьте заявку.

Одна строка конфигурации — и ошибки уже в России

Заведите проект, скопируйте DSN, подставьте в существующий sentry_sdk.init(). 10 000 событий в месяц бесплатно, без карты.