Legan Studio
Все статьи
~ 6 мин чтения

Sentry и error tracking в проде

Подключаем Sentry в Next.js 15: фронтенд и бэкенд, source maps, фильтрация шума, releases, performance, alerts и self-hosted альтернативы.

  • веб
  • разработка
  • devops

«У меня всё работает» — это не аргумент, если у пользователей сыплются ошибки. Без 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-hosteddocker-compose, всё то же бесплатносвой сервер ($10-50/мес)
GlitchTipOpenSource, совместим с Sentry SDKself-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: ...

Чек-лист подключения

  1. Wizard поставил SDK во фронт и бэк.
  2. Source maps загружаются на каждой сборке (проверить — открыть ошибку, увидеть оригинальный код).
  3. Releases привязываются к git commit hash.
  4. ignoreErrors отфильтрован после первой недели.
  5. PII не уходит (проверить event payload).
  6. Алерты настроены на канал команды.
  7. 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 — пользователи жалуются на тормоза. По релизам сравнивать эти метрики — главный способ понять, что новый деплой ничего не сломал.