심플하게 crontab,python,telegram을 이용하여 서버의 cpu와 memory를 특정 주기로 검사하여 기준값 초과시 텔레그램으로 알림을 주도록 합니다. python 은 설치되어 있고 아래 내용들을 따라가면서 발생하는 trouble shooting이 어느 정도 가능한 분들을 대상으로 작성합니다.


1. 텔레그램 봇 생성

1) 텔레그램 클라이언트에서 @BotFather 사용자 추가후 스타트 버튼 클릭

2) /newbot 입력

3) 생성할 봇의 이름 입력(ex) BUXI_NOTIFICATION_BOT 또는 벅시_알림_로봇 -> 반드시 BOT 또는 로봇이 들어가 있어야 생성됨)

4) 이렇게 생성된 봇을 알림을 받고 싶은 채널에 사용자 추가를 한다

* chat_id를 알아내는 방법

@BotFather에서 /token 을 누르고 생성한 봇을 선택하면 HTTP API 토큰값을 얻을 수 있다

https://api.telegram.org/bot토큰/getUpdates 으로 나온 응답값의 chat_id로 메세지 전송이 가능하다

https://api.telegram.org/bot토큰/sendMessage?chat_id=_______&text=Hello%20World%21


2. python telepot 모듈을 이용한 메세지 전송

1) pip 설치

- sudo yum install python-pip

2) telepot 설치 ( api 명세 : http://telepot.readthedocs.io/en/latest/ )

- pip install telepot

3) 테스트 코드 (send_msg.py)

#!/usr/bin/env python
import telepot
import os
import socket
import commands
import string
import sys

#Telegram bot
BUXI_NOTI_API_TOKEN = '위방법으로 알아낸 토큰값 설정하면 됩니다'
BUXI_NOTI_CHAT_ID = 위방법으로알아낸chat_id
bot = telepot.Bot(BUXI_NOTI_API_TOKEN)

def send(chat):
 bot.sendMessage(BUXI_NOTI_CHAT_ID, chat, parse_mode='HTML')

if len(sys.argv) == 1:
    print "# need more parameter"
    exit(1)

msg=''
for idx, value in enumerate(sys.argv):
    if idx > 0:
        msg += value + "\n"
send(msg)

테스트 -> python send_msg.py 'hello, world'


3. cpu와 memory 체크 및 알림 코드 (noti_monitoring.py, 본인에 맞게 커스터마이징 하세요)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import telepot
import os
import socket
import commands
import string
import sys
import psutil
import time
 
# 기준 및 초기값 설정
cpuLimit = 50 # 서버 환경에 맞게 수정하세요
memLimit = 50 # 서버 환경에 맞게 수정하세요
serverName = '서버이름'
title = '[' + serverName + ' 서버]\n'
msg = title
 
#Telegram bot(벅시어드민)
BUXI_NOTI_API_TOKEN = '알아서넣으세요'
BUXI_NOTI_CHAT_ID = 알아서넣으세요
bot = telepot.Bot(BUXI_NOTI_API_TOKEN)
 
# 텔레그램 메세지 전송
def send(chat):
        bot.sendMessage(BUXI_NOTI_CHAT_ID, chat, parse_mode='HTML')
 
# cpu 사용율 계산
def getCpuUsage():
        cpu = 0
        for x in range(2):
            cpu += psutil.cpu_percent(interval=1)
        return round(float(cpu)/3,2)
 
# memory 사용량 계산
def getMemUsage():
        mem=str(os.popen('free -t -m').readlines())
        T_ind=mem.index('T')
        mem=mem[T_ind+6:]
        mem_T=mem[:13]
        mem_sub=mem[14:]
        mem_U=mem_sub[:13]
        return round(float(mem_U)/float(mem_T)*100,2)
 
avgCpu = getCpuUsage()
memUsage = getMemUsage()
 
if avgCpu > cpuLimit:
        msg += 'cpu 사용량이 기준값(' + str(cpuLimit) + '%)을 초과하였습니다.\n'
        msg += 'cpu usage : ' + str(avgCpu) + '%\n'
 
if memUsage > memLimit:
        msg += 'memory 사용량이 기준값(' + str(memLimit) + '%)을 초과하였습니다.\n'
        msg += 'memory usage : ' + str(memUsage) + '%\n'
 
if avgCpu > cpuLimit or memUsage > memLimit:
        msg += serverName + ' 무엇무엇을 합니다'
        send(msg)
        os.system('커멘트라인 명령으로 필요한 작업, 필요없을 경우 주석처리')
        time.sleep(5)
        msg = title + '재시작후 cpu & memory는 아래와 같습니다.\n'
        msg += 'cpu usage : ' + str(getCpuUsage()) + '%\n'
        msg += 'memory usage : ' + str(getMemUsage()) + '%\n'
        send(msg)

4. crontab에 등록할 스크립트 생성 (noti_monitoring.sh, 본인에 맞게 커스터마이징 하세요)


python /스크립트경로/noti_monitoring.py


5. crontab 등록(crontab -e)

# 매1분 단위로 실행 (자세한 설정은 구글링하세요)
*/1 * * * * /스크립트경로/noti_monitoring.sh > /dev/null  2>&1


+ Recent posts