Как настроить метрики на проекте

«Как настроить метрики на проекте» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Настройка метрик — ключевая часть мониторинга. Я обычно использую Prometheus для сбора и Grafana для визуализации. Вот пример настройки на Go (так как это типичный стек для DevOps), но принципы универсальны.

1. Интеграция Prometheus клиента:

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

// Определяем метрики
var (
    httpRequestsTotal = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests.",
        },
        []string{"method", "endpoint", "status"},
    )
    requestDuration = prometheus.NewHistogramVec(
        prometheus.HistogramOpts{
            Name: "http_request_duration_seconds",
            Help: "Duration of HTTP requests.",
            Buckets: prometheus.DefBuckets,
        },
        []string{"method", "endpoint"},
    )
)

func init() {
    prometheus.MustRegister(httpRequestsTotal, requestDuration)
}

2. Инструментирование кода приложения:

func myHandler(w http.ResponseWriter, r *http.Request) {
    timer := prometheus.NewTimer(requestDuration.WithLabelValues(r.Method, r.URL.Path))
    defer timer.ObserveDuration()

    // Логика обработчика...
    status := "200"
    httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, status).Inc()
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("OK"))
}

func main() {
    // Экспортируем метрики по /metrics
    http.Handle("/metrics", promhttp.Handler())
    http.HandleFunc("/", myHandler)
    http.ListenAndServe(":8080", nil)
}

3. Конфигурация Prometheus (prometheus.yml):

scrape_configs:
  - job_name: 'my_app'
    static_configs:
      - targets: ['app:8080']

4. Основные типы метрик:

  • Counter — монотонно растущий счетчик (запросы, ошибки).
  • Gauge — значение, которое может увеличиваться и уменьшаться (размер очереди, использование памяти).
  • Histogram/Summary — для измерения распределения значений (время ответа, размер пакета).

5. Продакшен-практики:

  • Используйте Service Discovery (Kubernetes, Consul) для динамического добавления целей.
  • Настройте AlertManager для алертинга на основе правил в PromQL.
  • Для краткосрочных задач (batch jobs) используйте PushGateway.
  • Храните долгосрочные данные в Thanos или Cortex для горизонтального масштабирования.