[PYTHON] Création d'une commande de recherche personnalisée Splunk, partie 2

Dernière fois est la première étape pour créer une commande pour générer un seul événement sans prendre d'argument comme commande de recherche personnalisée de Splunk. Fait.

Cette fois, nous allons prendre un argument et brosser la commande pour générer le nombre d'événements spécifié par l'argument.

Revoir jusqu'à la dernière fois

Dernière fois: "Création de la commande de recherche personnalisée Splunk - Première étape --- Qiita"

J'ai créé une commande de recherche personnalisée generatehello de type Generating commands.

Créé jusqu'à la dernière fois 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__)

Ce programme présente les défis suivants:

Cette fois, nous allons résoudre ce problème. Blog officiel Splunk "[Création de commandes de recherche personnalisées en Python partie I - Une simple commande de génération](https://www.splunk.com/en_us/blog/tips-and-tricks/building-custom-search-commands-in- Il est basé sur python-part-ia-simple-generate-command.html) ". (Légèrement changé)

Premier problème: spécifier le nombre d'événements

Vous permet de spécifier le nombre d'événements.

Méthode de spécification d'argument (méthode de réception)

L'argument est [décorateur](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) Spécifiez avec l'option.

Ici, nous allons simplement appeler Option en tant que classe et la spécifier.

Dans la classe HelloWorldCommand créée, appelez-la comme suit.

Option( )


from splunklib.searchcommands import Option

@Configuration()
class HelloWorldCommand(GeneratingCommand):
    count = Option()

Option () définit également l'utilisation de count comme argument des commandes dans les instructions SPL, plutôt que de simplement stocker la valeur dans une variable appelée count. Dans l'instruction SPL, spécifiez «| generatehello count = 3».

Classe d'option"Module structure - Python classes | Documentation | Splunk Developer Program"Ilyaunedescriptiondel'APIdans"splunklib.searchcommands—SplunkSDKforPythonAPIReference"Bien qu'il s'agisse d'une référence, c'est un document difficile à déchiffrer.

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 Fieldname

total = Option( doc=''' Syntax: total=<fieldname> Description: Name of the field that will hold the computed sum''', require=True, validate=Fieldname())

L'argument de ʻOption () est class splunklib.searchcommands.Option (fget = None, fset = None, fdel = None, doc = None, name = None, default = None, require = None, validate = None) ` Il est devenu.

fget, fset et fdel sont des arguments qui sont passés à la fonction intégrée Python (décorateur) property dans ʻOption () , et sont référencés, assignés et libérés ( del`), respectivement. Spécifiez la fonction pour, mais pour l'instant, il est préférable de la garder dans le coin de votre tête. (Si vous êtes habitué à utiliser la propriété Python, vous le savez probablement.)

doc, name, default, require et validate sont des arguments à retenir.

argument La description
doc Écrivez une description de l'argument.
name Spécifiez le nom de l'argument. S'il est omis, le même nom que le nom de la variable de destination d'affectation est défini.
default Définit la valeur par défaut lorsque l'argument est omis.
require Définit si l'argument est obligatoire. type booléen(True/False)
validate Définit le type d'argument.

Si ** nom ** est omis, le même nom que le nom de la variable de destination de l'affectation sera le nom de l'argument de la commande de recherche, mais inversement, en spécifiant ** nom **, il sera différent du nom de la variable. Les noms d'argument peuvent être définis.

** validate ** est défini dans splunklib.searchcommands.validators, mais [SDK](https://github.com/splunk/splunk-sdk-python/blob/master/splunklib/searchcommands/validators] Il semble qu'il n'y ait pas d'autre choix que de regarder dans .py). (Explication omise)

Est défini. (Lorsqu'il est lu avec ʻimport * , uniquement Boolean, Code, Duration, File, ʻInteger, List, Map, RegularExpression, Set)

Référencé blog, Changeons-le un peu et définissons require = False sur une valeur entière, default = 1.

argument&nbsp;count&nbsp;paramètres de


count = Option(require=False, validate=validators.Integer(), default=1)

Sortie répétée

Puisque count est donné comme argument (la valeur par défaut est 1), la sortie est répétée en conséquence.

dernière fois

        return [{"_time": time.time(), "greeting": "hello, world"}]

Mais cette fois, je veux retourner la valeur sans attendre tout le traitement, donc au lieu de renvoyer la liste avec return, je retournerai les événements individuels avec yield.

        for i in range(0, self.count):
            yield {"_time": time.time(), "greeting": "hello, world"}

L'ensemble

Après l'intégration jusqu'à ce point, le programme ressemble à ceci: Renommez-le en «HelloWorld2.py».

Les arguments peuvent être spécifiés&nbsp;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__)

Test de fonctionnement

Effectuez un test de fonctionnement dans l'environnement de développement.

HelloWorld2.py&nbsp;Contrôle de fonctionnement


$ 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",

Installation dans l'environnement Splunk et contrôle de fonctionnement

Depuis que nous avons enregistré l'application dans l'environnement Splunk la dernière fois, copiez le HelloWorld2.py modifié dans helloword / bin. Comme auparavant, faites attention aux propriétaires, aux groupes et aux autorisations.

Splunk&nbsp;Copier dans l'environnement


cp HelloWorld2.py /opt/splunk/etc/apps/helloworld/bin/

Depuis que nous avons changé le nom, nous modifions également default / commands.conf. Le nom de la commande de recherche personnalisée est «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

[Vérifiez avec btool](https://qiita.com/msi/items/02d029d655e1f9285806#btool-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%81%E3% Après avoir effectué 82% A7% E3% 83% 83% E3% 82% AF), effectuez le débogage / actualisation ou redémarrez Splunk.

Contrôle de fonctionnement sur Splunk

Essayez de taper «| generatehello count = 3» dans la recherche.

image.png

3 événements ont été émis.

Deuxième défi: sortie de l'événement "bonjour, monde"

Jusqu'à présent, il y a un message d'accueil dans la partie" Champs associés "à gauche, et lorsque je clique dessus, les mots" bonjour, monde "apparaissent, mais pas dans l'affichage des événements.

Cela peut être affiché en spécifiant explicitement le champ _raw. Ici, nous mettons simplement la même chose que le message d'accueil dans _raw et le sortons.

_raw&nbsp;Paramètres de terrain


        greeting_msg = "hello, world"
        for i in range(0, self.count):
            yield {"_time": time.time(), "greeting": greeting_msg, "_raw": greeting_msg}

L'ensemble est le suivant.

_raw&nbsp;Je mets le terrain&nbsp;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__)

Comme dans le premier cas, vérifiez le fonctionnement dans l'environnement de développement → copiez dans l'environnement Splunk → vérifiez avec btool → vérifiez avec la recherche de Splunk.

Contrôle de fonctionnement dans l'environnement de développement


$ 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",

Notez que le champ _raw augmente.

Splunk&nbsp;Copier dans l'environnement


cp HelloWorld2.py /opt/splunk/etc/apps/helloworld/bin/

($ SPLUNK_HOME = / opt / splunk)

Vérifiez le fonctionnement en recherchant Splunk. (" | generatehello2 count = 3 ")

image.png

Il est maintenant affiché dans le champ Evénements.

Résumé

Brossez la commande de recherche personnalisée de type Commandes de génération créée dans la précédente "Commande de recherche personnalisée Splunk (commande de recherche personnalisée) création-première étape --- Qiita" Il a été téléchargé.

Si vous pouvez le faire, il sera plus facile de passer aux commandes Eventing.

Recommended Posts

Création d'une commande de recherche personnalisée Splunk, partie 2
Création d'une commande de recherche personnalisée Splunk - la première étape -
Création d'une commande de recherche personnalisée pour Splunk EventingCommand
[Linux] Commande de recherche
Créer des raccourcis de commande sur Ubuntu 16.04
Créez des règles personnalisées avec ElastAlert
Créez des commandes Django personnalisées et exécutez-les à partir de la ligne de commande