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

启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:52:46