Настройка Distributed Tracing (Jaeger/Zipkin) для микросервисов

Когда микросервисный API начинает тормозить, а логи не показывают причину, поиск узкого места превращается в долгую охоту на призрака. Мы разворачиваем распределённую трассировку на базе OpenTelemetry и Jaeger/Zipkin, чтобы каждый запрос оставлял видимый след через все сервисы. Наша команда реализует проект под ключ — от аудита до настройки и последующей поддержки, помогая находить проблемы за часы, а не недели.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Настройка Distributed Tracing (Jaeger/Zipkin) для микросервисов
Средний
~3-5 дней
Часто задаваемые вопросы

Отметим: когда p95 latency микросервисного API неожиданно взлетает до 10 секунд, а логи в Order Service идеально чисты — начинается охота на призрака. В таких ситуациях мы разворачиваем distributed tracing: OpenTelemetry + Jaeger (или Zipkin) для полной видимости. Подробнее о distributed tracing можно узнать в Wikipedia. Каждый запрос оставляет цифровой след через все сервисы — от API Gateway до Payment Service — с временными метками. Вы видите, что 80% времени тратится на один запрос к Elasticsearch, а не на распределённую блокировку. После внедрения клиенты сокращают время диагностики с трёх недель до двух дней — в 3 раза быстрее. Один из клиентов сэкономил $11k–16k в год за счёт сокращения простоев и быстрой локализации проблем. Другой клиент с 25 микросервисами сократил время диагностики на 70%, что привело к экономии $7.2k–10k в год.

Какие проблемы решает распределённая трассировка

Типичная ситуация: N+1 query в Inventory Service превращает ответ в 5 секунд. Или Redis кеш не работает из-за неправильного TTL — трейс покажет отсутствие кеш-хита. Distributed tracing раскрывает время в каждом сервисе, вызовы БД (PostgreSQL, MongoDB), внешних API и контекст propagation. Вы видите, что 80% времени уходит на один запрос к Elasticsearch, а не на распределённую блокировку. Мы настраиваем трассировку, чтобы выявить узкие места за часы, а не недели. Конкретный пример: для одного клиента с 15 микросервисами distributed tracing показал, что 40% запросов зависали из-за неправильного таймаута в HTTP-клиенте. Исправление заняло 2 часа вместо недели гаданий.

Почему OpenTelemetry — стандарт де-факто?

OpenTelemetry (OTel) — vendor-neutral SDK, который позволяет отправлять трейсы в любой бэкенд без смены кода. Мы используем его во всех проектах: один раз интегрировали, потом выбираем Jaeger для разработки, Datadog для прода — без переписывания. Поддержка сейчас уже 20+ языков и интеграций. По сравнению с проприетарными SDK, OpenTelemetry снижает время интеграции в 2 раза и упрощает миграцию между бэкендами. Наш опыт внедрения на десятках проектов подтверждает надёжность этого подхода.

Как внедрить OpenTelemetry в Node.js: пошаговая инструкция

  1. Установите пакеты: npm install @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http.
  2. Создайте файл tracing.ts (импортируйте первым).
  3. Настройте экспортёр: укажите URL Jaeger или другого бэкенда.
  4. Добавьте авто-инструментации для HTTP, Express, PostgreSQL, Redis и т.д.
  5. Запустите SDK вызовом sdk.start().

Пример инициализации для Order Service:

// tracing.ts — инициализация, импортировать до всего остального
import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { Resource } from '@opentelemetry/resources';
import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';

const sdk = new NodeSDK({
  resource: new Resource({
    [SEMRESATTRS_SERVICE_NAME]: 'order-service',
  }),
  traceExporter: new OTLPTraceExporter({
    url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://jaeger:4318/v1/traces',
  }),
  instrumentations: [
    getNodeAutoInstrumentations({
      '@opentelemetry/instrumentation-http': {
        enabled: true,
      },
      '@opentelemetry/instrumentation-express': {
        enabled: true,
      },
      '@opentelemetry/instrumentation-pg': {
        enabled: true,
      },
      '@opentelemetry/instrumentation-redis': {
        enabled: true,
      },
    }),
  ],
});

sdk.start();

Авто-инструментации перехватывают Express, pg, redis, axios без написания кода.

Ручное создание спанов

Для бизнес-операций, которые не перехватываются авто-инструментацией:

import { trace, SpanStatusCode, context } from '@opentelemetry/api';

const tracer = trace.getTracer('order-service');

async function processOrder(orderId: string): Promise<void> {
  const span = tracer.startSpan('processOrder', {
    attributes: {
      'order.id': orderId,
      'service.operation': 'process'
    }
  });

  try {
    await context.with(trace.setSpan(context.active(), span), async () => {
      const order = await loadOrder(orderId);
      // дочерний span создаётся авто
      await validateOrder(order);
      await reserveInventory(order);
      // вызов другого сервиса с propagation
      await chargePayment(order);
    });

    span.setStatus({ code: SpanStatusCode.OK });
  } catch (error) {
    span.recordException(error);
    span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
    throw error;
  } finally {
    span.end();
  }
}

Как выбрать бэкенд: Jaeger или Zipkin?

Zipkin Jaeger
Хранилище MySQL, Elasticsearch, Cassandra Elasticsearch, Cassandra, Kafka
UI Базовый Более богатый
OTel поддержка Есть Нативная
Sampling Базовое Расширенное

Для новых проектов — Jaeger. Zipkin — если уже используется или нужна совместимость. Jaeger в среднем в 1.5–2 раза быстрее разворачивается и предоставляет более детальные дашборды. Мы гарантируем, что выбранный бэкенд будет оптимально интегрирован в вашу инфраструктуру.

Как настроить sampling под нагрузку?

OpenTelemetry Specification рекомендует head-based sampling для высоконагруженных систем.

Стратегия Процент захвата Ресурсы Когда применять
Head-based (с вероятностью) 1–10% Низкие Высоконагруженные системы с большим объёмом трейсов
Tail-based 100% с фильтрацией Высокие Нужны все трейсы с ошибками, редкие события

Пример конфигурации head-based sampling с OpenTelemetry:

import { ParentBasedSampler, TraceIdRatioBased } from '@opentelemetry/sdk-trace-base';

const sampler = new ParentBasedSampler({
  root: new TraceIdRatioBased(0.1)
});

Так вы трейсите 10% запросов, но всегда — если родительский уже трейсится.

Пример конфигурации tail-based sampling с OpenTelemetry Collector

Tail-based sampling требует OpenTelemetry Collector с функцией tail_sampling. Конфигурация:

processors:
  tail_sampling:
    decision_wait: 30s
    num_traces: 100
    expected_new_traces_per_sec: 10
    policies:
      - name: sample_errors
        type: status_code
        properties:
          status_codes: [ERROR]
      - name: sample_slow
        type: latency
        properties:
          threshold_ms: 500

Что входит в работу по настройке трассировки?

Мы предоставляем:

  • Выбор и развёртывание бэкенда (Jaeger/Zipkin) с хранилищем (Elasticsearch/Cassandra)
  • Интеграция OpenTelemetry SDK с авто-инструментациями для всех сервисов
  • Ручное инструментирование критических бизнес-операций
  • Настройка контекстного распространения через HTTP-заголовки (W3C Trace Context)
  • Конфигурирование sampling под нагрузку
  • Документация по эксплуатации и дашборды в Grafana
  • Обучение команды работе с трейсами

Сроки ориентировочно

  • OpenTelemetry SDK + Jaeger + авто-инструментации для 3–5 сервисов — 3–5 дней
  • Ручное инструментирование бизнес-операций + настройка sampling — ещё 3–5 дней
  • Настройка алертов на p95 latency через Prometheus + Grafana — 2–3 дня

Получите консультацию инженера — мы поможем выбрать оптимальный бэкенд и настроить трассировку под вашу архитектуру. Закажите трассировку под ключ — и вы получите полную картину работы микросервисов. Свяжитесь с нами, чтобы оценить ваш проект и узнать, как distributed tracing сократит время отладки в вашей системе.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060