Работали ли вы со сбором метрик (metrics) в приложениях?

«Работали ли вы со сбором метрик (metrics) в приложениях?» — вопрос из категории DevOps, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал со сбором метрик для мониторинга производительности, здоровья приложения и бизнес-показателей.

Основные подходы и инструменты:

  1. Prometheus + Grafana (Open Source стандарт):

    • Prometheus: Система сбора и хранения метрик, работающая по модели pull.
    • Grafana: Панели для визуализации.
    • Для .NET: Используется библиотека prometheus-net. Она предоставляет HTTP-эндпоинт (/metrics), который сканирует Prometheus.
      // Startup.cs / Program.cs
      app.UseHttpMetrics(); // Метрики по HTTP-запросам
      app.UseMetricServer(); // Активирует эндпоинт /metrics
      
      // Создание кастомных метрик
      private static readonly Counter OrdersProcessed = Metrics
      .CreateCounter("myapp_orders_processed_total", "Total number of processed orders.");

    public void ProcessOrder() { // Логика обработки... OrdersProcessed.Inc(); // Увеличиваем счетчик }

  2. Application Insights / Azure Monitor:

    • Managed-решение от Microsoft. Метрики собираются автоматически (запросы, зависимости, исключения) и через SDK.
      // Ручное отслеживание метрик
      private readonly TelemetryClient _telemetryClient;
      _telemetryClient.GetMetric("OrdersProcessed").TrackValue(1);
      // Или использование EventCounters
  3. Типы метрик (The Four Golden Signals):

    • Задержка (Latency): Время обработки запроса. (Гистограмма)
    • Трафик (Traffic): Количество запросов в секунду. (Счетчик)
    • Ошибки (Errors): Частота ошибочных ответов. (Счетчик)
    • Насыщенность (Saturation): Загрузка ресурсов (CPU, память, очередь соединений). (Измеритель)
  4. Практический пример сбора бизнес-метрики:

    // Определяем Gauge для отслеживания размера очереди сообщений
    private static readonly Gauge QueueSize = Metrics
        .CreateGauge("myapp_messagequeue_size", "Current number of messages in the queue.");
    
    // В фоновом сервисе, который обрабатывает очередь
    public async Task ProcessQueueAsync()
    {
        while (true)
        {
            var size = _messageQueue.GetSize();
            QueueSize.Set(size); // Обновляем значение датчика
            // ... обработка
            await Task.Delay(5000);
        }
    }

Ключевые принципы:

  • Именование метрик: Использовать snake_case, суффиксы _total, _seconds, _bytes.
  • Метки (Labels/Tags): Использовать для детализации (например, http_method="POST", status_code="500"), но избегать высоко кардинальных значений (как UserId).
  • Сбор системных метрик: Через Node Exporter для Prometheus или стандартные счетчики ОС для Application Insights.