Splunkのカスタムサーチコマンドを作ってみた。
はじめに
データアナリティクス事業本部の藤川です。 以前の記事で、Splunk Appを簡単に作れることをご紹介しました。 Splunk Appの用途として、カスタムサーチコマンドがあります。 カスタムサーチコマンドを作成すると、SPLからPythonで書いたコードを呼び出すことができるようになります。 カスタムサーチコマンドは、Pythonでコードを記述できるため、Pythonで利用可能なライブラリを利用できるようになります。特に、自然言語処理や機械学習をカスタムサーチコマンドにすれば、簡単なサーチクエリを用意するだけで、高度な分析を行えるようになります。
今回は、カスタムサーチコマンドを作成する手順を題材に、Splunk Appの開発方法を取り上げます。 また、Splunkの開発環境を構築し、Splunk Appの開発から動作確認までの開発ワークフローをご紹介したいと思います。
概要
- Splunkの開発環境をDockerで構築します。
- Splunk Appの開発環境を構築します。
- Splunk Appを構成するファイルを作成します。
- splunk/splunk-app-examplesを参考に、Splunk Appでカスタムサーチコマンドを作成します。
- Splunk Appのパッケージを作成します。
- Splunk AppをSplunkにインストールし、動作確認します。
- 使い終わったSplunk AppをSplunkからアンインストールします。
Splunkの開発環境を構築
- カレントの
work
ディレクトリをコンテナと共有し、ソースコードをエディタで編集できるようにしておきます。mkdir work
- Dockerコマンドで構築します。
docker run \ -d \ -p 8000:8000 \ -v "$(pwd)/work:/home/splunk/work" \ -e "SPLUNK_START_ARGS=--accept-license" \ -e "SPLUNK_PASSWORD=changeme" \ --name splunk \ splunk/splunk:latest
- しばらくすると、Splunkが起動するので、次のURLからログインできることを確認します。
- http://localhost:8000/
- ユーザー名: admin
- パスワード: changeme
- コンテナにshell接続します。
docker exec -it splunk /bin/bash
- コンテナのベースOSに
yum
コマンドをインストールします。sudo microdnf install yum
- 依存パッケージをインストールします。
sudo yum install -y git findutils
Splunk Appの開発環境を構築
- インストールされている
Python
のバージョンを確認します。python --version pip --version
- Splunk Appの妥当性をチェックする
splunk-appinspect
ツールをインストールします。sudo pip install splunk-appinspect splunk-appinspect list version
- Splunk Appをパッケージングする
splunk-packaging-toolkit
ツールをインストールします。sudo pip install splunk-packaging-toolkit slim --version
Splunk Appを構成するファイルを作成
Splunk Appを構成するファイルを作成します。完成すると、次のような構成となります。
hello_world/ bin/ streamingcsc.py default/ app.conf commands.conf lib/ splunklib/ metadata/ default.meta static/ appIcon_2x.png appIcon.png app.manifest README.md
splunk
ユーザにスイッチします。sudo -iu splunk
splunk
ユーザのホームディレクトリにwork
ディレクトリが作成されているので、ここで作業します。cd ~/work
- Splunk Appを構成するファイルを作成します。
※app.manifest
ファイルは、パッケージングツールで自動生成されますので、ここでは作成しません。
※hello_world/static
ディレクトリに置く、Splunk App用のアイコンファイルのみ、別途ご用意ください。SplunkでSplunk Appを作成した際に同梱されるアイコンを流用できます。mkdir hello_world touch hello_world/README.md mkdir hello_world/bin touch hello_world/bin/streamingcsc.py mkdir hello_world/default touch hello_world/default/app.conf touch hello_world/default/commands.conf mkdir hello_world/lib mkdir hello_world/metadata touch hello_world/metadata/default.meta mkdir hello_world/static
カスタムサーチコマンドを作成
splunk/splunk-app-examplesにあるcustom_search_commands/python/streamingsearchcommands_app
を参考に、カスタムサーチコマンドを作成します。
hello_world/bin/streamingcsc.py
hello_world/bin/streamingcsc.py
ファイルを作成します。vi hello_world/bin/streamingcsc.py
from __future__ import absolute_import, division, print_function, unicode_literals import os,sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib")) from splunklib.searchcommands import dispatch, StreamingCommand, Configuration, Option, validators @Configuration() class StreamingCSC(StreamingCommand): """ The streamingcsc command returns events with a one new field 'fahrenheit'. Example: ``| makeresults count=5 | eval celsius = random()%100 | streamingcsc`` returns a records with one new filed 'fahrenheit'. """ def stream(self, records): for record in records: record["fahrenheit"] = (float(record["celsius"]) * 1.8) + 32 yield record dispatch(StreamingCSC, sys.argv, sys.stdin, sys.stdout, __name__)
hello_world/default/app.conf
hello_world/default/app.conf
ファイルを作成します。vi hello_world/default/app.conf
[install] is_configured = 0 [ui] is_visible = 1 label = Hello World [launcher] description = Streaming custom search commands example version = 1.0.0 [package] id = hello_world check_for_updates = true
hello_world/default/commands.conf
hello_world/default/commands.conf
ファイルを作成します。- カスタムサーチコマンド名に
_
を使用できないため、[helloworld]
スタンザとしています。vi hello_world/default/commands.conf
[helloworld] filename = streamingcsc.py chunked = true
hello_world/metadata/default.meta
hello_world/metadata/default.meta
ファイルを作成します。vi hello_world/metadata/default.meta
# Application-level permissions [] access = read : [ * ], write : [ admin, power ] ### EVENT TYPES [eventtypes] export = system ### PROPS [props] export = system ### TRANSFORMS [transforms] export = system ### LOOKUPS [lookups] export = system ### VIEWSTATES: even normal users should be able to create shared viewstates [viewstates] access = read : [ * ], write : [ * ] export = system
hello_world/README.md
hello_world/README.md
ファイルを作成します。vi hello_world/README.md
# Hello World
hello_world/lib/splunklib
- コンテナのShell上で作業します。
lib
ディレクトリに移動します。cd hello_world/lib
- Githubのsplunk/splunk-sdk-pythonから
Splunk Enterprise SDK for Python
のファイル一式をダウンロードします。git clone --depth 1 https://github.com/splunk/splunk-sdk-python.git
splunklib
フォルダ配下のみ、lib
ディレクトリ直下に移動します。mv splunk-sdk-python/splunklib .
splunklib
ディレクトリ内のファイルを除いて不要ですので削除します。rm -rf splunk-sdk-python
Splunk Appをパッケージング
- ファイルパーミッションを整えておきます。
cd ~/work find hello_world -type f | xargs chmod 644 find hello_world -type d | xargs chmod 755
splunk-appinspect
ツールでSplunk Appの妥当性をチェックします。failure
がなければ問題ないでしょう。splunk-appinspect inspect hello_world --max-messages all
splunk-packaging-toolkit
ツールでSplunk Appをパッケージングします。slim package hello_world
- Splunk Appのパッケージが作成されます。
hello_world-1.0.0.tar.gz
Splunk Appをインストール
- 次のURLからSplunkにログインします。
http://localhost:8000/
-
Splunkのホーム画面を表示します。
- 歯車アイコンをクリックし、
App
の一覧画面を表示します。 ファイルからAppをインストール
ボタンをクリックします。Appのアップロード
画面で、hello_world-1.0.0.tar.gz
ファイルを選択し、アップロード
ボタンをクリックします。- 再度、Splunkのホーム画面を表示すると、Splunk Appとして、
Hello World
が表示されるようになります。
カスタムサーチコマンドを動作確認
- Splunkのホーム画面を表示します。
Hello World
をクリックします。- あるいは、画面最上部にある
App
プルダウンからHello World
をクリックします。 -
次のサーチを入力し、実行します。
| makeresults count=5 | eval celsius = random()%100 | helloworld
- 次のように、カスタムサーチコマンドの実行結果が表示されます。
Splunk Appをアンインストール
- コンテナにshell接続します。
docker exec -it splunk /bin/bash
splunk
ユーザにスイッチします。sudo -iu splunk
- 次のコマンドを実行し、Splunk Appをアンインストールします。
/opt/splunk/bin/splunk remove app hello_world
- Splunkユーザのログインを求められますので、ユーザ名、パスワードを入力してください。
Your session is invalid. Please login. Splunk username: admin Password: ********
- 認証をパスすると、Splunk Appがアンインストールされます。
App 'hello_world' removed
さいごに
splunk/splunk-app-examplesには、今回ご紹介し切れなかったカスタムサーチコマンドのサンプルが多数ありますので、お試しください。 また、Downloads | Splunk Developer Programには、Splunk Appの開発エコシステムを構築できるコマンドやライブラリ等がまとめられていますので、ご一読ください。