본문으로 건너뛰기

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개(전체 카디널리티 수)