Advertisement
  1. Code
  2. Deployment

Мониторинг и управление приложениями с использованием Supervisor: часть 2

Scroll to top
Read Time: 3 min
This post is part of a series called Monitor and Control Applications Using Supervisor.
Monitor and Control Applications Using Supervisor: Part 1

() translation by (you can also view the original English article)

В первой части этой серии из двух частей мы увидели, как настроить и контролировать Supervisor для работы с нашими веб-приложениями. В этой части мы увидим, как мы можем программно управлять процессами Supervisor удаленно через API XML-RPC.

Начинаем

В предыдущей части мы увидели, что Supervisor предоставляет веб-интерфейс, который позволяет удаленно управлять процессами с помощью нескольких кликов. Ниже приведен снимок экрана этого графического интерфейса для приложения, которое мы создали в предыдущей части:

SupervisorSupervisorSupervisor

В мозгу сразу начинает звенеть вопрос. Что делать, если можно было бы контролировать процессы Supervisor программно? Это откроет много возможностей, когда процессы могут быть запущены или остановлены условно, вместо того чтобы запускать их неограниченно или управлять ими вручную, нажимая кнопки или запуская команды терминала. Это очень возможно с использованием API XML-RPC, предоставляемого Supervisor.

API XML-RPC

Сам API довольно прост и легок в использовании. Мы видели, что HTTP-сервер для Supervisor работает по умолчанию на порту 9001. То же самое можно использовать для подключения с использованием любой библиотеки XML-RPC. В случае Python мы можем просто использовать встроенный xmlrpclib. Предполагая, что сервер Supervisor работает на http://localhost:9001/:

1
>>> import xmlrpclib
2
>>> server = xmlrpclib.Server('http://localhost:9001/RPC2')

Чтобы проверить текущее состояние сервера Supervisor, запустите:

1
>>> server.supervisor.getState()
2
{'statename': 'RUNNING', 'statecode': 1}

Демон сервера можно перезапустить и остановить:

1
>>> server.supervisor.restart()
2
>>> server.supervisor.shutdown()

Аналогичным образом можно получить список всех доступных методов:

1
>>> server.system.listMethods()

Ссылка API, содержащаяся в документации Supervisor, довольно проста и понятна. В этом уроке я расскажу о том, как управлять процессами на основе условия, а также о том, как мы можем расширить этот API для реализации наших собственных методов.

Управление процессами с использованием API

Допустим, мы хотим начать новый процесс отправки электронной почты каждый раз, когда какое-либо действие будет выполнено каким-то пользователем. (Существует много способов сделать это, и, возможно, это не самый лучший, но я просто использую его в качестве примера, чтобы продемонстрировать работу). Скажем, имя этого процесса определено в supervisord.conf - send_mail.

1
if user.action_performed:
2
    server.supervisor.startProcess('send_email')

Аналогичным образом, мы также можем инициировать автоматический перезапуск демона сервера supervisord, если у нас есть изменения кода в нашем приложении.

1
if app.code_change():
2
    server.supervisor.restart()

Этот API аналогичным образом можно применять к бесчисленным подобным экземплярам.

Расширение API XML-RPC

Мы можем как использовать стандартные методы API, предоставляемые Supervisor, так и написать наши собственные методы, расширяя API с помощью интерфейсов интерфейса XML-RPC. Это можно сделать, добавив новый раздел [rpcinterface:x] в файле supervisord.conf.

1
[rpcinterface:custom]
2
supervisor.rpcinterface_factory = my_interface:make_custom_rpcinterface

Теперь я создам небольшой интерфейс для него в файле с именем my_interface.py.

1
from supervisor.rpcinterface import SupervisorNamespaceRPCInterface
2
3
4
class CustomRPCInterface:
5
    def __init__(self, supervisord):
6
        self.supervisord = supervisord
7
        self.retries = 3
8
9
    def startProcessOrRetry(self, name, wait=True):
10
        interface = SupervisorNamespaceRPCInterface(self.supervisord)
11
        retry = 0
12
13
        while not interface.startProcess(name) or retry < self.retries:
14
            retry = retry + 1
15
            
16
            
17
# this is not used in code but referenced via an entry point in the conf file

18
def make_custom_rpcinterface(supervisord):
19
    return CustomRPCInterface(supervisord)

Выше я создал метод, который при вызове будет трижды повторять процесс в случае неудачи запуска.

Заключение

В этой серии мы узнали, как использовать Supervisor для мониторинга и управления нашими приложениями. Мы также увидели, как мы можем использовать для веб-интерфейс и XML-RPC. Наконец, интерфейс XML-RPC расширяем, и вы можете использовать все возможности Supervisor для ваших собственных целей.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.