Прямой ответ
Диагностика по трейсу определяет участок обращения с основной долей времени, поэтому задержка локализуется на конкретной операции, а не определяется по общему значению.
| Шаг | Что выполняется |
|---|---|
| Выбор трейса | Трейс обращения с высокой длительностью |
| Просмотр дерева | Определение участка с основной долей времени |
| Проверка атрибутов | Определение ресурса либо объекта операции |
| Подтверждение | Сопоставление с записями того же обращения |
from opentelemetry import trace
tracer = trace.get_tracer("app")
with tracer.start_as_current_span("external-call") as span:
span.set_attribute("target", "payments")
span.set_attribute("timeout_ms", 2000)
response = call_payments()
Атрибуты спана определяют ресурс операции, поэтому участок с основной долей времени идентифицируется по признакам. Об основах трассировки — в статье про распределённую трассировку.
Дерево операций и доля времени участка
Дерево спанов показывает длительность каждого участка, поэтому участок с основной долей времени определяется без полного перебора.
Длительность спана. Каждый спан содержит время начала и длительность, поэтому доля времени участка вычисляется по отношению к общей длительности.
Вложенность спанов. Родительский спан содержит суммарную длительность вложенных, поэтому доля вложенных операций видна в дереве.
Атрибуты спана. Признаки ресурса и объекта позволяют определить, к чему относится операция с высокой длительностью.
Практическое следствие: спан без атрибутов не позволяет определить ресурс операции, поэтому участок с высокой длительностью не идентифицируется.
Отдельный аспект — подтверждение по записям. Записи того же обращения по признаку подтверждают причину, определённую по дереву.
Три признака некорректной диагностики.
Отсутствие атрибутов спана. Ресурс операции не определяется, поэтому участок не идентифицируется.
Отсутствие передачи контекста. Дерево неполное, поэтому часть участков не видна.
Отсутствие подтверждения по записям. Причина, определённая по дереву, не подтверждается, поэтому вывод неполный.
О связи сигналов — в статье про связь метрик и трейсов; о доступности трейсов — в статье про хранение трейсов.
Подтверждение причины и контроль после изменения
Причина, определённая по дереву трейса, подтверждается записями того же обращения, поэтому вывод не остаётся предположением.
Подтверждение по записям. Записи обращения по признаку подтверждают причину, определённую по дереву операций.
Контроль после изменения. Метрика длительности участка контролирует тенденцию после изменения, поэтому эффект фиксируется.
Полнота дерева. Отсутствие спана на участке указывает на потерю контекста, поэтому часть операций не видна.
Практическое следствие: причина без подтверждения записями остаётся предположением, поэтому вывод требует сопоставления сигналов.
Практика: диагностика задержки по трейсу
1. Выбирайте трейс обращения с высокой длительностью. Трейс с высокой длительностью содержит участок, занимающий основное время.
2. Просматривайте дерево операций. Участок с основной долей времени определяется по длительности спанов.
3. Проверяйте атрибуты участка. Признаки ресурса определяют, к чему относится операция.
4. Сопоставляйте с записями обращения. Записи по признаку подтверждают причину, определённую по дереву.
5. Фиксируйте метрику длительности участка. Метрика контролирует тенденцию после изменения.
6. Проверяйте полноту дерева. Отсутствие спана указывает на потерю контекста.
7. Ограничивайте таймаут участка. Таймаут предотвращает перенос задержки на весь запрос.
Рекомендации:
- Не определяйте причину по общей длительности. Общее значение не показывает структуру операций, поэтому участок не локализуется.
- Учитывайте вложенность спанов. Родительский спан содержит суммарную длительность, поэтому доля вложенных операций видна.
- Сопоставляйте по признаку обращения. Совпадение признака обеспечивает переход от дерева к записям.
- Фиксируйте атрибуты значимых участков. Признаки ресурса позволяют определить объект операции с высокой длительностью.
- Пересматриваем охват при изменении структуры. Новый участок требует создания спана для включения в дерево.
Практический сценарий: задержка не локализовалась по метрикам
Контекст: метрики показали рост длительности обращения, но участок, занимающий основное время, не определялся.
- Диагностика. Переход к трейсу обращения показал дерево операций, в котором один участок занимал основную долю времени. Атрибуты спана указывали на обращение к внешнему сервису, длительность которого не контролировалась метриками собственного приложения.
- Причина. Задержка возникала на внешнем обращении, которое не покрывалось метриками сервиса. Общее время обращения росло, при этом метрики собственного приложения оставались в норме.
- Действия. (а) Проверили полноту дерева и убедились в передаче контекста через все сервисы; (б) добавили атрибуты к спану внешнего обращения для определения ресурса; (в) установили таймаут внешнего обращения, чтобы задержка не переносилась на весь запрос; (г) добавили метрику длительности внешнего обращения как контролируемую величину; (д) сопоставили с записями обращения по признаку и подтвердили причину.
- Результат. Задержка локализуется по дереву операций, а таймаут ограничивает влияние внешнего обращения.
Вывод: метрики сервиса не показывают задержку на внешнем обращении, поэтому общая деградация не локализуется. Дерево трейса показывает долю времени каждого участка, поэтому операция с основной долей определяется по длительности спанов.
Практический сценарий: задержка не локализовалась по метрикам
Контекст: метрики показали рост длительности обращения, но участок, занимающий основное время, не определялся.
- Диагностика. Переход к трейсу обращения показал дерево операций, в котором один участок занимал основную долю времени. Атрибуты спана указывали на обращение к внешнему сервису, длительность которого не контролировалась метриками собственного приложения.
- Причина. Задержка возникала на внешнем обращении, которое не покрывалось метриками сервиса. Общее время обращения росло, при этом метрики собственного приложения оставались в норме.
- Действия. (а) Проверили полноту дерева и убедились в передаче контекста через все сервисы; (б) добавили атрибуты к спану внешнего обращения для определения ресурса; (в) установили таймаут внешнего обращения, чтобы задержка не переносилась на весь запрос; (г) добавили метрику длительности внешнего обращения как контролируемую величину; (д) сопоставили с записями обращения по признаку и подтвердили причину.
- Результат. Задержка локализуется по дереву операций, а таймаут ограничивает влияние внешнего обращения.
Вывод: метрики сервиса не показывают задержку на внешнем обращении, поэтому общая деградация не локализуется. Дерево трейса показывает долю времени каждого участка, поэтому операция с основной долей определяется по длительности спанов.
FAQ
Как определить участок с основной долей времени? По дереву спанов: длительность каждого спана сравнивается с общей длительностью обращения. Участок с наибольшей долей локализуется.
Зачем нужны атрибуты спана? Признаки ресурса и объекта позволяют определить, к чему относится операция с высокой длительностью. Спан без атрибутов не идентифицируется.
Как подтверждается причина по записям? Через переход к записям того же обращения по признаку. Совпадение признака обеспечивает сопоставление дерева и записей.
Почему метрики не локализуют участок? Метрика показывает агрегированное значение, но не структуру операций. Дерево трейса содержит длительность каждого участка.
Источники: OpenTelemetry traces, Grafana Tempo, OpenTelemetry Python — ссылки в шапке.