Как сделать так, чтобы клиенты отдавали метрики в Prometheus
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Отличный вопрос. Это фундаментальная задача для построения системы мониторинги. Чтобы клиенты (ваши приложения, сервисы, микросервисы, базы данных) отдавали метрики в 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).
Пошаговый алгоритм внедрения
- Определите тип клиента: Ваше приложение (→ библиотека) или сторонняя система (→ экспортер).
- Инструментируйте приложение: Добавьте клиентскую библиотеку, определите ключевые бизнес- и системные метрики (запросы, ошибки, длительность, объёмы данных).
- Предоставьте эндпоинт: Убедитесь, что
/metrics(или аналог) доступен и отдаёт данные. - Настройте доступность: Проверьте, что порт метрик открыт в сети (или для Prometheus), учтите вопросы безопасности (может потребоваться TLS, аутентификация).
- Настройте Service Discovery в Prometheus: Добавьте новую
jobв конфигурацию Prometheus, указав, как находить экземпляры вашего сервиса. - Верифицируйте сбор: Откройте UI Prometheus (
http://prometheus:9090/targets) и убедитесь, что ваши цели в состоянии UP и метрики видны в графана или через запросы.
Итог: Чтобы клиенты отдавали метрики в Prometheus, нужно сделать их доступными для опроса. Для этого инструментируйте код библиотекой, используйте экспортеры для чёрных ящиков и настройте Prometheus на обнаружение и сбор этих эндпоинтов. Pushgateway — это специальный инструмент для edge-cases, а не основной метод.