启用TLS后OpenTelemetry Collector接收C#追踪数据失败排查
启用TLS后C#无法向OpenTelemetry Collector发送追踪数据的排查
我已生成证书和密钥并配置在OpenTelemetry Collector的YAML文件中,希望通过TLS保护Collector。未启用SSL时C#代码能正常发送追踪数据,但启用TLS后就无法工作,请问问题出在哪里?
OpenTelemetry Collector配置文件
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:30004 tls: cert_file: domainlong.crt key_file: domainlong.key extensions: health_check: endpoint: localhost:30008 exporters: logging: loglevel: debug otlp/insecure: tls: insecure: true endpoint: localhost:30007 service: extensions: health_check pipelines: traces: receivers: otlp exporters: otlp/insecure telemetry: logs: level: debug encoding: json output_paths: .\otelCollector.log.json ...
C#客户端代码
var lovTraceProvider = Sdk.CreateTracerProviderBuilder() .AddSource("OpenTelemetryCollector") .SetResourceBuilder( ResourceBuilder.CreateDefault() .AddService(serviceName: "OpenTelemetryCollector")) .AddConsoleExporter() .AddOtlpExporter(lovOplt => { lovOplt.Protocol = OtlpExportProtocol.Grpc; lovOplt.Endpoint = new Uri("https://localhost:30004"); }) .Build(); var lovFirstTrace = lovActivitySource.StartActivity("First trace"); for (int i = 0; i < 10; i++) { var lovFirstActivity = lovActivitySource.StartActivity("Trace binnen for loop"); lovFirstActivity?.AddEvent(new ActivityEvent($"Dit is trace {i} binnen activity {i}")); lovFirstActivity.Stop(); } lovFirstTrace.Stop();
问题原因及解决方法
1. 证书信任问题
默认情况下,.NET会验证服务器证书是否在系统信任列表中。你使用的domainlong.crt是自签名证书,不在信任列表内,客户端会直接拒绝连接。
- 解决方式:
- 将自签名证书导入客户端机器的受信任根证书颁发机构存储;
- 测试环境可临时禁用证书验证(生产环境禁止使用):
.AddOtlpExporter(lovOplt => { lovOplt.Protocol = OtlpExportProtocol.Grpc; lovOplt.Endpoint = new Uri("https://localhost:30004"); // 禁用证书验证(仅测试用) lovOplt.HttpClientFactory = () => { var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; return new HttpClient(handler); }; })
2. 证书域名不匹配
如果证书的Subject或SAN(主题备用名称)字段未包含localhost,客户端会因域名验证失败拒绝连接。
- 解决方式:重新生成证书,确保
localhost被包含在SAN或Subject字段中;或者客户端使用证书上的正确域名发起请求。
3. Collector TLS配置有效性检查
查看Collector的日志文件otelCollector.log.json,确认证书和密钥文件路径正确,Collector运行时能正常读取这两个文件(比如相对路径是否基于Collector的工作目录),没有加载失败的报错信息。
4. 端口与协议一致性验证
确认Collector的gRPC监听端口为30004,客户端Endpoint指定的https://localhost:30004与Collector配置一致,且双方均使用gRPC协议,未出现HTTP/1.1与gRPC混用的情况。
内容的提问来源于stack exchange,提问作者dgrs
相关产品推荐
相关产品推荐

