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

在 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-collector 或 Jaeger 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.Add(1, new(“endpoint”, “/api/orders”));
目前 .NET 的 Metrics 导出默认为 OTLP,prometheus 需配合 otel-collector 做格式转换。
基本上就这些。配置不复杂但容易忽略 Resource、Endpoint、Instrumentation 启用顺序。上线前建议先本地连 Jaeger 验证 Span 是否生成,再逐步加 Metrics 和日志(Logs 可通过 OpenTelemetry.Extensions.Logging 补充)。