Help us understand the problem. What is going on with this article?

Splunkでダミーデータを作る

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

コマンドは 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時間が整数なのも実はいい。

まとめ

いろいろ検索の仕方を考えるとき、ダミーのデータを使用して試行錯誤していくと思う。
とりあえず、ダミーデータをベタ打ちして上の3つのコマンドとか、いずれかを使えば簡単に検索用データが作成できると思う。

toshikawa
Splunkでいろいろやっています。 もっといい方法があったらぜひ教えてください
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした