Как в Go-приложении организовать сбор и экспорт метрик для Prometheus?

Ответ

Для интеграции с Prometheus в Go используется официальная клиентская библиотека github.com/prometheus/client_golang. Процесс состоит из трёх шагов:

  1. Определить и зарегистрировать метрики.
  2. Изменять значения метрик в коде приложения.
  3. Создать HTTP-эндпоинт (/metrics), который будет отдавать метрики в нужном формате.

В Prometheus есть 4 основных типа метрик:

  • Counter: Монотонно растущий счётчик (например, количество обработанных запросов).
  • Gauge: Значение, которое может как увеличиваться, так и уменьшаться (например, количество активных горутин).
  • Histogram: Распределение значений по бакетам (например, время ответа на запрос).
  • Summary: Квантили распределения (например, 99-й перцентиль времени ответа).

Пример реализации:

package main

import (
    "fmt"
    "net/http"
    "time"

    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promauto"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

// 1. Определяем и регистрируем метрику типа Counter.
// promauto автоматически регистрирует метрику в default-реестре.
var httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{
    Name: "myapp_http_requests_total",
    Help: "Total number of http requests handled",
})

// Пример обработчика, который инкрементирует счётчик
func myHandler(w http.ResponseWriter, r *http.Request) {
    // 2. Инкрементируем метрику при каждом вызове
    httpRequestsTotal.Inc()
    fmt.Fprintf(w, "Hello, you are the %d-th visitor!", int(httpRequestsTotal.Value))
}

func main() {
    http.HandleFunc("/", myHandler)

    // 3. Создаём эндпоинт /metrics для Prometheus
    http.Handle("/metrics", promhttp.Handler())

    fmt.Println("Starting server at :8080")
    fmt.Println("Metrics available at http://localhost:8080/metrics")
    http.ListenAndServe(":8080", nil)
}

После запуска этого кода метрики будут доступны по адресу http://localhost:8080/metrics. Далее Prometheus настраивается на сбор данных с этого эндпоинта, а для визуализации используется Grafana, подключённая к Prometheus как к источнику данных.