python3 实现skywalking调用webhook接口通过python3发送邮件告警
实现skywalking调用webhook接口通过python3发送邮件告警
1、介绍
SkyWalking 告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml
文件中。 告警规则的定义分为两部分:
- 告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件。
- Webhook(网络钩子):定义当警告触发时,哪些服务终端需要被告知
2、默认告警规
SkyWalking 的发行版都会默认提供config/alarm-settings.yml
文件,里面预先定义了一些常用的告警规则。如下:
- 过去3分钟内服务平均响应时间超过1秒
- 服务成功率在过去2分钟内低于80%
- 服务90%响应时间在过去3分钟内低于1000毫秒
- 服务实例在过去2分钟内的平均响应时间超过1秒
- 端点平均响应时间过去2分钟超过1秒
3、告警配置文件语法
- Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以
_rule
结尾,前缀可自定义 - Metrics name:度量名称,取值为oal脚本中的度量名,目前只支持
long
、double
和int
类型。详见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 请求进行发送,请求方法为 POST
,Content-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、执行任务产生告警进行测试。