引言:为何要监控 C# 应用程序
在 .NET 平台上,现代 C# 应用程序是在高负载下运行的复杂分布式系统。若缺乏有效的监控,您可能会面临性能下降、内存泄漏或严重故障的风险。监控不仅能帮助发现问题,更能预警问题,从而及时响应异常情况。
本文将介绍如何使用现代工具:Prometheus、Grafana、Serilog 以及内置的 Health Checks,为 C# (.NET) 应用程序搭建指标收集、日志记录和告警系统。您将获得可直接运行的代码示例和实用建议。
C# (.NET) 应用程序的关键指标
监控始于定义关键指标。对于 .NET 应用程序,这些指标可分为三类:
- 基础设施指标 — CPU、内存、磁盘和网络使用率。
- 应用指标 — API 响应时间、请求数量、错误数(4xx/5xx)、队列长度。
- .NET 特有指标 — GC 堆大小、线程数、垃圾回收时间、数据库连接数。
通过 Prometheus 和 .NET 收集指标
要导出指标到 Prometheus,请使用 prometheus-net 库。通过 NuGet 安装:
dotnet add package prometheus-net.AspNetCore在 Program.cs 中添加中间件:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// 启用 Prometheus 指标app.UseHttpMetrics(); // HTTP 指标app.UseMetricServer(); // /metrics 端点
app.MapGet("/", () => "Hello World!");app.Run();现在,标准指标将在 /metrics 端点可用:请求数量、持续时间、错误数。让我们添加一个自定义指标——记录端点访问次数的计数器:
using Prometheus;
var requestCounter = Metrics.CreateCounter( "myapp_requests_total", "对端点的总请求数");
app.MapGet("/api/data", () => { requestCounter.Inc(); return new { Message = "数据已加载" };});健康检查:基础状态验证
.NET 内置的健康检查机制允许您快速评估应用程序的健康状况。添加一个数据库连接检查:
using Microsoft.Extensions.Diagnostics.HealthChecks;
builder.Services.AddHealthChecks() .AddDbContextCheck<AppDbContext>() .AddUrlGroup(new Uri("https://external-api.com"), "外部 API");
app.MapHealthChecks("/health");健康检查会返回 Healthy、Degraded 或 Unhealthy 状态——这非常适合作为告警来源。
使用 Serilog 进行日志记录:结构化日志
日志是诊断的关键数据源。Serilog 允许您将日志以结构化格式发送到 Elasticsearch、Seq,或简单地保存到文件。
安装过程:
dotnet add package Serilog.AspNetCoredotnet add package Serilog.Sinks.Seq在 Program.cs 中进行配置:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.Seq("http://localhost:5341") .Enrich.WithProperty("Application", "MyApp") .CreateLogger();
builder.Host.UseSerilog();现在所有日志将包含上下文信息:RequestId、UserId、执行时间。错误日志示例:
try { // 危险代码} catch (Exception ex) { Log.Error(ex, "处理订单 {OrderId} 时出错", orderId);}结构化日志便于在 Grafana 或 Kibana 中分析、构建