今天聊聊,我是如何被Kibana时区timezone问题搞得没脾气的…
前段时间跟大家聊过,我们开始使用metrices + kibana + elasticesarch集群的组合构建应用级性能监控,数据在es里面可以轻松的使用kibana画各种图表。
文章写的不是太严谨,后期会不断更新修改补充该文章,标注下原文地址:
我自己做测试的时候,发现始终看不到数据,中途调整了index和doc_type ,提示 Area charts require more than one data point. Try adding an X-Axis Aggregation
后来把时间的范围加大后,看到了数据的图表了。
虽然图表显示了,但是时间戳所在的时区有问题,kibana默认的时区是根据浏览器js获取的,也就是你当前本地的时区。 你本地的时区是东8,那么kibana画图的时候会加上一个pre_zone参数,但是很多时候咱们入库的timestamp时间戳就是当前的北京时间,kibana又帮你加8个小时…
{ "size": 0, "query": { "filtered": { "query": { "query_string": { "analyze_wildcard": true } }, "filter": { "bool": { "must": [ { "range": { "shijian": { "gte": 1449554338591, "lte": 1449640738591 } } } ], "must_not": [] } } } }, "aggs": { "2": { "date_histogram": { "field": "shijian", "interval": "10m", "pre_zone": "+08:00", # +08:00,增加时区 "pre_zone_adjust_large_interval": true, "min_doc_count": 1, "extended_bounds": { "min": 1449554338585, "max": 1449640738585 } }, "aggs": { "1": { "avg": { "field": "queue" } } } } } }
以前的kibana版本是支持直接在线setting修改时区,再不济也是可以修改本地的配置的。现在看不懂kibana为毛不开放这个友好功能了.
后来我在github kibana项目提了一个issue ,得到的回答让我很不满意…
Issue Url :https://github.com/elastic/kibana/issues/5589
看过以前的issue list,老外曾经说过,他推荐用户尽量在client层,就加入时区的概念,或者是定制mapping,在mapping结构里把date类型做时区的处理。
http://es.xiaorui.cc:8000/xiaorui.cc/test/8888 { "name":"rui", "blog":"xiaorui.cc", "email":"rfyiamcool@163.com", "queue":341, "shijian" : "2015-12-09T10:01:02+08:00" }
如果你是python的elasticsearch客户端模块,他貌似没有timezone的属性配置。 我现在的做法是用datetime转换成 “2015-11-20T10:33:33+08:00” 的字符串模式。你虽然用python转成字符串,但是在elasticsearch mapping里是个date日期时间类型。
另外我看了下kibana关于timezone的源码,找到了dateFormat:tz 参数。 有意思的是,老外也让我修改dateFormat:tz参数,但是kibana setting > Advanced 没有dataFormat:tz这个可以改动的选项。 不管怎么说,这参数确是用来解决时区问题入口。
可以把dateFormat:tz的值改成Asia/Shanghai就可以了.
filename : kibana/src/plugins/kibana/public/kibana.js
.setRootController(‘kibana’, function (scope,rootScope, courier, config) {
function setDefaultTimezone() {
moment.tz.setDefault(config.get(‘dateFormat:tz’));
}
filename: kibana/src/ui/public/config/defaults.js
#这里定义了kibana的默认配置的方式,关于dateFormat:tz参数,他说的很明白,就是用浏览器获取时区 (getTimezoneOffset) .
‘dateFormat:tz’: {
value: ‘Browser’,
description: ‘Which timezone should be used. “Browser” will use the timezone detected by your browser.’,
type: ‘select’,
options: _.union([‘Browser’], moment.tz.names())
}
除此之外,在StackOverflow里面,看到一逗比的回答,说是直接改本地时区…
对于kibana4还是很看好,确实非常适合做临时的dashboard实时图表展现,对于我来说他的缺点就这么几个了,一个是future回馈慢,另外是无权限管理.
另外给大家展现下,使用kibana实现的实时消息统计.
kibana默认是本地时区,所以修改kibana是不合理的,只是负负得正 ,最应该做的是从输入elasticsearch的时候,输入的是正确的格林威治时间 或者是带时区的时间字符串
最主要的原因是 elasticsearch默认把不包含时区的时间字符串存储为格林威治时间