- 欢迎使用 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 代码提交者
- 如何构建项目
- 新度量指标的源和范围扩展
- 后端存储实体扩展
- 线程转储归并机制
新度量指标的源和范围扩展
从 OAL 域介绍, 中你应该已经了解到什么是域了.现在, 如果你想做更多扩展, 你需要深入了解什么是 源.
源 和 域 是相互绑定的概念. 域 声明了唯一标志(id)和名称(name), 源 声明了属性.请按照以下步骤来新建源和域.
- 在 OAP 核心模块中, 提供了 SourceReceiver 内部服务.
public interface SourceReceiver extends Service {
void receive(Source source);
}
- 所有分析数据必须是 org.apache.skywalking.oap.server.core.source.Source 的子类, 带有
@SourceType
注解且在org.apache.skywalking
包下, 此时它就可以被 OAL 脚本和 OAP 内核支持了
比如对于已经存在的源, Service.
@ScopeDeclaration(id = SERVICE_INSTANCE, name = "ServiceInstance", catalog = SERVICE_INSTANCE_CATALOG_NAME)
@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
public class ServiceInstance extends Source {
@Override public int scope() {
return DefaultScopeDefine.SERVICE_INSTANCE;
}
@Override public String getEntityId() {
return String.valueOf(id);
}
@Getter @Setter private int id;
@Getter @Setter @ScopeDefaultColumn.DefinedByField(columnName = "service_id") private int serviceId;
@Getter @Setter private String name;
@Getter @Setter private String serviceName;
@Getter @Setter private String endpointName;
@Getter @Setter private int latency;
@Getter @Setter private boolean status;
@Getter @Setter private int responseCode;
@Getter @Setter private RequestType type;
}
源中的
scope()
方法返回了一个 ID, 这并非一个随意的值, 这个 ID 也必须在@ScopeDeclaration
注解中声明. 对于同一个源,@ScopeDeclaration
和scope()
方法中的 ID 必须一致源中的
String getEntityId()
方法,请求返回代表和域相关的唯一实体的值. 比如说, 在这个Service
域中, id 就是 Service id, 代表某个特定的服务, 如Order
服务. 该值在 OAL 分组机制 中使用。@ScopeDefaultColumn.VirtualColumnDefinition
和@ScopeDefaultColumn.DefinedByField
是必须的, 所有声明的字段(virtual/byField)将被推入持久实体, 匹配例如 ElasticSearch 索引和数据库表的列。例如,主要包括实体 id,以及端点和服务实例级范围的服务 id。引用所有现有的作用域。 所有这些字段都是由 OAL 运行时检测到的,以及在查询阶段是必需的。将域名称作为关键字, 添加到
OALLexer.g4
语法定义文件中.OALLexer.g4
文件位于generate-tool-grammar
模块下的antlr4
文件夹下。将域名称作为关键字, 添加到
OALParser.g4
解析器定义文件中, 该文件与OALLexer.g4
位于同一级文件夹
做完以上步骤之后, 你就可以构建一个接收器了, 通常你需要
- 获取指标的原始数据
- 构建源, 发送到
SourceReceiver
- 编写完整的 OAL 脚本
- 重新打包项目
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论