C#如何配置OpenTelemetry .NET应用可观测性配置教程

1次阅读

c# .net 应用接入 opentelemetry 的核心是三步:引入 sdk、配置 tracing 和 metrics、导出到后端(如 jaeger、zipkin、otlp 接收器),需安装 opentelemetry 等 nuget 包,在 program.cs 中注册服务并设置 Resource、endpoint 与 instrumentation,支持手动打点和指标采集。

C#如何配置OpenTelemetry .NET应用可观测性配置教程

在 C# .NET 应用中接入 OpenTelemetry,核心是三步:引入 SDK、配置 Tracing 和 Metrics、导出到后端(如 Jaeger、Zipkin、OTLP 接收器)。不依赖特定云厂商,标准轻量,适合 .NET 6+ 项目。

安装必要 NuGet 包

确保项目使用 .NET 6 或更高版本。在项目文件(.csproj)中添加以下包:

  • OpenTelemetry(基础运行时)
  • OpenTelemetry.Exporter.OpenTelemetryProtocol(推荐 OTLP 协议导出)
  • OpenTelemetry.Instrumentation.AspNetCore(自动采集 http 请求追踪)
  • OpenTelemetry.Instrumentation.Http(自动采集 HttpClient 出站调用)
  • (可选)OpenTelemetry.Instrumentation.sqlClient(SQL Server 调用追踪)

例如通过 CLI 安装:

dotnet add package OpenTelemetry
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
dotnet add package OpenTelemetry.Instrumentation.AspNetCore
dotnet add package OpenTelemetry.Instrumentation.Http

在 Program.cs 中配置 Tracing

.NET 6+ 使用 Minimal Hosting 模型,直接在 Program.cs 中注册 OpenTelemetry 服务:

var builder = WebApplication.CreateBuilder(args);

// 添加 OpenTelemetry Tracing
builder.Services.AddOpenTelemetryTracing(tracerProviderBuilder =>
{
  tracerProviderBuilder
    .AddAspNetCoreInstrumentation() // 自动追踪 mvc/Controller 请求
    .AddHttpClientInstrumentation() // 自动追踪 HttpClient 调用
    .AddSource(“MyApp.Diagnostic”) // 手动创建 Activity 的命名源(按需)
    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(“my-api”))
    .AddOtlpExporter(opt =>
    {
      opt.Endpoint = new Uri(“http://localhost:4317”); // OTLP gRPC 地址
    });
});

var app = builder.Build();

注意:
AddService 设置服务名,用于在观测平台中区分服务;
OTLP endpoint 默认是 gRPC(4317),若用 HTTP/json 则改用 4318 并设置 opt.Protocol = OtlpExportProtocol.HttpProtobuf;
– 若本地测试,可先用 otel-collectorJaeger all-in-one 接收数据。

手动添加自定义追踪(Activity)

对关键业务逻辑打点,比如订单处理、缓存操作:

using var activity = MyActivitySource.StartActivity(“ProcessOrder”, ActivityKind.internal);
activity?.SetTag(“order.id”, orderId);
activity?.SetTag(“user.id”, userId);
try
{
  // 业务逻辑
  activity?.SetStatus(ActivityStatusCode.Ok);
}
catch (Exception ex)
{
  activity?.SetStatus(ActivityStatusCode.Error, ex.Message);
  activity?.RecordException(ex);
  throw;
}

提前定义 ActivitySource(建议静态单例):

public Static readonly ActivitySource MyActivitySource =
    new ActivitySource(“MyApp.Diagnostic”);

这样就能在 Jaeger 或 grafana Tempo 中看到带标签的 Span,并关联异常信息。

启用 Metrics(指标采集)

OpenTelemetry .NET 的 Metrics 支持较新(.NET 6+ 稳定),可用于记录请求计数、延迟直方图等:

builder.Services.AddOpenTelemetryMetrics(metrics =>
{
  metrics
    .AddAspNetCoreInstrumentation() // 自动采集 HTTP 请求次数、延迟等
    .AddMeter(“MyApp.Metrics”) // 手动上报时用的 Meter 名称
    .AddOtlpExporter(opt => opt.Endpoint = new Uri(“http://localhost:4317”));
});

然后在代码中使用:

private static readonly Meter MyMeter = new(“MyApp.Metrics”);
private static readonly counter RequestCounter = MyMeter.CreateCounter(“app.requests.count”);

RequestCounter.Add(1, new(“endpoint”, “/api/orders”));

目前 .NET 的 Metrics 导出默认为 OTLP,prometheus 需配合 otel-collector 做格式转换。

基本上就这些。配置不复杂但容易忽略 Resource、Endpoint、Instrumentation 启用顺序。上线前建议先本地连 Jaeger 验证 Span 是否生成,再逐步加 Metrics 和日志(Logs 可通过 OpenTelemetry.Extensions.Logging 补充)。

text=ZqhQzanResources