Перейти к основному содержимому
Перейти к основному содержимому

Сэмплирование трейсов

Сервисы с высокой пропускной способностью могут генерировать миллионы спанов в секунду. Хранить каждый спан дорого, поэтому команды обычно используют процессор tail-sampling в OpenTelemetry collector, чтобы сохранять только один спан из N. Каждый сохранённый спан несёт атрибут SampleRate, в котором записано значение N.

После применения выборки наивные агрегации дают неверный результат: count() возвращает в N раз меньше событий, чем произошло на самом деле, sum() и avg() оказываются смещёнными, а процентильные значения сдвигаются. Дашборды показывают обманчиво низкие значения числа запросов, пропускной способности и частоты ошибок.

ClickStack решает эту проблему с помощью движка запросов, учитывающего выборку. Когда вы настраиваете выражение коэффициента выборки для источника трейсов, конструктор запросов переписывает SQL-агрегации так, чтобы вес каждого спана соответствовал его коэффициенту выборки, — во всех дашбордах, оповещениях и ad hoc-поисках.

Как это работает

Если для источника трейсов задано sampleRateExpression, ClickStack оборачивает его так:

greatest(toUInt64OrZero(toString(expr)), 1)

Спаны без атрибута SampleRate по умолчанию имеют вес 1, поэтому данные без выборки дают те же результаты, что и исходные запросы.

Затем конструктор запросов переписывает агрегатные выражения:

АгрегацияДоПосле (с поправкой на выборку)
countcount()sum(weight)
count + conditioncountIf(cond)sumIf(weight, cond)
avgavg(col)sum(col * weight) / sum(weight)
sumsum(col)sum(col * weight)
quantile(p)quantile(p)(col)quantileTDigestWeighted(p)(col, weight)
min / maxбез измененийбез изменений
count_distinctбез измененийбез изменений
Примечание

Для процентилей при выборке используется quantileTDigestWeighted — приближённый скетч T-Digest. Результаты близки к точным, но не совпадают с ними полностью.

Настройка выражения коэффициента выборки

Откройте источник трейсов в Настройках источника и введите в поле Sample Rate Expression выражение ClickHouse, которое вычисляет коэффициент выборки для каждого спана.

Например, если ваш процессор tail-sampling в OpenTelemetry записывает это значение в SpanAttributes['SampleRate']:

Поле Sample Rate Expression в настройках источника ClickStack

После настройки все графики, дашборды, оповещения и панели дашборда сервиса автоматически применяют агрегации с учетом выборки. Отдельные запросы менять не нужно.