Prometheus метрики в C# (.NET): интеграция и настройка

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

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

Начать курс

Prometheus метрики в C# (.NET): полное руководство по интеграции

Prometheus — это система мониторинга с открытым исходным кодом, которая собирает и хранит метрики в виде временных рядов. Для разработчиков на C# (.NET) интеграция с Prometheus открывает возможность отслеживать производительность приложений, бизнес-показатели и состояние системы в реальном времени. В этой статье мы разберём, как подключить Prometheus к .NET-приложению, какие библиотеки использовать и как правильно настраивать метрики.

Зачем нужны Prometheus метрики в .NET?

Мониторинг с помощью Prometheus позволяет:

  • Отслеживать количество запросов, ошибок и время ответа.
  • Собирать метрики производительности (CPU, память, GC).
  • Создавать пользовательские бизнес-метрики (активные пользователи, заказы).
  • Интегрироваться с Grafana для визуализации дашбордов.
  • Настраивать алерты на основе пороговых значений.

Библиотека prometheus-net

Основная библиотека для работы с Prometheus в .NET — prometheus-net. Она поддерживает ASP.NET Core, .NET Core, .NET Framework и gRPC. Установка через NuGet:

dotnet add package prometheus-net

Для ASP.NET Core дополнительно установите:

dotnet add package prometheus-net.AspNetCore

Типы метрик в Prometheus

Библиотека поддерживает все стандартные типы метрик:

  • Counter — счётчик, который только увеличивается (количество запросов).
  • Gauge — значение, которое может расти и уменьшаться (текущая температура).
  • Histogram — гистограмма для измерения распределения значений (время ответа).
  • Summary — квантили для агрегирования данных (p95, p99).

Пример: базовый Counter

Создадим метрику, которая считает количество запросов к эндпоинту:

using Prometheus;

public class MetricsService
{
    private static readonly Counter RequestCount = Metrics
        .CreateCounter("app_requests_total", "Total number of requests", new CounterConfiguration
        {
            LabelNames = new[] { "method", "endpoint" }
        });

    public void RecordRequest(string method, string endpoint)
    {
        RequestCount.WithLabels(method, endpoint).Inc();
    }
}

В контроллере ASP.NET Core вызов будет выглядеть так:

[ApiController]
[Route("api/order")]
public class OrderController : ControllerBase
{
    private readonly MetricsService _metrics;

    public OrderController(MetricsService metrics) => _metrics = metrics;

    [HttpGet]
    public IActionResult GetOrders()
    {
        _metrics.RecordRequest("GET", "/api/order");
        return Ok(new { orders = new[] { "order1", "order2" } });
    }
}

Пример: Gauge для активных пользователей

private static readonly Gauge ActiveUsers = Metrics
    .CreateGauge("app_active_users", "Number of active users");

public void UserLoggedIn() => ActiveUsers.Inc();
public void UserLoggedOut() => ActiveUsers.Dec();

Пример: Histogram для времени ответа

private static readonly Histogram RequestDuration = Metrics
    .CreateHistogram("app_request_duration_seconds", "Request duration in seconds",
        new HistogramConfiguration
        {
            Buckets = Histogram.ExponentialBuckets(0.001, 2, 10) // от 1ms до ~1s
        });

public void RecordRequestDuration(double seconds)
{
    RequestDuration.Observe(seconds);
}

Экспорт метрик в ASP.NET Core

Чтобы Prometheus мог собирать метрики, нужно добавить эндпоинт /metrics. В Program.cs:

using Prometheus;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();

// Включаем сбор стандартных метрик .NET (память, GC, CPU)
app.UseHttpMetrics();

// Эндпоинт для сбора метрик Prometheus
app.MapMetrics();

app.MapControllers();
app.Run();

После запуска перейдите по адресу http://localhost:5000/metrics — вы увидите все метрики в текстовом формате.

Дополнительные возможности

  • Стандартные метрики .NET — UseHttpMetrics() автоматически собирает количество запросов, время ответа, размеры запросов и ответов.
  • Атрибуты для контроллеров — используйте [PrometheusMetric] для автоматического сбора метрик.
  • Health Checks — интеграция с проверками здоровья приложения.
  • gRPC метрики — библиотека prometheus-net.Gr

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