Monitoring(Prometheus) 정복하기 - 5 (Altering rule)
Altering rule 이란
프로메테우스의 한 기능으로서 PromQL을 기반으로 알람 조건을 정의하고, 외부 서비스에 FIRING 된 알람들을 외부로 전달할 수 있다.
해당 역할을 수행하기 위해서는 2개의 리소스가 필요하다.
1. Altering rule
Altering rule은 이전의 Recording rule 처럼 특정 PromQL을 지표로 사용하거나 Recording rule 그 자체를 사용하여, 어떠한 지표를 기준으로 알람을 동작시킬지 정의한다.
알람은 3개의 상태가 있다.
- INACTIVE: 설정한 조건을 충족하고 있지 않을 때
- PENDING: 설정한 조건을 충족 하지만, 지정한 지속 시간(for) 시간의 임계치 보다 낮을 때
- FIRING: Altering rule의 조건을 모두 충족하여 경로를 발생시켰을 때
사실상 FIRING 상태가 됐을 때 알람이 발생한다고 생각하면 된다. PENDING은 일종의 유예 기간으로 생각하면 되는데, 일반적으로 CPU의 알람을 설정할 때 순간 80%의 사용률이 됐다고 알람을 발생시키진 않고, 일정 시간 2분 혹은 3분씩 지속될 때 발생시키는 거라고 생각하면 된다.
2. AlterManager
알람을 동작시켰다면, 해당 알람을 다른 곳으로 전달하는 역할이 필요하다. 역할을 수행하는 것이 AlterManager로 이메일, 슬랙, SMS 등을 설정할 수 있다.
Altering rule 작성
특정 API를 호출했을 때 무조건 500에러를 발생하도록 API를 만들어놨다. 그래서 2분 동안 500 에러가 1번 이상 발생했을 때 rule이 활성화되고, 1분 이상 지속됐을 때 알람을 보내도록 작성해 보자. 여기서는 increase 함수를 사용한다. (범위 시간당 증가율 1m이면 1분 동안의 변화량임)
groups:
- name: java_gc_duration_seconds
rules:
- record: job:jvm_gc_duration_seconds:rate5m
expr: rate(jvm_gc_pause_seconds_sum[5m]) / rate(jvm_gc_pause_seconds_count[5m])
- name: http_500_alter_rule # alter rule 추가
rules:
- alert: HighServerErrorRate
expr: increase(http_server_requests_seconds_count{status="500"}[2m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: High server error rate detected
description: "More than 1 server error occurred in the last minute for status=500"
이전에 작성한 rules.yaml에 추가로 넣어줬다.
이제 프로메테우스를 재기동해주면, INACTIVE 상태의 Altering rule을 확인할 수 있다.
임의로 500에러를 반환하는 API를 지속적으로 호출해서 PENDING 상태로 진입한 것을 확인해 보자.
AlterManager 생성
먼저 사용할 이미지는 아래와 같다.
docker pull prom/alertmanager:latest
yaml 파일을 작성해주자.
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com' # 발신자 email
smtp_auth_username: 'alertmanager@example.com' # smtp 인증 email
smtp_auth_password: 'password' # smtp 인증 패스워드
route:
group_by: ['http_500_alter_rule']
repeat_interval: 30s
group_wait: 15s
group_interval: 15s
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'your-email@example.com' # 자신의 email
파일 자체는 어렵지 않고, smtp는 이메일 발신 프로토콜로 자신의 이메일 설정을 추가로 해줘야 한다. 글에서는 생략해서, 발송까지는 보지 않고 정상 기동만 볼 예정이다.
prometheus.yaml 수정
scrape_configs:
- job_name: application
static_configs:
- targets:
- host.docker.internal:8080
scheme: http
metrics_path: /custom/prometheus
basic_auth:
username: 'dkim'
password: '4815592kim!'
rule_files:
- "rules.yml"
alerting:
alertmanagers:
- scheme: http
- static_configs:
- targets:
- 'host.docker.internal:9093'
전부 됐으면 이제 AlterManager를 실행해 주자.
docker pull prom/alertmanager:latest
docker run -d -p 9093:9093 -v (pwd)alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
정상적으로 된 것을 확인할 수 있다.
만약 그라파나를 사용하고 있다면, 그라파나의 알람 기능으로 대체할 수 있다.
지금까지는 프로메테우스를 단일 컨테이너, 인스턴스로 실행시켰는데 프로메테우스에 장애가 발생했을 때 대처 방안이 존재하지 않는다. 따라서 고가용성을 만족시키기 위한 방법을 알아볼 예정이다.