LabHub

PCA — 프로메테우스 인증 어소시에이트 · 계측·익스포터·레코딩 룰 · 이론

접미사와 콜론은 규약이 아니라 계약이다

LabHub 에서 이어서 보기

한 줄 요약

프로메테우스의 메트릭 이름 규칙은 취향이 아니라 도구가 의존하는 계약입니다. _total 은 카운터라는 선언이고, _bucket·_sum·_count 는 히스토그램의 세 구성 요소이며, 콜론은 레코딩 룰에만 허용됩니다. 이름만 보고 무엇인지 알 수 있어야 대시보드와 알림이 서로를 믿을 수 있습니다.

왜 이게 필요했나

타입을 잘못 고르면 나중에 하고 싶은 계산이 원리적으로 불가능해집니다. 가장 흔한 사고는 지연 시간을 게이지로 기록하는 것입니다.

last_latency = Gauge("http_request_duration_seconds", "요청 처리 시간")last_latency.set(elapsed)   # 앞선 값들은 전부 사라진다

스크레이프 간격이 15초이고 초당 요청이 500건이면 7,500건 중 단 1건의 값만 저장됩니다. 나머지는 존재한 적도 없는 것이 됩니다. 이 시계열로는 p99 를 구할 수 없고, 나중에 데이터를 다시 처리해도 복원되지 않습니다.

어떻게 동작하나

익스포지션 포맷은 사람이 읽을 수 있는 텍스트입니다. 한 줄에 메트릭 이름, 중괄호 안의 레이블, 값이 들어가고 # HELP# TYPE 주석이 붙습니다. 표준 경로는 /metrics 이고, 다른 경로를 쓰면 스크레이프 설정에서 metrics_path 를 지정해야 합니다. OpenMetrics 는 이 포맷을 표준화한 것으로 exemplar 와 created timestamp 를 추가했습니다.

타입 네 가지

| 타입 | 노출되는 시계열 | 답하는 질문 |
| --- | --- | --- |
| Counter | x_total | 초당 얼마나 늘어나는가 (rate 필요) |
| Gauge | x | 지금 값이 얼마인가 |
| Histogram | x_bucket{le}, x_sum, x_count | 분포가 어떤가 (서버에서 분위수 추정) |
| Summary | x{quantile}, x_sum, x_count | 이 프로세스 안에서의 분위수 |

Summary 가 서비스 수준에서 쓸모없는 이유는 앞 모듈에서 다룬 성질 하나 때문입니다. 분위수는 합칠 수 없습니다. Summary 는 클라이언트가 이미 계산해 버린 분위수를 내보내므로, 파드 40개의 p99 를 하나로 합칠 방법이 없습니다. Histogram 은 정확도를 버킷 해상도만큼 포기하는 대신 집계 가능성을 얻습니다. 분산 시스템에서는 거의 항상 후자가 맞는 거래입니다.

어디서 나오는 메트릭인가도 시험 단골입니다.

레코딩 룰은 계산을 쿼리 시점에서 평가 시점으로 옮깁니다. 만들 기준은 넷입니다. 같은 표현식이 세 곳 이상에서 반복될 때, 쿼리가 2초를 넘을 때, 알림이 무거운 표현식을 매 평가마다 돌릴 때, 고카디널리티 원본을 집계해 오래 보관하고 싶을 때.

이름은 수준:메트릭:연산 규약을 따릅니다. route:http_requests:rate5m 을 보면 라우트 수준으로 집계된 요청 수의 5분 rate 라는 것이 이름만으로 읽힙니다. 콜론은 원본 메트릭 이름에는 절대 쓰지 않기 때문에 이름만 보고 "이건 파생된 시계열"임을 알 수 있습니다.

계층 구조가 핵심입니다. 계층 1이 원본을 한 번 스캔해 놓으면 계층 2는 그 결과만 참조하므로 원본 스캔이 한 번으로 끝납니다. 다만 그룹 안에서는 위에서 아래로 평가되므로 계층 1이 계층 2보다 위에 있어야 합니다.

현장에서 만나는 모습

레코딩 룰 2,000개를 한꺼번에 넣었다가 약 100만 시계열이 생기고 WAL 이 폭증한 적이 있습니다. 배포 전 계산은 간단합니다. 라우트가 120개인데 윈도 5종에 대해 각각 규칙을 만들면 600개, 규칙이 50개면 3만 개입니다. 룰 파일은 코드처럼 리뷰하지만 비용은 새 메트릭과 같습니다.

검증은 CI 에서 돕니다. promtool check rules 로 문법을, promtool test rules 로 기대값을 확인합니다. 특히 단위 테스트에 기대값을 직접 계산해 적어 두면, 나중에 누군가 규칙을 "최적화"하다가 의미를 바꿨을 때 CI 가 잡아냅니다. promtool 이 잡아 주지 못하는 것도 있습니다 — 규칙끼리의 순환 참조는 사람이 리뷰에서 봐야 합니다.

다음 실습에서 할 것

/root/pca-rules/ 아래에 레코딩 룰 파일과 알림 룰 파일을 쓰고, level:metric:operations 네이밍으로 2단 계층을 만듭니다. 그다음 promtool 단위 테스트 파일에 입력 시계열과 기대값을 직접 계산해 넣고, 마지막으로 같은 내용을 Prometheus Operator 가 읽는 PrometheusRule CR 로 옮깁니다.