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.
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)
Hier können Sie die Anzahl der Ereignisse angeben.
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 Fieldnametotal = 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)
Boolean()
..... *Code()
..... *Duration()
..... *Fieldname()
File()
..... *Integer()
..... *List()
..... *Map()
..... *Match()
OptionName()
RegularExpression()
..... *Set()
..... *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 count Einstellungen von
count = Option(require=False, validate=validators.Integer(), default=1)
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"}
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 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__)
Führen Sie einen Betriebstest in der Entwicklungsumgebung durch.
HelloWorld2.py 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",
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 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.
Versuchen Sie, bei der Suche "| generatehello count = 3" einzugeben.
Es wurden 3 Ereignisse ausgegeben.
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 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 Ich stelle das Feld ein 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 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
")
Es wird jetzt im Feld Ereignisse angezeigt.
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