ELK Stackでシステム監視 elasticsearchインデックスのスキーマが勝手に変わる対処 テンプレート作成

監視対象ホストの状態をkibanaのダッシュボードで確認していたら昨日まで正常に表示されていた筈のNTPサーバのoffset等のグラフがゼロ(0)で動かなくなっていた。グラフに線が表示されないなら値が取れていないと思われるがゼロに張り付いているということは値が取れていてそれがゼロということ。 では、取得している値が本当にゼロになっているのかとDiscoverから確認するとゼロではない値が取得されている。ただし、1より遥かに小さい値。

これはインデックスで扱っている数値の型が間違っている可能性が高そう。

elasticsearch インデックスのスキーマが勝手に変わる対処 1
上の画像の赤枠のグラフが値がゼロで張り付いてしまっている。

elasticsearch インデックスのスキーマが勝手に変わる対処 2
正常な頃は上の画像の左半分のようなグラフが表示されていた。
それがこの日の午前9時頃を境に全ての値がゼロになっている。

elasticsearch インデックスのスキーマが勝手に変わる対処 3
Kibanaの左列から Dev Tools をクリックし、中央列のテキストボックスにマッピング確認コマンドを入力する。

GET logstash-2018.02.22/_mapping

インデックスlogstash-2018.02.22 (2018年2月22日)のスキーマ(マッピング)を取得。
_mappingの後に ?pretty または ?pretty=1 を付けても付けなくてもJSON Pretty-Printで返されるようだけど何か勘違いしてるかしら。
入力したら (実行)ボタンを押す。結果は右列に表示される。

もちろん、kibanaからじゃなくて従来通りターミナルでコマンド打ちでも良い。

% curl -XGET '127.0.0.1:9200/logstash-2018.02.22/_mapping?pretty=1' 

FreeBSDのports/pkgでインストールしたcurlで実行するならGETの後ろはシングルクォーテーションで囲むこと。

正常な表示だったころ(2018年2月22日)のスキーマでvalueの型を確認。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "logstash-2018.02.22": {
    "mappings": {
      "collectd": {
        "properties": {
          "value": {
            "type": "float"
          }
        }
      }
    }
  }
}

上の結果は関係ない部分を全て省略している。

値が全てゼロになってしまっている日(2018年2月25日)のスキーマでvalueの型を確認。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "logstash-2018.02.25": {
    "mappings": {
      "collectd": {
        "properties": {
          "value": {
            "type": "long"
          }
        }
      }
    }
  }
}

上の結果は関係ない部分を全て省略している。

正常な頃のスキーマはvalueの型がfloat (32bit浮動小数点数)だったので小数点以下があったが、値がゼロになっているスキーマではそれがlong (64bit符号付整数)になっているので整数しか扱われないと見て良さそう。

インデックスの作り直しは面倒なので今回は無しとして、次に作られるインデックスからはvalueがlongではなくdoubleになるようにしておきたい。 (今回は好みでdoubleにしたがfloatでも可)

Kibanaの左列から Dev Tools をクリックし、中央列のテキストボックスにテンプレートを入力する。今回はvalueだけ型を指定する内容にしているが他も同時に指定してもちろんOK.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
PUT /_template/logstash
{
 "template" : "logstash-*",
 "order" : 1,
 "mappings": {
  "collectd": {
   "properties": {
    "value": {
     "type": "double"
    }
   }
  }
 }
}

elasticsearch インデックスのスキーマが勝手に変わる対処 4
入力したら1行目の右端の (実行)ボタンを押す。右列に acknowleded : true の表示が出たら実行が成功している。

新しいインデックスが作られてから確認する。下は2018年2月26日のインデックスのマッピングを確認する内容。
GET logstash-2018.02.26/_mapping
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "logstash-2018.02.26": {
    "mappings": {
      "collectd": {
        "properties": {
          "value": {
            "type": "double"
          }
        }
      }
    }
  }
}

上の結果は関係ない部分を全て省略している。

elasticsearch インデックスのスキーマが勝手に変わる対処 5
指定したとおりvalueがdouble型になっている。これで安心。

ちなみにインデックスをデータごと一掃したいという場合は同様にDev Toolsで DELETE logstash-* を実行する。

関連記事: