알림 인스턴스의 동적 라벨 예제

알림 인스턴스의 동적 라벨 예제 (Example of dynamic labels in alert instances)

라벨은 알림 시스템을 확장하는 데 필수 요소예요. severity, team, category, environment 같은 메타데이터를 정의하며 알림 라우팅에 사용할 수 있어요. 이 예제는 쿼리 값을 기반으로 동적 라벨을 정의하는 방법과 함께, 동적 라벨 값을 쓸 때 염두에 둬야 할 핵심 동작을 보여줘요.

출처: 문서

본문

severity="critical" 같은 라벨은 알림 규칙 설정에 정적으로 설정하거나, 현재 남은 디스크 공간 같은 쿼리 값을 기반으로 동적으로 설정할 수 있어요. 동적 라벨은 런타임에 라벨 값을 조정해서, 같은 알림 규칙을 다양한 시나리오에 재사용할 수 있게 해요.

알림 인스턴스는 라벨로 정의돼요

각 알림 규칙은 라벨의 유일한 조합마다 별도의 알림 인스턴스를 만들어요. 이를 다차원 알림(multi-dimensional alerts)이라 해요 — 하나의 규칙, 많은 인스턴스(고유 라벨 집합마다 하나). 예를 들어 호스트별 CPU 사용량을 쿼리하는 규칙은 다음처럼 여러 시리즈(차원)를 반환할 수 있어요:

  • {alertname="ServerHighCPU", instance="prod-server-1"}
  • {alertname="ServerHighCPU", instance="prod-server-2"}
  • {alertname="ServerHighCPU", instance="prod-server-3"}

각 고유 라벨 조합은 자기만의 평가 상태와 잠재적 알림을 가진 별개의 알림 인스턴스를 정의해요. 알림 인스턴스의 전체 라벨 집합은 다음을 포함할 수 있어요:

  • 쿼리 결과의 라벨(예: instance)
  • 자동 생성된 라벨(예: alertname)
  • 규칙 구성의 사용자 정의 라벨

사용자 정의 라벨 (User-defined labels)

알림 인스턴스는 자동으로 쿼리 결과의 라벨(instance, job 등)을 포함해요. 더 많은 맥락을 추가하거나 라벨로 알림 라우팅을 제어하려면 규칙 구성에서 사용자 정의 라벨을 정의할 수 있어요. 사용자 정의 라벨은 두 종류가 있어요:

  • 고정 라벨(Fixed labels): 모든 알림 인스턴스에 대해 같은 값을 가져요. 팀 담당자 같은 공통 메타데이터를 넣을 때 흔히 써요.
  • 템플릿 라벨(Templated labels): 평가 시점에 쿼리 결과를 기반으로 값을 계산해요.

템플릿 라벨 (Templated labels)

템플릿 라벨은 쿼리 결과를 기반으로 값을 동적으로 평가해요. 이렇게 해서 라벨 값이 알림 인스턴스마다 달라질 수 있어요. 알림에 추가 맥락을 주입하는 데 쓰며, 문법과 사용 사례는 Template annotations and labels에서 배울 수 있어요.

인스턴스당 고정 값

기존 라벨에 없던 추가 메타데이터로 알림을 풍부하게 하려면 알려진 라벨 값을 쓸 수 있어요. 예를 들어 instance 라벨을 배포 환경을 나타내는 env 라벨에 매핑할 수 있어요:

{{- if eq $labels.instance "prod-server-1" -}}production
{{- else if eq $labels.instance "stag-server-1" -}}staging
{{- else -}}development
{{- end -}}

이렇게 하면 다음 같은 알림 인스턴스가 생성돼요:

  • {alertname="ServerHighCPU", instance="prod-server-1", env="production"}
  • {alertname="ServerHighCPU", instance="stag-server-1", env="staging"}

이 예제에서 env 라벨은 각 인스턴스에 대해 고정이며 수명 주기 동안 변하지 않아요.

인스턴스당 동적 값

쿼리의 수치 결과에 따라 값이 달라지는 라벨을 정의할 수 있어요 — 미리 정의된 옵션 집합으로 매핑해서요. 단일 알림 규칙 안에서 심각도(severity) 수준을 나타낼 때 유용해요. 세 개의 별도 규칙(CPU ≥ 90 → critical, ≥ 80 → warning, ≥ 70 → minor) 대신, 템플릿을 사용해 하나의 규칙으로 severity를 동적으로 할당할 수 있어요:

{{/* $values.B.Value refers to the numeric result from query B */}}
{{- if gt $values.B.Value 90.0 -}}critical
{{- else if gt $values.B.Value 80.0 -}}warning
{{- else if gt $values.B.Value 70.0 -}}minor
{{- else -}}none
{{- end -}}

이 패턴으로 여러 알림 시나리오를 하나의 규칙으로 표현하면서도 severity 라벨 값에 기반해 라우팅할 수 있어요.

예제 개요

앞선 심각도 템플릿에서 알림 조건을 $B > 70으로 설정해 severity=none일 땐 발화하지 않게 하고, severity 라벨로 서로 다른 알림 인스턴스를 다른 연락 지점(contact point)으로 보낼 수 있어요. 예를 들어 alertname="ServerHighCPU"에 일치하는 알림 정책 아래 자식 정책을 이렇게 구성할 수 있어요:

  • severity=critical → IRM(사고 대응·관리 솔루션)으로 에스컬레이션
  • severity=warning → 팀 Slack 채널로 전송
  • severity=minor → 긴급하지 않은 큐나 로그 전용 대시보드로 전송

결과적인 알림 흐름은 다음과 같을 수 있어요:

시간 $B 쿼리 알림 인스턴스 라우팅 대상
t1 65 {alertname="ServerHighCPU", severity="none"} 발화 안 함
t2 75 {alertname="ServerHighCPU", severity="minor"} 긴급하지 않은 큐
t3 85 {alertname="ServerHighCPU", severity="warning"} 팀 Slack 채널
t4 95 {alertname="ServerHighCPU", severity="critical"} IRM 에스컬레이션 체인

이 설정으로 여러 심각도 수준에 하나의 규칙을 쓰고, 라벨 값으로 알림을 동적 라우팅하며, 규칙 유지보수를 단순화할 수 있어요.

주의사항: 라벨 변경은 별개의 인스턴스에 영향을 줘요

기억하세요: 알림 인스턴스는 라벨로 정의돼요. 동적 라벨이 평가 사이에 바뀌면, 그 새 값은 별도의 알림 인스턴스에 영향을 줘요. severityminor에서 warning으로 바뀌는 경우를 보면:

  • severity="minor" 인스턴스가 사라져요 → missing series가 돼요.
  • severity="warning" 인스턴스가 나타나요 → 처음부터 시작해요.
  • 데이터 없는 평가가 두 번 지나면 minor 인스턴스는 resolved·evicted 돼요.
시간 쿼리 값 인스턴스 severity="none" 인스턴스 severity="minor" 인스턴스 severity="warning"
t1 75 🔴 📩
t2 85 ⚠️ MissingSeries 🔴 📩
t4 50 🟢 📩 Resolved and evicted ⚠️ MissingSeries
t6 50 🟢 📩 Resolved and evicted

여기서 minorwarning 알림은 같은 근본 문제를 나타낼 가능성이 높지만, Grafana는 둘을 별개의 인스턴스로 취급해요. 결과적으로 이 시나리오는 각 인스턴스에 대해 두 개의 발화 알림과 두 개의 해제 알림을 생성해요. 동적 라벨 값이 자주 바뀌면 짧은 간격으로 여러 알림이 발화·해제되어 시끄럽고 혼란스러운 알림이 될 수 있어요.

TestData로 시도해 보기

TestData 데이터 소스로 시끄러운 센서를 모니터링하는 듯한 불안정한 신호를 만들어 이 시나리오를 재현할 수 있어요:

  • Connections 메뉴를 통해 TestData 데이터 소스를 추가해요.
  • Alerting → Alert rules로 이동해 New alert rule을 클릭해요.
  • 시끄러운 신호를 반환하는 쿼리($A)를 시뮬레이션해요. TestData 데이터 소스에서 Scenario: Random Walk, Series count: 1, Start value: 51, Min: 50, Max: 100, Spread: 100으로 설정해요.
  • Reduce 표현식을 추가해요. Type: Reduce, Input: A, Function: Last, Name: B.
  • 알림 조건을 정의해요. $B >= 50(항상 발화) 같은 임계값을 써요.
  • Edit Labels를 클릭해 동적 라벨을 추가해요. severity 라벨을 만들고 다음 값을 설정해요:
{{/* $values.B.Value refers to the numeric result from query B */}}
{{- if gt $values.B.Value 90.0 -}}P1
{{- else if gt $values.B.Value 80.0 -}}P2
{{- else if gt $values.B.Value 70.0 -}}P3
{{- else if gt $values.B.Value 60.0 -}}P4
{{- else if gt $values.B.Value 50.0 -}}P5
{{- else -}}none
{{- end -}}
  • 짧은 평가 간격(예: 10s)을 설정해 라벨 플래핑과 인스턴스 전이를 빠르게 관찰해요.
  • 라벨 템플릿을 검증하려면 Configure notifications에서 Advanced options를 토글하고 Preview routing을 여러 번 클릭해 severity 라벨 값이 시간에 따라 어떻게 변하는지 확인해요.
  • Save rule and exit를 클릭하고 알림 이력 보기에서 severity 변화가 인스턴스 상태에 미치는 영향을 관찰해요.

고려 사항 (Considerations)

동적 라벨은 하나의 규칙을 여러 에스컬레이션 시나리오에 재사용하게 하지만, 동시에 복잡성을 도입해요. 라벨 값이 시끄러운 메트릭에 의존해 자주 바뀌면 인스턴스 플래핑과 과도한 알림이 생길 수 있어요. 안정성을 위해 다음을 고려해요:

  • 평가 설정과 쿼리를 안정화: 평가 간격과 pending 기간을 높여 상태 변경 빈도를 줄이고, avg_over_time 같은 함수로 메트릭을 평활화해요.
  • 넓은 임계값 밴드 사용: 작은 값 변화로 라벨이 바뀌지 않도록 템플릿 로직에 넓은 범위를 정의해요.
  • 해제 알림 비활성화: 라벨이 자주 바뀌고 알림이 빨리 해제되면 연락 지점에서 해제 알림을 꺼 알림 수를 줄여요.
  • Missing series 평가 설정 비활성화: 기본값 2인 이 설정은 인스턴스를 해제하기 전 허용하는 데이터 없는 간격 수를 정의해요. 불필요하다면 꺼요.
  • 관련 알림 간 맥락 보존: 조사 중 관련 알림을 상관짓도록 알림 메타데이터에 충분한 정보를 포함해요.
  • 더 단순하면 별도 규칙과 정적 라벨 사용: 때로는 복잡한 동적 규칙 하나보다 정적 라벨의 별도 규칙 여러 개가 관리하기 쉬울 수 있어요.

더 알아보기 (Learn more)