关于 Elasticsearch 时区的小知识

关于 Elasticsearch 时区的小知识

我们有一个监控系统使用telegraf 作为采集器,按天生成索引(由 telegraf 创建),写入到 Elasticsearch 中,有位同学发现,索引会包含跨天的数据,如下所示:

3.5日的索引最后写入的数据为3.6日早上8点,让人感觉很诧异,实际上这只是 UTC 时间与本地时间(CST)的差异。

查看 es 日志,该索引创建时间为本地时间早上8点。

此时对应的 UTC 时间为0点。_cat/indices接口也可以查看索引创建时间,并且转换为 UTC时区:

索引创建完毕后,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 ,请勿用于任何商业用途)

1 Star2 Stars3 Stars4 Stars5 Stars (欢迎评分)
Loading...

发表评论

电子邮件地址不会被公开。 必填项已用*标注