ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache SkyWalking 8.0.0 核心变更深度解析:v3 协议、GraphQL 查询与 OAP 存储模型重构

Apache SkyWalking 8.0.0 核心变更深度解析:v3 协议、GraphQL 查询与 OAP 存储模型重构 可观测性APM链路追踪指标监控日志分析微服务【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sk/skywalking点击查看免费下载8.0.0 是 Apache SkyWalking 演进历程中一个重要的里程碑版本它引入了全新的 v3 数据上报协议移除了沿袭已久的 Service/Instance/Endpoint 注册机制与 inventory 存储实体并推出了新的 GraphQL 查询协议与 Prometheus 网络协议支持。本文以官方变更文档docs/en/changes/changes-8.0.0.md为主线结合当前仓库中的源码与配置文件逐条还原这些变更背后的实现细节帮助你理解从 7.x 升级到 8.x 时为什么需要迁移、迁移后能获得什么。版本定位一次协议级的不兼容升级Project 关键变更v3 protocol 已新增并实现所有历史版本与 8.x 版本不兼容。移除了 Service、Instance、Endpoint 注册机制及 inventory 存储实体。提供新的 GraphQL 查询协议旧协议仍受支持计划在年底移除。支持 Prometheus 网络协议Prometheus 格式指标可接入 SkyWalking。提供 Python agent。移除所有 inventory 缓存。提供 Apache ShardingSphere4.1.0、4.1.1agent 插件。8.0.0 的定位是协议级不兼容升级。变更文档明确写道All previous releases are incompatible with 8.x releases即旧版本的 Agent 与 8.x 的 OAP 之间无法直接互通升级时必须同步升级上报端。这一点在规划 8.0.0 升级路径时需优先评估。本次升级在项目层面的整体收益可以归纳为四类通信协议换代v3 协议上线取代自 6.x 以来使用的 v2 协议元数据模型瘦身移除注册机制与 inventory 存储实体进而移除全部 inventory 缓存显著降低 OAP 内存占用查询能力升级GraphQL 查询协议上线指标查询有了更规范的表达方式生态扩展支持 Prometheus 格式指标直连接入新增 Python agent 与 ShardingSphere 插件。架构级重构注册机制与 inventory 的移除注册机制为何被移除在 8.0.0 之前Agent 上报的 Service、Instance、Endpoint 名称需要先经过 OAP 的注册流程由 OAP 为每个实体分配一个全局唯一的 IDInventory ID之后的所有数据上报都基于这些 ID 进行。这套机制引入了额外的 RPC 交互、注册表存储与缓存。8.0.0 将这一机制整体移除Service、Instance、Endpoint 不再作为 inventory 实体持久化名称直接进入分析链路。随之而来的是所有 inventory 缓存的删除官方在变更文档中明确指出这一改动带来的收益是Reduce the memory cost降低内存开销。从源码看无缓冲文件的实现变更文档还提到No buffer files in tracing and service mesh cases.即 Trace 与 Service Mesh 场景下不再产生 buffer 文件数据直接进入分析处理流进一步减少磁盘 I/O 与端到端延迟。v3 协议Agent 与 OAP 之间的新语言v3 协议是 8.0.0 的核心基础能力它同时服务于Trace 数据上报Segment/Span 数据结构在 v3 中重新设计协议文件位于 apm-protocol/apm-network/src/main/proto当前仓库中该目录的 proto 定义通过构建生成 Java 代码Java 源文件位于 apm-protocol/apm-network/src/main/javaJVM 指标上报JVM 运行时指标通过 v3 协议传输服务网格遥测mesh 遥测数据同样迁移至 v3 协议。对于 Java Agentv3 协议带来的一项直接变化是v3 extension header 的支持见下文 Java Agent 章节即 Agent 与 OAP 之间交互的扩展头部格式随协议换代而更新用于传递 propagation context 等扩展信息。新的查询协议GraphQL变更文档对查询侧的描述是New GraphQL query protocol is provided, the legacy protocol is still supported (plan to remove at the end of this year).New GraphQL query protocol is provided. Support the metrics type query.8.0.0 推出了基于 GraphQL 的查询协议替代原先的基于 REST/JSON 的查询协议。旧协议仍保留兼容但官方计划在当年年底移除因此新项目应直接基于 GraphQL 协议对接。从当前仓库的实现看GraphQL 查询能力由 oap-server/server-query-plugin/query-graphql-plugin 提供该目录下包含 52 个 Java 源文件支持指标metrics、拓扑、Trace、日志等多类查询。变更文档特别强调Support the metrics type query意味着 8.0.0 的 GraphQL 协议对指标类型查询做了完整定义为上层 UI 与第三方系统读取指标数据提供了统一入口。Prometheus 网络协议让 Prometheus 生态指标走进 SkyWalking8.0.0 支持Prometheus network protocolPrometheus 格式的指标可以直接传输进 SkyWalkingSupport Prometheus network protocol. Metrics in Prometheus format could be transferred into SkyWalking.Support meter system for Prometheus adoption. In future releases, we will add native meter APIs and MicroMeter(Sleuth) system.这里涉及两层能力网络协议接入支持 Prometheus 文本格式的指标抓取/推送Meter 系统OAP-BackendOAP 侧新增 meter 分析系统用于将 Prometheus 风格的指标转换为 SkyWalking 的指标体系。变更文档预告后续版本会增加原生 meter API 与 MicroMeter(Sleuth) 系统。在当前仓库中meter 相关的核心代码位于 oap-server/analyzer/meter-analyzer含 86 个 Java 源文件与 2 个 ANTLR grammar 文件它负责把外部指标源的数据经过解析、聚合后写入 OAP 指标存储。也就是说8.0.0 开启的 meter 系统是后续 8.x 系列中接入 Prometheus/OpenTelemetry 等外部指标生态的基石。OAP-Backend 存储与查询的核心升级Endpoint Grouping端点分组Support endpoint grouping.端点分组允许运维人员将形态相似、但路径参数不同的端点如/orders/{id}、/users/1归并为同一逻辑端点避免指标碎片化。当前仓库中该能力的核心实现为EndpointNameGrouping.java运行期的端点名分组入口EndpointGroupingRule.java 与 EndpointGroupingRuleReader.java规则定义与读取EndpointNameGroupingRuleWatcher.java负责动态感知规则变化并热更新。端点分组规则的配置方式与更多细节可参考 endpoint-grouping-rules.md。SuperDataSet 注解与 ElasticSearch 超大数据集优化这是 8.0.0 在存储层最重要的两个新能力AddSuperDataSetannotation for storage entity.AddsuperDatasetIndexShardsFactorin the ElasticSearch storage, to provide more shards for SuperDataSet annotated entities. Typically TraceSegment.SuperDataSet 注解是什么SuperDataSet是一个作用于存储实体类Target(ElementType.TYPE)的运行时注解用于标记超大规模数据集实体其定义位于 SuperDataset.java/** * This annotation applies to the supersize dataset entity. Storage implementation could provide different and specific * optimization as this entity has much larger dataset. */ Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface SuperDataset { }注释中明确说明该注解用于标记超大数据集实体存储实现可以针对这类实体提供特定的优化——因为这些实体的数据量远大于普通实体。典型的被标记实体是 Trace Segment。在 SegmentRecord.java 中可以看到SuperDataset Stream(name SegmentRecord.INDEX_NAME, ...) public class SegmentRecord extends Record { ... }同理日志记录 LogRecord.java、Zipkin 记录 ZipkinSpanRecord.java、浏览器错误日志 BrowserErrorLogRecord.java 等高频、海量写入的 Record 类型同样带有该注解。superDatasetIndexShardsFactor为超大索引提供更多分片在 ElasticSearch 存储实现中SuperDataSet实体对应的索引会获得独立的索引配置。核心配置项superDatasetIndexShardsFactor定义于 StorageModuleElasticsearchConfig.javaprivate int superDatasetIndexShardsFactor 5;其语义为super dataset 索引的分片数 indexShardsNumber × superDatasetIndexShardsFactor。默认indexShardsNumber 1、superDatasetIndexShardsFactor 5因此默认情况下 TraceSegment 等超大索引会获得 5 个分片而普通索引仅 1 个分片。在写入量大的集群上适当调大该因子可以显著提升 Trace 类数据的写入与查询吞吐。在默认配置文件 oap-server/server-starter/src/main/resources/application.yml 中与 super dataset 相关的三个配置项及环境变量覆盖方式为elasticsearch: # Super data set has been defined in the codes, such as trace segments. superDatasetDayStep: ${SW_STORAGE_ES_SUPER_DATASET_DAY_STEP:-1} # 超大数据集记录索引按多少天滚动小于 0 时默认与 dayStep 一致 superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # 分片数 indexShardsNumber * superDatasetIndexShardsFactor对 Zipkin trace 同样生效 superDatasetIndexReplicasNumber: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_REPLICAS_NUMBER:0} # 超大数据集记录索引的副本数默认 0从 TimeSeriesUtils 看索引如何拆分SuperDataSet不只影响分片数还影响索引的时间后缀计算。在 TimeSeriesUtils.java 中可以看到public static String latestWriteIndexName(Model model) { String tableName IndexController.INSTANCE.getTableName(model); long dayTimeBucket TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Day); if (model.isRecord() model.isSuperDataset()) { return tableName Const.LINE compressTimeBucket(dayTimeBucket, SUPER_DATASET_DAY_STEP); } return tableName Const.LINE compressTimeBucket(dayTimeBucket, DAY_STEP); }即当实体同时满足是 Record且带 SuperDataSet 注解时索引名的日期后缀使用独立的SUPER_DATASET_DAY_STEP默认与全局dayStep一致计算普通指标/记录索引则使用全局DAY_STEP。这样超级数据集就拥有了独立的索引滚动节奏可以与普通索引差异化运维。注意8.0.0 时点引入的是superDatasetIndexShardsFactorsuperDatasetDayStep、superDatasetIndexReplicasNumber两个配套项在后续 8.2.0 版本中补充源码注释标注since 8.2.0。当前仓库的 application.yml 已包含完整三项配置可直接参考使用。告警能力扩展Support alarm settings for relationship of service, instance, and endpoint level metrics.Support alarm settings for database (conjecture node in tracing scenario).8.0.0 的告警设置扩展了两类场景关系型指标告警可以针对 Service、Instance、Endpoint 各层级之间的关系指标如调用关系、依赖关系设置告警规则数据库Trace 场景中的推测节点告警在 Trace 分析中未被显式埋点的中间件如数据库会被构建为 conjecture node推测节点现在可以为这类节点的指标设置告警。告警规则的具体配置方式可参考 alarm-settings.yml仓库根目录下的示例配置与官方文档 backend-alarm.md。数据模型动态加载与缓存重构Data Model could be added in the runtime, dont depend on the bootstrap sequence anymore.New ReadWriteSafe cache implementation. Simplify codes.Provide default way for metrics query, even the metrics doesnt exist.这一组变更解决了 OAP 的两个老问题数据模型不再依赖启动顺序此前数据模型Data Model的注册可能依赖模块的启动先后顺序8.0.0 之后模型可以在运行时动态加入模块化扩展更加灵活新缓存实现 ReadWriteSafe以读写安全ReadWriteSafe缓存替代旧的 inventory 缓存体系简化代码并配合移除 inventory 缓存的整体目标指标查询兜底即使某指标尚未被写入任何数据查询也会返回默认值而不是报错避免 UI 与第三方查询端因指标不存在而中断。指标命名长度规则Set up length rule of service, instance, and endpoint.8.0.0 为 Service、Instance、Endpoint 的名称长度设定了规则防止超长名称导致存储与查询异常。当前仓库中命名长度与格式校验相关的逻辑可参见 NamingControl.java位于 oap-server/server-core 的 config 包其中定义了名称的最大长度限制等规则。其他修复与加固变更文档还列出多项后端修复修复 Apdex 函数整数溢出问题Apdex 计算在极端耗时场景下可能溢出8.0.0 修复了该问题修复 profile 存储问题修复 TTL 问题修复 H2 列类型 bug调整 ElasticSearch 默认 jks 为空默认不再携带证书库避免默认安全配置误导后端新增 JRE 8-14 兼容性测试。Java Agent 侧变更新插件与插件增强Add MariaDB plugin.Vert.x plugin enhancement. More cases are covered.Fix ElasticSearch 5.x plugin TransportClient error.Refactor spring cloud gateway plugin and support tracing spring cloud gateway 2.2.x.8.0.0 的 Java Agent 新增/增强内容MariaDB 插件支持 MariaDB 驱动的调用链追踪Vert.x 插件增强覆盖更多 Vert.x 使用场景Vert.x 是流行的响应式框架其异步回调链路追踪一直是难点ElasticSearch 5.x 插件修复修复 TransportClient 使用场景下的错误Spring Cloud Gateway 插件重构重构插件实现并支持追踪 Spring Cloud Gateway 2.2.xApache ShardingSphere4.1.0、4.1.1agent 插件为分库分表中间件 ShardingSphere 提供链路追踪支持对应 Project 章节中的该条目。协议与生命周期改进Support v3 extension header.Support Correlation protocol v1.Fix Finagle plugin bug, in processing Noop Span.MakeCommandServicedaemon to avoid blocking target application shutting down gracefully.v3 extension header配合 v3 协议Agent 支持新的扩展头格式Correlation protocol v1支持跨进程关联数据Correlation Context协议 v1用于在调用链上下游之间传递自定义业务上下文相关协议说明可参考 x-process-correlation-headers-v1.mdFinagle 插件修复修复处理 Noop Span 时的 bugNoop Span 用于采样关闭场景下的空实现避免性能损耗CommandService 改为 daemon 线程OAP 下发给 Agent 的命令处理线程调整为守护线程避免阻塞目标应用优雅关闭——这是一个很实际的运维改进防止 Agent 线程导致应用停机流程卡住。UI、文档与安全UI100% 可配置仪表盘UI dashboard is 100% configurable to adopt new metrics definited in the backend.8.0.0 的 UI 仪表盘完全可配置化后端新增的任意指标都可以通过配置在前端仪表盘中呈现无需修改前端代码。这意味着后端定义指标 → 前端渲染图表的闭环被打通指标扩展成本大幅降低。文档改进Add v8 upgrade document.Make the coverage accurate including UT and e2e tests.Add miss doc about collecting parameters in the profiled traces.新增 v8 升级文档本次 8.0.0 变更说明即为其一部分测试覆盖率统计口径更准确包含 UT 与 e2e 测试补齐了 profiled traces 中采集参数的文档说明对应 Trace 剖析/Profile 功能的参数采集说明。CVE 修复Fix SQL Injection vulnerability in H2/MySQL implementation.Upgrade Nacos to avoid the FastJson CVE in high frequency.Upgrade jackson-databind to 2.9.10.8.0.0 修复了三个安全问题H2/MySQL 实现中的 SQL 注入漏洞升级 Nacos 依赖以规避高频出现的 FastJson CVE升级 jackson-databind 至 2.9.10该版本修复了当时已知的反序列化安全问题。对于自建部署 OAP 并使用 H2/MySQL 存储、或使用 Nacos 做配置/集群协调的团队建议确认已升级至包含上述修复的版本。升级到 8.0.0 的实践要点综合以上变更从 7.x 升级到 8.0.0 时应重点关注协议不兼容v3 协议上线后旧版本 Agent 无法与 8.x OAP 互通Agent 与 OAP 需要整体升级包括 Python agent 等新 Agent 类型的接入注册机制移除依赖注册 ID 的存量逻辑如自定义上报工具、第三方 SDK需要适配 v3 协议的新上报方式查询协议迁移新查询协议为 GraphQL旧协议虽暂时保留但计划年底移除查询端应尽早迁移存储配置优化对于海量 Trace 场景可通过SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR调整 TraceSegment 等超大数据索引的分片数当前完整配置项见 application.yml安全基线确认所用存储H2/MySQL与依赖Nacos、jackson-databind已处于修复 CVE 之后的版本。参考与延伸阅读8.0.0 变更清单原始文档docs/en/changes/changes-8.0.0.mdv3 Trace 数据协议trace-data-protocol-v3.mdGraphQL 查询协议query-protocol.md另见已弃用协议说明 query-protocol-deprecated.mdCorrelation 协议 v1x-process-correlation-headers-v1.md端点分组配置endpoint-grouping-rules.md告警规则示例dist-material/alarm-settings.ymlOAP ElasticSearch 存储配置源码StorageModuleElasticsearchConfig.javaSuperDataSet 注解定义SuperDataset.java 及使用示例 SegmentRecord.java索引时间后缀与超级数据集逻辑TimeSeriesUtils.java赞分享可观测性APM链路追踪指标监控日志分析微服务【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sk/skywalking点击查看免费下载相关推荐details-dialog-element测试指南使用Karma和Mocha确保组件稳定性details dialog element测试指南使用Karma和Mocha确保组件稳定性 在现代Web开发中确保组件稳定性至关重要。details di可观测性APM链路追踪指标监控日志分析微服务DINOv3超参数优化完整教程学习率、权重衰减与批次大小的黄金配置法则DINOv3超参数优化完整教程学习率、权重衰减与批次大小的黄金配置法则 DINOv3作为Meta AI推出的第三代自监督视觉基础模型在计算机视觉领域展现出了可观测性后端微服务云原生Unlock-Music 免费实测不装软件不传文件3 分钟把加密歌单解锁成 MP3Unlock Music 免费实测不装软件不传文件3 分钟把加密歌单解锁成 MP3 去年年底我换了新电脑从旧笔记本里翻出满满一文件夹青春——在 QQ可观测性APM链路追踪指标监控日志分析微服务上一篇Riot.js组件懒加载性能预加载与优先级设置下一篇Webpack集成libphonenumber.js终极指南前端构建优化与代码分割策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表