Splunkのカスタムサーチコマンドを作ってみた。

2022.11.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部の藤川です。 以前の記事で、Splunk Appを簡単に作れることをご紹介しました。 Splunk Appの用途として、カスタムサーチコマンドがあります。 カスタムサーチコマンドを作成すると、SPLからPythonで書いたコードを呼び出すことができるようになります。 カスタムサーチコマンドは、Pythonでコードを記述できるため、Pythonで利用可能なライブラリを利用できるようになります。特に、自然言語処理や機械学習をカスタムサーチコマンドにすれば、簡単なサーチクエリを用意するだけで、高度な分析を行えるようになります。

今回は、カスタムサーチコマンドを作成する手順を題材に、Splunk Appの開発方法を取り上げます。 また、Splunkの開発環境を構築し、Splunk Appの開発から動作確認までの開発ワークフローをご紹介したいと思います。

概要

  • Splunkの開発環境をDockerで構築します。
  • Splunk Appの開発環境を構築します。
  • Splunk Appを構成するファイルを作成します。
  • Splunk Appのパッケージを作成します。
  • Splunk AppをSplunkにインストールし、動作確認します。
  • 使い終わったSplunk AppをSplunkからアンインストールします。

Splunkの開発環境を構築

  1. カレントのworkディレクトリをコンテナと共有し、ソースコードをエディタで編集できるようにしておきます。
    mkdir work
  2. 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
  3. しばらくすると、Splunkが起動するので、次のURLからログインできることを確認します。
    • http://localhost:8000/
    • ユーザー名: admin
    • パスワード: changeme
  4. コンテナにshell接続します。
    docker exec -it splunk /bin/bash
  5. コンテナのベースOSにyumコマンドをインストールします。
    sudo microdnf install yum
  6. 依存パッケージをインストールします。
    sudo yum install -y git findutils

Splunk Appの開発環境を構築

  1. インストールされているPythonのバージョンを確認します。
    python --version
    pip --version
  2. Splunk Appの妥当性をチェックするsplunk-appinspectツールをインストールします。
    sudo pip install splunk-appinspect
    splunk-appinspect list version
  3. 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
  1. splunkユーザにスイッチします。
    sudo -iu splunk
  2. splunkユーザのホームディレクトリにworkディレクトリが作成されているので、ここで作業します。
    cd ~/work
  3. 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

  1. 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

  1. 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

  1. hello_world/default/commands.confファイルを作成します。
  2. カスタムサーチコマンド名に_を使用できないため、[helloworld]スタンザとしています。
    vi hello_world/default/commands.conf
    [helloworld]
    filename = streamingcsc.py
    chunked = true

hello_world/metadata/default.meta

  1. 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

  1. hello_world/README.mdファイルを作成します。
    vi hello_world/README.md
    # Hello World

hello_world/lib/splunklib

  1. コンテナのShell上で作業します。
  2. libディレクトリに移動します。
    cd hello_world/lib
  3. Githubのsplunk/splunk-sdk-pythonからSplunk Enterprise SDK for Pythonのファイル一式をダウンロードします。
    git clone --depth 1 https://github.com/splunk/splunk-sdk-python.git
  4. splunklibフォルダ配下のみ、libディレクトリ直下に移動します。
    mv splunk-sdk-python/splunklib .
  5. splunklibディレクトリ内のファイルを除いて不要ですので削除します。
    rm -rf splunk-sdk-python

Splunk Appをパッケージング

  1. ファイルパーミッションを整えておきます。
    cd ~/work
    find hello_world -type f | xargs chmod 644
    find hello_world -type d | xargs chmod 755
  2. splunk-appinspectツールでSplunk Appの妥当性をチェックします。failureがなければ問題ないでしょう。
    splunk-appinspect inspect hello_world --max-messages all
  3. splunk-packaging-toolkitツールでSplunk Appをパッケージングします。
    slim package hello_world
  4. Splunk Appのパッケージが作成されます。
    hello_world-1.0.0.tar.gz

Splunk Appをインストール

  1. 次のURLからSplunkにログインします。

    http://localhost:8000/

  2. Splunkのホーム画面を表示します。

  3. 歯車アイコンをクリックし、Appの一覧画面を表示します。
  4. ファイルからAppをインストールボタンをクリックします。
  5. Appのアップロード画面で、hello_world-1.0.0.tar.gzファイルを選択し、アップロードボタンをクリックします。
  6. 再度、Splunkのホーム画面を表示すると、Splunk Appとして、Hello Worldが表示されるようになります。

カスタムサーチコマンドを動作確認

  1. Splunkのホーム画面を表示します。
  2. Hello Worldをクリックします。
  3. あるいは、画面最上部にあるAppプルダウンからHello Worldをクリックします。
  4. 次のサーチを入力し、実行します。

    | makeresults count=5
    | eval celsius = random()%100
    | helloworld
  5. 次のように、カスタムサーチコマンドの実行結果が表示されます。

Splunk Appをアンインストール

  1. コンテナにshell接続します。
    docker exec -it splunk /bin/bash
  2. splunkユーザにスイッチします。
    sudo -iu splunk
  3. 次のコマンドを実行し、Splunk Appをアンインストールします。
    /opt/splunk/bin/splunk remove app hello_world
  4. Splunkユーザのログインを求められますので、ユーザ名、パスワードを入力してください。
    Your session is invalid.  Please login.
    Splunk username: admin
    Password: ********
  5. 認証をパスすると、Splunk Appがアンインストールされます。
    App 'hello_world' removed

さいごに

splunk/splunk-app-examplesには、今回ご紹介し切れなかったカスタムサーチコマンドのサンプルが多数ありますので、お試しください。 また、Downloads | Splunk Developer Programには、Splunk Appの開発エコシステムを構築できるコマンドやライブラリ等がまとめられていますので、ご一読ください。

あわせて読みたい