[PYTHON] Erstellen eines benutzerdefinierten Suchbefehls für Splunk EventingCommand

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.

Tor

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.

Unterschied zwischen Protokoll der Version 1 und Protokoll der Version 2

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.

  1. Führen Sie das erstellte Skript (Befehl) mit dem Befehl run aus.
  2. Verwenden Sie das Modul "splunk.InterSplunk" intern, anstatt "run" zu verwenden.

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:

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.

Zitiert aus "[Informationen zum Schreiben benutzerdefinierter Suchbefehle --Splunk-Dokumentation](https://docs.splunk.com/Documentation/Splunk/latest/Search/Aboutcustomsearchcommands)"

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.

Vorbereitung

  1. Wenn eine [vorherige] Umgebung (https://qiita.com/msi/items/ca5d3c553bd49d8665ac) vorhanden ist, verwenden Sie diese weiterhin.
  2. Um mit diesem Artikel zu beginnen, laden Sie Schritt 1-2 von GitHub herunter und ändern Sie das Verzeichnis "HelloWorld-work" in "$ SPLUNK_HOME". Kopieren Sie es nach / etc / apps / HelloWorld / `und starten Sie Splunk neu.
  3. Erstellen Sie "$ SPLUNK_HOME / etc / apps / HelloWorld / lib /" und darunter SDK "splunklib" Kopieren. (Sie können die SDK-Bibliothek auch mit 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

Entwicklung von

Eine Datei erstellen

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&nbsp;Ü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__)

Bearbeiten

  1. Ändern Sie alle Teile von% (command.title ()) in ToUpper.
  2. 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&nbsp;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__)

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 () ).

Funktionsprüfung

Funktionsprüfung per Kommandozeile

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

Funktionsprüfung durch Suche

Überprüfen Sie den Vorgang als Splunk-Suchbefehl.

Aufbau

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
searchbnf.conf und default.meta

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

[^ 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 neu

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

Funktionsprüfung

Überprüfen Sie den Vorgang im Suchfenster.

1. Bestätigen Sie generatehello2.

SPL-Anweisung


| generatehello2 count=3
| table greeting

Ausführungsergebnis


greeting
hello, world
hello, world
hello, world
2. Bestätigen Sie das Oberteil.

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.

Zusammenfassung

Recommended Posts

Erstellen eines benutzerdefinierten Suchbefehls für Splunk EventingCommand
Erstellung eines benutzerdefinierten Splunk-Suchbefehls Teil 2
Befehle beim Erstellen von SNS mit Django
Befehle zum Erstellen eines neuen Django-Projekts
Erstellen eines benutzerdefinierten Splunk-Suchbefehls - der erste Schritt
Befehle zum Erstellen einer Python3-Umgebung mit virtualenv
Informationen zum Erstellen und Ändern von benutzerdefinierten Designs für Python IDLE
Jupyter Docker Bildzusammenfassung
Machen Sie Jupyter Lab remote zugänglich
Snippet-Einstellungen für Python Jupyter Notebook
Erstellen Sie mit Docker eine Jupyter Lab (Python) -Umgebung
Jupyter Notebook-Erweiterung, nbextensions-Einstellungen für mich
Die Einstellung für die Amateur-Python-Umgebung (für MAC) wird erstellt
Machen wir das Jupyter Lab einfach zu bedienen
Erstellen eines benutzerdefinierten Suchbefehls für Splunk EventingCommand