Сквозная трассировка ломается на границах сервисов
Трассировка держится ровно до первой границы между сервисами: вызов по HTTP внутри кластера виден целиком, а как только запрос уходит в очередь, в фоновую задачу или во внешний шлюз, контекст теряется. Спаны не связываются в один трейс, и в панели остаётся фрагмент пути — до момента, когда сервис передал работу дальше. Сквозная трассировка превращается в набор несвязанных отрезков, а сопоставлять их приходится вручную по логам.
Дороже всего это обходится на разборе инцидентов. Дежурный открывает логи четырёх-пяти сервисов, сверяет метки времени глазами и обнаруживает, что идентификатор запроса у каждого компонента свой. Узкое место ищется перебором: сначала под подозрение попадает база, затем пул соединений, затем кэш — и только к концу часа выясняется, что путь тормозил один внешний вызов с повторными попытками. Разорванная наблюдаемость сервисов не даёт доказать причину, поэтому деградация успевает повториться.
Чтобы трейс не рвался, контекст нужно пробрасывать через все транспорты, которые есть в системе, а не только через синхронные вызовы. New Relic APM собирает распределённый трейсинг по сервисам, но картина становится полной только тогда, когда инструментированы и обработчики очередей, и планировщики фоновых задач, и клиенты внешних интеграций. Отдельная часть работы — связать записи логов с трейсами по общему идентификатору, чтобы переход от спана к строке лога занимал один клик.
Разбираем, как это закрывается: что настроить в агенте, как разметить сервисы и какие проверки заложить, чтобы трейс собирался целиком, а не до первой границы.
Что даёт сквозная наблюдаемость по всем сервисам
Сквозная наблюдаемость — это когда по одной жалобе можно проследить весь путь запроса: от входного сервиса через очереди и внешние вызовы до конкретного запроса к базе. New Relic APM собирает распределённые трассировки, метрики приложений и данные об окружении в одну картину, поэтому причина сбоя ищется не перебором логов по пяти системам, а по графу зависимостей. Ниже — что именно меняется в работе команды, когда такая связка уже настроена.
- Время локализации причины. Трассировка связывает участки по одному идентификатору запроса — вместо часов на согласование «чей это участок» причина находится за минуты.
- Узкие места сервисов. Видно топ самых долгих внешних вызовов и запросов к хранилищу с разбивкой по времени ответа — понятно, что оптимизировать первым, а что не влияет на итог.
- Ложные тревоги. Правило строится на связке сигналов (доля ошибок + длительность + пропускная способность), а не на одном пороге — срабатывания без реального отклонения почти исчезают.
- Класс скрытых отказов. Деградация, при которой всё «зелёное», но один участок отвечает втрое дольше, выявляется до обращений пользователей.
- Время восстановления. Каждая выкатка автоматически привязывается к точке релиза: сравнение «до и после» и откат опираются на факты, а не на догадки.
- Карта зависимостей. Связи между сервисами строятся по фактическому трафику, а не по документации, которая отстала от реальности.
- Единый контекст разбора. Логи, метрики и трассировки открываются рядом, поэтому разбор инцидента не превращается в ручной сбор выгрузок из разных систем.
Смысл не в панели мониторинга, а в изменении процесса: настраиваем правила оповещений, регламент разбора и разметку сервисов так, чтобы наблюдаемость работала на дежурную команду, а не существовала сама по себе.
Способы сбора телеметрии: агент, разметка, шлюз
Способ сбора телеметрии выбирают по одному критерию: где мы готовы вносить изменения — в конфигурацию узла, в код приложения или в отдельный сервис между приложением и хранилищем. Агент мониторинга ставится на хост или в контейнер, не требует правок кода и сразу отдаёт запросы, ошибки и время внешних вызовов; цена — держать и обновлять его на каждом узле. Инструментирование кода даёт точные границы бизнес-операций, но привязывает нас к языку и к дисциплине команды разработки.
Отдельный сборщик метрик — компромисс для распределённой архитектуры сбора данных: агенты и библиотеки отправляют данные ему, а он решает, что уходит дальше, как обогащается и фильтруется. В New Relic эти варианты дополняют друг друга, поэтому выбор — не «или», а «в каком порядке».
| Вариант | Когда подходит | Ограничения |
|---|---|---|
| Агент на хосте или в контейнере | Нужна телеметрия без правок кода и языков несколько | Доступ к узлам, версии агентов надо держать синхронно |
| Библиотека внутри приложения | Нужны бизнес-метрики и точные границы операций | Правки кода, зависимость от языка, пересборка и релиз |
| Отдельный сборщик-шлюз | Много источников, нужен единый приём и фильтрация | Сам является сервисом: масштабирование, обновления, отказоустойчивость |
| Агент на узле плюс библиотека | Нужны и инфраструктурные, и прикладные данные | Дублирование метрик, требуется нормализация имён |
Границы вариантов размываются: агент на узле решает задачу за день, а библиотека добавляет то, что снаружи не видно. Дальше разбираем, как совместить их без дублей в отчётности.
Как проходит внедрение: от схемы до передачи
Внедрение мониторинга редко сводится к установке агента: сначала нужно понять, какие сервисы связаны между собой и где теряется контекст запроса. Поэтому идём этапами — от обследования окружения до передачи регламентов, чтобы схема наблюдаемости работала без нас.
- Обследование окружения. Инвентаризируем сервисы, среды и точки входа, фиксируем, что уже отдаёт метрики, а что придётся закрывать вручную.
- Проектирование схемы наблюдаемости. Договариваемся, что считаем отдельным сервисом, как связываем запрос между ними и сколько храним данные — срок выбираем под разбор сбоев.
- Настройка агентов. Ставим агент New Relic рядом с приложением, включаем сбор по умолчанию и точечно добавляем ручные замеры там, где автоматика не видит бизнес-операцию.
- Распределённая трассировка. Пробрасываем контекст через сервисы и очереди и настраиваем долю сохраняемых запросов: выборка остаётся репрезентативной, а объём данных не растёт бесконтрольно.
- Панели и правила оповещения. Собираем панели под дежурного, техлида и руководителя направления, а правила настраиваем на отклонение от нормы, а не на каждый всплеск.
- Нагрузочная проверка. Прогоняем профиль, близкий к рабочему, и следим, чтобы запись данных не съедала пропускную способность и не добавляла задержек заметно для пользователя.
- Передача регламента эксплуатации. Фиксируем, кто и как реагирует на оповещение, как откатывают изменения и как подключают новый сервис в схему.
Политики доступа, роли и разграничение данных
Разграничение доступа в системе трассировки — не бюрократия, а условие, при котором результатам расследований можно верить. Одна общая учётная запись с полными правами в New Relic обнуляет аудит: невозможно понять, кто менял правило оповещения и кто выгружал трассы с параметрами запросов. Роли наблюдателей выстраиваем от структуры команд: разработчик видит свои сервисы, дежурный — весь контур, внешний подрядчик — только согласованный участок.
На руки заказчик получает:
- матрицу ролей с привязкой к командам и сервисам: кто смотрит метрики, кто — трассы, кто управляет правилами;
- политики разграничения данных и маскирования: параметры запросов вырезаются до записи, а не после;
- схему потоков данных от сборщика метрик до хранилища с указанием точек обезличивания;
- регламент дежурств и эскалации: сроки реакции, порядок передачи смены, критерии ночного вызова;
- документацию эксплуатации: ротация ключей доступа, ревизия прав, подключение нового сервиса к трассировке;
- журнал аудита действий и инструкцию по разбору инцидентов со ссылками на конкретные панели и запросы;
- чек-лист приёмки, по которому конфигурацию можно проверить без нас: запросы, фильтры, зоны видимости.
Настройка алертов без шума: пороги и группы
По умолчанию команды ставят статические пороги «на глаз»: время ответа выше условного значения — тревога. В часы пик такой порог срабатывает десятки раз, дежурный привыкает игнорировать канал, и настоящий отказ приходит вместе с шумом. Лечится это не отключением правил, а разделением условий по природе метрики — в New Relic это делается на уровне политик и условий.
Ресурсные метрики — утилизация диска, исчерпание пула соединений, рост очереди — держим на статических порогах: у них есть физический предел, отклонение всегда значимо. Трафик-зависимые — время ответа, доля ошибок, пропускная способность — переводим на базовые пороги с окном сглаживания в несколько дней и требованием удерживать отклонение дольше одного замера. Это убирает срабатывания на единичном всплеске и оставляет те, что подтверждаются соседними метриками сервиса.
Второй источник шума — один сбой, порождающий сорок тревог. Группировка инцидентов по сущности и ключевым признакам собирает связанные срабатывания в один инцидент с общим контекстом, а разделение на критические и предупреждающие уровни не даёт фоновым событиям перебивать критичные. Порог предупреждения ставим намеренно ниже критического — он работает как ранний сигнал, а не как повод для ночного звонка.
Маршрутизация тревог опирается на теги: у каждой сущности проставлен владелец сервиса, и правила доставки раскладывают срабатывания по дежурствам — критичное уходит в дежурный канал с эскалацией, предупреждения в командный, ночной фоновый поток сворачивается в утренний дайджест. Подавление шума включает правила заглушения на время плановых работ и выката релиза, чтобы обновление не выглядело как авария. Итог — доля тревог, по которым действительно что-то делают, растёт, а время до реакции падает.
Чем отличается трассировка запросов от метрик?
Метрика отвечает на вопрос «что и насколько часто», трейс — «где именно и почему». Выбор «метрики или трейсы» — ложная развилка: это последовательные инструменты, а не конкуренты. Агрегированные метрики показывают, что проблема есть и в каком окне времени, а трассировка запросов ведёт к конкретному участку пути, который её создаёт.
Агрегированные метрики считаются по всем запросам сразу: доля ошибок, 95-й процентиль времени ответа, число обращений в секунду, насыщение пула соединений. Они дёшевы по объёму и хороши для наблюдения — по ним видно, что после выката выросла доля отказов или просел процентиль задержки. Чего в них нет, так это привязки к отдельному запросу: метрика скажет, что медленно, но не покажет, на каком шаге обработки потеряны сотни миллисекунд.
Трейс — это запись одного пути: от входной точки через внутренние сервисы до базы и внешних вызовов, с длительностью каждого участка и связью между ними. Он сохраняет контекст ошибки — какой обработчик упал, с какими параметрами пришёл запрос, что происходило в соседних сервисах. Для диагностики сбоя сначала сужают окно по метрикам, а потом открывают трейсы именно этого интервала.
В New Relic APM оба слоя связаны в одной картине: распределённая трассировка склеивает участки пути между сервисами, а метрики по ним попадают в те же графики, по которым идёт дежурство. Разбор идёт сверху вниз — от «выросла доля ошибок на оплате» к «вызов внешнего шлюза перестал укладываться в таймаут».
Кейс: разбор деградации платёжного сервиса
Платёжный сервис проводил платежи через цепочку из четырёх участков: приём запроса, проверку антифрода, обращение к внешнему провайдеру и запись результата. Среднее время ответа на входе держалось в норме, но у части операций оно подскакивало в разы — по сводному графику этого не было видно.
До: трассировка обрывалась на середине цепочки
Трассировка собиралась только на первых двух участках: дальше контекст запроса терялся, потому что промежуточный слой не передавал заголовки. New Relic получал разрозненные транзакции без привязки к конкретному платежу, и разбор каждого случая превращался в ручное сопоставление журналов по отметкам времени.
Время поиска причины доходило до 4–6 часов, а почти половина разборов заканчивалась выводом «воспроизвести не удалось». Правки в антифрод вносились вслепую: не было видно, что добавляет задержку — проверка или ожидание ответа провайдера.
После: сквозная связка по идентификатору платежа
Мы провели идентификатор платежа через все участки и включили распределённую трассировку на промежуточном слое, а ошибки разбили по типам и участкам — отказ провайдера перестал смешиваться с внутренней ошибкой разбора ответа.
- Время поиска первопричины на инцидент: 4–6 часов → 10–20 минут.
- Доля случаев с причиной, найденной при первом разборе: около половины → девять из десяти.
- Правки в антифрод: по гипотезам → по разбивке задержек по участкам.
Эффект дала не сама телеметрия, а непрерывность трассировки: разрыв на одном участке обесценивал данные всех остальных.
Технические сомнения перед началом работ
Возражения перед внедрением сквозной трассировки обычно не про возможности, а про цену эксплуатации: накладные расходы, совместимость и приватность данных. Разбираем четыре, которые чаще всего останавливают проект.
Не перегрузит ли сбор данных сами сервисы?
Агент снимает метрики постоянно, а распределённую трассировку включаем точечно — на критичных путях и с выборкой. Накладные расходы удерживаем в пределах нескольких процентов времени отклика, замеряя их до и после на одном профиле нагрузки. Для сервисов, чувствительных к задержкам, трассировку сужаем до отдельных операций.
Что делать с устаревшими сервисами?
Переписывать их не обязательно: совместимость обеспечиваем на уровне окружения — сбор через прокси и логи, а не через агент внутри приложения. Так старые сервисы попадают в общую картину трассировки, даже если их код никто не трогает.
Как быть с приватностью данных?
Маскирование настраиваем на стороне агента: персональные поля, идентификаторы и тела запросов вырезаются до отправки, наружу уходят имена операций и тайминги. Правила маскирования лежат в конфигурации и закрыты проверками — при изменении схемы данных они не расходятся с реальностью.
Сколько хранятся трейсы и как ограничить объём?
Ретенцию задаём политиками: сырые трейсы живут ограниченный срок, агрегированные метрики — дольше, потому что занимают меньше места и нужны для трендов. После включения выборки и очистки по сроку объём хранения перестаёт расти линейно.
Обсудим вашу задачу наблюдаемости
Начать стоит с описания задачи: какие сервисы участвуют в обработке запроса, где сейчас теряется контекст между ними и какой вопрос нужно закрыть — поиск источника ошибок, разбор медленных участков или контроль времени ответа на всём пути. Для предварительного разбора достаточно перечня сервисов, их среды выполнения и схемы окружения: отдельно контуры разработки, тестирования и рабочий.
Оценка работ строится не на глаз. Считаем число точек входа, глубину цепочки вызовов, объём потока запросов и нужную долю покрытых маршрутов. Если наблюдаемость уже частично развёрнута, смотрим, где установлены сборщики данных и какие разрывы контекста остаются — это показывает, хватит ли донастройки или потребуется перенос логики.
По итогам разбора возвращаемся с планом внедрения и схемой окружения: очерёдность подключения сервисов, этапы, зоны ответственности, критерии приёмки и точки отката.
Что обычно нужно на входе, чтобы перейти к старту работ:
- перечень сервисов и связей между ними, включая фоновые задачи и очереди;
- схема окружения с указанием, где какой контур и как они между собой сообщаются;
- доступы к системам наблюдаемости и хранилищам журналов — сервисные учётные записи с правами только на чтение;
- среды выполнения и версии библиотек, формирующих трассировку;
- перечень уже подключённых источников данных и настроенных оповещений;
- ожидания по глубине хранения трасс и скорости поиска;
- сотрудник, который подтвердит критерии приёмки на стороне заказчика.
Опишите задачу так, как удобно — коротким письмом или встречей. Вернёмся с оценкой, планом и понятным объёмом первого этапа.







