높은 카디널리티 알림 예제

높은 카디널리티 알림 예제 (Examples of high-cardinality alerts)

Prometheus와 Mimir에서 메트릭은 시계열(time series)로 저장되며, 고유한 라벨 집합마다 별개의 시리즈를 정의해요. 고유 시리즈가 많아지는 것(높은 카디널리티)은 메트릭 백엔드에 과부하를 주고 대시보드·알림 쿼리를 느리게 하며, 관측성 비용을 키우거나 Grafana Cloud 플랜 한도를 초과하게 만들 수 있어요. 이 예제들은 높은 카디널리티의 조기 징후를 감지하고 알림하는 방법을 보여줘요.

출처: 문서

본문

다음 같은 징후를 감지해 높은 카디널리티 성장에 대응하고, 관측성 비용을 통제하려면 Adaptive Metrics 권장사항을 고려하세요:

  • 한도에 근접한 총 활성 시리즈: Prometheus, Mimir, Grafana Cloud Metrics 인스턴스가 소프트/하드 한도에 가까워지는 것을 감지
  • 메트릭·범위별 시리즈 증가: 특정 메트릭이나 도메인의 성장을 식별하도록 감지를 미세 조정
  • 갑작스러운 시리즈 성장: 설정이 잘못된 exporter나 새 배포로 인한 통제 불능 카디널리티 증가 감지
  • 높은 수집률: 총 시리즈 수는 안정적이어도 초당 샘플을 너무 많이 수집하는 것을 감지

활성 시리즈 모니터링 메트릭 선택

먼저 어떤 메트릭이 활성 시계열 수를 보고하는지 식별해요. Prometheus, Mimir, Grafana Cloud는 이 정보를 다르게 노출해요:

환경 메트릭 설명
Prometheus prometheus_tsdb_head_series 단일 Prometheus 인스턴스의 메모리(head block)에 현재 저장된 활성 시리즈 수 보고. 최대 1시간 동안 샘플 수신이 중단된 시리즈도 포함.
Grafana Cloud grafanacloud_instance_active_series Grafana Cloud Metrics 백엔드(Mimir)의 활성 시리즈 수 추적.
Prometheus 또는 Mimir count({__name__!=""}) TSDB 인덱스를 스캔해 최근 샘플이 있는 시리즈 수 집계. 이 쿼리는 비싸므로 레코딩 규칙으로 노출해야 함.

한도에 근접한 총 활성 시리즈 감지

활성 시리즈가 많아지면 메모리 사용량이 늘고 성능에 영향을 줄 수 있어요. Grafana Cloud는 이런 성능 문제를 막기 위해 사용량 한도를 적용해요. Prometheus에서는 총 활성 시리즈 수가 임계값을 초과하면 알림할 수 있어요:

prometheus_tsdb_head_series > 1.5e6

이것은 인스턴스가 활성 시리즈 150만 개를 초과하면 발화해요. Prometheus 호스트 용량과 관찰된 부하에 따라 임계값을 조정해요. Grafana Cloud에서는 grafanacloud_instance_active_series 메트릭으로 관리형 Mimir 백엔드의 활성 시리즈를 모니터링해요:

grafanacloud_instance_active_series > 1.5e6

Grafana Cloud는 grafanacloud_instance_metrics_limits 메트릭으로 계정 수준 한도도 제공해요. 더 견고한 알림을 위해 현재 사용량을 max_global_series_per_user 한도와 비교할 수 있어요:

(
  grafanacloud_instance_active_series
  / on (id)
    grafanacloud_instance_metrics_limits{limit_name="max_global_series_per_user"}
)
* on (id) group_left(name) grafanacloud_instance_info
> 0.9
  • grafanacloud_instance_active_series : Mimir(Prometheus) 데이터 소스 인스턴스(id)당 현재 활성 시리즈 수 반환
  • / on (id) grafanacloud_instance_metrics_limits{limit_name="max_global_series_per_user"} : 현재 사용량을 계정 한도로 나눠 0~1 사이의 사용률(1이면 한도 도달) 계산
  • * on (id) group_left(name) grafanacloud_instance_info : 인스턴스 이름을 표시하도록 인스턴스 메타데이터를 조인
  • > 0.9 : 사용량이 한도의 90%를 초과하면 발화하는 임계값 조건. 알림 목표에 따라 조정하거나, UI에서 Grafana Alerting 표현식으로 설정할 수 있음

메트릭별 높은 카디널리티 감지

총 활성 시리즈 수를 모니터링하는 대신, 특정 범위 내의 높은 카디널리티를 감지하도록 알림을 미세 조정할 수 있어요 — 예를 들어 많은 라벨 조합을 만드는 특정 네임스페이스, 서비스, 메트릭으로 필터링하는 방식이에요. 다차원 알림은 각 메트릭을 독립적으로 평가하게 해, 전체 합계만 보는 대신 라벨 폭발의 원인이 되는 메트릭을 식별할 수 있게 해요.

라벨 필터를 적용하거나 {__name__=~"regex"}로 특정 메트릭을 선택할 수 있어요. 그런 다음 count by (__name__)으로 메트릭 이름별로 결과를 그룹화해요. __name__ 선택자는 전체 TSDB 인덱스를 쿼리하므로 레코딩 규칙으로 쿼리하는 것이 좋아요:

# Only HTTP/RPC-style metrics
active_series_per_metric:http_rpc =
label_replace(
  count by (__name__) ({__name__=~"http_.*|rpc_.*"}),
  "metric", "$1", "__name__", "(.*)"
)

이 레코딩 규칙은 메트릭 이름별 활성 시리즈 수를 저장해요.

  • count by (__name__) ({__name__=~"http_.*|rpc_.*"}) : http_.* 또는 rpc_.* 정규식과 일치하는 메트릭별 활성 시리즈 수 집계
  • label_replace(..., "metric", "$1", "__name__", "(.*)") : 메트릭 이름을 metric이라는 새 라벨로 복사. __name__은 일반 라벨로 취급되지 않으므로 메트릭별 알림 인스턴스를 생성할 수 있게 함

레코딩 규칙이 준비되면 다음과 같이 다차원 알림 규칙을 정의할 수 있어요:

active_series_per_metric:http_rpc > 100

Grafana Alerting은 active_series_per_metric:http_rpc 레코딩 규칙이 반환한 각 행(시계열)을 별도의 알림 인스턴스로 평가해 독립적인 상태를 만들어요:

알림 인스턴스 상태
{metric="http_requests_total"} 320 Firing
{metric="rpc_client_calls_total"} 45 Normal
{metric="rpc_server_errors_total"} 110 Firing

각 메트릭 이름(__name__)이 별도의 알림 인스턴스가 되므로 어떤 메트릭이 예상 한도를 초과했는지 즉시 알 수 있어요.

갑작스러운 카디널리티 성장 감지

활성 시리즈 수가 적절한 한도 안에 있어도 갑작스러운 증가는 문제가 있는 exporter, 새 배포, 예상치 못한 라벨 폭발을 알릴 수 있어요. 이전 예제의 메트릭 중 하나로 총 활성 시리즈의 단기 변화를 추적할 수 있어요:

delta(active_series_metric[10m]) > 1000

이 알림은 지난 10분 동안 활성 시리즈 수가 1000개 이상 증가하면 발화해요. 환경의 정상 변동에 맞춰 시간 창(예: [5m][30m])과 임계값을 조정해요.

높은 수집률 감지

라벨 카디널리티가 통제되고 있어도 높은 수집률은 Prometheus 성능에 영향을 주거나 관측성 비용을 늘려요. Prometheus에서는 스크랩이 너무 자주 발생하거나 exporter가 짧은 간격에 많은 샘플을 생성할 때 흔히 발생해요. 적절한 임계값을 찾으려면 정상 수집 피크를 모니터링하고, 스크랩이나 WAL 작업이 느려지기 시작하는 지점 아래 값으로 설정해요.

Prometheus에서는 prometheus_tsdb_head_samples_appended_total 메트릭으로 스크랩당 추가된 샘플 수를 측정해요:

rate(prometheus_tsdb_head_samples_appended_total[10m]) > 1e5

이 규칙은 지난 10분간 초당 평균 수집률을 반환하고, 초당 100,000 샘플을 초과하면 발화해요. Grafana Cloud에서는 grafanacloud_instance_samples_per_second 메트릭으로 Mimir 인스턴스의 총 수집률을 모니터링해요:

grafanacloud_instance_samples_per_second
  * on (id) group_left(name) grafanacloud_instance_info
> 1e5

또는 Grafana Cloud 메트릭 한도는 DPM(분당 데이터 포인트), 즉 모든 활성 시리즈에서 분당 전송되는 샘플 수를 기반으로 해요. 실제 데이터 포인트 비율이 DPM 한도에 가까워지는 것을 모니터링하려면 총 수집량을 플랜의 DPM 한도와 비교해요:

(
  (grafanacloud_instance_samples_per_second * 60)
  / grafanacloud_org_metrics_included_dpm_per_series
)
> 0.9
  • (grafanacloud_instance_samples_per_second * 60) : 수집률을 초당 데이터 포인트에서 분당으로 변환
  • / grafanacloud_org_metrics_included_dpm_per_series : 현재 DPM 사용량을 DPM 한도로 나눠 0~1 사용률 계산
  • > 0.9 : 사용량이 DPM 한도의 90%를 초과하면 발화하는 임계값 조건

이 알림은 조직이 데이터를 더 빠르게 수집하며 한도에 접근하는 것을 감지하는 데 도움을 줘요. 수집률 알림은 워크로드 스파이크, exporter 설정 오류, 수집량·비용의 급증을 감지하는 데 써요.

더 알아보기 (Learn more)