Введение: зачем нужен мониторинг C# приложений
Современные C# приложения на платформе .NET — это сложные распределённые системы, работающие в условиях высоких нагрузок. Без качественного мониторинга вы рискуете пропустить деградацию производительности, утечки памяти или критические сбои. Мониторинг позволяет не только фиксировать проблемы, но и прогнозировать их, своевременно реагируя на аномалии.
В этой статье мы разберём, как настроить сбор метрик, логирование и систему алертов для C# (.NET) приложений с использованием современных инструментов: Prometheus, Grafana, Serilog и встроенных Health Checks. Вы получите готовые примеры кода и практические рекомендации.
Основные метрики для C# (.NET) приложений
Мониторинг начинается с определения ключевых показателей. Для .NET-приложений их можно разделить на три категории:
- Инфраструктурные метрики — использование CPU, памяти, диска, сети.
- Прикладные метрики — время ответа API, количество запросов, ошибки (4xx/5xx), размер очередей.
- .NET-специфичные метрики — размер кучи GC, количество потоков, время сборки мусора, количество подключений к БД.
Сбор метрик через Prometheus и .NET
Для экспорта метрик в Prometheus используйте библиотеку prometheus-net. Установите её через NuGet:
dotnet add package prometheus-net.AspNetCore
Добавьте middleware в Program.cs:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Включаем метрики Prometheus
app.UseHttpMetrics(); // HTTP-метрики
app.UseMetricServer(); // /metrics endpoint
app.MapGet("/", () => "Hello World!");
app.Run();
Теперь по адресу /metrics будут доступны стандартные метрики: количество запросов, длительность, ошибки. Добавим кастомную метрику — счётчик обращений к эндпоинту:
using Prometheus;
var requestCounter = Metrics.CreateCounter(
"myapp_requests_total",
"Total requests to the endpoint");
app.MapGet("/api/data", () => {
requestCounter.Inc();
return new { Message = "Data loaded" };
});
Health Checks: базовая проверка состояния
Встроенный механизм Health Checks в .NET позволяет быстро оценить работоспособность приложения. Добавьте проверку подключения к базе данных:
using Microsoft.Extensions.Diagnostics.HealthChecks;
builder.Services.AddHealthChecks()
.AddDbContextCheck<AppDbContext>()
.AddUrlGroup(new Uri("https://external-api.com"), "External API");
app.MapHealthChecks("/health");
Health Checks возвращают статус Healthy, Degraded или Unhealthy — это идеальный источник для алертов.
Логирование с Serilog: структурированные логи
Логи — важнейший источник данных для диагностики. Serilog позволяет отправлять логи в Elasticsearch, Seq или просто в файл с структурированным форматом.
Установка:
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Seq
Настройка в Program.cs:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.Seq("http://localhost:5341")
.Enrich.WithProperty("Application", "MyApp")
.CreateLogger();
builder.Host.UseSerilog();
Теперь все логи будут содержать контекстную информацию: RequestId, UserId, время выполнения. Пример логирования ошибки:
try {
// опасный код
} catch (Exception ex) {
Log.Error(ex, "Ошибка при обработке заказа {OrderId}", orderId);
}
Структурированные логи легко анализировать в Grafana или Kibana, строить дашборды и устанавливать алерты на частоту ошибок.
Настройка алертов: от метрик к уведомлениям
Сами по себе метрики бесполезны без системы оповещения. Рассмотрим два подхода: алерты на основе Prometheus и встроенные алерты в Grafana.
Алерты в Prometheus (Alertmanager)
Создайте файл alerts.yml:
groups:
- name: csharp_alerts
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
for: 2m
labels:
severity: critical
annotations:
summary: "Высокий уровень ошибок 5xx в {{ $labels.instance }}"
description: "Ошибки превышают 10% за последние 5 минут"
Alertmanager отправит уведомление в Slack, Telegram или по email, когда сработает правило.
Алерты в Grafana
Grafana позволяет создавать алерты прямо на дашбордах. Например, для метрики времени ответа:
- Создайте панель с запросом:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) - Перейдите на вкладку Alert → Create Alert rule.
- Установите условие:
WHEN max() OF query(A, 5m, now) IS ABOVE 2(секунды). - Настройте канал уведомлений (Slack, PagerDuty, email).
Теперь при превышении времени ответа вы получите мгновенное оповещение.
Заключение
Мониторинг C# (.NET) приложений — это не роскошь, а необходимость. Используя Prometheus для сбора метрик, Serilog для структурированного логирования и Grafana с Alertmanager для визуализации и оповещений, вы получаете полный контроль над состоянием вашего софта.
Начните с малого: добавьте Health Checks и базовые метрики, затем постепенно внедряйте кастомные счётчики и алерты. Помните: хороший мониторинг спасает не только код, но и репутацию разработчика.
Если вы хотите углубиться в тему, изучите OpenTelemetry для распределённой трасси