Add ability to configure multiple kibana dashboards
Exploit kibana spaces, which allows to run multiple kibana
dashboards separate from each others.
Please note that this change does not prevent kibana dashboards to have
visibility on elasticsearch indexes beyond the namespace they currently
are configured for.
Authorization will be added in future releases.
Feature: Issue 9865
Change-Id: I02938a0c4ed38d84a47d5cc181443807e66c5e4a
diff --git a/README.md b/README.md
index 60ac488..5e3615e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Kibana Dashboard
-The goal of this project is to provide the tools to manage and configure a kibana dashboard
+The goal of this project is to provide the tools to manage and configure kibana dashboard(s)
aimed to visualize analytics on project contributions.
Kibana configuration is maintained in elasticsearch so, in reality, this project will talk to the elasticsearch
instance which kibana is connected to.
@@ -25,6 +25,12 @@
* elasticsearch, bound and exposing port 9200 and 9300
* kibana, bound and exposing port 5601
+and will also configure the dashboard for you so that you already have all the mappings, the kibana settigs and the main visualizations and dashboard already configured.
+Just browse to `http://localhost:5601` to see the configured dashboard.
+
+At this point the dashboard will still be empty.
+If you want to populate it with data you might want to run the [GIT commits ETL](https://github.com/GerritCodeReview/apps_analytics-etl#git-commits)
+
### Prerequisites
* [docker](https://www.docker.com/)
@@ -34,21 +40,19 @@
## Restore kibana configuration
To configure a kibana dashboard you can simply point the setup script to the target elasticsearch as follows
-```make restore [ELASTICSEARCH_URL] [ELASTICSEARCH_PORT]```
+```make restore [ELASTICSEARCH_URL] [ELASTICSEARCH_PORT] [NAMESPACE]```
* ELASTICSEARCH_URL: default is `http://host.docker.internal` (the current host running docker)
* ELASTICSEARCH_PORT: default is 9200
+* NAMESPACE: default is empty.
-For example to configure kibana spinned up via local environment you can simply run:
-```bash
-cd analytics-setup
-make restore
-```
+#### Namespace
+A namespace is a string that will be postifxed to elassticsearch indexes.
+This allows to configure multiple kibana instances against the same elasticsearch instance without collision of names.
+For example, if you use the namespace _foo_, this will configure in order:
-Just browse to `http://localhost:5601` to see the configured dashboard.
-
-At this point the dashboard will still be empty.
-If you want to populate it with data you might want to run the [GIT commits ETL](https://github.com/GerritCodeReview/apps_analytics-etl#git-commits)
+* an elasticsearch index named gitcommitsfoo
+* a kibana dashboard named .kibanafoo
## Dump kibana configuration
diff --git a/analytics-setup/Dockerfile b/analytics-setup/Dockerfile
index 08dad7d..7bff61b 100644
--- a/analytics-setup/Dockerfile
+++ b/analytics-setup/Dockerfile
@@ -1,6 +1,6 @@
FROM taskrabbit/elasticsearch-dump:v3.3.1
-RUN apk add --no-cache curl
+RUN apk add --no-cache curl gettext
COPY docker-entrypoint.sh wait-for-elasticsearch /
COPY ./elasticsearch-config/ /elasticsearch-config/
diff --git a/analytics-setup/Makefile b/analytics-setup/Makefile
index 369cfe4..1ad4a01 100644
--- a/analytics-setup/Makefile
+++ b/analytics-setup/Makefile
@@ -17,6 +17,7 @@
ELASTICSEARCH_URL=http://host.docker.internal
ELASTICSEARCH_PORT=9200
+NAMESPACE=""
.PHONY: build restore
@@ -26,6 +27,7 @@
docker run --rm -it \
-e ELASTICSEARCH_URL=$(ELASTICSEARCH_URL) \
-e ELASTICSEARCH_PORT=$(ELASTICSEARCH_PORT) \
+ -e NAMESPACE=$(NAMESPACE) \
$(RESTORER_IMG)
dump: build
docker run --rm -it \
diff --git a/analytics-setup/docker-entrypoint.sh b/analytics-setup/docker-entrypoint.sh
index 31ed2b3..41b4512 100755
--- a/analytics-setup/docker-entrypoint.sh
+++ b/analytics-setup/docker-entrypoint.sh
@@ -16,30 +16,42 @@
/wait-for-elasticsearch
-echo "* * * * Create elasticsearch indexes @ $ELASTICSEARCH_URL:$ELASTICSEARCH_PORT * * * *"
-for file in `ls -v /elasticsearch-config/*.json`; do
- echo "--> $file";
- index_template_name=$(basename $file .json)
- index_name="${index_template_name}_initial"
- curl -X PUT -v -H 'Content-Type: application/json' \
- -d @$file $ELASTICSEARCH_URL:$ELASTICSEARCH_PORT/_template/$index_template_name
+ES_URL="$ELASTICSEARCH_URL:$ELASTICSEARCH_PORT"
- echo "* * * * Creating $index_name index * * * *"
- curl -XPUT "$ELASTICSEARCH_URL:$ELASTICSEARCH_PORT/$index_name?pretty" -H 'Content-Type: application/json'
+echo "* * * * Create elasticsearch indexes @ $ES_URL * * * *"
+for template_file in `ls -v /elasticsearch-config/*.json`; do
+ echo "--> $template_file";
- curl -XPOST "$ELASTICSEARCH_URL:$ELASTICSEARCH_PORT/_aliases" -H 'Content-Type: application/json' -d"{\"actions\" : [
- { \"add\" : { \"index\" : \"$index_name\", \"alias\" : \"$index_template_name\" } }
+ index_template=$(basename $template_file .json)
+
+ namespaced_index_name=${index_template}${NAMESPACE}
+ namespaced_initial_index_name="${namespaced_index_name}_initial"
+
+ echo "* * * Creating $index_template index template"
+ curl -X PUT -v -H 'Content-Type: application/json' -d @${template_file} ${ES_URL}/_template/${index_template}
+
+ echo "* * * * Creating $namespaced_initial_index_name index * * * *"
+ curl -XPUT "$ES_URL/$namespaced_initial_index_name?pretty" -H 'Content-Type: application/json'
+
+ echo "* * * * Creating alias $namespaced_index_name -> $namespaced_initial_index_name index * * * *"
+ curl -XPOST "$ES_URL/_aliases" -H 'Content-Type: application/json' -d"{\"actions\" : [
+ { \"add\" : { \"index\" : \"$namespaced_initial_index_name\", \"alias\" : \"$namespaced_index_name\" } }
]
}"
done;
-echo "* * * * Input kibana settings @ $ELASTICSEARCH_URL:$ELASTICSEARCH_PORT * * * *"
-for file in `ls -v /kibana-config/*.data.json`; do
- echo "--> $file";
+echo "* * * * Input kibana settings and visualizations @ $ES_URL [.kibana] * * * *"
+for template_file in `ls -v /kibana-config/*.template.json`; do
+ target=$(mktemp /tmp/kibana-config.XXXXXX);
+
+ echo "* * * * compiling $template_file into $target";
+ envsubst < ${template_file} > ${target};
+
/usr/lib/node_modules/elasticdump/bin/elasticdump \
- --output=$ELASTICSEARCH_URL:$ELASTICSEARCH_PORT/.kibana \
- --input=$file \
+ --output=${ES_URL}/.kibana \
+ --input=${target} \
--type=data \
--headers '{"Content-Type": "application/json"}';
-done;
+ echo "Done with $template_file";
+done;
\ No newline at end of file
diff --git a/analytics-setup/kibana-config/analytics-settings-dashboards-visualizations.data.json b/analytics-setup/kibana-config/analytics-settings-dashboards-visualizations.data.json
deleted file mode 100644
index 3cd4db3..0000000
--- a/analytics-setup/kibana-config/analytics-settings-dashboards-visualizations.data.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{"_index":".kibana_1","_type":"doc","_id":"space:default","_score":1,"_source":{"space":{"name":"Default","description":"This is your default space!","color":"#00bfb3","_reserved":true},"type":"space","updated_at":"2019-01-29T10:21:51.206Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"config:6.5.4","_score":1,"_source":{"config":{"buildNum":18878,"defaultIndex":"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3"},"type":"config","updated_at":"2019-01-30T12:06:22.370Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"telemetry:telemetry","_score":1,"_source":{"telemetry":{"enabled":false},"type":"telemetry","updated_at":"2019-01-29T10:25:37.748Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:3847de90-23f3-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - Authors activity over the years","visState":"{\"title\":\"GIT Commits - Authors activity over the years\",\"type\":\"heatmap\",\"params\":{\"type\":\"heatmap\",\"addTooltip\":true,\"addLegend\":true,\"enableHover\":false,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":10,\"colorSchema\":\"Blues\",\"setColorRange\":false,\"colorsRange\":[],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":true},\"labels\":{\"show\":false,\"rotate\":0,\"overwriteColor\":false,\"color\":\"#555\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"last_commit_date\",\"timeRange\":{\"from\":\"now-5y\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"y\",\"time_zone\":\"Europe/London\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"author.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Author\"}}]}","uiStateJSON":"{\"vis\":{\"defaultColors\":{\"2 - 79\":\"rgb(247,251,255)\",\"79 - 156\":\"rgb(227,238,249)\",\"156 - 233\":\"rgb(208,225,242)\",\"233 - 310\":\"rgb(182,212,233)\",\"310 - 386\":\"rgb(148,196,223)\",\"386 - 463\":\"rgb(107,174,214)\",\"463 - 540\":\"rgb(74,152,201)\",\"540 - 617\":\"rgb(46,126,188)\",\"617 - 694\":\"rgb(23,100,171)\",\"694 - 770\":\"rgb(8,74,145)\"}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T18:25:13.977Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:01062ff0-23bb-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - commits over time","visState":"{\"title\":\"GIT Commits - commits over time\",\"type\":\"histogram\",\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"#Commits\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"#Commits\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"last_commit_date\",\"timeRange\":{\"from\":\"now-5y\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"auto\",\"time_zone\":\"Europe/London\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}}]}","uiStateJSON":"{\"vis\":{\"legendOpen\":true}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T11:43:38.008Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:61f1dc90-24b2-11e9-b0b6-4f50aa82b6fb","_score":1,"_source":{"visualization":{"title":"GIT Commits - Authors Stats","visState":"{\"title\":\"GIT Commits - Authors Stats\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"organization.keyword\",\"customLabel\":\"#Organizations\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"project.keyword\",\"customLabel\":\"#Projects\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"added_lines\",\"customLabel\":\"#Added Lines\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"deleted_lines\",\"customLabel\":\"#Deleted Lines\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"num_files\",\"customLabel\":\"AVG #Files\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"changes_per_commit\",\"customLabel\":\"AVG #Changes per commit\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"author.keyword\",\"size\":9,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Author\"}}]}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-30T17:13:37.753Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:5ba41ad0-23f2-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - Organization Stats","visState":"{\"title\":\"GIT Commits - Organization Stats\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"author.keyword\",\"customLabel\":\"#Authors\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"project.keyword\",\"customLabel\":\"#Projects\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"added_lines\",\"customLabel\":\"#Added Lines\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"deleted_lines\",\"customLabel\":\"#Deleted Lines\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"num_files\",\"customLabel\":\"AVG #Files\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"changes_per_commit\",\"customLabel\":\"AVG #Changes per commit\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"organization.keyword\",\"size\":9,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Organization\"}}]}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T18:32:06.348Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:730ecdb0-23ba-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - Overall Statistics","visState":"{\"title\":\"GIT Commits - Overall Statistics\",\"type\":\"metric\",\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":100}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":46}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"project.keyword\",\"customLabel\":\"#Projects\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"author.keyword\",\"customLabel\":\"#Authors\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"organization.keyword\",\"customLabel\":\"#Organizations\"}}]}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T11:38:51.275Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:0078d480-23f1-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - Commits per Organization","visState":"{\"title\":\"GIT Commits - Commits per Organization\",\"type\":\"pie\",\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"labels\":{\"show\":true,\"values\":true,\"last_level\":true,\"truncate\":100}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"organization.keyword\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Organization\"}}]}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T18:10:21.666Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:31c47580-23f1-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - Commits per Author","visState":"{\"title\":\"GIT Commits - Commits per Author\",\"type\":\"pie\",\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"labels\":{\"show\":true,\"values\":true,\"last_level\":true,\"truncate\":100}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"author.keyword\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Author\"}}]}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T18:10:44.056Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:7d9b8c60-23f0-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"visualization":{"title":"GIT Commits - Project Stats","visState":"{\"title\":\"GIT Commits - Project Stats\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"author.keyword\",\"customLabel\":\"#Authors\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"organization.keyword\",\"customLabel\":\"#Organizations\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"added_lines\",\"customLabel\":\"#Added Lines\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"deleted_lines\",\"customLabel\":\"#Deleted Lines\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"num_files\",\"customLabel\":\"AVG #Files\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"changes_per_commit\",\"customLabel\":\"AVG #Changes per commit\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"project.keyword\",\"size\":9,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Project\"}}]}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-01-29T18:31:26.647Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"visualization:3b1805b0-4c9c-11e9-abc0-6368ea6bca2f","_score":1,"_source":{"visualization":{"title":"GIT Commits - bot-like commits","visState":"{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{\"customLabel\":\"#Commits\",\"field\":\"num_commits\"},\"schema\":\"metric\",\"type\":\"sum\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"customLabel\":\"Bot-like commit\",\"field\":\"is_bot_like\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":2},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTooltip\":true,\"isDonut\":true,\"labels\":{\"last_level\":true,\"show\":true,\"truncate\":100,\"values\":true},\"legendPosition\":\"right\",\"type\":\"pie\"},\"title\":\"GIT Commits - bot-like commits\",\"type\":\"pie\"}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[]}"}},"type":"visualization","updated_at":"2019-03-22T12:28:38.496Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"index-pattern:7d9fb770-23b6-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"index-pattern":{"title":"gitcommits","timeFieldName":"last_commit_date","fields":"[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"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\":\"branches\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"branches.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\":\"hour\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"is_bot_like\",\"type\":\"boolean\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"is_merge\",\"type\":\"boolean\",\"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\":\"num_commits\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"num_distinct_files\",\"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},{\"name\":\"changes_per_commit\",\"type\":\"number\",\"count\":0,\"scripted\":true,\"script\":\"if (doc['num_commits'].value > 0) { \\n return ((float) (doc['added_lines'].value + doc['deleted_lines'].value) / (float) doc['num_commits'].value);\\n} else {\\n return 0;\\n}\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]","fieldFormatMap":"{\"changes_per_commit\":{}}"},"type":"index-pattern","migrationVersion":{"index-pattern":"6.5.0"},"updated_at":"2019-03-22T13:08:47.406Z"}}
-{"_index":".kibana_1","_type":"doc","_id":"dashboard:f8f0c720-23b6-11e9-ae14-1dc4e23b60c3","_score":1,"_source":{"dashboard":{"title":"Git Commits dashboard","hits":0,"description":"","panelsJSON":"[{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":6,\"i\":\"1\"},\"id\":\"730ecdb0-23ba-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"1\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":24,\"w\":35,\"h\":20,\"i\":\"2\"},\"id\":\"7d9b8c60-23f0-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"2\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":24,\"y\":44,\"w\":24,\"h\":18,\"i\":\"4\"},\"id\":\"0078d480-23f1-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"4\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":44,\"w\":24,\"h\":18,\"i\":\"5\"},\"id\":\"31c47580-23f1-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"5\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":24,\"y\":62,\"w\":24,\"h\":20,\"i\":\"6\"},\"id\":\"5ba41ad0-23f2-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"6\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":82,\"w\":48,\"h\":21,\"i\":\"7\"},\"id\":\"3847de90-23f3-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"7\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}},\"gridData\":{\"x\":0,\"y\":6,\"w\":48,\"h\":18,\"i\":\"8\"},\"id\":\"01062ff0-23bb-11e9-ae14-1dc4e23b60c3\",\"panelIndex\":\"8\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"x\":0,\"y\":62,\"w\":24,\"h\":20,\"i\":\"9\"},\"version\":\"6.5.4\",\"panelIndex\":\"9\",\"type\":\"visualization\",\"id\":\"61f1dc90-24b2-11e9-b0b6-4f50aa82b6fb\",\"embeddableConfig\":{}},{\"gridData\":{\"x\":35,\"y\":24,\"w\":13,\"h\":20,\"i\":\"10\"},\"version\":\"6.5.4\",\"panelIndex\":\"10\",\"type\":\"visualization\",\"id\":\"3b1805b0-4c9c-11e9-abc0-6368ea6bca2f\",\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}}}]","optionsJSON":"{\"darkTheme\":false,\"hidePanelTitles\":false,\"useMargins\":true}","version":1,"timeRestore":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[{\"meta\":{\"index\":\"7d9fb770-23b6-11e9-ae14-1dc4e23b60c3\",\"negate\":false,\"disabled\":false,\"alias\":null,\"type\":\"phrase\",\"key\":\"is_merge\",\"value\":\"false\",\"params\":{\"query\":false,\"type\":\"phrase\"}},\"query\":{\"match\":{\"is_merge\":{\"query\":false,\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"}},"type":"dashboard","updated_at":"2019-03-22T13:11:37.292Z"}}
diff --git a/analytics-setup/kibana-config/kibana-configuration.template.json b/analytics-setup/kibana-config/kibana-configuration.template.json
new file mode 100644
index 0000000..071469d
--- /dev/null
+++ b/analytics-setup/kibana-config/kibana-configuration.template.json
@@ -0,0 +1,13 @@
+{"_index":".kibana_1","_type":"doc","_id":"space:$NAMESPACE","_score":1,"_source":{"space":{"name":"$NAMESPACE","description":"$NAMESPACE analytics"},"type":"space"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:config:6.5.4","_score":1,"_source":{"config":{"buildNum":18878,"defaultIndex":"$NAMESPACE-10"},"type":"config","namespace": "$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:index-pattern:$NAMESPACE-10","_score":1,"_source":{"index-pattern":{"title":"gitcommits$NAMESPACE*","timeFieldName":"last_commit_date","fields":"[{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"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\":\"branches\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"branches.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\":\"hour\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"is_bot_like\",\"type\":\"boolean\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"is_merge\",\"type\":\"boolean\",\"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\":\"num_commits\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"num_distinct_files\",\"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},{\"name\":\"changes_per_commit\",\"type\":\"number\",\"count\":0,\"scripted\":true,\"script\":\"if (doc['num_commits'].value > 0) { \\n return ((float) (doc['added_lines'].value + doc['deleted_lines'].value) / (float) doc['num_commits'].value);\\n} else {\\n return 0;\\n}\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]","fieldFormatMap":"{\"changes_per_commit\":{}}"},"type":"index-pattern","namespace":"$NAMESPACE","migrationVersion":{"index-pattern":"6.5.0"}}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:dashboard:$NAMESPACE-11","_score":1,"_source":{"dashboard":{"title":"$NAMESPACE - Git Commits Dashboard","hits":0,"description":"Git Commits Dashboard for $NAMESPACE","panelsJSON":"[{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":6,\"i\":\"1\"},\"id\":\"$NAMESPACE-5\",\"panelIndex\":\"1\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":24,\"w\":35,\"h\":20,\"i\":\"2\"},\"id\":\"$NAMESPACE-8\",\"panelIndex\":\"2\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":24,\"y\":44,\"w\":24,\"h\":18,\"i\":\"4\"},\"id\":\"$NAMESPACE-6\",\"panelIndex\":\"4\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":44,\"w\":24,\"h\":18,\"i\":\"5\"},\"id\":\"$NAMESPACE-7\",\"panelIndex\":\"5\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":24,\"y\":62,\"w\":24,\"h\":20,\"i\":\"6\"},\"id\":\"$NAMESPACE-4\",\"panelIndex\":\"6\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":82,\"w\":48,\"h\":21,\"i\":\"7\"},\"id\":\"$NAMESPACE-1\",\"panelIndex\":\"7\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}},\"gridData\":{\"x\":0,\"y\":6,\"w\":48,\"h\":18,\"i\":\"8\"},\"id\":\"$NAMESPACE-2\",\"panelIndex\":\"8\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"x\":0,\"y\":62,\"w\":24,\"h\":20,\"i\":\"9\"},\"version\":\"6.5.4\",\"panelIndex\":\"9\",\"type\":\"visualization\",\"id\":\"$NAMESPACE-3\",\"embeddableConfig\":{}},{\"gridData\":{\"x\":35,\"y\":24,\"w\":13,\"h\":20,\"i\":\"10\"},\"version\":\"6.5.4\",\"panelIndex\":\"10\",\"type\":\"visualization\",\"id\":\"$NAMESPACE-9\",\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}}}]","optionsJSON":"{\"darkTheme\":false,\"hidePanelTitles\":false,\"useMargins\":true}","version":1,"timeRestore":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[{\"meta\":{\"index\":\"$NAMESPACE-10\",\"negate\":false,\"disabled\":false,\"alias\":null,\"type\":\"phrase\",\"key\":\"is_merge\",\"value\":\"false\",\"params\":{\"query\":false,\"type\":\"phrase\"}},\"query\":{\"match\":{\"is_merge\":{\"query\":false,\"type\":\"phrase\"}}},\"\":{\"store\":\"appState\"}}]}"}},"type":"dashboard","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-8","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Project Stats","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Project Stats\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"author.keyword\",\"customLabel\":\"#Authors\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"organization.keyword\",\"customLabel\":\"#Organizations\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"added_lines\",\"customLabel\":\"#Added Lines\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"deleted_lines\",\"customLabel\":\"#Deleted Lines\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"num_files\",\"customLabel\":\"AVG #Files\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"changes_per_commit\",\"customLabel\":\"AVG #Changes per commit\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"project.keyword\",\"size\":9,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Project\"}}]}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-9","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - bot-like commits","visState":"{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{\"customLabel\":\"#Commits\",\"field\":\"num_commits\"},\"schema\":\"metric\",\"type\":\"sum\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"customLabel\":\"Bot-like commit\",\"field\":\"is_bot_like\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":2},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTooltip\":true,\"isDonut\":true,\"labels\":{\"last_level\":true,\"show\":true,\"truncate\":100,\"values\":true},\"legendPosition\":\"right\",\"type\":\"pie\"},\"title\":\"$NAMESPACE - GIT Commits - bot-like commits\",\"type\":\"pie\"}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-7","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Commits per Author","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Commits per Author\",\"type\":\"pie\",\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"labels\":{\"show\":true,\"values\":true,\"last_level\":true,\"truncate\":100}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"author.keyword\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Author\"}}]}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-6","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Commits per Organization","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Commits per Organization\",\"type\":\"pie\",\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"labels\":{\"show\":true,\"values\":true,\"last_level\":true,\"truncate\":100}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"organization.keyword\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Organization\"}}]}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-5","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Overall Statistics","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Overall Statistics\",\"type\":\"metric\",\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":100}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":46}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"project.keyword\",\"customLabel\":\"#Projects\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"author.keyword\",\"customLabel\":\"#Authors\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"organization.keyword\",\"customLabel\":\"#Organizations\"}}]}","uiStateJSON":"{}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-4","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Organization Stats","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Organization Stats\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"author.keyword\",\"customLabel\":\"#Authors\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"project.keyword\",\"customLabel\":\"#Projects\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"added_lines\",\"customLabel\":\"#Added Lines\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"deleted_lines\",\"customLabel\":\"#Deleted Lines\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"num_files\",\"customLabel\":\"AVG #Files\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"changes_per_commit\",\"customLabel\":\"AVG #Changes per commit\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"organization.keyword\",\"size\":9,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Organization\"}}]}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-3","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Authors Stats","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Authors Stats\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":true,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"organization.keyword\",\"customLabel\":\"#Organizations\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"project.keyword\",\"customLabel\":\"#Projects\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"added_lines\",\"customLabel\":\"#Added Lines\"}},{\"id\":\"5\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"deleted_lines\",\"customLabel\":\"#Deleted Lines\"}},{\"id\":\"6\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"num_files\",\"customLabel\":\"AVG #Files\"}},{\"id\":\"7\",\"enabled\":true,\"type\":\"avg\",\"schema\":\"metric\",\"params\":{\"field\":\"changes_per_commit\",\"customLabel\":\"AVG #Changes per commit\"}},{\"id\":\"8\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"author.keyword\",\"size\":9,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Author\"}}]}","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-1","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - Authors activity over the years","visState":"{\"title\":\"$NAMESPACE - GIT Commits - Authors activity over the years\",\"type\":\"heatmap\",\"params\":{\"type\":\"heatmap\",\"addTooltip\":true,\"addLegend\":true,\"enableHover\":false,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":10,\"colorSchema\":\"Blues\",\"setColorRange\":false,\"colorsRange\":[],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":true},\"labels\":{\"show\":false,\"rotate\":0,\"overwriteColor\":false,\"color\":\"#555\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"last_commit_date\",\"timeRange\":{\"from\":\"now-5y\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"y\",\"time_zone\":\"Europe/London\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"author.keyword\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Author\"}}]}","uiStateJSON":"{\"vis\":{\"defaultColors\":{\"2 - 79\":\"rgb(247,251,255)\",\"79 - 156\":\"rgb(227,238,249)\",\"156 - 233\":\"rgb(208,225,242)\",\"233 - 310\":\"rgb(182,212,233)\",\"310 - 386\":\"rgb(148,196,223)\",\"386 - 463\":\"rgb(107,174,214)\",\"463 - 540\":\"rgb(74,152,201)\",\"540 - 617\":\"rgb(46,126,188)\",\"617 - 694\":\"rgb(23,100,171)\",\"694 - 770\":\"rgb(8,74,145)\"}}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
+{"_index":".kibana_1","_type":"doc","_id":"$NAMESPACE:visualization:$NAMESPACE-2","_score":1,"_source":{"visualization":{"title":"$NAMESPACE - GIT Commits - commits over time","visState":"{\"title\":\"$NAMESPACE - GIT Commits - commits over time\",\"type\":\"histogram\",\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":true,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"#Commits\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"#Commits\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"num_commits\",\"customLabel\":\"#Commits\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"last_commit_date\",\"timeRange\":{\"from\":\"now-5y\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"auto\",\"time_zone\":\"Europe/London\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}}]}","uiStateJSON":"{\"vis\":{\"legendOpen\":true}}","description":"","version":1,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"index\":\"$NAMESPACE-10\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"}},"type":"visualization","namespace":"$NAMESPACE"}}
\ No newline at end of file
diff --git a/local_environment/README.md b/local_environment/README.md
index e1c30c0..55e65f7 100644
--- a/local_environment/README.md
+++ b/local_environment/README.md
@@ -15,6 +15,19 @@
* elasticsearch, bound and exposing port 9200 and 9300
* kibana, bound and exposing port 5601
+and will also configure the dashboard for you so that you already have all the mappings, the kibana settigs and the main
+visualizations and dashboard already configured.
+
+### Multiple dashboards environment
+
+If you want to spin up an environment in which you have multiple kibana dashboards configured,
+you ca run the following:
+
+```bash
+cd local_environmet
+docker-compose -f docker-compose.multi-dashboard.yaml up
+```
+
### Build kibana for local environment
The docker-compose relies on an external image (```gerritforge/analytics-kibana-6.5.4``), which is also maintained
diff --git a/local_environment/analytics-setup b/local_environment/analytics-setup
new file mode 120000
index 0000000..5ff66d2
--- /dev/null
+++ b/local_environment/analytics-setup
@@ -0,0 +1 @@
+../analytics-setup
\ No newline at end of file
diff --git a/local_environment/docker-compose.multi-dashboard.yaml b/local_environment/docker-compose.multi-dashboard.yaml
new file mode 100644
index 0000000..8fb3460
--- /dev/null
+++ b/local_environment/docker-compose.multi-dashboard.yaml
@@ -0,0 +1,56 @@
+version: '3'
+services:
+
+ kibana:
+ image: gerritforge/analytics-kibana-6.5.4
+ container_name: "analytics-kibana-multi_a-6.5.4"
+ networks:
+ - analytics
+ depends_on:
+ - elasticsearch
+ ports:
+ - "5601:5601"
+
+ elasticsearch:
+ build: elasticsearch
+ container_name: "analytics-elasticsearch-6.5.4"
+ networks:
+ - analytics
+ environment:
+ - ES_JAVA_OPTS=-Xmx1g -Xms1g
+ - http.host=0.0.0.0
+ - network.host=_local_
+ - http.publish_host=_local_
+ - http.cors.allow-origin=*
+ - http.cors.enabled=true
+ ports:
+ - "9200:9200"
+ - "9300:9300"
+
+ setup_dashboard_a:
+ build: analytics-setup
+ container_name: "analytics-setup-dashboard_a-for-6.5.4"
+ depends_on:
+ - elasticsearch
+ networks:
+ - analytics
+ environment:
+ - ELASTICSEARCH_URL=http://elasticsearch
+ - ELASTICSEARCH_PORT=9200
+ - NAMESPACE=dashboard_a
+
+ setup_dashboard_b:
+ build: analytics-setup
+ container_name: "analytics-setup-dashboard_b-for-6.5.4"
+ depends_on:
+ - elasticsearch
+ networks:
+ - analytics
+ environment:
+ - ELASTICSEARCH_URL=http://elasticsearch
+ - ELASTICSEARCH_PORT=9200
+ - NAMESPACE=dashboard_b
+
+networks:
+ analytics:
+ driver: bridge
diff --git a/local_environment/docker-compose.yaml b/local_environment/docker-compose.yaml
index e589593..d40d863 100644
--- a/local_environment/docker-compose.yaml
+++ b/local_environment/docker-compose.yaml
@@ -26,6 +26,19 @@
ports:
- "9200:9200"
- "9300:9300"
+
+ setup:
+ build: analytics-setup
+ container_name: "analytics-setup-for-6.5.4"
+ depends_on:
+ - elasticsearch
+ networks:
+ - analytics
+ environment:
+ - ELASTICSEARCH_URL=http://elasticsearch
+ - ELASTICSEARCH_PORT=9200
+ - NAMESPACE=localenv
+
networks:
analytics:
driver: bridge