1.Prometheus - Установка + Alertmanager + node_exporter

Thank you for reading this post, don't forget to subscribe!

Prometheus
Alertmanager
node_exporter

 

Prometheus — систе­ма мони­то­рин­га, обла­да­ю­щая воз­мож­но­стя­ми тон­кой настрой­ки мет­рик. Она будет полез­на для отсле­жи­ва­ния состо­я­ния рабо­ты сер­ви­сов на низ­ком уровне.

Подготовка сервера

Настро­им неко­то­рые пара­мет­ры сер­ве­ра, необ­хо­ди­мые для пра­виль­но рабо­ты системы.

Время

Для отоб­ра­же­ния собы­тий в пра­виль­ное вре­мя, необ­хо­ди­мо настро­ить его син­хро­ни­за­цию. Для это­го уста­но­вим chrony:

а) если на систе­ме CentOS / Red Hat:

yum install chrony

systemctl enable chronyd

systemctl start chronyd

Брандмауэр

На фаер­во­ле, при его исполь­зо­ва­нии, необ­хо­ди­мо открыть порты:

  • TCP 9090 — http для сер­ве­ра прометеус.
  • TCP 9093 — http для алерт менеджера.
  • TCP и UDP 9094 — для алерт менеджера.
  • TCP 9100 — для node_exporter.

а) с помо­щью firewalld:

firewall-cmd --permanent --add-port=9090/tcp --add-port=9093/tcp --add-port=9094/{tcp,udp} --add-port=9100/tcp

firewall-cmd --reload

б) с помо­щью iptables:

iptables -I INPUT 1 -p tcp --match multiport --dports 9090,9093,9094,9100 -j ACCEPT

iptables -A INPUT -p udp --dport 9094 -j ACCEPT

в) с помо­щью ufw:

ufw allow 9090,9093,9094,9100/tcp

ufw allow 9094/udp

ufw reload

SELinux

По умол­ча­нию, SELinux рабо­та­ет в опе­ра­ци­он­ный систе­мах на базе Red Hat. Про­ве­ря­ем, рабо­та­ет ли она в нашей системе:

getenforce

Если мы полу­ча­ем в ответ:

Enforcing

… необ­хо­ди­мо отклю­чить его командами:

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

* если же мы полу­чим ответ The program 'getenforce' is currently not installed, то SELinux не уста­нов­лен в системе.

Prometheus

Prometheus не уста­нав­ли­ва­ет­ся из репо­зи­то­рия и име­ет, отно­си­тель­но, слож­ный про­цесс уста­нов­ки. Необ­хо­ди­мо ска­чать исход­ник, создать поль­зо­ва­те­ля, вруч­ную ско­пи­ро­вать нуж­ные фай­лы, назна­чить пра­ва и создать юнит для автозапуска.

Загрузка

Пере­хо­дим на офи­ци­аль­ную стра­ни­цу загруз­ки и копи­ру­ем ссыл­ку на пакет для Linux:

… и исполь­зу­ем ее для загруз­ки паке­та на Linux:

wget https://github.com/prometheus/prometheus/releases/download/v2.20.1/prometheus-2.20.1.linux-amd64.tar.gz

* если систе­ма вер­нет ошиб­ку, необ­хо­ди­мо уста­но­вить пакет wget.

Установка (копирование файлов)

После того, как мы ска­ча­ли архив prometheus, необ­хо­ди­мо его рас­па­ко­вать и ско­пи­ро­вать содер­жи­мое по раз­ным каталогам.

Для нача­ла созда­ем ката­ло­ги, в кото­рые ско­пи­ру­ем фай­лы для prometheus:

mkdir /etc/prometheus

mkdir /var/lib/prometheus

Рас­па­ку­ем наш архив:

tar zxvf prometheus-*.linux-amd64.tar.gz

… и перей­дем в ката­лог с рас­па­ко­ван­ны­ми файлами:

cd prometheus-*.linux-amd64

Рас­пре­де­ля­ем фай­лы по каталогам:

cp prometheus promtool /usr/local/bin/

cp -r console_libraries consoles prometheus.yml /etc/prometheus

Назначение прав

Созда­ем поль­зо­ва­те­ля, от кото­ро­го будем запус­кать систе­му мониторинга:

useradd --no-create-home --shell /bin/false prometheus

* мы созда­ли поль­зо­ва­те­ля prometheus без домаш­ней дирек­то­рии и без воз­мож­но­сти вхо­да в кон­соль сервера.

Зада­ем вла­дель­ца для ката­ло­гов, кото­рые мы созда­ли на преды­ду­щем шаге:

chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Зада­ем вла­дель­ца для ско­пи­ро­ван­ных файлов:

chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}

Запуск и проверка

Запус­ка­ем prometheus командой:

/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

… мы уви­дим лог запус­ка — в кон­це «Server is ready to receive web requests»:

level=info ts=2019-08-07T07:39:06.849Z caller=main.go:621 msg="Server is ready to receive web requests."

Откры­ва­ем веб-бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>:9090 — загру­зит­ся кон­соль Prometheus:

Уста­нов­ка завершена.

Автозапуск

Мы уста­но­ви­ли наш сер­вер мони­то­рин­га, но его необ­хо­ди­мо запус­кать вруч­ную, что совсем не под­хо­дит для сер­вер­ных задач. Для настрой­ки авто­ма­ти­че­ско­го стар­та Prometheus мы созда­дим новый юнит в systemd.

Воз­вра­ща­ем­ся к кон­со­ли сер­ве­ра и пре­ры­ва­ем рабо­ту Prometheus с помо­щью ком­би­на­ции Ctrl + C. Созда­ем файл prometheus.service:

vi /etc/systemd/system/prometheus.service

[codesyntax lang="php"]

[/codesyntax]

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Раз­ре­ша­ем автозапуск:

systemctl enable prometheus

После руч­но­го запус­ка мони­то­рин­га, кото­рый мы дела­ли для про­вер­ки, мог­ли сбить­ся пра­ва на пап­ку биб­лио­тек — сно­ва зада­дим ей владельца:

chown -R prometheus:prometheus /var/lib/prometheus

Запус­ка­ем службу:

systemctl start prometheus

… и про­ве­ря­ем, что она запу­сти­лась корректно:

systemctl status prometheus

Alertmanager

Alertmanager нужен для сор­ти­ров­ки и груп­пи­ров­ки собы­тий. Он уста­нав­ли­ва­ет­ся по тако­му же прин­ци­пу, что и prometheus.

Загрузка

На той же офи­ци­аль­ной стра­ни­це загруз­ки копи­ру­ем ссыл­ку на Alertmanager для Linux:

После преды­ду­щей уста­нов­ки мы долж­ны были остать­ся в ката­ло­ге про­ме­те­уса — выхо­дим на уро­вень выше:

cd ..

Теперь исполь­зу­ем ссыл­ку для загруз­ки alertmanager:

wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz

Установка

Созда­ем ката­ло­ги для alertmanager:

mkdir /etc/alertmanager /var/lib/prometheus/alertmanager

Рас­па­ку­ем наш архив:

tar zxvf alertmanager-*.linux-amd64.tar.gz

… и перей­дем в ката­лог с рас­па­ко­ван­ны­ми файлами:

cd alertmanager-*.linux-amd64

Рас­пре­де­ля­ем фай­лы по каталогам:

cp alertmanager amtool /usr/local/bin/

cp alertmanager.yml /etc/alertmanager

Назначение прав

Созда­ем поль­зо­ва­те­ля, от кото­ро­го будем запус­кать alertmanager:

useradd --no-create-home --shell /bin/false alertmanager

* мы созда­ли поль­зо­ва­те­ля alertmanager без домаш­ней дирек­то­рии и без воз­мож­но­сти вхо­да в кон­соль сервера.

Зада­ем вла­дель­ца для ката­ло­гов, кото­рые мы созда­ли на преды­ду­щем шаге:

chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/prometheus/alertmanager

Зада­ем вла­дель­ца для ско­пи­ро­ван­ных файлов:

chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool}

Автозапуск

Созда­ем файл alertmanager.service в systemd:

vi /etc/systemd/system/alertmanager.service

[codesyntax lang="php"]

[/codesyntax]

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Раз­ре­ша­ем автозапуск:

systemctl enable alertmanager

Запус­ка­ем службу:

systemctl start alertmanager

Откры­ва­ем веб-бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>:9093 — загру­зит­ся кон­соль alertmanager:

Уста­нов­ка завершена.

node_exporter

Для полу­че­ния мет­рик от опе­ра­ци­он­ной систе­мы, уста­но­вим и настро­им node_exporter на тот же сер­вер про­ме­те­уса (или на кли­ент­ский ком­пью­тер). Про­цесс уста­нов­ки такой же, как у Prometheus и Alertmanager.

Если мы уста­нав­ли­ва­ем node_exporter на кли­ен­та, необ­хо­ди­мо про­ве­рить нали­чие бранд­мау­э­ра и, при необ­хо­ди­мо­сти, открыть tcp-порт 9100.

Загрузка

Захо­дим на стра­ни­цу загруз­ки и копи­ру­ем ссыл­ку на node_exporter:

* обра­ти­те вни­ма­ние, что для неко­то­рых при­ло­же­ний есть свои гото­вые экспортеры.

После преды­ду­щей уста­нов­ки мы долж­ны были остать­ся в ката­ло­ге алерт мене­дже­ра — выхо­дим на уро­вень выше:

cd ..

Теперь исполь­зу­ем ссыл­ку для загруз­ки node_exporter:

wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz

Установка

Рас­па­ку­ем ска­чан­ный архив:

tar zxvf node_exporter-*.linux-amd64.tar.gz

… и перей­дем в ката­лог с рас­па­ко­ван­ны­ми файлами:

cd node_exporter-*.linux-amd64

Копи­ру­ем испол­ня­е­мый файл в bin:

cp node_exporter /usr/local/bin/

Назначение прав

Созда­ем поль­зо­ва­те­ля nodeusr:

useradd --no-create-home --shell /bin/false nodeusr

Зада­ем вла­дель­ца для испол­ня­е­мо­го файла:

chown -R nodeusr:nodeusr /usr/local/bin/node_exporter

Автозапуск

Созда­ем файл node_exporter.service в systemd:

vi /etc/systemd/system/node_exporter.service

[codesyntax lang="php"]

[/codesyntax]

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Раз­ре­ша­ем автозапуск:

systemctl enable node_exporter

Запус­ка­ем службу:

systemctl start node_exporter

Откры­ва­ем веб-бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сер­ве­ра или клиента>:9100/metrics — мы уви­дим мет­ри­ки, собран­ные node_exporter:

Уста­нов­ка завершена.

Отображение метрик с node_exporter в консоли prometheus

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл prometheus:

vi /etc/prometheus/prometheus.yml

В раз­де­ле scrape_configs добавим:

scrape_configs:

- job_name: 'node_exporter_clients'
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.14:9100','192.168.0.15:9100']

* в дан­ном при­ме­ре мы доба­ви­ли кли­ен­та с IP-адре­сом 192.168.0.14, рабо­чее назва­ние для груп­пы кли­ен­тов node_exporter_clients. Для при­ме­ра, мы так­же доба­ви­ли кли­ен­та 192.168.0.15 — что­бы про­де­мон­стри­ро­вать, что несколь­ко кли­ен­тов добав­ля­ет­ся через запятую.

Что­бы настрой­ка всту­пи­ла в дей­ствие, пере­за­гру­жа­ем наш сер­вис prometheus:

systemctl restart prometheus

Захо­дим в веб-кон­соль prometheus и пере­хо­дим в раз­дел Status - Targets:

… в открыв­шем­ся окне мы долж­ны уви­деть нашу груп­пу хостов и сам ком­пью­тер с уста­нов­лен­ной node_exporter:

* ста­тус так­же дол­жен быть UP.

Отображение тревог

Созда­дим про­стое пра­ви­ло, реа­ги­ру­ю­щее на недо­ступ­ность клиента.

Созда­ем файл с правилом:

vi /etc/prometheus/alert.rules.yml

[codesyntax lang="php"]

[/codesyntax]

Теперь под­клю­чим наше пра­ви­ло в кон­фи­гу­ра­ци­он­ном фай­ле prometheus:

vi /etc/prometheus/prometheus.yml

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном при­ме­ре мы доба­ви­ли наш файл alert.rules.yml в сек­цию rule_files. Заком­мен­ти­ро­ван­ные фай­лы first_rules.yml и second_rules.yml уже были в фай­ле в каче­стве примера.

Пере­за­пус­ка­ем сервис:

systemctl restart prometheus

Откры­ва­ем веб-кон­соль про­ме­те­уса и пере­хо­дим в раз­дел Alerts. Если мы доба­вим кли­ен­та и попро­бу­ем его отклю­чить для при­ме­ра, мы уви­дим тревогу:

Отправка уведомлений

Теперь настро­им связ­ку с алерт мене­дже­ром для отправ­ки уве­дом­ле­ний на почту.

Настро­им alertmanager:

vi /etc/alertmanager/alertmanager.yml

В сек­цию global добавим:

[codesyntax lang="php"]

[/codesyntax]

* мы будем отправ­лять сооб­ще­ния от email monitoring@test.ru.

При­ве­дем сек­цию route к виду:

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном при­ме­ре нами был добав­лен марш­рут, кото­рый отлав­ли­ва­ет собы­тие InstanceDown и запус­ка­ет реси­вер send_email.

… далее доба­вим еще один ресивер:

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном при­ме­ре мы отправ­ля­ем сооб­ще­ние на поч­то­вый ящик alert@test.ru с локаль­но­го сер­ве­ра. Обра­ти­те вни­ма­ние, что для отправ­ки почты нару­жу у нас дол­жен быть кор­рект­но настро­ен­ный поч­то­вый сер­вер (в про­тив­ном слу­чае, поч­та может попа­дать в СПАМ).

Пере­за­пу­стим сер­вис для алерт менеджера:

systemctl restart alertmanager

Теперь настро­им связ­ку prometheus с alertmanager — откры­ва­ем кон­фи­гу­ра­ци­он­ный файл сер­ве­ра мониторинга:

vi /etc/prometheus/prometheus.yml

При­ве­дем сек­цию alerting к виду:

[codesyntax lang="php"]

[/codesyntax]

* где 192.168.0.14 — IP-адрес сер­ве­ра, на кото­ром у нас сто­ит alertmanager.

Пере­за­пус­ка­ем сервис:

systemctl restart prometheus

Немно­го ждем и захо­дим на веб интер­фейс алерт мене­дже­ра — мы долж­ны уви­деть тревогу:

… а на поч­то­вый ящик долж­но прий­ти пись­мо с тревогой.

Мониторинг служб Linux

Для мони­то­рин­га сер­ви­сов с помо­щью Prometheus мы настро­им сбор мет­рик и отоб­ра­же­ние тревог.

Сбор метрие с помощью node_exporter

Откры­ва­ем сер­вис, создан­ный для node_exporter:

vi /etc/systemd/system/node_exporter.service

… и доба­вим к ExecStart:


ExecStart=/usr/local/bin/node_exporter --collector.systemd

* дан­ная опция ука­зы­ва­ет экс­пор­те­ру мони­то­рить состо­я­ние каж­дой службы.

При необ­хо­ди­мо­сти, мы можем либо мони­то­рить отдель­ные служ­бы, доба­вив опцию collector.systemd.unit-whitelist:

ExecStart=/usr/local/bin/node_exporter --collector.systemd --collector.systemd.unit-whitelist="(chronyd|mariadb|nginx).service"

* в дан­ном при­ме­ре будут мони­то­рить­ся толь­ко сер­ви­сы chronydmariadb и nginx.

… либо наобо­рот — мони­то­рить все служ­бы, кро­ме отдель­но взятых:

ExecStart=/usr/local/bin/node_exporter --collector.systemd --collector.systemd.unit-blacklist="(auditd|dbus|kdump).service"

* при такой настрой­ке мы запре­тим мони­то­ринг сер­ви­сов auditddbus и kdump.

Что­бы при­ме­нить настрой­ки, пере­чи­ты­ва­ем кон­фиг systemd:

systemctl daemon-reload

Пере­за­пус­ка­ем node_exporter:

systemctl restart node_exporter

Отображение тревог

Настро­им мони­то­ринг для служ­бы NGINX.

Созда­ем файл с правилом:

vi /etc/prometheus/services.rules.yml

[codesyntax lang="php"]

[/codesyntax]

Под­клю­чим файл с опи­са­ни­ем пра­вил в кон­фи­гу­ра­ци­он­ном фай­ле prometheus:

vi /etc/prometheus/prometheus.yml

[codesyntax lang="php"]

[/codesyntax]

* в дан­ном при­ме­ре мы доба­ви­ли наш файл services.rules.yml к уже ранее добав­лен­но­му alert.rules.yml в сек­цию rule_files.

Пере­за­пус­ка­ем prometheus:

systemctl restart prometheus

Для про­вер­ки, оста­но­вим наш сервис:

systemctl stop nginx

В кон­со­ли Prometheus в раз­де­ле Alerts мы долж­ны уви­деть тревогу:

====================================================================================================

Рас­смот­рим подроб­нее кон­фиг файл prometheus

Уста­нов­ка и настрой­ка ком­по­нен­тов pushgateway и alertmanager в дан­ной ста­тье не рассматривается.

В кон­фи­гу­ра­ци­он­ном фай­ле /etc/prometheus/prometheus.yml уда­ле­ны настрой­ки неис­поль­зу­е­мых ком­по­нен­тов pushgateway и alertmanager и на дан­ном эта­пе он выгля­дит сле­ду­ю­щим образом:
[codesyntax lang="php"]

[/codesyntax]

Струк­ту­ру кон­фи­гу­ра­ци­он­но­го фай­ла рас­смот­рим подроб­нее. В сек­ции global могут быть опи­са­ны такие параметры:

  • scrape_interval — интер­вал сбо­ра мет­рик (общий для всех задач);
  • evaluation_interval — интер­вал свер­ки с правилами;
  • rule_files — фай­лы пра­вил (о них пого­во­рим в сле­ду­ю­щих статьях).

В сек­ции scrape_configs могут быть опи­са­ны такие параметры:

  • job_name — имя задачи;
  • scrape_interval — интер­вал сбо­ра мет­рик (пере­опре­де­ля­ет зна­че­ние из сек­ции global);
  • scrape_timeout — вре­мя ожи­да­ния данных;
  • metrics_path — ресурс, на кото­рый нуж­но пере­да­вать метрики;
  • scheme — про­то­кол для пере­да­чи метрик;
  • basic_auth — дан­ные для авто­ри­за­ции на сер­ве­ре, с кото­ро­го соби­ра­ют­ся мет­ри­ки (username:<логин>password:<пароль>);
  • target_groups — груп­пы или отдель­ные сер­ви­сы, для кото­рых соби­ра­ют­ся метрики.

Через мину­ту-вто­рую, как толь­ко node-exporter собе­рет дан­ные, мож­но будет их про­смот­реть в веб-интер­фей­се по адре­су http://[IP-адрес сервера]:9090.

В поле Expression выби­ра­ем мет­ри­ку, для кото­рой нуж­но отоб­ра­зить гра­фик. Напри­мер, посмот­рим на исполь­зо­ва­ние CPU — при­ве­дем мет­ри­ку к виду sum(rate(node_cpu[5m])) by (mode) и нажмем на кноп­ку Execute.

Мож­но для нагляд­но­сти убрать с гра­фи­ка вре­мя про­стоя (idle), тогда наша мет­ри­ка будет выгля­деть так sum(rate(node_cpu{mode!="idle"}[5m])) by (mode).

Над гра­фи­ком рас­по­ло­же­на «панель управ­ле­ния» пери­о­дом отоб­ра­же­ния статистики.

Если у вас несколь­ко сер­ве­ров, с кото­рых нуж­но соби­рать дан­ные, то доста­точ­но уста­но­вить на каж­дый сер­вер пакет node-exporter

допи­сать хосты в кон­фиг /etc/prometheus/prometheus.yml на сер­ве­ре Prometheus, напри­мер так:

[codesyntax lang="php"]

[/codesyntax]

и пере­за­пу­стить Prometheus для при­ме­не­ния изменений.

В систе­ме мони­то­рин­га Prometheus так­же преду­смот­ре­ны дефолт­ные кон­со­ли для про­смот­ра общей инфор­ма­ции по сер­ве­ру. Эти кон­со­ли нахо­дят­ся в ката­ло­ге /еtc/prometheus/consoles, в бра­у­зе­ре они доступ­ны по адре­су http://[IP-адрес сервера]:9090/consoles/<имя консоли>.html.

Мож­но созда­вать соб­ствен­ные кон­со­ли с помо­щью HTML-шаб­ло­ни­за­то­ра Go и офи­ци­аль­ных инструк­ций от Prometheus или соби­рать даш­бор­ды с помо­щью PromDash