push gateway для работы с кратковременными процессами (когда сервис работает слишком мало времени, что бы Prometheus имел возможность выполнять к нему запросы для получения метрик)
exporters для сбора метрик из сторонних сервисом (и таких экспортёров — миллион, и имя им легион)
alertmanager — менеджер уведомлений (умеет Slack, почту и т.д.)
В целом архитектура самого Prometheus выглядит примерно так:
Сначала запустим Prometheus локально, в будущем — будем разворачивать и обновлять с помощью Ansbile, например — William-Yeh/ansible-prometheus(ну — по крайней мере так планируется на данный момент).
Запуск Prometheus
Запуск Docker контейнера — это хорошо, но посмотреть на Prometheus «изнутри» — нужно.
HELP go_gc_duration_seconds A summary of the GC invocation durations.
TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
go_gc_duration_seconds{quantile="1"} 0
go_gc_duration_seconds_sum 0
go_gc_duration_seconds_count 0
HELP go_goroutines Number of goroutines that currently exist.
Теперь — добавим их в Prometheus.
Редактируем prometheus.yml, добавляем новые таргеты:
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: 'example-random'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:8080', 'localhost:8081']
labels:
group: 'production'
- targets: ['localhost:8082']
labels:
group: 'canary'
Перезапускам Prometheus, проверяем:
Отлично!
Одна нода Down, т.к. конфиг копировал из документации, а ноды у себя запускал на портах 8081-8083. ОК, работает, идём дальше.
Фильтры и запросы Promeheus
Отфильтруем запросы в графиках.
Если перейти в графики и выбрать, например, go_gc_duration_seconds_count — будут отображены метрики от всех таргетов:
Еднственный момент — в группе production добавлено два таргета, а в графике выводится только один — потому что второй в Down.
Запускаем ещё один random таргет, проверяем снова:
./random -listen-address=:8080 &
Обновляем страницу:
Замечательно.
Exporters
Теперь для примера — добавим Node exporter, что бы промониторить ресурсы локального сервера (вообще-то — рабочего ноутбука, на котором сейчас запущен Prometheus).
INFO[0000] Listening on :9100 source="node_exporter.go:186"
Отдаёт — все замечательно.
Редактируем prometheus.yml, добавляем новый таргет:
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: 'example-random'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:8080', 'localhost:8081']
labels:
group: 'production'
- targets: ['localhost:8082']
labels:
group: 'canary'
- job_name: "node_local"
scrape_interval: "5s"
static_configs:
- targets: ['localhost:9100']
labels:
group: 'local'
Запускаем, проверяем таргеты:
Графики:
Всё работает.
Итоги
Prometheus потрогал первый раз. Весьма понравился как возможностями, так и удобством настройки и запуска.
Всё легко запускается в Docker, все настройки в файлах — отлично.
Далее — добавлю к нему Grafana, посмотрю на мониторинг уже Docker контейнеров, отдельных приложений (типа NodeJS) и начнём внедрять.