Ответ
Prometheus — это система мониторинга и алертинга с открытым исходным кодом, ставшая стандартом в экосистеме Cloud Native. Она работает по pull-модели: периодически опрашивает (scrapes) HTTP-эндпоинты, которые предоставляют метрики в специальном формате.
Основные компоненты:
- Prometheus Server: Ядро системы. Собирает (scrapes), хранит метрики во встроенной временной базе данных (TSDB) и выполняет запросы.
- Exporters (Экспортеры): Сторонние сервисы, которые преобразуют метрики из существующих систем (например, базы данных, ОС) в формат Prometheus. Пример:
node_exporter
для метрик хоста. - Client Libraries: Библиотеки для инструментирования кода приложения, чтобы оно само отдавало метрики. Для Go это
prometheus/client_golang
. - Alertmanager: Обрабатывает алерты, сгенерированные Prometheus. Управляет их дедупликацией, группировкой и отправкой в различные системы уведомлений (Slack, PagerDuty и т.д.).
- Pushgateway: Позволяет кратковременным задачам (batch jobs), которые не могут быть опрошены, отправлять свои метрики в Prometheus.
Использование в Go:
Для мониторинга Go-приложения нужно:
- Подключить библиотеку
prometheus/client_golang
. - Определить метрики (Counter, Gauge, Histogram, Summary).
- Зарегистрировать их в глобальном реестре.
- Создать 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])