zoukankan      html  css  js  c++  java
  • python 企业微信告警

    目标:

    为了实现服务器性能监控指标告警,通过alertmanager触发告警后发送到webhook,然后通过python脚本实现数据清洗,并把告警内容发送给指定的企业微信用户。

    由于频繁获取企业微信api可能会管理员拉入小黑屋,所有需要把获取access_token缓存到redis上,然后取数据在redis获取即可。

    #!/usr/bin/env Python
    # -*- coding:utf-8 -*-
    
    import json
    import time
    import requests
    import os
    import redis
    from flask import request, Flask    
    
    
    class  qywx_obj:
        def __init__(self):
            self.CORPID = 'xxxxxxxxxxxxx'   # 企业的corpid
            self.CORPSECRET_SEND_MSG = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 应用的secret
            self.access_token = self.get_access_token(self.CORPSECRET_SEND_MSG)
            self.AGENTID = 1000002
            self.user_info = self.get_user_info()
        
        def get_access_token(self, CORPSECRET):
            url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
            values = {
                     'corpid': self.CORPID,
                    'corpsecret': CORPSECRET,
            }
            req = requests.post(url, params=values)
            ACCESS_TOKEN = json.loads(req.text)["access_token"]
            return ACCESS_TOKEN
    
        def get_user_info(self):
            GET_USER_URL = 'https://qyapi.weixin.qq.com/cgi-bin/user/list'
            CORPSECRET_GET_INFO = 'xxxxxxxxxxxxxxx'    # 联系人的secret 用来获取部门的成员信息
            access_token = self.get_access_token(CORPSECRET_GET_INFO)
            values = {
                    'access_token': access_token,
                    'department_id': 1,
                    'fetch_child': 1,
                }
            USER_INFO = json.loads(requests.post(GET_USER_URL, params=values).text)["userlist"]
            return USER_INFO
    
        def send_data(self, TOUSER, message, access_token):
            send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.access_token
            send_values = {
                "touser": TOUSER,
                "msgtype": "text",
                "agentid": 1000002,
                "text": {
                    "content": message
                    },
                "safe": "0"
                }
            send_msges=(bytes(json.dumps(send_values), 'utf-8'))
            respone = requests.post(send_url, send_msges)
            respone = respone.json()  
            return respone["errmsg"]
    
    class redis_obj:
        def __init__(self):
            self.host = "172.16.40.24"
            self.port = 6379
            self.r = self.get_redis_obj()
    
        def get_redis_obj(self):
            pool=redis.ConnectionPool(host=self.host,port=self.port,db=0)
            r = redis.StrictRedis(connection_pool=pool)
            return r
    
        def redis_cache(self, key, data):
            self.r.set(key, data)
            self.r.expire(key, 3600)
            
    
        def get_access_from_redis(self, key):
            if self.r.get(key):
                return self.r.get(key)
    
        def judge_redis_keys(self, key):
            if self.r.exists(key) == 1:
                return True
            else:
                return False
            
    
    def GetData():
        PostData = request.get_data().decode()
        Data = json.loads(PostData)  
        JsonData = json.dumps(Data, ensure_ascii=False, indent=4)   
        return JsonData
    
    app = Flask(__name__)
    app.config['JSON_AS_ASCII'] = False
     
     
    @app.route('/webhook/', methods=['POST'])
    def IssueCreate():
        qywx = qywx_obj()
        rds = redis_obj()
        if not rds.judge_redis_keys("key_for_msg"):
            rds.redis_cache("key_for_msg",qywx.access_token)
        if not rds.judge_redis_keys("key_for_info"):
            USER_INFO = qywx.user_info
            rds.redis_cache("key_for_info",json.dumps(USER_INFO))
        access_token_for_sendmsg = rds.get_access_from_redis("key_for_msg")
        USER_INFO = json.loads(rds.get_access_from_redis("key_for_info").decode())
    
        description = json.loads(GetData())
        alert_info = description['alerts']
        for n in range(len(alert_info)):
            hostname = alert_info[n]['labels']['vm_name']
            try:
                IP = "172.16." + hostname.split("-")[2]
            except:
                continue
            level = alert_info[n]['labels']['severity']
            Server_supervisor = hostname.split("-")[1]
            alertname = alert_info[n]['labels']['alertname']
            annotations = alert_info[n]['annotations']['summary']
            content = '''
            负责人:%s
            服务器地址:%s
            告警信息:%s
            严重程度:%s
            '''%(Server_supervisor, IP, annotations, level)
            usermail = "%s@qq.com"%Server_supervisor
            for index in range(len(USER_INFO)):
                if USER_INFO[index]["email"] == usermail:
                    TOUSER = USER_INFO[index]["userid"]
                    print(TOUSER, IP)
                    result = qywx.send_data(TOUSER, content, access_token_for_sendmsg)
                    print(result)
                    break
        return "OK", 200
        
     
    if __name__ == '__main__':
        app.run(debug = True, host = '172.16.40.24', port = 6688)
    

      

  • 相关阅读:
    DataGridView 移动行
    DataGridView 显示提示信息
    模块和类的区别
    C# 流总结
    很口语I'm on my way
    读书笔记_Effective_C++_条款二十三:宁以nonmember、nonfriend替换member函数
    PDB文件:每个开发人员都必须知道的
    qq农场,数据抓包分析,实现源码,图片讲解
    连连看外挂消去算法分析
    关于“服务器提交了协议冲突. Section=ResponseStatusLine"问题请
  • 原文地址:https://www.cnblogs.com/hel7512/p/13974126.html
Copyright © 2011-2022 走看看