icingabeat/vendor/github.com/elastic/beats/dev-tools/export_dashboards.py

117 lines
3.6 KiB
Python

from elasticsearch import Elasticsearch
import argparse
import os
import json
import re
def ExportDashboards(es, regex, kibana_index, output_directory):
res = es.search(
index=kibana_index,
doc_type="dashboard",
size=1000)
try:
reg_exp = re.compile(regex, re.IGNORECASE)
except:
print("Wrong regex {}".format(regex))
return
for doc in res['hits']['hits']:
if not reg_exp.match(doc["_source"]["title"]):
print("Ignore dashboard", doc["_source"]["title"])
continue
# save dashboard
SaveJson("dashboard", doc, output_directory)
# save dependencies
panels = json.loads(doc['_source']['panelsJSON'])
for panel in panels:
if panel["type"] == "visualization":
ExportVisualization(
es,
panel["id"],
kibana_index,
output_directory)
elif panel["type"] == "search":
ExportSearch(
es,
panel["id"],
kibana_index,
output_directory)
else:
print("Unknown type {} in dashboard".format(panel["type"]))
def ExportVisualization(es, visualization, kibana_index, output_directory):
doc = es.get(
index=kibana_index,
doc_type="visualization",
id=visualization)
# save visualization
SaveJson("visualization", doc, output_directory)
# save dependencies
if "savedSearchId" in doc["_source"]:
search = doc["_source"]['savedSearchId']
ExportSearch(
es,
search,
kibana_index,
output_directory)
def ExportSearch(es, search, kibana_index, output_directory):
doc = es.get(
index=kibana_index,
doc_type="search",
id=search)
# save search
SaveJson("search", doc, output_directory)
def SaveJson(doc_type, doc, output_directory):
dir = os.path.join(output_directory, doc_type)
if not os.path.exists(dir):
os.makedirs(dir)
# replace unsupported characters
filepath = os.path.join(dir, re.sub(r'[\>\<:"/\\\|\?\*]', '', doc['_id']) + '.json')
with open(filepath, 'w') as f:
json.dump(doc['_source'], f, indent=2)
print("Written {}".format(filepath))
def main():
parser = argparse.ArgumentParser(
description="Export the Kibana dashboards together with"
" all used visualizations, searches and index pattern")
parser.add_argument("--url",
help="Elasticsearch URL. By default: http://localhost:9200",
default="http://localhost:9200")
parser.add_argument("--regex",
help="Regular expression to match all the dashboards to be exported. For example: metricbeat*",
required=True)
parser.add_argument("--kibana",
help="Elasticsearch index where to store the Kibana settings. By default: .kibana ",
default=".kibana")
parser.add_argument("--dir", help="Output directory. By default: output",
default="output")
args = parser.parse_args()
print("Export {} dashboards to {} directory".format(args.regex, args.dir))
print("Elasticsearch URL: {}".format(args.url))
print("Elasticsearch index to store Kibana's"
" dashboards: {}".format(args.kibana))
es = Elasticsearch(args.url)
ExportDashboards(es, args.regex, args.kibana, args.dir)
if __name__ == "__main__":
main()