Мониторинг и логи в продакшене
После деплоя важно видеть, что происходит с приложением: ошибки, производительность, пользовательские действия.
Что мониторить
- Ошибки — исключения на клиенте и сервере
- Производительность — Web Vitals, время ответа API
- Трафик — количество запросов, источники
- Бизнес-метрики — регистрации, заказы, конверсии
- Инфраструктуру — CPU, память, БД
Vercel Analytics
Встроен в Vercel. Включается в дашборде или через пакет:
npm install @vercel/analytics
// app/layout.tsx
import { Analytics } from '@vercel/analytics/react';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
{children}
<Analytics />
</body>
</html>
);
}
Показывает: посещения, страницы, устройства, страны, источники.
Vercel Speed Insights
npm install @vercel/speed-insights
import { SpeedInsights } from '@vercel/speed-insights/next';
<SpeedInsights />
Показывает Core Web Vitals (LCP, FID, CLS) для реальных пользователей.
Sentry
Для отслеживания ошибок:
npx @sentry/wizard@latest -i nextjs
Создаёт конфиги и подключает SDK. Ошибки клиента и сервера попадают в дашборд Sentry.
Использование:
try {
await riskyOperation();
} catch (error) {
Sentry.captureException(error);
throw error;
}
Логи в Next.js
На сервере — обычный console.log:
export async function GET() {
console.log('API called', { timestamp: Date.now() });
return NextResponse.json({ ok: true });
}
В Vercel логи доступны в дашборде. Для локальной разработки — в терминале.
Структурированные логи
Вместо строк — объекты:
console.log(JSON.stringify({
level: 'info',
message: 'Post created',
postId: post.id,
userId: user.id,
timestamp: new Date().toISOString(),
}));
Удобно для парсинга в системах логирования (Datadog, Logtail, Papertrail).
Health check
Создай эндпоинт для проверки:
// app/api/health/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
try {
await db.$queryRaw`SELECT 1`;
return NextResponse.json({
status: 'ok',
timestamp: new Date().toISOString(),
});
} catch (error) {
return NextResponse.json(
{ status: 'error', message: 'DB unavailable' },
{ status: 503 }
);
}
}
Балансировщики и системы мониторинга дергают этот эндпоинт.
Кастомные события
В Vercel Analytics:
'use client';
import { track } from '@vercel/analytics';
export function BuyButton() {
return (
<button
onClick={() => {
track('buy_clicked', { productId: 'abc' });
// ...
}}
>
Купить
</button>
);
}
Uptime-мониторинг
Внешние сервисы проверяют доступность:
- Better Stack
- UptimeRobot
- Pingdom
Проверяют /api/health каждую минуту. Если сервер не отвечает — уведомление в Slack, Telegram, email.
Логирование в базу
Для важных событий:
export async function createPost(data: PostInput) {
const post = await db.posts.create({ data });
await db.auditLog.create({
data: {
action: 'post.created',
entityId: post.id,
userId: data.authorId,
timestamp: new Date(),
},
});
return post;
}
Алерты
Правила:
- Ошибок больше 10 в минуту → алерт
- Время ответа > 2 секунд → алерт
- Health check падает 3 раза подряд → алерт
- CPU > 80% пять минут → алерт
Инструменты: Better Stack, Sentry Alerts, Vercel Monitoring.
Чек-лист перед продакшеном
- Sentry подключён
- Vercel Analytics включён
- Speed Insights включён
- Health check есть
- Логи структурированы
- Алерты настроены
- Uptime-мониторинг работает
- Бэкапы БД настроены
Задание
- Подключи Sentry
- Добавь Vercel Analytics
- Создай
/api/health - Настрой алерт на ошибки в Sentry
Итоги курса
- Ошибки — в Sentry
- Метрики — в Vercel Analytics
- Health check — для балансировщиков
- Логи — структурированные
- Алерты — обязательны
- Регулярно проверяй дашборды