- 欢迎使用 SkyWalking
- 观测分析语言 Observability Analysis Language, OAL
- 仪表系统
- 设计目标
- 为什么 SkyWalking 体系中没有使用 MQ?
- 探针简介
- 观测分析平台
- 可视化
- 选择接收器
- 服务自动打点代理
- 手动打点 SDK
- 服务网格探针
- SkyWalking Java 代理支持列表
- 设置
- 协议
- 作用域 Scopes 和字段 Fields
- 概念与设计
- Backend 启动
- Backend 存储
- 安装 Java agent
- Open Fetcher
- 概念与设计总览
- 设置开发环境
- 组件库设置
- 插件自动测试框架
- 使用命令行导出
- 操作名称分组规则
- Spring 注解插件
- Oracle 和 Resin 插件
- 支持忽略自定义的 trace
- 支持自定义增强
- 配置覆盖
- 支持传输层安全性协议(TLS)
- 命名空间
- 令牌认证
- 令牌认证
- 兼容 OpenTracing 的 Skywalking tracer
- 安装 log4j
- 安装 log4j2
- logback 插件
- 应用程序工具包跟踪
- 跨线程追踪
- 通过系统属性动态定义 agent 配置文件
- 插件开发指南
- 在 Kubernetes 中部署
- 通过 ALS 观测服务网格
- UI
- 与 Istio 协作
- 配置 Envoy 来向 SkyWalking 发送度量指标
- 快速入门
- V6 升级
- SkyWalking 跨进程传播的头部协议
- OAP server 支持 gPRC SSL 传输
- 贡献指南
- 数据存储扩展
- 启动模式
- 设置的覆盖
- IP 和端口设置
- 初始化模式
- 集群管理
- 服务器端的跟踪采样
- 慢 SQL 语句设置
- 官方 OAL 脚本
- 告警
- 高级部署
- Metrics Exporter
- TTL
- 动态配置
- 无法打点的网关/代理
- 应用性能指数
- 端点分组参数化
- 后台遥测数据
- Apache SkyWalking 代码提交者
- 如何构建项目
- 新度量指标的源和范围扩展
- 后端存储实体扩展
- 线程转储归并机制
观测分析语言 Observability Analysis Language, OAL
在流模式(Streaming mode)下, SkyWalking 提供了 OAL 来分析流入的数据.
OAL 聚焦于服务, 服务实例以及端点的度量指标, 因此 OAL 非常易于学习和使用.
6.3版本以后, OAL引擎嵌入在OAP服务器运行时中,称为“OAL -rt”(OAL运行时)。 OAL脚本现在位于' /config '文件夹,用户可以简单地改变和重新启动服务器,使其有效。 但是,OAL脚本仍然是编译语言,OAL运行时动态生成java代码。 您可以在system env上打开set ' SW_OAL_ENGINE_DEBUG=Y ',查看生成了哪些类。
语法
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)
分析对象包括所有、服务、服务实例、端点、服务关系、服务实例关系、端点关系`. 当然还有一些二级域, 他们都属于以上某个一级域.
阅读 Scope Definitions, 你可以在该文中找到所有域和字段定义.
过滤器(Filter)
使用在使用过滤器的时候, 通过指定字段名或表达式来构建字段值的过滤条件.
表达式可以使用 and
, or
和 ()
进行组合. 操作符包含 =
, !=
, >
, <
, in (v1, v2, ...
, like "%..."
, 他们可以基于字段类型进行类型检测, 如果类型不兼容会在编译/代码生成期间报错.
聚合函数(Aggregation Function)
默认的聚合函数有 SkyWalking OAP 核心实现, 并可自由扩展更多函数.
提供的函数
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
.
sum
. 某个域实体的调用总数.
Service_Calls_Sum = from(Service.*).sum(); 本例统计每个服务的调用数.
histogram
. Read Heatmap in WIKI
All_heatmap = from(All.latency).histogram(100, 20); 在这个例子中 传入请求的热力图参数描述如下 参数(1)是计算延迟的精度,例如在上面的例子中,在101-200ms组中,113ms和193ms被认为是相同的. 参数(2)是分组数量。在上述情况下,一共有21组数据分别为0-100ms, 101-200ms,…1901 - 2000ms, 2000ms以上.
apdex
. Read Apdex in WIKI
service_apdex = from(Service.latency).apdex(name, status); 在本例中,该属性描述的是服务的应用性能指数评分. 参数(1)是服务名称,该阈值可以在配置文件service-apdex-threshold.yml中定义. The parameter (2) is the status of this request. The status(success/failure) effects the Apdex calculation.
p99
,p95
,p90
,p75
,p50
. Read percentile in WIKI
all_percentile = from(All.latency).percentile(10);
百分位是自7.0版本引入的第一个多值度量。由于有多个值,可以通过' getMultipleLinearIntValues ' GraphQL查询进行查询。 在本例中,所有传入请求的“p99”、“p95”、“p90”、“p75”、“p50”。参数是p99延迟计算的精度,如在上述情况下,120ms和124被认为是相同的。 在7.0.0之前,使用' p99 '、' p95 '、' p90 '、' p75 '、' p50 '函数分别计算指标。在7.x版本仍然支持,但不推荐且不包括在正式脚本。
All_p99 = from(All.latency).p99(10);
在本例中,p99为所有传入请求的值。参数是p99延迟计算的精度,如在上述情况下,120ms和124被认为是相同的。
度量指标名称
存储实现, 报警以及查询模块的度量指标名称. SkyWalking 内核支持自动类型推断.
组(Group)
所有度量指标数据都会使用 Scope.ID 和最小时间桶(min-level time bucket) 进行分组.
- 在端点(Endpoint)域中, Scope.ID = Endpoint 的 ID(基于服务及其端点的唯一标志).
#禁用
“Disable”是OAL中的高级语句,只在特定情况下使用。 一些聚合和度量是通过核心硬代码定义的, 这个“禁用”语句是设计用来让它们停止活动的, 比如' segment ', ' top_n_database_statement '。 在默认情况下,没有人是禁用的。
示例
// 计算 Endpoint1 和 Endpoint2 的 p99 值
Endpoint_p99 = from(Endpoint.latency).filter(name in ("Endpoint1", "Endpoint2")).summary(0.99)
// 计算端点名以 `serv` 开头的端点的 p99 值
serv_Endpoint_p99 = from(Endpoint.latency).filter(name like ("serv%")).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()
// 统计每个服务响应码在 [200, 299] 之间的百分比
Endpoint_200 = from(Endpoint.*).filter(responseCode like "2%").percent()
// 统计每个服务响应码在 [500, 599] 之间的百分比
Endpoint_500 = from(Endpoint.*).filter(responseCode like "5%").percent()
// 统计每个服务的调用总量
EndpointCalls = from(Endpoint.*).sum()
disable(segment);
disable(endpoint_relation_server_side);
disable(top_n_database_statement);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论