«У меня всё работает» — это не аргумент, если у пользователей сыплются ошибки. Без error tracking вы узнаёте о багах из жалоб в поддержку — и за каждым жалующимся стоят 50 молчащих, которые просто ушли. Разбираем, как поставить Sentry и не утонуть в шуме.
Что даёт Sentry
| Возможность | Зачем |
|---|---|
| Сбор JS-исключений на клиенте | видеть реальные ошибки пользователей |
| Сбор серверных ошибок (Node, Go, Python) | отлавливать падения API |
| Source maps для оригинальных стеков | читать минифицированный код как обычный |
| Releases | привязка ошибки к коммиту и автору |
| Performance monitoring | трейсы медленных запросов |
| Session replay | видеозапись действий пользователя до ошибки |
| Alerts в Slack/Telegram | уведомление о новой проблеме |
Альтернативы
| Сервис | Особенность | Цена |
|---|---|---|
| Sentry SaaS | референс, есть всё | бесплатно до 5k events/мес |
| Sentry self-hosted | docker-compose, всё то же бесплатно | свой сервер ($10-50/мес) |
| GlitchTip | OpenSource, совместим с Sentry SDK | self-hosted, дешевле |
| Highlight.io | хорош session replay | бесплатно до 500 сессий |
| Datadog Error Tracking | если уже на Datadog | дорого |
| Bugsnag | проще Sentry | от $59/мес |
В России SaaS Sentry оплатить нельзя, но self-hosted (Sentry или GlitchTip) — на любой VPS, бесплатно.
Установка в Next.js 15
npx @sentry/wizard@latest -i nextjs
Wizard сам создаст конфиги: sentry.client.config.ts, sentry.server.config.ts, sentry.edge.config.ts, обновит next.config.mjs.
// sentry.client.config.ts
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
environment: process.env.NEXT_PUBLIC_ENV ?? "production",
tracesSampleRate: 0.1,
replaysSessionSampleRate: 0.01,
replaysOnErrorSampleRate: 1.0,
integrations: [
Sentry.replayIntegration({ maskAllText: true, blockAllMedia: true }),
],
});
tracesSampleRate: 0.1 — собирать перформанс с 10% запросов. На продакшене с большим трафиком ставьте 0.01-0.05, иначе быстро сожжёте квоту.
Source maps
Без них стек выглядит как at t (main-9f8a2c.js:1:23456) — бесполезно. С source maps — at handleSubmit (components/Form.tsx:42:18).
Sentry-плагин в next.config.mjs загружает их автоматически при next build:
import { withSentryConfig } from "@sentry/nextjs";
export default withSentryConfig(nextConfig, {
org: "your-org",
project: "your-project",
authToken: process.env.SENTRY_AUTH_TOKEN,
silent: true,
hideSourceMaps: true,
});
hideSourceMaps: true — после загрузки в Sentry удалить из public-папки, чтобы конкуренты не могли скачать ваш исходник.
Releases
Каждый деплой — отдельный release. По нему Sentry показывает, какие ошибки появились именно в этой версии и кто из разработчиков делал коммит.
SENTRY_RELEASE=v$(git rev-parse --short HEAD) npm run build
Wizard автоматически прокидывает release в init. После деплоя заходите в Sentry → Releases — видите список с counts ошибок и отслеживаете regressions.
Фильтрация шума
Без фильтрации Sentry за неделю наполнится мусором: расширения браузеров, антивирусы, рекламные блокировщики, баги в самих браузерах.
Sentry.init({
// ...
ignoreErrors: [
"Non-Error promise rejection captured",
"ResizeObserver loop limit exceeded",
"ResizeObserver loop completed with undelivered notifications",
/chrome-extension:\/\//,
/moz-extension:\/\//,
/safari-extension:\/\//,
"Network request failed",
"Load failed",
],
denyUrls: [
/chrome-extension:/,
/extensions\//,
/^chrome:\/\//,
/^safari-extension:/,
],
beforeSend(event, hint) {
// фильтруем по условию
if (event.request?.url?.includes("/healthcheck")) return null;
return event;
},
});
После недели работы пройдитесь по топ-10 ошибок и добавьте в ignoreErrors всё, что не баг приложения.
Контекст ошибки
Sентри сам соберёт URL, юзер-агент, breadcrumbs. Добавьте полезный контекст приложения:
Sentry.setUser({ id: session.userId, email: session.email });
Sentry.setTag("plan", user.plan);
Sentry.setContext("order", { id: orderId, total: orderTotal });
При ошибке вы сразу видите: «у пользователя plan=enterprise упало в оформлении заказа на 15 000 ₽» — это совсем другой приоритет, чем просто «у кого-то упало».
PII и приватность
Не передавайте в Sentry email, паспорта, номера карт. По 152-ФЗ это персональные данные, и Sentry SaaS — иностранный сервис.
Sentry.init({
beforeSend(event) {
if (event.request?.data) {
delete event.request.data.password;
delete event.request.data.cardNumber;
}
return event;
},
sendDefaultPii: false,
});
Session Replay по умолчанию маскирует текст и медиа (maskAllText: true). Никогда не выключайте — иначе в записи окажутся пароли и платёжные данные.
Если данные критичны — поднимайте Sentry self-hosted, всё остаётся в вашем периметре.
Performance monitoring
Tracing показывает, какой запрос медленный и где конкретно тормозит:
import * as Sentry from "@sentry/nextjs";
export async function GET(req: Request) {
return Sentry.startSpan({ name: "products.list", op: "http.server" }, async () => {
const products = await Sentry.startSpan({ name: "db.products", op: "db.query" }, () =>
db.product.findMany()
);
return Response.json(products);
});
}
В UI видите водопад: сколько ушло на DB-запрос, сколько на рендер, сколько на сериализацию. Особо полезно для медленных страниц, где не понятно, что виноват.
Alerts
Базовый набор:
- Новая ошибка — алерт сразу.
- Известная ошибка резко выросла (>20 events за час) — алерт.
- p95 latency страницы > 3 сек — алерт.
- Crash rate релиза > 1% — алерт.
Слать в Telegram-канал команды или в Slack #incidents. Не забить почтой — там утонут.
Self-hosted Sentry
Минимальный стек:
# взять из официального репо
git clone https://github.com/getsentry/self-hosted
cd self-hosted
./install.sh
Требует Docker, 16 ГБ RAM, ~50 ГБ диска. Стоит на VPS за 2000-3000 ₽/мес. Альтернатива — GlitchTip: 1-2 ГБ RAM, совместим с тем же SDK, бесплатно, проще:
# docker-compose.yml — минимум
services:
glitchtip:
image: glitchtip/glitchtip
environment:
DATABASE_URL: postgres://...
SECRET_KEY: ...
Чек-лист подключения
- Wizard поставил SDK во фронт и бэк.
- Source maps загружаются на каждой сборке (проверить — открыть ошибку, увидеть оригинальный код).
- Releases привязываются к git commit hash.
ignoreErrorsотфильтрован после первой недели.- PII не уходит (проверить event payload).
- Алерты настроены на канал команды.
- Sample rate подобран по бюджету квоты.
Итого
Sentry — must-have для любого проекта в проде. Поставить — день. Поддерживать — час в неделю. Зато вы знаете о проблемах раньше пользователей и почти всегда чините баг до жалобы. Работает в РФ только self-hosted (или GlitchTip), и это не страшно — поднимается за вечер.
Частые вопросы
Сколько стоит Sentry для среднего проекта?
SaaS Sentry: бесплатно до 5 тыс. events и 10 тыс. transactions в месяц. Team-план $26/мес — 50 тыс. events, $80/мес — 100 тыс. Для российских проектов SaaS оплатить проблематично, поэтому обычно поднимают self-hosted Sentry или GlitchTip — стоимость только VPS, около $10-20/мес.
Source maps в публичном доступе — это риск?
Да, конкуренты могут раскрыть исходник. Поэтому используйте hideSourceMaps: true — Sentry плагин загружает их в свою БД, а из public-папки удаляет после билда. В Sentry стек разворачивается на стороне сервера, в браузер карты никогда не попадают.
Что делать с ошибками от расширений браузера?
Игнорировать через denyUrls: [/chrome-extension:/, /moz-extension:/]. Это ошибки чужого кода, который инжектится в страницу — вы их никак не исправите. Если оставить — зашумят отчёт настолько, что реальные баги потеряются. После настройки фильтров проверьте: топ-3 ошибки должны быть из вашего кода, не из расширений.
Session Replay — это легально хранить?
При условии маскировки текста и медиа — да, в записи нет персональных данных, только контуры элементов и события. Без маскировки — нарушение 152-ФЗ и почти всегда GDPR. Никогда не отключайте maskAllText без явного согласия пользователя на запись действий и юридического обоснования.
Sentry или Datadog для большого проекта?
Sentry — фокус на ошибках и трейсах кода. Datadog — полноценный observability-стек: логи, метрики, инфраструктура, APM. Если у вас сложная инфра (Kubernetes, микросервисы, очереди) — Datadog мощнее, но дороже в 5-10 раз и ставит вендор-лок. Sentry проще и дешевле для команд из 3-15 человек, в большинстве случаев его хватает.
Как Sentry отличает релизы?
По переменной SENTRY_RELEASE (или параметру release в init). Обычно туда подставляют git commit hash или semver-тег. На каждый build CI делает sentry-cli releases new $RELEASE, загружает source maps, и при ошибке Sentry показывает, в каком релизе она появилась впервые. Это бесценно для отлова regressions.
Что мониторить помимо ошибок?
Performance — latency ключевых эндпоинтов и страниц. Crash-Free Sessions Rate — % сессий без single ошибки. Apdex — индекс удовлетворённости по latency. Если упал ниже 0.8 — пользователи жалуются на тормоза. По релизам сравнивать эти метрики — главный способ понять, что новый деплой ничего не сломал.