6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Splunkのtableの縦横を変換する

Last updated at Posted at 2019-06-22

Dataの準備

SPL
| 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

各プロセスの経過時刻をepochタイムっぽく作成
qiita1.jpg

縦横変換

SPL
| eval temp=1
| untable temp process time

ダミーのフィールド(ここではtemp)を作成して、untableで縦横変換
qiita2.jpg

これは、後statsとかでまとめる時に使う

SPL
| stats min(time) avg(time) max(time) by process

qiita3.jpg

#transpose
Splunk Docs

SPL
| 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の検索って結構表示制限があるので、結果が出ない時は制限を疑う必要があるな・・・:sweat:

オプションのheader_field=<field>でフィールド名を指定できる。
また、| rename "row *" as row_* で一括変更可能

evalで計算が可能なのでこの形も使いやすい。

#応用

SPL
| tstats count(_indextime) as count where index=_internal by _time span=1h source
| xyseries _time source count

一応metadataバージョンも

SPL
| 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でいける。

SPL
| tstats count(_indextime) as count where index=_internal by _time span=1h source
| chart sum(count) by _time source

byの後に2つのフィールド、特にこの場合の*_timeは複数のsource*にまたがっているのがキモ。
わかりやすい方で


ダッシュボード向けとして

SPL
index=_internal 
| stats count by source
| eval tmp="past 15 min"
| xyseries tmp source count

qiita1.png
トレリスを使ってX-Axisの表示をオフにしてみるとこんな感じでできる。

:sweat: chartの_over_と_by_がいつもこんがらがるので

SPL
index=_internal 
| chart limit=0 count over sourcetype by source
| transpose 0 header_field=sourcetype column_name="source"

overby行列と覚えて、transposeできれいに変換

#表の縦横変換
https://community.splunk.com/t5/Splunk-Search/Search-Result-Sorting-as-per-values-in-a-field/m-p/534049/highlight/true#M150932
ここで、自分でも結構よくできたと思う

make_table.spl
| 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は同じフィールド名を複数できないので、どうしよっかな〜と思っていたら、chartxyseriesで出てくるXX:YYがふと降りてきた。
  • 2つのstreamstatsはいつものsession作り。
  • xyseriesのあとrenameをしているのがここの肝。
  • xyseriesだと引数の3番目以降は全部値になってくれる。それをrenameで反転すると同時に途中に数字をいれて整列させている。(10以上だったらABCにしていたと思う)
  • untablexyseriesは是非一回毎結果を見てもらいたいと思います。xyseriesで第1引数がまとめられるのを使ったテクニックです。

久しぶりによくできたクエリーだと思います。

#まとめ

SPL
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

chartstatstableの結果をtransposeuntablexyseriesを使って自在に変換できるとより**Happy Splunk!**を実現できると思います。

  • 2019/11/2 transposeの説明と応用例を追加 
  • 2019/11/18 xyseriesがchartで代用可能を追加
  • 2020/12/25 表の縦横変換を追加
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?