Splunkでダミーデータを作る

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

コマンドは　[multikv](#multikv) [makemv](#makemv) [kv](#kv)の三つ。
あと地道につくる[appendpipe](#appendpipe)
追加で[windbag](#windbag)と[gentimes](#gentimes)
##multikv
[multikv@Splunk Docs](https://docs.splunk.com/Documentation/Splunk/7.3.2/SearchReference/Multikv)

####クエリー
```Splunk: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](https://docs.splunk.com/Documentation/Splunk/7.3.2/SearchReference/makemv)
####クエリー
```Splunk: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分間隔だと

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

```Splunk: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](https://docs.splunk.com/Documentation/Splunk/8.0.1/SearchReference/extract)
`kv`は`extract`のエリアス

```Splunk: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

```Splunk:SPL
| makeresults
 | eval _raw="{ \"samplejson\": [
 {
 \"epochtime\": 1573532862,
 \"value\": 5.29
 }, {
 \"epochtime\": 1573532562,
 \"value\": 5.34
 } ] }"
 | kv
```
普通は `spath`だと思うけど、`kv`でもいける。

######JSONを作る時のポイント

1. 文字列は`\"`で囲う
2. しっかり`,`で区切る

HPからコピペする際は、~~テキストエディタ~~Splunk（⌘＋F　２回押し）でここら辺をきちんと加工してあげないと
`spath`や`kv`がきちんとうごかない。

####alphabet
```Splunk: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 |

なにかに使うかもしれない、アルファベット５２文字
[ASCII Table](https://commons.wikimedia.org/wiki/File:ASCII-Table-wide.svg)通り`Z`が`0`から始まって`90`番目なので、このクエリーになる。
`printf()`の使い方がいまいちわからなかたけど、こういう使い方なのね。

横に戻す場合は

```Splunk:SPL
| mvcombine ascii delim=""
| nomv ascii
```
`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`となる。

##appendpipe
[appendpipe@Splunk>docs](https://docs.splunk.com/Documentation/Splunk/8.0.1/SearchReference/Appendpipe)

```Splunk:SPL
| stats count
| eval raw="2019/10/22 14:30:00"
| appendpipe [eval raw="2019/10/22 15:30:00" ]
```
単純に追加していくなら`appendpipe`
軽く作るのならこれでいいと思う。
##R的に作ってみる
ベタ打ちした場合。

```Splunk: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

あんまりよくないな〜。

```Splunk: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) ]
```
１行ずつフィールドにした方が簡単だった。

##windbag
ここでこれを出すのは、_position_に0〜99の数を持っているから。
_odd_には奇数が入っている。

```Splunk:SPL
| windbag
| table position
```
`streamstats current=f count`の方が使い勝手があるかもしれないけど

```Splunk:SPL
| windbag
| eval _time = _time - random()
| sort _time
| table position
```
とかでランダムデータが作れる。

####streambag
```Splunk:SPL
| streambag
```
`windbag`の1000イベントバージョン。でも_position_は0〜99まで。

##gentimes
[gentimes@splunk>docs](https://docs.splunk.com/Documentation/Splunk/8.0.1/SearchReference/Gentimes)
なんかEOLっぽくかいてるけど

```Splunk:SPL
| gentimes start=10/01/2019 end=10/30/2019
```
日付データをつくるならこれが早い。自分だと時間単位で作るので使わなかったりした。
UNIX時間が整数なのも実はいい。

#追記（R2.7.27)
```sql: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)](https://app.slack.com/client/T047WPASC/CD8B6F65Q/user_profile/U580X17K3)の書いてたクエリーにびっくりしたので。

これはすごい

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