Ответ
Важно понимать, что Grafana — это инструмент для визуализации, она не собирает и не хранит метрики. Она запрашивает данные из специализированных систем хранения, таких как Prometheus.
Жизненный цикл метрик выглядит так:
1. Инструментация (Instrumentation)
Код приложения дорабатывается для сбора и предоставления метрик. В Go для этого используется библиотека prometheus/client_golang
. Приложение открывает HTTP-эндпоинт (обычно /metrics
), по которому отдает текущие значения метрик в текстовом формате.
Пример создания счетчика запросов в Go:
import "github.com/prometheus/client_golang/prometheus"
var httpRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
},
[]string{"method", "path"},
)
func init() {
prometheus.MustRegister(httpRequestsTotal)
}
// В обработчике запроса:
httpRequestsTotal.WithLabelValues("GET", "/api/users").Inc()
2. Сбор (Scraping)
Сервер Prometheus периодически опрашивает (делает scrape) эндпоинт /metrics
вашего приложения и сохраняет полученные данные в свою базу данных временных рядов (TSDB).
Конфигурация Prometheus для сбора метрик:
# prometheus.yml
scrape_configs:
- job_name: 'my-go-app'
static_configs:
- targets: ['my-app-instance:8080'] # Адрес вашего приложения
3. Хранение (Storage)
Prometheus хранит метрики в своей высокоэффективной TSDB. Данные хранятся в виде временных рядов: имя_метрики{лейблы} -> [(timestamp1, value1), (timestamp2, value2), ...]
.
4. Визуализация (Visualization)
В Grafana вы настраиваете Prometheus как источник данных (Data Source). Затем вы создаете дашборды и панели, где пишете запросы на языке PromQL (Prometheus Query Language). Grafana отправляет эти запросы в Prometheus, получает данные и отрисовывает графики.
Итоговая схема:
Приложение (Go) -> [Scrape] -> Prometheus (Storage) -> [Query] -> Grafana (Visualization)