MSE Java 探针和其他探针是否兼容

在微服务架构中,通常会引入多个性能监控或治理工具(如APM、链路追踪、安全扫描等),每个工具可能依赖各自的 Java 探针(Agent)。然而,多探针共存时,兼容性问题主要源于字节码注入冲突和资源竞争,本文介绍针对MSE Java 探针与几种主流的探针提供对应的兼容性描述以及解决方案。

概述

MSE 的 Java 探针和其他主流的探针一样,都是基于 ASM 等框架对字节码进行插桩,以实现无侵入的代码能力增强。同时安装两个探针相当于对您的代码插桩两次,由于不同厂家的插桩代码实现不同,代码冲突可能造成各类问题(例如应用启动缓慢以及功能失效等),因此建议您不要同时安装多个探针。如果因为一些特殊原因或是迁移过渡期间,可能会存在应用同时安装两个探针的需求,因此 MSE 做了大量的探针兼容性测试,尽可能的提升探针兼容性。但在探针共存的情况下,依然存在 MSE 探针和其他探针同时增强某个插件造成的局部冲突的可能性和性能影响,不建议长期共存。

说明

如果您同时使用了 ARMS 产品,建议参考 ARMS探针和其他APM产品探针(例如SkyWalking)是否兼容?

OpenTelemetry

由于 MSE Java 探针在 4.x 版本以及以上采用了 OpenTelemetry 作为底座,因此开源 OpenTelemetry 和 MSE Java 探针同时使用时,挂载顺序在前的探针生效,在后的探针会进行自动的避让,不再加载,因此需要保证 MSE 探针的挂载顺序在前。

SkyWalking

SkyWalking 的 Cache 机制会导致探针兼容性问题,导致 MSE 探针部分能力无法使用,建议在 Java 启动命令中增加如下参数关闭 Skywalking 的 Cache 机制。更多信息,请参见SkyWalking 官方文档

-Dskywalking.agent.is_cache_enhanced_class=true -Dskywalking.agent.class_cache_mode=MEMORY  

如果增加了上述参数后,在应用启动或者应用运行期间存在问题,例如启动过程报错、业务请求报错等情况,您可以优先考虑调整探针挂载顺序进行重启。推荐的探针挂载顺序调整方式可参见其他 APM 探针部分。

其他 APM 探针(TTL-Agent、Pinpoint 等)

针对其他开源探针,例如 TTL-Agent、Pinpoint 等,如果在同时安装两个探针的情况下,应用启动或运行时存在问题,也可以通过调整探针挂载顺序的方式尝试进行解决。例如使用TransmittableThreadLocal 探针的场景,挂载顺序调整方式如下:

  • 手动接入方式调整启动参数:如果您是手动安装探针方式,可以调整接入脚本中开源 TTL 探针与 MSE 探针的挂载顺序,保证 MSE 探针在后。

    Spring Boot场景示例:

    -javaagent:/home/admin/transmittable-thread-local-2.14.2.jar -javaagent:/{user.workspace}/AliyunJavaAgent/aliyun-java-agent.jar
  • 自动接入方式添加JVM参数:如果您是容器服务ACK环境中自动安装探针的方式,改用手动安装探针方式修改接入脚本的工作量较大,可以采用在容器环境中添加JVM参数的方式。

    1. 登录容器服务控制台

    2. 在左侧导航栏,单击集群列表,然后单击目标集群名称。

    3. 在左侧导航栏,选择工作负载 > 无状态

    4. 无状态页面,单击接入MSE应用右侧操作列下的编辑

    5. 环境变量中添加 TTL 探针参数,然后单击更新

      image

加密用探针

如果使用字节码加密工具对字节码进行加密,则探针要求如下,否则接入 MSE 探针后可能导致启动失败。

  • 确保自定义的探针(Agent) 在最开始运行, MSE 探针在后面运行(推荐的探针挂载顺序调整方式同其他 APM 探针部分)。

  • 需要使用Java探针版本,以保证应用能够正常接入。