クラシックダッシュボード(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 に入る。
2. パネル内に複数入力コントロールがある場合のトークン処理順番
次の構成のダッシュボードを用意して観察する。
- panel 内入力コントロールを4つ(全て token=check)
全てデフォルト値を指定する。 - 確認用パネルのタイトルに $check$ を設定し、どの値になるかを見る
※ 使用したダッシュボードのソース ... ソース2
結果
左に配置された入力コントロールが一番遅い
入力コントロール4つを左から [1] [2] [3] [4] に配置されているとすると、
[4] → [3] → [2] → [1]
最終的に入力コントロール[1]で設定した値が token=check に入る。
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
4. 複数のパネルの search ジョブの実行順
次の構成のダッシュボードを用意して観察する。結果は index=_audit のログで実行された順番を見ている。
- panel 内のテーブルにサーチ式
- このパネルを1行に2パネル、2行用意
※ 使用したダッシュボードのソース ... ソース4
結果
info=granted (検索開始) のログで確認した。
パネルごとの実行順は保証されていない(先に下の方にあるパネルのSPLを実行した痕跡あり)。
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
子供以下の search は index=_audit に格納されていなかったため、各 SPL の done イベントにトークンを追記する <set> を書き、追記された順番で観察している。
※ 使用したダッシュボードのソース ... ソース5
結果
上図の赤い線はトークンが格納された順番を示す。base search は最初に1回行われるが、孫は親(panel_1)からと子(panel_1_child)から呼ばれており、2回更新される挙動が観察された。
複数回実施して、孫(panel_1_grandchild_1, 2)の順番は保証されなかった。
なお、孫がない状態で実行した場合は上図の赤線のようになる。この場合でも親/子が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 で読み込むことができます。
※ 使用したダッシュボードのソース ... ソース6
※ 極力、ソース5と同じ構成にしている。
結果
上図の赤い線はトークンが格納された順番を示す。青線と同じように意図した順番のみで実行されている事が分かる。
base search(①) → 親(②) → 子(③) → 孫(④⑤)
ただしこの方式の場合欠点が1つある。base search を使用した場合、「サーチで開く」と最上位からすべての SPL を使った SPL を用いてサーチ画面でSPLの検証を行うことができる。一方で loadjob を使った場合は単独での SPL 検証となり、SPL の全体像を把握しづらい。どちらの書き方を取るかは、そのダッシュボードの枯れ具合による、と言える。
(オマケ)無限ループ
※ こういう作りはやめましょうという話です。
トークンを含む SPL はトークンが更新されると再実行される。サーチジョブの実行順を意識すると SPL の実行を無限に繰り返してしまう構成にすることができる。
- 入力コントロールの変更イベント(change)にトークンを更新する設定
- パネルの SPL にトークンを利用
- パネルの SPL の実行完了イベント(done)にトークンを更新する設定
次の動きになる想定
- 入力コントロールのデフォルト値によりトークンが設定される
- パネルの SPL に利用されているトークンが設定され、SPL 実行
- パネルの実行完了イベントによりトークンが更新
- 入力コントロールの変更イベントによりトークンが更新
- 2に戻る
※ 使用したダッシュボードのソース ... ソース7
(参考) 使用したソース
ソース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>








