Статьи

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

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

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

Руководитель

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

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

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

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

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

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

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

Аналогично, список всех доступных методов можно получить с помощью:

1
>>> server.system.listMethods()

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

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

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

Точно так же мы можем также запустить автоматический перезапуск демона supervisord server в случае изменения кода в нашем приложении.

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

Этот API также может применяться к бесчисленному числу таких случаев.

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
from supervisor.rpcinterface import SupervisorNamespaceRPCInterface
 
 
class CustomRPCInterface:
    def __init__(self, supervisord):
        self.supervisord = supervisord
        self.retries = 3
 
    def startProcessOrRetry(self, name, wait=True):
        interface = SupervisorNamespaceRPCInterface(self.supervisord)
        retry = 0
 
        while not interface.startProcess(name) or retry < self.retries:
            retry = retry + 1
             
             
# this is not used in code but referenced via an entry point in the conf file
def make_custom_rpcinterface(supervisord):
    return CustomRPCInterface(supervisord)

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

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