欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于SkyWalking的分布式跟踪系统 - 异常告警

程序员文章站 2022-06-07 12:02:29
通过前面2篇文章我们搭建了SW的基础环境,监控了微服务,能了解所有服务的运行情况。但是当出现服务响应慢,接口耗时严重时我们需要立即定位到问题,这就需要我们今天的主角 监控告警,同时此篇也是SW系列的最后一篇。 UI参数 首先我们认识一下SW DashBoard上的几个关键参数,如下图所示 告警配置 ......

通过前面2篇文章我们搭建了sw的基础环境,监控了微服务,能了解所有服务的运行情况。但是当出现服务响应慢,接口耗时严重时我们需要立即定位到问题,这就需要我们今天的主角--监控告警,同时此篇也是sw系列的最后一篇。

ui参数

首先我们认识一下sw dashboard上的几个关键参数,如下图所示
基于SkyWalking的分布式跟踪系统 - 异常告警

告警配置

告警流程

skywalking发送告警的基本原理是每隔一段时间轮询skywalking-collector收集到的链路追踪的数据,再根据所配置的告警规则(如服务响应时间、服务响应时间百分比)等,如果达到阈值则发送响应的告警信息。发送告警信息是以线程池异步的方式调用webhook接口完成,(具体的webhook接口可以使用者自行定义),从而开发者可以在指定的webhook接口中自行编写各种告警方式,钉钉告警、邮件告警等等。

规则配置

告警的核心由一组规则驱动,这些规则定义在 config/alarm-settings.yml,打开之后如下所示:
基于SkyWalking的分布式跟踪系统 - 异常告警

告警规则的定义分为两部分。

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

告警规则主要有以下几点

  • rule name。 在告警信息中显示的唯一名称。必须以_rule结尾。
  • metrics name。 也是oal脚本中的度量名。
  • include names。 其下的实体名称都在此规则中。比如服务名,终端名。
  • threshold。 阈值。
  • op。 操作符, 支持 >, <, =。
  • period.。 多久检查一次当前的指标数据是否符合告警规则这是一个时间窗口,与后端部署环境时间相匹配。
  • count。 在一个period窗口中,如果values超过threshold值(按op),达到count值,需要发送警报。
  • silence period。 在时间n中触发报警后,在tn -> tn + period这个阶段不告警。 默认情况下,它和period一样,这意味着相同的告警(在同一个metrics name拥有相同的id)在同一个period内只会触发一次

webhook

skywalking 的告警 webhook 要求对等方是一个 web 容器. 告警的消息会通过 http 请求进行发送, 请求方法为 post, content-type 为 application/json, json 格式基于 list<org.apache.skywalking.oap.server.core.alarm.alarmmessage, 包含以下信息.

  • scopeid. 所有可用的 scope 请查阅 org.apache.skywalking.oap.server.core.source.defaultscopedefine.
  • name. 目标 scope 的实体名称.
  • id0. scope 实体的 id.
  • id1. 未使用.alarmmessage. 报警消息内容.
  • starttime. 告警时间, 位于当前时间与 utc 1920/1/1 之间.
[{
    "scopeid": 1, 
        "name": "servicea", 
    "id0": 12,  
    "id1": 0,  
    "alarmmessage": "alarmmessage xxxx",
    "starttime": 1560524171000
}, {
    "scopeid": 1,
        "name": "serviceb",
    "id0": 23,
    "id1": 0,
    "alarmmessage": "alarmmessage yyy",
    "starttime": 1560524171000
}]

代码实战

  • 编写实体类用于接收sw告警消息
@data
public class swalarmvo {
    private int scopeid;
    private string name;
    private int id0;
    private int id1;
    private string alarmmessage;
    private long starttime;
}
  • 编写webhook接口
@restcontroller
@requestmapping("sw")
@log4j2
public class alarmcontroller {
    @postmapping("/alarm")
    public void alarm(@requestbody list<swalarmvo> alarmlist){
        log.info("skywalking alarm message:{}",alarmlist);
        //todo doalarm
    }
}
  • 修改告警配置,开放webhook接口

  • 为了模拟请求调用慢,我们在代码中使用thread.sleep(1000)增加接口耗时,然后等webhoook接口告警响应
    基于SkyWalking的分布式跟踪系统 - 异常告警

详细信息如下:
[swalarmvo(scopeid = 2, name = dubbo - consumer - pid: 13812 @ jianzhang11, id0 = 28, id1 = 0, alarmmessage = response time of service instance dubbo - consumer - pid: 13812 @ jianzhang11 is more than 1000ms in 2 minutes of last 10 minutes, starttime = 1573122018755), swalarmvo(scopeid = 2, name = dubbo - provider2 - pid: 14108 @ jianzhang11, id0 = 25, id1 = 0, alarmmessage = response time of service instance dubbo - provider2 - pid: 14108 @ jianzhang11 is more than 1000ms in 2 minutes of last 10 minutes, starttime = 1573122018755)]
此时webhook能正常接收到sw的告警信息,后续的消息通知直接定制开发即可。

相关文章:

基于skywalking的分布式跟踪系统 - 环境搭建

基于skywalking的分布式跟踪系统 - 微服务监控

请关注个人公众号:java日知录

基于SkyWalking的分布式跟踪系统 - 异常告警