しばしば必要となるのでメモ。
実施環境: Splunk Free 8.2.2
やりたいこと
timechart コマンドは、 span で集計間隔を様々に指定でき、1週間毎のデータを集計したい場合は span=1w を指定します。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| timechart span=1w count
ただ、ここで困ったことが1つ。
上記の例を見るとわかりますが、 span=1w で指定した場合の1週間の起点は、検索対象の中で最も古い日付、上記の例であれば2021/11/11(木)となります。
データを分析するには、これでは少々使いにくいです。
できれば、日曜始まりや月曜始まりで固定したいところですが、どのようにすればよいでしょうか。
検索すると方法は出てくるが
「splunk timechart Sunday」等で検索すると、真っ先に出てくるのは eval コマンドの strftime 関数を使用する方法です。
strftime 関数で時刻の形式に「%w」を指定すると、日曜日なら0、土曜日なら1、...月曜日なら6という数値が取得できます。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval WEEK_CNT = tonumber(strftime(_time, "%w"))
この数値を relative_time 関数を使用して元の日付から引くことで、日付を日曜始まりに揃えることができます。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval WEEK_CNT = tonumber(strftime(_time, "%w"))
| eval _time = relative_time(_time, "-" + tostring(WEEK_CNT) + "d")
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval WEEK_CNT = tonumber(strftime(_time, "%w"))
| eval _time = relative_time(_time, "-" + tostring(WEEK_CNT) + "d")
| timechart span=1w count
月曜始まりにするには、 strftime で取得した数値に6を足して7で割った余りを取得すればよいです。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval WEEK_CNT = (tonumber(strftime(_time, "%w")) + 6) % 7
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval WEEK_CNT = (tonumber(strftime(_time, "%w")) + 6) % 7
| eval _time = relative_time(_time, "-" + tostring(WEEK_CNT) + "d")
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval WEEK_CNT = (tonumber(strftime(_time, "%w")) + 6) % 7
| eval _time = relative_time(_time, "-" + tostring(WEEK_CNT) + "d")
| timechart span=1w count
もう少し調べてみる
上記の方法で日曜始まりと月曜始まりは実現できましたが、やはり少々煩雑です。
もっと単純にできないのでしょうか。
もう少し調査してみると、以下のように「@w」という指定をすれば strftime 関数は不要となることがわかります。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval _time = relative_time(_time, "@w")
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval _time = relative_time(_time, "@w")
| timechart span=1w count
月曜始まりにする場合は、「@w」の後ろに「1」を付けます。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval _time = relative_time(_time, "@w1")
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| eval _time = relative_time(_time, "@w1")
| timechart span=1w count
非常にすっきりしましたが、実はもっとシンプルに記述できます。
最も簡単な方法
上記で使用している「@w」という記載方法は、 timechart コマンドの span オプションでも使用できます。
結局、他にコマンドを使用せずとも、 timechart コマンドの範囲内で日曜始まり、月曜始まりは実現できるのです。
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| timechart span=1w@w count
| makeresults count=10
| streamstats count AS CNT
| eval _time = _time - CNT * 60 * 60 * 24
| timechart span=1w@w1 count
これが一番簡単だと思います。
ちなみに
上記の「@w」は、 relative_time 関数や timechart コマンドだけでなく、その他の場面でも使用できます。
例えば、以下では検索時のタイムピッカーで使用しています。
意外と使う機会があるので、覚えておくと便利です。