Сквозная трассировка с New Relic APM: настройка и оптимизация

Трассировка ломается на стыках сервисов, и причину сбоя приходится искать вручную. Мы настраиваем сквозную наблюдаемость под ключ: собираем телеметрию со всех сервисов, размечаем вызовы и выводим понятные панели для дежурной команды. Время на поиск причины инцидента сокращается в разы.
Часто задаваемые вопросы

Сквозная трассировка ломается на границах сервисов

Трассировка держится ровно до первой границы между сервисами: вызов по HTTP внутри кластера виден целиком, а как только запрос уходит в очередь, в фоновую задачу или во внешний шлюз, контекст теряется. Спаны не связываются в один трейс, и в панели остаётся фрагмент пути — до момента, когда сервис передал работу дальше. Сквозная трассировка превращается в набор несвязанных отрезков, а сопоставлять их приходится вручную по логам.

Дороже всего это обходится на разборе инцидентов. Дежурный открывает логи четырёх-пяти сервисов, сверяет метки времени глазами и обнаруживает, что идентификатор запроса у каждого компонента свой. Узкое место ищется перебором: сначала под подозрение попадает база, затем пул соединений, затем кэш — и только к концу часа выясняется, что путь тормозил один внешний вызов с повторными попытками. Разорванная наблюдаемость сервисов не даёт доказать причину, поэтому деградация успевает повториться.

Чтобы трейс не рвался, контекст нужно пробрасывать через все транспорты, которые есть в системе, а не только через синхронные вызовы. New Relic APM собирает распределённый трейсинг по сервисам, но картина становится полной только тогда, когда инструментированы и обработчики очередей, и планировщики фоновых задач, и клиенты внешних интеграций. Отдельная часть работы — связать записи логов с трейсами по общему идентификатору, чтобы переход от спана к строке лога занимал один клик.

Разбираем, как это закрывается: что настроить в агенте, как разметить сервисы и какие проверки заложить, чтобы трейс собирался целиком, а не до первой границы.

Что даёт сквозная наблюдаемость по всем сервисам

Сквозная наблюдаемость — это когда по одной жалобе можно проследить весь путь запроса: от входного сервиса через очереди и внешние вызовы до конкретного запроса к базе. New Relic APM собирает распределённые трассировки, метрики приложений и данные об окружении в одну картину, поэтому причина сбоя ищется не перебором логов по пяти системам, а по графу зависимостей. Ниже — что именно меняется в работе команды, когда такая связка уже настроена.

  • Время локализации причины. Трассировка связывает участки по одному идентификатору запроса — вместо часов на согласование «чей это участок» причина находится за минуты.
  • Узкие места сервисов. Видно топ самых долгих внешних вызовов и запросов к хранилищу с разбивкой по времени ответа — понятно, что оптимизировать первым, а что не влияет на итог.
  • Ложные тревоги. Правило строится на связке сигналов (доля ошибок + длительность + пропускная способность), а не на одном пороге — срабатывания без реального отклонения почти исчезают.
  • Класс скрытых отказов. Деградация, при которой всё «зелёное», но один участок отвечает втрое дольше, выявляется до обращений пользователей.
  • Время восстановления. Каждая выкатка автоматически привязывается к точке релиза: сравнение «до и после» и откат опираются на факты, а не на догадки.
  • Карта зависимостей. Связи между сервисами строятся по фактическому трафику, а не по документации, которая отстала от реальности.
  • Единый контекст разбора. Логи, метрики и трассировки открываются рядом, поэтому разбор инцидента не превращается в ручной сбор выгрузок из разных систем.

Смысл не в панели мониторинга, а в изменении процесса: настраиваем правила оповещений, регламент разбора и разметку сервисов так, чтобы наблюдаемость работала на дежурную команду, а не существовала сама по себе.

Способы сбора телеметрии: агент, разметка, шлюз

Способ сбора телеметрии выбирают по одному критерию: где мы готовы вносить изменения — в конфигурацию узла, в код приложения или в отдельный сервис между приложением и хранилищем. Агент мониторинга ставится на хост или в контейнер, не требует правок кода и сразу отдаёт запросы, ошибки и время внешних вызовов; цена — держать и обновлять его на каждом узле. Инструментирование кода даёт точные границы бизнес-операций, но привязывает нас к языку и к дисциплине команды разработки.

Отдельный сборщик метрик — компромисс для распределённой архитектуры сбора данных: агенты и библиотеки отправляют данные ему, а он решает, что уходит дальше, как обогащается и фильтруется. В New Relic эти варианты дополняют друг друга, поэтому выбор — не «или», а «в каком порядке».

Вариант Когда подходит Ограничения
Агент на хосте или в контейнере Нужна телеметрия без правок кода и языков несколько Доступ к узлам, версии агентов надо держать синхронно
Библиотека внутри приложения Нужны бизнес-метрики и точные границы операций Правки кода, зависимость от языка, пересборка и релиз
Отдельный сборщик-шлюз Много источников, нужен единый приём и фильтрация Сам является сервисом: масштабирование, обновления, отказоустойчивость
Агент на узле плюс библиотека Нужны и инфраструктурные, и прикладные данные Дублирование метрик, требуется нормализация имён

Границы вариантов размываются: агент на узле решает задачу за день, а библиотека добавляет то, что снаружи не видно. Дальше разбираем, как совместить их без дублей в отчётности.

Как проходит внедрение: от схемы до передачи

Внедрение мониторинга редко сводится к установке агента: сначала нужно понять, какие сервисы связаны между собой и где теряется контекст запроса. Поэтому идём этапами — от обследования окружения до передачи регламентов, чтобы схема наблюдаемости работала без нас.

  1. Обследование окружения. Инвентаризируем сервисы, среды и точки входа, фиксируем, что уже отдаёт метрики, а что придётся закрывать вручную.
  2. Проектирование схемы наблюдаемости. Договариваемся, что считаем отдельным сервисом, как связываем запрос между ними и сколько храним данные — срок выбираем под разбор сбоев.
  3. Настройка агентов. Ставим агент New Relic рядом с приложением, включаем сбор по умолчанию и точечно добавляем ручные замеры там, где автоматика не видит бизнес-операцию.
  4. Распределённая трассировка. Пробрасываем контекст через сервисы и очереди и настраиваем долю сохраняемых запросов: выборка остаётся репрезентативной, а объём данных не растёт бесконтрольно.
  5. Панели и правила оповещения. Собираем панели под дежурного, техлида и руководителя направления, а правила настраиваем на отклонение от нормы, а не на каждый всплеск.
  6. Нагрузочная проверка. Прогоняем профиль, близкий к рабочему, и следим, чтобы запись данных не съедала пропускную способность и не добавляла задержек заметно для пользователя.
  7. Передача регламента эксплуатации. Фиксируем, кто и как реагирует на оповещение, как откатывают изменения и как подключают новый сервис в схему.

Политики доступа, роли и разграничение данных

Разграничение доступа в системе трассировки — не бюрократия, а условие, при котором результатам расследований можно верить. Одна общая учётная запись с полными правами в New Relic обнуляет аудит: невозможно понять, кто менял правило оповещения и кто выгружал трассы с параметрами запросов. Роли наблюдателей выстраиваем от структуры команд: разработчик видит свои сервисы, дежурный — весь контур, внешний подрядчик — только согласованный участок.

На руки заказчик получает:

  • матрицу ролей с привязкой к командам и сервисам: кто смотрит метрики, кто — трассы, кто управляет правилами;
  • политики разграничения данных и маскирования: параметры запросов вырезаются до записи, а не после;
  • схему потоков данных от сборщика метрик до хранилища с указанием точек обезличивания;
  • регламент дежурств и эскалации: сроки реакции, порядок передачи смены, критерии ночного вызова;
  • документацию эксплуатации: ротация ключей доступа, ревизия прав, подключение нового сервиса к трассировке;
  • журнал аудита действий и инструкцию по разбору инцидентов со ссылками на конкретные панели и запросы;
  • чек-лист приёмки, по которому конфигурацию можно проверить без нас: запросы, фильтры, зоны видимости.

Настройка алертов без шума: пороги и группы

По умолчанию команды ставят статические пороги «на глаз»: время ответа выше условного значения — тревога. В часы пик такой порог срабатывает десятки раз, дежурный привыкает игнорировать канал, и настоящий отказ приходит вместе с шумом. Лечится это не отключением правил, а разделением условий по природе метрики — в New Relic это делается на уровне политик и условий.

Ресурсные метрики — утилизация диска, исчерпание пула соединений, рост очереди — держим на статических порогах: у них есть физический предел, отклонение всегда значимо. Трафик-зависимые — время ответа, доля ошибок, пропускная способность — переводим на базовые пороги с окном сглаживания в несколько дней и требованием удерживать отклонение дольше одного замера. Это убирает срабатывания на единичном всплеске и оставляет те, что подтверждаются соседними метриками сервиса.

Второй источник шума — один сбой, порождающий сорок тревог. Группировка инцидентов по сущности и ключевым признакам собирает связанные срабатывания в один инцидент с общим контекстом, а разделение на критические и предупреждающие уровни не даёт фоновым событиям перебивать критичные. Порог предупреждения ставим намеренно ниже критического — он работает как ранний сигнал, а не как повод для ночного звонка.

Маршрутизация тревог опирается на теги: у каждой сущности проставлен владелец сервиса, и правила доставки раскладывают срабатывания по дежурствам — критичное уходит в дежурный канал с эскалацией, предупреждения в командный, ночной фоновый поток сворачивается в утренний дайджест. Подавление шума включает правила заглушения на время плановых работ и выката релиза, чтобы обновление не выглядело как авария. Итог — доля тревог, по которым действительно что-то делают, растёт, а время до реакции падает.

Чем отличается трассировка запросов от метрик?

Метрика отвечает на вопрос «что и насколько часто», трейс — «где именно и почему». Выбор «метрики или трейсы» — ложная развилка: это последовательные инструменты, а не конкуренты. Агрегированные метрики показывают, что проблема есть и в каком окне времени, а трассировка запросов ведёт к конкретному участку пути, который её создаёт.

Агрегированные метрики считаются по всем запросам сразу: доля ошибок, 95-й процентиль времени ответа, число обращений в секунду, насыщение пула соединений. Они дёшевы по объёму и хороши для наблюдения — по ним видно, что после выката выросла доля отказов или просел процентиль задержки. Чего в них нет, так это привязки к отдельному запросу: метрика скажет, что медленно, но не покажет, на каком шаге обработки потеряны сотни миллисекунд.

Трейс — это запись одного пути: от входной точки через внутренние сервисы до базы и внешних вызовов, с длительностью каждого участка и связью между ними. Он сохраняет контекст ошибки — какой обработчик упал, с какими параметрами пришёл запрос, что происходило в соседних сервисах. Для диагностики сбоя сначала сужают окно по метрикам, а потом открывают трейсы именно этого интервала.

В New Relic APM оба слоя связаны в одной картине: распределённая трассировка склеивает участки пути между сервисами, а метрики по ним попадают в те же графики, по которым идёт дежурство. Разбор идёт сверху вниз — от «выросла доля ошибок на оплате» к «вызов внешнего шлюза перестал укладываться в таймаут».

Кейс: разбор деградации платёжного сервиса

Платёжный сервис проводил платежи через цепочку из четырёх участков: приём запроса, проверку антифрода, обращение к внешнему провайдеру и запись результата. Среднее время ответа на входе держалось в норме, но у части операций оно подскакивало в разы — по сводному графику этого не было видно.

До: трассировка обрывалась на середине цепочки

Трассировка собиралась только на первых двух участках: дальше контекст запроса терялся, потому что промежуточный слой не передавал заголовки. New Relic получал разрозненные транзакции без привязки к конкретному платежу, и разбор каждого случая превращался в ручное сопоставление журналов по отметкам времени.

Время поиска причины доходило до 4–6 часов, а почти половина разборов заканчивалась выводом «воспроизвести не удалось». Правки в антифрод вносились вслепую: не было видно, что добавляет задержку — проверка или ожидание ответа провайдера.

После: сквозная связка по идентификатору платежа

Мы провели идентификатор платежа через все участки и включили распределённую трассировку на промежуточном слое, а ошибки разбили по типам и участкам — отказ провайдера перестал смешиваться с внутренней ошибкой разбора ответа.

  • Время поиска первопричины на инцидент: 4–6 часов → 10–20 минут.
  • Доля случаев с причиной, найденной при первом разборе: около половины → девять из десяти.
  • Правки в антифрод: по гипотезам → по разбивке задержек по участкам.

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

Технические сомнения перед началом работ

Возражения перед внедрением сквозной трассировки обычно не про возможности, а про цену эксплуатации: накладные расходы, совместимость и приватность данных. Разбираем четыре, которые чаще всего останавливают проект.

Не перегрузит ли сбор данных сами сервисы?

Агент снимает метрики постоянно, а распределённую трассировку включаем точечно — на критичных путях и с выборкой. Накладные расходы удерживаем в пределах нескольких процентов времени отклика, замеряя их до и после на одном профиле нагрузки. Для сервисов, чувствительных к задержкам, трассировку сужаем до отдельных операций.

Что делать с устаревшими сервисами?

Переписывать их не обязательно: совместимость обеспечиваем на уровне окружения — сбор через прокси и логи, а не через агент внутри приложения. Так старые сервисы попадают в общую картину трассировки, даже если их код никто не трогает.

Как быть с приватностью данных?

Маскирование настраиваем на стороне агента: персональные поля, идентификаторы и тела запросов вырезаются до отправки, наружу уходят имена операций и тайминги. Правила маскирования лежат в конфигурации и закрыты проверками — при изменении схемы данных они не расходятся с реальностью.

Сколько хранятся трейсы и как ограничить объём?

Ретенцию задаём политиками: сырые трейсы живут ограниченный срок, агрегированные метрики — дольше, потому что занимают меньше места и нужны для трендов. После включения выборки и очистки по сроку объём хранения перестаёт расти линейно.

Обсудим вашу задачу наблюдаемости

Начать стоит с описания задачи: какие сервисы участвуют в обработке запроса, где сейчас теряется контекст между ними и какой вопрос нужно закрыть — поиск источника ошибок, разбор медленных участков или контроль времени ответа на всём пути. Для предварительного разбора достаточно перечня сервисов, их среды выполнения и схемы окружения: отдельно контуры разработки, тестирования и рабочий.

Оценка работ строится не на глаз. Считаем число точек входа, глубину цепочки вызовов, объём потока запросов и нужную долю покрытых маршрутов. Если наблюдаемость уже частично развёрнута, смотрим, где установлены сборщики данных и какие разрывы контекста остаются — это показывает, хватит ли донастройки или потребуется перенос логики.

По итогам разбора возвращаемся с планом внедрения и схемой окружения: очерёдность подключения сервисов, этапы, зоны ответственности, критерии приёмки и точки отката.

Что обычно нужно на входе, чтобы перейти к старту работ:

  • перечень сервисов и связей между ними, включая фоновые задачи и очереди;
  • схема окружения с указанием, где какой контур и как они между собой сообщаются;
  • доступы к системам наблюдаемости и хранилищам журналов — сервисные учётные записи с правами только на чтение;
  • среды выполнения и версии библиотек, формирующих трассировку;
  • перечень уже подключённых источников данных и настроенных оповещений;
  • ожидания по глубине хранения трасс и скорости поиска;
  • сотрудник, который подтвердит критерии приёмки на стороне заказчика.

Опишите задачу так, как удобно — коротким письмом или встречей. Вернёмся с оценкой, планом и понятным объёмом первого этапа.

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

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

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