Продвинутым
April 20, 2022

Часть 1. Мониторинг: установка

1package & Let's Node

⠀Для эффективного слежения за серверами и своевременного предотвращения проблем нужно настроить мониторинг, с чем может помочь данная серия статей.


Содержание


Для чего?

К содержанию

⠀Любой сервер может дать сбой как технический, так и программного обеспечения (ПО). Для предотвращения такой ситуации необходим периодический осмотр определённых метрик серверов для анализа состояния каждого из них. Провести эту процедуру можно двумя способами:

  • Вручную. Ручной обход каждого сервера и проверка необходимых метрик — неудобно, очень плохо масштабируется, тратит множество ресурсов.
  • Автоматизировано. Специальное ПО собирает метрики в соответствии с настройками, а затем отображает их в наглядном виде — удобно, гибко настраивается, хорошо масштабируется.

⠀Также помимо информации о системных ресурсах может быть интересна какая-либо информация из программ, например, информация о ноде, количество посещений сайта, количество заказов каждого из товаров в интернет-магазине и т.п.

⠀Для автоматизации процесса сбора таких данных существуют существуют мониторинга, благодаря которым можно:

  • За короткое время отслеживать все необходимые метрики в одном месте;
  • Заметить и предотвратить проблему до её появления;
  • Вовремя заметить возникшую проблему и оперативно исправить её.

⠀Прежде чем перейти к установке системы мониторинга, необходимо ознакомиться с некоторыми способами её реализации и выбрать исходя из них определённую стратегию.

⠀В серии статей разбирается установка мониторинга без подключения оповещений на сервера с наиболее популярным дистрибутивом — 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.х:
    • Удобная работа через API ключи;
    • Ещё один простой и мощный язык запросов;
    • Существует встроенная панель для визуализации метрик.

Недостатки:

  • Большее потребление ресурсов сервера по сравнению с 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

К содержанию

Выполнять все действия от имени root пользователя.

⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.

Вручную

⠀Установить Docker

. <(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

Автоматически

⠀Запустить скрипт, указав:

  • -gu — имя пользователя (по умолчанию admin);
  • -gp — пароль (по умолчанию admin).
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) -g \
-gu "имя_пользователя" \
-gp "пароль"

InfluxDB

К содержанию

Выполнять все действия от имени root пользователя.

⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.

Вручную

⠀Установить Docker

. <(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

⠀Запустить InfluxDB

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

К содержанию

Выполнять от имени root пользователя

⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.

Вручную

⠀Создать папку для 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

⠀Создать Telegraf конфиг

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:
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'

⠀Перезапустить Telegraf

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:
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

Функции однострочного скрипта

К содержанию

Установка

⠀С помощью однострочного скрипта, помимо описанной ранее установки по одному компоненту системы, можно установить сразу несколько, например:

  • InfluxDB + Telegraf
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \
-i \
-t -sn "название_сервера"
  • Grafana + InfluxDB + Telegraf
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \
-g  -gu "имя_пользователя" -gp "пароль" \
-i \
-t -sn "название_сервера"

Удаление

⠀Также можно удалить компоненты:

  • InfluxDB и Telegraf, оставив файлы в папке .monitoring
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \
-un -i -t
  • Полностью удалить InfluxDB (включая все данные)
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Monitoring/main/multi_tool.sh) \
-un -i -c
  • Полностью удалить InfluxDB и Telegraf
. <(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 контейнер

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 контейнер

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.

Часть 2. Мониторинг: 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 — написание статьи

Выразить благодарность