Ответ
Для интеграции с Prometheus в Go используется официальная клиентская библиотека github.com/prometheus/client_golang
. Процесс состоит из трёх шагов:
- Определить и зарегистрировать метрики.
- Изменять значения метрик в коде приложения.
- Создать 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 как к источнику данных.