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
Также в библиотеке
Kotlin Symbol Processing (KSP) для Kotlin: полное руководство с примерами
Работа с датами в Rust: обзор библиотек для времени и дат
HTTP-клиент для Swift (iOS/macOS): топ библиотек 2024
Реактивное программирование в Java: библиотеки Project Reactor и RxJava