.NET OpenTelemetry Client使用HttpProtobuf协议无法上报数据
排查OtlpExporter HttpProtobuf协议无法发送遥测数据的问题
问题现象
- 使用OtlpExporter的
HttpProtobuf协议无法发送遥测数据,切换为gRPC协议则正常工作 - 配置代码如下:
otel.WithTracing(tracing => { tracing.AddAspNetCoreInstrumentation(); tracing.AddHttpClientInstrumentation(); tracing.AddSource("CustomActivityName"); tracing.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri("http://otel-url:4318/"); otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf; }); tracing.AddConsoleExporter(); });
- 无任何错误日志输出,无法定位问题
排查与解决方案
- 修正Endpoint路径
HttpProtobuf协议需要指定具体的遥测类型路径,追踪数据的默认路径是/v1/traces,gRPC协议会自动处理路径,但HttpProtobuf必须明确完整端点。修改配置:
otlpOptions.Endpoint = new Uri("http://otel-url:4318/v1/traces");
- 启用调试日志捕获错误
当前无错误日志是因为OTel组件的日志级别未开启调试模式,添加日志过滤配置:
builder.Logging.AddFilter("OpenTelemetry", LogLevel.Debug); builder.Logging.AddFilter("OpenTelemetry.Exporter.OpenTelemetryProtocol", LogLevel.Debug);
开启后可以看到Http请求的详细日志,比如连接失败、HTTP状态码等关键信息。
- 验证网络与端口连通性
在应用服务器上执行curl命令测试OTel Collector的Http端点:
curl -v http://otel-url:4318/v1/traces
返回404:说明Collector未启用otlphttp接收端点
连接超时:检查防火墙、网络策略或Collector是否正常运行
检查OTel Collector配置
确保Collector配置中启用了otlp的http协议,示例配置片段:
receivers: otlp: protocols: http: endpoint: "0.0.0.0:4318"
如果仅配置了gRPC协议,Http请求会被拒绝。
- 升级OTel SDK版本
部分旧版本的OTel .NET SDK存在HttpProtobuf协议的兼容性问题,建议将OpenTelemetry.Exporter.OpenTelemetryProtocol等相关包升级到最新稳定版本。
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

