skywalking告警篇详细分析(二)

更新时间:2023-06-04 00:22:36 阅读: 评论:0

skywalking告警篇详细分析(⼆)
⽹上看了很多,发现对于Skywalking⽀持哪些指标名称metrics,官⽅⽂档跟博客⼏乎都是指明了⼀个路径,没有⼈详细的解释,⽀持哪些指标,这些指标的作⽤⼜有什么作⽤,导致⼤家⾃定义指标的时候有很多困难。
所以这⾥给⼤家总结下,如有错误,及时指正:
Skywalking的oap指标存放在:/apache-skywalking-apm-bin-es78/config/oal/*.oap ⽬录下
先来看第⼀个oap⽂件:
core.oal
1 / All scope metrics
2 all_percentile = from(All.latency).percentile(10);  // Multiple values including p50, p75, p90, p95, p99
3 all_heatmap = from(All.latency).histogram(100, 20); //
4蜂蜜炖雪梨的功效
5 // Service scope metrics 服务
n的正确写法6 rvice_resp_time = from(Service.latency).longAvg(); // 服务的平均响应时间
7 rvice_sla = from(Service.*).percent(status == true); // 服务的请求成功率
8 rvice_cpm = from(Service.*).cpm(); //服务的每分钟调⽤次数
9 rvice_percentile = from(Service.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99
10 rvice_apdex = from(Service.latency).apdex(name, status); // 服务的应⽤性能指标,apdex的衡量的是衡量满意的响应时间与不满意的响应时间的⽐率,默认的请求满意时间是500ms
11
12 // Service relation scope metrics for topology 服务与服务间调⽤的调⽤度量指标
13 rvice_relation_client_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm();//在客户端检测到的每分钟调⽤次数
14 rvice_relation_rver_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();//在服务端检测到的每分钟调⽤的次数
15 rvice_relation_client_call_sla = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).percent(status == true);//在客户端检测到成功率
16 rvice_relation_rver_call_sla = from(ServiceRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);//在服务端检测到的成功率
17 rvice_relation_client_resp_time = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).longAvg();//在客户端检测到的平均响应时间
18 rvice_relation_rver_resp_time = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).longAvg();//在服务端检测到的平均响应时间
19 rvice_relation_client_percentile = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).percentile(10); // Multiple values including p50, p75, p90, p95, p99
20 rvice_relation_rver_percentile = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // Multiple values including p50, p75, p90, p95, p99
21
22 // Service Instance relation scope metrics for topology 服务实例与服务实例之间的调⽤度量指标
23 rvice_instance_relation_client_cpm = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm();//在客户端实例检测到的每分钟调⽤次数
24 rvice_instance_relation_rver_cpm = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();//在服务端实例检测到的每分钟调⽤次数
25 rvice_instance_relation_client_call_sla = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.CLIENT).percent(status == true);//在客户端实例检测到的成功率
26 rvice_instance_relation_rver_call_sla = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);//在服务端实例检测到的成功率
27 rvice_instance_relation_client_resp_time = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).longAvg();//在客户端实例检测到的平均响应时间
28 rvice_instance_relation_rver_resp_time = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.SERVER).longAvg();//在服务端实例检测到的平均响应时间
29 rvice_instance_relation_client_percentile = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).percentile(10); // Multiple values including p50, p75, p90, p95, p99
30 rvice_instance_relation_rver_percentile = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // Multiple values including p50, p75, p90, p95, p99
31
32 // Service Instance Scope metrics
33 rvice_instance_sla = from(ServiceInstance.*).percent(status == true);//服务实例的成功率
34 rvice_instance_resp_time= from(ServiceInstance.latency).longAvg();//服务实例的平均响应时间
35 rvice_instance_cpm = from(ServiceInstance.*).cpm();//服务实例的每分钟调⽤次数
36
37 // Endpoint scope metrics
38 endpoint_cpm = from(Endpoint.*).cpm();//端点的每分钟调⽤次数
39 endpoint_avg = from(Endpoint.latency).longAvg();//端⼝平均响应时间
40 endpoint_sla = from(Endpoint.*).percent(status == true);//端点的成功率
41 endpoint_percentile = from(Endpoint.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99
42
43 // Endpoint relation scope metrics
44 endpoint_relation_cpm = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();//在服务端端点检测到的每分钟调⽤次数
45 endpoint_relation_resp_time = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoi
nt.SERVER).longAvg();//在服务端检测到的rpc调⽤的平均耗时
46 endpoint_relation_sla = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);//在服务端检测到的请求成功率
47 endpoint_relation_percentile = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // Multiple values including p50, p75, p90, p95, p99
48
49 databa_access_resp_time = from(DatabaAccess.latency).longAvg();//数据库的处理平均响应时间
50 databa_access_sla = from(DatabaAccess.*).percent(status == true);//数据库的请求成功率
51 databa_access_cpm = from(DatabaAccess.*).cpm();//数据库的每分钟调⽤次数
52 databa_access_percentile = from(DatabaAccess.latency).percentile(10);
java-agent.oal
/
/ JVM instance metrics
instance_jvm_cpu = from(ServiceInstanceJVMCPU.uPercent).doubleAvg();//jvm 平均cpu耗时百分⽐
instance_jvm_memory_heap = from(ServiceInstanceJVMMemory.ud).filter(heapStatus == true).longAvg();//jvm 堆空间的平均使⽤空间
instance_jvm_memory_noheap = from(ServiceInstanceJVMMemory.ud).filter(heapStatus == fal).longAvg();//jvm ⾮堆空间的平均使⽤空间
instance_jvm_memory_heap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == true).longAvg();//jvm 最⼤堆内存的平均值
instance_jvm_memory_noheap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == fal).longAvg();//jvm 最⼤⾮堆内存的平均值
instance_jvm_young_gc_time = from(ServiceInstanceJVMGC.time).filter(phra == GCPhra.NEW).sum();//年轻代gc的耗时
instance_jvm_old_gc_time = from(ServiceInstanceJVMGC.time).filter(phra == GCPhra.OLD).sum();//⽼年代gc的耗时
instance_jvm_young_gc_count = unt).filter(phra == GCPhra.NEW).sum();//年轻代gc的次数
instance_jvm_old_gc_count = unt).filter(phra == GCPhra.OLD).sum();//⽼年代gc的次数
instance_jvm_thread_live_count = from(ServiceInstanceJVMThread.liveCount).longAvg();//存活的线程数
instance_jvm_thread_daemon_count = from(ServiceInstanceJVMThread.daemonCount).longAvg();//守护线程数
instance_jvm_thread_peak_count = from(ServiceInstanceJVMThread.peakCount).longAvg();//峰值线程数
告警的设置
rules:
# 告警规则名称唯⼀必须以_rule 结尾
rvice_resp_time_rule:
# 度量名称,只⽀持int long double
metrics-name: rvice_resp_time
# 操作符
op: ">"
# 阈值 ms
threshold: 1000
# 评估度量的时间长度
period: 10
# 度量有多少次符合告警条件后,才会触发告警
count: 2
鸡蛋煎饺的做法# 静默时间默认情况下,它和周期⼀样,在同⼀个周期内只会触发⼀次。
silence-period: 10
message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
开斋节是哪个民族的rvice_sla_rule:
metrics-name: rvice_sla
op: "<"
threshold: 8000
period: 10
count: 2
silence-period: 10
缘起性空
message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%正月是什么月
composite-rules:
# 规则名称:在告警信息中显⽰的唯⼀名称,必须以_rule结尾
comp_rule:
# 指定如何组成规则,⽀持&&, ||, ()操作符
expression: rvice_resp_time_rule && rvice_sla_rule
message: 服务【{name}】在最近10分钟内有2分钟平均响应时间超过1秒并且成功率低于80%
本⽂介绍SkyWalking的OAL语法的⽤法。
官⽹
OAL介绍
OAL简介
SkyWalking从8.0.0开始⽀持OAL脚本,它所在路径为:config/oal/*.oal。我们可以修改它,⽐如:添加过滤条件或者新的衡量标准,重启OAP⽣效。
Apache SkyWalking告警是由⼀组规则驱动,这些规则定义在l⽂件中,l中的_ics-name对应的是config/oal路径下的配置⽂件中的详细规则:core.oal、event.oal,java-agent.oal, browr.oal。
endpoint 规则相⽐ rvice、instance 规则耗费更多内存及资源。
OAL(Obrvability 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,查看⽣成了哪些类。
配置⽰例
// 计算Endpoint1 和 Endpoint2 的 p99。
endpoint_p99 = from(Endpoint.latency).filter(name in ("Endpoint1", "Endpoint2")).summary(0.99)
// 计算以“rv”开头的端点名字的 p99。
rv_Endpoint_p99 = from(Endpoint.latency).filter(name like "rv%").summary(0.99)
// 计算每个端点的响应平均时长
endpoint_avg = from(Endpoint.latency).avg()
// 计算每个端点 p50,p75,p90,p95 and p99 的延迟柱状图,每隔 50 毫秒⼀条柱
endpoint_percentile = from(Endpoint.latency).percentile(10)
// 统计每个服务响应状态为 true 的百分⽐
endpoint_success = from(Endpoint.*).filter(status == true).percent()
// 计算每个服务的响应码为[404, 500, 503]的总和
endpoint_abnormal = from(Endpoint.*).filter(responCode in [404, 500, 503]).count()
// 计算每个服务的请求类型为[PRC, gRPC]的总和
endpoint_rpc_calls_sum = from(Endpoint.*).filter(type in [RequestType.PRC, RequestType.gRPC]).sum()
// 计算每个端点的端点名称为["/v1", "/v2"]的总和
endpoint_url_sum = from(Endpoint.*).filter(endpointName in ["/v1", "/v2"]).sum()
// 统计每个服务的调⽤总量
endpoint_calls = from(Endpoint.*).count()
// 计算每个服务的GET⽅法的CPM。值的组成为:`tagKey:tagValue`.
// ⽅案1, 使⽤`tags contain`.老舍骆驼祥子
rvice_cpm_http_get = from(Service.*).filter(tags contain "hod:GET").cpm()
// ⽅案2, 使⽤ `tag[key]`.
rvice_cpm_http_get = from(Service.*).filter(tag["hod"] == "GET").cpm();
// 计算每个服务的除了GET的⽅法的CPM。值的组成为:`tagKey:tagValue`.
rvice_cpm_http_other = from(Service.*).filter(tags not contain "hod:GET").cpm()
// 计算浏览应⽤的错误率。分⼦是FIRST_ERROR,分母是NORMAL
browr_app_error_rate = from(BrowrAppTraffic.*).rate(trafficCategory == BrowrAppTrafficCategory.FIRST_ERROR, trafficCategory == BrowrAppTrafficCategory.NORMAL);
disable(gment);
disable(endpoint_relation_rver_side);
disable(top_n_databa_statement);
默认的配置
东方明珠几点开灯config/oal/core.oal
config/oal/event.oal
config/oal/java-agent.oal
config/oal/browr.oal
OAL语法
OAL 脚本⽂件应该以 .oal 为后缀。
// Declare the metrics.
METRICS_NAME = from(SCOPE.(* | [FIELD][,FIELD ...]))
[.filter(FIELD OP [INT | STRING])]
.FUNCTION([PARAM][, PARAM ...])
// Disable hard code
disable(METRICS_NAME);
域(Scope)
域包括全局(All)、服务(Service)、服务实例(Service Instance)、端点(Endpoint)、服务关系(Service Relation)、服务实例关系(Service Instance Relation)、端点关系(Endpoint Relation)。
当然还有⼀些字段,他们都属于以上某个域。
过滤器(Filter)
使⽤在使⽤过滤器的时候,通过指定字段名或表达式来构建字段值的过滤条件。
表达式可以使⽤ and,or 和 () 进⾏组合。
操作符包含==,!=,>,<,>=,<=,in [...],like %...,like ...%,like %...%,他们可以基于字段类型进⾏类型检测,
如果类型不兼容会在编译/代码⽣成期间报错。
聚合函数(Aggregation Function)
默认的聚合函数由 SkyWalking OAP 核⼼实现。并可⾃由扩展更多函数。
提供的函数:
longAvg:某个域实体所有输⼊的平均值,输⼊字段必须是 long 类型。
instance_jvm_memory_max = from(ServiceInstanceJVMMemory.max).longAvg();
在上⾯的例⼦中,输⼊是 ServiceInstanceJVMMemory 域的每个请求,平均值是基于字段 max 进⾏求值的。
doubleAvg:某个域实体的所有输⼊的平均值,输⼊的字段必须是 double 类型。
i nstance_jvm_cpu = from(ServiceInstanceJVMCPU.uPercent).doubleAvg();
在上⾯的例⼦中,输⼊是 ServiceInstanceJVMCPU 域的每个请求,平均值是基于 uPercent 字段进⾏求值的。
percent:对于输⼊中匹配指定条件的百分⽐数.
endpoint_percent = from(Endpoint.*).percent(status == true);
在上⾯的例⼦中,输⼊是每个端点的请求,条件是 endpoint.status == true。
rate:对于条件匹配的输⼊,⽐率以100的分数表⽰。
b rowr_app_error_rate = from(BrowrAppTraffic.*).rate(trafficCategory == BrowrAppTrafficCategory.FIRST_ERROR, trafficCategory == BrowrAppTrafficCategory.NORMAL);
在上⾯的例⼦中,所有的输⼊都是每个浏览器应⽤流量的请求。分⼦的条件是trafficCategory == BrowrAppTrafficCategory.FIRST_ERROR,分母的条件是trafficCategory == BrowrAppTrafficCategory.NORMAL。
其中,第⼀个参数是分⼦的条件,第⼆个参数是分母的条件。
sum:某个域实体的调⽤总数。
s ervice_calls_sum = from(Service.*).sum();
在上⾯的例⼦中,统计每个服务的调⽤数。
histogram:热⼒图更多详见Heatmap in WIKI。
all_heatmap = from(All.latency).histogram(100, 20);
在上⾯的例⼦中,计算了所有传⼊请求的热⼒学热图。
第⼀个参数是计算延迟的精度,在上⾯的例⼦中,在101-200ms组中,113ms和193ms被认为是相同的。
第⼆个参数是分组数量,在上⾯的例⼦中,⼀共有21组数据分别为0-100ms,1901-2000ms,2000ms以上.
apdex:应⽤性能指数(Application Performance Index)
rvice_apdex = from(Service.latency).apdex(name, status);
在上⾯的例⼦中,计算了所有服务的应⽤性能指数。
第⼀个参数是服务名称,该名称的Apdex阈值在配置⽂件l中定义。
第⼆个参数是请求状态,状态(成功或失败)影响Apdex的计算。
P99,P95,P90,P75,P50:百分位更多详见Percentile in WIKI
百分位是⾃7.0版本引⼊的第⼀个多值度量。由于有多个值,可以通过getMultipleLinearIntValuesGrap
hQL查询进⾏查询。
all_percentile = from(All.latency).percentile(10);
在上⾯的例⼦中,计算了所有传⼊请求的 P99,P95,P90,P75,P50。参数是百分位计算的精度,在上例中120ms和124被认为是相同的。
度量指标名称(Metrics Name)
存储实现,告警以及查询模块的度量指标名称,SkyWalking 内核⽀持⾃动类型推断。
组(Group)
所有度量指标数据都会使⽤ Scope.ID 和最⼩时间桶(min-level time bucket) 进⾏分组。
在端点的域中,Scope.ID 为端点的 ID(基于服务及其端点的唯⼀标志)。
强制转换(Cast)
源的字段是静态类型。在⼀些情况下,过滤语句和聚合语句所需要的字段类型和源的字段类型不匹配,例如:源的tag的值是String类型,⼤部分的聚合计算需要是数字类型。强制转换表达式就是⽤来
解决这个的。
⽤法
(str->long) or (long), cast string type into long.
(str->int) or (int), cast string type into int.
⽰例:
mq_consume_latency = from((str->long)Service.tag["transmission.latency"]).longAvg(); // the value of tag is string type.
强制转换表达式⽀持如下位置:
From statement. from((cast)source.attre).
Filter expression. .filter((cast)tag["transmission.latency"] > 0)
Aggregation function parameter. .longAvg((cast)strField1== 1, (cast)strField2)
禁⽤(Disable)
Disable是OAL中的⾼级语句,只在特定情况下使⽤。
⼀些聚合和度量是通过核⼼硬代码定义的,这个Disable语句是设计⽤来让它们停⽌活动的,
⽐如gment, top_n_databa_statement。

本文发布于:2023-06-04 00:22:36,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/853662.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:服务   类型   计算   响应   检测   时间
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图