Utilisez le SDK Splunk pour créer une commande de recherche personnalisée.
On dit qu'il y a un document, mais il est difficile à comprendre, je vais donc résumer la destination de référence et la procédure.
Dans un premier temps, créez une commande de recherche personnalisée generatehello
[^ 2] qui renvoie" hello, world "[^ 1].
[^ 1]: En lettres basses, en l'honneur de Kernighan & Ritchie. [^ 2]: Il s'agit d'une commande dite native qui utilise le framework du Splunk SDK au lieu d'appeler le script en utilisant run. Pour savoir comment créer un script en utilisant la commande run comme commande de recherche personnalisée, "Comment créer une commande de recherche personnalisée (Splunk) --Qiita" sera utile. Je vais.
: point_up_tone3: C'est un peu vieux, mais le contenu est toujours valide Blog officiel de 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] -et-astuces / construction-commandes-de-recherche-personnalisées-en-partie-python-ia-commande-de-génération-simple.html) Elle est basée sur "[^ 3]. Cependant, cet article adopte une approche ascendante.
[^ 3]: Dans le blog d'avril 2014, il est dit "Partie I", mais il semble que le blog "Partie II" ait été supprimé ou non publié.
Affiche "hello, world" dans l'instruction SPL | generatehello count = 3
et le nombre d'événements spécifié dans l'argument count (3 événements dans cet exemple).
Pour l'instant, créons une simple commande de recherche personnalisée qui ne prend aucun argument.
Guide de développement"Develop apps | Documentation | Splunk Developer Program"Cependant, il est souvent déroutant de lire ceci, donc je vais organiser les termes.
le terme | explication facile |
---|---|
App(s) | Pièce d'affichage(UI)、Add-sur, toute l'application, y compris les commandes de recherche personnalisées Application en une seule, mais applications(UPS)Est souvent appelé au pluriel. $SPLUNKHOME/etc/apps/ Il est organisé en unités de répertoires ci-dessous. |
Add-on(s) | Pièce d'affichage(UI)Une partie ou la totalité de l'application sans |
Custom Search Command | Votre propre programme appelé comme commande SPL. Généralement configuré dans le cadre de l'application. |
Dans cet article, il est décrit comme «SPLUNKHOME = / opt / splunk» [^ 5].
[^ 5]: En passant, il semble que certains fichiers soient codés en dur comme SPLANKHOME = / opt / splunk_home. La destination de distribution est / opt / splunk, vous pouvez donc trébucher un peu.
Téléchargez le SDK Splunk, extrayez-le et définissez le répertoire de développement.
référence: Create custom search commands | Documentation | Splunk Developer Program Voir: Downloads | Splunk Developer Program Voir aussi: GitHub --splunk / splunk-sdk-python: Kit de développement logiciel Splunk pour Python Voir aussi: Releases · splunk / splunk-sdk-python · GitHub
Le document décrit également comment installer avec pip [^ 4], mais cette fois je n'utiliserai pas l'environnement virtuel Python et n'installerai pas pip. Téléchargez et utilisez le fichier .zip ou .tar.gz.
[^ 4]: cd $ SPLUNKHOME / etc / apps / yourapp / bin; pip install -t. Splunk-sdk, etc. Développement et test dans, et introduction à Splunk.
: point_up_tone3: De «Releases · splunk / splunk-sdk-python · GitHub» au dernier (actuellement 1.6.12) .zip Téléchargez et décompressez le fichier ou le fichier .tar.gz.
Splunk SDK Téléchargez et décompressez
$ wget https://github.com/splunk/splunk-sdk-python/archive/1.6.12.tar.gz
...
2020-03-17 01:50:38 (3.12 MB/s) - ‘1.6.12.tar.gz’ saved [3876452]
$ ls
1.6.12.tar.gz
$ tar xvfz 1.6.12.tar.gz
splunk-sdk-python-1.6.12/
splunk-sdk-python-1.6.12/.gitattributes
...
splunk-sdk-python-1.6.12/utils/cmdopts.py
$
(Il y a setup.py dans le répertoire extrait, mais je ne vais pas l'utiliser cette fois.)
HelloWorld-work /
,
cp -rp splunk-sdk-python-1.6.12/examples/searchcommands_template HelloWorld-work
HelloWorld-work / lib /
mkdir HelloWorld-work/lib
splunklib
en dessous.
cp -rp splunk-sdk-python-1.6.12/splunklib/ HelloWorld-work/lib/
HelloWorld-work Installer
$ cp -rp splunk-sdk-python-1.6.12/examples/searchcommands_template HelloWorld-work
$ mkdir HelloWorld-work/lib
$ cp -rp splunk-sdk-python-1.6.12/splunklib/ HelloWorld-work/lib/
$
Vous avez maintenant une structure de répertoires comme celle ci-dessous.
HelloWork-work Arborescence des répertoires
HelloWorld-work/
|-- bin
| |-- filter.py ................ Eventing commands (Voir ci-dessous)Modèle.
| |-- generate.py .............. Generating commands (Voir ci-dessous)Modèle.
| |Cette fois, nous utiliserons ce fichier.
| |-- report.py ................ Reporting commands (Voir ci-dessous)Modèle.
| `-- stream.py ................ Streaming commands (Voir ci-dessous)Modèle.
|-- default ......................Le répertoire qui stocke le fichier de configuration par défaut du fournisseur.
| |-- app.conf .................Correct lors du réglage de Splunk.
| |-- commands-scpv1.conf ......Supprimez ce fichier.
| |-- commands-scpv2.conf ......Commande ce fichier lors de la configuration de Splunk.Remplacez par conf.
| |Finalement, il sera supprimé.
| |-- commands.conf ............Lors de la configuration de Splunk
| |Commandez ce fichier-scpv2.Remplacez par conf et corrigez.
| |-- data
| | `-- ui
| | `-- nav
| | `-- default.xml .. [Réglage]-[Interface utilisateur]-[Le menu de navigation]-[default]
| |Il s'agit de la configuration d'affichage de l'application affichée dans.
| `-- logging.conf .............Cette fois, supprimez ce fichier.
|-- lib ..........................Répertoire de la bibliothèque référencé comme PYTHONPATH.
| |Cet emplacement n'est pas fixe, mais il est recommandé dans la documentation officielle.
| |Si vous avez ajouté un package qui n'est pas inclus dans splunklib dans l'environnement virtuel Python
| | site-packages/Vous devez mettre la bibliothèque ci-dessous.
| `-- splunklib ................Identique au SDK splunklib. Appelez-le avec import splunklib.
| |-- __init__.py
: :
: :
| `-- six.pyc
`-- metadata
`-- default.meta .............référence/L'autorisation d'écriture est spécifiée.
12 directories, 79 files
Cette structure de répertoire imite la structure du répertoire $ SPLUNKHOME / etc / apps / yourapplication /. Vous pouvez vous inscrire en tant qu'application en supprimant les fichiers inutiles et en les copiant dans $ SPLUNKHOME / etc / apps / tels quels.
: point_up_tone3: Il y a default /
et local /
dans le répertoire du fichier de configuration, le répertoire default /
est le paramètre par défaut du fournisseur, et l'utilisateur est le répertoire local /
(ou le répertoire sinon). C'est une règle de définir uniquement les modifications (en créant).
Cette fois, le développeur est le fournisseur, donc modifiez directement le fichier de paramètres dans le répertoire default /
.
Avant de commencer à créer des commandes de recherche personnalisées, parlons des types.
référence: Create custom search commands | Documentation | Splunk Developer Program référence: Python classes | Documentation | Splunk Developer Program
: point_up_tone3: Il existe quatre types de commandes de recherche personnalisées.
The core of the search commands module contains four classes:
- EventingCommand: Defines a search command that applies a transformation to search results as they travel through the events pipeline. Examples of eventing commands include sort, dedup, and cluster.
- GeneratingCommand: Defines a search command that generates event records based on command arguments. Examples of generating commands include search (at the beginning of the pipeline), inputcsv, input lookup, and metadata.
- ReportingCommand: Defines a search command that processes search results and generates a reporting data structure. Examples of reporting commands include stats, top, and timechart.
- StreamingCommand: Defines a search command that applies a transformation to search results as they travel through the processing pipeline. Examples of streaming commands include search, eval, and where.
L'explication simple est la suivante.
type | explication facile | Lieu d'exécution | Exemple de commande |
---|---|---|---|
Eventing commands | Une commande qui reçoit une entrée, la traite et la sort | Tête de recherche uniquement | sort, dedup, cluster |
Generating commands | ContributionNon reçu, Commande de sortie | Tête de recherche uniquement | (Écrit au début)search, inputcsv, input lookup, metadata |
Reporting commands | Commande pour recevoir les entrées et les traiter au format de rapport | Tête de recherche uniquement | stats, top, timechart |
Streaming commands | Commandes de traitement et de sortie dans un environnement distribué | L'indexeur est également possible en parallèle | search, eval, where |
Il peut être difficile de faire la distinction entre les commandes Eventing et les commandes Streaming, à la différence que les commandes Eventing ne peuvent être exécutées que dans Search Head, tandis que les commandes Streaming peuvent également être exécutées dans Indexer [^ 7]. (Voir aussi "Types de commandes" pour plus d'informations)
[^ 7]: Il existe également une commande appelée "Commandes de streaming avec état" qui ne peut être exécutée que par Search Head ... Qu'est-ce qui ne va pas ...
Dans un premier temps, nous allons créer des ** commandes de génération ** sans aucune entrée.
référence: Templates - Create custom search commands | Documentation | Splunk Developer Program
Des modèles sont disponibles pour chacun des quatre types. Parcourez le modèle Generating comannds.
Génération de modèle de commandes --generate.py
Il se trouve dans ʻexamples / searchcommands_template / bin / generate.pydans le répertoire Splunk SDK, mais sous
bin /` dans le répertoire de travail que vous avez configuré.
generate.py
1 #!/usr/bin/env python
2
3 import sys
4 import os
5
6 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
7 from splunklib.searchcommands import \
8 dispatch, GeneratingCommand, Configuration, Option, validators
9
10 @Configuration()
11 class %(command.title())Command(GeneratingCommand):
12 """ %(synopsis)
13
14 ##Syntax
15
16 %(syntax)
17
18 ##Description
19
20 %(description)
21
22 """
23 def generate(self):
24 # Put your event code here
25 pass
26
27 dispatch(%(command.title())Command, sys.argv, sys.stdin, sys.stdout, __name__)
generate.py
( .... / HellWorld-work / bin /../ lib
= .... / HelloWorld-work / lib
) Est ajouté à sys.path.
Appelez le module splunklib
sous cette lib.
Ce que nous pouvons voir, c'est que Splunk ne définit pas automatiquement lib /
sur PYTHONPATH.
Si vous souhaitez ajouter votre propre bibliothèque, vous devez définir sys.path, mais si vous utilisez ce modèle, vous pouvez le charger en le plaçant dans le répertoire lib.% (command.title ())
en un nom approprié.
(Puisqu'il apparaît sur la 27ème ligne, remplacez-le par la même chaîne de caractères)
La classe GeneratingCommand est spécifiée comme classe de base.% ()
par une partie appropriée si possible, mais cette fois, elle sera omise.generate ()
doit être un itérateur (voir ci-dessous).% (command.title ())
par la même chaîne qui apparaît à la ligne 11.Copiez le modèle generate.py
dans HelloWorld.py
et modifiez le nom de la commande, etc.
Remplacez % (command.title ())
aux lignes 11 et 27 par HelloWorld
.
Vous pouvez utiliser un éditeur, mais il peut être plus facile de le corriger avec sed.
sed Correction en utilisant
$ sed -e 's/%(command.title())/HelloWorld/' generate.py > HelloWorld.py
$ diff generate.py HelloWorld.py
11c11
< class %(command.title())Command(GeneratingCommand):
---
> class HelloWorldCommand(GeneratingCommand):
27c27
< dispatch(%(command.title())Command, sys.argv, sys.stdin, sys.stdout, __name__)
---
> dispatch(HelloWorldCommand, sys.argv, sys.stdin, sys.stdout, __name__)
$
Modifiez le champ appelé salutation pour renvoyer un seul "bonjour, monde".
Le type à renvoyer est un type de dictionnaire. À ce stade, Splunk utilise souvent l'heure comme clé, alors définissez l'heure dans le champ _time
.
De plus, comme je l'ai écrit ci-dessus, generate () doit être de type iterate. : point_up_tone3: Il y a deux façons de faire cela.
Tout d'abord, une seule entrée sera renvoyée, alors essayons-la avec return. Insérez ʻimport time () `sur la ligne 5 pour ajouter l'heure, et modifiez les parties des lignes 24 et 25 comme suit:
1 #!/usr/bin/env python
2
3 import sys
4 import os
5 import time # _Nouvelle importation pour régler l'heure
6
7 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
8 from splunklib.searchcommands import \
9 dispatch, GeneratingCommand, Configuration, Option, validators
10
11 @Configuration()
12 class HelloWorldCommand(GeneratingCommand):
13 """ %(synopsis)
14
15 ##Syntax
16
17 %(syntax)
18
19 ##Description
20
21 %(description)
22
23 """
24 def generate(self):
25 return [{"_time": time.time(), "greeting": "hello, world"}] #Notez que c'est une liste
26
27
28 dispatch(HelloWorldCommand, sys.argv, sys.stdin, sys.stdout, __name__)
La 25ème ligne met l'heure dans le champ _time
, met" hello, world "dans le champ greeting
et retourne sous forme de liste.
Vous pouvez vérifier l'opération avec python3 HelloWorld.py __EXCECUTE__ </ dev / null
, mais si vous l'exécutez telle quelle, une erreur se produira.
Erreur est survenue
$ python3 --version
Python 3.6.9
$ python3 HelloWorld.py __EXECUTE__ < /dev/null
Traceback (most recent call last):
File "HelloWorld.py", line 8, in <module>
from splunklib.searchcommands import \
File "../lib/splunklib/searchcommands/__init__.py", line 145, in <module>
from .environment import *
File "../lib/splunklib/searchcommands/environment.py", line 120, in <module>
splunklib_logger, logging_configuration = configure_logging('splunklib')
File "../lib/splunklib/searchcommands/environment.py", line 103, in configure_logging
fileConfig(filename, {'SPLUNK_HOME': splunk_home})
File "/usr/lib/python3.6/logging/config.py", line 84, in fileConfig
handlers = _install_handlers(cp, formatters)
File "/usr/lib/python3.6/logging/config.py", line 131, in _install_handlers
hlist = cp["handlers"]["keys"]
File "/usr/lib/python3.6/configparser.py", line 959, in __getitem__
raise KeyError(key)
KeyError: 'handlers'
$
Il s'agit d'une erreur lors de la lecture du fichier .conf.
Je vais lire les fichiers dans le répertoire default /
, mais comme je n'ai rien défini pour le moment, les caractères du modèle sont toujours là.
Dans cet article, nous supprimerons une fois les fichiers inutiles, en supposant que nous effectuerons les réglages nécessaires.
La cible cette fois est logging.conf. (Les mots-clés de dépannage sont ʻin configure_logginget
KeyError: 'handlers`` dans l'erreur ci-dessus.)
Supprimez logging.conf dans le répertoire default /
. (Si vous souhaitez le restaurer, copiez-le à nouveau à partir du répertoire SDK.)
logging.conf Effacer
$ rm ../default/logging.conf
$ ls ../default/
app.conf commands-scpv1.conf commands-scpv2.conf commands.conf data
$
Exécutez le test dans l'environnement de développement.
python3 HelloWorld.py __EXECUTE__ < /dev/null
Il peut être exécuté avec la séquence de commandes.
: point_up_tone3: __EXECUTE__
est deux traits de soulignement ( _
) avant et après ʻEXECUTE`.
Même s'il s'agit d'une commande de génération, elle attendra l'entrée standard [^ 6], spécifiez donc / dev / null comme entrée.
[^ 6]: Lorsqu'il est exécuté sur Splunk, Splunk renseigne les méta-informations pour le traitement par la bibliothèque Splunk.
Essai
$ python3 --version
Python 3.6.9
$ python3 HelloWorld.py __EXECUTE__ < /dev/null
_time,__mv__time,greeting,__mv_greeting
1584528442.0660899,,"hello, world",
$
Les champs inconnus «__mv__time» et «__mv_greeting» ont été ajoutés, que la bibliothèque Splunk ajoute automatiquement. Ici, assurez-vous que le «_time» et le «message d'accueil» prévus sont affichés.
Installons-le (enregistrons) sur Splunk et exécutons-le.
Modifiez ʻapp.confet
commands.conf dans le répertoire
default /`.
Voir: app.conf --Splunk Documentation
Le modèle ʻapp.conf` ressemble à ceci:
app.conf
1 # Splunk app configuration file
2
3 [ui]
4 label = %(app_label)<= Corrigez cela par le nom de l'application.
5 is_visible = 1
6
7 [launcher]
8 description = %(app_description)
9 author = %(app_author)
10 version = %(app_version)
11
12 [package]
13 id = %(app_id)
14
15 [install]
16 is_configured = 0
Vous pouvez installer la commande de recherche personnalisée seule, mais elle sera définie dans le répertoire système, alors définissez le nom sur label
pour l'enregistrer en tant que nouvelle application.
Ici, c'est "Hello World". D'autres parties doivent être modifiées, mais elles n'affectent pas le fonctionnement de la commande de recherche personnalisée, laissez-les donc telles quelles.
*** app.conf.orig 2020-03-18 20:00:07.303785404 +0900
--- app.conf 2020-03-18 20:00:18.943809800 +0900
***************
*** 1,7 ****
# Splunk app configuration file
[ui]
! label = %(app_label)
is_visible = 1
[launcher]
--- 1,7 ----
# Splunk app configuration file
[ui]
! label = Hello World
is_visible = 1
[launcher]
Après modification app.conf
# Splunk app configuration file
[ui]
label = Hello World
is_visible = 1
[launcher]
description = %(app_description)
author = %(app_author)
version = %(app_version)
[package]
id = %(app_id)
[install]
is_configured = 0
commands.conf
Voir: commands.conf-Splunk Documentation
C'est commandes.conf
qui définit la commande de recherche personnalisée.
Sous le répertoire default /
, il y a trois fichiers: commands.conf
, commands-scpv1.conf
, et commands-scpv2.conf
. Deux modèles sont disponibles car il existe des versions v1 et v2 du protocole dans lesquelles la commande de recherche personnalisée interagit avec Splunk. Le modèle, commands.conf
, a le contenu de la v1.
À proprement parler, il est nécessaire d'examiner quel protocole utiliser, mais je pense que ce sera la version v2 à l'avenir, alors copiez commandes-scpv2.conf
dans commands.conf
et modifiez-le.
commands-scpv2.conf copie de
$ cp commands-scpv2.conf commands.conf
$
commands.conf (v2) modèle
1 # [commands.conf]($SPLUNK_HOME/etc/system/README/commands.conf.spec)
2 # Configuration for Search Commands Protocol version 2
3
4 [%(command.lower()]
5 filename = %(command.lower()).py
6 chunked = true
Si le nom de commande appelé depuis SPL et le nom de fichier à l'exclusion de .py
sont identiques, il n'est pas nécessaire de définir filename
, mais cette fois le nom de la commande à appeler est generatehello
et le nom de fichier est HelloWorld.py
. Alors, réglez-le.
De plus, comme je l'ai écrit au début, Python3 est utilisé, alors faites ce paramètre. : point_up_tone3: lors de l'utilisation de Python3
python.version = python3
Mettre en place.
Après réécriture commands.conf
1 # [commands.conf]($SPLUNK_HOME/etc/system/README/commands.conf.spec)
2 # Configuration for Search Commands Protocol version 2
3
4 [generatehello]
5 filename = HelloWorld.py
6 chunked = true
7 python.version = python3
J'ai écrit le nom de l'application dans ʻapp.conf`, donc peu importe le répertoire dans lequel vous l'installez, tant que le nom du répertoire ne correspond pas aux autres applications de Splunk. Ici, appelons cela «helloworld». Supprimez les fichiers de configuration inutiles avant l'installation (copie).
: point_up_tone3: Le répertoire d'installation se trouve sous $ SPLUNKHOME / etc / apps /
. Copiez l'intégralité du répertoire HelloWorld-work /
. À ce stade, faites attention au propriétaire et aux autorisations du fichier. Soyez particulièrement prudent si vous exécutez Splunk en tant que non-root.
$ rm HelloWorld-work/default/commands-scpv[12].conf; sudo sh -c "cp -rp HelloWorld-work /opt/splunk/etc/apps/helloworld; chown -R splunk:splunk /opt/splunk/etc/apps/helloworld"
$ ls -ld /opt/splunk/etc/apps/helloworld/{*,}
drwxr-xr-x 6 splunk splunk 4096 Mar 18 07:52 /opt/splunk/etc/apps/helloworld/
drwxr-xr-x 2 splunk splunk 4096 Mar 18 09:33 /opt/splunk/etc/apps/helloworld/bin
drwxr-xr-x 3 splunk splunk 4096 Mar 18 11:43 /opt/splunk/etc/apps/helloworld/default
drwxr-xr-x 3 splunk splunk 4096 Mar 18 07:52 /opt/splunk/etc/apps/helloworld/lib
drwxr-xr-x 2 splunk splunk 4096 Feb 13 23:30 /opt/splunk/etc/apps/helloworld/metadata
$
Voir: Utiliser btool pour dépanner les configurations - Documentation Plunk
Utilisez btool pour vérifier que le fichier de configuration est correct.
$SPLUNKHOME/bin/splunk btool check
S'il n'y a pas de problème, rien ne sera affiché, mais si quelque chose ne va pas, l'écran suivant apparaîtra. (Exemple de modification accidentelle de python.version
en ython.version
)
Affichage en cas de problème avec le fichier de paramètres
$ sudo su splunk -c "/opt/splunk/bin/splunk btool check"
Invalid key in stanza [generatehello] in /opt/splunk/etc/apps/helloworld/default/commands.conf, line 7: ython.version (value: python3).
$
Avec l'option --debug
, vous obtiendrez beaucoup de messages même pour de bons fichiers de configuration.
Les paramètres sont chargés sur http (s): // _ yourURL_ / debug / refresh, donc le redémarrage est fondamentalement inutile, mais s'il ne se charge pas, redémarrez Splunk.
Enfin, exécutez-le sur Splunk. Sélectionnez «Hello World» dans l'application et entrez la commande dans la fenêtre de recherche.
|generatehello
Ça a marché.
Le message d'accueil n'apparaît pas comme un "événement" car les données générées ne contiennent pas de champ «_raw».
Si vous cliquez sur la partie salutation
du menu à gauche, vous verrez que" bonjour, monde "est affiché.
Si vous voulez le sortir explicitement, spécifiez le champ avec table
etc. et il sera affiché.
Si vous pensez que quelque chose est étrange, consultez le journal des travaux.
L'exemple ci-dessus est un exemple de levée d'une exception pour le test.
Jusqu'à ici pour cette fois. Si vous pouvez faire le premier pas, il sera plus facile de passer à l'étape suivante.
| generatehello count = 3
, cette fois j'ai créé une commande sans arguments pour n'afficher qu'un seul événement.La prochaine fois, je réviserai la commande et la terminerai. ⇒ J'ai écrit ce qui suit "Création de commande de recherche personnalisée Splunk partie 2-Qiita".
Cliquez ici pour un exemple du programme Splunk SDK → [splunk-sdk-python / generatehello.py at master · splunk / splunk-sdk-python · GitHub](https://github.com/splunk/splunk-sdk-python/blob /master/examples/searchcommands_app/package/bin/generatehello.py)
[Ajouté le 04/05/2020] Un exemple de code a été publié sur GitHub → Splunk-CustomSearchCommand-FirstStep at step1
Recommended Posts