EasyTelemetry:让OpenTelemetry拥抱Arthas Trace的强大功能

EasyTelemetry:让 OpenTelemetry 拥抱 Arthas Trace 的强大功能

引言

在现代分布式系统中,可观测性已成为保障系统稳定性和性能的关键要素。OpenTelemetry 作为业界主流的可观测性框架,提供了强大的链路追踪、指标收集和日志记录能力。然而,在实际生产环境中,开发者往往还需要更细粒度的代码执行轨迹分析工具,例如 Arthas 的 trace 命令。尽管 trace 功能强大,但在使用过程中仍存在一些痛点。本文将介绍 EasyTelemetry------一个融合 OpenTelemetry 与 Arthas Trace 能力的创新解决方案。


Arthas Trace 命令的优势与挑战

Arthas 是阿里巴巴开源的一款 Java 诊断工具,其 trace 命令能够动态追踪方法调用栈并统计耗时,是线上排查逻辑和性能问题的利器。然而,它也面临以下几个核心挑战:

  1. 并发请求过滤困难

    当多个请求并发访问同一方法时,如何从海量 trace 数据中筛选出目标请求的轨迹信息,成为一大难题。

  2. 资源消耗显著
    trace 命令在执行期间会引入较高的 CPU 和内存开销,尤其在线上高负载场景下可能影响服务稳定性。

  3. 数据孤岛问题
    trace 结果通常以文本形式输出,仅保存在 Arthas 工具本地,难以与现有的链路追踪数据打通,导致无法实现端到端的问题定位。


EasyTelemetry 的终极目标

为了解决上述问题,EasyTelemetry 提出了以下三大核心目标:

  • ✅ 链路数据集成 :将指定方法的 trace 结果无缝嵌入 OpenTelemetry 的链路数据中,形成统一的可观测视图。
  • ✅ 极致轻量化:确保采集的代码轨迹数据体积极小(每行仅需 1~4 字节),避免对业务性能造成负担。
  • ✅ 超低资源消耗:将采集过程的额外开销控制在目标方法执行时间的 1% 以内,实现近乎无感的监控体验。

技术实现:EasyTelemetry 核心原理

EasyTelemetry 是基于 OpenTelemetry 的二次开发项目,完全兼容原生功能,并通过以下关键技术实现高效、精准的代码轨迹采集:

1. 字节码增强技术

利用 Java Agent 和 ASM 字节码操作库,在目标方法的关键位置插入埋点逻辑,实时捕获代码执行轨迹(包括行号、执行次数、累计耗时等)。

2. 高效编码压缩

将原始轨迹数据通过自研算法压缩为紧凑的十六进制字符串,大幅降低存储和传输成本。

3. 链路数据注入

将编码后的轨迹数据注入到 OpenTelemetry 的 Span 中,随链路一同上报至后端观测平台。

4. 可视化解码工具

提供配套的解码器,支持将十六进制轨迹数据还原为人类可读的格式,清晰展示每行代码的执行详情。


示例演示

原始代码片段

以下是一个典型的 Spring MVC 控制器方法:

java 复制代码
        @RequiresPermissions(value={"system:user:edit"})
        @GetMapping(value={"/authRole/{userId}"})
        public String authRole(@PathVariable(value="userId") Long userId, ModelMap mmap) {
/*251*/     this.userService.checkUserDataScope(userId);
/*252*/     SysUser user = this.userService.selectUserById(userId);
/*254*/     List roles = this.roleService.selectRolesByUserId(userId);
/*255*/     mmap.put("user", user);
/*256*/     mmap.put("roles", SysUser.isAdmin((Long)userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
            return this.prefix + "/authRole";
        }

配置规则

通过 JSON 配置文件定义需要采集的方法及其关联属性:

json 复制代码
{
  "trace": [
    {
      "rootSpanName": "GET /system/user/authRole/{userId}",
      "javaMethodDesc": "com.ruoyi.web.controller.system.SysUserController#authRole(java.lang.Long,org.springframework.ui.ModelMap)",
      "traceTagKey": "ruoyi.authRole",
      "triggerOptimizeTimes": 10
    }
  ]
}

轨迹数据样例

采集到的轨迹数据被编码为紧凑的十六进制字符串:
00FB010120138DF7FAAA80105518B01A2700103400

解码可视化效果

通过解码工具解析后,可得到详细的执行报告:

bash 复制代码
	总耗时:50.05ms

	行号		 执行次数		 耗时:		   耗时占比
	251			1			0.85ms,  		1.70%
	252			1			22.24ms,  		44.44%
	254			1			25.99ms,  		51.93%
	255			1			0.00ms
	256			1			0.52ms,  		1.04%
	257			1			0.00ms

总结与展望

EasyTelemetry 成功地将 Arthas Trace 的强大能力与 OpenTelemetry 的标准化链路数据相结合,解决了传统诊断工具在生产环境中的诸多局限性。未来,我们将继续优化采集效率、扩展更多编程语言的支持,并探索与主流 APM 平台的深度集成,助力开发者构建更加健壮、透明的分布式系统。

GitHub 项目地址:easytelemetry-java-opentelemetry

Trace功能说明文档: easytelemetry-trace

欢迎 Star ⭐️ 和提Issue!

相关推荐
飞鸟真人4 天前
应用性能监测(APM)之 (五)Prometheus与OpenMetrics协议
prometheus·apm·open telemetry·openmetrics
EatFan6 天前
Flutter 鸿蒙适配实践 2026:从环境搭建、混合渲染到 OpenTelemetry 性能基建
flutter·华为·harmonyos·openharmony·opentelemetry·鸿蒙适配·impeller
漂着的圆木8 天前
Agent监控:Copilot托管设置启用OTel的配置核对
agent·可观测性·github copilot·工具调用·opentelemetry
苏渡苇20 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
苏渡苇21 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
ManageEngine卓豪25 天前
如何用 OpenTelemetry 实现企业分布式应用的全链路可视化?Applications Manager 集成方案与配置
可视化·apm·应用性能管理·分布式应用
2601_962097361 个月前
可观测性实战:Prometheus+Grafana+OTel构建监控
grafana·prometheus·微服务架构·可观测性·opentelemetry
xrlfreedom1 个月前
大厂 MCP 面试实录:基于 OpenTelemetry 与 OAuth 2.1 的可重复集成测试方案设计
opentelemetry·mcp·oauth 2.1
xrlfreedom1 个月前
大厂 MCP 面试实录:设计需人工确认的高风险 Tool 的工程化方案
opentelemetry·mcp·rag 知识库·向量检索与重排
ylj_dev1 个月前
从 0 构建 AI Workload Platform(七):可观测性、故障注入与性能验证
go·prometheus·可观测性·opentelemetry·故障注入