Как настроить экспорт метрик из приложения в Prometheus?

«Как настроить экспорт метрик из приложения в Prometheus?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы Prometheus мог собирать метрики, приложение должно предоставлять эндпоинт (обычно /metrics) с данными в текстовом формате Prometheus. Есть несколько основных подходов:

1. Инструментирование кода приложения (Instrumentation): Используйте клиентские библиотеки Prometheus для вашего стека. Они создают и обновляют метрики в памяти приложения.

Пример для Go-приложения:

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

var (
    requestsTotal = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests.",
        },
    )
)

func init() {
    prometheus.MustRegister(requestsTotal)
}

func main() {
    http.Handle("/metrics", promhttp.Handler())
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        requestsTotal.Inc()
        w.Write([]byte("Hello"))
    })
    http.ListenAndServe(":8080", nil)
}

2. Использование экспортеров (Exporters): Для сторонних систем (базы данных, веб-серверы, оборудование), код которых нельзя изменить, используются экспортеры. Например, node_exporter для системных метрик сервера.

3. Pushgateway для кратковременных задач: Для задач типа cron-job или batch-процессов, которые живут недолго, метрики можно отправлять в Pushgateway, откуда их уже заберет Prometheus.

echo "my_metric 3.14" | curl --data-binary @- http://pushgateway:9091/metrics/job/my_job

4. Конфигурация Prometheus: В prometheus.yml нужно добавить scrape_configs для обнаружения целей (targets) вашего приложения.

scrape_configs:
  - job_name: 'my-app'
    static_configs:
      - targets: ['app-host:8080']
    metrics_path: '/metrics'

Ключевые практики:

  • Используйте осмысленные имена метрик (латинские буквы, нижние подчеркивания).
  • Добавляйте labels для детализации (например, path, method, status_code для HTTP-запросов).
  • Выносите порт метрик отдельно от основного API приложения.