[PYTHON]

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.

outline

Als grobe Prozedur

  1. Holen Sie sich die Basisklasse des Plugins
  2. Erstellen Sie eine konkrete Klasse
  3. Implementierung von Methoden, die für den aus dem Hauptprozess generierten Thread ausgeführt werden
  4. Format der Elemente, die in die Warteschlange gestellt werden sollen
  5. Konfigurationsvalidierungseinstellungen

Es ist so.

  1. Holen Sie sich die Basisklasse des Plugins

Die Basisklasse ist im Amselkörper enthalten,

pip install blackbird

Sie können es leicht bekommen.

  1. Erstellen Sie eine konkrete Klasse

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.

  1. Implementierung von Methoden, die für den aus dem Hauptprozess generierten Thread ausgeführt werden

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.

  1. Format der Elemente, die in die Warteschlange gestellt werden sollen

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.

4.5. Eigentlich müssen Sie den Artikel nicht selbst integrieren www

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

Muss nicht auf der Plugin-Entwicklerseite implementiert werden.

Informationen zur Klasse blackbird.plugins.base.ItemBase

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 mitConcreteItem.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.

  1. Konfigurationsvalidierungseinstellungen

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.

Zusammenfassung

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