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

posted @ 2021-06-08 16:39  香菜哥哥  阅读(1352)  评论(0编辑  收藏  举报