SkyWalking 告警功能

SkyWalking 告警功能是在 6.x 版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。

告警规则

  • 告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件。
  • Webhook(网络钩子):定义当警告触发时,哪些服务终端需要被告知。

常用告警规则

SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:

  • 过去 3 分钟内服务平均响应时间超过 1 秒。
  • 过去 2 分钟服务成功率低于80%。
  • 过去 3 分钟内服务响应时间超过 1s 的百分比
  • 服务实例在过去 2 分钟内平均响应时间超过 1s,并且实例名称与正则表达式匹配。
  • 过去 2 分钟内端点平均响应时间超过 1 秒。
  • 过去 2 分钟内数据库访问平均响应时间超过 1 秒。
  • 过去 2 分钟内端点关系平均响应时间超过 1 秒。

这些预定义的告警规则,打开config/alarm-settings.yml文件即可看到

告警规则配置项的说明

  • Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以_rule结尾,前缀可自定义
  • Include names:该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为全部)
  • Exclude names:该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空)
  • Threshold:阈值
  • OP: 操作符,目前支持 >、
  • Period:多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
  • Count:在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
  • Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警。 默认情况下,它和Period一样,这意味着相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次
  • Metrics name:度量名称,取值为oal脚本中的度量名,目前只支持long、double和int类型。详见Official OAL script
  • message:告警消息

Webhook(网络钩子)

Webhook可以简单理解为是一种Web层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不再是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件。当该事件发生时,SkyWalking就会主动去调用一个配置好的接口,该接口就是所谓的Webhook。

SkyWalking的告警消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,其JSON 数据实基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage进行序列化的

JSON数据示例

[{
    "scopeId": 1,
    "scope": "SERVICE",
    "name": "serviceA",
    "id0": "12",
    "id1": "",
    "ruleName": "service_resp_time_rule",
    "alarmMessage": "alarmMessage xxxx",
    "startTime": 1560524171000
}, {
    "scopeId": 1,
    "scope": "SERVICE",
    "name": "serviceB",
    "id0": "23",
    "id1": "",
    "ruleName": "service_resp_time_rule",
    "alarmMessage": "alarmMessage yyy",
    "startTime": 1560524171000
}]

字段说明

  • scopeId、scope:所有可用的 Scope 详见 org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
  • name:目标 Scope 的实体名称
  • id0:Scope 实体的 ID
  • id1:保留字段,目前暂未使用
  • ruleName:告警规则名称
  • alarmMessage:告警消息内容
  • startTime:告警时间,格式为时间戳

邮件告警

SkyWalking是不支持直接向邮箱、短信等服务发送告警信息的,SkyWalking只会在发生告警时将告警信息发送至配置好的Webhook接口。

功能实现

基于Spring Boot进行实现

引入依赖
<!-- 邮箱 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置邮箱
server:
  port: 9134

#邮箱配置spring:
  mail:
    host: smtp.163.com
    #发送者邮箱账号    
    username: xxxxx@163.com
    #发送者密钥    
    password: 你的邮箱服务密钥    
    default‐encoding: utf-8
    port: 465 #端口号465或587    
    protocol: smtp
    properties:
      mail:
      debug: false
      smtp:
        socketFactory:
          class: javax.net.ssl.SSLSocketFactory
定义接口

实现接收SkyWalking的告警通知,并将数据发送至邮箱

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/alarm")
public class SwAlarmController {

private final JavaMailSender sender;

@Value("${spring.mail.username}")
private String from;

/**
 * 接收skywalking服务的告警通知并发送至邮箱
 */
@PostMapping("/receive")
public void receive(@RequestBody List<SwAlarmDTO> alarmList) {
    SimpleMailMessage message = new SimpleMailMessage();
    // 发送者邮箱
    message.setFrom(from);
    // 接收者邮箱
    message.setTo(from);
    // 主题
    message.setSubject("告警邮件");
    String content = getContent(alarmList);
    // 邮件内容
    message.setText(content);
    sender.send(message);
    log.info("告警邮件已发送...");
}

    private String getContent(List<SwAlarmDTO> alarmList) {
        StringBuilder sb = new StringBuilder();
        for (SwAlarmDTO dto : alarmList) {
            sb.append("scopeId: ").append(dto.getScopeId())
            .append("\nscope: ").append(dto.getScope())
            .append("\n目标 Scope 的实体名称: ").append(dto.getName())
            .append("\nScope 实体的 ID: ").append(dto.getId0())
            .append("\nid1: ").append(dto.getId1())
            .append("\n告警规则名称: ").append(dto.getRuleName())
            .append("\n告警消息内容: ").append(dto.getAlarmMessage())
            .append("\n告警时间: ").append(dto.getStartTime())
            .append("\n\n‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐\n\n");
        }

        return sb.toString();
    }
}

将接口配置到SkyWalking中,Webhook的配置位于config/alarm-settings.yml文件的末尾,格式为http://{ip}:{port}/{uri}

# config/alarm-settings.yml
webhooks:
#  - http://127.0.0.1/notify/
#  - http://127.0.0.1/go-wechat/
   - http://127.0.0.1:8888/alarm/receive

测试

代码修改
public class ProductController {

    @Value("${server.port}")
    String serverPort;    @RequestMapping("/{id}")
    public Object get(@PathVariable("id") Integer id) throws InterruptedException {
        System.out.println("查询商品!!!");        
        // 告警构造        
        Thread.sleep(2000);        
        return "查询商品" + id + " ,server port: " + serverPort;    }
}
结果

测试 http://127.0.0.1:8021/stock/reduct?productId=1

  • 告警页面

  • 告警邮件

### Apache SkyWalking 告警配置教程 #### 配置文件位置 Apache SkyWalking告警功能由一组规则驱动,这些规则被定义在一个特定的 YAML 文件中。该文件通常位于 `config/alarm-settings.yml` 路径下[^1]。 #### 配置告警规则 在 `alarm-settings.yml` 中,可以通过设置不同的指标来触发告警条件。常见的告警规则包括但不限于服务响应时间、错误率和服务实例状态等。以下是部分常用的告警规则及其参数说明: - **Service Response Time**: 定义当某个服务的平均响应时间超过设定阈值时触发告警。 - **Error Rate**: 当某段时间内的错误请求比例高于预设值时触发告警。 具体配置项如下所示: ```yaml rules: service_response_time: threshold: 500 # 单位毫秒 period: 60 # 统计周期,单位秒 count: 3 # 达到阈值连续次数 silence_period: 300 # 告警静默期,单位秒 ``` 上述示例表示:如果某一服务的平均响应时间在最近一分钟内持续三次超过 500 毫秒,则会触发一次告警,并且在接下来的五分钟内不会重复发送相同的告警消息[^4]。 #### 发送告警通知 一旦满足告警条件,SkyWalking 将通过 Webhook 接口异步调用外部系统以传递告警信息。Webhook 地址需提前配置好,支持多种自定义集成方案,例如钉钉机器人、Slack 或者电子邮件等方式。 假设要实现钉钉告警,可按照以下模板构建 JSON 数据并将其推送至对应的 webhook URL: ```json { "msgtype": "text", "text": { "content": "【告警】服务 {{service_name}} 平均响应时间为 {{response_time}} ms, 已超出设定阈值!" } } ``` 需要注意的是,实际开发过程中可能还需要额外处理变量替换逻辑以及网络异常情况下的重试机制等问题。 #### 使用 CLI 工具辅助管理 除了直接编辑配置文件外,还可以借助官方提供的命令行界面 (CLI) 工具简化日常运维操作。比如查看当前生效中的所有报警策略列表或者测试连接目标接收端点是否正常工作等功能都可以轻松完成[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜逼の世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值