← Назад к вопросам

Как собирали данные с метрик?

2.0 Middle🔥 151 комментариев
#Observability

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сбор и обработка метрик в Go: практики и инструменты

В моей практике сбор метрик был комплексным процессом, сочетающим инструменты стандартной библиотеки Go, сторонние решения и собственные инфраструктурные компоненты. Вот ключевые подходы и технологии, которые я применял:

1. Использование стандартных инструментов и библиотек

Go предоставляет богатые возможности для интроспекции программы через пакеты runtime и expvar. Я часто использовал их для базового мониторинга:

// Пример экспорта стандартных метрик через expvar
import (
    "expvar"
    "runtime"
)

func initMetrics() {
    // Экспорт количества горутин
    expvar.Publish("goroutines", expvar.Func(func() interface{} {
        return runtime.NumGoroutine()
    }))
    
    // Экспорт памяти
    expvar.Publish("memory_stats", expvar.Func(func() interface{} {
        var m runtime.MemStats
        runtime.ReadMemStats(&m)
        return m
    }))
}

Для HTTP сервисов я создавал middleware, который собирал метрики запросов:

func metricsMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        
        // Счетчик запросов
        requestCounter.Add(1)
        
        next.ServeHTTP(w, r)
        
        // Замер времени выполнения
        duration := time.Since(start)
        requestDuration.Observe(duration.Seconds())
    })
}

2. Интеграция с Prometheus

В современных проектах Prometheus стал стандартом де-факто для метрик. Я использовал библиотеку client_golang:

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    // Создание кастомных метрик
    requestCount = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests",
        },
        []string{"method", "path", "status"},
    )
    
    requestLatency = prometheus.NewHistogramVec(
        prometheus.HistogramOpts{
            Name: "http_request_duration_seconds",
            Help: "Duration of HTTP requests",
        },
        []string{"method", "path"},
    )
)

func init() {
    // Регистрация метрик
    prometheus.MustRegister(requestCount)
    prometheus.MustRegister(requestLatency)
    
    // Экспорт метрик через HTTP endpoint
    http.Handle("/metrics", promhttp.Handler())
}

Prometheus предоставлял мощный инструмент для агрегации, алертинга и долгосрочного хранения исторических данных.

3. Сбор бизнес-метрик

Для бизнес-логики я создавал специализированные счетчики и агрегаторы:

type BusinessMetrics struct {
    TransactionsProcessed prometheus.Counter
    FailedTransactions    prometheus.Counter
    ProcessingQueueSize   prometheus.Gauge
    RevenueGenerated      prometheus.Counter
}

func NewBusinessMetrics() *BusinessMetrics {
    return &BusinessMetrics{
        TransactionsProcessed: prometheus.NewCounter(prometheus.CounterOpts{
            Name: "business_transactions_total",
            Help: "Total processed transactions",
        }),
        FailedTransactions: prometheus.NewCounter(prometheus.CounterOpts{
            Name: "business_failed_transactions_total",
            Help: "Total failed transactions",
        }),
        ProcessingQueueSize: prometheus.NewGauge(prometheus.GaugeOpts{
            Name: "business_queue_size",
            Help: "Current processing queue size",
        }),
        RevenueGenerated: prometheus.NewCounter(prometheus.CounterOpts{
            Name: "business_revenue_total",
            Help: "Total revenue generated",
        }),
    }
}

4. Агрегация и экспорт метрик

Метрики собирались из нескольких источников и агрегировались:

  • Метрики приложения (горутины, память, HTTP запросы)
  • Метрики бизнес-процессов (транзакции, ошибки, производительность)
  • Метрики внешних зависимостей (базы данных, кэши, сторонние API)
  • Метрики инфраструктуры (использование CPU, диск, сеть)

Для экспорта использовались несколько подходов:

Прямой экспорт через HTTP endpoint:

// Prometheus endpoint
http.Handle("/metrics", promhttp.Handler())

// JSON endpoint для custom метрик
http.HandleFunc("/internal-metrics", func(w http.ResponseWriter, r *http.Request) {
    metrics := collectCustomMetrics()
    json.NewEncoder(w).Encode(metrics)
})

Агрегация через агенты:

В распределенных системах метрики собирались агентами на каждом узле и отправлялись в центральный Prometheus или Telegraf.

Использование push-модели для Grafana:

Для некоторых случаев использовалась библиотека для отправки метрик в Graphite или прямо в Grafana через протоколы like Carbon.

5. Оптимизация и best practices

В процессе работы я выработал несколько важных практик:

  • Минимизация overhead: Сбор метрик должен минимально impactить на производительность. Я использовал атомарные операции и избегал блокировок в критических секциях.
  • Семантическое naming: Имена метрик соответствовали конвенциям Prometheus (snake_case, четкие единицы измерения).
  • Контроль granularity: Гистограммы и суммарии настроены с правильными bucket'ами для конкретных диапазонов значений.
  • Контекстуализация метрик: Метрики включали labels для фильтрации по различным критериям (версия приложения, регион, тип пользователя).
  • Автоматизация алертинга: Метрики интегрировались с Alertmanager для автоматического обнаружения проблем.

6. Инфраструктурная интеграция

Сбор метрик был частью более широкой инфраструктуры мониторинга:

  • CI/CD интеграция: Метрики сборки и деплоя также собирались и анализировались.
  • Логирование и трассировка: Метрики коррелировались с логами (через ELK Stack) и трассировкой (через Jaeger или OpenTelemetry).
  • Dashboard'ы в Grafana: Все метрики визуализировались в динамических dashboard'ах для разных stakeholder'ов.

Таким образом, сбор метрик в Go-проектах был не просто технической задачей, а стратегическим компонентом, обеспечивающим наблюдаемость системы, быстрое обнаружение проблем и data-driven оптимизацию производительности и бизнес-процессов.