ARMS Java探针从4.x版本开始基于opentelemetry-java-instrumentation全面重构,因此ARMS 4.x版本探针也继承了opentelemetry-java-instrumentation的自定义埋点能力。本文以为motan(RPC框架)自定义埋点为例演示自定义埋点的整体流程。
Opentelemetry-java-instrumentation支持通过设置-Dotel.javaagent.extensions
参数或设置环境变量Key OTEL_JAVAAGENT_EXTENSIONS
指定一个自定义扩展(Extensions)的JAR包路径,您可以在该JAR包中实现以下功能:
自定义TraceId生成器
自定义Trace上下文传播协议
自定义链路采样器
自定义SpanProcessor
自定义埋点逻辑
出于稳定性和安全的考虑,4.x探针目前仅支持自定义埋点功能。
操作步骤
步骤1:下载并编译自定义埋点代码
执行以下命令下载自定义埋点demo项目。
该项目简单地实现了motan框架的客户端和服务端埋点,通过在客户端发起RPC调用和服务端接收RPC调用时分别生成一个Span,且在利用motan框架的协议头传递trace上下文。
git clone git@github.com:aliyun-observability/aliyun-javaagent-extension-demo.git
进入项目根目录,执行
./gradlew build
命令。说明当前编译环境的JDK版本需为JDK17。
执行该命令后,在.build/libs目录下会有编译后的JAR文件,即为自定义拓展JAR包。
步骤2:下载ARMS探针
登录ARMS控制台。
在左侧导航栏选择
,然后在顶部菜单栏选择目标地域。单击探针版本发布说明页签,下载4.x或以上版本探针,并放置在合适目录。
步骤3:下载并编译motan demo应用
下载motan应用。
git clone https://github.com/weibocom/motan.git
进入项目根目录,执行
cd motan-demo && mvn clean package
命令。执行后,在
${motan-root}/motan-demo/motan-demo-client/target
和${motan-root}/motan-demo/motan-demo-server/target
目录下即可看到motan-demo-server和motan-demo-client示例应用。
步骤4:启动应用时加载自定义拓展包
启动server应用:
java -javaagent:/path/to/aliyun-java-agent.jar -Darms.appName=motan-client -Darms.licenseKey=${your licenseKey} -Dotel.javaagent.extensions=/path/to/opentelemetry-extension-demo-1.0.jar -jar /path/to/motan-demo-server.jar
启动client应用:
java -javaagent:/path/to/aliyun-java-agent.jar -Darms.appName=motan-server -Darms.licenseKey=${your licenseKey} -Dotel.javaagent.extensions=/path/to/opentelemetry-extension-demo-1.0.jar -jar /path/to/motan-demo-client.jar
根据实际情况修改以下参数:
/path/to/aliyun-java-agent.jar
:步骤2下载的探针。${your licenseKey}
:可以通过DescribeTraceLicenseKey OpenAPI获取LicenseKey。/path/to/opentelemetry-extension-demo-1.0.jar
:步骤1获取的自定义拓展JAR包。/path/to/motan-demo-server.jar
:步骤3下载的motan-demo-server示例应用。/path/to/motan-demo-client.jar
:步骤3下载的motan-demo-client示例应用。
步骤5:查看监控效果
注意事项
自定义埋点时需要引入OpenTelemetry的依赖,为了最好的兼容性,请按照下述映射关系引入OpenTelemetry依赖版本。
ARMS Java版本
OpenTelemetry依赖版本
4.1.0 ~ 最新
1.28
自定义埋点的包名不要以io.opentelemetry.javaagent.instrumentation开头,避免和ARMS探针现有增强代码出现类冲突。
自定义埋点中尽量不要引入除了OpenTelemetry以及待埋点框架外的其他框架,避免埋点代码和应用代码出现类冲突。