开发者学堂课程【分布式链路追踪 Skywalking:告警功能】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/743/detail/13164
告警功能
内容介绍:
一、告警功能简介
二、Skywalking 默认的告警规则
一、告警功能简介
1.告警功能是相比比较灵活的,Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应时间百分比)等,判断如果达到阀值则发送相应的告警信息。发送告警信息是通过调用webhook接口完成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。告警功能是相比比较灵活的。
2.RocketBot
如图:
打开告警功能后,会发现什么数据都没有,这是因为目前并没有触发告警,所以需要模拟告警信息的产生。
二、Skywalking 默认的告警规则
默认的告警规则一般在 skywalking 安装目录下的config文件夹下 alarm-settings.yml 文件中。打开后如下图所示:
首先这是一个 y mail,最外层的是 rules,可以定义多个规则。如图:
每一条都代表一个规则,规则中就定义了规则生效的条件。要看懂规则,则需要学习规则的语法。规则名称、注释及图片如下:
1、metrics-name:对应某数据进行监控;oal脚本中的度量名称。目前用到的是service_resp_time也就是服务的返回时间。
2、service_resp_time_rule:对于服务的响应时间制定了一个规则。
3、Op:代表比较符,threshold代表预值(服务响应时间大于一秒钟的时候去触发告警。)
4、period:多久检查一次当前的指标数据是否触发预值(图中意为每十分钟去检测当前数据是否触发预值,默认单位是min)。
5、count指的是达到多少次后发送告警消息(图中指的是返回的数据必须大于三次)。
6、silence-period:指的是在多久之内,忽略相同的告警消息(图中指的是当告警产生的时候,五分钟之内不会重复发送告警信息)。
7、webhooks:指的是告警产生后的回调地址(通过调用接口的方法把告警信息传递到此接口中之后就可以对此接口进行扩展。例如发送短信)如图:
- 流程
1、打开 skywalking alarm 代码
打开后查看源码controller。如图:
此代码中只有一个接口timeout。模拟了一个超时的告警。
当我们大量的调用timeout接口时,就会产生告警,之后会通过webhook调用接口,把告警的数据传递过来。
2、编制 webHooks 编码
如图:
此代码提供了一个WebHooks的接口,让其能够接收到skywalking上报的告警消息,此告警消息需要自己封装,因为是通过post请求携带在请求体中传递过来的。本质上是一个多个对象,所以用list进行封装。List中的数据中的格式如下图所示:
其中scopeid、name、id0、id1、alarmMessage、startTime。这些字段会通过post请求传递给我们。
startTime:指的是开始时间也可以理解为产生的时间。
alarmMessage:指的是告警的消息
webhooks中还有一个方法show。如图:
因为webhook收到消息后需要有地方去展示,所以在内存内生成一个lastlist的对象。如图:
当收到 webhook 的消息后会把传递过来参数复制到这个对象中然后通过 show 接口能够把 AlarmMessage 也就是告警消息打印到浏览器上方便展示。
大体流程就是多次调用 timeout 让其产生一个告警,之后会触发 webhook 调用其中的 webhook 的接口,把告警信息传递进来,之后通过 show 接口把告警信息打印、核对。
3.模拟请求
查看发布的端口,如图:
首先修改告警配置,需要将webhook改为当前自己的接口。如图:
之后需要把此接口也调整为webhook接口,也就是/webhook。如图:
并进行保存。
重启skywalking的oap。如图:
之后找到ID 1835。如图:
再拉倒最底端编制代码ki11-9 1835。如图:
通过执行./oapservice.sh来重新启动。如图:
这样告警配置即可生效,现在可以准备告警的应用上传到服务器,之后切换到/usr/local/skywalking/目录下并启动alarm应用。如图:
启动命令为:java-javaagent:/usr/local/skywalking/apache-skywalking-apm-
bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_alarm
-jar skywalking_alarm.jar
将此命令拷贝到代码中(将多余的空格去掉)。如图:
执行后如图所示:
启动后通过8089端口访问timeout接口(注意:通过一次timeout接口是不行的因为告警规则中也判断了需要连续多次才能触发这次告警,所以需要不停的调用直到出现告警。告警可以在Rocketbot中查看)。如图:
在两分钟之内出现了多次1毫秒的请求所以进行了告警,告警力度是service instance也就是服务实例,服务实例超过一秒就会告警。
之后在查看webhook有没有收到此请求,用show接口来查看是否接收到告警信息。如图:
名称就是代表服务实例在62.141中,2162为进程号。同时此告警信息就代表service instance 也就是服务的实例超时了1秒钟,开始时间就是一个毫秒数需要去转换当前的时间才能看到具体时间。
当前案例就可以证明,当我们的skywalking产生告警的时候,它就会通过webhook接口传递到系统内部,系统就可以根据里面的告警信息来进行特别的处理(例如发送短信、发送邮件等)。