Node-exporter + Grafana + Prometheus
Prometheus является открытой СУБД, написанной на языке Go. Интересной особенностью Prometheus является то, что он сам вытягивает метрики с заданного множества сервисов. За счет этого у Prometheus не могут забиться какие-либо очереди данных, а значит мониторинг никогда не станет узким местом системы
Node Exporter - это сервис, задача которого заключается в экспорте информации о машине в формате, понятном Prometheus. На самом деле для Prometheus существует много других exporter’ов, но нам для мониторинга серверов отлично подойдет Node Exporter
Grafana представляет собой открытый веб-фронтенд к различным time series СУБД, таким, как Graphite, InfluxDB, и, конечно, Prometheus. С помощью Grafana мы сможем наблюдать красивые графики через наш браузер. Характерно, что у Prometheus есть и собственный веб-интерфейс, но даже сами разработчики Prometheus рекомендуют использовать Grafana
Получается что Node Exporter будет собирать нам информацию о сервере и передавать ее в Prometheus. Prometheus будет в свою очередь хранить и передавать информацию в Grafana. А Grafana будет визуализировать для нас всю информацию в виде приятных графиков
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):8080/\033[0m"
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m"
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m"
Сервер для Node Exporter
Node Exporter
Node Exporter мы установим на сервер с нодой и также при желании можем установить на сервер с Prometheus, чтобы наблюдать за всеми серверами. В целях безопасности создадим учетную запись node_exporter
# используем параметры --no-create-home и --shell /bin/false, # чтобы этот пользователь не мог войти на сервер useradd --no-create-home --shell /bin/false node_exporter
Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Prometheus
cd wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz tar xvf node_exporter-1.5.0.linux-amd64.tar.gz # скопируем бинарные файлы в /usr/local/bin cp node_exporter-1.5.0.linux-amd64/node_exporter /usr/local/bin chown node_exporter:node_exporter /usr/local/bin/node_exporter node_exporter --version #node_exporter, version 1.5.0 (branch: HEAD, revision: 1b48970ffcf5630534fb00bb0687d73c66d1c959) # удаляем ненужные файлы rm -r node_exporter-*
tee /etc/systemd/system/node_exporterd.service > /dev/null <<EOF [Unit] Description=Node Exporter Wants=network-online.target After=network-online.target [Service] User=node_exporter Group=node_exporter ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=default.target EOF
systemctl daemon-reload systemctl enable node_exporterd systemctl restart node_exporterd && journalctl -u node_exporterd -f -o cat
Проверяем, что метрики отдаются
curl 'localhost:9100/metrics'
Теперь самое время проверить метрики в браузере
# узнаем адрес и вставляем в браузер echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):9100/\033[0m" # http://108.108.108.108:9100/
Сервер для Prometheus и Grafana
Для Prometheus и Grafana используем отдельный сервер. Можно арендовать VPS 1/2/20
Шаг 1 - Подготовка сервера
# обновляем репозитории apt update && apt upgrade -y # устанавливаем необходимые утилиты apt install curl iptables build-essential git wget jq make gcc nano tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y apt install python3-pip -y pip install yq
File2Ban - подробнее здесь
# устанавливаем и копируем конфиг, который будет иметь больший приоритет apt install fail2ban -y && \ cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \ nano /etc/fail2ban/jail.local # раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip> systemctl restart fail2ban # проверяем status systemctl status fail2ban # проверяем, какие jails активны (по умолчанию только sshd) fail2ban-client status # проверяем статистику по sshd fail2ban-client status sshd # смотрим логи tail /var/log/fail2ban.log # останавливаем работу и удаляем с автозагрузки #systemctl stop fail2ban && systemctl disable fail2ban
Шаг 2 - Создание пользователя Prometheus
В целях безопасности создадим учетную запись prometheus
# используем параметры --no-create-home и --shell /bin/false, # чтобы этот пользователь не мог войти на сервер useradd --no-create-home --shell /bin/false prometheus # создадим необходимые каталоги для хранения файлов и данных Prometheus mkdir /etc/prometheus mkdir /var/lib/prometheus # установим права пользователя и группы в новых каталогах для пользователя prometheus chown prometheus:prometheus /etc/prometheus chown prometheus:prometheus /var/lib/prometheus
Шаг 3 - Установка Prometheus
Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Prometheus
cd && \ wget https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz && \ tar xvf prometheus-2.38.0.linux-amd64.tar.gz
# скопируем бинарные файлы в /usr/local/bin cp prometheus-2.38.0.linux-amd64/prometheus /usr/local/bin/ cp prometheus-2.38.0.linux-amd64/promtool /usr/local/bin/ # установим права собственности пользователя и группы на бинарные файлы chown prometheus:prometheus /usr/local/bin/prometheus chown prometheus:prometheus /usr/local/bin/promtool # скопируем consoles, console_libraries и prometheus.yml в /etc/prometheus cp -r prometheus-2.38.0.linux-amd64/consoles /etc/prometheus cp -r prometheus-2.38.0.linux-amd64/console_libraries /etc/prometheus cp prometheus-2.38.0.linux-amd64/prometheus.yml /etc/prometheus/ # установим права собственности пользователя и группы в каталогах для пользователя prometheus # флаг -R гарантирует, что право собственности также будет установлено для файлов внутри каталога chown -R prometheus:prometheus /etc/prometheus # удаляем ненужные файлы rm -rf prometheus-2.38.0.linux-amd64.tar.gz prometheus-2.38.0.linux-amd64 # проверим версии prometheus --version promtool --version
Шаг 4 - Настройка Prometheus
Теперь нам необходимо настроить prometheus.yml и добавить в него 1 или несколько параметров в зависимости от количества серверов и используемых нод
Предупреждение: конфигурационный файл Prometheus использует формат YAML, который строго запрещает табуляцию и требует двух пробелов для отступа. Prometheus не запустится, если файл конфигурации неправильно отформатирован
Info: Prometheus использует job_name
для обозначения экспортеров в запросах и на графиках, поэтому обязательно заполняем данное значение
В некоторых случая, к примеру для APTOS необходимо также указывать chain:
И, поскольку Prometheus экспортирует важные данные о себе, которые можно использовать для мониторинга производительности и отладки, то переопределимscrape_interval
с 15 секунд до 5 секунд для более частых обновлений
Наконец, Prometheus использует директивы static_configs
иtargets
, чтобы определить, где работают экспортеры. Поскольку этот конкретный экспортер работает на том же сервере, что и сам Prometheus, мы можем использовать localhost
вместо IP-адреса вместе с портом по умолчанию, 9090
Открываем дефолтный конфиг и приводим его к следующему виду
nano /etc/prometheus/prometheus.yml
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:8080','localhost:9100']
ВНИМАНИЕ - мы заменили стандартный порт prometheus (9090) на порт (8080)
После завершения настройки мы готовы протестировать Prometheus, запустив его в первый раз
tee /etc/systemd/system/prometheusd.service > /dev/null <<EOF [Unit] Description=Prometheus Wants=network-online.target After=network-online.target [Service] 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 \ --web.listen-address=:8080 [Install] WantedBy=multi-user.target EOF
systemctl daemon-reload && systemctl enable prometheusd && systemctl restart prometheusd && systemctl status prometheusd #journalctl -u prometheusd -f -o cat
Проверяем, что метрики отдаются
curl 'localhost:8080/metrics'
Теперь самое время проверить информацию в браузере
# узнаем адрес и вставляем в браузер echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):8080/\033[0m" # http://108.108.108.108:9090/
В дальнейшем Вы можете добавлять в prometheus.yml дополнительную информацию о других своих серверах, чтобы мониторить сразу несколько серверов. Конфигурация будет зависеть от Ваших настроек и json для Grafana
Шаг 5 - Установка Grafana
Вы можете найти последние двоичные файлы вместе с их контрольными суммами на странице загрузки Grafana
sudo apt-get install -y adduser libfontconfig1 && \ wget https://dl.grafana.com/enterprise/release/grafana-enterprise_9.1.3_amd64.deb && \ sudo dpkg -i grafana-enterprise_9.1.3_amd64.deb
systemctl daemon-reload && systemctl enable grafana-server && systemctl restart grafana-server && systemctl status grafana-server
journalctl -u grafana-server -f
Теперь самое время перейти в браузер
# узнаем адрес и вставляем в браузер echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):3000/\033[0m" # http://108.108.108.108:3000/
Теперь нам необходимо указать в графе URL адрес к своему серверу с Prometheus. Если Prometheus находится на том же сервере, что и Grafana, то задаем http://localhost:8080 и сохраняем настройки
Теперь самое интересное и нам необходимо загрузить json файлы для нашего дашборда. Для этого необходимо знать ID json файла или скачать его у кого-то или создать самому
- Найти json по душе можно здесь
Если у нас есть скачанный json, то загружаем его самостоятельно
Можно загрузить сразу несколько json и переключаться между ними. Или создать свой собственный, потратив на это определенное количество времени)
Настройка UFW
В целях обеспечения защиты своих данных необходимо как минимум закрыть наши порты от других, так как без этого любой зная IP сервера и порт сможет получить данные Node exporter или Prometheus c Grafana
Мы можем настроить UFW так, чтобы данные с Prometheus и Grafana были доступны только с нужного нам IP (к примеру домашнего ПК). А данные от Node exporter были доступны только для сервера где установлен Prometheus
# Разрешить получать данные от Grafana только с домашнего IP ufw allow from <ВАШ_IP> to any port 3000
# Разрешить получать данные от Prometheus только с домашнего IP ufw allow from <ВАШ_IP> to any port 8080
# Разрешить получать данные от Node Exporter только для сервера с Prometheus ufw allow from <IP_PROMETHEUS> to any port 9100
Полезные команды
systemctl stop prometheusd systemctl disable prometheusd systemctl daemon-reload rm /etc/systemd/system/prometheusd.service
systemctl stop grafana-server systemctl disable grafana-server systemctl daemon-reload