[python] telegram bot 으로 서버 상태 알림 받기(cpu, memory, php-fpm)

telegram bot 으로 서버 상태 알림 받기(cpu, memory, php-fpm)

참고 :
https://core.telegram.org/
https://github.com/php-telegram-bot/core
http://devhicom.tistory.com/12

1. telegram bot 생성
1) telegram 연락처에서 @BotFather 친구추가
2) 대화창에 /newbot 입력
3) 생성할 bot 정보 입력

2. telegram bot token 생성
1) @BotFather 대화창에서 /token 입력

3. 생성한 telegram bot 친구추가
1) 예를 들어 1번에서 생성한 bot 이름이 galgulee_bot 이라면
2) telegram 연락처에서 @galgulee_bot 친구추가

4. chat_id 정보(나 즉, 상태알림 받을 사람 chat id)
1) 2번의 token(숫자:문자열 형식)
2) https://api.telegram.org/bot토큰/getUpdates
==> @galgulee_bot 의 채팅 정보 등이 출력 됨(json)
3) 혹시라도 chat botd의 설정을 webhook 활성화 하면 안 됨

5. 나 즉 상태알림 받을 사람에게 테스트 메세지 보내기
1) https://api.telegram.org/bot토큰/sendMessage?chat_id=숫자로된chgat_id&text=Hello%20World%21
2) 나에게 Hello World 가 수신 되면 성공

6. python 소스 코드

[root] vim /home/virtual/bot/send_msg.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import string
import psutil
import subprocess
import requests

from urllib.parse import urlencode
  
# 기준 및 초기값 설정
cpuLimit = 70 # cpu 사용량
memLimit = 70 # 메모리 사용량
phpLimit = 45 # php-fpm process 갯수

serverName = '서버명'
title = '[' + serverName + ' 서버]\r\n'
msg = title


  
def send(chat):
  print(chat)

  params1 =  urlencode({'chat_id': '알림받을chatid', 'text': chat}).encode()

  r = requests.post('https://api.telegram.org/bot토큰/sendMessage',  params=params1, json=[])
  print(r.elapsed.total_seconds())
  print(r.json())

# 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)
  
# php-fpm 갯수
def getPhpUsage():
        php=str(os.popen('ps -C php-fpm --no-headers | wc -l').readline())
        return int(php)


avgCpu = getCpuUsage()
memUsage = getMemUsage()
phpUsage = getPhpUsage()

  
if avgCpu > cpuLimit:
        msg += 'cpu 사용량이 기준값(' + str(cpuLimit) + '%)을 초과하였습니다.\r\n'
        msg += 'cpu usage : ' + str(avgCpu) + '%\r\n'

if memUsage > memLimit:
        msg += 'memory 사용량이 기준값(' + str(memLimit) + '%)을 초과하였습니다.\r\n'
        msg += 'memory usage : ' + str(memUsage) + '%'


if phpUsage > phpLimit:
        msg += 'php-fpm 실행수 기준값(' + str(phpLimit) + '개)을 초과하였습니다.\r\n'
        msg += 'php-fpm count : ' + str(phpUsage) + '개'
        # php-fpm 기준값 초과 되면 재시작
        php=str(os.popen('/etc/rc.d/init.d/php-fpm restart').readlines())



if avgCpu > cpuLimit or memUsage > memLimit or phpUsage > phpLimit:
        send(msg)

 

7. crontab 등록(10분마다 실행)
[root] crontab -e

## telegram bot alarm
*/10 * * * * /usr/bin/python3 /home/virtual/bot/send_msg.py > /dev/null

One thought on “[python] telegram bot 으로 서버 상태 알림 받기(cpu, memory, php-fpm)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다