关于 Elasticsearch 时区的小知识
我们有一个监控系统使用telegraf 作为采集器,按天生成索引(由 telegraf 创建),写入到 Elasticsearch 中,有位同学发现,索引会包含跨天的数据,如下所示:
3.5日的索引最后写入的数据为3.6日早上8点,让人感觉很诧异,实际上这只是 UTC 时间与本地时间(CST)的差异。
查看 es 日志,该索引创建时间为本地时间早上8点。
此时对应的 UTC 时间为0点。_cat/indices接口也可以查看索引创建时间,并且转换为 UTC时区:
1 2 3 4 5 |
GET _cat/indices/telegraf-zzyc-hbase-2020.03.05?h=h,s,i,creation.date.string green open telegraf-zzyc-hbase-2020.03.05 2020-03-05T00:00:01.113Z |
索引创建完毕后,bulk 写入数据时,时间戳为本地时间,并带有时区信息:
对于带有时区信息的时间戳,ES 会把他转换为 UTC 时间,作为 long 型来存储:
Internally, dates are converted to UTC (if the time-zone is specified) and stored as a long number representing milliseconds-since-the-epoch.
因此,在查询的时候,如果直接按时间范围查询,返回结果的时间存在跨天的问题:
这需要在查询时指定 time_zone 参数,按照所需的时区展示:
总结
从 telegraf 视角来看,他在 UTC 时间每天0点创建索引,使用到24点,此时对应的 CST 时间为08:00:00到第二天的08:00:00,期间写入数据的时候,使用 CST 时间并且带时区:”@timestamp”:”2020-03-06T22:48:00+08:00″, ES 会把他转成 UTC时间,作为 long 存储
所以,从 CST 视角来看索引在每天的早8点创建,使用24小时,期间包含了跨天的数据,但是从 UTC 视角来看,每天0点创建,数据不存在跨天的问题
因为数据存储按 UTC 时间,所以需要展示的时候转换成 local 时区,加timezone查询
##参考
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
(转载请注明作者和出处 easyice.cn ,请勿用于任何商业用途)