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!

相关推荐
Minilinux20186 天前
Android音频系列(09)-AudioPolicyManager代码解析
android·音视频·apm·audiopolicy·音频策略
芒果de香蕉皮11 天前
开源飞控APM备降点源码分析
无人机·二次开发·apm·开源飞控·备降点
阿里云云原生16 天前
阿里云全新发布的 UModel 是什么
人工智能·阿里云·云计算·可观测·umodel
阿里云云原生16 天前
阿里云可观测联合 Datadog 发布 OpenTelemetry Go 自动插桩工具
阿里云·golang·云计算·可观测
Dobby_0520 天前
【Log】Loki 架构与组件全解析
云原生·loki·可观测
我的golang之路果然有问题1 个月前
OpenTelemet 实习中了解到的部分
运维·服务器·opentelemetry
阿里云云原生2 个月前
深度解析云监控 2.0 日志审计:统一采集、实体建模与告警溯源能力
阿里云·云原生·云监控·可观测
阿里云云原生2 个月前
阿里云可观测 2025 年 11 月产品动态
阿里云·云原生·云计算·可观测
阿里云云原生2 个月前
LoongSuite:解决 WebSocket 全链路可观测性难题,赋能 AI 应用的实时链路追踪
人工智能·websocket·网络协议·阿里云·云原生·可观测