Инструмент мониторинга приложений Linux

У меня есть Java-приложение (толстый кувшин), которое работает на экземпляре Linux Ubuntu и время от времени дает сбой. Приложение имеет встроенный веб-сервер и предоставляет URL проверки работоспособности.

Мне нужно реализовать какой-то внешний мониторинг с помощью некоторого инструмента, установленного на этом Linux-боксе, который будет периодически пинговать этот URL-адрес и перезапускать Java-приложение, если это необходимо.

Не могли бы вы показать мне, как это может быть реализовано?

1 ответ

Решение

Я сомневаюсь, что вы найдете единый инструмент, который сделает все это.

Однако вот несколько вещей, которые вы можете сделать, чтобы реализовать то, что вы хотите. Идея состоит в том, что вам нужно сделать ваше java-приложение системным сервисом, установить инструмент, который может пропинговать ваш URL проверки работоспособности, и иметь простой скрипт bash для периодического запуска, который запускает инструмент, проверяет его код выхода и, если он не то, что мы ищем, оно перезапустит ваш сервис (systemd заботится обо всех дочерних процессах и т. д.).

Создайте сервис systemd из вашего Java-приложения:
Создать файл /etc/systemd/system/<my-service>.service, замещать <my-service> с любым именем, которое вы хотите, чтобы ваша служба имела.
Отредактируйте ваш файл, настроив следующее:

[Unit]
Description=My java application
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/java -jar /path/to/my/jar # or whatever command  you use to start your application, make sure the paths are absolute (to find your java executable, run `whereis java`)
User=someuser # the user with which the application will run, can be root
StandardOutput=journal
StandardError=journal # you can configure where stdout/stderr go, you can use journal for easier logging

[Install]
WantedBy=multi-user.target

Вам необходимо отредактировать следующее:
Описание - установите описание, соответствующее вашему приложению (не обязательно)
Тип - если ваше приложение разветвляется и запускает дочерние процессы, вам нужно установить тип в forking Таким образом, systemd будет знать, что вы разветвляете дочерние процессы, и он также будет управлять ими.
ExecStart - команда (с абсолютными путями), которую вы используете для запуска приложения. Вы также можете сделать это скриптом bash.

После того, как вы настроите этот файл, вам необходимо перезагрузить настройки демона для systemd:
sudo systemctl daemon-reload

А затем включите ваш сервис (если вы хотите, чтобы он запускался автоматически при загрузке):
sudo systemctl enable <my-service>.service
или просто запустите
sudo systemctl start <my-service>.service

Поздравляем, теперь ваше приложение работает как сервис systemd. В этой документации Red Hat вы можете прочитать гораздо более подробную информацию о создании, изменении и управлении пользовательскими службами systemd.

Мы еще не закончили, следующий шаг:
Установите необходимый инструмент для проверки вашего URL и создайте скрипт bash для перезапуска службы:
Инструмент, который позволяет пинговать URL-адреса httping например. Вы можете установить его в своей системе Ubuntu, запустив sudo apt install httping,
Затем напишите bash-скрипт, который вызывает httping с правильными аргументами и перезапустите свой сервис, если что-то пойдет не так. Что-то вроде следующего (очень простой пример):

#!/bin/bash

httping -c 5 -g <url_for_health_check> -s

if [[ $? -eq 0 ]]; then
    echo "Health check is OK."
else
    echo "Health check is not OK.. restarting service."
    sudo systemctl restart <my_service>.service
fi

Этот скрипт bash вызывает httping и проверяет URL-адрес проверки работоспособности 5 раз для получения кода состояния (-c за количество пингов, -g для URL, -s для кода состояния). когда httping называется с -s никогда не завершится с кодом выхода 0 если статус URL не в порядке. Так что, если он не выходит с 0, то есть проблема, поэтому мы перезапускаем сервис (это проверка if).

Итак, мы закончили? Теперь у нас есть скрипт, который перезапускает наш сервис (Java-приложение), если у него возникают проблемы. Однако нам все еще нужно запускать этот скрипт автоматически.

Для этого вы можете создать задание cron или использовать системный таймер.

Пример того, как это сделать с помощью systemd:
Во-первых, вам нужно сделать свой bash-скрипт сервисом, как и ваше Java-приложение. Гораздо проще, на этот раз.

Создать файл /etc/systemd/system/health_check.service и добавьте следующее (отредактируйте путь конечно):

[Unit]
Description=Health check bash script

[Service]
Type=oneshot
ExecStart=/bin/bash /path/to/bash/script.sh

Затем создайте системный таймер для запуска этой службы:
Создайте /etc/systemd/system/health_check.timer и заполните его следующим содержанием:

[Unit]
Description=Health check script timer
After=<my_service>.service

[Service]
Unit=health_check.service
OnCalendar=minutely

[Install]
WantedBy=multi-user.target

Здесь вы должны указать, что таймер должен всегда запускаться после отслеживаемого сервиса (замените <my_service>.service с вашим сервисом приложений Java). А также OnCalendar= указывает, когда запустить таймер. В настоящее время он будет запускаться раз в минуту. Вы можете изменить это, смотрите systemd.time Больше подробностей.

Ааа, вот и все. Теперь просто включите таймер (не службу bash-скрипта) и запустите его, но также сначала перезагрузите конфигурации демона:

sudo systemctl daemon-reload 
sudo systemctl enable health_check.timer
sudo systemctl start health_check.timer

Теперь вы должны быть готовы. Таймер будет запускать ваш bash-скрипт каждую 1 минуту, который будет проверять, в порядке ли URL-адрес проверки работоспособности, и если это не так, он перезапустит вашу службу.

Есть немного более сложные способы сделать это без использования скриптов bash, только systemd, однако для начала это должно сработать.

Примечание: это настраивает полностью автоматический мониторинг. Нет необходимости в ручном вмешательстве, поэтому вы также включаете таймер, чтобы он мог запускаться при запуске вместе с вашим Java-приложением. Если вы хотите сделать все это вручную, не включайте эти службы и запускайте их только тогда, когда это необходимо.

Рекомендации:
systemd.service - страница руководства для сервисных модулей systemd, вы можете прочитать, чтобы понять, что такое сервисы, как их использовать и как их настроить.
systemd.timer - страница справочника по системным таймерам, чтобы понять, как работают таймеры и как их настраивать.

Другие вопросы по тегам