Опишите жизненный цикл метрик в системе мониторинга (на примере Prometheus и Grafana)

Ответ

Важно понимать, что 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)