OpenShift中Spring应用多数OpenTelemetry Instrumentation禁用问题求助
问题描述
通过Kubernetes Operator在OpenShift的Spring应用中注入OpenTelemetry Java Agent后,多数instrumentation处于禁用状态,无法生成完整链路追踪。仅Lettuce instrumentation可正常工作并上报追踪数据到OpenTelemetry Collector。
环境信息
- OpenTelemetry Agent镜像:
ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.28.0 - JAVA版本:
openjdk 11.0.15 - Kubernetes版本:
v1.25.10+3fe2906
现象细节
开启OTEL_JAVAAGENT_DEBUG=true后,日志显示多数instrumentation被禁用,示例日志:
... [otel.javaagent 2023-07-26 11:36:50:133 -0300] [main] DEBUG io.opentelemetry.javaagent.tooling.instrumentation.InstrumentationLoader - Loading instrumentation executors [class io.opentelemetry.javaagent.instrumentation.executors.ExecutorsInstrumentationModule] [otel.javaagent 2023-07-26 11:36:50:133 -0300] [main] DEBUG io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule - Instrumentation executors is disabled [otel.javaagent 2023-07-26 11:36:50:133 -0300] [main] DEBUG io.opentelemetry.javaagent.tooling.instrumentation.InstrumentationLoader - Loading instrumentation internal-application-logging [class io.opentelemetry.javaagent.instrumentation.internal.logging.ApplicationLoggingInstrumentationModule] [otel.javaagent 2023-07-26 11:36:50:133 -0300] [main] DEBUG io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule - Instrumentation internal-application-logging is disabled ...
Lettuce instrumentation正常工作的日志片段:
... [otel.javaagent 2023-07-26 11:36:50:838 -0300] [main] DEBUG io.opentelemetry.javaagent.tooling.instrumentation.InstrumentationLoader - Loading instrumentation lettuce [class io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.LettuceInstrumentationModule] [otel.javaagent 2023-07-26 11:36:50:842 -0300] [main] DEBUG io.opentelemetry.javaagent.tooling.instrumentation.InstrumentationLoader - Loading instrumentation lettuce [class io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.LettuceInstrumentationModule] [otel.javaagent 2023-07-26 11:36:50:908 -0300] [main] DEBUG io.opentelemetry.javaagent.tooling.instrumentation.InstrumentationLoader - Loading instrumentation lettuce [class io.opentelemetry.javaagent.instrumentation.lettuce.v5_1.LettuceInstrumentationModule] ... [otel.javaagent 2023-07-26 11:37:07:128 -0300] [main] DEBUG io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule - Applying instrumentation: lettuce [class io.opentelemetry.javaagent.instrumentation.lettuce.v5_1.LettuceInstrumentationModule] on org.springframework.boot.loader.LaunchedURLClassLoader@64db4967 ...
已尝试操作
- 设置环境变量启用默认及指定instrumentation,但未生效:
OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=true OTEL_INSTRUMENTATION_TOMCAT_ENABLED=true
- 测试设置
OTEL_INSTRUMENTATION_LETTUCE_ENABLED=false可成功禁用Lettuce instrumentation,说明配置生效逻辑无问题。 - 该Java Agent在Azure和AWS Kubernetes集群中可正常工作,推测问题与OpenShift集群相关。
可能的解决方向
1. 检查OpenShift Security Context约束(SCC)
OpenShift默认SCC可能限制Java Agent的字节码增强能力。尝试为应用ServiceAccount添加对应权限的SCC(优先最小权限原则):
oc adm policy add-scc-to-user anyuid -z <你的服务账户名> -n <命名空间>
注:字节码增强需要Agent具备修改类定义的权限,部分SCC的严格限制会导致Instrumentation无法加载。
2. 验证Agent挂载路径与权限
检查Operator注入的Agent Jar包路径是否有足够读取权限:
oc exec <Pod名称> -n <命名空间> -- ls -l /otel-auto-instrumentation/javaagent.jar
若权限不足,可在Instrumentation资源中配置volumeMounts的权限参数。
3. 确认Operator配置优先级
OpenTelemetry Operator的默认配置可能覆盖自定义环境变量。检查Instrumentation资源的spec.java.env字段,确保自定义启用规则已正确注入:
apiVersion: opentelemetry.io/v1alpha1 kind: Instrumentation metadata: name: my-instrumentation spec: java: env: - name: OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED value: "true" - name: OTEL_INSTRUMENTATION_TOMCAT_ENABLED value: "true"
同时通过oc describe pod <Pod名称>确认环境变量已正确生效。
4. 升级Operator与Agent版本
当前使用的Agent版本为1.28.0,尝试升级至1.30+版本,同步升级OpenTelemetry Operator——部分OpenShift兼容性问题已在新版本中修复。
5. 调整Spring Boot类加载器配置
Spring Boot的LaunchedURLClassLoader可能导致部分Instrumentation无法加载,尝试添加环境变量指定需要增强的包路径:
OTEL_JAVAAGENT_INCLUDE_PREFIXES=org.springframework,javax.servlet,org.apache.tomcat
内容的提问来源于stack exchange,提问作者FelipeKT

