實現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、執行任務產生告警進行測試。



