Skywalking:接入告警

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://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 格式发送出去。消息例如:

[{
	"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:告警时间(毫秒),时间戳形式。
    根据如上消息体,可定义入参对象如下:
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();
    }
}

你可能感兴趣的:(性能测试)