通過前面2篇文章我們搭建了SW的基礎環境,監控了微服務,能瞭解所有服務的運行情況。但是當出現服務響應慢,介面耗時嚴重時我們需要立即定位到問題,這就需要我們今天的主角 監控告警,同時此篇也是SW系列的最後一篇。 UI參數 首先我們認識一下SW DashBoard上的幾個關鍵參數,如下圖所示 告警配置 ...
通過前面2篇文章我們搭建了SW的基礎環境,監控了微服務,能瞭解所有服務的運行情況。但是當出現服務響應慢,介面耗時嚴重時我們需要立即定位到問題,這就需要我們今天的主角--監控告警,同時此篇也是SW系列的最後一篇。
UI參數
首先我們認識一下SW DashBoard上的幾個關鍵參數,如下圖所示
告警配置
告警流程
skywalking發送告警的基本原理是每隔一段時間輪詢skywalking-collector收集到的鏈路追蹤的數據,再根據所配置的告警規則(如服務響應時間、服務響應時間百分比)等,如果達到閾值則發送響應的告警信息。發送告警信息是以線程池非同步的方式調用webhook介面完成,(具體的webhook介面可以使用者自行定義),從而開發者可以在指定的webhook介面中自行編寫各種告警方式,釘釘告警、郵件告警等等。
規則配置
告警的核心由一組規則驅動,這些規則定義在 config/alarm-settings.yml
,打開之後如下所示:
告警規則的定義分為兩部分。
- 告警規則。它們定義了應該如何觸發度量警報,應該考慮什麼條件。
- [網路鉤子](#Webhook}。當警告觸發時,哪些服務終端需要被告知。
告警規則主要有以下幾點
- Rule name。 在告警信息中顯示的唯一名稱。必須以_rule結尾。
- Metrics name。 也是oal腳本中的度量名。
- Include names。 其下的實體名稱都在此規則中。比如服務名,終端名。
- Threshold。 閾值。
- OP。 操作符, 支持 >, <, =。
- Period.。 多久檢查一次當前的指標數據是否符合告警規則這是一個時間視窗,與後端部署環境時間相匹配。
- Count。 在一個Period視窗中,如果values超過Threshold值(按op),達到Count值,需要發送警報。
- Silence period。 在時間N中觸發報警後,在TN -> TN + period這個階段不告警。 預設情況下,它和Period一樣,這意味著相同的告警(在同一個Metrics name擁有相同的Id)在同一個Period內只會觸發一次
Webhook
SkyWalking 的告警 Webhook 要求對等方是一個 Web 容器. 告警的消息會通過 HTTP 請求進行發送, 請求方法為 POST, Content-Type 為 application/json, JSON 格式基於 List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage, 包含以下信息.
- scopeId. 所有可用的 Scope 請查閱
org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
. - name. 目標 Scope 的實體名稱.
- id0. Scope 實體的 ID.
- id1. 未使用.alarmMessage. 報警消息內容.
- startTime. 告警時間, 位於當前時間與 UTC 1920/1/1 之間.
[{
"scopeId": 1,
"name": "serviceA",
"id0": 12,
"id1": 0,
"alarmMessage": "alarmMessage xxxx",
"startTime": 1560524171000
}, {
"scopeId": 1,
"name": "serviceB",
"id0": 23,
"id1": 0,
"alarmMessage": "alarmMessage yyy",
"startTime": 1560524171000
}]
代碼實戰
- 編寫實體類用於接收sw告警消息
@Data
public class SwAlarmVO {
private int scopeId;
private String name;
private int id0;
private int id1;
private String alarmMessage;
private long startTime;
}
- 編寫webhook介面
@RestController
@RequestMapping("sw")
@Log4j2
public class AlarmController {
@PostMapping("/alarm")
public void alarm(@RequestBody List<SwAlarmVO> alarmList){
log.info("skywalking alarm message:{}",alarmList);
//todo doalarm
}
}
修改告警配置,開放webhook介面
為了模擬請求調用慢,我們在代碼中使用
Thread.sleep(1000)
增加介面耗時,然後等webhoook介面告警響應
詳細信息如下:
[SwAlarmVO(scopeId = 2, name = dubbo - consumer - pid: 13812 @ jianzhang11, id0 = 28, id1 = 0, alarmMessage = Response time of service instance dubbo - consumer - pid: 13812 @ jianzhang11 is more than 1000ms in 2 minutes of last 10 minutes, startTime = 1573122018755), SwAlarmVO(scopeId = 2, name = dubbo - provider2 - pid: 14108 @ jianzhang11, id0 = 25, id1 = 0, alarmMessage = Response time of service instance dubbo - provider2 - pid: 14108 @ jianzhang11 is more than 1000ms in 2 minutes of last 10 minutes, startTime = 1573122018755)]
此時webhook能正常接收到sw的告警信息,後續的消息通知直接定製開發即可。
相關文章:
請關註個人公眾號:JAVA日知錄