EasyTelemetry:让 OpenTelemetry 拥抱 Arthas Trace 的强大功能
引言
在现代分布式系统中,可观测性已成为保障系统稳定性和性能的关键要素。OpenTelemetry 作为业界主流的可观测性框架,提供了强大的链路追踪、指标收集和日志记录能力。然而,在实际生产环境中,开发者往往还需要更细粒度的代码执行轨迹分析工具,例如 Arthas 的 trace 命令。尽管 trace 功能强大,但在使用过程中仍存在一些痛点。本文将介绍 EasyTelemetry------一个融合 OpenTelemetry 与 Arthas Trace 能力的创新解决方案。
Arthas Trace 命令的优势与挑战
Arthas 是阿里巴巴开源的一款 Java 诊断工具,其 trace 命令能够动态追踪方法调用栈并统计耗时,是线上排查逻辑和性能问题的利器。然而,它也面临以下几个核心挑战:
-
并发请求过滤困难
当多个请求并发访问同一方法时,如何从海量 trace 数据中筛选出目标请求的轨迹信息,成为一大难题。
-
资源消耗显著
trace命令在执行期间会引入较高的 CPU 和内存开销,尤其在线上高负载场景下可能影响服务稳定性。 -
数据孤岛问题
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!