You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OTLPTraceExporter无法在Jaeger UI查看请求问题排查

OTLPTraceExporter无法向Jaeger发送追踪数据的问题排查

以下是针对你遇到问题的具体排查点和修复方案:

1. 移除重复的SpanProcessor

你的代码中同时添加了SimpleSpanProcessor和BatchSpanProcessor,两者都指向同一个OTLP exporter。这会导致追踪数据被重复发送,可能引发Jaeger接收端的解析异常,或者exporter内部报错。

修复方式:只保留一种SpanProcessor,推荐使用BatchSpanProcessor(更适合生产环境,资源利用率更高),删除SimpleSpanProcessor(exporter)的添加代码。

2. 验证Jaeger的OTLP接收配置

确保Jaeger实例已经启用了OTLP HTTP接收功能,默认端口4318需要对外开放:

  • 本地启动Jaeger-all-in-one时,启动命令需包含--collector.otlp.enabled=true
  • Docker启动时,需设置环境变量并映射端口:
docker run -d --name jaeger \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 16686:16686 \
  -p 4318:4318 \
  jaegertracing/all-in-one:latest

3. 替换为兼容的Propagator

你当前使用的OTTracePropagator是旧版格式,OTLP协议推荐使用W3C标准的TraceContextPropagator,否则可能导致追踪上下文无法正确传递,Jaeger无法关联链路。

修复代码:

// 导入正确的Propagator
const { TraceContextPropagator } = require("@opentelemetry/core");

// 注册时替换
provider.register({ propagator: new TraceContextPropagator() });

4. 统一OpenTelemetry依赖版本

确保所有@opentelemetry开头的包版本一致,版本不匹配会导致隐性兼容性问题。建议将相关依赖升级到最新稳定版,统一package.json中的版本号。

5. 开启调试日志排查错误

默认情况下OTLP exporter不会输出错误信息,开启调试日志可以查看发送过程中的具体问题(比如连接失败、数据格式错误):

// 在init函数开头添加
process.env.OTEL_LOG_LEVEL = "debug";

或者启动应用时通过环境变量设置:

OTEL_LOG_LEVEL=debug node index.js

修复后的完整示例代码

"use strict";

const {
  SimpleSpanProcessor,
  BatchSpanProcessor,
} = require("@opentelemetry/tracing");
const { Resource } = require("@opentelemetry/resources");
const {
  SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const {
  ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const { TraceContextPropagator } = require("@opentelemetry/core");
const {
  OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-proto");
const { ConsoleSpanExporter } = require("@opentelemetry/tracing");

const init = (serviceName, environment) => {
  // 开启调试日志,排查exporter问题
  process.env.OTEL_LOG_LEVEL = "debug";

  const exporter = new OTLPTraceExporter({
    url: "http://localhost:4318/v1/traces",
  });

  const provider = new NodeTracerProvider({
    resource: new Resource({
      [SemanticResourceAttributes.SERVICE_NAME]: serviceName,
      [SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: environment,
    }),
  });

  // 仅保留BatchSpanProcessor,避免重复发送
  provider.addSpanProcessor(new BatchSpanProcessor(exporter));

  // 控制台输出用于本地调试
  provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));

  // 使用W3C标准的TraceContextPropagator
  provider.register({ propagator: new TraceContextPropagator() });

  console.log("tracing initialized");

  registerInstrumentations({
    instrumentations: [new ExpressInstrumentation(), new HttpInstrumentation()],
  });

  const tracer = provider.getTracer(serviceName);
  return { tracer };
};

module.exports = {
  init: init,
};

内容的提问来源于stack exchange,提问作者Emin Üstün

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:33:17