Amazon Elasticsearch ServiceのKibanaでインデックスパターンを自分で定義する方法

こんにちは、幅広い視野を持つエンジニアを目指しています田中と申します。

この記事ではAmazon Elasticsearch ServiceのKibana(4.1.2-es2.0)を使っていてぶつかった問題の解決方法を見ていきます。

目的

Kibanaを使用し、IoTデバイスのセンサ値(TI社センサータグ)を可視化する。

やってみた事

Kibanaのデフォルトインデックスに頼らず、自分でインデックスパターンを定義する。

きっかけ

KibanaでIoTデバイスのセンサ値を可視化して表示しようと試みたが、Kibanaが日付型を自動認識してくれなかったり、センサ値を文字列型として認識してしまい、グラフの軸として指定できないということが起こった。(画像参照)
Kibanaが型を誤ってしまう
Y軸として指定できない

jsonを記述してインデックスパターンを定義する

マッピング定義を書いたjsonファイルを作ります。

{
    "properties": {
        "a0:e6:f8:af:2a:05": {
            "properties": {
                "accelerometer_x": {
                    "type": "float",
                    "index": "analyzed"
                },
                "accelerometer_y": {
                    "type": "float",
                    "index": "analyzed"
                },
                "accelerometer_z": {
                    "type": "float",
                    "index": "analyzed"
                },
                "ambient_temperature": {
                    "type": "float",
                    "index": "analyzed"
                },
                "battery_level": {
                    "type": "long",
                    "index": "analyzed"
                },
                "date": {
                    "type": "date",
                    "format": "strict_date_optional_time||epoch_millis"
                },
                "gyroscope_x": {
                    "type": "float",
                    "index": "analyzed"
                },
                "gyroscope_y": {
                    "type": "float",
                    "index": "analyzed"
                },
                "gyroscope_z": {
                    "type": "float",
                    "index": "analyzed"
                },
                "luxometer": {
                    "type": "float",
                    "index": "analyzed"
                },
                "magnetometer_x": {
                    "type": "float",
                    "index": "analyzed"
                },
                "magnetometer_y": {
                    "type": "float",
                    "index": "analyzed"
                },
                "magnetometer_z": {
                    "type": "float",
                    "index": "analyzed"
                },
                "object_temperature": {
                    "type": "float",
                    "index": "analyzed"
                },
                "raw_humidity": {
                    "type": "float",
                    "index": "analyzed"
                },
                "raw_temperature": {
                    "type": "float",
                    "index": "analyzed"
                },
                "rssi_level": {
                    "type": "long",
                    "index": "analyzed"
                }
            }
        }
    }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.htmlを見ながら自分でテンプレートを書きます。
以下少し解説します。

/* データの型を明示する。https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.htmlを参照してください */
“type”: “float”

/* データの要素解析を行うかどうか、文字列として部分一致検索を行う場合は”analyzed”にしておく。詳しくはhttps://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html */
“index”: “analyzed”

/* 時刻形式として受け付ける表現を明示する、複数指定も可能。moment.js(http://momentjs.com/)互換の時刻形式が指定できる。詳細はhttps://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html */
“format”: “strict_date_optional_time||epoch_millis”

インデックスパターンを設定する

curlコマンドを利用してElasticsearchにインデックスパターンを設定します。

# curl -XPUT 'http://search-skyarch-elasticsearch2-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/test/_mapping/sensor' -d @mapping.json

・・・とすると

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [a0:e6:f8:af:2a:05.accelerometer_x] of different type, current_type [string], merged_type [float]"}], "status":400}

と怒られます。どうやら既存のインデックスに対して適用することはできないようです。なので、下記コマンドで空のインデックスを新しく作成します。

# curl -XPUT 'http://search-skyarch-elasticsearch2-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/test2/'

再びインデックスパターンの設定を試みます。

# curl -XPUT 'http://search-skyarch-elasticsearch2-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/test2/_mapping/sensor' -d @mapping.json

すると・・・

{"acknowledged":true}

と返ってきて無事設定できました!
ただし、この方法は日付からインデックスを自動生成する設定にしている場合、一日おきにインデックスパターンを作らなければならず、実運用には向かないので注意が必要です。

再挑戦

上手くいくでしょうか・・・?
正しい解釈結果

大成功です!

番外編

それでは、社内でも貧乏ゆすりが酷いことで有名なエンジニアの膝にセンサを設置、貧乏ゆすりのBPMを計ります。
貧乏ゆすりの酷いエンジニアの振動の波形
今日も今日とてこのエンジニアは319[ミリ秒/回]=3.135[回/秒]=188[BPM]で貧乏ゆすりをしていることがわかりました!

記事は以上になります。
このたびはご覧戴き、ありがとうございました。

投稿者プロフィール

tanaka
OS非依存のスクリプト言語によるバッチ処理が得意です。C言語やJavaなどのソフトウェア開発の経験もあります。幅広い視野でプログラミングすることを第一に総合的なエンジニアを目指すため、ネットワーク管理や監視を通して勉強をし、Linuxの知識を高めていきたいです。

ABOUTこの記事をかいた人

OS非依存のスクリプト言語によるバッチ処理が得意です。C言語やJavaなどのソフトウェア開発の経験もあります。幅広い視野でプログラミングすることを第一に総合的なエンジニアを目指すため、ネットワーク管理や監視を通して勉強をし、Linuxの知識を高めていきたいです。