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

 

정상적으로 된 것을 확인할 수 있다.

 

 

만약 그라파나를 사용하고 있다면, 그라파나의 알람 기능으로 대체할 수 있다.

 

지금까지는 프로메테우스를 단일 컨테이너, 인스턴스로 실행시켰는데 프로메테우스에 장애가 발생했을 때 대처 방안이 존재하지 않는다. 따라서 고가용성을 만족시키기 위한 방법을 알아볼 예정이다.