在 Sermant 中使用外部 JavaAgent 的最佳实践——以 OTEL 为例

在 Sermant 中使用外部 JavaAgent 的最佳实践——以 OTEL 为例
作者:华为云高级软件工程师 李来
一、引言
在微服务架构和云原生技术快速发展的背景下,JavaAgent 技术已成为实现服务可观测性、故障诊断和性能优化的关键手段。Sermant 作为基于 JavaAgent 的服务治理工具,我们通过字节码增强技术实现了非侵入式的服务治理能力。这种技术实现方式与 OpenTelemetry、Arthas、Skywalking 等主流 JavaAgent 工具形成了技术生态的互补。在实际生产环境中,企业往往需要同时部署多个 JavaAgent 来实现全栈监控:例如结合 Skywalking 的分布式追踪、OpenTelemetry 的指标采集、Arthas 的实时诊断以及 Sermant 的流量治理能力。这种多 Agent 协同工作的模式,既体现了 Java 虚拟机强大的扩展能力,也对 Agent 的兼容性设计提出了更高要求——需要特别注意类加载和隔离机制、字节码转换顺序以及资源占用优化等关键技术点。这种技术组合方式正在成为云原生时代 Java 应用运维的事实标准,既保留了单 Agent 的轻量化优势,又能通过功能组合满足复杂的运维治理需求。本文将通过在 Sermant 中集成 OpenTelemetry Agent 的实际案例来为开发者讲解如何在 Sermant 中使用和管理外部 JavaAgent。
二、同时使用 Sermant 和其他 JavaAgent 能解决哪些问题
Sermant 是面向 Java 微服务的云原生非侵入式服务治理框架,通过 JavaAgent 和字节码增强技术,提供限流降级、负载均衡、无损上下线、标签路由等插件化功能。它的核心优势在于代码零侵入、支持插件扩展、高性能、框架兼容性强等,适合存量系统云原生化改造、微服务的流量治理需求、混沌工程等场景,目前已加入云原生计算基金会(CNCF)。

当前市面上的其他 JavaAgent 项目也有很多,例如 OpenTelemetry、Skywalking、Arthas 等,和 Sermant 一样,他们也各自有自己专注的领域。基于用户的真实需求,可能需要使用到多个 JavaAgent,对与 Sermant 的用户来说,在 Sermant 中集成外部 Agent 能够有效降低开发成本、增强功能扩展性,并提升整体服务治理能力,能为开发者和用户带来的核心价值和解决的问题在于:
(1)满足多场景功能需求,快速构建完整解决方案
现代微服务应用通常需要同时具备服务治理、分布式追踪和性能监控/诊断等多种能力。直接集成这些成熟、经过验证的开源社区或第三方 Agent,可以降低开发成本,避免重复造轮子。这也能让专注于服务治理领域的 Sermant 能够灵活地与这些外部 Agent 组合,快速构建出覆盖更广泛场景的综合性解决方案,丰富 Sermant 的应用生态和实用性。
(2)模块化解耦,提升灵活性和可维护性
Sermant 的服务治理功能可以通过插件化设计实现,而使用外部 Agent 则可以进一步增强解耦性。首先是职责分离,不同 Agent 各司其职,彼此独立开发、维护和演进,避免了单一庞大 Agent 内部的复杂耦合。其次是按需加载与动态管理,外部 Agent 的功能可以独立地按需启用或关闭,这种动态性不会影响 Sermant 或其他 Agent 的核心功能和工作状态,提供了极大的部署和运维灵活性。
相对于用户手动挂载两个 JavaAgent 的方案,使用 Sermant 管理外部 Agent 能带来有三个核心优势:
(1)统一入口,集中管控,简化部署
多 Agent 统一入口为 Sermant Agent,由其负责 OTEL Agent 挂载等操作。原始的方式静态挂载需要手动修改-javaagent 参数,动态挂载需要手动执行 attach 命令。用 Sermant 后即变成一键操作,静态加 annotation,动态在 Backend 界面指令点击,可按需加载。通过 Sermant Backend 控制台,可以可视化地操作外部 Agent 和监控其运行状态
(2)动态插拔
在 Sermant 中可以对外部 Agent 实现动态热插拔,在用户需要在应用运行时挂载外部 Agent 的时候可以实现轻松挂载。
(3)兼容性优化,避免多 Agent 冲突
JavaAgent 生态多样,不同 Agent 的实现机制可能存在差异,同时加载多个 Agent 容易引发冲突(如类加载器冲突、字节码增强冲突等)。在 Sermant 的设计中,由于 JavaAgent 产品实现的多样性,多个 JavaAgent 同时运行可能会存在兼容问题。通过提前识别兼容性,可以在确保无冲突的前提下,让其他 JavaAgent 和 Sermant 得以协同工作,互不干扰。此前我们也总结过两篇 JavaAgent 冲突相关的文章,感兴趣的读者可以参阅下(文章1、文章2)
三、如何在 Sermant 中使用和管理外部 JavaAgent
Sermant 从 2.2.0 版本开始创新性地支持了内置的外部 Agent 管理能力。它允许用户将 OpenTelemetry Agent(或其他兼容的 Agent)作为 Sermant 的一个扩展组件进行挂载和管理。这种方式给用户带来了更好的多 Agent 使用体验:
(1)统一入口,简化部署:只需挂载 Sermant 一个 Agent,由其负责 OTEL Agent 挂载等操作。
(2)灵活使用,满足多场景:支持在应用启动时静态挂载和运行时动态挂载两种模式,适应不同运维需求(如生产环境免重启更新)。
(3)云原生友好:与 Sermant Injector 集成,在 Kubernetes 环境中实现基于注解(Annotation)的声明式、自动化注入,较好地契合了云原生实践。
(4)集中管控:通过 Sermant Backend 控制台,可以可视化地操作(安装/卸载)和监控(状态/事件)运行在众多实例上的 OTEL Agent,极大提升运维效率。
3.1 动态挂载外部 Agent 的最佳实践
Sermant Backend 可以为 Sermant 提供运行时的管理能力和自观测能力,当前主要包括 Sermant Agent 上报事件观测、插件的热插拔、配置的查询和下发等。从 2.2.0 版本开始支持了外部 Agent 的管理。结合动态配置中心和 Sermant Backend 我们可以实现在 Sermant 中对例如 OTEL 的外部 Agent 统一管理。操作方式非常简单,具体使用方式如下:
(1)在 Sermant Backend 中,点击实例状态标签页;选择状态为在线的实例,点击热插拔按钮;在弹框中选择命令类型:安装外部 Agent。并填写 Agent 名称、Agent 路径等信息。最后点击确认即可下发挂载指令。此处我们准备了一个版本为版本 2.10.0 的 OTEL Agent 的 Jar 包(确保目标机器路径可达),只需按照说明填入 Agent 的路径。

点击确认后,动态挂载 OTEL 的指令会下发到各个 Sermant 实例中,并执行挂载操作。
(2)在挂载命令执行后,在 Sermant Backend 的实例状态标签页面,可以通过外部 Agent 状态栏可以查看当前已经挂载的外部 Agent 的信息,其中包含了名称和版本信息。如下所示:

可以看出,OTEL Agent 已经挂载至 Sermant 中,版本号为 2.10.0。
(3) 另外,Sermant 还具备事件上报机制,可以把 Sermant 运行时的关键事件上报至 Sermant Backend 中,用于对 Sermant 自身的观测。对于 OTEL 等外部 Agent 的挂载,Sermant 也支持了事件上报和观测。在实例状态标签页面点击查看结果或进入事件管理的监测页面,可以看到安装外部 Agent 和 OTEL Agent 启动(OTEL 适配,其他 Agent 暂无)上报的事件。

3.2 静态挂载外部 Agent 的最佳实践
不少用户在自身的场景下需要在启动时就挂载 Sermant 以及外部 Agent。那么 Sermant Injector 就可以优雅地解决这个问题。首先用户需要在 Kubernetes 中部署 Sermant Injector,并且完成 Sermant Agent 和外部 Agent 的镜像的构建。然后只需要按照如下的方式添加 annotation 即可:
这样在我们在部署宿主微服务的时候就能够将 Sermant Agent 和 OTEL Agent 共同部署挂载上去,实现微服务治理和可观测性的结合。
四、总结
本文通过以常用的观测领域 OpenTelemetry 来作为示例介绍了在 Sermant 使用和管理外部 JavaAgent 的最佳实践,实现了方便快捷地对外部 Agent 进行管理。总的来说,在 Sermant 中使用外部 Agent 的核心价值在于,可以通过有效集成开源生态的成熟能力,以模块化、解耦的方式快速构建功能丰富的解决方案来满足多场景需求,同时通过兼容性管理规避冲突,最终达到降低开发成本、提升系统灵活性和扩展性的目标。感兴趣的开发者可以跳转至官网文档了解更多详细信息。
Sermant 作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。
Sermant 官网:https://sermant.io
GitHub 仓库地址:https://github.com/sermant-io/Sermant
扫码加入 Sermant 社区交流群

评论