Prometheus 알림 설정

DockerBeginner
지금 연습하기

소개

효과적인 모니터링은 단순히 메트릭을 수집하는 것 이상입니다. 문제가 발생했을 때 알림을 받는 것이 중요합니다. Prometheus 에는 강력한 내장 알림 시스템이 있어 그래프를 그릴 때 사용하는 것과 동일한 PromQL 쿼리 언어를 사용하여 알림 조건을 정의할 수 있습니다. 알림 조건이 충족되면 해당 알림은 "발령 (firing)" 상태가 됩니다.

본 랩에서는 Prometheus 알림의 기본 사항을 학습합니다. Prometheus 와 Node Exporter 가 실행 중인 사전 구성된 환경에서 시작합니다. 여러분의 과제는 별도의 알림 규칙 파일 (alerting rule file) 을 생성하고, 높은 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 작업 (job) 이 녹색 "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

global 섹션 아래에 rule_files 지시문을 추가합니다. 변경 후 파일은 다음과 같아야 합니다.

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 포트로 새 웹 서비스 탭을 엽니다. 페이지가 로드되지 않으면 새 컨테이너가 시작될 때까지 몇 초 기다린 후 페이지를 새로 고침하십시오.

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

이제 HighCpuLoad 알림이 목록에 표시되어야 합니다. 이 알림은 녹색 배경으로 표시되며 Inactive 섹션에 있습니다. 이는 시스템의 CPU 부하가 현재 낮아 알림의 표현식 (expr) 이 거짓으로 평가되기 때문에 예상되는 상태입니다.

Prometheus Inactive Alert

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

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

현재 알림이 비활성 (inactive) 상태인 것이 맞습니다. 다음 단계에서는 이 알림을 발동 (firing) 시키도록 조치할 것입니다.

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

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

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

while true; do true; done &

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

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 가 규칙 파일을 로드하도록 구성하고 변경 사항을 적용하기 위해 재시작하기.
  • Prometheus UI 에서 알림의 수명 주기 (Inactive 에서 Pending 을 거쳐 Firing 까지) 관찰하기.
  • 알림을 트리거하고 테스트하기 위해 조건을 시뮬레이션하기.

이것이 알림 구성의 절반입니다. 이 실습 범위를 벗어나는 다음 논리적 단계는 Alertmanager 인스턴스를 설정하는 것입니다. Prometheus 는 발동된 알림을 Alertmanager 로 보내고, Alertmanager 는 이메일, Slack 또는 PagerDuty 와 같은 실제 알림 채널로 중복 제거, 그룹화 및 라우팅을 담당하게 됩니다.