Часть 1. Мониторинг: установка
⠀Для эффективного слежения за серверами и своевременного предотвращения проблем нужно настроить мониторинг, с чем может помочь данная серия статей.
Содержание
Для чего?
⠀Любой сервер может дать сбой как технический, так и программного обеспечения (ПО). Для предотвращения такой ситуации необходим периодический осмотр определённых метрик серверов для анализа состояния каждого из них. Провести эту процедуру можно двумя способами:
- Вручную. Ручной обход каждого сервера и проверка необходимых метрик — неудобно, очень плохо масштабируется, тратит множество ресурсов.
- Автоматизировано. Специальное ПО собирает метрики в соответствии с настройками, а затем отображает их в наглядном виде — удобно, гибко настраивается, хорошо масштабируется.
⠀Также помимо информации о системных ресурсах может быть интересна какая-либо информация из программ, например, информация о ноде, количество посещений сайта, количество заказов каждого из товаров в интернет-магазине и т.п.
⠀Для автоматизации процесса сбора таких данных существуют существуют мониторинга, благодаря которым можно:
- За короткое время отслеживать все необходимые метрики в одном месте;
- Заметить и предотвратить проблему до её появления;
- Вовремя заметить возникшую проблему и оперативно исправить её.
⠀Прежде чем перейти к установке системы мониторинга, необходимо ознакомиться с некоторыми способами её реализации и выбрать исходя из них определённую стратегию.
⠀В серии статей разбирается установка мониторинга без подключения оповещений на сервера с наиболее популярным дистрибутивом — Ubuntu 20.04. Для прочих дистрибутивов эти статьи, вероятнее всего, будут полезны лишь с теоретической точки зрения.
Компоненты системы
⠀Для реализации функций мониторинга необходимо выполнить с метриками следующие действия:
⠀Существует широкий выбор инструментов для выполнения каждого из действий, однако ниже рассмотрены две наиболее популярных связки.
Node exporter + Prometheus Server + Grafana
⠀Prometheus — это система мониторинга различных систем и сервисов, способная выполнять множество действий:
- Хранение данных в базе данных временных рядов;
- Сбор метрик;
- Отправка оповещений;
- Отображение данных в собственном интерфейсе;
- Возможность отдачи данных через HTTP.
⠀Prometheus Server — это ядро системы, собирающее и хранящее метрики.
⠀Node exporter — это агент Prometheus, собирающий метрики сервера с ОС Linux.
⠀Grafana — платформа, визуализирующая метрики посредством дашбордов, поддерживающая различные приложения для хранения метрик.
- Меньшее потребление ресурсов сервера по сравнению с InfluxDB;
- Собственный простой и мощный язык запросов;
- Больше готовых Grafana дашбордов по сравнению с InfluxDB;
- Во всех версиях существует встроенная панель для визуализации метрик;
- Есть возможность создания своих агентов.
- Скудный список поддерживаемых типов данных: float64, string (ограничено);
- Трудность детальной настройки собираемых метрик;
- Prometheus самостоятельно извлекает данные из агентов;
- Заточен в основном под мониторинг.
Telegraf + InfluxDB + Grafana
⠀InfluxDB — это база данных временных рядов.
⠀Telegraf — это агент InfluxDB, собирающий метрики сервера с ОС Linux.
- Обширный список поддерживаемых типов данных: float64, int64, bool и string;
- Возможность сбора не только метрик сервера, но и данных из различных программ (например, последний блок ноды, баланс кошелька, количество посещений сайта, покупок за день в интернет-магазине и т.п.).
- Telegraf имеет широкий выбор собираемых метрик с возможностью детальной настройки;
- InfluxDB требует передачи данных ей сторонними приложениями;
- Возможность записи данных посредством HTTP запроса;
- Во всех версиях собственный язык запросов, похожий на SQL;
- В версиях 2.х:
- Большее потребление ресурсов сервера по сравнению с Prometheus;
- Существуют утечки оперативной памяти;
- Меньше готовых Grafana дашбордов по сравнению с Prometheus;
- В версиях 1.х отсутствует встроенная панель для визуализации метрик.
Виды хранения данных
⠀Система мониторинга включает в себя следующих участников:
- Множество серверов, с которых собираются метрики;
- Место, где хранятся полученные метрики;
- Сервер с Grafana’ой для визуализации метрик всех серверов в одном месте.
⠀Из всех участников более подробного разъяснения требует место хранения данных, поскольку существует несколько видов хранения данных, у каждого из которых есть свои достоинства и недостатки.
Централизованное
⠀В системе участвует одна база данных (БД), в которую отправляются метрики со всех отслеживаемых серверов. БД может находится как на отдельном сервере, так и по соседству с Grafana’ой. Grafana подключается к этой БД и отображает метрики выбранного сервера.
- Обработкой и хранением всех метрик занимается отдельный сервер;
- БД настраивается один раз;
- Простота подключения отслеживаемого сервера;
- Практически все публичные дашборды поддерживают такой вид хранения.
- Сложность удаления из БД всех метрик определённого отслеживаемого сервера;
- Подключение к БД других Grafana предоставляет доступ ко всем серверам (неудобно при работе в команде или командах);
- Получение злоумышленником доступа к любому из серверов системы предоставляет возможность:
Децентрализованное
⠀В системе каждый отслеживаемый сервер хранит метрики в локальной БД. Grafana находится на отдельном сервере, подключается ко всем БД и отображает метрики выбранного сервера из выбранной БД.
- Лёгкость удаления метрик определённого отслеживаемого сервера: необходимо удалить БД на сервере;
- Возможность выборочного подключения отслеживаемых серверов к нескольким Grafana’ам (полезно при работе в команде или командах);
- Получение злоумышленником доступа к серверу с Grafan’ой предоставляет только возможность чтения метрик;
- Получение злоумышленником доступа к отслеживаемому серверу предоставляет полный доступ только к локальной БД.
- БД потребляет дополнительные ресурсы отслеживаемого сервера;
- Необходима установка собирающего агент и БД на отслеживаемый сервер, а также добавление БД в Grafana’у;
- Необходимо сохранять пароли от всех БД;
- Единицы публичных дашбордов поддерживают такой вид хранения данных.
Гибридное
⠀В системе используется несколько БД, некоторые из которых хранят в себе метрики одного отслеживаемого сервера, а некоторые нескольких, объединённых по определённой логике. Примеры объединения: ноды Solana, ноды из экосистемы Cosmos и т.п. Grafana находится либо на отдельном сервере, либо на сервере с одной из объединяющих БД и отображает метрики выбранного сервера из выбранной БД.
⠀Сочетает в себе достоинства и недостатки централизованного и децентрализованного вида хранения данных.
Итоговый выбор
⠀В качестве компонентов будет использоваться связка Telegraf + InfluxDB + Grafana за счёт широкого спектра применения (загрузке данных сторонними приложениями) и возможности детальной настройки.
⠀В ходе написания статьи были рассмотрены и протестированы следующие варианты:
- InfluxDB 2.1 (Docker) + Telegraf (Docker) + Grafana (Docker) = нет. Удобная работа с БД через API ключи, но для выполнения SQL-подобных запросов в Grafana нужно плясать с бубном.
- InfluxDB 1.8 (Docker) + Telegraf (Docker) + Grafana (Docker) = нет. Из-за изолированности Docker контейнеров от хоста существуют сложности с получением некоторых метрик (количество пользователей, процессов, трафик сетевых интерфейсов, метрики, связанные с Docker), часть из которых даже после плясок с бубном получить не удалось.
- InfluxDB 1.8 (Docker) + Telegraf (systemd) + Grafana (Docker) = да.
⠀При помощи гайда можно выбрать и организовать любой вид хранения данных. Наша команда выбрала использование гибридного.
Grafana
⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.
Вручную
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/installers/docker.sh)
⠀Запустить контейнер с Grafana’ой (необходимо задать логин и пароль для авторизации в панели)
docker run -dit --restart always --name grafana \ -p 3000:3000 -u root \ -e GF_SECURITY_ADMIN_USER=`read -p #39;\e[40m\e[92mEnter a login:\e[0m ' R; echo $R` \ -e GF_SECURITY_ADMIN_PASSWORD=`read -p #39;\e[40m\e[92mEnter a password:\e[0m ' R; echo $R` \ -e GF_INSTALL_PLUGINS= \ -v $HOME/.monitoring/grafana:/var/lib/grafana \ grafana/grafana
⠀Через 10 секунд удалить контейнер для того, чтобы нельзя было получить из его данных пароль
docker rm -f grafana
⠀Повторно запустить контейнер с Grafana’ой
docker run -dit --restart always --name grafana \ -p 3000:3000 -u root \ -v $HOME/.monitoring/grafana:/var/lib/grafana \ grafana/grafana
Автоматически
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) -g \ -gu "имя_пользователя" \ -gp "пароль"
InfluxDB
⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.
Вручную
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/installers/docker.sh)
⠀Задать и сохранить в надёжном месте пароль администратора БД
read -p #39;\e[40m\e[92mEnter an InfluxDB admin password:\e[0m ' \ admin_password
docker run -dit --restart always --name influxdb \ -p 8083:8083 -p 8086:8086 \ -e INFLUXDB_DB=telegraf \ -e INFLUXDB_HTTP_AUTH_ENABLED=true \ -e INFLUXDB_ADMIN_USER=admin \ -e INFLUXDB_ADMIN_PASSWORD="$admin_password" \ -v $HOME/.monitoring/influxdb:/var/lib/influxdb \ influxdb:1.8-alpine
⠀Через 10 секунд удалить контейнер для того, чтобы нельзя было получить из его данных пароль
docker rm -f influxdb
⠀Повторно запустить контейнер с InfluxDB
docker run -dit --restart always --name influxdb \ -p 8083:8083 -p 8086:8086 \ -e INFLUXDB_HTTP_AUTH_ENABLED=true \ -v $HOME/.monitoring/influxdb:/var/lib/influxdb \ influxdb:1.8-alpine
⠀Добавить команды в систему в виде переменных:
- Сокращение команды для работы с БД;
- Сокращение команды для работы с бинарным файлом InfluxDB;
- Просмотр лога InfluxDB.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n influx -v "docker exec -it influxdb influx" -a . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n influxd -v "docker exec -it influxdb influxd" -a . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n influxdb_log -v "docker logs influxdb -fn 100" -a
⠀Задать и сохранить в надёжном месте пароль пользователя для чтения
read -p #39;\e[40m\e[92mEnter an InfluxDB reader password:\e[0m ' \ reader_password
⠀Создать пользователя для чтения
influx -username admin -password "$admin_password" -database telegraf -execute "CREATE USER reader WITH PASSWORD '$reader_password'; GRANT READ ON telegraf TO reader"
⠀Включить удаление метрик, которые старше 14 дней
influx -username admin -password "$admin_password" -database telegraf -execute 'ALTER RETENTION POLICY "autogen" ON "telegraf" DURATION 7d'
⠀Добавить ежедневную перезагрузку БД для уменьшения воздействия утечки оперативной памяти
sudo tee <<EOF >/dev/null /etc/cron.daily/influxdb_restart #!/bin/sh docker restart influxdb EOF chmod +x /etc/cron.daily/influxdb_restart
Автоматически
⠀Запустить скрипт, при желании указав:
-ap
— пароль администратора (по умолчанию генерируется);-rp
— пароль пользователя для чтения (по умолчанию генерируется).
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \ -i
Telegraf
⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.
Вручную
mkdir -p $HOME/.monitoring/telegraf/
⠀Добавить в список репозиториев репозиторий с Telegraf
. /etc/*-release; \ echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee >/dev/null /etc/apt/sources.list.d/influxdb.list; \ wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
sudo apt update && sudo apt upgrade -y
⠀Установить необходимые пакеты
sudo apt install wget nano bc jq telegraf subversion -y
⠀Ввести название сервера (можно с пробелами, специальные символы нежелательны)
read -p #39;\e[40m\e[92mEnter a server name:\e[0m ' server_name
⠀Ввести URL для подключения к InfluxDB в формате http://SERVER_IP:8086
# Если БД на другом сервере read -p #39;\e[40m\e[92mEnter a server name:\e[0m ' influxdb_url # Если локальная БД influxdb_url="http://localhost:8086"
⠀Ввести пароль администратора InfluxDB
read -p #39;\e[40m\e[92mEnter an InfluxDB admin password:\e[0m ' \ admin_password
sudo tee <<EOF >/dev/null /etc/telegraf/telegraf.conf [agent] interval = "20s" round_interval = true metric_batch_size = 1000 metric_buffer_limit = 10000 collection_jitter = "0s" flush_interval = "10s" flush_jitter = "0s" precision = "" hostname = "$server_name" omit_hostname = false [[outputs.influxdb]] urls = ["$influxdb_url"] database = "telegraf" timeout = "5s" username = "admin" password = "$admin_password" [[inputs.cpu]] interval = "5s" percpu = true totalcpu = true collect_cpu_time = false report_active = false [[inputs.mem]] interval = "5s" [[inputs.disk]] ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] [[inputs.net]] interfaces = ["eth0"] [[inputs.docker]] container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] perdevice = false #[[inputs.procstat]] #pid_tag = true #pattern = "massa*|minima*|evmos*" #[[inputs.systemd_units]] #pattern = "massad.service minima_9001.service evmosd.service" [[inputs.exec]] interval = "5s" commands = ["sudo su -c /root/.monitoring/telegraf/for_table.sh -s /bin/bash root"] data_format = "influx" [[inputs.netstat]] [[inputs.diskio]] [[inputs.kernel]] [[inputs.processes]] [[inputs.swap]] [[inputs.system]] EOF
⠀Если сетевой интерфейс имеет другое название (в Grafana’е не будет данных), то изменить интерфейс, отредактировав раздел:
[[inputs.net]] interfaces = ["eth0"]
⠀Для отслеживания работы сервисных файлов необходимо вручную:
nano /etc/telegraf/telegraf.conf
- Раскомментировать разделы
inputs.procstat
иinputs.systemd_units
; - В раздел
inputs.procstat
по аналогии с примером добавить названия отслеживаемых процессов (обычно совпадают с названиями бинарных файлов); - В раздел
inputs.systemd_units
по аналогии с примером добавить названия отслеживаемых сервисных файлов, например
[[inputs.procstat]] pid_tag = true pattern = "massa*|minima*|evmos*" [[inputs.systemd_units]] pattern = "massad.service minima_9001.service evmosd.service"
⠀Скачать скрипт, собирающий метрики для таблицы в дашборде, созданном нашей командой
svn export --force https://github.com/SecorD0/Monitoring/trunk/dashboards/for_table.sh $HOME/.monitoring/telegraf/
chmod +x $HOME/.monitoring/telegraf/for_table.sh
⠀Создать ссылку на конфиг Telegraf’а для удобства перехода к нему
ln -s /etc/telegraf/telegraf.conf $HOME/.monitoring/telegraf/telegraf.conf
⠀Добавить Telagraf в Docker группу для чтения метрик
sudo usermod -aG docker telegraf; \ sudo usermod -aG docker _telegraf
⠀Отключить авторизацию у Telagraf
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'; \ sudo -- bash -c 'echo "_telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
sudo systemctl restart telegraf
⠀Добавить команду для просмотра лога Telegraf в систему в виде переменной
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n telegraf_log -v "sudo journalctl -fn 100 -u telegraf" -a
Автоматически
-sn
— название сервера (можно с пробелами, специальные символы нежелательны);-ap
— пароль InfluxDB администратора;-iu
— URL для подключения к InfluxDB в форматеhttp://SERVER_IP:8086
(по умолчаниюhttp://localhost:8086
).
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) -t \ -sn "название_сервера" \ -ap "пароль" \ -iu "URL"
⠀Если сетевой интерфейс имеет другое название (в Grafana’е не будет данных), то изменить интерфейс, отредактировав раздел:
[[inputs.net]] interfaces = ["eth0"]
⠀Для отслеживания работы сервисных файлов необходимо вручную:
nano /etc/telegraf/telegraf.conf
- Раскомментировать разделы
inputs.procstat
иinputs.systemd_units
; - В раздел
inputs.procstat
по аналогии с примером добавить названия отслеживаемых процессов (обычно совпадают с названиями бинарных файлов); - В раздел
inputs.systemd_units
по аналогии с примером добавить названия отслеживаемых сервисных файлов, например
[[inputs.procstat]] pid_tag = true pattern = "massa*|minima*|evmos*" [[inputs.systemd_units]] pattern = "massad.service minima_9001.service evmosd.service"
⠀После внесения изменений в конфиг, необходимо перезапустить Telegraf
sudo systemctl restart telegraf
Функции однострочного скрипта
Установка
⠀С помощью однострочного скрипта, помимо описанной ранее установки по одному компоненту системы, можно установить сразу несколько, например:
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \ -i \ -t -sn "название_сервера"
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \ -g -gu "имя_пользователя" -gp "пароль" \ -i \ -t -sn "название_сервера"
Удаление
⠀Также можно удалить компоненты:
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \ -un -i -t
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \ -un -i -c
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \ -un -i -t -c
Импорт Grafana дашборда
⠀Помимо этого можно импортировать Grafana дашборд через API. Для этого нужен сырой JSON панели, который можно спарсить по ссылке в опции -ju
или поместив в файл $HOME/dashboard.json
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) -id \ -ju "URL_to_raw_JSON"
Перенос на другой сервер
Grafana
⠀Необходимо перенести директорию со старого сервера на новый (команда отображает путь)
echo $HOME/.monitoring/grafana
⠀Установить Docker на новом сервере
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/installers/docker.sh)
docker run -dit --restart always --name grafana \ -p 3000:3000 -u root \ -v $HOME/.monitoring/grafana:/var/lib/grafana \ grafana/grafana
InfluxDB
⠀Необходимо перенести директорию со старого сервера на новый (команда отображает путь)
echo $HOME/.monitoring/influxdb
⠀Установить Docker на новом сервере
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/installers/docker.sh)
docker run -dit --restart always --name influxdb \ -p 8083:8083 -p 8086:8086 \ -e INFLUXDB_HTTP_AUTH_ENABLED=true \ -v $HOME/.monitoring/influxdb:/var/lib/influxdb \ influxdb:1.8-alpine
Telegraf
⠀Необходимо перенести директорию со старого сервера на новый (команда отображает путь)
echo $HOME/.monitoring/telegraf
⠀Остановить Telegraf на старом сервере
sudo systemctl stop telegraf
⠀Установить Telegraf на новом сервере
⠀Перенести конфиг со старого сервера на новый (команда отображает путь)
echo /etc/telegraf/telegraf.conf
⠀Перезапустить Telegraf на новом сервере
sudo systemctl restart telegraf
Читать далее
⠀Во второй части подробно рассматривается платформа Grafana.
Полезные команды
# InfluxDB influxdb_log docker logs influxdb -fn 100 # Telegraf telegraf_log sudo journalctl -fn 100 -u telegraf
# Grafana docker restart grafana # InfluxDB docker restart influxdb # Telegraf sudo systemctl restart telegraf
Полезные ссылки
grafana Docker образ | influxdb Docker образ | Telegraf inputs
Благодарности
Команда 1package — написание статьи