В данной статье я расскажу про установку и первоначальную настройка Prometheus + Alertmanager на CentOS 8.
Статей на эту тему в Интернет предостаточно, но как обычно в них есть опечатки, в результате чего некоторые вещи оказываются неработоспособными.
Исходные данные: CentOS 8.3
Задача: Установить Prometheus, Alertmanager и node_exporter, а так же произвести базовую настройку всех компонентов.
1. Первым делом на сервере должна быть настроена синхронизация времени по NTP
На самом деле на CentOS 8 при базовой установке для синхронизации времени ставится chronyd, нам лишь нужно убедиться, что он запущен и время синхронизируется:
# systemctl status chronyd ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-05-13 20:07:52 +05; 3h 4min ago Docs: man:chronyd(8) man:chrony.conf(5) Main PID: 782 (chronyd) Tasks: 1 (limit: 4930) Memory: 1.3M CGroup: /system.slice/chronyd.service └─782 /usr/sbin/chronyd
Смотрим текущий статус синхронизации часов:
timedatectl status
Результат:
Local time: Thu 2021-05-13 23:14:25 +05 Universal time: Thu 2021-05-13 18:14:25 UTC RTC time: Thu 2021-05-13 18:14:22 Time zone: Asia/Yekaterinburg (+05, +0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Мы видим, что все синхронно.
2. Теперь разберемся с настройкой firewall
Для работы всех компонентов нужно открыть несколько портов:
На CentOS 8 используется firewalld, поэтому откроем нужные порты используя firewall-cmd, вначале проверим активную зону:
# firewall-cmd --get-active-zones public interfaces: enp0s3
Теперь добавим в public-зону нужные порты:
firewall-cmd --permanent --zone=public --add-port=9090/tcp --add-port=9093/tcp --add-port=9094/{tcp,udp} --add-port=9100/tcp firewall-cmd --reload
Проверим настройки:
# firewall-cmd --permanent --zone=public --list-all public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: 9090/tcp 9093/tcp 9094/tcp 9094/udp 9100/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
3. Далее нам нужно проверить SELinux и отключить его
Конечно это не самый правильный вариант, но практика показывает, что для серверов в локальной сети это вполне допустимо.
Проверим включен ли SELinux:
getenforce
Результат:
Enforcing
То есть SELinux включен. Отключаем:
setenforce 0
И внесем правки в файл настроек, чтобы при рестарте сервера он отключился:
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
4. Теперь пришло время установить Prometheus
Тут нас ждет множество шагов т.к. у Prometheus нет репозитария пакетов и все придется делать руками — это скачать архив с бинарниками, создать пользователя, создать нужные каталоги и unit-файл для systemd и прочее.
Идем на официальную страницу и копируем ссылку на архив tar.gz для Linux архитектуры amd64.
На текущий момент доступна версия 2.28 и нам нужен файл prometheus-2.28.0.linux-amd64.tar.gz
wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz
Далее я приведу набор команд для создания пользователя от имени которого будет работать сервис, создание вспомогательных каталогов, распаковка скачанного архива, копированию бинарных файлов в нужные каталоги и прочее. Все эти команды нужно выполнить под пользователем root.
useradd --no-create-home --shell /bin/bash prometheus usermod --home /var/lib/prometheus prometheus mkdir /etc/prometheus mkdir /var/lib/prometheus tar -zxf prometheus-*.linux-amd64.tar.gz cd prometheus-*.linux-amd64 yes | cp prometheus promtool /usr/local/bin/ cp -r console_libraries consoles prometheus.yml /etc/prometheus chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus chown prometheus:prometheus /usr/local/bin/{prometheus,promtool} echo "PROMETHEUS_OPTS=\"--storage.tsdb.retention.time=7d --storage.tsdb.retention.size=50GB\"" > /etc/default/prometheus chown prometheus:prometheus /etc/default/prometheus cd ~
Обратите внимание файл /etc/default/prometheus с опциями —storage.tsdb.retention.time и —storage.tsdb.retention.size. Первая опция говорит, что нужно удалять старые данные старше 7 дней, а вторая задает удаление по размеру хранимых данных. Я задал 7 дней или 50 Гигабайт. Вам нужно выставить свои значения. Более подробно об этих настройках можно прочитать в официальной документации.
Теперь попробуем запустить Prometheus в консоле (интерактивно):
su - prometheus -c "/usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries"
В консоле вы должны увидеть запуск Prometheus примерно с таким выводом:
level=info ts=2021-05-13T18:52:23.621Z caller=main.go:388 msg="No time or size retention was set so using the default time retention" duration=15d level=info ts=2021-05-13T18:52:23.621Z caller=main.go:426 msg="Starting Prometheus" version="(version=2.28.0, branch=HEAD, revision=ff58416a0b0224bab1f38f949f7d7c2a0f658940)" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:431 build_context="(go=go1.16.5, user=root@32b9079a2740, date=20210621-15:45:36)" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:432 host_details="(Linux 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 centos8.localdomain (none))" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:433 fd_limits="(soft=1024, hard=262144)" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:434 vm_limits="(soft=unlimited, hard=unlimited)" level=info ts=2021-05-13T18:52:23.622Z caller=web.go:540 component=web msg="Start listening for connections" address=0.0.0.0:9090 level=info ts=2021-05-13T18:52:23.624Z caller=main.go:803 msg="Starting TSDB ..." level=info ts=2021-05-13T18:52:23.628Z caller=head.go:741 component=tsdb msg="Replaying on-disk memory mappable chunks if any" level=info ts=2021-05-13T18:52:23.628Z caller=head.go:755 component=tsdb msg="On-disk memory mappable chunks replay completed" duration=2.735µs level=info ts=2021-05-13T18:52:23.628Z caller=head.go:761 component=tsdb msg="Replaying WAL, this may take a while" level=info ts=2021-05-13T18:52:23.632Z caller=tls_config.go:191 component=web msg="TLS is disabled." http2=false level=info ts=2021-05-13T18:52:23.632Z caller=head.go:813 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0 level=info ts=2021-05-13T18:52:23.632Z caller=head.go:818 component=tsdb msg="WAL replay completed" checkpoint_replay_duration=26.835µs wal_replay_duration=4.47535ms total_replay_duration=4.526302ms level=info ts=2021-05-13T18:52:23.636Z caller=main.go:828 fs_type=XFS_SUPER_MAGIC level=info ts=2021-05-13T18:52:23.636Z caller=main.go:831 msg="TSDB started" level=info ts=2021-05-13T18:52:23.636Z caller=main.go:957 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml level=info ts=2021-05-13T18:52:23.780Z caller=main.go:988 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=144.524274ms remote_storage=2.175µs web_handler=342ns query_engine=1.032µs scrape=143.965324ms scrape_sd=78.146µs notify=19.165µs notify_sd=12.808µs rules=1.004µs level=info ts=2021-05-13T18:52:23.780Z caller=main.go:775 msg="Server is ready to receive web requests."
Строка «Server is ready to receive web requests.» говорит, что все успешно запустилось и можно открыть Web-браузер по адресу http://IP-адрес-сервера:9090
Теперь нажимаем Ctrl+C для остановки процесса и настроим автозапуск Prometheus.
Для начала поменяем shell у пользователя prometheus, ведь теперь он ему не нужен:
usermod --shell /bin/false prometheus
Теперь создадим unit-фaйл для systemd:
cat << EOF > /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Service After=network.target [Service] EnvironmentFile=-/etc/default/prometheus User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \\ --config.file /etc/prometheus/prometheus.yml \\ --storage.tsdb.path /var/lib/prometheus \\ --web.console.templates=/etc/prometheus/consoles \\ --web.console.libraries=/etc/prometheus/console_libraries \\ \$PROMETHEUS_OPTS ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF
Перезагрузим конфигурацию systemd и запустим Prometheus:
systemctl daemon-reload systemctl enable --now prometheus
Проверим факт запуска:
# systemctl status prometheus ● prometheus.service - Prometheus Service Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2021-05-16 21:13:18 +05; 4min 10s ago Main PID: 7925 (prometheus) Tasks: 7 (limit: 4956) Memory: 53.1M CGroup: /system.slice/prometheus.service └─7925 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries >
# netstat -ltupn | grep prometheus tcp6 0 0 :::9090 :::* LISTEN 39210/prometheus
5. Теперь пришло время установить Alertmanager
И опять нас ждет множество шагов. Я постараюсь писать уже не так подробно, ведь действия будут схожи с установкой Prometheus.
wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz useradd --no-create-home --shell /bin/false alertmanager usermod --home /var/lib/alertmanager alertmanager mkdir /etc/alertmanager mkdir /var/lib/alertmanager tar -zxf alertmanager-*.linux-amd64.tar.gz cd alertmanager-*.linux-amd64 yes | cp alertmanager amtool /usr/local/bin/ cp alertmanager.yml /etc/alertmanager chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool} cd ~ cat << EOF > /etc/systemd/system/alertmanager.service [Unit] Description=Alertmanager Service After=network.target [Service] EnvironmentFile=-/etc/default/alertmanager User=alertmanager Group=alertmanager Type=simple ExecStart=/usr/local/bin/alertmanager \\ --config.file=/etc/alertmanager/alertmanager.yml \\ --storage.path=/var/lib/alertmanager \\ \$ALERTMANAGER_OPTS ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF echo "ALERTMANAGER_OPTS=\"\"" > /etc/default/alertmanager chown alertmanager:alertmanager /etc/default/alertmanager systemctl daemon-reload systemctl enable --now alertmanager
После этих действий у нас должен запуститься Alertmanager в виде службы, проверим:
# systemctl status alertmanager ● alertmanager.service - Alertmanager Service Loaded: loaded (/etc/systemd/system/alertmanager.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2021-05-14 00:29:24 +05; 8s ago Main PID: 39473 (alertmanager) Tasks: 6 (limit: 4930) Memory: 10.6M CGroup: /system.slice/alertmanager.service └─39473 /usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/prometheus/alertmanager
# netstat -ltupn | grep alertmanager tcp6 0 0 :::9093 :::* LISTEN 39473/alertmanager tcp6 0 0 :::9094 :::* LISTEN 39473/alertmanager udp6 0 0 :::9094 :::* 39473/alertmanager
Открываем Web-браузер по адресу http://IP-адрес-сервера:9093 и перед нами должна появиться консоль Alertmanager
6. Далее нам нужно установить node_exporter
node_exporter — это уже сборщик метрик с операционной системы, его можно установить на все сервера в компании и настроить Prometheus на сбор данных с этого экспортера.
Если Вы будите устанавливать node_exporter на другие сервера, то необходимо открыть порт 9100/tcp, чтобы Prometheus смог подключиться к node_exporter.
Я так же постараюсь быть кратким и приведу лишь набор необходимых для установки команд и немного комментариев.
wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz useradd --no-create-home --shell /bin/false nodeusr tar -zxf node_exporter-*.linux-amd64.tar.gz cd node_exporter-*.linux-amd64 cp node_exporter /usr/local/bin/ chown nodeusr:nodeusr /usr/local/bin/node_exporter cd ~ cat << EOF > /etc/systemd/system/node_exporter.service [Unit] Description=Node Exporter Service After=network.target [Service] EnvironmentFile=-/etc/default/node_exporter User=nodeusr Group=nodeusr Type=simple ExecStart=/usr/local/bin/node_exporter \$NODE_EXPORTER_OPTS ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF echo "NODE_EXPORTER_OPTS=\"\"" > /etc/default/node_exporter chown nodeusr:nodeusr /etc/default/node_exporter systemctl daemon-reload systemctl enable --now node_exporter
После этих действий у нас должен запуститься node_exporter в виде службы, проверим:
# systemctl status node_exporter ● node_exporter.service - Node Exporter Service Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2021-05-16 21:22:06 +05; 706ms ago Main PID: 8055 (node_exporter) Tasks: 3 (limit: 4956) Memory: 8.6M CGroup: /system.slice/node_exporter.service └─8055 /usr/local/bin/node_exporter
# netstat -ltupn | grep node_exporter tcp6 0 0 :::9100 :::* LISTEN 39693/node_exporter
Открываем Web-браузер по адресу http://IP-адрес-сервера:9100/metrics и перед нами должны появиться метрики, собранные node_exporter
6. Теперь настроим сбор метрик с node_exporter в Prometheus
Открываем файл конфигураций Prometheus — /etc/prometheus/prometheus.yml и в разделе scrape_configs добавляем job_name: ‘node_exporter_clients’ с нашими серверами:
... scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['192.168.10.10:9090'] - job_name: 'node_exporter_clients' scrape_interval: 60s static_configs: - targets: ['192.168.10.11:9100','192.168.10.12:9100','192.168.10.13:9100']
Это кусочек моего конфига с моими IP адресами, у Вас же они будут свои.
Скажу лишь, что job_name: ‘prometheus’ с адресом 192.168.10.10:9090 — это сам сервер с Prometheus
Ниже идет job_name: ‘node_exporter_clients’ у которого в targets перечислен список серверов с установленным node_exporter.
Для применения настроек нужно перезапустить Prometheus:
systemctl restart prometheus
После этого в Web-интерфейсе Prometheus в разделе Status -> Targets мы сможем увидеть наши сервера:
7. Теперь настроим в Prometheus алармы
Создадим простой файл с правилом:
cat << EOF > /etc/prometheus/alert_rules.yml groups: - name: alert.rules rules: - alert: InstanceDown expr: up == 0 for: 1m labels: severity: critical annotations: description: '{{ \$labels.instance }} of job {{ \$labels.job }} has been down for more than 1 minute.' summary: Instance {{ \$labels.instance }} down EOF
Проверим наше правило на корректность с помощью promtool:
/usr/local/bin/promtool check rules /etc/prometheus/alert_rules.yml
Результат:
Checking /etc/prometheus/alert_rules.yml SUCCESS: 1 rules found
Все корректно, двигаемся дальше.
Далее подключим правило в конфигурацию Prometheus, в файле /etc/prometheus/prometheus.yml в секции rule_files: добавьте
... rule_files: # - "first_rules.yml" # - "second_rules.yml" - "alert_rules.yml" ...
Перезапустим Prometheus:
systemctl restart prometheus
Наше правило появилось в разделе Status -> Rules
Так же мы можем увидеть его на странице Alerts
Теперь остановим на одном сервере node_exporter и посмотрим состояние аларма:
8. И последнее, что мы настроим — это отправку аларма на почту (email)
Для этого нам потребуется немного настроить Alertmanager.
Откроем файл /etc/alertmanager/alertmanager.yml и добавим несколько настроек.
В секцию global добавим настройку smtp_from (если данной секции нет, то создайте ее):
global: smtp_from: [email protected] ...
Таким образом мы будем отправлять сообщения от имени [email protected] (у Вас будет другой email).
Далее секцию route приведем к виду:
... route: group_by: ['alertname', 'instance', 'severity'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook' routes: - receiver: send_email match: alertname: InstanceDown ...
Мы добавили маршрут, который принимает событие InstanceDown и запускает ресивер send_email
Напомню, что имя события InstanceDown было описано выше в файле /etc/prometheus/alert_rules.yml
Далее добавим в конфиг еще один ресивер (send_email) с описанием почтового сервера через который будем отправлять алармы (я буду отправлять через почту для домена на yandex.ru):
receivers: ... - name: send_email email_configs: - to: [email protected] send_resolved: true smarthost: smtp.yandex.ru:587 auth_username: [email protected] auth_password: XXXXXXXXX require_tls: true
Мы будем отправлять алармы на ящик [email protected]
Перезапустим Alertmanager:
systemctl restart alertmanager
Теперь нам нужно настроить связку Prometheus с Alertmanager, для этого открываем конфигурационный файл Prometheus — /etc/prometheus/prometheus.yml
Приведем секцию alerting к виду:
alerting: alertmanagers: - static_configs: - targets: - 127.0.0.1:9093
Перезапустим Prometheus:
systemctl restart prometheus
Через некоторое время в Alertmanager появится наш алерт:
И мы получим на почту сообщение примерно как на скрине ниже:
На этом все, в следующей статье про Prometheus и Alertmanager мы научимся осуществлять мониторинг нагрузки на CPU, использование RAM и диска, а так же попробуем настроить мониторинг Linux-служб на примере nginx.
Если у Вас возникли вопросы или Вы хотите, чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.
Cпасибо, очень помогла Ваша статья!