1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Splunk ジョブやトークン設定の順番確認

1
Last updated at Posted at 2025-12-17

クラシックダッシュボード(SimpleXML)編

どうしても気になったのでサーチの順番やトークンが設定されるタイミングを観測する。

  • 初期化処理(<init>、トークン設定のみ)
  • パネルに属さない検索(<search> → <query>)
  • パネル (<row> → <panel> → <xxx> → <search> → <query>)
  • fieldset 内の入力コントロール (<fieldset> → <input> → <search> → <query>)
  • panel 内の入力コントロール (<row> → <panel> → <panel> → <input> → <search> → <query>)
  • カスケードさせた base search(<search id="xxx"> → <search base="xxx">)
  • search id でのカスケード(<search>..<done>..<set token="xxx"> → $job.sid$ → <search>..<query> → | load $xxx$)

1. 初期化処理と入力コントロールのトークン処理順番

次の構成のダッシュボードを用意して観察する。

  • init で token="check" を設定
  • fieldset 内入力コントロール(token=check)でデフォルト値を指定する
  • panel 内入力コントロール(token=check)でデフォルト値を指定する
  • 確認用パネルのタイトルに $check$ を設定し、どの値になるかを見る

※ 使用したダッシュボードのソース ... ソース1

適宜、token=form.check(入力コントロールの表示も変える)も追加することにより、処理の反映順を確認する。(例:init には form.check は設定しない様にすることで、fieldset と panel のどちらが後に変化したのかを見る。)

結果

init が一番遅い。

panel 内入力コントロール → fieldset 内入力コントロール → init

最終的に init で設定した値が token=check に入る。

image.png

2. パネル内に複数入力コントロールがある場合のトークン処理順番

次の構成のダッシュボードを用意して観察する。

  • panel 内入力コントロールを4つ(全て token=check)
    全てデフォルト値を指定する。
  • 確認用パネルのタイトルに $check$ を設定し、どの値になるかを見る

※ 使用したダッシュボードのソース ... ソース2

結果

左に配置された入力コントロールが一番遅い
入力コントロール4つを左から [1] [2] [3] [4] に配置されているとすると、

[4] → [3] → [2] → [1]

最終的に入力コントロール[1]で設定した値が token=check に入る。

image.png

3. パネルや入力コントロールに設定された search ジョブの実行順

次の構成のダッシュボードを用意して観察する。結果は index=_audit のログで実行された順番を見ている。

  • パネル外(search)にサーチ式
  • fieldset 内の入力コントロールにサーチ式
  • panel 内の入力コントロールにサーチ式
  • panel 内のテーブルにサーチ式

使用したサーチ式(検索しやすいように特定の文言を埋め込み)

| makeresults ``` Check job order ``` | eval check="設置した場所毎の値" | table check

確認に使用したサーチ式

index=_audit "Check job order" provenance="UI:Dashboard:ダッシュボードID"
| table _time index sourcetype search info

※ 使用したダッシュボードのソース ... ソース3

結果

info=granted (検索開始) のログで確認した。次の順番で実行される。
なお、info=completed (検索完了) の順番は保証されない(それぞれの SPL 次第なので)。

fieldset 内入力コントロール → panel 内入力コントロール → panel 内テーブル → search

image.png

4. 複数のパネルの search ジョブの実行順

次の構成のダッシュボードを用意して観察する。結果は index=_audit のログで実行された順番を見ている。

  • panel 内のテーブルにサーチ式
  • このパネルを1行に2パネル、2行用意

※ 使用したダッシュボードのソース ... ソース4

結果

info=granted (検索開始) のログで確認した。
パネルごとの実行順は保証されていない(先に下の方にあるパネルのSPLを実行した痕跡あり)。

image.png

5. 多段の base search の実行順

次の構成のダッシュボードを用意して観察した。下図の青い線が SPL のつながりを示す。

  • Base Search の id をベースに検索する panel_1
  • panel_1 の id をベースに検索する panel_1_child
  • panel_1_child の id をベースに検索する panel_1_grand_child_1 と panel_1_grand_child_2

image.png

子供以下の search は index=_audit に格納されていなかったため、各 SPL の done イベントにトークンを追記する <set> を書き、追記された順番で観察している。

※ 使用したダッシュボードのソース ... ソース5

結果

上図の赤い線はトークンが格納された順番を示す。base search は最初に1回行われるが、孫は親(panel_1)からと子(panel_1_child)から呼ばれており、2回更新される挙動が観察された。
複数回実施して、孫(panel_1_grandchild_1, 2)の順番は保証されなかった。

image.png

なお、孫がない状態で実行した場合は上図の赤線のようになる。この場合でも親/子が2回更新される挙動を観察した。

以上のことより、以下のパターンが分かる。base search(BS) から2つ以上カスケードさせると複数回の更新が発生するため、間の SPL のパフォーマンスによっては著しく動作が遅くなる可能性がある。

base search (BS) 
→ BS を使った search(親)→ 親 を使った search(子)
→ BS を使った search(親)→ 子 を使った search(孫)
→ 親 を使った search(子)→ 子 を使った search(孫)

6. どうしてもカスケードした順番で多段の search を実行したい

#5 では base search を使ったことで親/子/孫が複数回呼ばれる挙動を確認することができた。しかし base search を使う時の挙動のイメージは青線で書いていたカスケードされた順番ではないだろうか。別の方法を使えば、できる。

次の構成のダッシュボードを用意して観察した。下図の青い線が SPL のつながりを示す。

  • Base Search の done イベントから search id を取得する
    panel_1 はその search id を読み込み、続きの処理を行う
  • panel_1 の done イベントから search id を取得する
    panel_1_child はその search id を読み込み、続きの処理を行う
  • panel_1_child の id をベースに検索する
    panel_1_grand_child_1 と panel_1_grand_child_2 はその search id を読み込み、続きの処理を行う

※ search id は $job.sid$ で取得することができます。
※ 取得した search id は loadjob sid で読み込むことができます。

image.png

※ 使用したダッシュボードのソース ... ソース6
※ 極力、ソース5と同じ構成にしている。

結果

上図の赤い線はトークンが格納された順番を示す。青線と同じように意図した順番のみで実行されている事が分かる。

base search(①) → 親(②) → 子(③) → 孫(④⑤)

ただしこの方式の場合欠点が1つある。base search を使用した場合、「サーチで開く」と最上位からすべての SPL を使った SPL を用いてサーチ画面でSPLの検証を行うことができる。一方で loadjob を使った場合は単独での SPL 検証となり、SPL の全体像を把握しづらい。どちらの書き方を取るかは、そのダッシュボードの枯れ具合による、と言える。

image.png

(オマケ)無限ループ

※ こういう作りはやめましょうという話です。

トークンを含む SPL はトークンが更新されると再実行される。サーチジョブの実行順を意識すると SPL の実行を無限に繰り返してしまう構成にすることができる。

  • 入力コントロールの変更イベント(change)にトークンを更新する設定
  • パネルの SPL にトークンを利用
  • パネルの SPL の実行完了イベント(done)にトークンを更新する設定

次の動きになる想定

  1. 入力コントロールのデフォルト値によりトークンが設定される
  2. パネルの SPL に利用されているトークンが設定され、SPL 実行
  3. パネルの実行完了イベントによりトークンが更新
  4. 入力コントロールの変更イベントによりトークンが更新
  5. 2に戻る

※ 使用したダッシュボードのソース ... ソース7

image.png

(参考) 使用したソース

ソース1

初期化処理と入力コントロールのトークン処理順番 のSPL
<form version="1.1" theme="light">
  <init>
    <set token="form.check">init</set>
  </init>
  <label>ジョブの順番チェック</label>
  <fieldset submitButton="false">
    <input type="dropdown" token="check" searchWhenChanged="true">
      <label>チェック</label>
      <choice value="fieldset_input_default">デフォルト</choice>
      <choice value="fieldset_input_changed">変更</choice>
      <default>fieldset_input_default</default>
      <initialValue>fieldset_input_default</initialValue>
      <change>
        <set token="form.check">$value$</set>
      </change>
    </input>
  </fieldset>
  <row>
    <panel>
      <input type="dropdown" token="check" searchWhenChanged="true">
        <label>チェック2</label>
        <choice value="panel_input_def">デフォルト</choice>
        <choice value="panel_input_ch">変更</choice>
        <default>panel_input_def</default>
        <initialValue>panel_input_def</initialValue>
        <change>
          <set token="form.check">$value$</set>
        </change>
      </input>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <title>[$check$]</title>
        <search>
          <query>
            | makeresults | eval value="$check$" | table value
          </query>
        </search>
      </table>
    </panel>
  </row>
</form>

ソース2

パネル内に複数入力コントロールがある場合のトークン処理順番 のSPL
<form version="1.1" theme="light">
  <label>ジョブの順番チェック</label>
  <fieldset/>
  <row>
    <panel>
      <input type="dropdown" token="check" searchWhenChanged="true">
        <label>チェック1</label>
        <choice value="input1_def">デフォルト</choice>
        <default>input1_def</default>
        <initialValue>input1_def</initialValue>
        <change>
          <set token="form.check">$value$</set>
        </change>
      </input>
      <input type="dropdown" token="check" searchWhenChanged="true">
        <label>チェック2</label>
        <choice value="input2_def">デフォルト</choice>
        <default>input2_def</default>
        <initialValue>input2_def</initialValue>
        <change>
          <set token="form.check">$value$</set>
        </change>
      </input>
      <input type="dropdown" token="check" searchWhenChanged="true">
        <label>チェック3</label>
        <choice value="input3_def">デフォルト</choice>
        <default>input3_def</default>
        <initialValue>input3_def</initialValue>
        <change>
          <set token="form.check">$value$</set>
        </change>
      </input>
      <input type="dropdown" token="check" searchWhenChanged="true">
        <label>チェック4</label>
        <choice value="input4_def">デフォルト</choice>
        <default>input4_def</default>
        <initialValue>input4_def</initialValue>
        <change>
          <set token="form.check">$value$</set>
        </change>
      </input>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <title>[$check$]</title>
        <search>
          <query>
              | makeresults | eval value="$check$" | table value
          </query>
        </search>
      </table>
    </panel>
  </row>
</form>

ソース3

パネルや入力コントロールに設定された search ジョブの実行順 のSPL
<form version="1.1" theme="light">
  <label>ジョブの順番チェック</label>
  <search>
    <query>
      | makeresults ``` Check job order ``` | eval check="search" | table check
    </query>
  </search>
  <fieldset>
    <input type="dropdown" token="check" searchWhenChanged="true">
      <label>チェック</label>
      <choice value="input1_def">デフォルト</choice>
      <default>input1_def</default>
      <initialValue>input1_def</initialValue>
      <fieldForLabel>check</fieldForLabel>
      <fieldForValue>check</fieldForValue>
      <search>
        <query>
          | makeresults ``` Check job order ``` | eval check="fieldset-input-search" | table check
        </query>
      </search>
    </input>
  </fieldset>
  <row>
    <panel>
      <input type="dropdown" token="check" searchWhenChanged="true">
        <label>チェック</label>
        <choice value="input1_def">デフォルト</choice>
        <default>input1_def</default>
        <initialValue>input1_def</initialValue>
        <fieldForLabel>check</fieldForLabel>
        <fieldForValue>check</fieldForValue>
        <search>
          <query>
            | makeresults ``` Check job order ``` | eval check="panel-input-search" | table check
          </query>
        </search>
      </input>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search>
          <query>
            | makeresults ``` Check job order ``` | eval check="panel-search" | table check
          </query>
        </search>
      </table>
    </panel>
  </row>
</form>

ソース4

複数のパネルの search ジョブの実行順 のSPL
<form version="1.1" theme="light">
  <label>ジョブの順番チェック</label>
  <row>
    <panel>
      <table>
        <search>
          <query>
            | makeresults ``` Check job order ``` | eval check="panel-search-1" | table check
          </query>
        </search>
      </table>
    </panel>
    <panel>
      <table>
        <search>
          <query>
            | makeresults ``` Check job order ``` | eval check="panel-search-2" | table check
          </query>
        </search>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search>
          <query>
            | makeresults ``` Check job order ``` | eval check="panel-search-3" | table check
          </query>
        </search>
      </table>
    </panel>
    <panel>
      <table>
        <search>
          <query>
            | makeresults ``` Check job order ``` | eval check="panel-search-4" | table check
          </query>
        </search>
      </table>
    </panel>
  </row>
</form>

ソース5

多段の base search の実行順 のSPL
<form version="1.1" theme="light">
  <label>ジョブの順番チェック</label>
  <search id="base_search">
    <query>
      | makeresults ``` Check job order ``` | eval check="base_search" | table _time key check
    </query>
    <earliest>0</earliest>
    <latest></latest>
    <done>
      <eval token="check">strftime(now(), "%Y-%m-%d %H:%M:%S") . ", base search"</eval>
    </done>
  </search>
  <row>
    <panel>
      <title>結果表示欄</title>
      <html>
        $check$
      </html>
    </panel>
  </row>
  <row>
    <panel>
      <title>Base Search からの検索(panel_1~4)</title>
      <html/>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search base="base_search" id="panel_1">
          <query>| eval check="panel_1" | table _time key check</query>
          <done>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <title>panel_1~4 からの検索(子:panel_1~4_child)</title>
      <html/>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search base="panel_1" id="panel_1_child">
          <query>| eval check="panel_1_child" | table _time key check</query>
          <done>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <title>子 からの検索(孫:panel_1~2_grandchild_1~2)</title>
      <html/>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search base="panel_1_child" id="panel_1_grandchild_1">
          <query>| eval check="panel_1_grandchild_1" | table _time key check</query>
          <done>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
    <panel>
      <table>
        <search base="panel_1_child" id="panel_1_grandchild_2">
          <query>| eval check="panel_1_grandchild_2" | table _time key check</query>
          <done>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
</form>

ソース6

6. カスケードした順番で多段の search を実行 のSPL
<form version="1.1" theme="light">
  <label>ジョブの順番チェック</label>
  <search id="base_search">
    <query>
      | makeresults ``` Check job order ``` | eval check="base_search" | table _time key check
    </query>
    <earliest>0</earliest>
    <latest></latest>
    <done>
      <set token="base_search_sid">$job.sid$</set>
      <eval token="check">strftime(now(), "%Y-%m-%d %H:%M:%S") . ", base search"</eval>
    </done>
  </search>
  <row>
    <panel>
      <title>結果表示欄</title>
      <html>
        $check$
      </html>
    </panel>
  </row>
  <row>
    <panel>
      <title>Base Search からの検索(panel_1~4)</title>
      <html/>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search id="panel_1">
          <query>| loadjob $base_search_sid$
| eval check="panel_1" | table _time key check</query>
          <done>
            <set token="panel_1_sid">$job.sid$</set>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <title>panel_1~4 からの検索(子:panel_1~4_child)</title>
      <html/>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search id="panel_1_child">
          <query>| loadjob $panel_1_sid$
| eval check="panel_1_child" | table _time key check</query>
          <done>
            <set token="panel_1_child_sid">$job.sid$</set>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <title>子 からの検索(孫:panel_1~2_grandchild_1~2)</title>
      <html/>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <search id="panel_1_grandchild_1">
          <query>| loadjob $panel_1_child_sid$
| eval check="panel_1_grandchild_1" | table _time key check</query>
          <done>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
    <panel>
      <table>
        <search id="panel_1_grandchild_2">
          <query>| loadjob $panel_1_child_sid$
| eval check="panel_1_grandchild_2" | table _time key check</query>
          <done>
            <set token="check">$check$, $result.check$</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
</form>

ソース7

(オマケ)無限ループ のSPL
<form version="1.1" theme="light">
  <label>ジョブの順番チェック</label>
  <fieldset submitButton="false">
    <input type="dropdown" token="check" searchWhenChanged="true">
      <label>チェック</label>
      <choice value="fieldset_input_default">デフォルト</choice>
      <choice value="fieldset_input_changed">変更</choice>
      <default>fieldset_input_default</default>
      <initialValue>fieldset_input_default</initialValue>
      <fieldForLabel>check</fieldForLabel>
      <fieldForValue>check</fieldForValue>
      <search>
        <query>
          | makeresults | eval check="first" | table check
        </query>
      </search>
      <change>
        <set token="form.check">seconds</set>
      </change>
    </input>
  </fieldset>
  <row>
    <panel>
      <table>
        <title>[$check$]</title>
        <search>
          <query>
            | makeresults | eval value="$check$" | table value
          </query>
          <done>
            <set token="form.check">first</set>
          </done>
        </search>
      </table>
    </panel>
  </row>
</form>
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?