Fork me on GitHub

Skywalking系列博客8-告警

目录

TIPS

本文基于Skywalking 6.6编写,理论支持Skywalking 6.0及更高版本。

Skywalking的告警由规则来定义。规则存放在 skywalking根目录/config/alarm-settings.yml 中。

该文件结构大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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://github.com/apache/skywalking/blob/v6.6.0/docs/en/concepts-and-designs/oal.md 阅读其定义;
  • 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 格式发送出去。消息例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[{
"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://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:告警时间(毫秒),时间戳形式。

根据如上消息体,可定义入参对象如下:

1
2
3
4
5
6
7
8
9
10
11
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编写如下即可:

1
2
3
4
5
6
7
8
9
public class SkyWalkingAlarmController {
@PostMapping("/alarm")
public IMOOCJSONResult alarm(@RequestBody List<SkyWalkingAlarm> alarms) {
// 接收到告警后的业务处理
// 根据服务发现组件上面的服务名称,找到对应的/actuator/info
// 进而找到对应的owner-email配置的值
return IMOOCJSONResult.ok();
}
}

相关文章

评论系统未开启,无法评论!