OAL简介在Streaming模式下,SkyWalking提供了ObservabilityAnalysisLanguage(OAL)来分析传入的数据。OAL专注于服务、服务实例和端点指标,因此OAL非常容易学习和使用。6.3版本之后,OAL引擎被嵌入到OAP服务器运行时中,称为oal-rt(OAL运行时)。OAL脚本现在位于/config文件夹中,用户只需更改并重新启动服务器即可生效。但是,OAL脚本仍然是一种编译型语言,OAL运行时动态生成Java代码。您可以在系统环境中设置SW_OAL_ENGINE_DEBUG=Y以查看生成了哪些类。OAL语法OAL脚本文件应以.oal结尾。//声明metrics.METRICS_NAME=from(SCOPE.(*|[FIELD][,FIELD...]))[.filter(FIELDOP[INT|STRING])].FUNCTION([PARAM][,PARAM...])//禁用硬代码禁用(METRICS_NAME);作用域包括全局(All)、服务(Service)、服务实例(ServiceInstance)、端点(Endpoint)、服务关系(ServiceRelation)、服务实例关系(ServiceInstanceRelation)、端点关系(EndpointRelation)。当然还有一些领域,它们都属于上述领域之一。过滤器(Filter)使用过滤器时,通过指定字段名或表达式来构造字段值的过滤条件。可以使用and、or和()组合表达式。运算符包括==、!=、>、<、>=、<=、in[...]、like%...、like...%、like%...%,它们可以基于fieldtype进行类型检测,如果类型不兼容,则在编译/代码生成时报错。聚合函数(AggregationFunction)默认的聚合函数由SkyWalkingOAP的核心实现。并且可以自由扩展更多的功能。提供的功能:longAvg:域实体所有输入的平均值,输入字段必须是long类型。instance_jvm_memory_max=from(ServiceInstanceJVMMemory.max).longAvg();在上面的示例中,输入是对ServiceInstanceJVMMemory域的每个请求,平均值是根据字段max计算的。doubleAvg:某个域实体所有输入的平均值,输入域必须是double类型。instance_jvm_cpu=from(ServiceInstanceJVMCPU.usePercent).doubleAvg();在上面的示例中,输入是对ServiceInstanceJVMCPU域的每个请求,平均值是根据usePercent字段计算的。percent:对于匹配指定条件的输入的百分比。endpoint_percent=from(Endpoint.*).percent(status==true);在上面的示例中,输入是对每个端点的请求,条件是endpoint.status==true。比率:条件匹配输入的比率表示为100的分数。browser_app_error_rate=from(BrowserAppTraffic.*).rate(trafficCategory==BrowserAppTrafficCategory.FIRST_ERROR,trafficCategory==BrowserAppTrafficCategory.NORMAL);在上面的例子中,所有的输入都是对每个浏览器应用流量的请求,分子条件是trafficCategory==BrowserAppTrafficCategory.FIRST_ERROR,分母条件是trafficCategory==BrowserAppTrafficCategory.NORMAL。其中,第一个参数是分子的条件,第二个参数是分母的条件。sum:域实体的调用总数。service_calls_sum=from(Service.*).sum();在上面的示例中,统计了每个服务的调用次数。histogram:热图,详见WIKI中的Heatmap。all_heatmap=from(All.latency).histogram(100,20);在上面的示例中,为所有传入请求计算了热力学热图。第一个参数是计算延迟的准确性。在上面的例子中,在101-200ms组中,113ms和193ms被认为是一样的。第二个参数是组数。上例中有21组数据分别为0-100ms,101-200ms...1901-2000ms,2000ms以上。apdex:应用性能指标,详见WIKI中的Apdex。service_apdex=from(Service.latency).apdex(name,status);在上面的示例中,应用程序性能指标是针对所有服务计算的。第一个参数是服务名称,其Apdex阈值在配置文件service-apdex-threshold.yml中定义。第二个参数是请求状态,状态(成功或失败)影响Apdex的计算。P99、P95、P90、P75、P50:percentile,详见WIKI中的Percentile。Percentile是自7.0版以来引入的第一个多值指标。由于有多个值,因此可以通过getMultipleLinearIntValuesGraphQL查询来查询。all_percentile=from(All.latency).percentile(10);在上面的示例中,为所有传入请求计算P99、P95、P90、P75、P50。该参数是百分位数计算的精度,在上面的例子中120ms和124被认为是一样的。指标名称(MetricsName)存储了实现、告警和查询模块的指标名称,SkyWalking内核支持自动类型推断。组(Group)所有的metric数据都会使用Scope.ID和min-leveltimebucket进行分组。在端点的域中,Scope.ID是端点的ID(基于服务及其端点的唯一标识符)。Disable(禁用)Disable是OAL中的高级语句,只在特定情况下使用。有些聚合和指标是通过核心硬代码定义的,这个Disable语句就是为了让它们不活跃,比如segment,top_n_database_statement。默认情况下,没有一个被禁用。示例//计算每个端点的平均响应时间endpoint_avg=from(Endpoint.latency).avg()//计算每个端点p50、p75、p90、p95和p99的延迟直方图,每50毫秒有一个条形endpoint_percentile=from(Endpoint.latency).percentile(10)//计算每个服务响应状态为true的百分比endpoint_success=from(Endpoint.*).filter(status==true).percent()//计算每个服务的responsecode是[404,500,503]的总和endpoint_abnormal=from(Endpoint.*).filter(responseCodein[404,500,503]).sum()//计算每个服务的请求类型为[PRC,sumofgRPC]endpoint_rpc_calls_sum=from(Endpoint.*).filter(typein[RequestType.PRC,RequestType.gRPC]).sum()//计算每个endpoint的endpoint名称为["/v1","/v2的总和"]endpoint_url_sum=from(Endpoint.*).filter(endpointNamein["/v1","/v2"]).sum()//统计每个服务的调用总数endpoint_calls=from(Endpoint.*).sum()disable(segment);disable(endpoint_relation_server_side);disable(top_n_database_statement);注:本文以SkyWalking8.2.0版本为例,版本不同会有细微差异。最后谢谢大家的喜欢和关注,帅气又漂亮。
