监控 C# (.NET) 应用程序:从指标到告警
现代 .NET 应用程序需要持续监控性能、可用性和内部进程状态。在本文中,我们将介绍用于组织监控的关键工具:Prometheus 用于收集指标,OpenTelemetry 用于追踪,以及 Serilog 用于结构化日志记录。您将了解如何在您的 C# 应用程序中实现可观测性。
为什么需要监控 .NET 应用程序?
缺乏监控会使调试变成猜测。没有指标,您将无法了解响应时间的增长;没有追踪,您将无法找到调用链中的瓶颈;没有日志,您将无法理解错误的原因。正确配置的监控可以:
- 在异常影响用户之前发现它们。
- 分析各个组件(数据库、API、缓存)的性能。
- 收集业务指标(订单数量、活跃会话)。
- 自动化事件告警。
用于监控 .NET 的工具
我们将使用三个主要组件:
- Prometheus — 一个具有强大 PromQL 查询语言的指标收集和存储系统。
- OpenTelemetry — 用于收集遥测数据(追踪、指标、日志)的标准。
- Serilog — 用于 .NET 的结构化日志记录库。
步骤 1:安装和配置 Prometheus 与 .NET
要将 Prometheus 与 C# 集成,请使用 prometheus-net 包。通过 NuGet 安装它:
dotnet add package prometheus-net然后,在您的 Program.cs 中添加中间件:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// 为 Prometheus 启用 /metrics 端点app.UseHttpMetrics();app.MapMetrics();
app.MapGet("/", () => "Hello World!");app.Run();启动应用程序后,访问 http://localhost:5000/metrics。您将看到标准指标:http_requests_total、http_request_duration_seconds 等。
步骤 2:创建自定义指标
通常需要跟踪业务指标。例如,已处理的订单数量:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCounter = Metrics .CreateCounter("orders_processed_total", "Total number of processed orders");
public static void RecordOrder() { OrdersCounter.Inc(); }}
// 在控制器中使用[ApiController][Route("api/orders")]public class OrdersController : ControllerBase{ [HttpPost] public IActionResult CreateOrder() { // ... 创建订单的逻辑 OrderMetrics.RecordOrder(); return Ok(); }}现在,在 /metrics 中将出现一行 orders_processed_total 1。
步骤 3:使用 OpenTelemetry 进行追踪
追踪有助于了解处理请求的每个阶段花费了多少时间。安装包:
dotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Console在 Program.cs 中配置 OpenTelemetry:
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddConsoleExporter());
var app = builder.Build();app.Run();现在,每个 HTTP 请求将自动创建一个包含执行时间信息的追踪。用于导出