用于监控 C# (.NET) 应用程序的 AppMetrics 库
在开发现代 .NET 应用程序时,跟踪其状态、性能并识别瓶颈至关重要。AppMetrics 库是一个强大且灵活的工具,用于实时收集、聚合和导出指标。它使开发人员和管理员能够全面了解服务的运行情况:从请求执行时间到错误频率。
AppMetrics 支持多种指标存储后端:Prometheus、InfluxDB、Graphite、Elasticsearch 等。借助内置的 健康检查,您不仅可以收集统计数据,还可以检查依赖项(数据库、外部 API)的运行状况。
主要功能
- 计数器 (Counters) — 请求、错误、事件的数量。
- 直方图 (Histograms) — 操作执行时间的分布。
- 计时器 (Timers) — 测量代码执行持续时间。
- 计量器 (Meters) — 每秒事件速率。
- 健康检查 (Health Checks) — 检查外部服务的可用性。
- 指标导出 — 导出到 Prometheus(/metrics 格式)、InfluxDB 等。
安装与配置
通过 NuGet 安装包:
dotnet add package AppMetrics.AspNetCore.Mvcdotnet add package AppMetrics.Reporting.Prometheus.Client然后在 Program.cs(或 Startup.cs)中添加服务:
using App.Metrics;using App.Metrics.AspNetCore;using App.Metrics.Formatters.Prometheus;
var builder = WebApplication.CreateBuilder(args);
// 配置指标var metrics = AppMetrics.CreateDefaultBuilder() .OutputMetrics.AsPrometheusPlainText() .Build();
builder.Services.AddMetrics(metrics);builder.Services.AddMetricsTrackingMiddleware();builder.Services.AddMetricsEndpoints();
var app = builder.Build();
app.UseMetricsAllMiddleware();app.UseMetricsAllEndpoints();
app.MapGet("/", () => "Hello World!");
app.Run();启动应用程序后,指标将在 /metrics 地址以 Prometheus 格式提供。
创建自定义指标
定义一个用于存储指标的类:
public class MyMetrics{ private readonly IMetrics _metrics;
public MyMetrics(IMetrics metrics) { _metrics = metrics; }
// 请求计数器 private readonly CounterOptions _requestCounter = new CounterOptions { Name = "myapp_requests_total", MeasurementUnit = Unit.Requests };
// 用于测量执行时间的计时器 private readonly TimerOptions _requestTimer = new TimerOptions { Name = "myapp_request_duration_seconds", MeasurementUnit = Unit.Requests, DurationUnit = TimeUnit.Seconds };
public void TrackRequest() { _metrics.Measure.Counter.Increment(_requestCounter); }
public IDisposable MeasureRequestDuration() { return _metrics.Measure.Timer.Time(_requestTimer); }}在控制器中使用指标:
[ApiController][Route("api/[controller]")]public class SampleController : ControllerBase{ private readonly MyMetrics _myMetrics;
public SampleController(MyMetrics myMetrics) { _myMetrics = myMetrics; }
[HttpGet] public IActionResult Get() { _myMetrics.TrackRequest();
using (_myMetrics.MeasureRequestDuration()) { // 模拟工作 Thread.Sleep(100); }
return Ok("Metrics tracked"); }}