APM: Application Performance Monitoring

APM — мониторинг производительности приложения в реальном времени: время ответа эндпоинтов, трассировка запросов, ошибки и узкие места в коде.

Зачем нужно

Метрики сервера (CPU, RAM) не показывают, почему конкретный API-запрос занимает 5 секунд. APM даёт трассировку на уровне кода: видно, что 4.5 секунды уходит на медленный SQL-запрос. Это позволяет находить и устранять узкие места до того, как они станут проблемой для пользователей.

Где используется

  • Production API: отслеживание latency каждого эндпоинта
  • Поиск N+1 запросов к БД
  • Трассировка запроса через несколько микросервисов (distributed tracing)
  • Алертинг при деградации производительности

Основной контент

Популярные APM-инструменты

Инструмент Тип Особенности
Datadog APM SaaS Полнофункциональный, дорогой
New Relic SaaS Хорош для Node.js
Sentry SaaS (open-source) Ошибки + трассировка, есть бесплатный план
OpenTelemetry Open standard Vendor-neutral, интегрируется в любой бэкенд
Jaeger Open-source Distributed tracing, self-hosted

OpenTelemetry для Node.js

npm install @opentelemetry/sdk-node \
  @opentelemetry/auto-instrumentations-node \
  @opentelemetry/exporter-trace-otlp-http
// tracing.js — подключается ДО всех остальных модулей
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'http://jaeger:4318/v1/traces',
  }),
  instrumentations: [getNodeAutoInstrumentations],
});

sdk.start();
# Запуск с трассировкой
node -r ./tracing.js server.js

Sentry для отслеживания ошибок и производительности

npm install @sentry/node @sentry/profiling-node
const Sentry = require('@sentry/node');
const { nodeProfilingIntegration } = require('@sentry/profiling-node');

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  integrations: [nodeProfilingIntegration],
  tracesSampleRate: 0.1,   // 10% запросов трассируются
  profilesSampleRate: 0.1,
});

// В Express — добавить до всех роутов
app.use(Sentry.Handlers.requestHandler);
app.use(Sentry.Handlers.tracingHandler);
// После роутов
app.use(Sentry.Handlers.errorHandler);

Ключевые метрики APM

  • Latency — время ответа эндпоинта (P50, P95, P99)
  • Throughput — запросов в секунду (RPS)
  • Error rate — доля запросов с ошибками
  • Apdex — оценка удовлетворённости (fast/tolerable/frustrated)

Частые ошибки

  • Мониторить только CPU/RAM без метрик приложения — не виден реальный user experience
  • Трассировать 100% запросов в продакшне — создаёт нагрузку, обычно достаточно 1-10%
  • Не настраивать алерты — данные собираются, но никто не смотрит на деградацию

Связанные темы

Ресурсы