메트릭
시스템이 도는 동안 나오는 것을 수치로 재서 시간 순으로 쌓아 둔 값입니다. 언제 얼마였는지가 남으니 지금 값을 아까 값과 견줄 수 있습니다. 대신 사건 하나하나의 사연은 남지 않습니다.
상세
차를 몰 때 계기판을 봅니다. 속도계는 지금 속도를 가리키고 주행거리계는 지금까지 달린 거리를 가리킵니다. 메트릭은 그 눈금을 일정한 간격으로 받아 적어 두는 쪽입니다.
재는 순간의 값만 내놓으면 아까 값과 견줄 수 없습니다. 잰 값을 시각과 함께 남겨 두어야 시각마다의 값이 줄로 쌓입니다.
메트릭 하나는 네 가지가 붙어 다니는 값입니다. 무엇을 잰 것인지 가리키는 이름, 잰 시각, 그때의 수치, 그리고 그 수치가 무엇에 대한 것인지 갈라 주는 이름표입니다. 이름표는 라벨이라고도 하고 차원이라고도 부릅니다. 이름이 같아도 이름표가 다르면 서로 다른 계열입니다. 한 계열은 시각과 값의 쌍이 시간 순으로 이어진 줄입니다. 이 줄을 시계열이라고 부릅니다.
단위가 함께 정해집니다. 같은 이름이라도 초를 잰 것과 밀리초를 잰 것은 다른 값입니다. 값 타입도 정해집니다. 정수로 세는 것과 소수로 재는 것이 갈립니다.
이름표를 잘게 나눌수록 볼 수 있는 것이 늘어납니다. 전체를 하나로만 재면 어느 쪽이 어긋났는지 못 가립니다. 대신 이름표 값의 가짓수만큼 계열이 늘어납니다.
수치라서 더하고 나누고 시간 구간마다 하나로 접을 수 있습니다. 이렇게 접는 일을 집계라고 부릅니다. 접는 순간 그 구간 안에서 무슨 일이 있었는지는 사라집니다. 메트릭이 적게 남기는 대신 사연을 잃는 자리가 여기입니다.
배경
시스템이 무슨 일을 했는지 남기는 첫 방법은 사건마다 한 줄씩 적는 것입니다. 그 줄에는 시각과 사연이 함께 들어갑니다. 그런데 되묻는 질문의 상당수는 사연이 아니라 개수입니다. 지금 초당 몇 건을 받고 있는지, 응답에 몇 밀리초가 걸리는지, 메모리를 얼마나 쓰고 있는지입니다. 줄을 아무리 잘 적어 두어도 그 답을 얻으려면 줄을 전부 세어야 합니다. 줄 수는 사건 수만큼 늘어납니다.
그래서 세거나 잴 수 있는 것만 따로 뽑아 남기게 됐습니다. 사건마다 줄을 남기는 대신 값을 일정한 간격으로 남깁니다. 그러면 남는 양이 사건 수가 아니라 시간과 계열 수에 매입니다. 사건이 열 배로 늘어도 남는 줄은 그대로입니다. 대신 어느 요청이 왜 실패했는지는 여기서 알 수 없습니다. 그 몫은 사건마다 줄을 적는 로그가 계속 맡습니다.
이렇게 재서 남긴 값을 메트릭이라고 부릅니다. 재는 대상은 자리마다 다릅니다. 코드의 복잡도를 재면 코드 메트릭이고 모델의 정확도를 재면 평가 메트릭입니다. 재서 얻은 수치라는 뜻은 어느 자리에서나 같습니다.
예시
성격이 다른 세 자리를 봅니다. 모니터링 시스템이 긁어 가는 노출 한 줄, 클라우드 서비스가 관리하는 메트릭, 운영체제 커널이 파일로 내놓는 누적값입니다.
Prometheus 의 노출 한 줄
http_requests_total{method="post",code="200"} 1027 1395066363000
http_requests_total{method="post",code="400"} 3 1395066363000
http_requests_total 이 이름입니다. 중괄호 안의 method 와 code 가 이름표이고, 그 뒤의 1027 과
3 이 값입니다. 마지막 1395066363000 이 시각입니다. 이름이 같아도 code 가 200 인 줄과 400 인
줄은 서로 다른 계열입니다. 두 줄 위에는 이 메트릭의 설명을 적는 줄과 타입을 counter 로 선언하는 줄이
함께 실립니다.
Amazon CloudWatch 의 네임스페이스와 차원
CloudWatch 문서는 메트릭을 이 서비스로 올려지는, 시간 순으로 늘어선 데이터 포인트의 집합이라고 적습니다. 감시할 변수 하나가 메트릭이고 데이터 포인트가 그 변수의 시간에 따른 값이라고 설명합니다. 예로 드는 것이 특정 EC2(Elastic Compute Cloud) 인스턴스의 CPU(Central Processing Unit, 중앙처리장치) 사용률입니다.
이름표는 이 자리에서 차원이라고 부릅니다. 차원은 이름과 값의 쌍이고 메트릭의 신원을 이루는 일부입니다. 메트릭 하나에 차원을 30개까지 붙일 수 있습니다. 이름과 값의 새 조합을 하나 더하면 그 메트릭의 새로운 변종이 하나 생깁니다.
메트릭은 네임스페이스라는 통 안에 들어갑니다. 네임스페이스가 다르면 서로 격리되어 다른
애플리케이션의 메트릭이 같은 통계로 잘못 묶이지 않습니다. 기본 네임스페이스가 없어서 데이터 포인트를
올릴 때마다 지정해야 합니다. Amazon EC2 는 aws/ec2 네임스페이스를 씁니다. 통계는 지정한 기간마다
메트릭 데이터를 접은 값이고, 네임스페이스·메트릭 이름·차원·단위를 묶어서 냅니다.
커널이 파일로 내놓는 누적 카운터
cpu 237902850 368826709 106375398 1873517540 1135548 0 14507935 0 0 0
cpu0 60045249 91891769 26331539 468411416 495718 0 5739640 0 0 0
cpu1 59746288 91759249 26609887 468860630 312281 0 4384817 0 0 0
리눅스 커널 문서는 커널 활동에 대한 여러 정보가 /proc/stat 파일에 있다고 적습니다. 이 파일에 적힌
숫자는 전부 시스템이 처음 부팅한 뒤로의 누적값입니다. cat 으로 그대로 읽어 볼 수 있습니다.
이름표가 붙어 있지 않습니다. 어느 값인지는 줄 이름과 자리로 정해집니다. cpu 줄 다음에 cpu0 ·
cpu1 이 이어집니다. 앞의 두 예시가 이름표로 계열을 갈랐다면, 여기서는 줄과 자리가 그 일을 합니다.
갈래
잰 값을 시간에 대해 어떻게 다루느냐가 축입니다. 계속 쌓아 올리는 값인지, 그때그때의 값인지, 여러 관측을 한 덩이로 묶은 분포인지로 갈립니다. 이 갈림을 부르는 이름은 자리마다 다릅니다.
counter
쌓이기만 하는 값입니다. Prometheus 문서는 counter 를 단조 증가하는 하나의 카운터를 나타내는 누적 메트릭이라고 적습니다. 값은 올라가거나, 재시작할 때 0으로 되돌아갈 수만 있습니다. 처리한 요청 수, 끝낸 작업 수, 오류 수가 여기에 들어갑니다.
줄어들 수 있는 값을 노출하는 데는 쓰지 말라고 못 박습니다. 지금 돌고 있는 프로세스 수가 그 예입니다. 그건 gauge 쪽입니다.
gauge
오르내리는 값입니다. Prometheus 문서는 gauge 를 임의로 오르내릴 수 있는 하나의 수치라고 적습니다. 온도나 현재 메모리 사용량처럼 재서 얻는 값에 대개 씁니다. 동시 요청 수처럼 오르내리는 개수도 여기에 들어갑니다.
histogram
관측을 버킷에 세어 넣습니다. 요청 소요 시간이나 응답 크기 같은 것을 대개 관측이라고 부릅니다. 버킷 경계는 설정으로 정합니다. 관측한 값 전체의 합도 함께 내놓습니다. Prometheus 문서는 histogram 을 사실상 버킷으로 나눈 counter 라고 적습니다.
문서가 고전 histogram 이라고 부르는 쪽은 기본 이름이 <basename> 이면 다음 계열들로 펼쳐집니다.
버킷별 누적 개수가 <basename>_bucket{le="<상한 포함>"}, 관측한 값의 합이 <basename>_sum, 관측한
이벤트의 수가 <basename>_count 입니다. 마지막 것은 le 가 +Inf 인 버킷과 같습니다.
summary
histogram 과 비슷하게 관측을 표본으로 받습니다. 관측 횟수와 관측한 값의 합을 함께 내놓는 것도
같습니다. 다른 것은 분위수입니다. summary 는 미끄러지는 시간 창 위에서 설정한 분위수를 계산합니다.
기본 이름이 <basename> 이면 스크레이프 한 번에 <basename>{quantile="<φ>"} 와 <basename>_sum ·
<basename>_count 가 함께 나옵니다.
sequenceDiagram
participant 프로그램
participant 서버
Note over 프로그램: summary — 분위수를 여기서 계산
프로그램->>서버: 분위수 값을 그대로 노출
Note over 프로그램: histogram — 버킷별 관측 수만
프로그램->>서버: 버킷 개수를 노출
Note over 서버: histogram_quantile() 로 분위수 계산
Prometheus 문서는 summary 와 histogram 의 본질적인 차이가 여기라고 적습니다. summary 는 계측된
프로그램 안에서 흐르는 φ 분위수를 계산해 그대로 노출합니다. histogram 은 버킷별 관측 수를 노출하고,
버킷에서 분위수를 계산하는 일은 Prometheus 서버가 histogram_quantile() 함수로 합니다.
OpenTelemetry 의 어휘
같은 갈림을 다른 이름으로 부르는 자리가 있습니다. OpenTelemetry 의 Sum 은 델타인지 누적인지를 가리키는 집계 시간성과, 이 합이 단조인지를 가리키는 표시를 함께 답니다. 델타이면서 단조인 Sum 은 읽는 쪽이 음수가 아닌 값을 기대해야 하고, 누적이면서 단조인 Sum 은 앞 값보다 작지 않은 값을 기대해야 합니다. 데이터 포인트마다 이름과 값의 쌍 묶음, 수치, 그리고 그 합을 계산한 시간 창이 붙습니다.
Gauge 는 주어진 시각에 표본으로 뜬 값입니다. 데이터 포인트마다 이름과 값의 쌍 묶음, 표본으로 뜬 값, 그 값을 뜬 시각이 붙습니다. Histogram 은 기록한 측정값 여럿을 압축된 형태로 나르고 전체 이벤트 수와 합을 함께 답니다. ExponentialHistogram 은 Histogram 을 대신하는 표현으로, 버킷 경계를 지수 공식으로 압축해서 비슷한 크기의 다른 표현에 비해 작은 상대 오차로 넓은 동적 범위를 나릅니다.
관련 항목
메트릭을 이루는 구성 요소
시계열 · 라벨 · 차원 · 네임스페이스 · 데이터 포인트 · 타임스탬프 · 단위
메트릭의 하위 종류
counter · gauge · histogram · summary
메트릭에 적용되는 연산·성질
집계 · 분위수 · 백분위수 · 카디널리티 · 버킷 · 단조 증가 · 격리
메트릭을 실제로 다루는 시스템·서비스
Prometheus · OpenTelemetry · CloudWatch · 시계열 데이터베이스 · EC2
메트릭이 전달되는 경로
스크레이핑 · 노출 포맷 · OpenMetrics · 익스포터 · /proc/stat
메트릭 사례가 걸치는 도메인
메트릭이 재는 지표
지연 · 처리량 · 오류율 · 포화도 · 가용성 · p99 · SLI(Service Level Indicator, 서비스 수준 지표) · SLO(Service Level Objective, 서비스 수준 목표) · 네 가지 황금 신호 · CPU
메트릭을 다루는 실천·활동
메트릭과 함께 관측성을 이루는 신호
메트릭 규모를 다루며 겪는 문제
다른 이름: metric · metrics