Что такое Прометей и зачем он вам нужен? Prometheus — это мощная система мониторинга, которая собирает и обрабатывает числовые данные (метрики) из приложений. Она помогает отслеживать ключевые показатели, такие как: Количество запросов, обработанных вашей службой. Время ответа на каждый запрос. Использование памяти и ЦП. Количество ошибок, возникающих в системе. Используя Prometheus, вы можете ответить на такие важные вопросы, как: «Эффективно ли работает моя служба?» «Каковы узкие места производительности?» «Нужно ли нам масштабировать нашу инфраструктуру?» И как Prometheus собирает метрики? Prometheus собирает данные двумя основными способами: – Prometheus активно запрашивает у сервисов их метрики. Модель вытягивания — сервисы передают свои метрики посреднику, которые затем собирает Prometheus. Push-модель (Pushgateway) Давайте разберем их. Модель вытягивания В Prometheus метрики из вашего приложения через HTTP (например, ). модели pull активно извлекает http://your-service:8080/metrics Это метод по умолчанию, который используется наиболее часто. Настройка Prometheus с Golang (модель Pull) Установите необходимые библиотеки: go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promhttp (например, подсчет HTTP-запросов): Определите свои метрики import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) var httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }) конечную точку : Предоставьте /metrics import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) } в : Настройте Prometheus для сбора метрик из вашего сервиса prometheus.yml scrape_configs: - job_name: "example_service" static_configs: - targets: ["localhost:8080"] Теперь Prometheus будет автоматически запрашивать каждые несколько секунд для сбора данных. http://localhost:8080/metrics Почему модель вытягивания предпочтительна? – Prometheus контролирует график и частоту сбора данных. Простота — нет необходимости в дополнительной службе для получения показателей. Меньше точек отказа . Если служба перестает отвечать, Prometheus просто прекращает прием данных, избегая устаревших показателей. Автоматическая очистка Push-модель (подход Pushgateway) В служба свои метрики в посредническую службу , которая хранит их до тех пор, пока Prometheus не получит их. модели push отправляет Pushgateway Как это работает (модель Push) Ваше приложение в Pushgateway: отправляет метрики import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" ) func main() { registry := prometheus.NewRegistry() jobCounter := prometheus.NewCounter(prometheus.CounterOpts{ Name: "job_execution_count", Help: "Number of executed jobs", }) registry.MustRegister(jobCounter) jobCounter.Inc() err := push.New("http://localhost:9090", "my_service_or_job"). Collector(jobCounter). Grouping("instance", "worker_1"). Push() if err != nil { panic(err) } } Настройте Prometheus для сбора данных с Pushgateway: scrape_configs: - job_name: "pushgateway" static_configs: - targets: ["localhost:9091"] Когда модель Push полезна? действительно , которые завершаются до того, как Prometheus успевает их обработать. Краткосрочные задания (пакетные задания, задания cron) , из-за которых Prometheus не может напрямую получить доступ к сервису. Сетевые ограничения (устройства IoT, внешние API), которые невозможно извлечь напрямую. Внешние источники данных Какую модель следует использовать? Метод Лучше всего подходит для... Плюсы Минусы Тянуть (рекомендуется) Веб-сервисы, API, долго работающие приложения Простая настройка, меньше зависимостей, автоматическая очистка Не подходит для очень краткосрочных задач. Push (Пушгейтвей) Пакетные задания, задачи без стабильного доступа к сети Позволяет передавать данные из краткосрочных заданий Устаревшие данные, дополнительная сложность, риск возникновения узких мест Почему модель Push не идеальна? Хотя решает некоторые проблемы (например, кратковременные процессы, которые завершаются до того, как Prometheus их очистит), он : Pushgateway создает несколько новых проблем Трудно управлять устаревшими данными Если сервис прекращает работу, его старые метрики остаются в Pushgateway. Prometheus не может узнать, работает ли еще служба. Необходимо вручную удалить устаревшие метрики с помощью или настроить политики истечения срока действия. push.Delete(...) Дополнительная сложность Вместо прямой ссылки теперь у вас есть . Service → Prometheus Service → Pushgateway → Prometheus Pushgateway — это дополнительная зависимость, увеличивающая расходы на обслуживание. Потенциальные узкие места Если множество сервисов часто отправляют метрики, Pushgateway может оказаться перегруженным. В отличие от прямых запросов Prometheus (которые распределяют нагрузку), все запросы попадают в один экземпляр Pushgateway. Проблемы с согласованностью данных Если несколько служб отправляют метрики с одинаковым именем, но разными значениями, данные могут быть перезаписаны, что приведет к неверным результатам. Заключение Prometheus — мощный и надежный инструмент для мониторинга сервисов. Для большинства приложений является наилучшим выбором — она проста, эффективна и обеспечивает свежие данные без дополнительной сложности. Однако, если вы работаете с такими как функции Lambda или пакетные задания, через Pushgateway может быть полезна для сбора метрик до завершения процесса. модель pull кратковременными процессами, модель push Выбор правильного подхода обеспечивает лучшую наблюдаемость и удобство обслуживания вашей системы. Заботиться!