skywalking告警规则 - ola脚本

一.ola脚本字段含义

想自定义一部分Skywalking报警规则,比如响应码400,500等错误的报警,但是网上看了很多,发现对于Skywalking支持哪些指标名称metrics,官方文档跟博客几乎都是指明了一个路径,没有人详细的解释,支持哪些指标,这些指标的作用又有什么作用。

读了源码(8.1.0版本),总结如下:

Skywalking的oap指标存放在:/config/oal/*.oap 目录下。

先看一个core.oal指标

/ All scope metrics
all_percentile = from(All.latency).percentile(10);  // Multiple values including p50, p75, p90, p95, p99
all_heatmap = from(All.latency).histogram(100, 20); //

// Service scope metrics 服务
service_resp_time = from(Service.latency).longAvg(); // 服务的平均响应时间
service_sla = from(Service.*).percent(status == true); // 服务的请求成功率
service_cpm = from(Service.*).cpm(); //服务的每分钟调用次数
service_percentile = from(Service.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99
service_apdex = from(Service.latency).apdex(name, status); // 服务的应用性能指标,apdex的衡量的是衡量满意的响应时间与不满意的响应时间的比率,默认的请求满意时间是500ms

// Service relation scope metrics for topology 服务与服务间调用的调用度量指标
service_relation_client_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm();//在客户端检测到的每分钟调用次数
service_relation_server_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();//在服务端检测到的每分钟调用的次数
service_relation_client_call_sla = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).percent(status == true);//在客户端检测到成功率
service_relation_server_call_sla = from(ServiceRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);//在服务端检测到的成功率
service_relation_client_resp_time = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).longAvg();//在客户端检测到的平均响应时间
service_relation_server_resp_time = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).longAvg();//在服务端检测到的平均响应时间
service_relation_client_percentile = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).percentile(10); // Multiple values including p50, p75, p90, p95, p99
service_relation_server_percentile = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // Multiple values including p50, p75, p90, p95, p99

// Service Instance relation scope metrics for topology 服务实例与服务实例之间的调用度量指标
service_instance_relation_client_cpm = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm();//在客户端实例检测到的每分钟调用次数
service_instance_relation_server_cpm = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();//在服务端实例检测到的每分钟调用次数
service_instance_relation_client_call_sla = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.CLIENT).percent(status == true);//在客户端实例检测到的成功率
service_instance_relation_server_call_sla = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);//在服务端实例检测到的成功率
service_instance_relation_client_resp_time = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).longAvg();//在客户端实例检测到的平均响应时间
service_instance_relation_server_resp_time = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.SERVER).longAvg();//在服务端实例检测到的平均响应时间
service_instance_relation_client_percentile = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).percentile(10); // Multiple values including p50, p75, p90, p95, p99
service_instance_relation_server_percentile = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // Multiple values including p50, p75, p90, p95, p99

// Service Instance Scope metrics
service_instance_sla = from(ServiceInstance.*).percent(status == true);//服务实例的成功率
service_instance_resp_time= from(ServiceInstance.latency).longAvg();//服务实例的平均响应时间
service_instance_cpm = from(ServiceInstance.*).cpm();//服务实例的每分钟调用次数

// Endpoint scope metrics
endpoint_cpm = from(Endpoint.*).cpm();//端点的每分钟调用次数
endpoint_avg = from(Endpoint.latency).longAvg();//端口平均响应时间
endpoint_sla = from(Endpoint.*).percent(status == true);//端点的成功率
endpoint_percentile = from(Endpoint.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99

// Endpoint relation scope metrics
endpoint_relation_cpm = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();//在服务端端点检测到的每分钟调用次数
endpoint_relation_resp_time = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoint.SERVER).longAvg();//在服务端检测到的rpc调用的平均耗时
endpoint_relation_sla = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);//在服务端检测到的请求成功率
endpoint_relation_percentile = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // Multiple values including p50, p75, p90, p95, p99

database_access_resp_time = from(DatabaseAccess.latency).longAvg();//数据库的处理平均响应时间
database_access_sla = from(DatabaseAccess.*).percent(status == true);//数据库的请求成功率
database_access_cpm = from(DatabaseAccess.*).cpm();//数据库的每分钟调用次数
database_access_percentile = from(DatabaseAccess.latency).percentile(10);

告警的设置在/config/alarm-settings.yml文件

rules:
    # 告警规则 名称唯一 必须以_rule 结尾
  service_resp_time_rule:
      # 度量名称,只支持int long double
    metrics-name: service_resp_time
    # 操作符
    op: ">"
    # 阈值 ms
    threshold: 1000
    # 评估度量的时间长度
    period: 10
    # 度量有多少次符合告警条件后,才会触发告警
    count: 2
    # 静默时间 默认情况下,它和周期一样,在同一个周期内只会触发一次。
    silence-period: 10
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%
composite-rules:
  # 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾
  comp_rule:
    # 指定如何组成规则,支持&&, ||, ()操作符
    expression: service_resp_time_rule && service_sla_rule
    message: 服务【{name}】在最近10分钟内有2分钟平均响应时间超过1秒并且成功率低于80%

以上告警设置中用到了core.oal中的service_sla和service_resp_time,这些字段是在ola脚本中定义的,下面说说是如何定义的。

二.ola脚本介绍

官网
OAL介绍:https://github.com/apache/skywalking/blob/master/docs/en/guides/backend-oal-scripts.md

OAL规则语法:https://github.com/apache/skywalking/blob/master/docs/en/concepts-and-designs/oal.md

范围和字段:https://github.com/apache/skywalking/blob/master/docs/en/concepts-and-designs/scope-definitions.md

OAL简介
SkyWalking从8.0.0开始支持OAL脚本,它所在路径为:config/oal/*.oal。我们可以修改它,比如:添加过滤条件或者新的衡量标准,重启OAP生效。

Apache SkyWalking告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,alarm-settings.yml中的rules.xxx_rule.metrics-name对应的是config/oal路径下的配置文件中的详细规则:core.oal、event.oal,java-agent.oal, browser.oal。

endpoint 规则相比 service、instance 规则耗费更多内存及资源。

OAL(Observability Analysis Language):观测分析语言。

在流模式(Streaming mode)下,SkyWalking 提供了OAL来分析流入的数据。OAL 聚焦于服务,服务实例以及端点的度量指标,因此 OAL 非常易于学习和使用。

6.3版本以后,OAL引擎嵌入在OAP服务器运行时中,称为oal-rt(OAL运行时)。OAL脚本现在位于/config文件夹,用户可以简单地改变和重新启动服务器,使其有效。

但是,OAL脚本仍然是编译语言,OAL运行时动态生成Java代码。您可以在系统环境上设置SW_OAL_ENGINE_DEBUG=Y,查看生成了哪些类。

三.ola脚本自定义

上文提到的core.oal中的service_sla和service_resp_time,他们是怎么定义的以及如何自定义。
如:

service_resp_time = from(Service.latency).longAvg(); // 服务的平均响应时间

Service是个类在server-core服务中的org.apache.skywalking.oap.server.core.source包下,latency是Service的一个字段,而longAvg方法定义在server-core服务中的org.apache.skywalking.oap.server.core.analysis.metrics包下,用MetricsFunction标识,如longAvg方法定义如下:
在这里插入图片描述

类似cpm,percentile等方法都在org.apache.skywalking.oap.server.core.analysis.metrics包下实现。

以上介绍就可以实现一个自定义ola脚本在报警规则中使用了,如:

// 计算每个服务的响应码为[404, 500, 503]的总和
endpoint_abnormal = from(Endpoint.*).filter(responseCode in [404, 500, 503]).count()

responseCode 是Endpoint类中的一个字段,code码,表示 400 500等,count方法是总和在org.apache.skywalking.oap.server.core.analysis.metrics包下实现。自定义结束后就可以同service_sla和service_resp_time在报警规则中使用了。

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值