一.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在报警规则中使用了。