LoginSignup
4
2

More than 3 years have passed since last update.

Splunkでダミーデータを作る

Last updated at Posted at 2019-10-22

これまでもいろいろ作ってきたのでまとめてみる。

コマンドは multikv makemv kvの三つ。
あと地道につくるappendpipe
追加でwindbaggentimes

multikv

multikv@Splunk Docs

クエリー

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

クエリー

SPL
| 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分間隔だと

SPL
| 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に渡してあげた方が楽かも。

SPL
| 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
kvextractのエリアス

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

SPL
| makeresults
 | eval _raw="{ \"samplejson\": [
 {
 \"epochtime\": 1573532862,
 \"value\": 5.29
 }, {
 \"epochtime\": 1573532562,
 \"value\": 5.34
 } ] }"
 | kv

普通は spathだと思うけど、kvでもいける。

JSONを作る時のポイント
  1. 文字列は\"で囲う
  2. しっかり,で区切る

HPからコピペする際は、テキストエディタSplunk(⌘+F 2回押し)でここら辺をきちんと加工してあげないと
spathkvがきちんとうごかない。

alphabet

SPL
| 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通りZ0から始まって90番目なので、このクエリーになる。
printf()の使い方がいまいちわからなかたけど、こういう使い方なのね。

横に戻す場合は

SPL
| mvcombine ascii delim=""
| nomv ascii

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzとなる。

appendpipe

appendpipe@Splunk>docs

SPL
| stats count
| eval raw="2019/10/22 14:30:00"
| appendpipe [eval raw="2019/10/22 15:30:00" ]

単純に追加していくならappendpipe
軽く作るのならこれでいいと思う。

R的に作ってみる

ベタ打ちした場合。

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

あんまりよくないな〜。

SPL
| 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には奇数が入っている。

SPL
| windbag
| table position

streamstats current=f countの方が使い勝手があるかもしれないけど

SPL
| windbag
| eval _time = _time - random()
| sort _time
| table position

とかでランダムデータが作れる。

streambag

SPL
| streambag

windbagの1000イベントバージョン。でもpositionは0〜99まで。

gentimes

gentimes@splunk>docs
なんかEOLっぽくかいてるけど

SPL
| gentimes start=10/01/2019 end=10/30/2019

日付データをつくるならこれが早い。自分だと時間単位で作るので使わなかったりした。
UNIX時間が整数なのも実はいい。

追記(R2.7.27)

dummy.spl
| 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つのコマンドとか、いずれかを使えば簡単に検索用データが作成できると思う。

4
2
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
4
2