ElasticSearch中自定义Kibana仪表板的位置

时间:2014-02-26 17:00:23

标签: elasticsearch kibana

我知道保存的 Kibana 信息中心(即信息中心的JSON文件)保存在与特定 ElasticSearch 实例关联的OR中。如果我在连接到托管ElasticSearch的一台服务器时保存我的Kibana实例,并且我将我的ElasticSearch服务器切换到另一个地址,我将丢失我保存的仪表板。但是,如果我要切换回原始服务器地址,我将恢复保存的仪表板。

因此,我的问题是 elasticsearch 安装目录中保存的仪表板的确切位置。我宁愿能够运行脚本来自动加载我预先创建的Kibana仪表板,而不是每次启动新的ElasticSearch实例时都强制通过Web控制台复制/粘贴JSON。

感谢您的帮助。

更新

根据此Google Groups post,信息中心会保存到kibana-int _index中,其中_type为dashboard,而_id是我所命名的。因此,要将我的仪表板保存到新的ElasticSearch实例中,我是否只需要通过CURL对此_index执行PUT?有更好的方法吗?

6 个答案:

答案 0 :(得分:20)

是的,Kibana仪表板正在kibana-int索引下保存在Elasticsearch中(默认情况下,您可以覆盖config.js文件中的那个)。如果要将Kibana仪表板移动到另一个ES群集,您有两种选择:

  1. 手动导出仪表板。点击保存 - >高级 - >出口架构。你必须保存文件,然后在新的Kibana中你需要导入点击加载 - >高级 - >选择“文件”并选择已选择的文件。这很痛苦,因为您必须按要迁移的仪表板执行此操作。
  2. 您可以使用实用程序将ES索引从一个ES群集迁移到另一个ES群集。已有一些实用程序可以执行此操作。在SO中搜索,我发现this answer建议您使用Elasticsearch.pm library(Perl:S)来执行此操作。可能有更多这样的工具,但我不认为做一个将索引迁移到另一个集群的脚本是一项艰巨的任务。
  3. 编辑:对于第二个选项,如果您觉得Python更加舒适,可以使用python elasticsearch库及其帮助器reindexhttps://elasticsearch-py.readthedocs.org/en/latest/helpers.html#elasticsearch.helpers.reindex

答案 1 :(得分:6)

事实上,很容易, 复制两个文件夹:

1) .\elasticsearch\data\nodes\0\indices\.kibana 
2) .\elasticsearch\data\nodes\0\indices\kibana-int

粘贴新的elasticsearch。

答案 2 :(得分:4)

在ElasticSearch的1.0.0+版本中,快照和恢复API已经可用:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html

http://chrissimpson.co.uk/elasticsearch-snapshot-restore-api.html

这使您可以快速备份(快照)并还原任何给定群集上的每个或任何索引。因此,您可能希望查看升级到该版本,因为这将为您提供一个简单的API调用来拍摄" kibana-int"索引,并将该索引还原到任何其他群集。

答案 3 :(得分:4)

这是一个独立的Python脚本,可以将Kibana仪表板从elasticsearch主机复制到另一个。

#!/bin/env python

"""Migrate all the kibana dashboard from SOURCE_HOST to DEST_HOST.

This script may be run repeatedly, but any dashboard changes on
DEST_HOST will be overwritten if so.

"""

import urllib2, urllib, json


SOURCE_HOST = "your-old-es-host"
DEST_HOST = "your-new-es-host"


def http_post(url, data):
    request = urllib2.Request(url, data)
    return urllib2.urlopen(request).read()


def http_put(url, data):
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    request = urllib2.Request(url, data)
    request.get_method = lambda: 'PUT'
    return opener.open(request).read()


if __name__ == '__main__':
    old_dashboards_url = "http://%s:9200/kibana-int/_search" % SOURCE_HOST

    # All the dashboards (assuming we have less than 9999) from
    # kibana, ignoring those with _type: temp.
    old_dashboards_query = """{
       size: 9999,
       query: { filtered: { filter: { type: { value: "dashboard" } } } } }
    }"""

    old_dashboards_results = json.loads(http_post(old_dashboards_url, old_dashboards_query))
    old_dashboards_raw = old_dashboards_results['hits']['hits']

    old_dashboards = {}
    for doc in old_dashboards_raw:
        old_dashboards[doc['_id']] = doc['_source']

    for id, dashboard in old_dashboards.iteritems():
        put_url = "http://%s:9200/kibana-int/dashboard/%s" % (DEST_HOST, urllib.quote(id))
        print http_put(put_url, json.dumps(dashboard))

答案 4 :(得分:2)

正如其他人所说,你可以找到Kibana在elasticsearch中的.kibana索引中保存的所有对象。

最新版本的Kibana 4包含导出和导入功能,可以非常轻松地将对象从一个安装移动到另一个安装。您可以通过单击“设置”然后单击“对象”选项卡来找到此功能。

答案 5 :(得分:0)

可以将单个仪表板,其可视化以及从一个集群复制到另一个集群的存储搜索的独立Ruby脚本位于https://github.com/jim-davis/kibana-helper-scripts。粘贴到这个盒子里有点太大了。