[PYTHON] Écrivez votre plugin blackbird # 002

Cette fois, écrivons le plugin Blackbird.Dans le deuxième volet, nous allons vous présenter comment écrire un plugin vraiment simple! L'explication détaillée de chaque méthode est laissée à la troisième puce, elle peut donc être couverte par la première, la deuxième et la troisième balle, respectivement. S'il vous plaît veillez avec des yeux tièdes.

outline

Comme procédure approximative,

  1. Obtenez la classe de base du plugin
  2. Créez une classe concrète
  3. Implémentation de méthodes exécutées sur Thread généré à partir du processus principal
  4. Format des éléments à mettre en file d'attente
  5. Paramètres de validation de la configuration

C'est comme ça.

  1. Obtenez la classe de base du plugin

La classe de base est contenue dans le corps du merle,

pip install blackbird

Vous pouvez facilement y accéder.

  1. Créez une classe concrète

Eh bien, du côté du plug-in, vous créez


# blackbird.plugins.importer le module de base
import blackbird.plugins.base


#Hériter de la classe abstraite JobBase
class ConcreteJob(blackbird.plugins.base.JobBase):
    pass

Si vous spécifiez, la création de la classe concrète est terminée. Pour rappel, ** le nom de la classe est fixe dans ConcreteJob **, donc si vous utilisez un nom de classe différent, cela ne fonctionnera pas.

  1. Implémentation de méthodes exécutées sur Thread généré à partir du processus principal

Lors de la mise d'un élément dans la file d'attente, le processus principal s'attend à pouvoir appeler ** ConcreteJob.build_items **. Au niveau du code


import YOUR_MODULE

YOUR_MODULE.ConcreteJob.build_items()

Si vous ne pouvez pas faire cela, l'élément ne restera pas bloqué dans la file d'attente. Par conséquent ** Assurez-vous d'implémenter la méthode avec le nom build_items **. À ce moment-là, puisque la méthode de mise en file d'attente est implémentée du côté de la classe de base, exécutez la méthode de mise en file d'attente de la classe parente dans build_items ou Si vous souhaitez implémenter la méthode de mise en file d'attente du côté de la classe concrète, remplacez-la ou implémentez la méthode _ \ enqueue. Pour résumer l'histoire jusqu'à présent,


import blackbird.plugins.base


class ConcreteJob(blackbird.plugins.base.JobBase):

    def build_items(self):
        #Les noms des éléments à mettre dans la file d'attente et la file d'attente seront décrits plus tard.
        items = {
            'HOGEHOGE': 'FUGAFUGA'
        }

Je me demande si cela ressemblera à ceci.

  1. Format des éléments à mettre en file d'attente

Ainsi, si vous correspondez au format de l'élément de file d'attente que vous avez réellement mis, l'implémentation est presque complète en tant que fonction. Les éléments à mettre dans la file d'attente sont très simples et adoptent le format dict Python. En particulier


ITEM = {
    'key': 'ANYTHING_OK',
    'value': '1.0000',
    'host': 'HOSTNAME_ON_ZABBIX_SERVER',
    'clock': datetime.datetime()
}

Ça ressemble à ça.

key

key est la clé du modèle zabbix. Par exemple, si vous le connaissez, vous pouvez imaginer quelque chose comme ʻagent.ping`. Donc, si vous spécifiez un nom de clé trop abstrait, il y a de fortes chances qu'il soit submergé, donc il peut être un peu redondant ou long, mais Je me demande si quelque chose qui est facile à identifier est bon.

value

Cette valeur est la valeur réelle que l'expéditeur envoie à la destination (uniquement pour le serveur zabbix pour le moment). Je ne pense pas qu'il soit nécessaire d'expliquer cela, mais 1 ou 0 valeurs de type d'indicateur conviennent, Peu importe qu'il s'agisse d'un point décimal comme 1,234567 ou d'une chaîne de caractères. Cependant, compte tenu de diverses intégrations, je pense qu'il est sûr d'utiliser des fractions flottantes.

host

Puisque nous supposons que le serveur zabbix est la destination maintenant, host est le nom de l'hôte sur le serveur Zabbix. Cela spécifie à quel hôte vous souhaitez envoyer la valeur. Cependant, je pense qu'il est difficile de créer un mécanisme pour injecter de l'extérieur, donc avec la Validation de la configuration décrite plus loin La valeur du nom d'hôte spécifiée dans la configuration en coopération sera entrée ici.

clock

clock est une instance de Python datetime.datetime. C'était également difficile à intégrer du côté du plugin un par un, donc du côté de la classe de base, J'ai défini l'heure à laquelle l'instance a été créée pour qu'elle soit entrée comme valeur de clock.

4.5. En fait, vous n'avez pas à intégrer l'article vous-même www

Je l'ai écrit en 4., donc je pense que c'est une bonne idée, mais Item définit une classe ʻItemBase` qui renvoie un objet dict. Alors

N'a pas besoin d'être implémenté du côté du développeur du plugin.

À propos de la classe blackbird.plugins.base.ItemBase

Comme je l'ai mentionné un peu plus tôt, cette classe est une classe abstraite qui renvoie un objet de type dict. Je n'ai rien fait de particulièrement difficile, j'appelle _generate avec __init __ et j'y génère un dict. Quand j'écris _return _, je crée en fait une méthode getter nommée data `` @ propertyet renvoie le dict avecConcreteItem.data`.

Avez-vous écrit trop en détail ..... L'histoire qui est trop détaillée dans ce domaine est kwsk dans la troisième puce suivante !!

Pour résumer l'histoire jusqu'à présent,

import blackbird.plugins.base

class ConcreteJob(blackbird.plugins.base.JobBase):

    def build_items(self):
        item=ConcreteItem(
           key='isPublished',
           value=1,
           #self.config sera décrit plus tard avec Validation.
           host=self.config.get('hostname')
        )
        self.enqueue(
            item=item
        )

class ConcreteItem(blackbird.plugins.base.ItemBase):

    def __init__(self, key, value, host):
        super(ConcreteItem, self).__init__(key, value, host)

        self.__data = dict()
        self._generate()

    @property
    def data(self):
        return self.__data

    def _generate(self):
        """
Par exemple, si vous souhaitez ajouter un préfixe spécifique à la clé, cela ressemble à ceci
        self.__data['key'] = 'YOUR_PREFIX.' + self.key
Si vous écrivez ici
        """
        self.__data['key'] = self.key
        self.__data['value'] = self.value
        self.__data['host'] = self.host
        self.__data['clock'] = self.clock

Vous pouvez créer un ConcreteItem comme celui-ci, le mettre dans la file d'attente et l'envoyer au plugin zabbix \ _sender.

  1. Paramètres de validation de la configuration

La validation est en fait correcte sans le paramétrer. Si vous l'écrivez dans le fichier de configuration, la clé et la valeur seront dans blackbird.plugins.base.JobBase.config telles quelles Il est stocké en tant qu'objet de type dict. Par exemple

[MY_BLACKBIRD_PLUGIN]
hostname = hogehoge.com
module = MODULE_NAME

Si vous écrivez, vous pouvez accéder à la valeur dans config en faisant simplement self.config ['hostname']. Cependant, vous voulez une valeur obligatoire, c'est donc Validation. L'objet Validation est également intégré du côté de la classe de base, et cela ressemble à l'écriture des paramètres de validation à l'aide d'une chaîne de caractères.

Quand je l'écris,

class Validator(blackbird.plugins.base.ValidatorBase):
    def __init__(self):
        self.__spec = None

    @property
    def spec(self):
        self.__spec = (
            "[0]".format(__name__),
            "required_parameter = string()",
            "not_required_paramter = string(default='DEFAULT_STRING')"
        )
        return self.__spec

C'est comme ça. ** le nom de la classe est fixé à Validator **. J'ai emballé un peu et ça a été déroutant, mais Je laisserai les détails à la troisième puce, mais seulement les points à peu près.

Résumé

Si vous implémentez le contenu dans la mesure où il est, le plugin est en fait terminé.

#Importer un module contenant une classe abstraite pour les plugins de blackbird
import blackbird.plugins.base

#Créer un ConcreteJob qui hérite de la classe abstraite JobBase
#le nom de la classe est fixé à ConcreteJob
class ConcreteJob(blackbird.plugins.base.JobBase):

# build_Étant donné que la méthode items est appelée à partir du processus Main, créez_les éléments sont des noms fixes
    def build_items(self):
        item = self.generate_items()
        self.enqueue(
            item=item
        )

    def generate_items(self)
        return ConcreteItem(
           key='isPublished',
           value=1,
           host=self.config.get('hostname')
        )

class ConcreteItem(blackbird.plugins.base.ItemBase):

    def __init__(self, key, value, host):
        super(ConcreteItem, self).__init__(key, value, host)

        self.__data = dict()
        self._generate()

    @property
    def data(self):
        return self.__data

    def _generate(self):
        self.__data['key'] = self.key
        self.__data['value'] = self.value
        self.__data['host'] = self.host
        self.__data['clock'] = self.clock

class Validator(blackbird.plugins.base.ValidatorBase):
    def __init__(self):
        self.__spec = None

    @property
    def spec(self):
        self.__spec = (
            "[0]".format(__name__),
            "required_parameter = string()",
            "not_required_paramter = string(default='DEFAULT_STRING')"
        )
        return self.__spec


if __name__ == '__main__':
    OPTIONS = {
        'required_parameter': 'HOGEHOGE'
    }
    JOB = ConcreteJob(options=OPTIONS)
    import json
    print(json.dumps(JOB.generate_items))

En résumé, cela ressemble à ceci = 3

Recommended Posts

Écrivez votre plugin blackbird # 002
Écrivez votre plugin blackbird # 001
Écrivez votre plugin blackbird # 003
Ecrire le plugin vim en Python
Ecrire un plugin Vim simple en Python 3