Kibanaの小技！bundlesフォルダの活用でローカル画像を埋め込む

株式会社 日立製作所 謝洋

#免責事項/Disclaimer
- 本記事は、あくまで執筆者の見解であり、所属企業及びElastic社の公式なドキュメントではありません。
- 本記事の作成に利用したElasticsearchとKibanaのバージョンは6.5.1です。これ以外のバージョンで操作を再現できることを保証しません。
- 本記事で利用した絵文字画像の著作権は、[Twitterの絵文字ライブラリ（twemoji）](https://twemoji.twitter.com/)に属します。
 - （利用許諾: [Graphics licensed under CC-BY 4.0] (https://creativecommons.org/licenses/by/4.0/)）

#1. はじめに
KibanaはElastic Stack(OSS)のコンポーネントとしてElasticsearchと連携して使用するデータ可視化ツールです。Kibanaでは、データをグラフや表で可視化すること以外に、インターネットで公開されている画像を表示することもできます。例えば、下記のDiscovery画面にインターネット画像またはインターネット画像のURLを表示することができます。 
![discovery_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/6bb3ffdd-b3c4-aea7-1f41-060b7f44185f.png)
また、下記の図のようにMarkdownで作成した画面にもインターネット画像を表示することができます。
![markdown_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/d2ef680e-da93-ab04-5025-4c195067e880.png)

このように、[http:]URL表記によりKibanaの画像にインターネット画像を貼り付け画面を華やかに飾ることができます。しかし、[file:]URL表記を記述することができないため、ローカル画像を表示することができません。そこで本記事ではbundlesフォルダを活用し、Kibanaの画面にローカル画像を表示する方法をご紹介します。

#2. bundlesフォルダとは
bundlesフォルダは、Kibanaのインストールフォルダの配下にあるoptimize/bundlesフォルダを指します。bundlesフォルダの中身は、htmlの外部ファイルであるcssやjsのファイルなどです。

```:bundlesフォルダの中身を確認
[root@host bundles]# pwd
/usr/share/kibana/optimize/bundles
[root@host bundles]# ls
(略)
commons.bundle.js                       space_selector.bundle.js
commons.style.css                       space_selector.entry.js
dashboardViewer.bundle.js               space_selector.style.css
dashboardViewer.entry.js                src
(略)
```
見た目はKibanaの構成ファイルを格納する普通のフォルダですが、このフォルダは1つの特徴があります。まず下記のようにbundlesフォルダの中に画像ファイルをコピーしてみます。

```:画像ファイルをbundlesにコピー
[root@host bundles]# pwd
/usr/share/kibana/optimize/bundles
[root@host bundles]# cp ~/gorilla.png .
[root@host bundles]# ls ./*.png
./gorilla.png
```
次にKibanaのリンクの後ろに、bundles/gorilla.pngを追加しブラウザで開くと、下記の画面が表示されます。Security機能が有効になっている場合、Kibanaにアクセスできるアカウントにログインすることが求められます。
![gorilla.png](https://qiita-image-store.s3.amazonaws.com/0/322295/a96c7edb-9c27-96c0-6385-f516ae71ce5a.png)
bundlesフォルダの中に置いているファイルは、Kibanaにアクセスする権限があるユーザでブラウザからアクセスできることが分かりました。これにより、bundlesフォルダに置いている画像ファイルをDiscoveryまたはMarkdownからアクセスすることも可能となります。詳細を次の活用例の章で詳しく説明していきます。

#3. 活用例
本章では、bundlesフォルダに置いている画像ファイルをDiscoveryとMarkdownで表示する方法を説明します。操作を再現できるように、データセットの用意から説明します。
##3.1. データセットの準備
###3.1.1. 画像ファイルの準備
下記の手順で画像をbundlesフォルダに入れておきます。

1. bundlesフォルダの下に、名前がimagesのフォルダを作成します。

    ```:imagesフォルダの作成
[root@host bundles]# pwd
/usr/share/kibana/optimize/bundles
[root@host bundles]# mkdir images
[root@host bundles]# ls | grep images
images
```
1. imagesフォルダの下に下記の画像をコピーします。
  ![images.png](https://qiita-image-store.s3.amazonaws.com/0/322295/9c62f5fd-4004-9f00-b5b2-1335426c3362.png)

    ```:imagesフォルダに画像をコピー
[root@host bundles]# pwd
/usr/share/kibana/optimize/bundles
[root@host bundles]# cd images
[root@host images]# cp ~/images/*.png .
[root@host images]# ls
baseball.png    cn.png  gb.png  soccer.png  title.png
basketball.png  fr.png  jp.png  tennis.png  us.png
```

###3.1.2. インデックスの作成
下記の手順でKibanaにリンクしているElasticsearch側の準備作業を実施します。

1. Elasticsearchでインデックスplayersを作成します。

    ```:インデックスplayersを作成
    PUT players
     {
      "settings": {
        "number_of_shards":1,
        "number_of_replicas":0
      },
      "mappings": {
        "list": {
          "properties":{
            "id": {
              "type":"keyword"
            },
            "name": {
              "type":"keyword"
            },
            "nationality": {
              "type":"keyword"
            },
            "gender": {
              "type":"keyword"
            },
            "event": {
              "type":"keyword"
            }
          }
        }
      }
    }
```
1. 下記に示す通り、5人分の選手情報をインデックスplayersに登録します。

    ```:1番目の選手情報を登録
    PUT players/list/1
    {
      "id" : "1",
      "name": "Watanabe",
      "gender": "male",
      "event": "baseball",
      "nationality": "jp"
    }
```

    ```:2番目の選手情報を登録
    PUT players/list/2
    {
      "id": "2",
      "name": "Johnson",
      "gender": "male",
      "event": "basketball",
      "nationality": "us"
    }
```
   
    ```:3番目の選手情報を登録
    PUT players/list/3
    {
      "id": "3",
      "name": "Li",
      "gender": "female",
      "event": "tennis",
      "nationality": "cn"
    }
```

    ```:4番目の選手情報を登録
    PUT players/list/4
    {
      "id": "4",
      "name": "Robert",
      "gender": "female",
      "event": "tennis",
      "nationality": "fr"
    }
```

    ```:5番目の選手情報を登録
    PUT players/list/5
    {
      "id": "5",
      "name": "Jones",
      "gender": "male",
      "event": "soccer",
      "nationality": "gb"
    }
```

###3.1.3. Index Patternsの設定
下記の手順でKibanaにて[Index Patterns]の設定作業をします。

1. [Management]->[Kibana]->[Index Patterns]画面を開き、下記に示す手順でIndex patternsを作成します。
![create_index_pattern_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/8e84d81e-d7b2-23bf-2193-289289e61d68.png)
![create_index_pattern_2.png](https://qiita-image-store.s3.amazonaws.com/0/322295/49933575-c644-f7f8-c14f-82cb4c51fea0.png)
1. [Management]->[Kibana]->[Index Patterns]画面を開き、下記に示す手順でフィールド[event]のフォーマットを編集します。
![edit_field_format_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/5820ecdf-a6ed-3bcc-8482-fb544d8b2a16.png)
![edit_field_format_2.png](https://qiita-image-store.s3.amazonaws.com/0/322295/8045dcc7-33cb-4d20-4a3f-7e7f0ec402c5.png)
![edit_field_format_3.png](https://qiita-image-store.s3.amazonaws.com/0/322295/4c9ae0a5-6080-904b-7a35-1e8287eee62d.png)
1. ステップ2を繰り返し、[event]と同じ設定方法で[gender]および[nationality]フィールドのフォーマットを編集します。
![edit_field_format_4.png](https://qiita-image-store.s3.amazonaws.com/0/322295/d349027c-5bb0-b80a-f616-105104d478e0.png)

##3.2. Dashboardの作成

###3.2.1. Discovery画面の作成
下記に示す手順で名前が[player_list]の[Search]画面を作成します。
![create_search_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/b969e555-f77a-9228-a81c-65a3842882e2.png)
![create_search_2.png](https://qiita-image-store.s3.amazonaws.com/0/322295/1142eae8-219c-3d41-ab84-884ad40e3991.png)

###3.2.2. Markdown画面の作成
[Visualize]画面を開き、下記に示す手順で名前が[title]の[Markdown]画面を作成します。
![create_markdown_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/fe88fcb3-5447-e703-a9d9-cb7ecd1fe083.png)
![create_markdown_2.png](https://qiita-image-store.s3.amazonaws.com/0/322295/26aaabee-92e0-518f-760a-1fec37c92cf8.png)
![create_markdown_3.png](https://qiita-image-store.s3.amazonaws.com/0/322295/ca52b863-e4bb-fc32-bd84-6a42ef915e06.png)

###3.2.3. Dashboardの作成
[Dashboard]画面を開き、下記に示す手順で名前が[ball_game_tournament]のDashboardを作成します。
![create_dashboard_1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/07de7337-fdc4-45c5-cef2-c16112f89660.png)
![create_dashboard_2.png](https://qiita-image-store.s3.amazonaws.com/0/322295/d7156231-a6e8-ee75-e287-67da8f731ef2.png)
![create_dashboard_3.png](https://qiita-image-store.s3.amazonaws.com/0/322295/1f847781-e40b-43c7-0a13-6fc3e3f08920.png)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/7e9d201a-467c-9d81-7f96-d707c65e6fc3.png)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/236918f2-8fd8-fbe5-83b9-b9aea95feb2d.png)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/8d67ddf7-6b1f-c10d-df07-4888e0fd0c58.png)

ダッシュボードを全画面で表示してみます。ローカル画像ファイルが表示されていることを確認できました。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/322295/dd217706-89eb-e744-3475-2ef1fd262da1.png)

#4. おわりに
本記事ではbundlesフォルダを活用することで、ローカル画像をKibanaの画面に表示する方法を説明しました。皆さんもこのbundlesフォルダの活用を参考にして多種多彩なDashboardを作成してみては如何でしょうか。