처리량이 높은 서비스는 초당 수백만 개의 스팬을 생성할 수 있습니다. 모든 스팬을 저장하는 데는 비용이 많이 들기 때문에, 팀에서는 일반적으로 OpenTelemetry Collector의 tail-sampling 프로세서를 사용해 N개 중 1개의 스팬만 유지합니다. 유지된 각 스팬에는 N을 기록하는 SampleRate 속성이 포함됩니다.
데이터가 샘플링되면 단순 집계는 잘못된 결과를 냅니다. count()는 실제 발생한 이벤트보다 N배 적은 값을 반환하고, sum()과 avg()는 편향되며, 백분위수도 달라집니다. 그 결과 대시보드에는 요청 수, 처리량, 오류율이 실제보다 낮게 표시되어 잘못된 인상을 줄 수 있습니다.
ClickStack은 샘플링을 고려하는 쿼리 엔진으로 이 문제를 해결합니다. 트레이스 소스에 샘플 비율 표현식을 설정하면, 쿼리 빌더가 SQL 집계를 재작성해 각 스팬에 샘플 비율에 따른 가중치를 적용합니다. 이 방식은 대시보드, 알림, 애드혹 검색 전반에 걸쳐 적용됩니다.
작동 방식
트레이스 소스에 sampleRateExpression이 구성되면 ClickStack은 이를 다음과 같이 래핑합니다:
greatest(toUInt64OrZero(toString(expr)), 1)SampleRate 속성이 없는 스팬은 기본적으로 가중치 1로 처리되므로, 샘플링되지 않은 데이터는 원래 쿼리와 동일한 결과를 반환합니다.
그다음 쿼리 빌더는 집계를 다음과 같이 재작성합니다:
| 집계 | 이전 | 이후(샘플 보정 적용) |
|---|---|---|
| count | count() |
sum(weight) |
| count + condition | countIf(cond) |
sumIf(weight, cond) |
| avg | avg(col) |
sum(col * weight) / sum(weight) |
| sum | sum(col) |
sum(col * weight) |
| quantile(p) | quantile(p)(col) |
quantileTDigestWeighted(p)(col, weight) |
| min / max | 변경 없음 | 변경 없음 |
| count_distinct | 변경 없음 | 변경 없음 |
샘플 비율 표현식 설정하기
Source Settings에서 트레이스 소스를 열고, Sample Rate Expression 필드에 스팬별 샘플 비율을 계산하는 ClickHouse 표현식을 입력합니다.
예를 들어, OpenTelemetry tail-sampling 프로세서가 비율을 SpanAttributes['SampleRate']에 기록하는 경우:

설정을 마치면 모든 차트, 대시보드, 알림, 서비스 대시보드 패널에 샘플 비율 가중 집계가 자동으로 적용됩니다. 개별 쿼리는 변경할 필요가 없습니다.