Мониторинг приложений C# (.NET) с помощью AppMetrics

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека 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

Рекомендаций