Derzeit sind js und CSS alle in der HTML-Vorlagendatei geschrieben, aber ich möchte diese später als statische Datei trennen. Es scheint jedoch, dass es einen weiteren Ansturm um die Einstellung von weißem Rauschen geben wird. Ich habe das Gefühl, dass GCP in diesem Bereich einfacher zu sein scheint. Python, DjangoWrite your blackbird plugin # 002 Dieses Mal schreiben wir das Blackbird Plugin. In der zweiten Folge zeigen wir Ihnen, wie man ein wirklich einfaches Plugin schreibt! Die ausführliche Erläuterung jeder Methode bleibt dem dritten Aufzählungszeichen überlassen, sodass sie mit dem ersten Aufzählungszeichen, dem zweiten Aufzählungszeichen bzw. dem dritten Aufzählungszeichen abgedeckt werden kann. Bitte wache mit lauwarmen Augen.
Als grobe Prozedur
Es ist so.
Die Basisklasse ist im Amselkörper enthalten,
pip install blackbird
Sie können es leicht bekommen.
Nun, auf der Plug-In-Seite erstellen Sie
# blackbird.plugins.Basismodul importieren
import blackbird.plugins.base
#Erben Sie die abstrakte JobBase-Klasse
class ConcreteJob(blackbird.plugins.base.JobBase):
pass
Wenn Sie angeben, ist die Erstellung der konkreten Klasse abgeschlossen. Zu beachten ist, dass ** der Klassenname in ConcreteJob festgelegt ist **. Wenn Sie also einen anderen Klassennamen verwenden, funktioniert dies nicht.
Wenn Sie ein Element in die Warteschlange stellen, erwartet der Hauptprozess, dass er ** ConcreteJob.build_items ** aufrufen kann. Code-weise
import YOUR_MODULE
YOUR_MODULE.ConcreteJob.build_items()
Wenn Sie dies nicht tun können, bleibt das Element nicht in der Warteschlange hängen. Daher ** Stellen Sie sicher, dass Sie die Methode mit dem Namen build_items ** implementieren. Führen Sie zu diesem Zeitpunkt, da die Enqueue-Methode auf der Basisklassenseite implementiert ist, entweder die Enqueue-Methode der übergeordneten Klasse in build_items oder aus Wenn Sie die Enqueue-Methode auf der konkreten Klassenseite implementieren möchten, überschreiben Sie sie entweder oder implementieren Sie die _ \ enqueue-Methode. Um die bisherige Geschichte zusammenzufassen:
import blackbird.plugins.base
class ConcreteJob(blackbird.plugins.base.JobBase):
def build_items(self):
#Elementnamen, die in Warteschlange und Warteschlange eingefügt werden sollen, werden später beschrieben.
items = {
'HOGEHOGE': 'FUGAFUGA'
}
Ich frage mich, ob es so aussehen wird.
Wenn Sie also dem Format des tatsächlich eingegebenen Warteschlangenelements entsprechen, ist die Implementierung als Funktion fast abgeschlossen. Die Elemente, die in die Warteschlange gestellt werden sollen, sind sehr einfach und verwenden das Python-Diktatformat. Speziell
ITEM = {
'key': 'ANYTHING_OK',
'value': '1.0000',
'host': 'HOSTNAME_ON_ZABBIX_SERVER',
'clock': datetime.datetime()
}
Es sieht aus wie das.
key
key ist der Schlüssel in der zabbix-Vorlage. Wenn Sie beispielsweise damit vertraut sind, können Sie sich so etwas wie "agent.ping" vorstellen. Wenn Sie also einen zu abstrakten Schlüsselnamen angeben, besteht eine hohe Wahrscheinlichkeit, dass er überfordert ist, sodass er möglicherweise etwas redundant oder lang ist Ich frage mich, ob etwas, das leicht zu identifizieren ist, gut ist.
value
Dieser Wert ist der tatsächliche Wert, den der Absender an das Ziel sendet (derzeit nur für den zabbix-Server). Ich denke nicht, dass es notwendig ist, so viel zu erklären, aber 1 oder 0 Flag-Typ-Werte sind in Ordnung, und Es spielt keine Rolle, ob es sich um einen Dezimalpunkt wie 1.234567 oder eine Zeichenfolge handelt. Angesichts verschiedener Integrationen halte ich es jedoch für sicher, schwebende Brüche zu verwenden.
host
Da wir jetzt davon ausgehen, dass der Zabbix-Server das Ziel ist, ist Host der Name des Hosts auf dem Zabbix-Server. Dies gibt an, an welchen Host Sie den Wert senden möchten. Ich denke jedoch, dass es schwierig ist, einen Mechanismus zum Injizieren von außen zu erstellen, daher mit der später beschriebenen Validierung der Konfiguration Hier wird der in config in Zusammenarbeit angegebene Wert des Hostnamens eingegeben.
clock
clock ist eine "datetime.datetime" -Instanz von Python. Dies war auch mühsam auf der Plugin-Seite nacheinander zu integrieren, also auf der Basisklassenseite, Ich habe die Zeit, zu der die Instanz erstellt wurde, als Wert für "clock" festgelegt.
Ich habe es in 4. geschrieben, daher halte ich es für eine gute Idee, aber Item definiert eine ItemBase-Klasse, die ein diktiertes Objekt zurückgibt. Damit
datetime.datetime
-Instanz mit der festgelegten Erfassungszeit erstellt werdenself.config
den Inhalt der Konfigurationsdatei im Diktatformat.Muss nicht auf der Plugin-Entwicklerseite implementiert werden.
Wie ich bereits erwähnt habe, handelt es sich bei dieser Klasse um eine abstrakte Klasse, die ein Objekt vom Typ dict zurückgibt.
Ich habe nichts besonders Schwieriges getan, ich rufe "_generate" mit "__init __" auf und generiere ein Diktat darin.
Wenn ich _return _ schreibe, erstelle ich tatsächlich eine Getter-Methode mit dem Namen data `` @ propertyund gebe das Diktat mit
ConcreteItem.data` zurück.
Haben Sie zu viel im Detail geschrieben? Die Geschichte, die in diesem Bereich zu detailliert ist, ist kwsk in der nächsten dritten Kugel!
Um die bisherige Geschichte zusammenzufassen:
import blackbird.plugins.base
class ConcreteJob(blackbird.plugins.base.JobBase):
def build_items(self):
item=ConcreteItem(
key='isPublished',
value=1,
#self.Die Konfiguration wird später zusammen mit der Validierung beschrieben.
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):
"""
Wenn Sie beispielsweise dem Schlüssel ein bestimmtes Präfix hinzufügen möchten, sieht dies folgendermaßen aus
self.__data['key'] = 'YOUR_PREFIX.' + self.key
Wenn Sie hier schreiben
"""
self.__data['key'] = self.key
self.__data['value'] = self.value
self.__data['host'] = self.host
self.__data['clock'] = self.clock
Sie können ein ConcreteItem wie dieses erstellen, es in die Warteschlange stellen und an das Plugin zabbix \ _sender senden.
Die Validierung ist tatsächlich in Ordnung, ohne sie festzulegen. Wenn Sie es in die Konfigurationsdatei schreiben, befinden sich der Schlüssel und der Wert unverändert in "blackbird.plugins.base.JobBase.config" Es wird als Objekt vom Typ dikt gespeichert. Zum Beispiel
[MY_BLACKBIRD_PLUGIN]
hostname = hogehoge.com
module = MODULE_NAME
Wenn Sie schreiben, können Sie auf den Wert in config zugreifen, indem Sie einfach "self.config ['hostname']" ausführen. Sie möchten jedoch einen erforderlichen Wert, also Validierung. Das Validierungsobjekt ist auch auf der Seite der Basisklasse integriert, und es scheint, als würden Sie die Validierungseinstellungen mit einer Zeichenfolge schreiben.
Wenn ich es tatsächlich schreibe,
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
Es ist so. ** Klassenname ist auf Validator ** festgelegt. Ich habe ein bisschen gepackt und es wurde verwirrend, aber Ich werde die Details der dritten Kugel überlassen, aber nur die Punkte grob.
Validator.spec
zugänglich sein[]
von __spec
eingeschlossene Abschnittsname muss der Name des Plugin-Moduls selbst sein__name__
port = integer(0, 65535, default=80)
__spec
mit docstring angeben, aber angesichts der Integration der Formatmethode ist es einfacher, eine Zeichenfolge mit Tupel zu übergeben und eine mehrzeilige Zeichenfolge zu verwenden.Wenn Sie den Inhalt so weit wie er ist implementieren, ist das Plugin tatsächlich abgeschlossen.
#Importieren Sie ein Modul mit einer abstrakten Klasse für Plugins aus Blackbird
import blackbird.plugins.base
#Erstellen Sie einen ConcreteJob, der die abstrakte JobBase-Klasse erbt
#Der Klassenname ist auf ConcreteJob festgelegt
class ConcreteJob(blackbird.plugins.base.JobBase):
# build_Da die items-Methode vom Hauptprozess aufgerufen wird, erstellen Sie_Elemente sind feste Namen
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))
Zusammenfassend sieht es so aus = 3
Recommended Posts