纠结Kibana4的时区timezone配置问题

今天聊聊,我是如何被Kibana时区timezone问题搞得没脾气的…


前段时间跟大家聊过,我们开始使用metrices + kibana + elasticesarch集群的组合构建应用级性能监控,数据在es里面可以轻松的使用kibana画各种图表。


文章写的不是太严谨,后期会不断更新修改补充该文章,标注下原文地址:

http://xiaorui.cc/?p=2466

http://xiaorui.cc/2015/12/09/%E7%BA%A0%E7%BB%93kibana4%E7%9A%84%E6%97%B6%E5%8C%BAtimezone%E9%85%8D%E7%BD%AE%E9%97%AE%E9%A2%98/

我自己做测试的时候,发现始终看不到数据,中途调整了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实现的实时消息统计.



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

3 Responses

  1. kris 2015年12月23日 / 上午10:18

    kibana默认是本地时区,所以修改kibana是不合理的,只是负负得正 ,最应该做的是从输入elasticsearch的时候,输入的是正确的格林威治时间 或者是带时区的时间字符串

  2. kris 2015年12月23日 / 上午10:14

    最主要的原因是 elasticsearch默认把不包含时区的时间字符串存储为格林威治时间

发表评论

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