実施環境
CentOS 8-Stream
Splunk Free 8.2.2
Python 3.7.10
splunk-sdk-python 1.7.3
0. 概要
Splunk のコマンドにはいくつかの種類があり、カスタムコマンドもそれぞれの種類のコマンドを作成することができます。
今回は各コマンドの作成方法を紹介していきます。
1. カスタムコマンドの種類
前回作成したカスタムコマンドのプログラムを見ると、コマンドの本体部分である「 test_class 」は「 GeneratingCommand 」というクラスを継承していることがわかります。
class test_class(GeneratingCommand):
この継承元のクラスは、作りたいコマンドの種類によっていくつか存在します。
実際、この継承元となるクラスがあるファイルを確認すると、以下の通り似たような名前のファイルが複数あることがわかります。
[root@testhost test]# ls -l /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/*command.py
-rw-r--r--. 1 splunk splunk 5432 2月 13 14:59 /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/eventing_command.py
-rw-r--r--. 1 splunk splunk 7872 2月 13 14:59 /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/external_search_command.py
-rw-r--r--. 1 splunk splunk 18949 2月 13 14:59 /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/generating_command.py
-rw-r--r--. 1 splunk splunk 9697 2月 13 14:59 /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/reporting_command.py
-rw-r--r--. 1 splunk splunk 40702 2月 13 14:59 /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/search_command.py
-rw-r--r--. 1 splunk splunk 6778 2月 13 14:59 /opt/splunk/etc/apps/search/lib/splunklib/searchcommands/streaming_command.py
前回使用した「 GeneratingCommand 」は、基本的に SPL の先頭で使用する、イベントの入力を受け付けないコマンドです。
今回は、 SPL の途中で使用する、イベントの入力を受け付ける種類のコマンド「 EventingCommand 」を紹介します。
基本的には「 GeneratingCommand 」「 EventingCommand 」の2つがあれば大抵のコマンドは作れるはずです。
他にもコマンドの種類はありますが、ここでは紹介しません。
気になる方は調べてみてください。
2. カスタムコマンド本体の作成
上記の通り、前回作成した「 GeneratingCommand 」は入力なしでイベントを生成し出力するコマンドでしたが、「 EventingCommand 」はそれとは異なり入力を加工して出力するコマンドです。
実際に作成してみました。
ファイルは前回作成したものをそのまま書き換えています。
#!/usr/bin/env python
import sys
sys.path.insert(0, "/opt/splunk/etc/apps/search/lib")
from splunklib.searchcommands import \
dispatch, EventingCommand, Configuration
@Configuration()
class test_class(EventingCommand):
def transform(self, events):
test_sum = 0
for event in events:
test_sum = test_sum + int(event["test_count"])
return [{"test_result": test_sum}]
dispatch(test_class)
「 events 」が入力イベント全体、「 event 」が1つ1つの入力イベントです。
「 event 」は出力イベントと同様に辞書の形をとり、上記のようにフィールド名を指定することで値を取得することができます。
3. 実行
実際に SPL で使用してみました。
| makeresults count=3
| fields - _time
| streamstats count AS test_count
| TestCommand
入力したイベントが加工されて出力されていることがわかります。
ここまで、カスタムコマンドの種類について紹介しました。
次回は、引数の指定や出力の分割など細かい機能を追加していきます。