监控 C# (.NET) 应用程序:OpenTelemetry 和 Prometheus 完整指南
现代 .NET 应用程序需要持续监控性能、错误和状态。没有监控,您将面临失去对生产环境控制的风险。在本文中,我们将详细讲解如何使用 OpenTelemetry(遥测数据收集)和 Prometheus + Grafana(可视化和告警)组合来配置高效的 C# (.NET) 应用程序监控。
为什么选择 OpenTelemetry?
OpenTelemetry (OTel) 是用于收集指标、追踪(链路追踪)和日志的行业标准。对于 .NET,它提供了官方 SDK 以及对流行库(ASP.NET Core、gRPC、Entity Framework)的自动检测功能。
在 C# 项目中安装和配置 OpenTelemetry
将 NuGet 包添加到您的项目中:
dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoreProgram.cs 中的基本配置
配置指标收集并导出到 Prometheus:
using OpenTelemetry.Metrics;using OpenTelemetry.Resources;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddService("MyApp", serviceVersion: "1.0.0")) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddPrometheusExporter());
var app = builder.Build();
// Prometheus 端点(默认为 /metrics)app.MapPrometheusScrapingEndpoint();
app.Run();创建自定义指标
您可以添加自己的计数器、直方图和仪表:
using System.Diagnostics.Metrics;
public class OrderMetrics{ private readonly Counter<int> _ordersCreated; private readonly Histogram<double> _orderProcessingTime;
public OrderMetrics(IMeterFactory meterFactory) { var meter = meterFactory.Create("MyApp.Orders"); _ordersCreated = meter.CreateCounter<int>("orders.created", description: "已创建的订单数量"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }
public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}请求追踪(分布式链路追踪)
为了跟踪调用链,请添加追踪功能:
using OpenTelemetry.Trace;
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // 用于调试,生产环境请使用 Jaeger 或 Zipkin通过 OpenTelemetry 进行日志记录
将日志记录器连接到 OTel:
using OpenTelemetry.Logs;
builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));配置 Prometheus 以收集指标
在 prometheus.yml 文件中指定您的端点:
scrape_configs: - job_name: 'dotnet-app' scrape_interval: 5s static_configs: - targets: ['localhost:5000'] # 您的应用程序端口在 Grafana 中进行可视化
将 Prometheus 连接到 Grafana 后,创建一个包含关键指标的面板:
- http_server_duration_ms — 服务器响应时间
- http_server_request_count — 请求计数
- orders_created_total — 自定义指标示例
结论
使用 OpenTelemetry 和 Prometheus 监控 C# (.NET) 应用程序可以让您全面了解生产环境。从基本的 HTTP 指标开始,然后添加自定义业务指标和分布式追踪。使用 Grafana 创建可视化面板,并设置告警以快速响应问题。