Erstellen Sie einen benutzerdefinierten Suchbefehl vom Typ EventingCommand for Splunk. Im folgenden Artikel haben wir einen GeneratingCommand erstellt.
Erstellen Sie dieses Mal einen EventingCommand.
Was ist "EventingCommand"? Für diejenigen, die sagen: "[Vier Arten von benutzerdefinierten Suchbefehlen](https://qiita.com/msi/items/02d029d655e1f9285806#%E3%82%AB%E3%82%B9%E3%82%BF] % E3% 83% A0% E3% 82% B5% E3% 83% BC% E3% 83% 81% E3% 82% B3% E3% 83% 9E% E3% 83% B3% E3% 83% 89% E3 % 81% AE4% E3% 81% A4% E3% 81% AE% E7% A8% AE% E9% A1% 9E) ". In Bezug auf die Entwicklungsumgebung wird die Erklärung von SDK usw. weggelassen.
Erstellen wir einen Befehl "toupper", der die vorherige Ausgabe "Hallo, Welt" übernimmt und alle Zeichen in Großbuchstaben konvertiert.
SPL Beispiel
| generatehello2 | toupper greeting ← "greeting"Ist der Feldname
Das Äquivalent von evals Upper () wird durch Feldspezifikation konvertiert.
Bevor wir beginnen, schreiben wir über die Suchbefehlsprotokolle Version 1 und Version 2.
Es gibt verschiedene einführende Artikel zum Erstellen benutzerdefinierter Suchbefehle für Python, aber ich verwende hauptsächlich die folgenden Techniken.
run
aus.Diese unterscheiden sich im Umgang mit Ein- und Ausgängen, es gibt jedoch keine grundlegenden Unterschiede. Die erste kann in jeder Form durchgeführt werden, die von Splunk aus aufgerufen werden kann. Der zweite verwendet "splunk.InterSplunk" für die Eingabe und Ausgabe.
Diese Verwendungen werden im Protokoll Version 1 oder auf herkömmliche Weise als Legacy-Protokoll bezeichnet.
text:commands.conf.spec
chunked = [true|false]
* If set to "true", this command supports the new "chunked" custom
search command protocol.
* If set to "true", the only other commands.conf settings supported are
'is_risky', 'maxwait', 'maxchunksize', 'filename', 'command.arg.<N>', and
'run_in_preview'.
* If set to "false", this command uses the legacy custom search command
protocol supported by Intersplunk.py.
* Default: false
Zitiert aus "command.conf --Splunk Documentation"
Wenn Sie Version 1 verwenden, setzen Sie chuncked = false in der Einstellung command.conf oder belassen Sie die Standardeinstellung und belassen Sie sie als false.
Verwenden Sie andererseits bei Verwendung des neuen benutzerdefinierten Suchbefehls von Version 2 die Klasse "EventingCommand" "TransformingComannd" "GeneratingCommand" "StreamingCommand", ohne splunk.InterSplunk zu verwenden.
Die Unterschiede zwischen dem Protokoll der Version 1 und dem Protokoll der Version 2 sind wie folgt:
Zitiert aus "[Informationen zum Schreiben benutzerdefinierter Suchbefehle --Splunk-Dokumentation](https://docs.splunk.com/Documentation/Splunk/latest/Search/Aboutcustomsearchcommands)"About the protocols
Version 2 protocol
There are significant advantages to using the Version 2 of the Custom Search Command protocol.
With the Version 2 protocol, external programs process through an entire set of Splunk search results in one invocation. The external program is invoked once for the entire search, greatly reducing runtime overhead. The Version 2 protocol requires fewer configuration attributes than the Version 1 protocol. Supports non-Python custom search commands, for example C++, Go, Java and JavaScript (Node.js). Support for platform-specific executable files and binaries. You can write custom search commands in compiled languages, such as C++, on multiple platforms.Version 1 protocol
The Version 1 of the Custom Search Command protocol processes events in groups, using 50,000 events for each group. The external program is invoked and terminated multiple times for large result sets.
Mit v2 werden neben Python mehr Sprachen unterstützt, aber der größte Unterschied besteht darin, dass das Programm nicht alle 50.000 Ereignisse aufgerufen wird. Umgekehrt startet ** v1 alle 50.000 Ereignisse ** einen benutzerdefinierten Suchbefehl **, was sich positiv auf die Leistung auswirkt. Wenn Sie Ereignisse verarbeiten, die 50.000 nicht überschreiten, gibt es keinen Unterschied zwischen ihnen. In Splunk überschreitet die Anzahl der Ereignisse jedoch sofort 50.000. Wenn Sie sie also erstellen möchten, verwenden Sie nicht "splunk.InterSPlunk", Version 2 Es ist eine gute Idee zu verwenden.
In diesem Artikel erstellen wir einen benutzerdefinierten Suchbefehl unter Verwendung des Protokolls der Version 2.
pip3 install -t lib / splunk-sdk
installieren.)Die Struktur der Verzeichnisse und Dateien ist wie folgt.
${SPLUNK_HOME}/etc/apps/
HelloWorld/
├─ bin
│ ├─ HelloWorld.py
│ ├─ HelloWorld2.py
│ ├─ filter.py
│ ├─ generate.py
│ ├─ report.py
│ └─ stream.py
├─ default
│ ├─ app.conf
│ ├─ commands.conf
│ └─ data
│ └─ ui
│ └─ nav
│ └─ default.xml
├─ lib
│ ├─ splunk_sdk-1.6.12.dist-info
│ │ (Dieses Verzeichnis existiert, wenn Sie mit pip installiert haben.)
│ └─ splunklib
│ ├─ __init__.py
│ ... (Kürzung)
└─ metadata
└─ default.meta
Erstellen Sie "ToUpper.py", indem Sie "filter.py" unter "bin /" kopieren.
cd bin/
cp filter.py ToUpper.py
Die ursprüngliche filter.py
ist eine Vorlage für EventingCommand, scheint jedoch nicht beibehalten zu werden und kann nicht wie sie ist verwendet werden. (SDK v1.6.12)
ToUpper.py
#!/usr/bin/env python
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
dispatch, StreamingCommand, Configuration, Option, validators
@Configuration()
class %(command.title())Command(EventingCommand):
""" %(synopsis)
##Syntax
%(syntax)
##Description
%(description)
"""
def transform(self, events):
# Put your event transformation code here
pass
dispatch(%(command.title())Command, sys.argv, sys.stdin, sys.stdout, __name__)
Ändern Sie den Teil "StreamingCommand" beim Import in "EventingCommand".
diff
--- filter.py
+++ ToUpper.py
@@ -5,8 +5,8 @@
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
- dispatch, StreamingCommand, Configuration, Option, validators
+ dispatch, EventingCommand, Configuration, Option, validators
ToUpper.py Überarbeitet
#!/usr/bin/env python
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
dispatch, EventingCommand, Configuration, Option, validators
@Configuration()
class %(command.title())Command(EventingCommand):
""" %(synopsis)
##Syntax
%(syntax)
##Description
%(description)
"""
def transform(self, events):
# Put your event transformation code here
pass
dispatch(%(command.title())Command, sys.argv, sys.stdin, sys.stdout, __name__)
transform ()
ist ein erforderlicher Körper, also fügen Sie diesem Teil eine Verarbeitung hinzu. (Erklärung wird später beschrieben)diff
--- ToUpper.py.orig
+++ ToUpper.py
@@ -9,7 +9,7 @@
@Configuration()
-class %(command.title())Command(EventingCommand):
+class ToUpperCommand(EventingCommand):
""" %(synopsis)
##Syntax
@@ -23,6 +23,11 @@
"""
def transform(self, events):
# Put your event transformation code here
- pass
+ for event in events:
+ for field in self.fieldnames:
+ if field in event:
+ event[field] = event[field].upper()
+ yield event
+ return
-dispatch(%(command.title())Command, sys.argv, sys.stdin, sys.stdout, __name__)
+dispatch(ToUpperCommand, sys.argv, sys.stdin, sys.stdout, __name__)
ToUpper.py Nach dem Update
#!/usr/bin/env python
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from splunklib.searchcommands import \
dispatch, EventingCommand, Configuration, Option, validators
@Configuration()
class ToUpperCommand(EventingCommand):
""" %(synopsis)
##Syntax
%(syntax)
##Description
%(description)
"""
def transform(self, events):
# Put your event transformation code here
for event in events:
for field in self.fieldnames:
if field in event:
event[field] = event[field].upper()
yield event
return
dispatch(ToUpperCommand, sys.argv, sys.stdin, sys.stdout, __name__)
transform ()
ist eine erforderliche Methode von EventingCommand
und wird von dispatcher
aufgerufen.option = xxxx
) werden als Liste an self.fieldnames
übergeben.event [field]
oben).Das ist das Element von EventingCommand.
Im obigen Beispiel wird für jedes Ereignis (für Ereignis in Ereignissen:
) für jedes angegebene Feld (für Feld in self.fieldnames:
) in Großbuchstaben konvertiert und neu zugewiesen (Ereignis"). [Feld] = Ereignis [Feld] .upper ()
).
Überprüfen Sie den Vorgang in der von Splunk getrennten Befehlszeile.
Geben Sie zum lokalen Ausführen __EXECUTE__
an und führen Sie es aus.
python3 ToUpper.py __EXECUTE__ </dev/nul
Wenn keine Fehler vorliegen, ist dies erfolgreich.
Da für die Eingabe / dev / null
angegeben ist, gibt es keine Ausgabe, aber tatsächlich wird bei der Eingabe nichts angezeigt.
Versuchen Sie es mit dem zuvor erstellten HelloWorld2.py
.
$ python3 HelloWorld2.py __EXECUTE__ count=3 < /dev/null # HelloWorld2.Funktionsprüfung nur mit py
_time,__mv__time,greeting,__mv_greeting,_raw,__mv__raw
1589160289.7283704,,"hello, world",,"hello, world",
1589160289.7284214,,"hello, world",,"hello, world",
1589160289.7284305,,"hello, world",,"hello, world",
$ python3 HelloWorld2.py __EXECUTE__ count=3 < /dev/null | python3 ToUpper.py __EXECUTE__ greeting
$← Kehren Sie zur Eingabeaufforderung zurück, ohne etwas anzuzeigen.
Hinweis: Ich konnte keine Möglichkeit finden, es in der Befehlszeile anzuzeigen. Wenn jemand davon weiß, würde ich es begrüßen, wenn Sie es unterrichten könnten.
Sie können vorerst überprüfen, ob ein Fehler vorliegt.
Überprüfen Sie den Vorgang als Splunk-Suchbefehl.
Wenn Sie die bereitgestellten Informationen ändern möchten, erstellen Sie eine Datei im Verzeichnis "local /" und legen Sie sie fest. Ändern Sie diesmal jedoch die Datei unter "default /" ..
commands.conf
Bearbeiten Sie default / command.conf
.
--- commands.conf.orig
+++ commands.conf
@@ -10,3 +10,8 @@
filename = HelloWorld2.py
chunked = true
python.version = python3
+
+[toupper]
+filename = ToUpper.py
+chunked = true
+python.version = python3
default/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
[toupper]
filename = ToUpper.py
chunked = true
python.version = python3
Setzen Sie diesmal searchbnf.conf
und default.meta
als Tipps.
Erstellen Sie eine neue searchbnf.conf
.
searchbnf.conf
[toupper-command]
syntax = toupper <field-list>
description = toupper command to transfer into upper cases by the specify fields.\
This is a long description.
shortdesc = make fields contents to upper cases.
usage = public
Siehe: searchbnf.conf --Splunk-Dokumentation
[toupper-command]
ist der toupper-Teil der in command.conf
festgelegte Suchbefehlsname, und der -command
-Teil ist fest [^ 1].[^ 1]: Abgesehen davon besteht die UNIX-Roff-Konvention darin, den variablen Teil kursiv zu schreiben. Das Schlechte an MarkDown-Notation und HTML ist, dass Sie italic nicht in "quote" schreiben können, um den variablen Teil anzugeben. Es ist schwer zu sagen, welches ein variables Zeichen und welches ein festes Zeichen ist, deshalb muss ich es jedes Mal erklären. Im Gegenteil, es kann schwierig sein, das Dokument allein ohne Erklärung zu verstehen.
Nehmen Sie zusätzliche Einstellungen für searchbnf
zu metadata / default.meta
vor.
--- default.meta.orig
+++ default.meta
@@ -1,2 +1,5 @@
[]
access = read: [ * ], write : [ admin ]
+
+[searchbnf]
+export = system
metadata/default.meta
[]
access = read: [ * ], write : [ admin ]
[searchbnf]
export = system
Starten Sie splunkd
[^ 2] neu.
[^ 2]: Nicht sicher, ob es durch Debuggen / Aktualisieren aktiviert wird.
sudo ${SPLUNK_HOME}/bin/splunk restart
Oder wenn mit systemctl eingestellt
sudo systemctl restart Splunkd
Überprüfen Sie den Vorgang im Suchfenster.
SPL-Anweisung
| generatehello2 count=3
| table greeting
Ausführungsergebnis
greeting
hello, world
hello, world
hello, world
SPL-Anweisung
| generatehello2 count=3
| table greeting
| toupper greeting
Ausführungsergebnis
greeting
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
Der Kleinbuchstabe wurde erfolgreich in den Großbuchstaben konvertiert.
EventingCommand
.Recommended Posts