🦁

Splunk Dashboard tokenの細かい話(時刻処理の話)

2021/07/11に公開

時刻データの扱い

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