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

400
alexanoid

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

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

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

0
Что делает URL проверки работоспособности? Если приложение Java необходимо перезапустить, значит ли это, что встроенный веб-сервер не работает или не отвечает? Я имею в виду, вы уверены, что пинг URL достаточно? Fanatique 5 лет назад 2
Спасибо за Ваш ответ. Проверка работоспособности URL при нормальной работе возвращает HTTP-код состояния 200OK. Да, в случае других ответов или вообще без ответа по этому URL - мы должны перезапустить приложение Java. Кроме того, будет полезно выполнить проверку работоспособности с помощью нескольких повторных попыток, а также проверить процессы (например, `ps aux | grep ...`) и завершить процессы этого приложения, если они существуют. alexanoid 5 лет назад 1
Запрашивать рекомендации по продукту (инструменту) здесь не по теме на Super User; просить способ сделать что-то хорошо. В своем комментарии вы вводите несколько требований, мы должны написать сценарий для вас? Мы не являемся сервисом написания сценариев, но мы можем помочь вам с вашим сценарием на случай, если вы застряли. Так что же ты пробовал? а где именно ты застрял? Также: как запустить приложение? Вы можете сделать это системным сервисом? Когда это терпит неудачу, это выходит? или процесс все еще существует, но он становится (несколько) безразличным? Kamil Maciorowski 5 лет назад 3
Я думаю, что могу сделать это как `systemd` сервис, если это необходимо. Также я спрашиваю направление - как правильно реализовать такую ​​задачу. Я не очень хорошо знаком с Linux, и поэтому я попросил здесь идеи о реализации. alexanoid 5 лет назад 0
Напишите скрипт для проверки и перезапуска сервера и периодически запускайте его из cron. Вы можете использовать wget и тайм-аут, чтобы проверить, открыт ли порт. davidgo 5 лет назад 0

1 ответ на вопрос

1
Fanatique

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

Однако вот набор вещей, которые вы можете сделать, чтобы реализовать то, что вы хотите. Идея состоит в том, что вам нужно сделать ваше 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 - страница справочника по системным таймерам, чтобы понять, как работают таймеры и как их настраивать.

Похожие вопросы