OpenTelemetry Java Agent无法接收SBT构建传入的参数问题排查
OpenTelemetry Java Agent无法接收SBT构建文件传入参数的问题
问题现象
使用com.lightbend.sbt.javaagent包的JavaAgent类挂载OpenTelemetry Java Agent后,运行时Agent始终尝试连接默认的localhost:4317,完全忽略SBT中配置的http://198.51.100.1:4317端点;但直接通过命令行手动传递参数时,Agent能正常使用配置的端点。
SBT构建文件片段
val buildOpenTelemtryJavaAgent: JavaAgent.AgentModule = { val attributes = "service.name=MY_SERVICE,environment=development" val argsStr = s"""otel.exporter=otlp otel.exporter.otlp.endpoint=http://198.51.100.1:4317 otel.resource.attributes="$attributes"""" print(argsStr) JavaAgent( module = openTelemetryAgentPrefix % openTelemetryAgentModuleName % openTelemetryAgentVersion % "runtime", name = openTelemetryAgentName, scope = JavaAgent.AgentScope(true, true, true, true), arguments = argsStr ) }
运行时错误日志
[otel.javaagent 2023-05-16 06:45:58:127 +0000] [OkHttp http://localhost:4317/...] ERROR io.opentelemetry.exporter.internal.grpc.OkHttpGrpcExporter - Failed to export spans. The request could not be executed. Full error message: Failed to connect to localhost/127.0.0.1:4317
手动运行的正确命令
-javaagent:/Users/[MY_USER]/dev/git/[MY_PROJECT]/target/scala-2.12/opentelemetry-javaagent.jar -Dotel.exporter=otlp -Dotel.exporter.otlp.endpoint=http://198.51.100.1:4317 -Dotel.resource.attributes="service.name=MY_SERVICE,environment=development"
问题根源
问题出在SBT JavaAgent插件的参数传递方式,和Agent的解析逻辑无关。
Lightbend的JavaAgent插件中,arguments字段的作用是传递Agent自身的启动参数(对应命令行中-javaagent:jarpath=agent_args里=后面的内容),但OpenTelemetry Java Agent的所有配置都是JVM系统属性(即命令行中-D开头的参数),并非Agent自身的启动参数。
你当前的写法把系统属性直接传给了Agent的arguments,完全不符合插件的参数预期,导致这些配置根本没被JVM加载,Agent只能使用默认值。
解决方案
不需要通过JavaAgent的arguments传递配置,而是将OpenTelemetry的参数作为JVM系统属性添加到SBT的运行配置中,和手动运行的逻辑保持一致。
修改后的代码示例
- 保留Agent挂载配置,移除无效的
arguments字段:
val buildOpenTelemtryJavaAgent: JavaAgent.AgentModule = { JavaAgent( module = openTelemetryAgentPrefix % openTelemetryAgentModuleName % openTelemetryAgentVersion % "runtime", name = openTelemetryAgentName, scope = JavaAgent.AgentScope(true, true, true, true) ) }
- 在SBT运行设置中添加系统属性:
val otelAttributes = "service.name=MY_SERVICE,environment=development" val otelEndpoint = "http://198.51.100.1:4317" run / javaOptions ++= Seq( "-Dotel.exporter=otlp", s"-Dotel.exporter.otlp.endpoint=$otelEndpoint", s"-Dotel.resource.attributes=$otelAttributes" )
内容的提问来源于stack exchange,提问作者oy121
相关产品推荐
相关产品推荐

