Kibana Canvasでオシャレに可視化しよう

# はじめに
この記事は [NTTテクノクロス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ntt-tx)の1日目です。

こんにちわ。
NTTテクノクロス川崎です。
普段は主に社内へ技術ノウハウを展開したり、社外へ私たちの取り組みをアピールする業務をしています。

今回はNTT Tech Conference #3のShowcaseに展示したElastic StackのTwitterのハッシュタグ可視化デモ[^1]を例に、Canvas[^2]の使い方に触れたいと思います。

# 前提条件
- Elasticsearch,Kibanaがインストール済み
- Elasticsearch,Kibanaのバージョンは6.5.1
- Elasticsearchに可視化したいデータを投入済み
    - 今回使うデータは、Logstash Twitter input plugin[^3]で収集した`#ntttech`ハッシュタグのついたツイートデータ`index:ntttech`です。
 
# 用語説明
Canvasの用語を説明します。

## workpad
パワーポイントでいうところのプレゼンテーションと思ってください。

## page
ひとつのworkpadの中に、複数ページが作成できます。
パワポでいうとページ。

## element
page内に配置するグラフや画像です。
パワポでいうとグラフや画像。

# つくろう
早速これをつくってみます。
![ac01.png](https://qiita-image-store.s3.amazonaws.com/0/309010/5270abe7-9b69-8f02-6100-b69da37183d7.png)

おおまかな作業の流れは以下の通りです。

1. workpadを作る
2. elementを配置する
3. elementのDataを設定する(Elasticsearchと連携する)
4. elementのDisplayを設定する(デザインなどを設定する)

メインの作業は3.と4.です。

## Create workpad
まずworkpadを作ります。
Kibanaのトップページから、`Canvas`→`Create workpad`をクリックします。
![ac02.png](https://qiita-image-store.s3.amazonaws.com/0/309010/9ff7fd65-0756-a800-9566-0a4e3ccda3ae.png)
右側に表示される設定でNameやWorkpadの画面サイズ、背景色を設定します。
ページを追加したい場合は下部の`Page 1`→`+`をクリックすると追加できます。

## Add element
`Add element`をクリックすると、グラフや画像など様々なelementが選択できます。
![ac03.png](https://qiita-image-store.s3.amazonaws.com/0/309010/f071e902-4c8d-7ada-b65b-af4cbd17a002.png)
今回は`Donut chart`を追加してみました。
追加したelementはdemodataが設定されているので
右側の`Selected layer`→`Display`で、表示の設定を、
`Selected layer`→`Data`で、Elasticsearchの設定をします。
![ac04.png](https://qiita-image-store.s3.amazonaws.com/0/309010/1dc06414-f82f-2875-d0a2-9c9c5f4e236c.png)

また右下の`</>Expression editor`からコードを記述して設定することもできます。

これで1つずつelementを作っていきましょう。

## ツイート数の時系列グラフを表示する
- x軸：ツイート数
- y軸：時間

の棒グラフを作成します。

elementはLine chartを選択し、好きな位置に配置します。

今回はTimelionを使います。
`Data`→`Query`にTimelionの関数で`.es(index='ntttech')`
と記述します。

`Display`でデザインの設定をします。
`Dimensions & measures`でグラフの縦軸と横軸の値を設定します。
`Chart style`や`Element style`でフォントや色の設定を行います。

設定したコードはこちら。

```
filters
| timelion q=".es(index='ntttech')"
| pointseries x="@timestamp" y="value"
| plot defaultStyle={seriesStyle points="0" bars="10000" color="#FFFFFF" lines="0"} 
  font={font family="'Open Sans', Helvetica, Arial, sans-serif" size=6 align="left" color="#F3F3F3" underline=false italic=false} legend=false
| render 
  containerStyle={containerStyle border=" solid rgba(255,255,255,0)" backgroundColor="rgba(255,255,255,0)" opacity="0.5" padding="1px" borderRadius=".1px"}
```
`Data`と`Display`で設定した内容でコードが生成されます。

## ツイート数を表示する
`markdown`elementで以下のように実現しています。

```
filters
 | escount index="ntttech*"
 | as num_tweets
 | markdown "{{rows.0.num_tweets}}" font={font family="'fantasy', 'Chalkduster', sans-serif" size=70 align="center" color="rgba(250, 250, 250, 0.9)"  weight="normal" underline=false italic=false}
 | render containerStyle={containerStyle border="8px" backgroundColor="rgba(255,255,255,0)" opacity="0.75" padding="1px" borderRadius=".1px"}
```
`Metric`elementでも実現できそう・・・！

## 最新のツイート3件を表示する
`Data table`elementで最新のツイートを表示します。
ぽちぽち選択していくだけなので省略：）

## ツイート数分のひよこを表示する
`#NTTテクノクロス`とつぶやかれたツイート数分のひよこを表示します。
100の位ひよこ、10の位ひよこ、１の位ひよこはそれぞれ別のelementです。
この例の場合`#NTTテクノクロス`と149回つぶやかれているので、100の位ひよこを1匹、10の位ひよこを4匹、1の位ひよこを9匹表示するように計算するのがポイントです。

ここでは1の位ひよこの設定を例に紹介します。

`Image repeat`elementを作成し、`Upload Image`から画像をアップロードします。
`Display`で画像のサイズや最大何個の画像を表示するか設定を行います。

```
escount index="ntttech" query="text=\"*#NTTテクノクロス*\""
| math "floor(value - (floor(value / 10) * 10))" 
| repeatImage image={asset "asset-c4ed542f-11ed-4982-bfe5-5f0efc49a1d0"} size=50 max=9
| render containerStyle={containerStyle backgroundColor="rgba(255,255,255,0)" opacity="0.75" padding="1px" borderRadius=".1px"}
```
今回`Data`と`Display`のみでは、うまく実現できなかったので、コードを修正しています。

# おわりに
Canvasをつかう時は

- `Data`と`Display`をぽちぽちすれば、いい感じの画面がつくれる
- 手の届かないところは`</>Expression editor`をつかう

デモ実施から3ヵ月経ったので、デモ環境を6.3.2から6.5.1にバージョンアップして本記事を執筆しましたが、elementが増えたり使える機能が増えたりと、また結構変わりました。
これからも追従しながら、発信できるよう努めます：）

[OpenStack®クラウド](https://www.ntt-tx.co.jp/products/osscloud/?utm_source=qiita&utm_medium=ac2018&utm_campaign=01)をはじめ、[PostgreSQL](https://www.ntt-tx.co.jp/products/osscloud/service/migration/?utm_source=qiita&utm_medium=ac2018&utm_campaign=01)、モバイル、[機械学習](https://www.ntt-tx.co.jp/products/iot_suite/?utm_source=qiita&utm_medium=ac2018&utm_campaign=01)、VR、[AWS](https://www.ntt-tx.co.jp/products/aws/?utm_source=qiita&utm_medium=ac2018&utm_campaign=01)、[Elastic Stack](https://www.ntt-tx.co.jp/products/elastic/?utm_source=qiita&utm_medium=ac2018&utm_campaign=01)などに携わるメンバの記事がアップされる予定です。
今後の[NTTテクノクロス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ntt-tx)もお楽しみに！

[^1]: [NTT Tech Conference #3でKibana Canvasのデモ展示を行いました！](https://www.ntt-tx.co.jp/column/elastic_blog/20180907/?utm_source=qiita&utm_medium=ac2018&utm_campaign=01)
[^2]: [Kibana User Guide [6.5]](https://www.elastic.co/guide/en/kibana/6.5/canvas.html)
[^3]: [Twitter input plugin](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-twitter.html)