使用OpenTelemetry导出追踪数据到Jaeger时遭遇CORS问题求助
解决浏览器客户端向Jaeger Collector发送追踪数据的CORS问题
问题原因
你在客户端请求头里设置Access-Control-Allow-Headers是无效的——这个是服务器返回的响应头,用来告知浏览器允许的请求头类型,不是客户端需要发送的请求头。Jaeger Collector默认没有配置CORS支持,因为它设计为接收服务端SDK的请求,而非直接暴露给浏览器,所以浏览器会拦截跨域请求。
解决方案
方案1:使用后端代理(推荐,符合生产环境最佳实践)
不要让浏览器直接请求Jaeger Collector,而是搭建一个简单的后端代理,由代理转发请求到Collector,避免跨域问题。
比如用Node.js + Express实现代理:
const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); // 代理Jaeger Collector的追踪接口 app.use('/api/traces', createProxyMiddleware({ target: 'http://localhost:14268', changeOrigin: true, })); app.listen(3000, () => { console.log('代理服务运行在 http://localhost:3000'); });
然后修改客户端代码中的exporter URL:
const collector = new CollectorTraceExporter({ url: 'http://localhost:3000/api/traces', headers: { 'Content-Type': 'application/json', 'X-CSRF': '1', }, });
方案2:升级Jaeger并配置CORS(仅用于测试环境)
如果你只是在本地测试,想直接让Collector支持CORS,需要先升级Jaeger版本(你当前用的1.9版本太旧,缺乏CORS配置能力),再通过环境变量配置CORS规则。
修改docker-compose.yml:
jaeger: container_name: jaeger image: jaegertracing/all-in-one:latest # 升级到最新版本 environment: COLLECTOR_OTLP_ENABLED: true # 配置允许的跨域来源,*表示允许所有(仅测试用) COLLECTOR_HTTP_CORS_ALLOWED_ORIGINS: "*" # 配置允许的请求头 COLLECTOR_HTTP_CORS_ALLOWED_HEADERS: "Content-Type,X-CSRF" # 配置允许的请求方法 COLLECTOR_HTTP_CORS_ALLOWED_METHODS: "POST,OPTIONS" ports: - 16686:16686 # Jaeger UI - 14268:14268 # Collector - 4317:4317 # OpenTelemetry GRPC - 4318:4318 # OpenTelemetry HTTP(新增,对应OTLP HTTP协议) - 6831:6831 # OpenTelemetry HTTP
重启容器后,浏览器的跨域请求就会被允许。
额外建议:更换为最新的OTLP exporter
@opentelemetry/exporter-collector已被弃用,建议使用官方推荐的@opentelemetry/exporter-trace-otlp-http,适配最新的OTLP标准:
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http'); const exporter = new OTLPTraceExporter({ url: 'http://localhost:4318/v1/traces', // OTLP HTTP的默认接口 });
内容的提问来源于stack exchange,提问作者Piotr O
相关产品推荐
相关产品推荐

