Docker中OpenTelemetry Collector无法接收HTTP端口4318数据
问题原因分析
1. .NET SDK OTLP Exporter协议不匹配
OpenTelemetry .NET SDK的AddOtlpExporter默认使用gRPC协议发送数据,即便你指定了4318端口(OTLP HTTP的标准端口),SDK仍会尝试用gRPC协议连接Collector的HTTP接收器,导致协议不兼容,数据无法正常投递。
2. Collector接收器监听地址限制
你的Collector配置中,OTLP的gRPC和HTTP接收器均设置为监听localhost:端口:
grpc: endpoint: localhost:4317 http: endpoint: localhost:4318
在Docker容器环境中,localhost仅指向容器自身的回环接口,这会导致:
- 同网络下的其他容器(如你的.NET服务容器)无法通过
otel-collector:4318访问到Collector的HTTP服务 - 即便配置了端口映射,主机也无法访问容器内仅绑定localhost的服务
修复方案
步骤1:修改.NET SDK配置,指定HTTP协议
在AddOtlpExporter中显式设置协议为HttpProtobuf,同时补充OTLP HTTP的对应路径:
.WithMetrics(provider => { provider.AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddOtlpExporter(exporter => { exporter.Endpoint = new Uri("http://otel-collector:4318/v1/metrics"); exporter.Protocol = OtlpExportProtocol.HttpProtobuf; }); }) .WithTracing(provider => { provider.AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddOtlpExporter(exporter => { exporter.Endpoint = new Uri("http://otel-collector:4318/v1/traces"); exporter.Protocol = OtlpExportProtocol.HttpProtobuf; }); });
注:OTLP HTTP要求指定具体路径,追踪对应
/v1/traces、指标对应/v1/metrics、日志对应/v1/logs,否则Collector会返回404错误。
步骤2:修改Collector配置,监听所有网卡
将OTLP接收器的endpoint改为0.0.0.0:端口,让服务绑定到容器的所有网络接口,允许外部访问:
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318
步骤3:重启服务
修改配置后,重启Collector和.NET服务容器,验证数据是否能正常通过HTTP发送到Collector。
内容的提问来源于stack exchange,提问作者DZziMD
相关产品推荐
相关产品推荐

