TIPS
本文基于Skywalking 6.6编写,理论支持Skywalking 6.0及更高版本。
Skywalking的告警由规则来定义。规则存放在 skywalking根目录/config/alarm-settings.yml 中。
该文件结构大致如下:
rules:
endpoint_percent_rule:
metrics-name: endpoint_percent
include-names:
- dubbox-provider
exclude-names:
- dubbox-consumer
threshold: 75
op: <
period: 10
count: 3
silence-period: 10
message: Successful rate of endpoint {name} is lower than 75%
webhooks:
- http://127.0.0.1/notify/
- http://127.0.0.1/go-wechat/规则
第一部分是规则定义。
规则定义
规则的key的含义如下:
- endpoint_percent_rule:规则名称,将会在告警消息体中展示,必须唯一,且以 _rule 结尾;
- metrics-name:度量名称,取值可在 skywalking根目录/config/official_analysis.oal 中找到,填写其中的key即可,对OAL感兴趣的,可前往 https:///apache/skywalking/blob/v6.6.0/docs/en/concepts-and-designs/ 阅读其定义;
- include-names:将此规则作用于匹配的实体名称上,实体名称可以是服务名称或端点名称等
- exclude-names:将此规则作用于不匹配的实体名称上,实体名称可以是服务名称或端点名称等
- threshold:阈值
- op:操作符,目前支持 >、<、=
- period:多久检测一次告警规则,即检测规则是否满足的时间窗口,与后端开发环境匹配
- count:在一个period窗口中,如果实际值超过该数值将触发告警
- silence-period:触发告警后,在silence-period这个时间窗口中不告警,该值默认和period相同。例如,在时间T这个瞬间触发了某告警,那么在(T+10)这个时间段,不会再次触发相同告警
- message:告警消息体,{name} 会解析成规则名称
默认规则
Skywalking默认提供的 alarm-settings.yml ,定义的告警规则如下:
- 过去3分钟内服务平均响应时间超过1秒
- 服务成功率在过去2分钟内低于80%
- 服务90%响应时间在过去3分钟内高于1000毫秒
- 服务实例在过去2分钟内的平均响应时间超过1秒
- 端点平均响应时间过去2分钟超过1秒
Webhook
Webhook表达的意思是,当告警发生时,将会请求的地址URL(用POST方法)。警报消息将会以 application/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:作用域,取值详见 https:///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:告警时间(毫秒),时间戳形式。
根据如上消息体,可定义入参对象如下:
public class SkyWalkingAlarm {
private Integer scopeId;
private String scope;
private String name;
private Integer id0;
private Integer id1;
private String ruleName;
private String alarmMessage;
private Long startTime;
// getters and setters...
}Controller编写如下即可:
public class SkyWalkingAlarmController {
@PostMapping("/alarm")
public IMOOCJSONResult alarm(@RequestBody List<SkyWalkingAlarm> alarms) {
// 接收到告警后的业务处理
//根据服务发现组件上面的服务名称,找到对应的/actuator/info
// 进而找到对应的owner-email配置的值
return IMOOCJSONResult.ok();
}
}
















