[Monitoring] Grafana Alert 셋팅

[Monitoring] Grafana Alert 셋팅

안녕하세요? 정리하는 개발자 워니즈입니다. 지난시간에 Grafana를 통해서 대시보드를 표현하는 것까지 정리를 해봤습니다. 이번시간에는 Grafana의 Alert 기능을 이용해서 대시보드에서 임계치 산정을 해두면, Slack으로 Alert를 주도록 셋팅해보겠습니다.

Grafana_Alert_1

1. 모니터링 항목 선정

필자의 프로젝트에서는 Zabbix를 통하여 모니터링을 진행하고 있었습니다. 그래서 최대한 모니터링 지표를 선정할때, 기존의 Zabbix에서 셋팅된 값을 기준으로 삼고, 해당 내용을 기반으로 Prometheus에도 적용을 하면 좋겠다라고 생각을 해서 적용해보게 되었습니다.

필자가 속한 프로젝트에서는 Zabbix Template을 사용하여 모니터링을 하고 있는데, 해당 템플릿은 어떤 항목들을 수집할지를 템플릿화 해둔것이고, 신규 Host가 등록이 될때, 템플릿을 입혀서 모니터링을 진행하게 됩니다.

Grafana_Alert_2

위에 보시는것처럼, Mail Server1,2 / Web Server / Application Server 가 나뉘어있고, 각자 설정된 템플릿들을 개별적으로 입혀서 모니터링 메트릭을 수집하게 됩니다.

템플릿 명 항목 임계치

템플릿 명 항목 임계치
App Check_Publish Process App Process 존재유무
App Check_Publish Log file 로그파일 변경 여부
Common_AWS Linux CPU usage 80% 이상
Common_AWS Linux CPU Load 3 이상
Common_AWS Linux Disk usage /tmp, /var 용량 10% 미만
Common_AWS Linux uptime uptime 변경 유무 (서버 Restart)
Common_AWS Linux Available Memory 90% 이상
Common_AWS Linux Process Count 1000개 이상
App_Hang DISK Hang dfmessage 변경 유무
App_Hang Zabbix agent pin zabbix agent ping 유무

위의 값들 중, CPU, MEM을 우선 적용하기 위해서 다음과 같이 임계값을 잡았습니다.

레이어 항목 임계치 지속기간 비고
Cluster CPU 80% 1m
Cluster MEM 80% 1m
POD CPU 80% 1m 1개 pod이 Cluster의 전체 용량중 사용한 cores수
POD MEM 80% 1m

필자가 속한 프로젝트에서는 일단, EKS를 활용하여 Cluster를 구축하였습니다. 그리고 그안에 POD들이 서비로 연결되어 운영에 반영이 되어있습니다.

그렇다면, Cluster + POD 이 개별적으로 모니터링이 진행이 되어야 된다고 생각했습니다.

2. Grafana Alert Dashboard 생성

우선 대충 아래느낌의 대시보드를 만들 생각을 했습니다. 좌측으로는 cpu에 대한 임계값을 셋팅해주고, 우측으로는 memory에 대한 임계값을 셋팅하기로 했습니다.

Grafana_Alert_3

상단에는 Cluster에 대한 그래프, 하단에는 POD에 대한 그래프를 그리기로 했습니다.

[Create+ 클릭] > [Dashboard 클릭] > [Choose Visualization 클릭]

Grafana_Alert_5

접속하게 되면, Visualization을 선택하게 되는데, 여기서 Graph를 선택하시면 됩니다.

제일 좌측에 보시면, 아래의 순서대로 되어있고, Query 부분이 지난번 포스팅할 때, 정리했던 promql을 사용하여 넣어주시면됩니다.

  • Query
  • Visualization
  • General
  • Alert

3. Query 셋팅

  • Cluster
#CPU
#5분간 전체 노드에서 container의 초당 cpu 사용량 집계 / 전체 워커노드의 cpu cores 합계 
sum (rate (container_cpu_usage_seconds_total{id="/",node=~"^$Node$"}[5m])) / sum (machine_cpu_cores{node=~"^$Node$"})
#MEMORY
#전체 container에서 사용하는 memory bytes수 / 전체 워커노드의 memory bytes수 * 100 
sum (container_memory_working_set_bytes{id="/",node=~"^$Node$"}) / sum (machine_memory_bytes{node=~"^$Node$"}) * 100
  • POD
#CPU
#5분간 전체노드에서 container의 초당 cpu 사용량 집계를 pod단위로 계산(cores)
sum (rate (container_cpu_usage_seconds_total{pod_name=~"prd-author.*", image!="",name=~"^k8s_.*"}[5m])) by (pod_name)
#MEMORY
#전체 container에서 사용하는 memory bytes수를 pod단위로 계산(bytes)
sum (container_memory_working_set_bytes{pod_name=~"prd-author.*", image!="",name=~"^k8s_.*"}) by (pod_name)

4. Visualiztion 셋팅

그래프에 대한 셋팅을 설정하는 부분입니다. 각자의 입맛에 따라서 설정을 하면되는데, 중요한 부분은 Axes에서 단위를 무엇으로 사용할지를 정하는 것이 중요합니다.

5. Alert 셋팅

드디어, 가장 중요한 Alert 셋팅을 하는데까지 왔습니다. CPU, MEM에 대한 alert 대시보드를 작성하였고, 이제 임계치를 설정만 하면 될 것 같습니다. 임계치 설정시 위에서 정리한대로 Cluster와 pod를 개별적으로 셋팅하였고, 각각 알람을 걸었습니다.

promql에서 cpu 사용률을 보면, 5분간 집계된 내용을 rate하면 결국 cores가 된다고 합니다.
memory같은 경우는 그대로 bytes로 나오기때문에임계치를 걸면됩니다.

  • Limitrange 체크
    # 실제 pod에 걸려있는 limit
    Limits:
      cpu:     200m
      memory:  512Mi
    Requests:
      cpu:      200m
      memory:   512Mi

위와 같이 셋팅이 되어있으므로,

[cpu] 0.2 cores / 16cores (워커 전체) * 0.8 (임계치) = 0.01 이 나옵니다.

[memory] 512M * 0.8 = 410Mbytes

위의 셋팅대로 그라파나의 Alert 셋팅가서, 아래와 같이 걸어주면됩니다.

Grafana_Alert_9

이렇게 셋팅을 한 뒤, 임계치를 상승하게 되면, Alert로 Notification이 갑니다.

6. Grafana Alert 셋팅

위에서는 개별적인 셋팅이 완료된것이고, 실질적으로 어떤 타입(e-mail, slack, line etc) 으로 메시지를 보낼지를 세팅하는 부분이 있습니다.

[Alert] > [Notification channels] 클릭 하시고 아래와 같이 셋팅을 하면됩니다.

그리고 save Test를 하면 정상적으로 Slack 채널에 alert가 되는 것을 확인 할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다