Prometheus метрики в C# (.NET) — библиотека prometheus-net

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

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

Начать курс

Prometheus метрики в C# (.NET) — библиотека prometheus-net

В современной разработке веб-приложений и микросервисов на платформе .NET мониторинг и observability (наблюдаемость) стали обязательными элементами production-среды. Библиотека prometheus-net — это официальная клиентская библиотека для .NET, которая позволяет легко экспортировать метрики приложения в формате, понятном серверу мониторинга Prometheus.

С помощью prometheus-net вы можете собирать данные о производительности (время ответа, количество запросов, ошибки, использование памяти) и передавать их в Prometheus для последующей визуализации в Grafana или других инструментах. Библиотека поддерживает как старые версии .NET Framework (4.6.1+), так и современные .NET Core / .NET 5/6/7/8.

Установка

Установить библиотеку можно через NuGet Package Manager или с помощью .NET CLI:

dotnet add package prometheus-net

Для ASP.NET Core приложений дополнительно требуется пакет prometheus-net.AspNetCore:

dotnet add package prometheus-net.AspNetCore

Основные типы метрик

Prometheus поддерживает четыре основных типа метрик. В prometheus-net они реализованы как статические фабрики в классе Metrics:

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

Пример использования Counter

Создадим простой счётчик для подсчёта количества обработанных HTTP-запросов:

using Prometheus;

// Создаём счётчик с именем и описанием
private static readonly Counter RequestCount = Metrics
    .CreateCounter("myapp_requests_total", "Total number of HTTP requests.");

// В обработчике запроса увеличиваем счётчик
public IActionResult Index()
{
    RequestCount.Inc();          // увеличить на 1
    // Или RequestCount.Inc(5);  // увеличить на 5
    return View();
}

Пример использования Gauge

Gauge удобен для отслеживания текущего состояния, например, количества активных пользователей:

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

// При входе пользователя
ActiveUsers.Inc();

// При выходе пользователя
ActiveUsers.Dec();

Пример использования Histogram

Гистограмма идеально подходит для измерения времени выполнения запросов:

private static readonly Histogram RequestDuration = Metrics
    .CreateHistogram("myapp_request_duration_seconds", 
                     "Histogram of request duration.",
                     new HistogramConfiguration
                     {
                         // Настраиваем границы buckets
                         Buckets = new[] { 0.1, 0.25, 0.5, 1.0, 2.5 }
                     });

// В middleware или в действии контроллера
using (RequestDuration.NewTimer())
{
    // выполнение запроса
    await Next(context);
}

Интеграция с ASP.NET Core

Чтобы ваш эндпоинт /metrics начал отдавать данные в формате Prometheus, достаточно добавить middleware в Program.cs:

using Prometheus;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// Добавляем middleware для сбора стандартных метрик
app.UseHttpMetrics();

// Эндпоинт /metrics будет доступен по умолчанию
app.MapMetrics();

app.Run();

Теперь при запуске приложения по адресу http://localhost:5000/metrics вы увидите все собранные метрики, включая стандартные (количество запросов, время ответа, количество ошибок).

Кастомные метрики с лейблами

Для более детальной информации можно добавлять лейблы (labels) к метрикам. Например, счётчик запросов по HTTP-методам:

private static readonly Counter RequestByMethod = Metrics
    .CreateCounter("myapp_requests_by_method_total", 
                   "Requests grouped by HTTP method.",
                   new CounterConfiguration
                   {
                       LabelNames = new[] { "method" }
                   });

// Использование
RequestByMethod.WithLabels("GET").Inc();
RequestByMethod.WithLabels("POST").Inc();

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

  • ASP.NET Core метрики — app.Use

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