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

Ответ

Prometheus — это система мониторинга и алертинга с открытым исходным кодом, ставшая стандартом в экосистеме Cloud Native. Она работает по pull-модели: периодически опрашивает (scrapes) HTTP-эндпоинты, которые предоставляют метрики в специальном формате.

Основные компоненты:

  1. Prometheus Server: Ядро системы. Собирает (scrapes), хранит метрики во встроенной временной базе данных (TSDB) и выполняет запросы.
  2. Exporters (Экспортеры): Сторонние сервисы, которые преобразуют метрики из существующих систем (например, базы данных, ОС) в формат Prometheus. Пример: node_exporter для метрик хоста.
  3. Client Libraries: Библиотеки для инструментирования кода приложения, чтобы оно само отдавало метрики. Для Go это prometheus/client_golang.
  4. Alertmanager: Обрабатывает алерты, сгенерированные Prometheus. Управляет их дедупликацией, группировкой и отправкой в различные системы уведомлений (Slack, PagerDuty и т.д.).
  5. Pushgateway: Позволяет кратковременным задачам (batch jobs), которые не могут быть опрошены, отправлять свои метрики в Prometheus.

Использование в Go:

Для мониторинга Go-приложения нужно:

  1. Подключить библиотеку prometheus/client_golang.
  2. Определить метрики (Counter, Gauge, Histogram, Summary).
  3. Зарегистрировать их в глобальном реестре.
  4. Создать HTTP-обработчик /metrics с помощью promhttp.Handler().

Пример кода:

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

var (
    // Counter - метрика, которая только увеличивается.
    httpRequestsTotal = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of http requests",
        },
        []string{"method", "path"}, // Метки (labels) для детализации
    )
)

func init() {
    // Регистрация метрики
    prometheus.MustRegister(httpRequestsTotal)
}

func main() {
    // Инструментируем основной обработчик
    http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path).Inc()
        w.Write([]byte("Hello, world!"))
    })

    // Отдаем метрики по эндпоинту /metrics
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

Запросы с помощью PromQL:

Prometheus использует мощный язык запросов PromQL. Например, чтобы посчитать среднюю скорость запросов за последние 5 минут, можно использовать запрос:
rate(http_requests_total{job="my-app"}[5m])