Alert with Grafana

지난 글인 Monitoring with cAdvisor + Prometheus + Grafana(https://blog.uzuki.live/?p=1764) 에 이어서, 지난 글에서 다루지 못했던 Grafana Alert 기능에 대해 간단히 소개하고자 한다.

준비물

  • Prometheus, Grafana, Caddy 등 : 지난 글 참조
  • node-exporter : 하드웨어나 OS 측정 항목에 대한 Prometheus exporter (옵션)
  • Telegram Bot Token: BotFather (https://telegram.me/BotFather) 로 생성 가능한 봇의 토큰
  • Telegram User ID (or Chat ID): 알림을 발송할 대상 그룹 (유저 ID 또는 그룹 ID)

User ID 또는 ChatID 얻기

  1. 생성한 봇과 대화 시작 (또는 그룹에 초대)
  2. https://api.telegram.org/bot{BOT_TOKEN}/getUpdates 으로 접속. {BOT_TOKEN} 에는 봇의 토큰을 입력
  3. 메세지 입력
  4. 2번에서 접속한 페이지를 새로고침 하면, 메세지 데이터가 조회됨. result > 0 > message > from > id 가 사용자의 ID, result > 0 > message > chat > id 가 그룹 ID
{"ok":true,"result":[{"update_id":917237895,
"message":{"message_id":703,"from":{"id":47220554,"is_bot":false,"first_name":"Pyxis","username":"WindSekirun","language_code":"ko"},"chat":{"id":-1001363414751,"title":"","type":"supergroup"},"date":1588476517,"text":"/start","entities":[{"offset":0,"length":,"type":"bot_command"}]}}]}

Node-Exporter (옵션)

하드웨어나 OS 측정 항목에 대한 데이터를 제공하는 exporter로, 이 글에서는 ‘디스크 사용량’에 대해 Alert를 보낼 것이기 때문에 아래 인스턴스를 추가로 올린다.

  nodeexporter:
  image: prom/node-exporter:v0.18.1
  container_name: nodeexporter
  volumes:
    - /proc:/host/proc:ro
    - /sys:/host/sys:ro
    - /:/rootfs:ro
  command:
    - '--path.procfs=/host/proc'
    - '--path.rootfs=/rootfs'
    - '--path.sysfs=/host/sys'
    - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($
  restart: unless-stopped

prometheus.yml에는 아래와 같이 등록한다.

  - job_name: 'nodeExporter'
  scrape_interval: 5s
  static_configs:
  - targets: ['nodeexporter:9100']

제공하는 측정 항목에 대해서는 https://github.com/prometheus/node_exporter#enabled-by-default 에서 볼 수 있다.

Notification Channels 등록하기

Grafana Alerts 기능은 6.7.3 버전 기준으로 Email, Slack, Discord, LINE, Telegram, Webhooks 등 여러 타입을 제공한다. 이 글에서는 상기했었던 Telegram를 사용한다.

Grafana 의 왼쪽 알림 아이콘을 눌러 Notification Channel를 생성한다.

Name에는 알림 채널의 이름을 Bot API Token는 봇의 토큰, Chat ID에는 메세지를 보낼 대상을 선택한다.

타입 밑의 옵션은 다음과 같다.

  • Default: 모든 알림의 기본 대상 설정
  • Include image: 알림을 보낼 때 그래프가 담긴 이미지를 포함할지 설정
  • Disable Resolve Message: 그래프의 상태가 해결되었을 때, ‘해결됨’ 메세지를 보낼지 설정
  • Send reminders: 그래프의 상태가 지속되었을 때 메세지를 보낼지 설정

호스트 디스크 사용량 그래프 생성

기존 Panel를 사용해서 알림을 보낼 수 있지만, 이 글에서는 Node-exporter의 metrics를 사용하여 Panel를 추가하려고 한다.

  • 사용할 측정 항목: node_filesystem_avail_bytes, node_filesystem_size_bytes
  • PromQL: (node_filesystem_size_bytes{mountpoint=”/”} – node_filesystem_avail_bytes{mountpoint=”/”}) / 1024 / 1024
  • 시각화 방법: Graph, Axes > Left Y > Unit: mebibytes, Decimals: 2

node_filesystem_avail_bytes 는 사용 가능한 용량을, node_filesystem_size_bytes 는 전체 용량을 나타낸다. 따라서 디스크 사용량을 나타내기 위해 전체 용량에서 사용 가능한 용량을 빼고, 이를 MB 단위로 환산한다.

알림 항목 설정

Panel 설정의 ‘알림’ 아이콘을 눌러 새로운 알림을 생성하면, 아래와 같은 화면을 볼 수 있다.

각 옵션은 다음과 같다.

  • Evaluate every: 특정 시간마다 아래 Conditions를 만족하는지 확인
  • For: Pending 상태가 특정 시간동안 지속되었을 때 Alert 를 보내도록 설정 (짧은 시간 내에 알림을 방지하기 위한 수단으로 사용됨)
  • Condition: query의 계산값에 대해 조건을 만족할 때 Alert를 전송할 지 설정
    • WHEN: {avg, min, max, sum, count, last, median, diff, diff_abs, percent_diff, percent_diff_abs, count_non_null} 등 쿼리에 대한 계산식
    • OF: query(A, 5m, now) 현재부터 5분 전 까지의 A 레코드에 대한 케디엍
    • IS ABOVE: 특정 값에 대해 ‘초과’, ‘미만’, ‘범위 초과’, ‘범위 포함’ ‘값 없음’ 에 대한 조건 설정
  • If no data or all values are null: 데이터가 없거나 모든 데이터가 Null 일 때 상태 설정값. Alerting, No Data, Keep Last State, OK 로 설정할 수 있음.
  • If execution error or timeout: 쿼리 실행에 실패하거나 타임아웃이 발생한 경우: Alerting, Keep Last State로 설정할 수 있음

예시로 데이터 사용량이 80%를 임계했을 때 보내려고 하므로, 전체 디스크 용량의 80%를 MB로 환산한 값인 104857 를 입력하여 Condition을 작성한다. WHEN max() of query(A, 5m, now) IS ABOVW 104857

알림 테스트

생성한 알림을 확인해보기 위해, time sh -c 'fallocate -l 10G aaa; sync' 를 입력하여 임시 파일을 생성하고, 약간만 기다리면 알림이 발송되는 것을 확인할 수 있다.