Prometheus 알림(Alerts)

DockerBeginner
지금 연습하기

소개

효과적인 모니터링은 단순히 메트릭을 수집하는 것에서 그치지 않고, 문제가 발생했을 때 즉시 알림을 받는 것이 핵심입니다. Prometheus는 강력한 내장 알림 시스템을 갖추고 있어, 그래프 작성에 사용하는 것과 동일한 PromQL 쿼리 언어를 사용하여 알림 조건을 정의할 수 있습니다. 알림 조건이 충족되면 해당 알림은 "Firing(발생)" 상태가 됩니다.

이 실습에서는 Prometheus 알림의 기초를 배웁니다. 먼저 Prometheus와 Node Exporter가 실행 중인 사전 구성된 환경에서 시작합니다. 여러분의 과제는 별도의 알림 규칙 파일을 생성하고, 높은 CPU 사용량을 감지하는 규칙을 정의하며, 이 파일을 로드하도록 Prometheus를 구성한 다음, 마지막으로 높은 CPU 부하를 시뮬레이션하여 Prometheus UI에서 알림이 트리거되는 것을 확인하는 것입니다.

알림 환경 이해하기

이 단계에서는 실습 환경을 살펴봅니다. 설정 스크립트를 통해 Prometheus와 Node Exporter를 위한 두 개의 Docker 컨테이너가 이미 실행 중입니다.

먼저 두 컨테이너가 모두 실행 중인지 확인합니다. 터미널을 열고 docker ps 명령어를 실행하세요:

docker ps

prometheusnode-exporter 컨테이너가 "Up" 상태로 표시되는 아래와 유사한 출력을 볼 수 있습니다.

CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                       NAMES
...            prom/prometheus                 "/bin/prometheus --c…"   15 seconds ago   Up 14 seconds   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus
...            prom/node-exporter               "/bin/node_exporter …"   16 seconds ago   Up 15 seconds   0.0.0.0:9100->9100/tcp, :::9100->9100/tcp   node-exporter

node-exporter 컨테이너는 호스트 시스템(실습 VM)에 대한 메트릭을 노출하며, prometheus 컨테이너는 해당 메트릭을 스크랩(수집)하도록 구성되어 있습니다.

이제 Prometheus UI를 확인해 보겠습니다. 접속 방법은 다음과 같습니다:

  1. LabEx 인터페이스 상단 탐색 바에서 + (새 탭) 버튼을 클릭합니다.
  2. 드롭다운 메뉴에서 Web Service를 선택합니다.
  3. 포트 번호로 9090을 입력합니다.
  4. Open을 클릭하여 Prometheus 웹 인터페이스를 실행합니다.

새 탭이 열리면 Prometheus Expression Browser 랜딩 페이지가 나타납니다. 상단 탐색 메뉴에서 Status -> Targets로 이동하세요. node_exporter 작업이 녹색 "UP" 상태인 것을 확인할 수 있으며, 이는 Prometheus가 데이터를 성공적으로 수집하고 있음을 의미합니다. 이 연결이 알림 규칙의 기반이 됩니다.

Prometheus Targets UI

CPU 과부하 알림을 위한 alert-rules.yml 생성

이 단계에서는 알림 규칙을 위한 전용 파일을 생성합니다. 규칙을 메인 Prometheus 구성과 분리하여 관리하는 것이 체계적인 관리를 위한 모범 사례입니다.

프로젝트 디렉토리 내에 alert-rules.yml이라는 파일을 생성합니다. nano 편집기를 사용하여 파일을 생성하고 편집하세요:

nano ~/project/alert-rules.yml

이제 다음 YAML 내용을 복사하여 nano 편집기에 붙여넣으세요. 이 내용은 CPU 사용량이 높을 때 트리거되는 단일 알림을 포함하는 규칙 그룹을 정의합니다.

groups:
  - name: node_alerts
    rules:
      - alert: HighCpuLoad
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 10
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "High CPU load on {{ $labels.instance }}"
          description: "CPU load is > 10% (current value: {{ $value }}%)"

이 규칙을 분석해 보겠습니다:

  • groups: 규칙은 그룹으로 구성됩니다. 그룹 내의 모든 규칙은 순차적으로 평가됩니다.
  • alert: 알림의 이름인 HighCpuLoad입니다.
  • expr: 평가되는 PromQL 표현식입니다. 결과값이 반환되면 알림이 트리거됩니다. 여기서는 지난 1분 동안의 비유휴(non-idle) CPU 시간 비율을 계산합니다. 이 값이 10%를 초과하면 조건이 충족됩니다.
  • for: 이 절은 알림이 "Firing" 상태가 되기 전에 조건이 지속적으로 참이어야 하는 시간(1분)을 지정합니다. 이는 짧은 순간의 스파이크로 인해 알림이 발생하는 것을 방지합니다.
  • annotations: 알림에 사람이 읽을 수 있는 정보를 추가합니다. summarydescription은 표준 주석입니다. {{ $labels.instance }}{{ $value }}와 같은 템플릿 변수를 사용하여 알림 메시지에 동적 데이터를 포함할 수 있습니다.

내용을 붙여넣은 후 Ctrl+X, Y, Enter를 눌러 파일을 저장하고 nano를 종료합니다.

규칙 파일이 마운트된 Prometheus 컨테이너 실행

이 단계에서는 Prometheus가 새로운 규칙 파일을 로드하도록 설정하고, 업데이트된 구성으로 컨테이너를 재시작합니다.

먼저 메인 구성 파일인 prometheus.yml을 편집하여 규칙 파일에 대한 참조를 추가해야 합니다. nano로 파일을 엽니다:

nano ~/project/prometheus.yml

파일의 최상위 레벨에 rule_files 지시문을 추가합니다(global 블록 내부가 아님). 변경 후 파일은 다음과 같아야 합니다:

global:
  scrape_interval: 15s

rule_files:
  - "alert-rules.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["prometheus:9090"]
  - job_name: "node_exporter"
    static_configs:
      - targets: ["node-exporter:9100"]

파일을 저장하고 nano를 종료합니다(Ctrl+X, Y, Enter).

구성이 업데이트되었으므로 변경 사항을 적용하기 위해 Prometheus 컨테이너를 재시작해야 합니다. 먼저 기존 컨테이너를 중지하고 제거합니다:

docker stop prometheus
docker rm prometheus

마지막으로 새로운 Prometheus 컨테이너를 실행합니다. 이 명령어는 설정 스크립트의 명령어와 유사하지만, alert-rules.yml 파일을 컨테이너 내부로 마운트하기 위한 두 번째 -v 플래그가 포함되어 있습니다.

docker run -d --name prometheus -p 9090:9090 \
  --network monitoring \
  -v /home/labex/project/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /home/labex/project/alert-rules.yml:/etc/prometheus/alert-rules.yml \
  prom/prometheus

이 명령어를 통해 메인 구성과 알림 규칙 모두가 Prometheus 컨테이너 내부에서 사용 가능해집니다.

Prometheus UI에서 알림 규칙 로드 확인

이 단계에서는 Prometheus가 새로운 알림 규칙을 성공적으로 로드했는지 확인합니다.

브라우저의 Prometheus UI 탭으로 돌아갑니다(필요한 경우 포트 9090의 Web Service 탭을 새로 엽니다). 페이지가 로드되지 않으면 새 컨테이너가 시작될 때까지 몇 초 기다린 후 새로고침하세요.

상단 탐색 바에서 Alerts 메뉴 항목을 클릭합니다.

이제 HighCpuLoad 알림이 나열된 것을 볼 수 있습니다. 알림은 녹색 배경으로 표시된 Inactive 섹션에 있을 것입니다. 시스템의 CPU 부하가 현재 낮아 알림 표현식(expr)이 거짓으로 평가되기 때문에 이는 예상된 상태입니다.

Prometheus Inactive Alert

알림의 세 가지 상태를 이해하는 것이 중요합니다:

  • Inactive (녹색): 알림 조건이 거짓입니다.
  • Pending (노란색): 알림 조건이 참이 되었지만, for 기간이 아직 지나지 않았습니다. Prometheus는 조건이 지속되는지 확인 중입니다.
  • Firing (빨간색): 알림 조건이 for 기간 동안 계속 참이었습니다. 프로덕션 환경에서는 이 시점에 Prometheus가 Alertmanager로 알림을 보냅니다.

현재 알림은 비활성 상태이며, 이는 정상입니다. 다음 단계에서는 알림이 발생하도록 만들 것입니다.

알림 발생 테스트를 위한 부하 시뮬레이션

마지막 단계에서는 시스템의 CPU 부하를 의도적으로 높여 알림이 올바르게 트리거되는지 테스트합니다.

간단한 무한 셸 루프를 사용하여 CPU 부하를 생성할 수 있습니다. 터미널에서 다음 명령어를 실행하세요. 끝에 있는 &는 프로세스를 백그라운드에서 실행하므로 터미널을 계속 사용할 수 있습니다.

while true; do true; done &

이 명령어는 단일 CPU 코어의 100%를 소비하는 프로세스를 시작합니다. 이제 빠르게 Prometheus UI의 Alerts 페이지(포트 9090의 Web Service 탭)로 돌아갑니다.

HighCpuLoad 알림 상태가 변하는 것을 관찰할 수 있습니다:

  1. 약 15-30초 이내에 알림 표현식이 참이 됩니다. 알림은 Pending 섹션으로 이동하며 노란색으로 바뀝니다. 이는 Prometheus가 높은 CPU 부하를 감지했지만 for 절에 지정된 1m 기간을 기다리고 있음을 의미합니다.
  2. Pending 상태로 1분이 지나면 알림은 Firing 섹션으로 이동하며 빨간색으로 바뀝니다. 이는 알림 규칙이 예상대로 작동함을 확인시켜 줍니다! 알림을 확장하여 현재 값을 포함해 정의한 주석을 확인할 수 있습니다.

Prometheus Firing Alert

알림이 발생하는 것을 확인했다면 부하 생성을 중지할 수 있습니다. 터미널로 돌아가 다음 명령어를 실행하여 백그라운드 루프 프로세스를 종료하세요:

중요: LabEx VM 서버 리소스를 절약하기 위해 다음 명령어를 실행하여 부하 생성을 중지해 주십시오.

kill $!

부하를 중지한 후 Prometheus UI를 다시 지켜보세요. 알림은 곧 Inactive(녹색) 상태로 돌아가며 테스트 주기가 완료됩니다.

요약

축하합니다! Prometheus 알림을 성공적으로 구성하고 테스트했습니다.

이 실습에서 배운 내용은 다음과 같습니다:

  • 별도의 YAML 파일로 알림 규칙 구조화하기.
  • 높은 CPU 사용량에 대한 알림 조건을 정의하는 PromQL 표현식 작성하기.
  • 주석(annotations)을 사용하여 의미 있고 읽기 쉬운 알림 메시지 만들기.
  • 규칙 파일을 로드하도록 Prometheus를 구성하고 변경 사항을 적용하기 위해 재시작하기.
  • Inactive에서 Pending, Firing으로 이어지는 Prometheus UI 내 알림 수명 주기 관찰하기.
  • 알림을 트리거하고 테스트하기 위한 조건 시뮬레이션하기.

이것은 알림 체계의 절반에 해당합니다. 이 실습의 범위를 벗어나지만, 다음 논리적 단계는 Alertmanager 인스턴스를 설정하는 것입니다. Prometheus는 발생한 알림을 Alertmanager로 보내며, Alertmanager는 이를 중복 제거, 그룹화하여 이메일, Slack, PagerDuty와 같은 실제 알림 채널로 라우팅하는 역할을 담당합니다.