引言:为什么监控对 C# 应用程序至关重要
在现代软件开发中,编写代码只是工作的一半。为了确保应用程序稳定、快速且可预测地运行,持续监控是必不可少的。对于常用于高负载企业系统、银行业、电子商务和云服务的 C# (.NET) 应用程序而言,监控不仅仅是一个选项,而是一项强制性要求。
没有监控,您将盲目工作:内存泄漏直到服务器崩溃才被发现,慢请求不断累积,用户流失到竞争对手那里。在本文中,我们将详细介绍为 C# 应用程序配置可观测性 (observability) 的完整流程:从收集基本指标到配置实时智能告警。
1. 监控基础:在 .NET 中应收集哪些指标
在配置工具之前,了解哪些指标对 C# 应用程序真正重要至关重要。我们将它们分为三组:
1.1. 系统指标(基础设施层面)
- CPU 和内存 — dotnet 进程的处理器负载和内存消耗。
- GC(垃圾回收) — 垃圾回收的频率和持续时间,堆大小(Gen0、Gen1、Gen2、LOH)。
- 线程池 — 活动、空闲和等待线程的数量。
- 磁盘 I/O 和网络 — 磁盘读写、网络连接。
1.2. 业务指标(应用程序层面)
- 请求速率 — 每秒请求数 (RPS)。
- 延迟 — 响应时间(p50、p95、p99 百分位)。
- 错误率 — 4xx 和 5xx 错误的百分比。
- 活跃用户 — 同时工作的用户数量。
1.3. .NET 运行时指标
- JIT 编译 — 方法编译时间。
- 程序集加载 — 已加载程序集的数量。
- 异常 — 每秒抛出的异常数量。
在 .NET 中,收集这些指标可以使用强大的工具——System.Diagnostics.Metrics(自 .NET 6+ 起的内置 API)和 OpenTelemetry 库。
2. 使用 OpenTelemetry 和 Prometheus 配置指标收集
组织 C# 应用程序监控的最佳方式是使用 OpenTelemetry(指标收集)+ Prometheus(存储)+ Grafana(可视化)的组合。让我们逐步进行配置。
2.1. 安装 NuGet 包
将以下包添加到项目中:
dotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoredotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Instrumentation.Runtime2.2. 在 Program.cs 中进行配置
配置 OpenTelemetry 以自动收集 ASP.NET Core 和 .NET Runtime 的指标:
using OpenTelemetry.Metrics;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() // HTTP 请求指标 .AddRuntimeInstrumentation() // GC、JIT、ThreadPool 指标 .AddPrometheusExporter()); // 导出到 Prometheus
var app = builder.Build();
app.UseOpenTelemetryPrometheusScrapingEndpoint(); // /metrics 端点
app.Run();现在,在 http://localhost:5000/metrics 地址上,将提供一个 Prometheus 格式的指标端点。
2.3. 创建自定义指标
让我们添加一个业务指标——已处理订单的计数器:
public class OrderMetrics\