[PYTHON] Erstellung eines benutzerdefinierten Splunk-Suchbefehls Teil 2

Letztes Mal ist der erste Schritt zum Erstellen eines Befehls zum Generieren nur eines Ereignisses, ohne ein Argument als benutzerdefinierten Suchbefehl von Splunk zu verwenden. Hat.

Dieses Mal nehmen wir ein Argument und aktualisieren den Befehl, um die Anzahl der durch das Argument angegebenen Ereignisse zu generieren.

Rückblick bis zum letzten Mal

Letztes Mal: "Erstellung des ersten benutzerdefinierten Splunk-Suchbefehls - erster Schritt --- Qiita"

Ich habe einen benutzerdefinierten Suchbefehl "generatehello" vom Typ "Generierungsbefehle" erstellt.

Bis zum letzten Mal erstellt HelloWorld.py


#!/usr/bin/env python

import sys
import os
import time

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration, Option, validators

@Configuration()
class HelloWorldCommand(GeneratingCommand):
    """ %(synopsis)

    ##Syntax

    %(syntax)

    ##Description

    %(description)

    """
    def generate(self):
        return [{"_time": time.time(), "greeting": "hello, world"}]


dispatch(HelloWorldCommand, sys.argv, sys.stdin, sys.stdout, __name__)

Dieses Programm hat die folgenden Herausforderungen:

Dieses Mal werden wir das lösen. Offizieller Splunk-Blog "[Erstellen benutzerdefinierter Suchbefehle in Python Teil I - Ein einfacher Generierungsbefehl](https://www.splunk.com/en_us/blog/tips-and-tricks/building-custom-search-commands-in- Es basiert auf python-part-ia-simple-generate-command.html) ". (Leicht verändert)

Erste Ausgabe: Angabe der Anzahl der Ereignisse

Hier können Sie die Anzahl der Ereignisse angeben.

Argumentspezifikationsmethode (Empfangsmethode)

Das Argument lautet [Dekorateur](https://qiita.com/msi/items/acfa737842416580deaf#%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82% BFdecorator-% E3% 81% A8% E3% 81% AF) Mit Option angeben.

Hier rufen wir Option einfach als Klasse auf und geben sie an.

Rufen Sie in der erstellten Klasse HelloWorldCommand wie folgt auf.

Option( )


from splunklib.searchcommands import Option

@Configuration()
class HelloWorldCommand(GeneratingCommand):
    count = Option()

Option () legt auch die Verwendung von "count" als Argument für Befehle in SPL-Anweisungen fest, anstatt den Wert einfach in einer Variablen namens "count" zu speichern. Geben Sie in der SPL-Anweisung "| generatehello count = 3" an.

Optionsklasse"Module structure - Python classes | Documentation | Splunk Developer Program"EsgibteineBeschreibungderAPIin"splunklib.searchcommands—SplunkSDKforPythonAPIReference"Obwohl es sich um eine Referenz handelt, handelt es sich um ein Dokument, das schwer zu entschlüsseln ist.

class splunklib.searchcommands.Option(fget=None, fset=None, fdel=None, doc=None, name=None, default=None, require=None, validate=None)

Represents a search command option.

Required options must be specified on the search command line.

Example:

Short form (recommended). When you are satisfied with built-in or custom validation behaviors.

1
2
3
4
5
6
7
8
from splunklib.searchcommands.decorators import Option
from splunklib.searchcommands.validators import Fieldname

total = Option( doc=''' Syntax: total=<fieldname> Description: Name of the field that will hold the computed sum''', require=True, validate=Fieldname())

Die Argumente für "Option ()" sind "class splunklib.searchcommands.Option" (fget = None, fset = None, fdel = None, doc = None, name = None, default = None, require = None, validate = None) Es ist geworden.

fget, fset und fdel sind die Argumente, die innerhalb derOption ()an die Eigenschaft der in Python integrierten Funktion (Decorator) übergeben werden, die referenziert, zugewiesen und freigegeben werden ( del). Geben Sie die Funktion für an, aber für den Moment ist es am besten, sie in der Ecke Ihres Kopfes zu halten. (Wenn Sie es gewohnt sind, die Python-Eigenschaft zu verwenden, wissen Sie es wahrscheinlich.)

"doc", "name", "default", "require" und "validate" sind Argumente, an die man sich erinnern sollte.

Streit Erläuterung
doc Schreiben Sie eine Beschreibung des Arguments.
name Geben Sie den Namen des Arguments an. Wenn nicht angegeben, wird derselbe Name wie der Name der Zuweisungszielvariablen festgelegt.
default Legt den Standardwert fest, wenn das Argument weggelassen wird.
require Legt fest, ob das Argument erforderlich ist. Boolescher Typ(True/False)
validate Legt den Argumenttyp fest.

Wenn ** Name ** weggelassen wird, ist der Name des Suchbefehls derselbe Name wie der Name der Zuweisungszielvariable. Umgekehrt unterscheidet er sich jedoch durch Angabe von ** Name ** vom Variablennamen. Argumentnamen können festgelegt werden.

** validate ** ist in splunklib.searchcommands.validators definiert, aber [SDK](https://github.com/splunk/splunk-sdk-python/blob/master/splunklib/searchcommands/validators] Es scheint, dass es keine andere Wahl gibt, als in .py zu schauen. (Erklärung weggelassen)

Ist definiert. (Beim Lesen mit "import *" nur "Boolean", "Code", "Duration", "File", "Integer", "List", "Map", "RegularExpression", "Set")

Referenziert Blog ), Lassen Sie es uns ein wenig ändern und require = False auf einen ganzzahligen Wert setzen, default = 1.

Streit&nbsp;count&nbsp;Einstellungen von


count = Option(require=False, validate=validators.Integer(), default=1)

Wiederholte Ausgabe

Da count als Argument angegeben wird (Standard ist 1), wird die Ausgabe entsprechend wiederholt.

letztes Mal

        return [{"_time": time.time(), "greeting": "hello, world"}]

Aber dieses Mal möchte ich den Wert zurückgeben, ohne auf die gesamte Verarbeitung zu warten. Anstatt die Liste mit "return" zurückzugeben, werde ich die einzelnen Ereignisse mit Yield zurückgeben.

        for i in range(0, self.count):
            yield {"_time": time.time(), "greeting": "hello, world"}

Das ganze

Nach der Integration bis zu diesem Punkt sieht das Programm folgendermaßen aus: Benennen Sie es in "HelloWorld2.py" um.

Argumente können angegeben werden&nbsp;HelloWorld2.py


#!/usr/bin/env python

import sys
import os
import time

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration, Option, validators

@Configuration()
class HelloWorldCommand(GeneratingCommand):
    """ %(synopsis)

    ##Syntax

    %(syntax)

    ##Description

    %(description)

    """
    count = Option(require=False, validate=validators.Integer(), default=1)

    def generate(self):

        for i in range(0, self.count):
            yield {"_time": time.time(), "greeting": "hello, world"}


dispatch(HelloWorldCommand, sys.argv, sys.stdin, sys.stdout, __name__)

Betriebstest

Führen Sie einen Betriebstest in der Entwicklungsumgebung durch.

HelloWorld2.py&nbsp;Funktionsprüfung


$ python3 HelloWorld2.py __EXECUTE__ count=3 < /dev/null

_time,__mv__time,greeting,__mv_greeting
1584952340.0804844,,"hello, world",
1584952340.0816362,,"hello, world",
1584952340.0816433,,"hello, world",

Installation in Splunk-Umgebung und Funktionsprüfung

Da wir die App das letzte Mal in der Splunk-Umgebung registriert haben, kopieren Sie die geänderte Datei "HelloWorld2.py" nach "helloword / bin". Seien Sie nach wie vor vorsichtig mit Eigentümern, Gruppen und Berechtigungen.

Splunk&nbsp;In die Umgebung kopieren


cp HelloWorld2.py /opt/splunk/etc/apps/helloworld/bin/

Da wir den Namen geändert haben, ändern wir auch default / command.conf. Der Name des benutzerdefinierten Suchbefehls lautet "generatehello2".

commands.conf


# [commands.conf]($SPLUNK_HOME/etc/system/README/commands.conf.spec)
# Configuration for Search Commands Protocol version 2

[generatehello]
filename = HelloWorld.py
chunked = true
python.version = python3

[generatehello2]
filename = HelloWorld2.py
chunked = true
python.version = python3

[Überprüfen Sie mit btool](https://qiita.com/msi/items/02d029d655e1f9285806#btool-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%81%E3% Führen Sie nach dem Ausführen von 82% A7% E3% 83% 83% E3% 82% AF) das Debuggen / Aktualisieren durch oder starten Sie Splunk neu.

Funktionsprüfung auf Splunk

Versuchen Sie, bei der Suche "| generatehello count = 3" einzugeben.

image.png

Es wurden 3 Ereignisse ausgegeben.

Zweite Herausforderung: Ausgabe von "Hallo Welt" -Ereignissen

Bisher befindet sich links im Teil "Verwandte Felder" eine Begrüßung, und wenn ich darauf klicke, werden die Wörter "Hallo Welt" angezeigt, jedoch nicht in der Ereignisanzeige.

Dies kann angezeigt werden, indem das Feld "_raw" explizit angegeben wird. Hier setzen wir einfach das Gleiche wie Begrüßung in _raw und geben es aus.

_raw&nbsp;Feldeinstellungen


        greeting_msg = "hello, world"
        for i in range(0, self.count):
            yield {"_time": time.time(), "greeting": greeting_msg, "_raw": greeting_msg}

Das Ganze ist wie folgt.

_raw&nbsp;Ich stelle das Feld ein&nbsp;HelloWorld2.py


#!/usr/bin/env python

import sys
import os
import time

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
    dispatch, GeneratingCommand, Configuration, Option, validators

@Configuration()
class HelloWorldCommand(GeneratingCommand):
    """ %(synopsis)

    ##Syntax

    %(syntax)

    ##Description

    %(description)

    """
    count = Option(require=False, validate=validators.Integer(), default=1)

    def generate(self):

        greeting_msg = "hello, world"
        for i in range(0, self.count):
            yield {"_time": time.time(), "greeting": greeting_msg, "_raw": greeting_msg}


dispatch(HelloWorldCommand, sys.argv, sys.stdin, sys.stdout, __name__)

Überprüfen Sie wie im ersten Fall den Vorgang in der Entwicklungsumgebung → Kopieren Sie in die Splunk-Umgebung → Überprüfen Sie mit btool → Überprüfen Sie mit der Suche nach Splunk.

Funktionsprüfung in der Entwicklungsumgebung


$ python3 HelloWorld2.py __EXECUTE__ count=3 < /dev/null

_time,__mv__time,greeting,__mv_greeting,_raw,__mv__raw
1584954369.7098827,,"hello, world",,"hello, world",
1584954369.7099497,,"hello, world",,"hello, world",
1584954369.7099597,,"hello, world",,"hello, world",

Beachten Sie, dass das Feld "_raw" zunimmt.

Splunk&nbsp;In die Umgebung kopieren


cp HelloWorld2.py /opt/splunk/etc/apps/helloworld/bin/

($ SPLUNK_HOME = / opt / splunk)

Überprüfen Sie den Vorgang, indem Sie nach Splunk suchen. (" | generatehello2 count = 3 ")

image.png

Es wird jetzt im Feld Ereignisse angezeigt.

Zusammenfassung

Putzen Sie den Befehl "Benutzerdefinierte Suche generieren", der im vorherigen "Splunk-Befehl für benutzerdefinierte Suche (Befehl für benutzerdefinierte Suche) - Erster Schritt --- Qiita" erstellt wurde. Es wurde hochgeladen.

Wenn Sie dies tun können, ist es einfacher, mit den Eventing-Befehlen fortzufahren.

Recommended Posts

Erstellung eines benutzerdefinierten Splunk-Suchbefehls Teil 2
Erstellen eines benutzerdefinierten Splunk-Suchbefehls - der erste Schritt
Erstellen eines benutzerdefinierten Suchbefehls für Splunk EventingCommand
[Linux] Suchbefehl
Erstellen Sie Befehlsverknüpfungen unter Ubuntu 16.04
Erstellen Sie benutzerdefinierte Regeln mit ElastAlert
Erstellen Sie benutzerdefinierte Django-Befehle und führen Sie sie über die Befehlszeile aus