← Назад к вопросам

Как сделать так, чтобы клиенты отдавали метрики в Prometheus

2.0 Middle🔥 221 комментариев
#Мониторинг и логирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отличный вопрос. Это фундаментальная задача для построения системы мониторинги. Чтобы клиенты (ваши приложения, сервисы, микросервисы, базы данных) отдавали метрики в Prometheus, существует несколько ключевых паттернов, которые выбираются в зависимости от типа клиента, среды исполнения и требований к архитектуре.

Основной принцип Prometheus — pull-модель. Это значит, что Prometheus-сервер сам периодически опрашивает (scrapes) целевые эндпоинты (targets) для сбора метрик. Задача клиента — предоставить HTTP-эндпоинт в определённом формате (обычно /metrics), отдающий метрики в текстовом формате Prometheus Exposition Format. Клиент не отправляет данные, а лишь отдаёт их по запросу.

Вот основные стратегии и способы их реализации.

1. Использование готовых клиентских библиотек (наиболее распространённый способ)

Это предпочтительный метод для собственных приложений (микросервисов). Библиотеки берут на себя всю работу по созданию HTTP-сервера или эндпоинта, регистрации и обновлению метрик, их форматированию.

  • Для Java (Spring Boot): Используется Micrometer. Он является фасадом для различных систем мониторинга и имеет модуль micrometer-registry-prometheus.
    # application.yml
    management:
      endpoints:
        web:
          exposure:
            include: health, info, prometheus
      metrics:
        export:
          prometheus:
            enabled: true
    
    Spring Boot автоматически создаст эндпоинт `/actuator/prometheus`.

  • Для Python: Используются библиотеки prometheus-client или starlette-prometheus для ASGI.

    from prometheus_client import start_http_server, Counter
    
    REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP Requests')
    
    # В обработчике запроса
    REQUEST_COUNT.inc()
    
    # Запуск HTTP-сервера на порту 8000 для отдачи метрик
    start_http_server(8000)
    
  • Для Go: Официальная библиотека github.com/prometheus/client_golang.

    package main
    
    import (
        "net/http"
        "github.com/prometheus/client_golang/prometheus/promhttp"
    )
    
    func main() {
        // Регистрируем стандартные метрики Go и процесса
        // ... ваша логика и кастомные метрики ...
    
        // Отдаём метрики по адресу /metrics
        http.Handle("/metrics", promhttp.Handler())
        http.ListenAndServe(":8080", nil)
    }
    
  • Для Node.js: Библиотека prom-client.

    const client = require('prom-client');
    const express = require('express');
    const app = express();
    
    const counter = new client.Counter({
      name: 'my_request_total',
      help: 'Total number of requests'
    });
    
    app.get('/', (req, res) => {
      counter.inc();
      res.send('Hello!');
    });
    
    // Эндпоинт для Prometheus
    app.get('/metrics', async (req, res) => {
      res.set('Content-Type', client.register.contentType);
      res.end(await client.register.metrics());
    });
    
    app.listen(3000);
    

2. Использование экспортеров (Exporters)

Этот способ используется для мониторинга сторонних систем, в которые невозможно встроить библиотеку (базы данных, оборудование, системные сервисы). Экспортер — это отдельное приложение, которое «переводит» внутренние метрики системы в понятный Prometheus формат.

  • Системные метрики: node_exporter для мониторинки сервера (CPU, память, диск, сеть).
  • Базы данных: mysqld_exporter, postgres_exporter, mongodb_exporter.
  • Очереди сообщений: kafka_exporter, rabbitmq_exporter.
  • HTTP-серверы: nginx-prometheus-exporter, apache_exporter.

Экспортер запускается на том же хосте или рядом с целевой системой, опрашивает её (например, через SQL-запросы или API) и предоставляет свой эндпоинт /metrics. Prometheus настраивается на сбор метрик с этого экспортера.

3. Pushgateway для краткосрочных задач

Это исключение из pull-модели. Pushgateway используется для метрик от кратковременных задач (Cron jobs, batch-процессы, лямбда-функции), которые живут недостаточно долго, чтобы Prometheus успел их опросить.

  • Задача по окончании работы отправляет (pushes) свои итоговые метрики в Pushgateway.
  • Pushgateway сохраняет их.
  • Prometheus продолжает опрашивать Pushgateway как обычную цель.
    # Пример отправки метрики из bash-скрипта
    echo "my_job_duration_seconds 42.5" | curl --data-binary @- http://pushgateway:9091/metrics/job/my_batch_job
    
    **Важно:** Pushgateway не предназначен для метрик долгоживущих сервисов, это нарушает принципы отказоустойчивости и обнаружения сервисов Prometheus.

4. Service Discovery: Как Prometheus узнаёт о клиентах

После того как клиент предоставляет эндпоинт, Prometheus должен узнать о его существовании. Это делается через обнаружение сервисов (Service Discovery).

  • Статическая конфигурация (static_configs): Жёстко прописать цели в prometheus.yml. Подходит для небольшого фиксированного числа сервисов.

    scrape_configs:
      - job_name: 'my_app'
        static_configs:
          - targets: ['app1:8080', 'app2:8080']
    
  • Динамическое обнаружение: Ключевая фишка для микросервисных сред.

    *   **Kubernetes:** Prometheus автоматически находит все Pod'ы, Service'ы, Endpoints через Kubernetes API (`kubernetes_sd_configs`).
    *   **Consul, Eureka, etcd:** Обнаружение через системы регистрации сервисов.
    *   **Файловое обнаружение:** Цели обновляются через JSON или YAML файлы, что можно интегрировать с инфраструктурными инструментами (Ansible, Terraform).

Пошаговый алгоритм внедрения

  1. Определите тип клиента: Ваше приложение (→ библиотека) или сторонняя система (→ экспортер).
  2. Инструментируйте приложение: Добавьте клиентскую библиотеку, определите ключевые бизнес- и системные метрики (запросы, ошибки, длительность, объёмы данных).
  3. Предоставьте эндпоинт: Убедитесь, что /metrics (или аналог) доступен и отдаёт данные.
  4. Настройте доступность: Проверьте, что порт метрик открыт в сети (или для Prometheus), учтите вопросы безопасности (может потребоваться TLS, аутентификация).
  5. Настройте Service Discovery в Prometheus: Добавьте новую job в конфигурацию Prometheus, указав, как находить экземпляры вашего сервиса.
  6. Верифицируйте сбор: Откройте UI Prometheus (http://prometheus:9090/targets) и убедитесь, что ваши цели в состоянии UP и метрики видны в графана или через запросы.

Итог: Чтобы клиенты отдавали метрики в Prometheus, нужно сделать их доступными для опроса. Для этого инструментируйте код библиотекой, используйте экспортеры для чёрных ящиков и настройте Prometheus на обнаружение и сбор этих эндпоинтов. Pushgateway — это специальный инструмент для edge-cases, а не основной метод.