引言:为什么 C# 应用监控是一门艺术
在现代 C# (.NET) 开发中,监控已不再仅仅是一个选项。它是生产环境的必备要素,不仅能够记录故障,还能预测故障。在高级层面,监控演变为一个早期预警系统:您不仅查看仪表板,还要基于复杂指标配置告警。
在本文中,我们将探讨如何超越标准的 CPU 和内存计数器。您将学习如何采集自定义业务指标、使用 Prometheus 和 Alertmanager 配置告警,以及利用 OpenTelemetry 进行链路追踪。所有示例均使用 C#。
1. 高级仪表化:App Metrics 与 Prometheus
1.1. 将 Prometheus 接入 ASP.NET Core
.NET 中的基础监控通常局限于内置的 PerformanceCounter。然而,对于微服务架构,Prometheus 已成为标准。安装包:
dotnet add package prometheus-net.AspNetCore然后在 Program.cs 中添加中间件:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// 启用指标端点app.UseHttpMetrics();app.UseRouting();app.MapMetrics(); // /metrics
app.Run();这将为您提供基础指标:请求数、持续时间、错误数。但对于高级层面来说,这还不够。
1.2. 自定义业务指标
假设您想追踪创建的订单数量或关键业务操作的执行时间。使用 Counter 和 Histogram:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCreated = Metrics .CreateCounter("orders_created_total", "Total number of created orders");
private static readonly Histogram OrderProcessingTime = Metrics .CreateHistogram("order_processing_seconds", "Histogram of order processing time");
public void RecordOrderCreation(double elapsedSeconds) { OrdersCreated.Inc(); OrderProcessingTime.Observe(elapsedSeconds); }}现在,您可以在任何服务中注入 OrderMetrics 并记录数据。这将使您能够在 Grafana 中构建精确到秒的仪表板。
2. 告警:从简单触发器到基于 SLO 的规则
2.1. 为 C# 指标配置 Alertmanager
采集指标只是成功的一半。另一半是告警。为 Prometheus 创建规则(alerts.yml):
groups: - name: csharp_app_alerts rules: - alert: HighErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "C# 应用错误率过高" description: "过去 5 分钟错误率为 {{ $value }}"这是一个基础示例。在高级层面,应添加 SLO 告警。例如,如果 99% 的请求响应时间超过 200 毫秒,那就需要紧急处理。
2.2. 基于业务指标的告警
使用上一节中的自定义计数器。如果订单数量突然下降,说明出了问题:
- alert: OrdersStopped expr: rate(orders_created_total[10m]) == 0 for: 5m labels: severity: warning annotations: summary: "过去 10 分钟未创建订单"这种告警无法从标准操作系统指标中获得——它需要对业务逻辑有深入理解。
3. OpenTelemetry:C# 中的分布式链路追踪
3.1. 集成 OpenTelemetry SDK
当您拥有 10 个 C# 微服务时,单独的指标无济于事。需要链路追踪。安装