Dataの準備
| makeresults count=4
| eval process1=random() % 100.000000
| eval process2=random() % 100.000000
| eval process3=random() % 100.000000
| eval total = process1 + process2 + process3
| fields - _time
縦横変換
| eval temp=1
| untable temp process time
ダミーのフィールド(ここではtemp)を作成して、untable
で縦横変換
これは、後stats
とかでまとめる時に使う
| stats min(time) avg(time) max(time) by process
#transpose
Splunk Docs
| makeresults count=4
| eval process1=random() % 100.000000
| eval process2=random() % 100.000000
| eval process3=random() % 100.000000
| eval total = process1 + process2 + process3
| fields - _time
| transpose
こちらのコマンドもある。結果は
column | row 1 | row 2 | row 3 | row 4 |
---|---|---|---|---|
process1 | 22.0000000 | 79.0000000 | 34.0000000 | 44.0000000 |
process2 | 22.0000000 | 61.0000000 | 33.0000000 | 78.0000000 |
process3 | 93.0000000 | 4.00000000 | 84.0000000 | 54.0000000 |
total | 137.0000000 | 144.0000000 | 151.0000000 | 176.0000000 |
デフォルトだとフィールド名はrow \d
になるのが気になるといえば気になる。 なお、デフォルトは5行しか変換しないので、大きな行だとtranspose 0
と指定が必要(Splunkの検索って結構表示制限があるので、結果が出ない時は制限を疑う必要があるな・・・)
オプションのheader_field=<field>
でフィールド名を指定できる。
また、| rename "row *" as row_*
で一括変更可能
eval
で計算が可能なのでこの形も使いやすい。
#応用
| tstats count(_indextime) as count where index=_internal by _time span=1h source
| xyseries _time source count
一応metadata
バージョンも
| metadata type=sources index=_internal
| table lastTime source totalCount
| rename lastTime as _time
| xyseries _time source totalCount
ログがキチンと入っているのかの確認用。tstats
を使っているので早い。
このようにtimechart
コマンド等で表示される横の時間を固定して
_time | source | count |
---|---|---|
2019/11/01 20:00 | /Applications/Splunk/var/log/splunk/health.log | 720 |
を
_time | /Applications/Splunk/var/log/splunk/health.log | ... |
---|---|---|
2019/11/01 20:00 | 720 |
こう変換している。
#####2019/11/18 追記
xyseries
を使用しなくても、chart
でいける。
| tstats count(_indextime) as count where index=_internal by _time span=1h source
| chart sum(count) by _time source
byの後に2つのフィールド、特にこの場合の*_timeは複数のsource*にまたがっているのがキモ。
わかりやすい方で
ダッシュボード向けとして
index=_internal
| stats count by source
| eval tmp="past 15 min"
| xyseries tmp source count
トレリスを使ってX-Axisの表示をオフにしてみるとこんな感じでできる。
chart
の_over_と_by_がいつもこんがらがるので
index=_internal
| chart limit=0 count over sourcetype by source
| transpose 0 header_field=sourcetype column_name="source"
over
が行、by
が列。行列と覚えて、transpose
できれいに変換
#表の縦横変換
https://community.splunk.com/t5/Splunk-Search/Search-Result-Sorting-as-per-values-in-a-field/m-p/534049/highlight/true#M150932
ここで、自分でも結構よくできたと思う
| makeresults
| eval _raw="Name,WW,Name2,Result,Type,Value
Abc,50.5,Prod,Pass,A,1280
Xyz,47.2,Prod,Pass,Dr,Sound
Abc,51.3,Test,Fail,,
Def,8.2,Test,Fail,Td,Wifi
Def,44.2,Prod2,Pass,Gf,Printer
Xyz,6.2,Test1,Fail,Fr,Audio
Abc,451,Prod1,Pass,Cs,Audio"
| multikv forceheader=1
| table Name,WW,Name2,Result,Type,Value
| fillnull Name,WW,Name2,Result,Type,Value value="NULL"
| sort Name WW
| streamstats dc(Name) as session
| streamstats count by session
| eval session=session.":".count
| xyseries session Name,WW,Name2,Result,Type,Value
| rename Name2:* as *:2:Name2,WW:* as *:1:WW, Result:* as *:3:Result, Type:* as *:4:Type, Value:* as *:5:Value
| eval session=mvindex(split(session,":"),-1)
| untable session fieldname value
| xyseries session fieldname value
Name | WW | Name2 | Result | Type | Value |
---|---|---|---|---|---|
Abc | 50.5 | Prod | Pass | A | 1280 |
Xyz | 47.2 | Prod | Pass | Dr | Sound |
Abc | 51.3 | Test | Fail | ||
Def | 8.2 | Test | Fail | Td | Wifi |
Def | 44.2 | Prod2 | Pass | Gf | Printer |
Xyz | 6.2 | Test1 | Fail | Fr | Audio |
Abc | 451 | Prod1 | Pass | Cs | Audio |
を
session | Abc:1:WW | Abc:2:Name2 | Abc:3:Result | Abc:4:Type | Abc:5:Value | Def:1:WW | Def:2:Name2 | Def:3:Result | Def:4:Type | Def:5:Value | Xyz:1:WW | Xyz:2:Name2 | Xyz:3:Result | Xyz:4:Type | Xyz:5:Value |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 50.5 | Prod | Pass | A | 1280 | 8.2 | Test | Fail | Td | Wifi | 6.2 | Test1 | Fail | Fr | Audio |
2 | 51.3 | Test | Fail | NULL | NULL | 44.2 | Prod2 | Pass | Gf | Printer | 47.2 | Prod | Pass | Dr | Sound |
3 | 451 | Prod1 | Pass | Cs | Audio |
にしている。
##解説
- Splunkは同じフィールド名を複数できないので、どうしよっかな〜と思っていたら、
chart
やxyseries
で出てくるXX:YY
がふと降りてきた。 - 2つの
streamstats
はいつものsession作り。 -
xyseries
のあとrename
をしているのがここの肝。 -
xyseries
だと引数の3番目以降は全部値になってくれる。それをrename
で反転すると同時に途中に数字をいれて整列させている。(10以上だったらABCにしていたと思う) -
untable
とxyseries
は是非一回毎結果を見てもらいたいと思います。xyseries
で第1引数がまとめられるのを使ったテクニックです。
久しぶりによくできたクエリーだと思います。
#まとめ
index=_internal
| chart limit=0 count over sourcetype by source
`comment("ここで結果を確認")`
| transpose 0 header_field=sourcetype column_name="source"
`comment("ここで結果を確認")`
| untable source header count
`comment("ここで結果を確認")`
| xyseries source header count
chart
、stats
、table
の結果をtranspose
、untable
、xyseries
を使って自在に変換できるとより**Happy Splunk!**を実現できると思います。
- 2019/11/2 transposeの説明と応用例を追加
- 2019/11/18 xyseriesがchartで代用可能を追加
- 2020/12/25 表の縦横変換を追加