Skywalking告警配置+簡易郵件告警應用配置
前言:
前文:SkyWalking + Elasticsearch8 容器化部署指南:國內鏡像加速與生產級調優_skywalking+es-CSDN博客
? SKywalking Agent配置+Oracle監控插件安裝指南-CSDN博客
Skywalking
版本:V10.2.0
Skywalking Agent
版本:V9.4.0
一.告警規則配置及解釋
1.指標解釋
全局指標all_p99, 所有服務響應時間的 p99 值
all_p95
all_p90
all_p75
all_p70
all_heatmap, 所有服務響應時間的熱點圖
服務指標service_resp_time, 服務的平均響應時間
service_sla, 服務的成功率
service_cpm, 服務每分鐘調用次數
service_p99, 服務響應時間的 p99 值
service_p95
service_p90
service_p75
service_p50
服務實例指標service_instance_sla, 服務實例的成功率
service_instance_resp_time, 服務實例的平均響應時間
service_instance_cpm, 服務實例每分鐘調用次數
端點指標endpoint_cpm, 端點每分鐘調用次數
endpoint_avg, 端點平均響應時間
endpoint_sla, 端點成功率
endpoint_p99, 端點響應時間的 p99 值
endpoint_p95
endpoint_p90
endpoint_p75
endpoint_p50
JVM 指標, JVM 相關的指標, 只有當 javaagent 啟用時才有效instance_jvm_cpu
instance_jvm_memory_heap
instance_jvm_memory_noheap
instance_jvm_memory_heap_max
instance_jvm_memory_noheap_max
instance_jvm_young_gc_time
instance_jvm_old_gc_time
instance_jvm_young_gc_count
instance_jvm_old_gc_count
服務關系指標, 代表服務之間調用的指標 指標的 ID 只能在拓撲圖查詢中獲取service_relation_client_cpm, 在客戶端每分鐘檢測到的調用次數
service_relation_server_cpm, 在服務端每分鐘檢測到的調用次數
service_relation_client_call_sla, 在客戶端檢測到的成功率
service_relation_server_call_sla, 在服務端檢測到的成功率
service_relation_client_resp_time, 在客戶端檢測到的平均響應時間
service_relation_server_resp_time, 在服務端檢測到的平均響應時間
端點關系指標, 代表相互依賴的端點之間的指標. 只有在追蹤代理啟用時有效. 指標 ID 只能在拓撲查詢中獲得.endpoint_relation_cpm
endpoint_relation_resp_time
2.詳細規則配置
因前文中部署方法為docker
,故只需要修改容器外部的告警配置文件。
目前的告警配置如下:
rules:service_resp_time_rule:expression: sum(service_resp_time > 2000) >= 5period: 15silence-period: 30tags:level: WARNINGteam: platformmessage: "【WARNING】Service {name} 平均響應 > 2000ms(15 分鐘內 >=5 次)。"# 監控目標:服務成功率下降(輕度)。#含義:在“最近 15 分鐘”里,至少 3 次服務成功率低于 90%。service_sla_warning_rule:expression: sum(service_sla < 9000) >= 3period: 15silence-period: 45tags:level: WARNINGteam: platformmessage: "【WARNING】Service {name} 成功率 < 90%(15 分鐘內 >=3 次)。"#監控目標:服務成功率下降(重度)。#含義:在“最近 15 分鐘”里,至少 3 個次成功率低于 90%。service_sla_critical_rule:expression: sum(service_sla < 8500) >= 2period: 10silence-period: 60tags:level: CRITICALteam: platformmessage: "【CRITICAL】Service {name} 成功率 < 85%(10 分鐘內 >=2 次)。"hooks: ["webhook.mail"]#監控目標:服務尾延遲惡化(p95)。#含義:最近 10 分鐘內,p95(95% 的請求)超過3s ≥ 2service_resp_time_percentile_rule:expression: sum(service_percentile{p='95'} > 3000) >= 2period: 10silence-period: 45tags:level: CRITICALteam: backendmessage: "【CRITICAL】Service {name} p95 > 3000ms(10 分鐘內 >=2 次)。"hooks: ["webhook.mail"]#監控目標:某個實例平均響應時間升高。#含義:最近 15 分鐘內,至少 3 次該實例均值 > 2s。service_instance_resp_time_rule:expression: sum(service_instance_resp_time > 2000) >= 3period: 15silence-period: 30tags:level: WARNINGteam: opsmessage: "【WARNING】實例 {name} 平均響應 > 2000ms(15 分鐘內 >=3 次)。"database_access_resp_time_rule:expression: sum(database_access_resp_time > 2000) >= 3period: 15silence-period: 60tags:level: CRITICALteam: dbamessage: "【CRITICAL】DB {name} 響應 > 2000ms(15 分鐘內 >=3 次,疑似慢 SQL)。"hooks: ["webhook.mail"]#服務每分鐘調用次數(監控整個環境)service_offline_rule:expression: sum(service_cpm == 0) >= 15period: 15silence-period: 60tags:level: CRITICALteam: platformmessage: "【CRITICAL】Service {name} 連續 15 分鐘無流量(疑似掉線/假死)。"hooks: ["webhook.mail"]#service_instance_cpm, 服務實例每分鐘調用次數(監控單個服務)service_instance_offline_rule:expression: sum(service_instance_cpm == 0) >= 5period: 10silence-period: 60tags:level: WARNINGteam: opsmessage: "【WARNING】Instance {name} 連續 5 分鐘無流量(疑似掉線/假死)。"hooks: ["webhook.mail"]
hooks:webhook:mail:#is-default: trueurls:- http://<your IP>:9000/sendheaders:X-Auth-Token: "changeme-optional"
關鍵配置參數說明
expression
:告警觸發條件的表達式period
:統計時間窗口(分鐘)silence-period
:靜默期(分鐘),避免告警風暴tags
:告警標簽,用于分類和篩選level
:告警級別(WARNING/CRITICAL)team
:負責處理該告警的團隊hooks
:告警觸發時調用的 Webhook
配置成功后重啟Skywalking-oap
服務
docker restart skywalking-oap
確定沒有報錯后,即可再告警頁面看見所配置的告警信息
二.郵件告警通知配置以及郵件告警服務部署
1.告警服務代碼和鏡像構建
背景:在嘗試過官方的釘釘告警配置后一直無法生效,改為郵件告警形式,Skywalking郵件告警需要單獨寫一個告警服務。此處為Python。
import os
import smtplib
import ssl
from typing import List, Union
from flask import Flask, request, jsonify
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formatdate, make_msgidapp = Flask(__name__)# 環境變量配置(Docker 部署時傳入)
SMTP_HOST = os.getenv("SMTP_HOST", "smtp.qq.com")
SMTP_PORT = int(os.getenv("SMTP_PORT", 465))
SMTP_USER = os.getenv("SMTP_USER", "")
SMTP_PASS = os.getenv("SMTP_PASS", "")
MAIL_FROM = os.getenv("MAIL_FROM", SMTP_USER)
SUBJECT_PREFIX = os.getenv("SUBJECT_PREFIX", "[SkyWalking]")
API_TOKEN = os.getenv("API_TOKEN", "")# 默認收件人(支持環境變量配置)
MAIL_TO = os.getenv("MAIL_TO", "")
MAIL_CC = os.getenv("MAIL_CC", "")
MAIL_BCC = os.getenv("MAIL_BCC", "")@app.route("/send", methods=["POST"])
def send_mail():# 身份驗證(若配置 Token)if API_TOKEN and request.headers.get("X-Auth-Token") != API_TOKEN:return jsonify({"error": "Unauthorized"}), 401# 解析 SkyWalking 告警數據data = request.get_json()# 郵件內容構建和發送邏輯# ...if __name__ == "__main__":app.run(host="0.0.0.0", port=9000)
以下是鏡像打包時的Dockerfile
:
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
RUN pip install --no-cache-dir flask gunicorn
WORKDIR /app
COPY app.py /app/app.py
EXPOSE 9000
CMD ["gunicorn", "-b", "0.0.0.0:9000", "-w", "1", "--threads", "2", "app:app"]
把兩個文件放置于同一目錄,如下。
#執行打包命令
docker build -t mail-relay:1.0.0 .
然后部署服務,以下為運行的docker-compose.yml
:
services:mail-relay:image: mail-relay:1.0.0container_name: mail-relayrestart: unless-stoppedenvironment:SMTP_HOST: <smtp郵箱服務地址>SMTP_PORT: <smtp郵箱端口>SMTP_USER: <郵箱賬號>SMTP_PASS: <郵箱密鑰>MAIL_FROM: <郵箱>SUBJECT_PREFIX: "[SkyWalking]"API_TOKEN: "changeme-optional"MAIL_TO: "<郵箱接收者>,<郵箱接收者>"MAIL_CC: "<郵箱抄送者>"MAIL_BCC: ""ports:- "9000:9000"
運行成功后如下:
2.Skywalking
告警配置
在規則配置處可見文末有一處配置如下
hooks:webhook:mail:#is-default: trueurls:- http://<your IP>:9000/sendheaders:X-Auth-Token: "changeme-optional"
如果需要每一個告警都通過郵件告知,則無需注釋is-default: true
。注釋后,告警規則中包含hooks: ["webhook.mail"]
配置的才會通過郵件告警通知。
郵件告警輸出如下:
至此,Skywalking部署,插件安裝至告警,配置完畢。
附件:告警代碼文件下載地址