python监控服务器集成钉钉报警

针对于linux服务器CPU利用率、CPU平均负载、内存使用率、磁盘使用率、检测的端口监控报警

import socket
import os
import platform
import requests
import time
import hmac
import hashlib
import base64
import urllib.parse

# 加签算法
timestamp = str(round(time.time() * 1000))
secret = 'xxxxxxxxxxxxxxx'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))


# 打印间隔符
def printL():
    print("------------------------------")


# 判断系统是Windows还是Linux还是其它
sysstr = platform.system()

if (sysstr == "Windows"):
    print("Windows tasks, no fcntl module")
    printL()
elif (sysstr == "Linux"):
    print("Linux tasks")
    printL()
# linux 模块
else:
    print("Other System tasks, no fcntl module")
    printL()
class Monitor():
    g_url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx×tamp="+str(timestamp)+"&sign="+str(sign)
    g_cpu_used = ''  # CPU利用率
    g_aver_load = ''  # CPU平均负载
    g_mem_used = ''  # 内存使用率
    g_disk_used = ''  # 磁盘使用率
    g_monitor_ports = []  # 检测的端口
    g_web_ip=''
    headers = {
        "Content-Type": "application/json",
    }
    # 读取配置文件
    @classmethod
    def read_conf(cls):
        global g_web_ip
        global dingding
        global g_url
        global g_cpu_used  # CPU利用率
        global g_aver_load  # CPU平均负载
        global g_mem_used  # 内存使用率
        global g_disk_used  # 磁盘使用率
        global g_monitor_ports  # 检测的端口
        global headers
        f_monitor = open('/opt/monitor.conf', 'r', encoding='utf-8')
        f_monitor_lines = f_monitor.readlines()
        for f_line_num, f_monitor_line in enumerate(f_monitor_lines):
            tup = f_monitor_line.rstrip('\n').rstrip().split('\t')
            if '=' in tup[0]:  # 刨除异常状况
                # print("monitor.conf --- line:",f_line_num, tup[0])    # 读取每一行
                temp = tup[0].split('=')  # 读取每一项元素
                if temp[0] == 'web_ip':  # 本机外网IP
                    cls.g_web_ip = temp[1]
                    print("read g_web_ip:", cls.g_web_ip)
                elif temp[0] == 'cpu_used':  # CPU利用率
                    cls.g_cpu_used = temp[1]
                    print("read cpu_used:", cls.g_cpu_used)
                elif temp[0] == 'aver_load':  # CPU平均负载
                    cls.g_aver_load = temp[1]
                    print("read aver_load:", cls.g_aver_load)
                elif temp[0] == 'mem_used':  # 内存使用率
                    cls.g_mem_used = temp[1]
                    print("read mem_used:", cls.g_mem_used)
                elif temp[0] == 'disk_used':  # 磁盘使用率
                    cls.g_disk_used = temp[1]
                    print("read disk_used:", cls.g_disk_used)
                elif temp[0] == 'monitor_ports':  # 检测的端口们
                    monitor_ports = temp[1]
                    cls.g_monitor_ports = monitor_ports.replace(' ', '').split(',')
                    print("read monitor_ports:", cls.g_monitor_ports)
        printL()

    # 获取端口信息
    @classmethod
    def get_ports(cls, port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = sock.connect_ex(('47.x.x.x', int(port)))
        if result != 0:
            form_data = {"msgtype": "text",
                         "at": {
                             "atMobiles": [
                                 "xxxxx"
                             ]
                         },
                         "text": {
                             "content": cls.g_web_ip + "服务器的:" + port + '端口挂了,快去修复哈'
                         }
                         }
            html = requests.post(g_url, headers=cls.headers, json=form_data).text
            return html
        else:
            print("端口:" + port + "正常")
    #CPU平均负载
    @classmethod
    def aver_load(cls):
        if (sysstr == "Linux"):
            f = os.popen("uptime | sed 's/,//g' | awk '{print $10,$11,$12}'")
            str_aver_load = f.read().strip().split(" ")[1].strip()
            print("CPU平均负载:", str_aver_load)
            if float(str_aver_load) > float(cls.g_aver_load):
                form_data = {"msgtype": "text",
                             "at": {
                                 "atMobiles": [
                                     "xxxxx"
                                 ]
                             },
                             "text": {
                                 "content": cls.g_web_ip + "服务器的CPU平均负载超过:" + cls.g_aver_load + "了,快去看看咋回事!"
                             }
                             }
                html = requests.post(cls.g_url, headers=cls.headers, json=form_data).text
                return html
        else:
            print(sysstr + " CPU Load average Cannot read.")
        printL()

    # 获取硬盘使用率
    @classmethod
    def get_disk_used(cls):
        if (sysstr == "Linux"):
            disk_val = os.popen("df -h | head -6 | tail -1 |awk '{print $5}'").read().strip()
            int_disk_val = int(disk_val.split("%")[0])
            int_g_disk_val = int(cls.g_disk_used.split("%")[0])
            print("硬盘使用率:", disk_val)
            if int_disk_val > int_g_disk_val:
                form_data = {"msgtype": "text",
                             "at": {
                                 "atMobiles": [
                                     "xxxxx"
                                 ]
                             },
                             "text": {
                                 "content": cls.g_web_ip + "服务器的硬盘使用率超过:" + cls.g_disk_used + "了,快去看看咋回事!",

                             }
                             }
                html = requests.post(cls.g_url, headers=cls.headers, json=form_data).text
                return html
        else:
            print(sysstr + " hard disk Cannot read.")
        printL()

    # 获取内存使用率
    @classmethod
    def get_mem_used(cls):
        if (sysstr == "Linux"):
            f = os.popen("free -m |grep Mem |awk '{print $3/$2}'")
            str_men = f.read().strip()
            print("内存使用率:", str_men)
            if float(str_men) > float(cls.g_mem_used):
                form_data = {"msgtype": "text",
                             "at": {
                                 "atMobiles": [
                                     "xxxxx"
                                 ]
                             },
                             "text": {
                                 "content": cls.g_web_ip + "服务器的内存使用率超过:" +cls.g_mem_used + "了,快去看看咋回事!"
                             }
                             }
                html = requests.post(cls.g_url, headers=cls.headers, json=form_data).text
                return html
        else:
            print(sysstr + " RAM Cannot read.")
        printL()


if __name__ == '__main__':
    # 读取配置信息
    Monitor.read_conf()

    # 读CPU平均负载
    Monitor.aver_load()

    # 读硬盘使用率
    Monitor.get_disk_used()

    # 读内存使用率
    Monitor.get_mem_used()

    # 检测端口
    for port in Monitor.g_monitor_ports:
        Monitor.get_ports(port)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值