Créez une commande de recherche personnalisée de type EventingCommand pour Splunk. Dans l'article ci-dessous, nous avons créé un GeneratingCommand.
Cette fois, créez un EventingCommand.
Qu'est-ce que "EventingCommand"? Pour ceux qui disent: "[Quatre types de commandes de recherche personnalisées](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) ". En ce qui concerne l'environnement de développement, l'explication du SDK, etc. est omise.
Créons une commande toupper
qui prend la sortie précédente" hello, world
" et convertit tous les caractères en majuscules.
SPL Exemple
| generatehello2 | toupper greeting ← "greeting"Est le nom du champ
L'équivalent de upper () d'eval est converti par la spécification de champ.
Avant de commencer, écrivons sur les protocoles de commande de recherche Version 1 et Version 2.
Il existe divers articles d'introduction sur la création de commandes de recherche personnalisées pour Python, mais j'utilise principalement les techniques suivantes.
run
.splunk.InterSplunk
en interne au lieu d'utiliser run
.Ceux-ci diffèrent dans la façon dont ils traitent les entrées et les sorties, mais il n'y a pas de différences fondamentales.
Le premier peut être fait sous n'importe quelle forme qui peut être appelée depuis splunk.
Le second utilise splunk.InterSplunk
pour l'entrée et la sortie.
Ces utilisations sont appelées dans le protocole Version 1 ou de manière traditionnelle appelée protocole hérité.
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
Extrait de "commands.conf --Splunk Documentation"
Si vous utilisez la version 1, définissez chuncked = false dans le paramètre commands.conf, ou laissez la valeur par défaut et laissez la valeur false.
D'autre part, lorsque vous utilisez la nouvelle commande de recherche personnalisée de la version 2, utilisez la classe de ʻEventingCommand
TransformingComannd
GeneratingCommand`` StreamingCommand` sans utiliser splunk.InterSplunk.
Les différences entre le protocole version 1 et le protocole version 2 sont les suivantes:
Cité de "[À propos de l'écriture des commandes de recherche personnalisées - Documentation Plunk](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.
Avec la v2, plus de langages seront pris en charge en plus de Python, mais la plus grande différence est que le programme ne sera pas appelé tous les 50 000 événements. À l'inverse, ** v1 lance une commande de recherche personnalisée tous les 50 000 événements **, ce qui fait une différence dans les performances.
Si vous gérez des événements qui ne dépassent pas 50000, il n'y a pas de différence entre eux, mais dans Splunk, le nombre d'événements dépassera immédiatement 50000, donc si vous voulez le faire à partir de maintenant, v2 sans utiliser splunk.InterSPlunk
C'est une bonne idée à utiliser.
Dans cet article, nous allons créer une commande de recherche personnalisée à l'aide du protocole de la version 2.
$ SPLUNK_HOME / etc / apps / HelloWorld / lib /
et sous celui-ci SDK splunklib
Copie.
(Vous pouvez également installer la bibliothèque SDK avec pip3 install -t lib / splunk-sdk
.)La structure des répertoires et des fichiers est la suivante.
${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
│ │ (Ce répertoire existe si vous avez installé avec pip.)
│ └─ splunklib
│ ├─ __init__.py
│ ... (réduction)
└─ metadata
└─ default.meta
Créez ToUpper.py
en copiant filter.py
sousbin /
.
cd bin/
cp filter.py ToUpper.py
L'original filter.py
est un modèle pour EventingCommand, mais il ne semble pas être maintenu et ne peut pas être utilisé tel quel. (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__)
Modifiez la partie qui est StreamingCommand
lors de l'importation en ʻ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 modifié
#!/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__)
% (command.title ())
en ToUpper
.transform ()
est un corps obligatoire, alors ajoutez un traitement à cette partie. (L'explication sera décrite plus tard)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 Après la mise à jour
#!/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 ()
est une méthode obligatoire de ʻEventingCommand et est appelée par
dispatcher`.transform ()
(ici, ʻevents`) est une liste de chaque événement.) sont passés sous forme de liste à
self.fieldnames`.C'est l'élément d'EventingCommand.
Dans l'exemple ci-dessus, pour chaque événement (for event in events:
), pour chaque champ spécifié (for field in self.fieldnames:
), convertissez-le en majuscules et réaffectez-le (ʻévénement). [champ] = événement [champ] .upper () `).
Vérifiez l'opération sur la ligne de commande séparée de Splunk.
Pour exécuter localement, spécifiez «EXECUTE» et exécutez.
python3 ToUpper.py __EXECUTE__ </dev/nul
S'il n'y a pas d'erreurs, c'est réussi.
Puisque / dev / null
est spécifié pour l'entrée, il n'y a pas de sortie, mais en fait, rien n'est affiché lorsque l'entrée est effectuée.
Essayons d'utiliser le HelloWorld2.py
précédemment créé.
$ python3 HelloWorld2.py __EXECUTE__ count=3 < /dev/null # HelloWorld2.Contrôle de fonctionnement avec py seul
_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
$← Revenir à l'invite de commande sans rien afficher.
Remarque: je n'ai pas trouvé de moyen de l'afficher sur la ligne de commande. Si quelqu'un le sait, j'apprécierais que vous puissiez l'enseigner.
Pour le moment, vous pouvez vérifier les éventuelles erreurs.
Vérifiez l'opération en tant que commande de recherche Splunk.
Si vous voulez modifier ce qui est fourni, créez un fichier dans le répertoire local /
et définissez-le, mais cette fois, du point de vue de "provider", changez le fichier sous default /
..
commands.conf
Editez default / commands.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
chunked = true
.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
Cette fois, définissez «searchbnf.conf» et «default.meta» comme Astuces.
Créez un nouveau 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
Voir: searchbnf.conf --Splunk Documentation
[toupper-command]
, la partie toupper est le nom de la commande de recherche défini dans commands.conf
, et la partie -command
est fixe [^ 1].[^ 1]: En passant, la convention roff UNIX est d'écrire la partie variable en italique. La mauvaise chose à propos de la notation MarkDown et du HTML est que vous ne pouvez pas écrire italic dans \ quote \
pour indiquer la partie variable. Il est difficile de dire quel est un caractère variable et quel est un caractère fixe, je dois donc l'expliquer à chaque fois. Au contraire, il peut être difficile de comprendre à partir du seul document sans explication.
Définissez des paramètres supplémentaires pour searchbnf
sur metadata / default.meta
.
--- 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
Redémarrez splunkd
[^ 2].
[^ 2]: Je ne sais pas s'il sera activé par le débogage / actualisation.
sudo ${SPLUNK_HOME}/bin/splunk restart
Ou, si défini avec systemctl
sudo systemctl restart Splunkd
Vérifiez l'opération dans la fenêtre de recherche.
Déclaration SPL
| generatehello2 count=3
| table greeting
Résultat d'exécution
greeting
hello, world
hello, world
hello, world
Déclaration SPL
| generatehello2 count=3
| table greeting
| toupper greeting
Résultat d'exécution
greeting
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
Les minuscules ont été converties avec succès en majuscules.
Recommended Posts