알림 규칙

알림 규칙 (Alerting rules)

알림 규칙(alerting rule)은 PromQL 표현식으로 알림 조건을 정의하고, 발화 중인 알림에 대한 통지를 외부 서비스로 보내는 기능이에요. 온라인 서빙 시스템에서 "지금 무엇이 고장났나"를 판단하는 핵심 요소죠. 이 문서는 알림 규칙을 어떻게 정의하는지, forkeep_firing_for 같은 조항이 무슨 뜻인지, 라벨과 어노테이션, 템플릿, 그리고 실행 중인 알림을 어떻게 확인하는지 설명해 드려요.

중요한 점 하나는, 알림 규칙은 "무엇이 지금 고장났는지"를 알아내는 데는 뛰어나지만 완전한 통지 솔루션은 아니라는 거예요. 요약, 통지 속도 제한, 사일런싱 같은 역할은 Alertmanager가 담당해요.

출처: 문서

본문

알림 규칙을 사용하면 Prometheus 표현식 언어 기반의 알림 조건을 정의하고, 발화 중인 알림에 대한 통지를 외부 서비스로 보낼 수 있어요. 어느 시점에 알림 표현식이 하나 이상의 벡터 요소를 만들면, 그 요소들의 라벨 집합에 대해 알림이 활성(active)으로 간주돼요.

알림 규칙 정의하기 (Defining alerting rules)

알림 규칙은 기록 규칙과 같은 방식으로 Prometheus에서 구성돼요.

알림이 있는 예제 규칙 파일:

groups:
- name: example
  labels:
    team: myteam
  rules:
  - alert: HighRequestLatency
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
    for: 10m
    keep_firing_for: 5m
    labels:
      severity: page
    annotations:
      summary: High request latency

선택적 for 조항은 Prometheus가 새 표현식 출력 벡터 요소를 처음 만난 시점과 그 요소에 대해 알림을 발화(firing)로 세는 시점 사이에 일정 기간을 기다리게 해요. 이 경우 Prometheus는 10분 동안 각 평가에서 알림이 계속 활성인지 확인한 뒤 알림을 발화해요. 활성이지만 아직 발화하지 않은 요소는 pending 상태에 있어요. for 조항이 없는 알림 규칙은 첫 번째 평가에서 활성이 돼요.

또한 선택적 keep_firing_for 조항이 있는데, 발화 조건이 마지막으로 충족된 후 지정된 기간 동안 이 알림을 발화 상태로 유지하라고 Prometheus에 알려 줘요. 이는 알림이 깜빡이는(flapping) 상황이나, 데이터 손실 부족으로 인한 거짓 해소(false resolutions) 같은 것을 방지하는 데 사용할 수 있어요. keep_firing_for 조항이 없는 알림 규칙은 (위에서 설명한 선택적 for 기간이 충족됐다고 가정할 때) 조건이 충족되지 않는 첫 번째 평가에서 비활성화돼요.

labels 조항은 알림에 첨부할 추가 라벨 집합을 지정할 수 있게 해 줘요. 기존의 충돌하는 라벨은 덮어쓰여져요. 라벨 값은 템플릿화할 수 있어요.

annotations 조항은 알림 설명이나 런북 링크 같은 더 긴 추가 정보를 저장하는 데 사용할 수 있는 정보성 라벨 집합을 지정해요. 어노테이션 값은 템플릿화할 수 있어요.

템플릿 (Templating)

라벨과 어노테이션 값은 콘솔 템플릿으로 템플릿화할 수 있어요. $labels 변수는 알림 인스턴스의 라벨 키/값 쌍을 담아요. 구성된 외부 라벨은 $externalLabels 변수로 접근할 수 있어요. $value 변수는 알림 인스턴스의 평가된 값을 담아요.

# 발화 요소의 라벨 값을 삽입하려면:
{{ $labels. }}
# 발화 요소의 숫자 표현식 값을 삽입하려면:
{{ $value }}

예:

groups:
- name: example
  rules:

  # 5분 넘게 도달할 수 없는 인스턴스에 대한 알림.
  - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

  # 중앙값 요청 지연시간이 1초를 넘는 인스턴스에 대한 알림.
  - alert: APIHighRequestLatency
    expr: api_http_request_latencies_second{quantile="0.5"} > 1
    for: 10m
    annotations:
      summary: "High request latency on {{ $labels.instance }}"
      description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

실행 중에 알림 검사하기 (Inspecting alerts during runtime)

어떤 알림이 활성인지(pending 또는 firing) 수동으로 검사하려면 Prometheus 인스턴스의 "Alerts" 탭으로 이동하세요. 정의된 각 알림이 현재 어떤 라벨 집합에 대해 활성인지 정확히 보여 줘요.

pending과 firing 알림에 대해 Prometheus는 ALERTS{alertname="", alertstate=""} 형태의 합성 타임시리즈도 저장해요. 샘플 값은 알림이 표시된 활성(pending 또는 firing) 상태에 있는 동안 1로 설정되고, 그렇지 않으면 시리즈가 stale로 표시돼요.

알림 통지 보내기 (Sending alert notifications)

Prometheus의 알림 규칙은 지금 무엇이 고장났는지 알아내는 데는 뛰어나지만, 완전한 통지 솔루션은 아니에요. 단순 알림 정의 위에 요약, 통지 속도 제한, 사일런싱, 알림 의존성을 추가하려면 또 다른 계층이 필요해요. Prometheus 생태계에서 Alertmanager가 이 역할을 담당해요. 따라서 Prometheus는 알림 상태에 대한 정보를 주기적으로 Alertmanager 인스턴스로 보내도록 구성될 수 있고, Alertmanager가 올바른 통지를 전달하는 역할을 맡아요. Prometheus는 서비스 디스커버리 통합을 통해 사용 가능한 Alertmanager 인스턴스를 자동으로 발견하도록 구성할 수 있어요.

더 알아보기 (Learn more)