Поиск — то, чем вы будете пользоваться чаще всего. Правильно составленный запрос находит инцидент за минуты; неправильный — «ничего не находит» и подрывает доверие к трассировке.
Поля поиска
| Поле | Что значит | Пример |
|---|---|---|
| Service | обязательное; чей трейс ищем | orders |
| Operation | сужение по операции (endpoint) | POST /orders |
| Tags | фильтр по атрибутам спанов | order.id=1001, http.response.status_code=500 |
| Min/Max Duration | порог длительности трейса | min 500ms — найти медленные |
| Time range | окно времени | последние 15 минут вокруг инцидента |
| Limit | сколько результатов вернуть | 20–100 |
Отдельно — поиск по Trace ID: поле слева вверху UI. Скопировали ID из лога/алерта — попали в точный трейс, минуя фильтры. Это самый быстрый путь в расследовании.
Теги в поиске: тонкости
- Формат —
key=value; значение без кавычек; - Ищутся по всем спанам трейса, не только корневому: тег на самом глубоком спане найдёт трейс;
- Числа/булевы — как записаны в атрибутах (
retry.count=3); - Несколько тегов = логическое И;
- Поддержка wildcard-ов ограничена и зависит от хранилища: ES шустрее по произвольным тегам, Cassandra — по индексируемым.
💡 Тактика: сначала широкий запрос (сервис + время), затем добавляйте ограничители. Если «ничего не найдено» — проверьте окно времени (UTC vs локальное!) и сервис. 50% «не работает поиск» — это часовой пояс.
Поиск «медленных» и «ошибочных»
- Медленные: Service + Min Duration 1s + сортировка по времени. Сразу видна серия тяжёлых запросов;
- Ошибочные: тег
error=true(стандартная конвенция OTel: статус ERROR отображается флагом) илиhttp.response.status_code=5xxпо частям; - Нужный пользователь: если вы клали
user.idв атрибуты (урок 2.1) — поиск по тегу найдёт все запросы пользователя.
Что ограничивает поиск
- Retention: найдётся только то, что не вычищено (урок 5.3);
- Сэмплирование: трейс, не прошедший сэмплинг, не существует для поиска — не путайте с «потерей»;
- Карточность: запросы по тегам с миллионами значений — медленные (и это ваш сигнал пересмотреть дизайн атрибутов);
- Хранилище: глубокая пагинация и широкие окна — дорогие запросы; для старта берите узкие окна и Limit 20.
Программный доступ: query API
# UI — лишь оболочка над HTTP API:
curl "http://localhost:16686/api/traces?service=orders&start=1717000000000000&
end=1717003600000000&operation=POST%20/orders&limit=20"
# Трейс по ID:
curl "http://localhost:16686/api/traces/<trace-id>"
API используют скрипты и боты: «вытаскивай трейсы с error=true за последний час и шлёт сводку в Slack». Время — в микросекундах Unix.
Практика
- На стенде из 3.5 найдите: (а) все трейсы с ошибкой; (б) трейсы медленнее 300 мс; (в) трейс по order.id.
- Возьмите trace_id из лога приложения и найдите трейс полем Trace ID — отработайте цикл «лог → трейс».
- Напишите curl-скрипт «топ-10 медленных трейсов за час» и запустите по крону — это прототип SPM-дашборда (урок 5.4).
- Поставьте фильтр времени на окно «вчера 14:00–14:10» и убедитесь, что пустой результат при переключении UTC/локального времени меняется — запомните эту ловушку.
Мини-квиз
1. Тег указан на спане БД глубоко в трейсе. Найдётся ли поиском? — Да: поиск покрывает все спаны трейса.
2. Самый быстрый путь к трейсу при инциденте? — Trace ID из лога/алерта.
3. Поиск «ничего не нашёл» — три первые проверки? — Окно времени и часовой пояс, правильный service.name, сэмплирование/retention.