Kibana Canvasで時系列データを⽐較表⽰する

# はじめに
Kibana Canvas、使ってますか？使ってますよね。
Kibana Canvasの1画面に異なる期間のデータを描画したいなーって時、ありますよね。
![完成イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309010/da9e23f1-5a96-4320-e45f-d5b0d68fb780.png)
今週のデータと先週のデータを横並べにしたり。

Kibanaの`Customize time range`と同様の表示を、Canvasでもやりたいですよね。
というわけで、やりましょう。

# ざっくりやること
- Time filterに`filterGroup=`でグループ名をつける
- Elementに`group=`で同じグループ名をつける

# 今回のデータ
2週間分のランチデータです。1日分はこんな感じ。

```
   {
        "_index" : "lunch",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "id" : 1,
          "menu" : "おにぎり",
          "date" : "2020-02-03T12:00:00+0900"
    }
```

# やること
## 事前準備
CanvasのWorkPadをつくっておく。

## Time filterをつくる
まず今週用と先週用でTime filterを2つ作ります。
Add element>Time filterをぽち。
作成したelementを選択して、右下の</>Expression editorでみると、こう。

```
timefilterControl compact=true column=@timestamp
| render
```

右側のSelected element>Display>Time filter横の+マーク>Filter group>Filter groupをぽち。
ここにグループ名を、今回は`this_week`と入れ`Set`をぽち。

同じくSelected element>Display>Time filter>ColumnにTime filterで利用するColumn名を、今回は`date`と入れSetをぽち。
Expression editorでみると、こう。

```
timefilterControl compact=true column="date" filterGroup="this_week"
| render
```
columnの値が変更され、filterGroupが追加された今週用のTime Filterが完成しました。
先週用のTime filterは、同じ手順で`filterGroup="last_week"`として作成します。

## Data tableをつくる
続いて今週用と先週用でData tableを2つ作ります。
Add element>Data tableをぽち。
Expression editorでみると、こう。

```
filters
| demodata
| table
| render
```

デモデータを描画するようになっているので、データ元を変更します。
Add element>Data table>Demo Data>Elasticsearch raw documentをぽち。

 - index
 - fields

を選択します。
今回は下のように設定します。

```
filters
| esdocs index="lunch*" fields="date, menu"
| table
| render
```

groupの設定をしたいのですが、Selected elementでは設定出来ないので、Expression editorで直書きします。

```
filters group="this_week"
| esdocs index="lunch*" fields="date, menu"
| table
| render
```

先週用のData tableは`group="last_week"`にして作成します。
Time filterの日付を今週と先週に合わせて、画面をRefreshしたら出来上がり。

![手順イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309010/9ab38333-bc8b-1d74-b5f5-3907ff68a8e7.png)

左が今週、右が先週のデータが描画できました。

# おわりに
- Kibana Canvasかわいいね！Kibana Canvasいいね！という人が増えますように:pray:
- 他の人の作ったCanvasが見たい:pray:
- [Canvas function reference](https://www.elastic.co/guide/en/kibana/current/canvas-function-reference.html)はいいぞ。
- :sushi:たべたい。

# おまけ
出来上がりイメージで使っていた小技一覧

- 寿司→:sushi:変換：`mapColumn`
- 日付のフォーマット指定：`mapColumn`
- date→日付、menu→メニュー変換：`alterColumn`
- `getCell`は便利

```
filters group="last_week"
| esdocs index="lunch*" fields="date, menu"
| mapColumn "date" fn={getCell date | formatdate "YYYY/MM/DD"} 
| mapColumn name="menu" expression={if {getCell "menu" | eq 寿司} then="🍣" else={getCell "menu"}}
| alterColumn column="date" name="日付"
| alterColumn column="menu" name="メニュー"
| table paginate=false
  font={font family="メイリオ','Open Sans', Helvetica, Arial, sans-serif" size=14 align="left" color="#FFFFFF" weight="normal" underline=false italic=false}
| render
```

# 参考
- [Kibanaで時系列データを⽐較表⽰する⽅法3選](https://speakerdeck.com/j__yama/three-methods-for-comparing-and-displaying-time-series-data-on-kibana)
- [Canvas function reference](https://www.elastic.co/guide/en/kibana/current/canvas-function-reference.html)