본문으로 건너뛰기

OpenMetrics 카디널리티

정보

OpenMetrics 카디널리티 문서의 목적

Prometheus 형식으로 노출된 지표를 저장한 후, 간단한 스크립트로 지표별 카디널리티를 직접 계산할 수 있습니다.
이를 통해 고객 환경에서 어떤 지표가 얼마나 다양한 레이블 조합을 가지는지 확인할 수 있습니다.

카디널리티란?​

카디널리티(Cardinality)는 특정 지표(metric)에서 값(value)을 제외한 모든 레이블(label) 조합의 고유 개수를 의미합니다. 같은 지표 이름을 가진 데이터라도 레이블 구성이 동일하다면 하나로 취급합니다.

예시

00:00   http_requests_total{url="/hello"}                                         값: 100

00:00   http_requests_total{url="/hello", name="whatap"}          값: 93

00:01   http_requests_total{url="/hello", name="whatap"}          값: 114

00:01   http_requests_total{url="/hello"}                                         값: 5

위 데이터는 총 네 개지만, 레이블 구성을 기준으로 하면 다음과 같이 두 개로 계산됩니다.

  • url="/hello" → 1개
  • url="/hello", name="whatap" → 1개

따라서 이 지표의 카디널리티는 2입니다.


카디널리티 확인 방법​

고객 환경에서 실제 수집되는 지표의 카디널리티를 직접 확인하려면 Prometheus 형식으로 노출된 지표를 기반으로 계산해야 합니다.

Step 1. Prometheus 지표 파일 추출​

Prometheus 형식의 지표를 노출하는 endpoint(/metrics)를 호출하여 텍스트 파일로 저장합니다.
9100 포트는 Prometheus Node Exporter의 예시이며, 환경에 맞는 endpoint 주소를 입력하면 됩니다.

curl -s http://localhost:9100/metrics > metrics.txt

Step 2. 지표 형식 확인​

저장된 파일(metrics.txt)의 데이터는 일반적으로 다음과 같은 형태를 가집니다.
여기서 카디널리티 계산의 기준은 metric_name + 레이블 조합입니다.

metric_name{label1="value1",label2="value2"} 123

Step 3. 카디널리티 계산​

아래 명령어를 실행하면 각 지표(metric_name)별로 고유한 레이블 조합의 개수를 계산할 수 있습니다.

쉘 스크립트를 다운로드 받은 뒤 아래 명령어를 실행합니다. count_cardinality.sh 다운로드

chmod +x count_cardinality.sh
./count_cardinality.sh metrics.txt

만약 쉘스크립트를 다운로드 받아서 실행할 수 없는 환경이라면, 명령어를 직접 복사하여 실행합니다.

grep -v '^#' metrics.txt \
| awk -F'{' '{
if (NF > 1) {
name=$1
} else {
split($1, arr, " ")
name=arr[1]
}
count[name]++
total++
}
END {
for (n in count) {
print n, count[n]
}
print "총합", total
}' | sort

Step 4. 결과 해석​

실행 결과는 다음과 같습니다. 각 지표의 카디널리티의 수와 카디널리티 총합을 나타냅니다.

apiserver_flowcontrol_priority_level_request_utilization_bucket 44
go_gc_duration_seconds_count 1
go_gc_duration_seconds_sum 1
process_cpu_seconds_total 1
총합 47
  • apiserver_flowcontrol_priority_level_request_utilization_bucket: 44개의 고유 레이블 조합
  • go_gc_duration_seconds_count: 1개의 고유 레이블 조합
  • go_gc_duration_seconds_sum: 1개의 고유 레이블 조합
  • process_cpu_seconds_total: 1개의 고유 레이블 조합
  • 총합: 47개(전체 카디널리티 수)