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