소개
효과적인 모니터링은 단순히 메트릭을 수집하는 것 이상입니다. 문제가 발생했을 때 알림을 받는 것이 중요합니다. Prometheus 에는 강력한 내장 알림 시스템이 있어 그래프를 그릴 때 사용하는 것과 동일한 PromQL 쿼리 언어를 사용하여 알림 조건을 정의할 수 있습니다. 알림 조건이 충족되면 해당 알림은 "발령 (firing)" 상태가 됩니다.
본 랩에서는 Prometheus 알림의 기본 사항을 학습합니다. Prometheus 와 Node Exporter 가 실행 중인 사전 구성된 환경에서 시작합니다. 여러분의 과제는 별도의 알림 규칙 파일 (alerting rule file) 을 생성하고, 높은 CPU 사용량을 감지하는 규칙을 정의하며, Prometheus 가 이 파일을 로드하도록 구성하고, 마지막으로 높은 CPU 부하를 시뮬레이션하여 Prometheus UI 에서 알림이 발생하는 것을 확인하는 것입니다.
알림 환경 이해하기
이 단계에서는 랩 환경에 익숙해집니다. 설정 스크립트가 이미 Prometheus 용 컨테이너 하나와 Node Exporter 용 컨테이너 하나, 총 두 개의 Docker 컨테이너를 실행했습니다.
먼저, 두 컨테이너가 모두 실행 중인지 확인해 보겠습니다. 터미널을 열고 docker ps 명령을 실행합니다.
docker ps
다음과 유사한 출력을 보게 될 것이며, prometheus 및 node-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 를 확인해 보겠습니다. 접속하려면 다음 단계를 따릅니다.
- LabEx 인터페이스에서 상단 탐색 표시줄의
+(새 탭) 버튼을 클릭합니다. - 드롭다운 메뉴에서 Web Service를 선택합니다.
- 포트 번호로
9090을 입력합니다. - Open을 클릭하여 Prometheus 웹 인터페이스를 실행합니다.
새 탭이 열리면 Prometheus 표현식 탐색기 (Expression Browser) 랜딩 페이지가 보일 것입니다. 상단 탐색 메뉴에서 Status -> Targets로 이동합니다. node_exporter 작업 (job) 이 녹색 "UP" 상태인 것을 확인하여 Prometheus 가 성공적으로 데이터를 수집하고 있음을 확인할 수 있습니다. 이 연결이 알림 규칙의 기반이 됩니다.

고성능 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: 알림에 사람이 읽을 수 있는 정보를 추가합니다.summary와description은 표준 주석입니다.{{ $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) 이 거짓으로 평가되기 때문에 예상되는 상태입니다.

알림의 세 가지 상태를 이해하는 것이 중요합니다.
- Inactive (녹색): 알림 조건이 거짓입니다.
- Pending (노란색): 알림 조건이 참이 되었지만,
for기간이 아직 지나지 않았습니다. Prometheus 는 조건이 지속되는지 확인하기 위해 기다리고 있습니다. - Firing (빨간색): 알림 조건이 전체
for기간 동안 참이었습니다. 프로덕션 환경에서는 이 시점에 Prometheus 가 Alertmanager 로 알림을 보냅니다.
현재 알림이 비활성 (inactive) 상태인 것이 맞습니다. 다음 단계에서는 이 알림을 발동 (firing) 시키도록 조치할 것입니다.
알림 발동 테스트를 위한 부하 시뮬레이션
마지막 단계에서는 시스템의 CPU 부하를 의도적으로 증가시켜 알림이 올바르게 트리거되는지 테스트합니다.
간단한 무한 셸 루프를 사용하여 CPU 부하를 생성할 수 있습니다. 터미널에서 다음 명령을 실행합니다. 끝에 있는 &는 프로세스를 백그라운드에서 실행하므로 터미널을 계속 사용할 수 있습니다.
while true; do true; done &
이 명령은 단일 CPU 코어의 100% 를 소비하는 프로세스를 시작합니다. 이제 Prometheus UI 의 Alerts 페이지 (9090 포트의 웹 서비스 탭을 통해 액세스 가능) 로 빠르게 돌아갑니다.
HighCpuLoad 알림의 상태가 변경되는 것을 관찰할 수 있습니다.
- 약 15~30 초 이내에 알림 표현식이 참이 됩니다. 알림은 Pending 섹션으로 이동하고 노란색으로 바뀝니다. 이는 Prometheus 가 높은 CPU 부하를 감지했지만
for절에 지정된1m기간을 기다리고 있음을 의미합니다. - Pending 상태로 1 분 동안 유지된 후, 알림은 Firing 섹션으로 이동하고 빨간색으로 바뀝니다. 이는 알림 규칙이 예상대로 작동함을 확인시켜 줍니다! 알림을 확장하면 현재 값으로 완성된 정의한 주석을 볼 수 있습니다.

알림이 발동되는 것을 확인했다면 부하 생성을 중지할 수 있습니다. 터미널로 돌아가서 다음 명령을 실행하여 백그라운드 루프 프로세스를 종료합니다.
중요: LabEx VM 서버 리소스를 절약하려면 다음 명령을 실행하여 부하 생성을 중지해야 합니다.
kill $!
부하를 중지한 후 Prometheus UI 를 다시 확인합니다. 알림은 곧 Inactive (녹색) 상태로 돌아가며 테스트 주기가 완료됩니다.
요약
축하합니다! Prometheus 알림을 성공적으로 구성하고 테스트했습니다.
이 실습에서 다음 사항을 배웠습니다.
- 별도의 YAML 파일에 알림 규칙 구조화하기.
- 높은 CPU 사용량에 대한 알림 조건을 정의하기 위해 PromQL 표현식 작성하기.
- 주석 (annotations) 을 사용하여 의미 있고 사람이 읽을 수 있는 알림 메시지 생성하기.
- Prometheus 가 규칙 파일을 로드하도록 구성하고 변경 사항을 적용하기 위해 재시작하기.
- Prometheus UI 에서 알림의 수명 주기 (Inactive 에서 Pending 을 거쳐 Firing 까지) 관찰하기.
- 알림을 트리거하고 테스트하기 위해 조건을 시뮬레이션하기.
이것이 알림 구성의 절반입니다. 이 실습 범위를 벗어나는 다음 논리적 단계는 Alertmanager 인스턴스를 설정하는 것입니다. Prometheus 는 발동된 알림을 Alertmanager 로 보내고, Alertmanager 는 이메일, Slack 또는 PagerDuty 와 같은 실제 알림 채널로 중복 제거, 그룹화 및 라우팅을 담당하게 됩니다.



