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: Также в библиотеке
Авторизация и аутентификация в Java: Spring Security и JWT
Event Bus и паттерн Observer в PHP: реализация и примеры
Работа с Markdown в C++: библиотеки, парсеры и инструменты