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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM