• python3 实现skywalking调用webhook接口通过python3发送邮件告警


    实现skywalking调用webhook接口通过python3发送邮件告警

    1、介绍

    SkyWalking 告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。 告警规则的定义分为两部分:

    1. 告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件。
    2. Webhook(网络钩子):定义当警告触发时,哪些服务终端需要被告知

    2、默认告警规

    SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:

    1. 过去3分钟内服务平均响应时间超过1秒
    2. 服务成功率在过去2分钟内低于80%
    3. 服务90%响应时间在过去3分钟内低于1000毫秒
    4. 服务实例在过去2分钟内的平均响应时间超过1秒
    5. 端点平均响应时间过去2分钟超过1秒

    3、告警配置文件语法

    • Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以_rule结尾,前缀可自定义
    • Metrics name:度量名称,取值为oal脚本中的度量名,目前只支持longdoubleint类型。详见Official OAL script
    • Include names:该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为全部)
    • Exclude names:该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空)
    • Threshold:阈值
    • OP: 操作符,目前支持 ><=
    • Period:多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
    • Count:在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
    • Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警。 默认情况下,它和Period一样,这意味着相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次
    • message:告警消息

    Webhook(网络钩子)

    Webhook可以简单理解为是一种Web层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不再是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件。当该事件发生时,SkyWalking就会主动去调用一个配置好的接口,该接口就是所谓的Webhook。

    SkyWalking的告警消息会通过 HTTP 请求进行发送,请求方法为 POSTContent-Type 为 application/json,其JSON 数据实基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage进行序列化的。JSON数据示例:

    [{
        "scopeId": 1,
        "scope": "SERVICE",
        "name": "serviceA",
        "id0": 12,
        "id1": 0,
        "ruleName": "service_resp_time_rule",
        "alarmMessage": "alarmMessage xxxx",
        "startTime": 1560524171000
    }, {
        "scopeId": 1,
        "scope": "SERVICE",
        "name": "serviceB",
        "id0": 23,
        "id1": 0,
        "ruleName": "service_resp_time_rule",
        "alarmMessage": "alarmMessage yyy",
        "startTime": 1560524171000
    }]

    字段说明:

    • scopeId、scope:所有可用的 Scope 详见 org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
    • name:目标 Scope 的实体名称
    • id0:Scope 实体的 ID
    • id1:保留字段,目前暂未使用
    • ruleName:告警规则名称
    • alarmMessage:告警消息内容
    • startTime:告警时间,格式为时间戳

    4、python实现邮件告警webhook接口(Centos7 安装python3参考:https://www.cnblogs.com/yizhipanghu/p/14863293.html

    # !/usr/bin/env python
    # _*_ coding: utf-8 _*_
    
    from flask import Flask, request
    import smtplib
    from email.mime.text import MIMEText
    import time
    app = Flask(__name__)
    
    @app.route("/send_mail", methods=["POST"])
    def send_mail():
        info = request.json
        print("#########:",info, type(info))
        for i in info:
            alter_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(i["startTime"] / 1000))
            content = """
            警告时间:%s
            警告类型:%s
            服务名称:%s
            规则名称:%s
            详细内容:%s
            """ % (alter_time, i["scope"], i["name"], i["ruleName"], i["alarmMessage"])
            print(content)
            # 发送邮件
            mail_sever = 'smtp.aa.com'
            mail_user = 'test@11.com'
            mail_pass = '1qaz2WSX'
            sender = 'test@aa.com'
            reciver = 'test@aa.com'
            msg = MIMEText(content, "plain", 'utf-8')
            msg['Subject'] = 'Skywalking链路监控告警'
            msg['From'] = sender
            msg['To'] = reciver
            smtp = smtplib.SMTP()
            smtp.connect(mail_sever)
            smtp.login(user=mail_user,password=mail_pass)
            smtp.sendmail(sender,reciver,msg.as_string())
        return "成功"
    
    if __name__ == "__main__":
        app.run("0.0.0.0", "5000")

    skywalking调用接口url:

    http://10.10.10.1:5000/send_mail

    5、配置alarm-settings.yml文件,修改告警webhook配置

    [root@skywalking config]# vim alarm-settings.yml

    webhooks:
      - http://10.10.10.1:5000/send_mail

    注意:url后面一定要注意有没有斜杠

    6、重启skywalking服务(OAP和webapp两个服务都需要重启)

    [root@skywalking config]# jps
    12548 OAPServerStartUp
    26519 Jps
    32379 Elasticsearch
    12573 skywalking-webapp.jar
    102190 Logstash
    [root@skywalking config]# kill -9 12573 12548
    [root@skywalking config]# cd ../bin/
    [root@skywalking bin]# ./startup.sh

    7、Centos7后台启动python3脚本

    [root@skywalking config]# nohup python3 webhook_email.py &

     测试请求脚本:

    #coding=utf-8
    import requests
    
    url = 'http://10.10.10.1:5000/send_mail'
    d = [{
        "scopeId": 1,
        "scope": "SERVICE",
        "name": "serviceA",
        "id0": 12,
        "id1": 0,
        "ruleName": "service_resp_time_rule",
        "alarmMessage": "alarmMessage xxxx",
        "startTime": 1560524171000
    }, {
        "scopeId": 1,
        "scope": "SERVICE",
        "name": "serviceB",
        "id0": 23,
        "id1": 0,
        "ruleName": "service_resp_time_rule",
        "alarmMessage": "alarmMessage yyy",
        "startTime": 1560524171000
    }]
    
    r = requests.post(url, json=d)
    print(r.text)

    8、执行任务产生告警进行测试。 

     

     

    参考:https://www.cnblogs.com/shy01/p/14675515.html

    参考:https://www.yisu.com/zixun/89921.html

  • 相关阅读:
    HDU 1201 18岁生日 【日期】
    单点登录cas常见问题(二)
    IntelliJ IDEA 15和Maven创建Java Web项目
    ExpandableListView的使用以及信息的高亮显示
    基于RTP的h.264视频传输系统设计(一)
    RocketMQ 消息队列单机部署及使用
    使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结
    从JVM的角度看JAVA代码--代码优化
    Ajax系列之四:问题总结
    使用css打造形形色色的形状!
  • 原文地址:https://www.cnblogs.com/yizhipanghu/p/14863449.html
Copyright © 2020-2023  润新知