Приведите пример, какие метрики вы собирали на последнем проекте.

Ответ

На последнем проекте мы использовали стек Prometheus + Grafana + Alertmanager. Основные группы метрик были следующими:

  1. HTTP-метрики (RED)

    • Собирались с помощью middleware для net/http и библиотеки prometheus/client_golang.
    • Latency: Гистограмма времени ответа (prometheus.HistogramVec) с разделением по эндпоинтам и HTTP-методам.
    • Request Rate: Счетчик запросов (prometheus.CounterVec) с лейблами: path, method, status_code.
    • Error Rate: Рассчитывался в Grafana на основе данных из счетчика запросов.
    // Пример метрики для подсчета HTTP-запросов
    var httpRequestsTotal = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests",
        },
        []string{"path", "method", "code"},
    )
  2. Бизнес-метрики

    • Счетчики ключевых бизнес-операций. Например, количество созданных заказов или обработанных платежей.
    • Использование лейблов позволяло разделять успешные и неуспешные операции.
    var ordersProcessed = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "orders_processed_total",
            Help: "Total processed orders",
        },
        []string{"status"}, // "success", "failed"
    )
  3. Метрики зависимостей

    • База данных: Время выполнения запросов (histogram), количество активных и простаивающих соединений в пуле.
    • Внешние API: Время ответа и количество ошибок при обращении к сторонним сервисам.
  4. Системные метрики Go

    • Стандартные метрики, предоставляемые prometheus/client_golang, включая статистику GC, количество горутин, использование памяти (go_memstats_*).

Такой подход позволял нам не только отслеживать общее состояние сервиса (SLA/SLO), но и быстро диагностировать проблемы, определяя, где именно произошел сбой: в нашем коде, в базе данных или во внешнем сервисе.