Splunk 表を集計して変換する


結構大変だったので

課題

HOST VALUE
Host1 1
Host2 4
Host3 2
Host2 7
Host3 5
Host1 8

HOST VALUE LATEST
Host1 1 Host1-1
Host2 4 Host1-1,Host2-4
Host3 2 Host1-1, Host2-4, Host3-2
Host2 7 Host1-1, Host2-7, Host3-2
Host3 5 Host1-1, Host2-7, Host3-5
Host1 8 Host1-8, Host2-7, Host3-5

にする。

ホスト毎最後の値を一覧にしたいとのこと。

Code

table.spl
| makeresults
| eval _raw="HOST   VALUE
Host1   1
Host2   4
Host3   2
Host2   7
Host3   5
Host1   8"
| multikv forceheader=1
| table HOST VALUE
| rename COMMENT as "this is your sample. from here, the logic"
| reverse
| streamstats count
| reverse
| eval tmp=count."_".HOST."_".VALUE
| streamstats values(tmp) as tmp
| streamstats count as session
| mvexpand tmp
| rex field=tmp "\d_(?<HOST>\w+)_(?<VALUE>\d)"
| streamstats first(VALUE) as VALUE by session HOST
| eval tmp2=HOST."-".VALUE
| streamstats first(HOST) as HOST first(VALUE) as VALUE values(tmp2) as LATEST by session 
| stats values(LATEST) as LATEST by session HOST VALUE delim=","
| fields - session
| nomv LATEST

解説

  • latest()を自動的にするためにreverseしてstreamstats countで番号をつけてあげると、後ろに出てくる値が小さな数になってくれるので、reverseで戻すと後に出てきた値が上になってくれる。
  • stresmstats values()で値をまとめたものを作ってあげて、mvexpandで分割する。
  • rexでまとめた値からmvexpandで広がった値を上書き。
  • またstreamstats first()で元の表の値を作成。
  • 後はstatsで元の表をsessionを元に作成し、nomvで一列にしてあげている。

まとめ

マルチバリューの整列をする時、できることが少ないのでこれだけの手数が必要になりますね。

なんに使うんでしょうね、この表