ElasticsearchとBigQueryに同じデータを入れたいという要件があったが、今々Elasticsearchの標準の日付型("format": "dateOptionalTime")は、BigQueryのdate型では対応していないので、Elasticsearch側のdate型のフォーマットを変更した時のメモ。
どう変えるか
BigQueryではdate型のカスタムは出来ないので、BigQueryでサポートされるdate型のフォーマットに合わせた形にしてあげる。
status | format | 実際のデータ |
---|---|---|
before | "format": "dateOptionalTime" | 2016-03-13T13:16:49+0900 |
after | "format": "yyyy-MM-dd HHss ZZ" | 2016-03-13 13:16:49 +09:00 |
※UTCではかれるログを扱っていて、JSTで色々処理したい為に、上の実際のデータという値をfluentdで生成しているというちょっと特殊な前提があります。。
考慮した点
Q.インデックスのdate型のformatを変えた際に、Kibanaでは異なるフォーマットのdateでも認識してくれるか?
→実際に、ローカルで検証してみたが、上記の変更後も連続したデータとしてKibana上で認識されたのでOK。Kibanaが賢いのか、Elasticsearchのdate型がUNIXタイムで内部でデータ保持してるからOKだったのかという詳細までは確認していない。。が実運用上はOKとする(@timestampを使ってる前提の話)
実際の手順
今回の作業内容は、新規に新フォーマットの日付型フィールド追加と@timestampのフォーマット変更を実施
fluent-plugin-elasticsearchのtime_keyで新規フィールドをtime_keyに指定しているので、2フィールドに対して作業する
大きく2つの作業。
既存のスキーマ変更と翌日以降に自動で作られるインデックス用のテンプレート更新がある。
①既存のインデックスのスキーマ変更
既に出来ているインデックスについても
fluentdの停止(新規に投入されるデータを一時的に止める)
↓
実行(chromeのSensuプラグイン使うと非常に見やすく便利!!)
curl -XPUT [ElasticsearchのIP]:port/[index名]/_mapping/[type名] -d '
{
"[type名]": {
"@timestamp": {
"type": "date",
"doc_values": true,
"format": "yyyy-MM-dd HH:mm:ss ZZ"
},
"datetime": {
"type": "date",
"doc_values": true,
"format": "yyyy-MM-dd HH:mm:ss ZZ"
},
}
}
'
確認方法
curl -XGET [ElasticsearchのIP]:port/[index名]/_mapping?pretty
変更したものが反映されている事を確認する
↓
fluentd再開
↓
新規のデータが意図したdate型で入ってきている事を確認
- kibanaからのデータが欠けなしで見れる事確認
- 個別で日付型違うデータを引いてみて問題ないかチェック
②テンプレートの更新
お決まりの、jsonファイルを↑と同じ内容で変更して、orderを1つ繰り上げて
$ curl -XPOST localhost:9200/_template/[テンプレート名] -d "`cat [テンプレートファイル名].json`"
curl -XGET [ElasticsearchのIP]:port/_tempalte/[テンプレート名]?pretty
変更したものが反映されている事を確認する
ちなみに、全て1.5系での作業なので、2系の人は少し違うのかも。。そろそろ2系も触らないとな−。。
何かのお役に立てば!