Prometheus метрики в Go: создание и экспорт метрик в Golang

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

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

Начать курс

Prometheus метрики в Go (Golang): полное руководство

Prometheus — это мощная система мониторинга и оповещения с открытым исходным кодом, ставшая де-факто стандартом в мире облачных приложений. Для языка Go (Golang) существует официальный клиент prometheus/client_golang, который позволяет легко добавлять метрики в ваше приложение. В этой статье мы подробно разберём, как установить библиотеку, создать основные типы метрик (counter, gauge, histogram) и экспортировать их через HTTP.

1. Установка библиотеки

Для работы с Prometheus в Go необходимо установить пакет prometheus/client_golang. Выполните команду:

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

Первый пакет содержит основные типы метрик, второй — HTTP-обработчик для экспорта метрик в формате, понятном Prometheus серверу.

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

Prometheus поддерживает четыре основных типа метрик. Рассмотрим три самых популярных:

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

3. Пример: Counter (счётчик запросов)

Создадим простой HTTP-сервер, который считает количество обработанных запросов:

package main

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

var (
    requestsTotal = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests.",
        },
    )
)

func init() {
    prometheus.MustRegister(requestsTotal)
}

func handler(w http.ResponseWriter, r *http.Request) {
    requestsTotal.Inc()
    fmt.Fprintf(w, "Hello, you are visitor #%d", requestsTotal)
}

func main() {
    http.HandleFunc("/", handler)
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

В этом примере:

  • prometheus.NewCounter создаёт счётчик с именем http_requests_total.
  • prometheus.MustRegister регистрирует метрику в глобальном реестре.
  • requestsTotal.Inc() увеличивает счётчик на 1 при каждом запросе.
  • promhttp.Handler() экспортирует все зарегистрированные метрики по адресу /metrics.

4. Пример: Gauge (активные соединения)

Gauge идеально подходит для отслеживания текущего состояния, например, количества активных горутин:

var (
    activeGoroutines = prometheus.NewGauge(
        prometheus.GaugeOpts{
            Name: "active_goroutines",
            Help: "Current number of active goroutines.",
        },
    )
)

func monitorGoroutines() {
    for {
        activeGoroutines.Set(float64(runtime.NumGoroutine()))
        time.Sleep(5 * time.Second)
    }
}

func main() {
    prometheus.MustRegister(activeGoroutines)
    go monitorGoroutines()
    // ... остальной код
}

Здесь Set() устанавливает текущее значение, а Inc() и Dec() позволяют увеличивать или уменьшать gauge на единицу.

5. Пример: Histogram (время ответа)

Histogram собирает наблюдения и распределяет их по настраиваемым сегментам (buckets):

var (
    requestDuration = prometheus.NewHistogram(
        prometheus.HistogramOpts{
            Name:    "http_request_duration_seconds",
            Help:    "Histogram of HTTP request durations.",
            Buckets: prometheus.DefBuckets, // [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]
        },
    )
)

func timingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        requestDuration.Observe(time.Since(start).Seconds())
    })
}

Метод Observe() добавляет наблюдение в гистограмму. Prometheus автоматически считает количество наблюдений в каждом bucket'е.

6. Продвинутые возможности: метки (labels)

Для более гибкой группировки метрик используйте метки. Например, разделим счётчик по HTTP-методам:

var (
    requestsByMethod = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name:                    

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