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

Ответ

Важно понимать, что Grafana — это инструмент для визуализации, а не для сбора или хранения метрик. Приложение отправляет метрики в систему хранения (например, Prometheus), а Grafana уже запрашивает данные оттуда для построения дашбордов.

Схема работы: Go-приложение -> Prometheus -> Grafana.

Шаг 1: Инструментирование Go-приложения

В код приложения нужно добавить HTTP-эндпоинт (обычно /metrics), который будет отдавать метрики в формате, понятном для Prometheus. Для этого используется официальная клиентская библиотека prometheus/client_golang.

package main

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

// Создаем метрику (счетчик) для отслеживания HTTP-запросов.
var httpRequestsTotal = promauto.NewCounterVec(
    prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests",
    },
    []string{"path"}, // Метка для разделения запросов по разным путям
)

// Middleware для инкремента счетчика
func metricsMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        httpRequestsTotal.With(prometheus.Labels{"path": r.URL.Path}).Inc()
        next.ServeHTTP(w, r)
    })
}

func main() {
    // Регистрируем эндпоинт /metrics
    http.Handle("/metrics", promhttp.Handler())

    // Оборачиваем наш основной обработчик в middleware
    finalHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })
    http.Handle("/", metricsMiddleware(finalHandler))

    // Запускаем сервер
    http.ListenAndServe(":8080", nil)
}

Шаг 2: Настройка Prometheus

Prometheus должен знать, откуда забирать (scrape) метрики. В его конфигурационный файл prometheus.yml нужно добавить job для нашего приложения.

scrape_configs:
  - job_name: 'my-go-app'
    # Интервал сбора метрик
    scrape_interval: 15s
    static_configs:
      # Указываем адрес, где приложение отдает метрики
      - targets: ['localhost:8080']

Шаг 3: Настройка Grafana

  1. Добавить источник данных: В настройках Grafana (Configuration -> Data Sources) добавьте новый источник данных типа Prometheus и укажите URL вашего сервера Prometheus.
  2. Создать дашборд: Создайте новый дашборд и добавьте панель.
  3. Написать запрос: В редакторе панели выберите ваш источник данных Prometheus и напишите запрос на языке PromQL. Например, чтобы отобразить скорость роста HTTP-запросов, можно использовать запрос:
    rate(http_requests_total[5m])

Таким образом, вы получите полный цикл сбора, хранения и визуализации метрик вашего Go-приложения.