SkyWalking告警
SkyWalking提供了强大的监控告警功能,在监控到应用出现问题的时候,会调用webhook或者gRPC hook或者Wechat DingDing等工具报告警告信息
而且SkyWalking已经提供了许多已经写好的监控告警规则参考config目录下的oal
所有的.oal文件中的每一行对应一个metrics name 对应一种监控规则 SkyWalking使用特殊的语法进行监控度量指标的绑定
如
service_resp_time = from(Service.latency).longAvg();
from(Server.latency)表示从服务Service的维度来度量.longAvg()表示度量的平均响应时间
告警配置文件
config/alarm-settings.yml
里面提供了一些默认告警配置比如响应时长监控 数据库慢查询等
拿一个配置来举例
rules:
# Rule unique name, must be ended with `_rule`.
service_resp_time_rule: # 自定义监控项名称 必须以_rule结尾
metrics-name: service_resp_time # metrics-name 度量方式 对应.oal里面一项
op: ">" # 操作符
threshold: 1000 #阈值
period: 10 # 时间窗口 10表示10min
count: 3 # 超过阈值的次数
silence-period: 5 # 停顿时间 如果 5分钟之类多次出现这个告警 不会调用hook
message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes. # 调用 hook的消息模板
以上监控告警项翻译过来就是 一个Service服务下 平均响应时长在10分钟之类有3次以上超过1000ms就调用hook发送message中的数据(如果5min多次超过阈值不会调用2次hook)
其他的告警项可以参考官方文档进行配置 也可以参考官网文档中的oal语法进行自定义度量规则
https://skywalking.apache.org/docs/main/latest/en/setup/backend/backend-alarm/
https://skywalking.apache.org/docs/main/latest/en/concepts-and-designs/oal/
编写我们自定的webhook
SkyWalking在触发告警之后可以发送一个POST请求的webHook给我们的服务,我们的服务可以通过获取的他告警的message信息调用自己的短信服务 Wechat DingDing之类的服务通知对应的人员进行故障的处理
下面以简单的webhook为例
-
首先编写一个javabean来接受post发送过来的数据
@Data public class SkyWalkingAlarmMessage { private int scopeId; private String scope; private String name; private String id0; private String id1; private String ruleName; private String alarmMessage; private long startTime; }
-
添加一个controller接口
@GetMapping("slow") public String slow() throws InterruptedException { TimeUnit.SECONDS.sleep(2); return "slow"; } @PostMapping("webhook") public void webhook(@RequestBody List<SkyWalkingAlarmMessage> messages) { messages.forEach(System.out::println); }
-
修改alarm-settings.yml配置文件
webhooks: - http://127.0.0.1:9090/webhook #指定回调地址 # - http://127.0.0.1/go-wechat/
-
然后多次请求 /slow接口造成响应时长慢的问题
-
最终/webhook收到Skywalking的告警信息
-
然后我们就可以拿到SkyWalking提供的告警信息来子定制自己的告警逻辑
使用nacos动态配置告警
-
安装nacos并启动 参考nacos官网文档略过
-
修改SkyWalking的application.yml配置文件中的configuration标签从none改为nacos
configuration: selector: ${SW_CONFIGURATION:nacos}
-
修改nacos的相关配置 主要需要修改nacos的地址 端口 账号密码 namespace 和 group
nacos: # Nacos Server Host serverAddr: ${SW_CONFIG_NACOS_SERVER_ADDR:127.0.0.1} # Nacos Server Port port: ${SW_CONFIG_NACOS_SERVER_PORT:8848} # Nacos Configuration Group group: ${SW_CONFIG_NACOS_SERVER_GROUP:skywalking} # Nacos Configuration namespace namespace: ${SW_CONFIG_NACOS_SERVER_NAMESPACE:test} # Unit seconds, sync period. Default fetch every 60 seconds. period: ${SW_CONFIG_NACOS_PERIOD:60} # Nacos auth username username: ${SW_CONFIG_NACOS_USERNAME:"nacos"} password: ${SW_CONFIG_NACOS_PASSWORD:"nacos"} # Nacos auth accessKey accessKey: ${SW_CONFIG_NACOS_ACCESSKEY:""} secretKey: ${SW_CONFIG_NACOS_SECRETKEY:""}
-
默认Skywalking 在nacos上的namespace为 test group为skywalking
-
在nacos上创建test的namespace 和 添加group 为skywalking的告警配置
-
添加告警配置
注意 在nacos的dataId必须跟skywalking官网里面的Dynamic Configuration的key一致 参考官网https://skywalking.apache.org/docs/main/latest/en/setup/backend/dynamic-config/
-
此时skywalking就会监听到nacos上的动态配置的修改
注意 Skywalking只有部分配置支持动态配置 具体参考官方文档里面Dynamic Configuration 中支持的Conig Key