はじめに
Kibana Canvas、使ってますか?使ってますよね。
Kibana Canvasの1画面に異なる期間のデータを描画したいなーって時、ありますよね。

今週のデータと先週のデータを横並べにしたり。
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したら出来上がり。
左が今週、右が先週のデータが描画できました。
おわりに
- Kibana Canvasかわいいね!Kibana Canvasいいね!という人が増えますように
- 他の人の作ったCanvasが見たい
- Canvas function referenceはいいぞ。
-
たべたい。
おまけ
出来上がりイメージで使っていた小技一覧
- 寿司→
変換: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
