Содержание
VK Cloud построил Cloud Tracing на Jaeger-совместимом API и OpenTelemetry. Сервис принимает спаны от сотен независимых клиентов, хранит десятки терабайт и отдаёт данные через привычные Jaeger UI и Grafana. Выбор хранилища при этом свёлся к двум вариантам из шести заявленных бэкендов, а третьим стал ClickHouse через плагин.
Требования включали непрерывную запись до 1 МБ/с на проект, поиск по trace ID и по атрибутам, а также жёсткую изоляцию данных между тенантами. Локальные бэкенды и Kafka сразу отпали, поэтому сравнивали Cassandra и Elasticsearch, а затем добавили ClickHouse.
Почему Cassandra и Elasticsearch не подошли
Cassandra даёт простую запись по ключу и хорошо справляется с точечным чтением по trace ID. Однако поиск по сервису, операции, тегам и длительности требует дополнительных индексов или сканирования, что замедляет запросы при росте объёма. В проде Uber отметили, что похожие хранилища плохо справляются с агрегациями и гистограммами, которые составляют более 80 % обращений. Под агрегациями понимают подсчёт распределения длительности запросов или частоты ошибок по сервисам. Гистограммы нужны для визуализации распределения времени выполнения. Без быстрого выполнения таких операций дашборды observability-платформы теряют ценность, потому что инженеры не могут быстро выявить узкие места в распределённых системах.
Elasticsearch лучше обрабатывает поиск и фильтры, но при этом дороже хранит данные и требует больше ресурсов на индексацию. Внутренние тесты VK Cloud показали, что дашборды за час уже открываются медленно, а запросы за шесть часов выходят за таймаут. При расчёте на сто проектов объём сырых данных достигает 50 ТБ в месяц после сжатия, и Elasticsearch увеличивает стоимость хранения. Индексация в Elasticsearch подразумевает создание обратных индексов для каждого поля, что ускоряет поиск, но увеличивает потребление диска и CPU. При большом потоке спанов это приводит к росту расходов на оборудование и усложнению поддержки кластера.
Оба решения не содержат встроенной мультитенантности. Jaeger изначально рассчитан на одну организацию, поэтому изоляция сотен проектов ложится на внешний слой приёмника и прокси. Мультитенантность означает, что данные одного проекта не должны быть доступны другому без явного разрешения. Отсутствие такой изоляции в хранилище повышает риск утечек и усложняет соблюдение политик безопасности при работе с большим числом независимых команд.
Как ClickHouse закрыл требования
ClickHouse обеспечивает сжатие сырых спанов примерно в пять раз и позволяет хранить 510 ГБ на проект за 30 дней при лимите 1 МБ/с. Сжатие достигается за счёт колоночного хранения и специализированных кодеков, что снижает затраты на диски при хранении десятков терабайт. Схема хранения поддерживает как точечное чтение по trace ID, так и фильтрацию по атрибутам и агрегаты без дополнительных индексов. Это важно, потому что trace ID позволяет найти полный путь запроса по всем сервисам, а фильтры по атрибутам помогают отобрать только те спаны, где присутствует определённый тег или значение. Агрегаты без индексов снижают накладные расходы на поддержку и ускоряют анализ при росте объёма.
Тесты на четырёх ядрах коллектора показали пропускную способность до 362 тысяч спанов в секунду. Такая скорость важна при приёме данных от сотен клиентов одновременно. Платформы SigNoz, Uptrace и qryn уже используют ClickHouse для observability-нагрузок. В VK Cloud схема с ClickHouse за Jaeger-совместимым API позволила сохранить существующие UI и Grafana без изменений кода клиентов. При этом изоляция достигается на уровне приёмника и авторизующего прокси, а не самого хранилища. Jaeger-совместимый API означает, что клиенты отправляют данные по стандартному протоколу, а Grafana продолжает работать без доработки дашбордов.
Что учитывать при внедрении в своём контуре
В российских командах, где уже стоят ClickHouse-кластеры, добавление трейсов снижает операционные затраты: не нужно разворачивать отдельный Elasticsearch или Cassandra. Однако потребуется доработка приёмника спанов и прокси для чтения, чтобы обеспечить IAM-изоляцию и лимиты на проект. IAM-изоляция подразумевает проверку прав доступа на уровне учётных записей и проектов перед записью или чтением данных. Без этих доработок Jaeger не даёт мультитенантности из коробки. Перед переносом стоит проверить реальный профиль запросов: если преобладают агрегаты за часы и дни, ClickHouse показывает преимущество по скорости и стоимости. Если же основная нагрузка — единичные чтения по trace ID, разница с Cassandra будет меньше. Ссылки на бенчмарки и схему таблиц приведены в исходной статье VK.
Источник
Это краткий разбор материала VK. Полная версия с примерами кода, схемами и деталями реализации — в оригинале: ClickHouse для Jaeger трейсов.
Курс по теме — Построение DWH на ClickHouse


