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.
Comme procédure approximative,
C'est comme ça.
La classe de base est contenue dans le corps du merle,
pip install blackbird
Vous pouvez facilement y accéder.
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.
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.
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
.
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
datetime.datetime
avec l'heure d'acquisition définieself.config
contient le contenu écrit dans le fichier de configuration au format dict.N'a pas besoin d'être implémenté du côté du développeur du plugin.
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 avec
ConcreteItem.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.
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.
Validator.spec
__name__
string ()
, ce sera un paramètre obligatoire car il n'y a pas de valeur par défaut.string (default = 'HOGEHOGE')
, la valeur par défaut sera une chaîne de caractères appelée HOGEHOGE, donc elle sera facultative.port = integer(0, 65535, default=80)
__spec
avec docstring, mais compte tenu de l'intégration de la méthode format, il est plus facile de passer une chaîne avec tuple et d'utiliser une chaîne multiligne.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