Java 8应用使用OpenTelemetry Agent导出New Relic数据报464错误
OpenTelemetry Java Agent Java 8环境导出数据到New Relic报HTTP 464问题排查
正常运行场景(Java 11环境)
在Java 11环境下使用如下启动参数加载OpenTelemetry Java Agent,可正常将链路、指标、日志数据导出至New Relic平台:
java -javaagent:./otel/opentelemetry-javaagent.jar \ -DOTEL_EXPORTER_OTLP_COMPRESSION=gzip \ -DOTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=4095 \ -DOTEL_JAVA_DISABLED_RESOURCE_PROVIDERS=io.opentelemetry.sdk.extension.resources.ProcessResourceProvider \ -DOTEL_EXPERIMENTAL_EXPORTER_OTLP_RETRY_ENABLED=true \ -DOTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=DELTA \ -Dotel.traces.exporter=otlp \ -Dotel.metrics.exporter=otlp \ -Dotel.logs.exporter=otlp \ -Dotel.exporter.otlp.endpoint=https://otlp.nr-data.net:4317 \ -Dotel.resource.attributes=service.name=app-service \ -Dotel.exporter.otlp.headers=api-key=<api-key> \ -Dotel.javaagent.debug=false -jar ./target/app-service-0.0.1-SNAPSHOT.jar
异常场景(Java 8 Docker环境)
在Java 8环境中使用如下启动参数与Dockerfile构建镜像运行时,数据导出失败。
启动参数配置
ENTRYPOINT ["java", \ "-Dotel.traces.exporter=otlp", \ "-Dotel.metrics.exporter=otlp", \ "-Dotel.logs.exporter=otlp", \ "-Dotel.exporter.otlp.endpoint=https://otlp.nr-data.net:4317", \ "-DOTEL_EXPORTER_OTLP_COMPRESSION=gzip", \ "-DOTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=4095", \ "-DOTEL_JAVA_DISABLED_RESOURCE_PROVIDERS=io.opentelemetry.sdk.extension.resources.ProcessResourceProvider", \ "-DOTEL_EXPERIMENTAL_EXPORTER_OTLP_RETRY_ENABLED=true", \ "-DOTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=DELTA", \ "-Dotel.exporter.otlp.headers=api-key=<api-key>", \ "-Dotel.resource.attributes=service.name=app-service", \ "-Dotel.javaagent.debug=false", \ "-javaagent:opentelemetry-javaagent.jar", "-jar", "app-service.jar"]
Dockerfile配置
FROM maven:3.8.1-jdk-8-slim AS build WORKDIR /opt/app COPY src src COPY pom.xml . RUN mvn -f pom.xml clean install FROM openjdk:8-jdk-alpine COPY --from=build /opt/app/target/app-service-*.jar app-service.jar COPY ./otel/opentelemetry-javaagent.jar opentelemetry-javaagent.jar EXPOSE 8080 ENTRYPOINT ["java", "-javaagent:opentelemetry-javaagent.jar", "-jar", "app-service.jar"]
报错日志
[otel.javaagent] [OkHttp https://otlp.nr-data.net:4317/...] WARN io.opentelemetry.exporter.internal.grpc.OkHttpGrpcExporter - Failed to export logs. Server responded with HTTP status code 464.
当前使用的opentelemetry-javaagent版本为1.12.0,需要确认适配New Relic数据导出的OpenTelemetry兼容Java 8的版本,解决HTTP 464报错。
解决方案
HTTP 464是New Relic OTLP接入点返回的协议协商错误,根源是1.12.0版本的OpenTelemetry Java Agent在Java 8(尤其是Alpine镜像的musl libc环境)下,gRPC请求的TLS ALPN协商存在缺陷,接入点无法识别合法请求。
- 最优修复方案:升级OpenTelemetry Java Agent到1.19.0及以上稳定版本。从1.19版本开始,Agent内置了适配Java 8环境的Conscrypt安全提供方,修复了gRPC导出场景下的ALPN协商问题,不需要修改现有配置即可正常对接New Relic的4317 gRPC端口,全量支持链路、指标、日志数据导出,同时完全兼容Java 8运行环境。
- 临时规避方案(无法升级Agent时使用):
- 将OTLP导出协议从gRPC切换为HTTP/protobuf,把端点从4317端口改为4318端口,新增配置
-Dotel.exporter.otlp.protocol=http/protobuf,端点配置修改为-Dotel.exporter.otlp.endpoint=https://otlp.nr-data.net:4318,绕过gRPC的ALPN协商逻辑。 - 替换基础镜像,将
openjdk:8-jdk-alpine替换为openjdk:8-jdk-slim这类使用glibc的基础镜像,降低musl libc带来的TLS兼容性问题,但该方案无法100%解决旧版本Agent的协商缺陷,仅作为临时兜底。
- 将OTLP导出协议从gRPC切换为HTTP/protobuf,把端点从4317端口改为4318端口,新增配置
内容的提问来源于stack exchange,提问作者Valsaraj Viswanathan
相关产品推荐
相关产品推荐

