1. Prometheus의 Alertmanager 플러그인 설치

 

# alertmanager 설치 파일 다운로드
# cd ~/Downloads
# wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
# tar -xzvf alertmanager-0.25.0.linux-amd64.tar.gz
# rm -rf alertmanager-0.25.0.linux-amd64.tar.gz

# alertmanager 유저 추가
# useradd --no-create-home --shell /bin/false alertmanager

# alertmanager의 디렉토리를 opt 하위로 이동 및 관리 편의를 위한 logs, conf, bin, data 디렉토리 생성
# mv ~/Downloads/alertmanager-0.25.0.linux-amd64 /opt/alertmanager
# mkdir /opt/alertmanager/logs /opt/alertmanager/conf /opt/alertmanager/bin /opt/alertmanager/data
# mv /opt/alertmanager/alertmanager.yml /opt/alertmanager/conf
# mv /opt/alertmanager/alertmanager /opt/alertmanager/bin/
# mv /opt/alertmanager/amtool /opt/alertmanager/bin/

# alertmanager HOME 디렉토리 권한 부여
# chown -R alertmanager:alertmanager /opt/alertmanager

 

# vi /etc/sysconfig/alertmanager 로 'alertmanager' 환경변수 위한 파일 생성

# /etc/sysconfig/alertmanager 파일

ALERTMANAGER_USER=alertmanager

ALERTMANAGER_GROUP=alertmanager

ALERTMANAGER_HOME=/opt/alertmanager

LOG_DIR=/opt/alertmanager/logs

DATA_DIR=/opt/alertmanager/data

CONF_DIR=/opt/alertmanager/conf

CONF_FILE=/opt/alertmanager/conf/alertmanager.yml

# Only used on systemd systems
PID_FILE_DIR=/var/run/alertmanager

 

# alertmanager service 등록
# vi /usr/lib/systemd/system/alertmanager.service 로 'alertmanager.service' 파일 생성

# alertmanager.service 파일 내용

[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
EnvironmentFile=/etc/sysconfig/alertmanager
PIDFile=/var/run/alertmanager.pid

User=alertmanager
Group=alertmanager
Type=simple
Restart=always
WorkingDirectory=/opt/alertmanager
RuntimeDirectory=alertmanager
RuntimeDirectoryMode=0750
ExecStart=/opt/alertmanager/bin/alertmanager    \
    --config.file=${CONF_FILE}                  \
    --storage.path=${DATA_DIR}/                 \
    --cluster.listen-address=                   \


[Install]
WantedBy=multi-user.target

 

- alertmanager가 정상 설치 되었는지 확인하기 위해 alertmanager 웹 콘솔 접속하기

# alertamanger.service 가동
systemctl start alertmanager.service

alertmanager 서버를 작동시킨 후, {alertamanger 를 설치한 IP}:9093 (Default Port) 로 접속하면, alertmanager 가 정상 설치 및 정상 가동 되었다면 아래와 같은 화면을 볼 수 있다.

Alertmanager 웹 콘솔 화면

 

- 프로메테우스의 alert 시스템을 설치한 'alertmanager' 로 등록하기

# vi /opt/prometheus/conf/prometheus.yml 로 prometheus.yml 파일 수정

# /opt/prometheus/conf/prometheus.yml 파일의 'alerting:' 부분

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["your_alertmanager_IP:9093"]
# promtool check config <config-files> 로 prometheus.yml 검증하기

# /opt/prometheus/bin/promtool check config /opt/prometheus/conf/prometheus.yml
# 변경된 prometheus.yml 적용하기 위해 프로메테우스 서버 재시작 하기

# systemctl restart prometheus.service

2. 프로메테우스의 rules.yml 설정

# 프로메테우스가 설치되어 있는 경로로 이동
# cd /opt/prometheus

# 'rules' 라는 디렉토리 생성 - rule과 관련된 yml 파일들을 따로 모아두기 위함.
# mkdir rules

# 'rules' 디렉토리가 root 계정으로 생성되었으므로, 권한 부여하기
chown -R prometheus:prometheus /opt/prometheus/

 

- rules.yml 생성 (여기서는 이름을 'test-rules.yml' 로 지정하겠다.)

# vi /opt/prometheus/rules/test-rules.yml 로 'test-rules.yml' 생성

# /opt/prometheus/rules/test-rules.yml 파일

groups:
  - name: custom_rules
    rules:
      - record: node_memory_MemFree_percent
        expr: 100 - (100 * node_memory_MemFree_bytes / node_memory_MemTotal_bytes)

      - record: node_filesystem_free_percent
        expr: 100 * node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}

  - name: alert_rules
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Instance [{{ $labels.instance }}] down"
          description: "[{{ $labels.instance }}] of job [{{ $labels.job }}] has been down for more than 1 minute."
          
      - alert: DiskSpaceFree10Percent
        expr: node_filesystem_free_percent <= 10
        labels:
          severity: warning
        annotations:
          summary: "Instance [{{ $labels.instance }}] has 10% or less Free disk space"
          description: "[{{ $labels.instance }}] has only {{ $value }}% or less free."

 

- 생성한 rule 파일을 prometheus 에 인식시키기.

rule 파일의 syntax error 등이 없는 지, 다음 명령어를 통해 확인한다.

# 생성한 rule 파일에 prometheus로 소유권 변경
chown prometheus:prometheus /opt/prometheus/rules/test-rules.yml

# 프로메테우스 설치 경로의 'promtool' 명령어 통해 확인
# promtoll check rules { rule.yml의 경로 }
# /opt/prometheus/bin/promtool check rules /opt/prometheus/rules/test-rules.yml
# vi /opt/prometheus/conf/prometheus.yml 수행하여 아래 문구 추가

# /opt/prometheus/conf/prometheus.yml 파일

rule_files:
  - "/opt/prometheus/rules/test-rules.yml"
# prometheus.yml 변경사항 적용 위한 프로메테우스 재시작
# systemctl restart prometheus.service

 

- prometheus 서버에 rules가 적용되었는지 확인하기

{프로메테우스가 설치된 서버 IP}:9000/rules 페이지


3. alertmanager.yml 설정

- alertmanager.yml 파일 내용 작성

# /opt/alertmanager/conf/alertmanager.yml 파일

global: 	
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 3h
  receiver: 'Receiver Name'
   
receivers:
  - name: 'Receiver Name'
    email_configs:
      - to: 'your-email@yourdomain.com'
        from: 'Prometheus_Alert@yourdomain.com'
        smarthost: 'your_smtp_server_IP:your_smtp_port'
        auth_username: 'your_smtp_auth_username'
        auth_password: 'your_smtp_auth_password'
        require_tls: false		# 디폴트가 true인데, 테스트하려는 smtp 서버가 tls 인증을 지원하지 않는 경우, false로 지정해야 메일이 성공적으로 발송된다.

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']

global : Alertmanager 전반에 적용되는 설정

  • resolve_timeout :  alert이 EndsAt(해당 사안 종료 시각)을 명시하지 않을 경우, 이 옵션으로 설정해놓은 시간이 지나면, alert을 Alertmanager에서 Resolve 처리하게 된다. 기본값은 5m
  • smtp_* : Alertmanager가 이메일 알림을 보낼 때 사용하는 SMTP 서버와 인증 정보를 global로도 박을 수 있다. receiver의 대상 메일 서버가 하나인 경우 주로 global로 박아서 사용하게 될 것이다.
    구체적인 내용은 '참고'의 프로메테우스 공식 문서 참고.
  • slack_* : Alertmanager가 Slack 메시지를 보낼 때 사용하는 webhook URL과 인증 토큰을 설정.
    구체적인 내용은 '참고'의 프로메테우스 공식 문서 참고.
  • pagerduty_* : Alertmanager가 PagerDuty 알림을 보낼 때 사용하는 인증 토큰을 설정.
    구체적인 내용은 '참고'의 프로메테우스 공식 문서 참고.

route : alert 라우팅 규칙을 정의

  • receiver : alert을 수신하는 대상을 지정. 여러 대상 지정 가능
  • group_by : alert을 그룹화하는 기준을 설정. alert이 발생한 대상에 대한 label 등을 기준으로 그룹화 하는 설정
  • group_wait : alert 그룹에 대한 notification 을 다시 보내기 전, 얼마나 기다려야 하는지를 설정. 기본값은 30s
    만약 이 시간 내에 [group_by] 의 동일한 label을 가진 다른 alert이 발생한다면, 해당 그룹에 추가하고, 다시 또 다른 alert 오는지 대기했다가, 없을 경우에 지금까지 온 해당 그룹의 모든 alert 을 notify 한다.
  • group_interval : 아직 resolved 되지 않은 alert에 대해 반복 알림(notification)을 보내기 전, 대기하는 시간을 설정.
    기본값은 5m
  • repeat_interval : 반복적으로 알림을 보내는 경우, 알림을 보내는 간격을 설정. 기본값은 3h

receivers : 알림(notification)을 수신하는 대상의 정보를 정의

  • email_configs : 이메일로 알림을 보내는 경우 사용되는 SMTP 서버 및 수신자 정보를 설정
  • webhook_configs : 웹훅을 사용하여 알림을 보내는 경우, 웹훅 End point 와 인증 정보를 설정
  • pagerduty_configs : PagerDuty 알림을 수신하는 경우, 서비스와 인증 토큰을 설정
  • slack_configs : Slack 메시지를 수신하는 경우, 웹훅 URL과 인증 토큰을 설정

inhibit_rules: source_match 에서 지정한 label에 해당하는 label을 가진 alert이 이미 있다면, target_match 에서 지정한 label에 해당하는 label을 가진 alert에 대한 notification 은 하지 않도록 지정하는 설정

  • source_match : 이 단락에 명시된 조건을 충족하면, inhibit_rule 을 적용하게 된다. 따라서 이 단락에 명시된 조건에 해당하는 alert만 notify 한다.
  • target_match : 이 단락에 명시된 조건의 alert은 notify 되지 않는다.
  • equal : 동일한 alert을 평가하는 기준으로, 위 예시에서는 alert의 이름과 해당 alert이 발생한 instance가 동일하다면, 동일한 alert으로 보고, severity 가 warning인 alert은 무시하고, severity가 critical 인 alert만 notify 하게 된다.

 

- alertmanager.yml 파일 검증

작성한 alertmanager.yml 파일의 syntax error 등은 없는지 확인한다.

# amtool check-config {alertmanager.yml의 경로}
# /opt/alertmanager/bin/amtool check-config /opt/alertmanager/conf/alertmanager.yml
# alertmanager.yml 적용시키기 위해 alertmanager 재시작하기
# systemctl restart alertmanager.service

 

- alertmanager.yml 파일 적용이 되었는지 프로메테우스 콘솔 창에서 확인

프로메테우스 콘솔창의 [Alerts] 메뉴에서 'InstanceDown' 과 'DiskSpaceFree10Percent' 가 적용됨을 확인할 수 있다.

 


참고

https://prometheus.io/docs/alerting/latest/alertmanager/

 

Alertmanager | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

https://godekdls.github.io/Prometheus/alerting.configuration/

 

Alert Configuration

Alertmanager 설정 가이드

godekdls.github.io

https://medium.com/techno101/how-to-send-a-mail-using-prometheus-alertmanager-7e880a3676db

 

How to Send a Mail Using Prometheus Alertmanager?

How to create Alerting Rules? Install and configure Alertmanager to send mail on alert firing.

medium.com

https://awesome-prometheus-alerts.grep.to/rules.html#windows-server

 

Awesome Prometheus alerts

Collection of alerting rules

awesome-prometheus-alerts.grep.to

-> Alert rules 작성 예시 참고하기 좋은 사이트!

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기