Surveiller et contrôler les applications à l'aide de Supervisor Partie 2

Dans la première partie de cette série de didacticiels en deux parties, nous avons vu comment configurer et contrôler Supervisor pour qu’il fonctionne avec nos applications Web. Dans cette partie, nous verrons comment contrôler par programmation les processus Supervisor à distance via l’API XML-RPC..

Commencer

Dans la partie précédente, nous avons vu que Supervisor fournit une interface graphique basée sur le Web qui nous permet de contrôler à distance les processus à l’aide de quelques clics. Vous trouverez ci-dessous une capture d'écran de cette interface graphique pour l'application créée dans la partie précédente:

Une question commence immédiatement à sonner dans le cerveau. Et s'il était possible de contrôler les processus du superviseur par programmation? Cela ouvrirait de nombreuses possibilités dans lesquelles les processus peuvent être démarrés ou arrêtés de manière conditionnelle plutôt que de les exécuter indéfiniment ou de les contrôler manuellement en cliquant sur des boutons ou en exécutant des commandes de terminal. C’est très possible avec l’API XML-RPC fournie par Supervisor..

L'API XML-RPC

L'API elle-même est assez simple et facile à utiliser. Nous avons vu que le serveur HTTP pour Supervisor fonctionne sur le port 9001 par défaut. La même chose peut être utilisée pour se connecter en utilisant n'importe quelle bibliothèque XML-RPC. Dans le cas de Python, nous pouvons simplement utiliser la fonction intégrée xmlrpclib. En supposant que le serveur Supervisor s'exécute sur http: // localhost: 9001 /:

>>> importer xmlrpclib >>> server = xmlrpclib.Server ('http: // localhost: 9001 / RPC2')

Pour vérifier l'état actuel du serveur Supervisor, exécutez:

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

Le démon du serveur peut être redémarré et arrêté par:

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

De même, la liste de toutes les méthodes disponibles peut être récupérée par:

>>> server.system.listMethods ()

La référence d'API fournie dans la documentation de Supervisor est assez propre et explicite. Dans ce didacticiel, je vais aborder un exemple de la façon de contrôler les processus en fonction d’une condition et également de la manière dont nous pouvons étendre cette API afin de mettre en œuvre nos propres méthodes..

Contrôle des processus à l'aide de l'API

Disons que nous voulons lancer un nouveau processus pour envoyer un courrier électronique chaque fois qu'une action est effectuée par un utilisateur. (Il y a plusieurs façons de faire cela, et peut-être que ce n'est pas la meilleure, mais je l'utilise seulement à titre d'exemple pour le démontrer). Disons le nom de ce processus tel que défini dans supervisord.conf est envoyer un mail.

si user.action_performed: server.supervisor.startProcess ('send_email')

De même, nous pouvons également déclencher un redémarrage automatique du surveillant serveur démon au cas où nous aurions un changement de code dans notre application.

si app.code_change (): server.supervisor.restart ()

Cette API peut également être appliquée à d'innombrables instances.. 

Extension de l'API XML-RPC

Nous pouvons non seulement utiliser les méthodes d'API standard fournies par Supervisor, mais également écrire nos propres méthodes, en étendant l'API en utilisant les fabriques d'interface XML-RPC. Cela peut être fait simplement en ajoutant un nouveau [rpcinterface: x] section dans supervisord.conf.

[rpcinterface: custom] supervisor.rpcinterface_factory = mon_interface: make_custom_rpcinterface

Maintenant, je vais créer une petite interface personnalisée pour la même chose dans un fichier nommé mon_interface.py.

depuis supervisor.rpcinterface import classe SupervisorNamespaceRPCInterface CustomRPCInterface: def __init __ (self, supervisord): self.supervisord = supervisord self.retries = 3 def startProcessOrRetry (self, name, wait = True): interface = SupervisorNamespaceRPCInterface (self.serververvry) alors que pas interface.startProcess (name) ou réessayer < 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)

Ci-dessus, j'ai créé une méthode qui, lorsqu'elle est appelée, relance le processus trois fois en cas d'échec du démarrage..

Conclusion

Dans cette série de didacticiels, nous avons appris à utiliser Supervisor pour surveiller et contrôler nos applications. Nous avons également vu comment nous pouvons utiliser l'interface utilisateur Web et l'interface XML-RPC pour la même chose. Enfin, l’interface XML-RPC est étendue afin de tirer parti de la puissance de Supervisor..