Automatically import Kibana dashboards
Facilitate the spin up of the environment by importing the
Kibana dashboard and creating the empty gerrit elasticsearch index
Change-Id: I921c9c469d740d79a3f75bd54e7221bfd81c694b
diff --git a/dashboard-importer/Dockerfile b/dashboard-importer/Dockerfile
new file mode 100644
index 0000000..4aa6a13
--- /dev/null
+++ b/dashboard-importer/Dockerfile
@@ -0,0 +1,7 @@
+FROM taskrabbit/elasticsearch-dump:v3.3.1
+
+RUN apk add --no-cache curl
+
+COPY docker-entrypoint.sh wait-for-elasticsearch ./kibana-config /
+
+ENTRYPOINT /docker-entrypoint.sh
diff --git a/dashboard-importer/credentials.env b/dashboard-importer/credentials.env
new file mode 100644
index 0000000..02177e6
--- /dev/null
+++ b/dashboard-importer/credentials.env
@@ -0,0 +1,2 @@
+ES_USER=elastic
+ES_PWD=changeme
diff --git a/dashboard-importer/docker-entrypoint.sh b/dashboard-importer/docker-entrypoint.sh
new file mode 100755
index 0000000..fdfcbea
--- /dev/null
+++ b/dashboard-importer/docker-entrypoint.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+/wait-for-elasticsearch
+
+echo "** Creating Gerrit index"
+curl -XPUT "http://$ES_USER:$ES_PWD@elasticsearch:9200/gerrit?pretty" -H 'Content-Type: application/json'
+
+echo "** Importing Kibana setting from: "
+for file in `ls -v /*.json`;
+ do echo "--> $file";
+ /usr/lib/node_modules/elasticdump/bin/elasticdump \
+ --output=http://$ES_USER:$ES_PWD@elasticsearch:9200/.kibana \
+ --input=$file \
+ --type=data \
+ --headers '{"Content-Type": "application/json"}';
+done;
diff --git a/dashboard-importer/kibana-config/00_config.json b/dashboard-importer/kibana-config/00_config.json
new file mode 100644
index 0000000..cc5f7a8
--- /dev/null
+++ b/dashboard-importer/kibana-config/00_config.json
@@ -0,0 +1,12 @@
+{
+ "_index": ".kibana",
+ "_type": "config",
+ "_id": "5.5.2",
+ "_score": 1,
+ "_source": {
+ "buildNum": 15443,
+ "xPackMonitoring:allowReport": true,
+ "xPackMonitoring:showBanner": true,
+ "defaultIndex": "gerrit"
+ }
+}
diff --git a/dashboard-importer/kibana-config/10_index-pattern.json b/dashboard-importer/kibana-config/10_index-pattern.json
new file mode 100644
index 0000000..6b2c233
--- /dev/null
+++ b/dashboard-importer/kibana-config/10_index-pattern.json
@@ -0,0 +1,11 @@
+{
+ "_index": ".kibana",
+ "_type": "index-pattern",
+ "_id": "gerrit",
+ "_score": 1,
+ "_source": {
+ "title": "gerrit",
+ "notExpandable": true,
+ "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"added_lines\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"author\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"author.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"day\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"deleted_lines\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"email\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"email.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"email_alias\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"email_alias.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"hour\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"last_commit_date\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"month\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"num_commits\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"num_files\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"organization\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"organization.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"project\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"project.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"year\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]"
+ }
+}
diff --git a/dashboard-importer/wait-for-elasticsearch b/dashboard-importer/wait-for-elasticsearch
new file mode 100755
index 0000000..6f05499
--- /dev/null
+++ b/dashboard-importer/wait-for-elasticsearch
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+wait_for() {
+ for i in `seq 30` ; do
+ curl -f -u $ES_USER:$ES_PWD http://elasticsearch:9200/_cluster/health > /dev/null 2>&1
+
+ result=$?
+ if [ $result -eq 0 ] ; then
+ if [ $# -gt 0 ] ; then
+ exec "$@"
+ fi
+ exit 0
+ fi
+ echo "* Waiting for Elasticsearch ($i/30)"
+ sleep 2
+ done
+ echo "Operation timed out" >&2
+ exit 1
+}
+
+wait_for "$@"
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 7c646e1..a7300e1 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -2,7 +2,26 @@
services:
- elasticsearch:
+ dashboard-importer:
+ build: dashboard-importer
+ networks:
+ - ek
+ env_file:
+ - ./dashboard-importer/credentials.env
+ links:
+ - elasticsearch
+ - kibana
+
+ kibana:
+ image: docker.elastic.co/kibana/kibana:5.5.2
+ ports:
+ - "5601:5601"
+ networks:
+ - ek
+ depends_on:
+ - elasticsearch
+
+ elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:5.5.2
ports:
- "9200:9200"
@@ -14,15 +33,6 @@
networks:
- ek
- kibana:
- image: docker.elastic.co/kibana/kibana:5.5.2
- ports:
- - "5601:5601"
- networks:
- - ek
- depends_on:
- - elasticsearch
-
networks:
ek: