Splunk Dashboard tokenの細かい話(時刻処理の話)
時刻データの扱い
token話第三弾。
時刻データ周りの話。
_timeの取扱い
一回理解すればそれほどでもないのですが、1つめ。
意識せず各データについてくる_time。
tableなどで表示すると、ヒューマンリーダブルな値が帰ってきますが、内部的にはunixtimeとしても機能してくれたりと、非常に多機能です。
また、tableで表示するとロケールに合わせてシンプルな表示をしてくれます。
但し、ドリルダウンとかで渡すときに、トークンに入れてみると、、、
<dashboard>
<label>timetest</label>
<row>
<panel>
<table>
<search>
<query>| from datamodel:"internal_audit_logs.Audit"
| table _time, action, info, sorce, user</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<option name="drilldown">cell</option>
<drilldown>
<set token="time_in_token">$row._time$</set>
</drilldown>
</table>
</panel>
<panel>
<html>
<h1>time_in_token: $time_in_token$</h1>
</html>
</panel>
</row>
</dashboard>
ロケール付きのガッツリした値になります。
ドリルダウンの際に迂闊にrow._timeを渡すと、何だこれになります。
Time Input
データの表示期間などに使うTimeインプットですが、ここで受け渡される値はちょっと厄介です。
inputで明瞭に期間をいつからいつまで、と記入した際はunixtimeであつかわれます。
一方、「過去XX分」のようにすると、、
こうなります。
これ、formなどでドリルダウンに引き渡して、相手先もtimeの入力やqueryのlatest/earliestで使う分にはいいのですけれど、where句などで使うときに困ったことになります。
where句などでunixtimeとして使おうとすると、以下のような小細工をする必要があります。
<form>
<label>time_test</label>
<search>
<query>| makeresults 1</query>
<done>
<eval token="earliest_adjusted">if(isnum('field1.earliest'), 'field1.earliest', relative_time(now(), 'field1.earliest')</eval>
<eval token="latest_adjusted">if(isnum('field1.latest'), 'field1.latest', relative_time(now(), 'field1.latest')</eval>
</done>
</search>
<fieldset submitButton="false">
<input type="time" token="field1">
<label></label>
<default>
<earliest>-24h@h</earliest>
<latest>now</latest>
</default>
<change>
<eval token="earliest_adjusted">if(isnum('field1.earliest'), 'field1.earliest', relative_time(now(), 'field1.earliest')</eval>
<eval token="latest_adjusted">if(isnum('field1.latest'), 'field1.latest', now())</eval>
</change>
</input>
</fieldset>
<row>
<html>
<h1>earliest: $field1.earliest$, $earliest_adjusted$</h1>
<h1>latest: $field1.latest$, $latest_adjusted$</h1>
</html>
</row>
</form>
上記のように小細工して、where句で使うときは_adjustedを使うわけですね。
但し、input欄のtimeの後処理だけではなく、ドリルダウンなど経由でこのダッシュボードに飛んできたときの分の処理もしないといけないので、頭に空打ちsearch句をおいて対処する、という方法を忘れずに実施しておく必要があります。
とりあえず
こんなところです。
裏処理はunixtimeベースでいいのですけれど、人間に見せる値はstrftimeなどで人間にとって読みやすい文字列に変換する必要もあるので、結構変数設計がごちゃつきがちです。
めんどくさい。。
Discussion