Sentry vs. Metric
Sentry vs. Metric

Дисклеймер: статья написана с пристрастием, желчью и таблицами. Автор считает, что инфраструктура должна работать на вас, а не вы на неё. Если вы фанат Sentry — дочитайте до конца, вам будет что предъявить в комментариях.

Акт первый, в котором мы покупаем билет в зоопарк

Каждый, кто хоть раз поднимал self-hosted Sentry, помнит этот момент. Вы клонируете getsentry/self-hosted, запускаете ./install. sh, идёте за кофе. Возвращаетесь, а Docker всё ещё тянет образы. Вы открываете docker-compose. yml и начинается самое интересное: знакомство с семейством.

Вот официальный Compose-файл релиза 26.7.2. В нём 65 (шестьдесят пять) определений сервисов. Шестьдесят пять, Карл! Это не опечатка и не преувеличение ради красного словца — это файл из официального репозитория, откройте и посчитайте сами. Да, часть из них — профили и разовые джобы. Но даже в «боевом» составе там: Sentry web, воркеры (несколько видов!), Relay, Snuba (api + consumer’ы), Kafka, ZooKeeper, ClickHouse, PostgreSQL, Redis, Memcached, Symbolicator, Vroom, cron, и далее по списку, пока глаза не устанут.

Шестьдесят пять сервисов. Чтобы ловить стектрейсы. Нет слов, одни…

Давайте осмыслим. Стектрейс — это текст. JSON-документ размером в несколько килобайт. Человечество научилось принимать JSON по HTTP примерно в 2005 году. А чтобы сохранить этот JSON и показать его в веб-интерфейсе, Sentry предлагает вам поднять брокер сообщений Kafka (с ZooKeeper в комплекте, разумеется), колоночную аналитическую СУБД ClickHouse, отдельную реляционную СУБД PostgreSQL, два разных кэша, прокси-прослойку Relay, Python-воркеры для очередей, отдельный сервис Snuba, который переводит запросы внутреннего API на язык ClickHouse, и профайлер Vroom — и это я ещё не всё перечислил.

Теперь про железо. Официальные системные требования:

  • 4 ядра CPU;

  • 16 ГБ RAM — и это минимум, ниже инсталлятор просто откажется работать;

  • 16 ГБ swap (да, своп размером с RAM - это такая тонкая самоирония);

  • 20 ГБ диска — на старте, дальше ClickHouse решит сам.

И ласковое примечание: “рекомендуется 32 ГБ”. Опытные эксплуатантеры на issue-трекере getsentry/self-hosted согласно кивают: под реальной нагрузкой стабильно жить хочется на 24-32 ГБ, потому что один ClickHouse способен откусить 8-12 ГБ и не моргнуть.

Тридцать два гигабайта оперативной памяти. Чтобы смотреть, почему падает ваш pet-проект.

Для сравнения: на такой машине можно поднять половину микросервисной инфраструктуры среднего стартапа! Но нет — она будет греть 65 контейнеров, чтобы вы могли вовремя узнать про TypeError: undefined is not a function.

Акт второй, в котором автор надевает шапочку из фольги

А теперь вопрос на миллион (буквально — оценка выручки Sentry исчисляется сотнями миллионов долларов): а случайно ли это?

Смотрите, какая красивая механика:

  1. Sentry - отличный продукт. Спору нет. UX эталонный, SDK прекрасные, экосистема огромная. Им искренне хочется пользоваться.

  2. SaaS-версия стоит денег. Цены растут с объёмом событий, и в какой-то момент счёт начинает напоминать аренду небольшой недвижимости.

  3. “Но мы же open-source! — говорит Sentry. — Возьмите self-hosted!” И даёт вам 65-контейнерного левиафана, который требует выделенного инженера, 16+ ГБ RAM и крепчайших нервов.

  4. Через месяц эксплуатации левиафана среднестатистическая команда делает единственно разумный вывод: “Проще заплатить за SaaS”.

Возникает крамольная мысль: а не является ли самопальный монстр частью воронки продаж? Идеальным антипрививочным аргументом против self-hosted, как явления? “Видите, как сложно? А теперь посмотрите на наш тариф Team - всего $26 в месяц, и никакой боли”.

Добавим перцу. Sentry давно не open source в строгом смысле: лицензия у него Functional Source License (FSL 1.1) — “source available”, с запретом конкурировать с облаком Sentry. То есть код вы видеть можете, а вот построить на нём свой разумный сервис — юридически рискованно. Удобно, правда? Окно витринное, стекло бронированное.

И вишенка: в официальном репозитории self-hosted честно написано, что эта сборка предназначена для low-volume deployments и proof of concept. То есть сама компания признаёт: полноценный прод на этом разворачивать не предполагалось. Зачем тогда, спрашивается, 65 контейнеров для «маленького» сценария? Хороший вопрос. Чертовски хороший вопрос.

Хватит ли этого, чтобы объявить заговор? Решать вам в комментариях. Но согласитесь: если бы SaaS-компания хотела сделать self-hosted намеренно неудобным — лучше бы и не придумала.

Акт третий, в котором мы смотрим на альтернативы и почти радуемся

Критикуешь, предлагай! Сказать «Sentry плохой» — легко. Вопрос, что предложить взамен. Хорошая новость: альтернативы есть, и они прекрасно доказывают главный тезис этой статьи — для приёма ошибок не нужна инфраструктура уровня малых стран. Плохая новость: у каждой есть свой компромисс.

Sentry self-hosted

GlitchTip

BugSink

Hawk

Metric

Язык/стек

Python + весь зоопарк

Django + PostgreSQL (+Redis/Valkey опционально)

Django + PostgreSQL/SQLite

Node.js-микросервисы + MongoDB + Redis

Rust + MongoDB

Контейнеров из коробки

65 определений, ~20+ всегда живых

2-4

1-2

десятки (воркеры, сборщики, API, гараж, нотификатор…)

2 (Min/Low) - 4 (Medium/High)

Минимальная машина

4 CPU / 16 ГБ RAM / 16 ГБ swap

~512 МБ RAM

от 64-256 МБ

ощутимо больше пары гигабайт

1 vCPU / 1 ГБ RAM

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

нативная

часть ingest API

часть ingest API (только ошибки)

нет, свои SDK

полная: меняется только DSN

Ошибки и группировка

да

да

да

да

да

Логи (структурированные)

да

нет

нет

нет

да

Трейсы / транзакции / спаны

да

частично

нет

нет

да

Релизы и release health

да

частично

нет

нет

да

Cron-мониторинг

да

нет

нет

нет

да

Аптайм-мониторы

да

да

нет

нет

да

Метрики приложений и дашборды

да

нет

нет

нет

да

Session Replay

да

нет

нет

нет

да (включается на проект)

User Feedback

да

частично

нет

нет

да

Source maps / debug files

да

частично

да (source maps)

нет

да

Алерты (email/Telegram/webhook)

да

email/webhook

да

да

да

Разберём достойных.

GlitchTip - замечательный проект. Django, PostgreSQL, стартует на половине гигабайта, умеет ошибки, аптайм, частично транзакции. Но это именно что “упрощённый Sentry”: ни структурированных логов, ни Session Replay, ни cron-мониторинга, ни метрик приложений с дашбордами. Команда GlitchTip сама честно говорит: мы реализуем подмножество Sentry API. Если вам нужны только ошибки — отличный выбор. Если вы привыкли к Sentry целиком — будете постоянно натыкаться на стены.

BugSink — ещё более радикальный минимализм: ловит ошибки, красиво их показывает, живёт в одном контейнере и даже гордится, что игнорирует всё, кроме ошибок — ни перформанса, ни реплеев. Философия уважаемая, но это ответ на вопрос “чем заменить папку с логами”, а не “чем заменить Sentry”.

Hawk — наш, отечественный, от CodeX. Милый интерфейс, живая команда. Но: собственные SDK (то есть миграция с Sentry — это переписывание интеграции), и архитектура в духе “микросервисы ради микросервисов”: API, отдельные воркеры-сборщики под каждый язык, MongoDB, Redis и длинный Compose-файл. По духу это скорее младший брат того самого монстра, чем его противоядие.

Видите закономерность? Все альтернативы либо режут функциональность (GlitchTip, BugSink), либо ломают совместимость (Hawk), либо делают и то и другое. Сменить DSN и потерять половину привычного Sentry — так себе сделка.

Акт четвёртый, в котором на сцену выходит Metric

А теперь — то, ради чего всё затевалось.

Metric — это Sentry-совместимая система мониторинга, переписанная на Rust с нуля и с одной навязчивой идеей: функциональность не обязана стоить 65 контейнеров.

Миграция выглядит так:

Sentry.init({ dsn: "http://<key>@your-metric-host:4001/<project_id>" });

Всё. Это вся миграция. Официальные Sentry SDK продолжают работать как ни в чём не бывало — потому что Metric говорит на родном протоколе Sentry: энвелопы, сторы, релизы, сессии, чек-ины, replay-записи. Совместимость подтверждается не словами, а релизными тестами: реальные процессы @sentry/browser и @sentry/node 10.66.0, sentry-sdk (Python) 2.32.0, sentry-java 8.50.1, Sentry для .NET 6.7.0, sentry-go 0.48.0, sentry для Rust 0.48.5 и даже sentry-cli 3.6.2/2.58.6 для загрузки source maps и debug-файлов - всё это гоняется против Metric перед каждым релизом, и платформа объявляется поддерживаемой только после зелёного теста.

Теперь про железо. Минимальный профиль Metric:

1 vCPU, 1 ГБ RAM, 15 ГБ SSD.

Не опечатка. Один гигабайт. Это дешевле кофейной подписки на любом VPS-хостинге планеты. Профиль “Medium” (4 vCPU / 8 ГБ) — это уже полноценный сервер с Symbolicator’ом и символикацией нативных и JS-стектрейсов. Состав стека: один бинарник на Rust + MongoDB (2 контейнера), в старших профилях добавляется Symbolicator с уборщиком кэша (4 контейнера). Всё.

Установка:

curl -fsSL https://raw.githubusercontent.com/biosshot/metric/v0.1.5/deploy/install.sh | sh

Одна команда. Без клонирования репозитория, без сборки, без интерактивного инсталлятора на 20 минут. Скрипт сам генерирует пароли, тянет готовый образ и поднимает стек.

А теперь мой любимый пункт — производительность. Metric не говорит «мы быстрые». Metric коммитит сырые результаты бенчмарков в репозиторий (performance/baselines/), чтобы вы могли проверить и придраться. Референс-машина — обычный ноутбучный Ryzen 5 5600H (6 ядер) с 16 ГБ RAM:

Нагрузка

Результат

Латентность

Долговечный приём ошибок, цель 5000/с

4 983 события/с

p95 = 27,7 мс

Замер насыщения, цель 20 000/с

7 307 долговечных событий/с

p95 = 296,8 мс

HTTP-конвейер (парсинг/auth/скраббинг)

2 500 запросов/с

p99 = 0,62 мс

Запись спанов в MongoDB

32 639 спанов/с

-

Четыре тысячи девятьсот восемьдесят три долговечно записанных события в секунду — то есть с подтверждением записи в базу, с нулевой потерей подтверждённых событий — на железе, которое у Sentry self-hosted даже не пройдёт проверку инсталлятора. Перечитайте это предложение ещё раз. Ноутбук, который Sentry отверг бы на пороге, обрабатывает поток, эквивалентный сотням миллионов событий в сутки (проектный конверт Metric — ровно 100 млн событий в день, модель расписана в ADR-0037).

И — ключевое отличие от всех альтернатив выше — Metric не режет функциональность:

— ошибки, группировка в ишью, поиск, таймлайны, тренды; — структурированные логи, транзакции, спаны, трейс-вью; — метрики приложений (counters, gauges, distributions), дашборды, сохранённые поиски; — релизы, деплои, release health, сессии; — cron-мониторинг и активные HTTP-аптайм-мониторы; — Session Replay, user feedback со скриншотами, вложения; — алерты в email, Telegram и подписанные вебхуки с историей ретраев; — source maps и debug-файлы через sentry-cli, символикация через Symbolicator; — скраббинг/псевдонимизация персональных данных до записи в хранилище — по умолчанию, а не галочкой в настройках; — единый язык запросов по всем сущностям, экспорт в JSON/CSV; — веб-интерфейс на русском и английском (привет, Хабр).

Это не «подмножество Sentry». Это полный рабочий цикл Sentry — приём, группировка, расследование, алертинг, релизы, мониторинг — в одном бинарнике, который умещается в 320 МБ лимита памяти на минимальном профиле.

Отдельная любовь — к честности в мелочах. У каждого профиля жёсткие потолки памяти, очередей и ретеншена: система не предполагает бесконечное железо, она гарантирует ограниченное поведение. MongoDB получает WiredTiger-кэш ровно 256 МБ, а не «сколько удастся урвать». Логи контейнеров ротируются после двух файлов по 5 МБ. Разработчики Metric явно устали от инфраструктурных сюрпризов — и это очень сильно чувствуется.

Акт пятый, в котором автор снимает шапочку из фольги

Чтобы меня не разорвали в комментариях — скажу сам, честно и заранее:

— Metric — релиз 0.1.5, ранний. Профайлинга нет, SSO/SCIM/MFA нет, часть платформ (Apple/Cocoa, Flutter, Android, PHP, Ruby, React Native) пока вне релизных тестов. Шардинга и HA нет — это сознательно однонодовая система. Авторы не прячут это в мелком шрифте: есть целая страница known limits. — 65 сервисов Sentry — не все одновременно живые: там есть профили и разовые джобы. Но 20+ постоянно работающих контейнеров — это всё равно в 5-10 раз больше, чем у Metric при сопоставимой для большинства команд задаче. — Теория заговора из второго акта — это теория. Возможно, Sentry просто вырос исторически: Python-монолит оброс очередями, потом появился ClickHouse под аналитику, потом Relay под приём, потом Snuba, потом… Но знаете что? Результат неотличим от заговора. И платите за этот результат — вы.

Финал

Мораль этой статьи не «Sentry плохой». Мораль вот в чём:

Индустрия приняла как норму, что приём телеметрии стоит 16-32 ГБ RAM и зоопарк из шести десятков сервисов. Это не норма. Это привычка, которую кому-то очень выгодно поддерживать.

GlitchTip и BugSink доказали: на сотни мегабайт можно ловить ошибки. Metric доказал следующий шаг: на одном гигабайте и двух контейнерах можно иметь весь Sentry-воркфлоу — логи, трейсы, метрики, релизы, мониторы, реплеи, алерты — с полной SDK-совместимостью и производительностью, за которую не стыдно перед бенчмарком в открытом репозитории.

Если ваш Sentry-счёт за SaaS больше, чем стоимость VPS на 4 ГБ — вы знаете, что делать. Если вы год эксплуатируете self-hosted Sentry и считаете это нормальным — жду вас в комментариях, берите цифры, будем меряться.

Metric: github.com/biosshot/metric · MIT License · ставится одной командой · работает на сервере, на который Sentry отказался бы даже устанавливаться.

Звёздочка на GitHub — это, конечно, не 32 ГБ оперативной памяти, но разработчикам будет категорически приятно.