Библиотека AppMetrics для мониторинга приложений C# (.NET)
При разработке современных .NET-приложений критически важно отслеживать их состояние, производительность и выявлять узкие места. Библиотека AppMetrics — это мощный и гибкий инструмент для сбора, агрегации и экспорта метрик в реальном времени. Она позволяет разработчикам и администраторам получать полную картину работы сервиса: от времени выполнения запросов до частоты ошибок.
AppMetrics поддерживает множество бэкендов для хранения метрик: Prometheus, InfluxDB, Graphite, Elasticsearch и другие. Благодаря встроенным Health Checks вы можете не только собирать статистику, но и проверять работоспособность зависимостей (базы данных, внешние API).
Основные возможности
- Счётчики (Counters) — количество запросов, ошибок, событий.
- Гистограммы (Histograms) — распределение времени выполнения операций.
- Таймеры (Timers) — измерение длительности выполнения кода.
- Метры (Meters) — скорость событий в секунду.
- Health Checks — проверка доступности внешних сервисов.
- Экспорт метрик — в Prometheus (формат /metrics), InfluxDB и другие.
Установка и настройка
Установите пакет через NuGet:
dotnet add package AppMetrics.AspNetCore.Mvc
dotnet 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");
}
}
Health Checks для мониторинга зависимостей
Добавьте проверку состояния базы данных или внешнего API:
public class DatabaseHealthCheck : IHealthCheck
{
public string Name => "Database";
public async ValueTask<HealthCheckResult> CheckAsync(CancellationToken cancellationToken = default)
{
try
{
// Здесь код проверки подключения к БД
await Task.Delay(10, cancellationToken);
return HealthCheckResult.Healthy("Database is reachable");
}
catch (Exception ex)
{
return HealthCheckResult.Unhealthy($"Database error: {ex.Message}");
}
}
}
Зарегистрируйте проверку в сервисах:
builder.Services.AddHealthChecks()
.AddCheck<DatabaseHealthCheck>("Database");
Теперь эндпоинт /health будет возвращать статус всех зависимостей.
Визуализация в Grafana
После настройки экспорта метрик в Prometheus, вы можете создать дашборд в Grafana. Основные метрики для отображения:
myapp_requests_total— общее количество запросов.rate(my