Мониторинг C# приложений: метрики и алерты в .NET

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

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

Начать курс

Введение: зачем нужен мониторинг 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 позволяет создавать алерты прямо на дашбордах. Например, для метрики времени ответа:

  1. Создайте панель с запросом: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
  2. Перейдите на вкладку Alert → Create Alert rule.
  3. Установите условие: WHEN max() OF query(A, 5m, now) IS ABOVE 2 (секунды).
  4. Настройте канал уведомлений (Slack, PagerDuty, email).

Теперь при превышении времени ответа вы получите мгновенное оповещение.

Заключение

Мониторинг C# (.NET) приложений — это не роскошь, а необходимость. Используя Prometheus для сбора метрик, Serilog для структурированного логирования и Grafana с Alertmanager для визуализации и оповещений, вы получаете полный контроль над состоянием вашего софта.

Начните с малого: добавьте Health Checks и базовые метрики, затем постепенно внедряйте кастомные счётчики и алерты. Помните: хороший мониторинг спасает не только код, но и репутацию разработчика.

Если вы хотите углубиться в тему, изучите OpenTelemetry для распределённой трасси

Блоги

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