Хранилище трейсов — самый дорогой компонент системы трассировки. Учимся считать размер, выбирать срок жизни данных и не давать индексам расти вечно.
Расчёт ёмкости (ES-вариант)
Суточный объём (из урока 5.1) × репликация × overhead индексов (~1.5–2)
Пример: 26 ГБ/сутки × 1 реплика × 1.5 = ~40 ГБ/сутки на диске. Плюс шард-разбухание и merge-фазы. Практические ориентиры ES:
- Размер шарда: 20–50 ГБ; трейсовые индексы — по дням (или часам при больших объёмах);
- RAM: heap ≤ 50% памяти узла, остальное — файловый кеш;
- Запись: bulk-батчи; следите за
es_bulk_size/flush у Jaeger и за latency индексации; - Диски: SSD для горячего окна; архивные — на дешёвых носителях.
Retention: как удалять
| Хранилище | Механизм |
|---|---|
| Elasticsearch/OpenSearch | индексы по дням + jaeger-es-index-cleaner (или ILM/ISM): удалить индексы старше N дней |
| Cassandra | TTL на строках — данные истекают сами; compaction подчищает |
| ClickHouse | TTL-политики на таблицах/партициях |
| Badger | общий лимит размера/времени (value log) |
# Очистка индексов старше 7 дней (утилита Jaeger)
docker run --rm jaegertracing/jaeger-es-index-cleaner:latest 7 \
--url http://elasticsearch:9200
# По крону, раз в сутки. Мониторьте его успех — иначе диск закончится тихо.
Rollover: индексы по времени
Jaeger пишет в индексы с префиксом даты (jaeger-span-2024-06-01). Утилита
jaeger-es-rollover умеет иное: один алиас, индексы ротируются по возрасту/размеру
(например, каждые 24ч или 50 ГБ) — стабильное число шардов и предсказуемая очистка:
docker run --rm jaegertracing/jaeger-es-rollover:latest init \
--url http://elasticsearch:9200
# далее по крону:
... rollover --unit hour --unit-count 24
... lookback --unit hour --unit-count 168 # удалить старше 7 суток
⚠️ Retention-механизм без мониторинга — самая частая авария трассировки: вчерашний сбой крона → через неделю кончился диск → упало и хранилище, и (если делят хост) остальное. Алерт на возраст новейшего индекса и свободное место — обязателен.
Архивные трейсы
Иногда отдельные трейсы нужно хранить дольше retention (инцидент, следствие). В Jaeger есть archive storage: сохранение трейса по кнопке в UI/API в отдельный индекс вне обычной ротации. Используйте точечно: это исключение, а не политика.
Оптимизация поиска
- Низкокардинарные теги — индексируются; миллион уникальных значений тега — выключайте индексацию (mapping) или не пишите;
- Ограничивайте окно поиска в UI (неделя — уже тяжёлый запрос);
- Шард-размер и количество реплик — по SLA доступности; трейсы обычно терпят деградацию, но не простой;
- Смотрите запросы-убийцы в slow log ES: обычно это wildcard по тегам.
Практика
- Посчитайте фактический размер индекса за сутки на стенде (делим размер всех jaeger-индексов на дни) и сравните с теоретическим расчётом.
- Настройте rollover (init → rollover по 24ч) и lookback на 3 дня; проверьте, что старые данные исчезают.
- Сломайте очистку (остановите крон-джобу) и постройте алерт «новейший индекс старше 2 суток» в Prometheus — потренируйте ловить эту аварию.
- Сравните скорость поиска по тегу с низкой и высокой карточностью — почувствуйте разницу.
Мини-квиз
1. Чем rollover лучше «индекс по календарному дню»? — Стабильные шард-размеры и очистка по возрасту/размеру независимо от объёма суток.
2. Почему у Cassandra TTL «сам работает», а у ES нужен cleaner? — ES не удаляет документы по возрасту: чистятся целые индексы внешней утилитой/ILM.
3. Куда класть трейс инцидента, который пережил retention? — В archive storage, точечно.