weighted()는 어떻게 동작하나요?
모든 메트릭 쿼리에는 표준 평가 순서가 있어요(빠른 복습은 쿼리의 구조 참고). 예를 들어 다음 쿼리는 이렇게 계산돼요: sum:kubernetes.cpu.requests{*} by {kube_container_name}.rollup(avg, 10)
출처: 문서
본문
모든 메트릭 쿼리에는 표준 평가 순서가 있어요(빠른 복습은 쿼리의 구조를 참고하세요). 예를 들어 다음 쿼리는 다음과 같이 계산됩니다: sum:kubernetes.cpu.requests{*} by {kube_container_name}.rollup(avg, 10)
- 시간 집계(Time aggregation) – 각 10초 롤업 시간 간격 동안, 각 timeseries(고유한 태그 값 조합으로 정의)의 값을 시간에 따라 평균낸다. 고유 태그 값 조합의 수는 이 메트릭에서 가장 변동이 크고/입도(granularity)가 높은 태그(예:
container_id)에 의해 결정돼요. - 그다음
kube_container_name별(공간 집계, space aggregation)로, 평균낸 모든 값의 합을 단일 대표 값으로 취한다. 각kube_container_name에 대한 합산 값은 각 롤업 간격에 존재하는 고유container_id의 수에 따라 달라져요.
weighted() 함수는 이 gauge 메트릭을 kube_container_name으로 합산할 때 container_id 태그 값의 짧은 수명을 고려해 줘요.
예시
다음 쿼리를 가정해 봅시다: sum:kubernetes_state.pod.uptime{*} by {version}.rollup(avg, 10)
- gauge 메트릭의 제출 간격은 10초로 정의된다.
- 데이터포인트는 시간상 60초마다 그래프로 그려진다.
- 어느 시점에든 2개 버전을 가진 Kubernetes 파드가 있다. 각 버전은 앱으로 라벨링되고, 앱당 버전은 항상 1개뿐이다.
60초 동안의 원시 데이터는 다음과 같을 수 있어요:
| Time | 0s | 10s | 20s | 30s | 40s | 50s |
|---|---|---|---|---|---|---|
app:a, version:1 |
12 | NAN | NAN | NAN | NAN | NAN |
app:b, version:1 |
NAN | 12 | 12 | 12 | NAN | NAN |
app:c, version:1 |
NAN | NAN | NAN | NAN | 12 | 12 |
app:d, version:2 |
12 | NAN | NAN | NAN | NAN | NAN |
app:e, version:2 |
NAN | 16 | 16 | 16 | NAN | NAN |
app:f, version:2 |
NAN | NAN | NAN | NAN | 18 | 18 |
- 시간 집계 – 데이터 롤업 시간 집계에서는 데이터를
avg(weighted 없음) 또는 제안된weighted평균으로 롤업해요:
| Time aggregation | .rollup(avg) | With .weighted() |
|---|---|---|
app:a, version:1 |
12 | 2.0 |
app:b, version:1 |
12 | 6.0 |
app:c, version:1 |
12 | 4.0 |
app:d, version:2 |
12 | 2.0 |
app:e, version:2 |
16 | 8.0 |
app:f, version:2 |
18 | 6.0 |
- 공간 집계 마지막으로 메트릭을 version으로 집계해 아래 최종 값을 얻어요:
| Space aggregation by version | .rollup(avg) | With .weighted() |
|---|---|---|
version:1 |
36 | 12 |
version:2 |
46 | 16 |
weighted() 함수는 값들을 제출률(submission rate)에 대해 가중치를 부여함으로써 단기 수명 태그에서 발생하는 비일관적인 동작을 해결해 줘요.
더 알아보기 (Learn more)
도움이 되는 추가 문서, 링크, 아티클이에요: