これまでもいろいろ作ってきたのでまとめてみる。
コマンドは multikv makemv kvの三つ。
あと地道につくるappendpipe
追加でwindbagとgentimes
##multikv
multikv@Splunk Docs
####クエリー
| makeresults
| eval _raw="Date,time,title,code
01/10/2019,08:22,ABC_PORTAL,200
01/10/2019,10:04,ABC_PORTAL,200"
| multikv forceheader=1
####結果
Date | _raw | _time | code | linecount | time | title |
---|---|---|---|---|---|---|
01/10/2019 | 01/10/2019,08:22,ABC_PORTAL,200 | 2019/10/22 13:50:56 | 200 | 1 | 08:22 | ABC_PORTAL |
01/10/2019 | 01/10/2019,10:04,ABC_PORTAL,200 | 2019/10/22 13:50:56 | 200 | 1 | 10:04 | ABC_PORTAL |
####解説 | ||||||
multikv は*_raw*フィールドを展開してくれる。 |
区切り文字は空白でも大丈夫だけど、うまく行かない場合があるのでCSVだと安心
空白の場合はフィールド頭を揃えること
##makemv
makemv@Splunk Docs
####クエリー
| makeresults
| eval raw="01/10/2019 08:22 ABC_PORTAL 200
01/10/2019 10:04 ABC_PORTAL 200"
| makemv delim="
" raw
| mvexpand raw
| rex field=raw "(?<Date>[^ ]+) (?<time>[^ ]+) (?<title>[^ ]+) (?<code>[^ ]+)"
####結果
|Date|_time|code|raw|time|title|
|:--|:--|:--|--:|--:|:--|:--|
|01/10/2019|2019/10/22 14:00:17|200|01/10/2019 08:22 ABC_PORTAL 200|08:22|ABC_PORTAL|
|01/10/2019|2019/10/22 14:00:17|200|01/10/2019 10:04 ABC_PORTAL 200|10:04|ABC_PORTAL|
####解説
一部フィールドに値がなかったりするときはmakemv
を使用する。
フィールド抽出が柔軟にできるのがいい。
ポイントはmakemv
の引数*delim=*に改行__Shift+Enter__を使っていること。初めてみたとき目からうろこだった。
##stats countかmakeresultsか
何行とか指定して作りたい時はmakeresults
、特にない時はstats count
あとは時系列データの作成。
timechart
用のデータを作る時、10分間隔だと
| makeresults count=2
| streamstats count
| eval _time=if(count==2,relative_time(_time,"+1h@min"),relative_time(_time,"@min"))
| makecontinuous _time span=10m
| timechart fixedrange=f span=10m count
_time | count |
---|---|
2019/10/22 14:30:00 | 2 |
2019/10/22 14:40:00 | 0 |
2019/10/22 14:50:00 | 1 |
2019/10/22 15:00:00 | 1 |
2019/10/22 15:10:00 | 1 |
2019/10/22 15:20:00 | 1 |
2019/10/22 15:30:00 | 2 |
みたいに作る。 |
stats
からstrptime
でつくってmakecontinuous
に渡してあげた方が楽かも。
| stats count
| eval raw="2019-10-22 14:30:00"
| appendpipe [eval raw="2019-10-22 15:30:00"]
| eval _time=strptime(raw,"%F %T")
| makecontinuous span=10min
楽だった。_"%F %T"_を覚えているなら。gentimes
とかもあるけど、使わないな〜。
##kv
extract@Splunk>docs
kv
はextract
のエリアス
| makeresults
| eval raw="user1=1,user2=2,user3=3,user4=4"
| eval _raw=raw
| kv
####結果
_raw | _time | raw | user1 | user2 | user3 | user4 |
---|---|---|---|---|---|---|
user1=1,user2=2,user3=3,user4=4 | 2019/10/26 08:09:03 | user1=1,user2=2,user3=3,user4=4 | 1 | 2 | 3 | 4 |
####JSON
| makeresults
| eval _raw="{ \"samplejson\": [
{
\"epochtime\": 1573532862,
\"value\": 5.29
}, {
\"epochtime\": 1573532562,
\"value\": 5.34
} ] }"
| kv
普通は spath
だと思うけど、kv
でもいける。
######JSONを作る時のポイント
- 文字列は
\"
で囲う - しっかり
,
で区切る
HPからコピペする際は、テキストエディタSplunk(⌘+F 2回押し)でここら辺をきちんと加工してあげないと
spath
やkv
がきちんとうごかない。
####alphabet
| makeresults count=91
| streamstats current=f count
| reverse
| head 26
| eval ascii=printf("%c",count)
| stats list(ascii) as capital
| eval non_capital = lower(capital)
| eval ascii=mvappend(capital,non_capital)
| stats count by ascii
| table ascii
ascii |
---|
A |
B |
C |
... |
x |
y |
z |
なにかに使うかもしれない、アルファベット52文字
ASCII Table通りZ
が0
から始まって90
番目なので、このクエリーになる。
printf()
の使い方がいまいちわからなかたけど、こういう使い方なのね。
横に戻す場合は
| mvcombine ascii delim=""
| nomv ascii
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
となる。
##appendpipe
appendpipe@Splunk>docs
| stats count
| eval raw="2019/10/22 14:30:00"
| appendpipe [eval raw="2019/10/22 15:30:00" ]
単純に追加していくならappendpipe
軽く作るのならこれでいいと思う。
##R的に作ってみる
ベタ打ちした場合。
| makeresults
| eval raw="173,178,180,183,182,174,179,179,174,192
17000,14000,9000,50000,30000,12000,900,2100,1000,25000"
| makemv delim="
" raw
| stats count by raw
| eval raw=split(raw,",")
| transpose
| eval counter=mvrange(0,mvcount('row 1'))
| stats list(*) as * by counter
| eval hight=mvindex('row 2',counter), salary=mvindex('row 1',counter)
| table hight salary
hight | salary |
---|---|
173 | 17000 |
178 | 14000 |
180 | 9000 |
183 | 50000 |
182 | 30000 |
174 | 12000 |
179 | 900 |
179 | 2100 |
174 | 1000 |
192 | 25000 |
あんまりよくないな〜。
| makeresults
| eval hight="173,178,180,183,182,174,179,179,174,192"
| eval salary="17000,14000,9000,50000,30000,12000,900,2100,1000,25000"
| foreach *
[eval <<FIELD>>=split(<<FIELD>>,",")]
| eval _counter=mvrange(0,mvcount(hight))
| stats list(*) as * by _counter
| foreach *
[eval <<FIELD>>=mvindex(<<FIELD>>,_counter) ]
1行ずつフィールドにした方が簡単だった。
##windbag
ここでこれを出すのは、_position_に0〜99の数を持っているから。
_odd_には奇数が入っている。
| windbag
| table position
streamstats current=f count
の方が使い勝手があるかもしれないけど
| windbag
| eval _time = _time - random()
| sort _time
| table position
とかでランダムデータが作れる。
####streambag
| streambag
windbag
の1000イベントバージョン。でも_position_は0〜99まで。
##gentimes
gentimes@splunk>docs
なんかEOLっぽくかいてるけど
| gentimes start=10/01/2019 end=10/30/2019
日付データをつくるならこれが早い。自分だと時間単位で作るので使わなかったりした。
UNIX時間が整数なのも実はいい。
#追記(R2.7.27)
| makeresults count=10
| fields - _time
| streamstats count
| eval randomfield = substr(md5(tostring(random())),0,5)
| eval {randomfield} = "user" + count
| eval _raw=""
| foreach *
[| eval _raw=
_raw.if(isnotnull('<<FIELD>>'),
"<<FIELD>>=\"".
'<<FIELD>>'.
"\" "
,"")
]
| table _raw | kv
SlackでMaarten (Splunk Support)の書いてたクエリーにびっくりしたので。
これはすごい
##まとめ
いろいろ検索の仕方を考えるとき、ダミーのデータを使用して試行錯誤していくと思う。
とりあえず、ダミーデータをベタ打ちして上の3つのコマンドとか、いずれかを使えば簡単に検索用データが作成できると思う。