在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即可:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-test
namespace: default
labels:
app: demo-test
spec:
replicas: 1
selector:
matchLabels:
app: demo-test
template:
metadata:
labels:
app: demo-test
sermant-injection: enabled
annotations:
# key为env.sermant.io/external.agent.injection,value表示自定义注入的外部Agent名字,其中OTEL代表OpenTelemetry Agent已经测试验证支持
env.sermant.io/external.agent.injection: "OTEL"
spec:
containers:
- name: image
image: image:1.0.0
ports:
- containerPort: 8080
这样在我们在部署宿主微服务的时候就能够将Sermant Agent和OTEL Agent共同部署挂载上去,实现微服务治理和可观测性的结合。
四、总结
本文通过以常用的观测领域OpenTelemetry来作为示例介绍了在Sermant使用和管理外部JavaAgent的最佳实践,实现了方便快捷地对外部Agent进行管理。总的来说,在Sermant中使用外部Agent的核心价值在于,可以通过有效集成开源生态的成熟能力,以模块化、解耦的方式快速构建功能丰富的解决方案来满足多场景需求,同时通过兼容性管理规避冲突,最终达到降低开发成本、提升系统灵活性和扩展性的目标。感兴趣的开发者可以跳转至官网文档了解更多详细信息。
Sermant作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。
- Sermant官网:https://sermant.io
- GitHub仓库地址:https://github.com/sermant-io/Sermant
- 扫码加入Sermant社区交流群
- 点赞
- 收藏
- 关注作者
评论(0)