[PYTHON] Création d'une commande de recherche personnalisée pour Splunk EventingCommand

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.

objectif

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.

Différence entre le protocole version 1 et le protocole version 2

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.

  1. Exécutez le script (commande) créé à l'aide de la commande run.
  2. Utilisez le module 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:

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.

Cité de "[À propos de l'écriture des commandes de recherche personnalisées - Documentation Plunk](https://docs.splunk.com/Documentation/Splunk/latest/Search/Aboutcustomsearchcommands)"

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.

Préparation

  1. S'il existe un environnement précédent, continuez à l'utiliser.
  2. Pour commencer avec cet article, téléchargez step1-2 depuis GitHub et changez le répertoire «HelloWorld-work» en «$ SPLUNK_HOME. Copiez-le dans / etc / apps / HelloWorld / ʻet redémarrez Splunk.
  3. Créez $ 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

développement de

Créer un fichier

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

Éditer

  1. Modifiez toutes les parties % (command.title ()) en ToUpper.
  2. 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&nbsp;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__)

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

Contrôle de fonctionnement

Contrôle de fonctionnement par ligne de commande

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.

Contrôle de fonctionnement par recherche

Vérifiez l'opération en tant que commande de recherche Splunk.

Réglage

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

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 et default.meta

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

[^ 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émarrer

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

Contrôle de fonctionnement

Vérifiez l'opération dans la fenêtre de recherche.

1. Confirmez generatehello2.

Déclaration SPL


| generatehello2 count=3
| table greeting

Résultat d'exécution


greeting
hello, world
hello, world
hello, world
2. Confirmez toupper.

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.

Résumé

Recommended Posts

Création d'une commande de recherche personnalisée pour Splunk EventingCommand
Création d'une commande de recherche personnalisée Splunk, partie 2
Commandes lors de la création de SNS avec Django
Commandes pour créer un nouveau projet django
Création d'une commande de recherche personnalisée Splunk - la première étape -
Commandes pour créer un environnement python3 avec virtualenv
À propos de la création et de la modification de thèmes personnalisés pour Python IDLE
Résumé de l'image Jupyter Docker
Rendre Jupyter Lab accessible à distance
Paramètres d'extrait de code pour le notebook jupyter python
Créer un environnement Jupyter Lab (Python) avec Docker
Extension Jupyter Notebook, paramètres nbextensions pour moi-même
Le paramètre d'environnement Python amateur (pour MAC) est en cours de création
Rendons le laboratoire Jupyter facile à utiliser
Création d'une commande de recherche personnalisée pour Splunk EventingCommand