컴퓨터 공학

👉 [Infra] 서버 상태 모니터링 하기 with Slack Webhook

bitcodic 2021. 6. 12. 00:25

임대 서버의 경우, 해당 서버 상태를 주시하고 문제가 생겼을 때 바로바로 처리가 가능해야한다. 지금이야 트래픽이 많이 발생하지 않지만 언젠가는 문제 생길 수 있다. 더불어 트래픽이 넘친다면 서버 스케일에도 변화를 줘야하기 때문에 더욱 중요하다. 따라서 현재 사용중인 슬랙에 메시지를 적용시키기로 했다.

 

프로세스는 다음과 같다

 

1. 서버 내 문제 발생

2. 모니터링 시스템 감지

3. 슬랙 채팅 전송

4. 앱으로 채팅 메시지 확인

 

여기서 1-3번을 내 로컬 서버에서 처리할 수 있는 시스템이 구축되어야 한다. 4번은 슬랙 앱이 알아서 해주니까.

 

찾아보니 슬랙 플러그인 중 웹후크라는 것이 있다. API로 텍스트를 JSON으로 전송하면 선택되어 있는 채널에 메시지를 날려준다.

 

 

웹후크를 찾자

 

Slack app directory 에서 수신 웹후크를 찾아 add-on 한다.

 

 

 

웹후크에서 URL이 생성되었고 테스트를 위해 PostMan 으로 확인해본다.  

POST로 body에 Json 형식이어야 한다.

{ "text" : "쌀라 쌀라.. 모함메드 쌀라.." }

 

 

아이폰 슬랙 알람

 이름/해당 채널/ 메시지 모두 잘 나온다.

 

 

이제 로컬 CPU / Network 상태를 체크하고 이를 바탕으로 문제가 생겼을 때, 해당 슬랙 웹후크 URL로 메시지를 전송하면 된다.

나의 경우 직접 아래와 같이 파이썬 기반으로 코드를 짰다.

 

def send_alert():
    cpu, mem_used_percent_size, mem_available_size = get_system_state()

    message = "CPU: {0}% , RAM: {1}%, Available: {2} GB".format(round(cpu, 1),round(mem_used_percent_size, 1), round(mem_available_size,1))

    URL = 'https://hooks.slack.com/services/' + args.key

    response = requests.post(URL, json={"text": message}) 

무한루프를 특정 시간마다 돌게되고, 이곳에서 문제가 생기는지 체크하여 send_alert 함수가 동작하도록 진행했다.

 

내가 가정한 문제 상황은

1. CPU 점유율이 n% 이상이 넘을 경우

2. RAM 사용량이 n% 이상 넘을 경우

3. 로컬 서버 80포트 접근이 불가능할 경우

 

총 3가지로 나누었다.

 

def get_system_state():
    cpu = psutil.cpu_percent(interval=0.1)
    mem_used_percent_size = psutil.virtual_memory().percent
    mem_available_size = psutil.virtual_memory().available/1204**3

    return cpu, mem_used_percent_size, mem_available_size

1번 및 2번 상태를 체크하는 것은 psutil 라이브러리를 활용하였다.(https://psutil.readthedocs.io/en/latest/)

3번은 localhost에 80포트로 소켓통신을 진행했다.

 

이제 각각의 필요한 서버에서 해당 py 파일을 실행하면 끝.

 

아주 잘 온다

 

다만 얼마나 효율적인 프로그램일지는 미지수긴 하다.

 

이게 맞나?

 

2초에 한번씩 CPU/RAM/Network 확인하는 코드를 돌렸더니 위와 같이 나왔다. 아마 사용에는 크게 문제가 없지 않나 싶다만.

혹시 모르니 이게 맞는 결과인지 좀더 찾아봐야겠다.