1、介紹
Skywalking可以對鏈路追蹤到數據進行告警規則配置,例如響應時間、響應百分比等。發送警告通過調用webhook接口完成。webhook接口用戶可以自定義。
2、默認告警規則
告警配置文件:config/alarm-settings.yml
3、告警配置文件語法
rules:
<RULE_NAME>_rule: 規則名稱,必須以“_rule”結尾
metrics-name: <VALUES> oal腳本中的度量名稱
threshold 閾值
op 比較操作符“<、>、=”
period 多久檢查一次當前指標數據,默認為分鍾
count 表示到達多少次后發送告警信息
silence-period 在多久之內忽略相同的告警信息
message 告警內容
include-names 本規則告警生效的服務列表
webhooks:
告警信息產生后的回調地址,即調用這個接口發送出去。
4、配置alarm-settings.yml文件
5、重啟skywalking服務
6、默認規則
Skywalking默認提供的 alarm-settings.yml ,定義的告警規則如下:
過去3分鍾內服務平均響應時間超過1秒
服務成功率在過去2分鍾內低於80%
服務90%響應時間在過去3分鍾內高於1000毫秒
服務實例在過去2分鍾內的平均響應時間超過1秒
端點平均響應時間過去2分鍾超過1秒
7、警報消息application/json 格式
{
"scopeId": 1,
"scope": "SERVICE",
"name": "serviceA",
"id0": 12,
"id1": 0,
"ruleName": "service_resp_time_rule",
"alarmMessage": "alarmMessage xxxx",
"startTime": 1560524171000
}
解釋:
scopeId、scope:作用域,取值詳見 https://github.com/apache/skywalking/blob/v6.6.0/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java ;
name:目標作用域下的實體名稱;
id0:作用域下實體的ID,與名稱匹配;
id1:暫不使用;
ruleName: alarm-settings.yml 中配置的規則名稱;
alarmMessage:告警消息體;
startTime:告警時間(毫秒),時間戳形式。
8、python實現郵件告警webhook接口
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# Tile:
# Author:shy
#https://www.cnblogs.com/yy-cola/p/8066020.html
#https://www.cnblogs.com/qumogu/p/14317010.html
#https://www.cnblogs.com/leijiangtao/p/11757639.html
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_host="mail.abc.com"
sender_user="sa@abc.com"
sender_pwd = "1qaz@WSX"
sender_addr="sa@abc.com"
rec_addr="test@abc.com"
message_mail = MIMEText(content,"plain",'utf-8')
message_mail['Subject'] = 'Skywalking鏈路監控告警'
message_mail['From'] = sender_addr
message_mail['To'] = rec_addr
server = smtplib.SMTP_SSL(mail_host)
server.connect(mail_host,465)
server.login(sender_user,sender_pwd)
server.sendmail(sender_addr,rec_addr,message_mail.as_string())
return "成功"
if __name__ == "__main__":
app.run("172.16.1.2","5000")
##########################################################
skywalking調用接口url:
http://172.16.1.2:5000/send_mail