Merge pull request #46 from apache/master

Update links for Userale 2.4.0
diff --git a/content/releases/index.html b/content/releases/index.html
index e83fe1c..7626959 100644
--- a/content/releases/index.html
+++ b/content/releases/index.html
@@ -81,7 +81,7 @@
   Apache Flagon artifacts are always distributed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
 </p>
 
-<h1>Apache Flagon UserALE.js version 2.3.0</h1>
+<h1>Apache Flagon UserALE.js version 2.4.0</h1>
 
 <p>
     Apache Flagon UserALE.js is a client side instrumentation library written in JavaScript designed for easy deployment and lightweight configuration in gathering logs from your web applications for user behavioral analytics.
@@ -120,35 +120,35 @@
   </thead>
   <tbody>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz">Apache UserALE.js 2.3.0 Binaries (tar.gz)</a> </td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz.asc">asc (tar.gz)</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz.sha512">sha512 (tar.gz)</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz">Apache UserALE.js 2.4.0 Binaries (tar.gz)</a> </td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.asc">asc (tar.gz)</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.sha512">sha512 (tar.gz)</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip">Apache UserALE.js 2.3.0 Binaries (zip)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip.asc">asc (zip)</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip.sha512">sha512 (zip)</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.zip">Apache UserALE.js 2.4.0 Binaries (zip)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.zip.asc">asc (zip)</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.sha512">sha512 (zip)</a></td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz">Apache UserALE.js 2.3.0 Source (tar.gz)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz.asc">asc (tar.gz)</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz.sha512">sha512 (tar.gz)</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz">Apache UserALE.js 2.4.0 Source (tar.gz)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz.asc">asc (tar.gz)</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz.sha512">sha512 (tar.gz)</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip">Apache UserALE.js 2.3.0 Source (zip)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip.asc">asc (zip)</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip.sha512">sha512 (zip)</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip">Apache UserALE.js 2.4.0 Source (zip)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip.asc">asc (zip)</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip.sha512">sha512 (zip)</a></td>
   </tr>
 
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz">Apache Distill 0.1.0 Source (tar.gz)</a> </td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.asc">asc</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz">Apache Distill 0.1.0 Source (tar.gz)</a> </td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz.asc">asc</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0-py3-none-any.whl">Apache Distill 0.1.0 Wheel</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0-py3-none-any.whl.asc">asc</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl">Apache Distill 0.1.0 Wheel</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl.asc">asc</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl.sha512">sha512</a></td>
   </tr>
   </tbody>
 </table>
diff --git a/docker/docker-compose-8.11.3.yml b/docker/docker-compose-8.11.3.yml
new file mode 100644
index 0000000..5363f90
--- /dev/null
+++ b/docker/docker-compose-8.11.3.yml
@@ -0,0 +1,157 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Apache Flagon Single-Node Build
+
+version: "3"
+services:
+
+  # Startup
+  startup:
+    build: ./startup
+    depends_on:
+      - "elasticsearch"
+    command: bash /opt/entrypoint.sh
+
+  # Site
+  site:
+    build: ./site
+    ports:
+      - 8080:8080
+    depends_on:
+      - "logstash"
+    command: python -m http.server 8080
+
+  # Elasticsearch
+  elasticsearch:
+    build: ./elasticsearch/8.11.3
+    environment:
+      - INITIAL_MASTER_NODES=elasticsearch
+      - "DISCOVERY_SERVICE=0.0.0.0"
+      - NETWORK_HOST=0.0.0.0
+      - HTTP_CORS_ENABLE=true
+      - HTTP_CORS_ALLOW_ORIGIN=*
+      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+    ulimits:
+      memlock:
+        soft: -1
+        hard: -1
+    healthcheck:
+      test: ["CMD", "curl","-s" ,"-f", "-u", "http://localhost:9200/_cluster/health"]
+    # Mount volumes to backup elasticsearch data
+    volumes:
+#      - esdata:/usr/share/elasticsaerch/data
+      - ./elasticsearch/8.11.3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z
+    ports:
+      - "9200:9200"
+    networks:
+      - esnet
+
+  # Kibana
+  kibana:
+    build: ./kibana/8.11.3
+    environment:
+      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+      - "ELASTICSEARCH_URL=http://elasticsearch:9200"
+    ports:
+      - "5601:5601"
+    depends_on:
+      - "elasticsearch"
+    networks:
+      - esnet
+
+  # Logstash
+  logstash:
+    build: ./logstash/8.11.3
+    environment:
+      - "ELASTICSEARCH_URL=elasticsearch:9200"
+    ports:
+      - 8100:8100
+    volumes:
+      - ./logstash/8.11.3/pipeline/logstash-userale.conf:/usr/share/logstash/pipeline/logstash-userale.conf
+      - ./logstash/8.11.3/templates/userale.json:/usr/share/logstash/templates/userale.json
+    depends_on:
+      - "elasticsearch"
+    networks:
+      - esnet
+
+  # Distill
+  distill:
+     build: ./distill
+     ports:
+       - 8090:8090
+     depends_on:
+       - "elasticsearch"
+     networks:
+       - esnet
+
+  # TAP's Database
+  db:
+     build: ./db
+     image: senssoft/postgres:latest
+     ports:
+       - "5432:5432"
+
+  # TAP
+  tap:
+     build: ./tap
+     command: bash -c "/usr/src/app/wait-for-postgres.sh"
+     ports:
+       - "8010:8010"
+     depends_on:
+       - db
+     links:
+       - db:db
+
+  # Specific container and configuration to monitor the HOST (filesystem, memory, processes,...)
+  metricbeat:
+    image: docker.elastic.co/beats/metricbeat:8.11.3
+#    restart: unless-stopped
+    user: root
+    pid: host
+    volumes:
+      #The commented sections below enable Metricbeat to monitor the Docker host
+      #rather than the Metricbeat container. These are used by the system module.
+      - /proc:/hostfs/proc:ro
+      - /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
+      #We mount the host filesystem so we can report on disk usage with the system module
+      - /:/hostfs:ro
+      #Mount the metricbeat configuration so users can make edits
+      - ./beats/metricbeat/metricbeat.yml:/usr/share/metricbeat/metricbeat.yml
+      #Mount the modules.d directory into the container. This allows user to 
+      #potentially make changes to the modules and they will be dynamically loaded.
+      - ./beats/metricbeat/modules.d/:/usr/share/metricbeat/modules.d/
+      #Allows us to report on docker from the hosts information
+      - /var/run/docker.sock:/var/run/docker.sock
+    depends_on:
+      - elasticsearch
+    environment:
+      - ELASTICSEARCH_URL=http://elasticsearch:9200
+      - KIBANA_URL=http://kibana:5601
+      - LOGSTASH_URL=http://logstash:9600
+      - POSTGRESQL_URL="postgresql://db:5432/tapdb?sslmode=disable"
+      - POSTGRESQL_USERNAME=tapuser
+      - POSTGRESQL_PASSWORD="Dr@p3rUs3r"
+    extra_hosts:
+      - "elasticsearch:172.17.0.1" # The IP of docker0 interface to access host from container
+      - "kibana:172.17.0.1" # The IP of docker0 interface to access host from container
+      - "logstash:172.17.0.1"
+      - "db:172.17.0.1"
+    command: metricbeat -e -system.hostfs=/hostfs -strict.perms=false
+    network_mode: host # Mandatory to monitor HOST filesystem, memory, processes,...
+
+network:
+  name:
+    external: true
\ No newline at end of file
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index bbf6896..86e3921 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -25,21 +25,15 @@
       - 8080:8080
     depends_on:
       - "logstash"
-    command: python -m SimpleHTTPServer 8080
+    command: python -m http.server 8080
 
   # Elasticsearch
   elasticsearch:
-    build: ./elasticsearch/6.8.2
+    build: ./elasticsearch/8.11.3
     environment:
-      - NODE_MASTER=true
-      - NUMBER_OF_MASTERS=1
-      - NODE_COORDINATE=true
+      - INITIAL_MASTER_NODES=elasticsearch
       - "DISCOVERY_SERVICE=0.0.0.0"
-      - NODE_DATA=true
-      - NODE_INGEST=true
-      - MAX_LOCAL_STORAGE_NODES=1
       - NETWORK_HOST=0.0.0.0
-      - HTTP_ENABLE=true
       - HTTP_CORS_ENABLE=true
       - HTTP_CORS_ALLOW_ORIGIN=*
       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
@@ -50,8 +44,10 @@
     healthcheck:
       test: ["CMD", "curl","-s" ,"-f", "-u", "http://localhost:9200/_cluster/health"]
     # Mount volumes to backup elasticsearch data
-#    volumes:
+    volumes:
 #      - esdata:/usr/share/elasticsaerch/data
+      - ./elasticsearch/8.11.3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z
+    user: "1000:0"
     ports:
       - "9200:9200"
     networks:
@@ -59,10 +55,11 @@
 
   # Kibana
   kibana:
-    build: ./kibana/6.8.2
+    build: ./kibana/8.11.3
     environment:
       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
       - "ELASTICSEARCH_URL=http://elasticsearch:9200"
+    user: "1000:0"
     ports:
       - "5601:5601"
     depends_on:
@@ -72,14 +69,15 @@
 
   # Logstash
   logstash:
-    build: ./logstash/6.8.2
+    build: ./logstash/8.11.3
     environment:
       - "ELASTICSEARCH_URL=elasticsearch:9200"
+    user: "1000:0"
     ports:
       - 8100:8100
     volumes:
-      - ./logstash/6.8.2/pipeline/logstash-userale.conf:/usr/share/logstash/pipeline/logstash-userale.conf
-      - ./logstash/6.8.2/templates/userale.json:/usr/share/logstash/templates/userale.json
+      - ./logstash/8.11.3/pipeline/logstash-userale.conf:/usr/share/logstash/pipeline/logstash-userale.conf
+      - ./logstash/8.11.3/templates/userale.json:/usr/share/logstash/templates/userale.json
     depends_on:
       - "elasticsearch"
     networks:
@@ -87,7 +85,7 @@
 
   # Specific container and configuration to monitor the HOST (filesystem, memory, processes,...)
   metricbeat:
-    image: docker.elastic.co/beats/metricbeat-oss:6.8.2
+    image: docker.elastic.co/beats/metricbeat:8.11.3
 #    restart: unless-stopped
     user: root
     pid: host
@@ -106,7 +104,7 @@
       #Allows us to report on docker from the hosts information
       - /var/run/docker.sock:/var/run/docker.sock
     depends_on:
-      - elasticsearch
+      - kibana
     environment:
       - ELASTICSEARCH_URL=http://elasticsearch:9200
       - KIBANA_URL=http://kibana:5601
@@ -120,5 +118,5 @@
 
 networks:
   esnet:
-    external:
-      name: esnet
+    name: esnet
+    external: true
diff --git a/docker/elasticsearch/8.11.3/Dockerfile b/docker/elasticsearch/8.11.3/Dockerfile
new file mode 100644
index 0000000..e3e5d3a
--- /dev/null
+++ b/docker/elasticsearch/8.11.3/Dockerfile
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM docker.elastic.co/elasticsearch/elasticsearch:8.11.3
+
+# Set environment
+ENV CLUSTER_NAME Flagon
+
+# Kubernetes requires swap is turned off
+ENV MEMORY_LOCK false
+
+EXPOSE 9200
\ No newline at end of file
diff --git a/docker/elasticsearch/8.11.3/config/elasticsearch.yml b/docker/elasticsearch/8.11.3/config/elasticsearch.yml
new file mode 100644
index 0000000..caaf7ea
--- /dev/null
+++ b/docker/elasticsearch/8.11.3/config/elasticsearch.yml
@@ -0,0 +1,70 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Custom config borrowed from Pires: https://github.com/pires/docker-elasticsearch-kubernetes
+
+cluster:
+  name: ${CLUSTER_NAME:FLAGON}
+  initial_master_nodes: ["${INITIAL_MASTER_NODES:elasticsearch}"]
+
+node:
+  name: ${NODE_NAME:elasticsearch}
+
+network.host: ${NETWORK_HOST:0.0.0.0}
+
+path:
+  data: /usr/share/elasticsearch/data
+  logs: /usr/share/elasticsearch/log
+
+bootstrap:
+  memory_lock: ${MEMORY_LOCK}
+
+http:
+  compression: true
+  cors:
+    enabled: ${HTTP_CORS_ENABLE:true}
+    allow-origin: ${HTTP_CORS_ALLOW_ORIGIN:"*"}
+
+# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
+discovery:
+    seed_hosts: ["${DISCOVERY_SERVICE:0.0.0.0}"]
+
+## X-Pack settings
+## see https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html
+#
+xpack.license.self_generated.type: trial
+xpack.security.enabled: false
+
+##
+## TLS configuration
+## See instructions from README to enable.
+##
+
+## Communications between nodes in a cluster
+## see https://www.elastic.co/guide/en/elasticsearch/reference/current/configuring-tls.html#tls-transport
+#
+#xpack.security.transport.ssl.enabled: true
+#xpack.security.transport.ssl.verification_mode: certificate
+#xpack.security.transport.ssl.certificate_authorities: [ ca.crt ]
+#xpack.security.transport.ssl.certificate: elasticsearch.crt
+#xpack.security.transport.ssl.key: elasticsearch.key
+
+## HTTP client communications
+## see https://www.elastic.co/guide/en/elasticsearch/reference/current/configuring-tls.html#tls-http
+#
+#xpack.security.http.ssl.enabled: true
+#xpack.security.http.ssl.certificate_authorities: [ ca.crt ]
+#xpack.security.http.ssl.certificate: elasticsearch.crt
+#xpack.security.http.ssl.key: elasticsearch.key
\ No newline at end of file
diff --git a/docker/elasticsearch/8.11.3/config/log4j2.properties b/docker/elasticsearch/8.11.3/config/log4j2.properties
new file mode 100644
index 0000000..c86c995
--- /dev/null
+++ b/docker/elasticsearch/8.11.3/config/log4j2.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+status = error
+
+appender.console.type = Console
+appender.console.name = console
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name] %marker%m%n 
+
+rootLogger.level = info
+rootLogger.appenderRef.console.ref = console
\ No newline at end of file
diff --git a/docker/kibana/8.11.3/Dockerfile b/docker/kibana/8.11.3/Dockerfile
new file mode 100644
index 0000000..1032f5e
--- /dev/null
+++ b/docker/kibana/8.11.3/Dockerfile
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM docker.elastic.co/kibana/kibana:8.11.3
+
+MAINTAINER Joshua Poore <poorejc@apache.org>
+
+EXPOSE 5601
diff --git a/docker/kibana/8.11.3/Saved Objects/Apache Flagon Business Analytics Dashboard.ndjson b/docker/kibana/8.11.3/Saved Objects/Apache Flagon Business Analytics Dashboard.ndjson
new file mode 100644
index 0000000..bd56e2d
--- /dev/null
+++ b/docker/kibana/8.11.3/Saved Objects/Apache Flagon Business Analytics Dashboard.ndjson
@@ -0,0 +1,18 @@
+[
+  {
+    "_id": "90b264d0-2cd4-11e9-9b9a-95b7b006b436",
+    "_type": "dashboard",
+    "_source": {
+      "title": "Apache Flagon Business Analytics Dashboard",
+      "hits": 0,
+      "description": "Abstracts Multi-User Interaction with Single Pages/Apps",
+      "panelsJSON": "[{\"embeddableConfig\":{\"vis\":{\"defaultColors\":{\"0 - 400\":\"rgb(255,245,240)\",\"1,200 - 1,600\":\"rgb(203,24,29)\",\"400 - 800\":\"rgb(252,187,161)\",\"800 - 1,200\":\"rgb(251,106,74)\"},\"legendOpen\":false}},\"gridData\":{\"x\":0,\"y\":84,\"w\":48,\"h\":21,\"i\":\"5\"},\"id\":\"429c0940-fce6-11e8-a156-87bcaf41506e\",\"panelIndex\":\"5\",\"title\":\"Unique User Activity by Day\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}},\"gridData\":{\"x\":25,\"y\":14,\"w\":23,\"h\":15,\"i\":\"10\"},\"id\":\"20b291b0-12f2-11e9-a1e0-631cf5fb9335\",\"panelIndex\":\"10\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":12,\"y\":14,\"w\":13,\"h\":15,\"i\":\"13\"},\"id\":\"d1ba2560-2d03-11e9-9b9a-95b7b006b436\",\"panelIndex\":\"13\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":25,\"y\":29,\"w\":23,\"h\":29,\"i\":\"14\"},\"id\":\"e1b6c290-06e1-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"14\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":29,\"w\":25,\"h\":29,\"i\":\"15\"},\"id\":\"822808b0-2d0c-11e9-9b9a-95b7b006b436\",\"panelIndex\":\"15\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":105,\"w\":48,\"h\":26,\"i\":\"16\"},\"id\":\"d5a95ce0-06e3-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"16\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":14,\"i\":\"17\"},\"id\":\"36a0eb90-2cd6-11e9-9b9a-95b7b006b436\",\"panelIndex\":\"17\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{},\"gridData\":{\"x\":0,\"y\":58,\"w\":48,\"h\":26,\"i\":\"18\"},\"id\":\"33e09c60-2ff2-11e9-be20-a737e788a0aa\",\"panelIndex\":\"18\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"x\":0,\"y\":14,\"w\":12,\"h\":15,\"i\":\"19\"},\"version\":\"6.6.2\",\"panelIndex\":\"19\",\"type\":\"visualization\",\"id\":\"a712e550-a4da-11e9-baf2-196230c538eb\",\"embeddableConfig\":{}}]",
+      "optionsJSON": "{\"darkTheme\":true,\"useMargins\":false}",
+      "version": 1,
+      "timeRestore": false,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"UserID Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"userId\",\"negate\":false,\"params\":{\"query\":\"nobody\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"nobody\"},\"query\":{\"match\":{\"userId\":{\"query\":\"nobody\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Host Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"host\",\"negate\":false,\"params\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"172.18.0.1\"},\"query\":{\"match\":{\"host\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Event Type Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"type\",\"negate\":false,\"params\":{\"query\":\"click\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"click\"},\"query\":{\"match\":{\"type\":{\"query\":\"click\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"toolName\",\"negate\":false,\"params\":{\"query\":\"MyApp\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"MyApp\"},\"query\":{\"match\":{\"toolName\":{\"query\":\"MyApp\",\"type\":\"phrase\"}}}}],\"highlightAll\":true,\"version\":true,\"query\":{\"language\":\"lucene\",\"query\":\"\"}}"
+      }
+    }
+  }
+]
\ No newline at end of file
diff --git a/docker/kibana/8.11.3/Saved Objects/Apache Flagon Page Usage Dashboard.ndjson b/docker/kibana/8.11.3/Saved Objects/Apache Flagon Page Usage Dashboard.ndjson
new file mode 100644
index 0000000..f66ec8c
--- /dev/null
+++ b/docker/kibana/8.11.3/Saved Objects/Apache Flagon Page Usage Dashboard.ndjson
@@ -0,0 +1,18 @@
+[
+  {
+    "_id": "3f02bf70-12eb-11e9-a1e0-631cf5fb9335",
+    "_type": "dashboard",
+    "_source": {
+      "title": "Apache Flagon Page Usage Dashboard",
+      "hits": 0,
+      "description": "Abstracts Multi-User Interaction with Single Pages/Apps. Ideal for script-tag, page-level UserALE.js deployments.",
+      "panelsJSON": "[{\"gridData\":{\"h\":15,\"i\":\"2\",\"w\":32,\"x\":16,\"y\":0},\"id\":\"f7ca4560-be7c-11e7-8adf-fd0a12531eca\",\"panelIndex\":\"2\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"vis\":{\"defaultColors\":{\"0 - 400\":\"rgb(255,245,240)\",\"1,200 - 1,600\":\"rgb(203,24,29)\",\"400 - 800\":\"rgb(252,187,161)\",\"800 - 1,200\":\"rgb(251,106,74)\"},\"legendOpen\":false}},\"gridData\":{\"h\":15,\"i\":\"5\",\"w\":20,\"x\":12,\"y\":15},\"id\":\"429c0940-fce6-11e8-a156-87bcaf41506e\",\"panelIndex\":\"5\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"6\",\"w\":12,\"x\":0,\"y\":15},\"id\":\"5b467330-06e2-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"6\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":45,\"i\":\"7\",\"w\":48,\"x\":0,\"y\":45},\"id\":\"2bf40010-be7d-11e7-8adf-fd0a12531eca\",\"panelIndex\":\"7\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"8\",\"w\":16,\"x\":0,\"y\":0},\"id\":\"ba30fd80-12ee-11e9-a1e0-631cf5fb9335\",\"panelIndex\":\"8\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"9\",\"w\":24,\"x\":0,\"y\":30},\"id\":\"bcd7c950-be7c-11e7-8adf-fd0a12531eca\",\"panelIndex\":\"9\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}},\"gridData\":{\"h\":15,\"i\":\"10\",\"w\":16,\"x\":32,\"y\":15},\"id\":\"20b291b0-12f2-11e9-a1e0-631cf5fb9335\",\"panelIndex\":\"10\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"spy\":null},\"gridData\":{\"h\":15,\"i\":\"11\",\"w\":24,\"x\":24,\"y\":30},\"id\":\"bf327a20-12f3-11e9-a1e0-631cf5fb9335\",\"panelIndex\":\"11\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":40,\"i\":\"12\",\"w\":48,\"x\":0,\"y\":90},\"id\":\"887fec40-1886-11e9-bdac-e790c2bff4d4\",\"panelIndex\":\"12\",\"type\":\"visualization\",\"version\":\"6.5.4\"}]",
+      "optionsJSON": "{\"darkTheme\":true,\"useMargins\":false}",
+      "version": 1,
+      "timeRestore": false,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"UserID Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"userId\",\"negate\":false,\"params\":{\"query\":\"nobody\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"nobody\"},\"query\":{\"match\":{\"userId\":{\"query\":\"nobody\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Host Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"host\",\"negate\":false,\"params\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"172.18.0.1\"},\"query\":{\"match\":{\"host\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Event Type Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"type\",\"negate\":false,\"params\":{\"query\":\"click\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"click\"},\"query\":{\"match\":{\"type\":{\"query\":\"click\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"URL Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"pageUrl\",\"negate\":false,\"params\":{\"query\":\"http://senssoft.incubator.apache.org/\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"http://senssoft.incubator.apache.org/\"},\"query\":{\"match\":{\"pageUrl\":{\"query\":\"http://senssoft.incubator.apache.org/\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"toolName\",\"negate\":false,\"params\":{\"query\":\"MyApp\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"MyApp\"},\"query\":{\"match\":{\"toolName\":{\"query\":\"MyApp\",\"type\":\"phrase\"}}}}],\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"*\",\"language\":\"lucene\"}}"
+      }
+    }
+  }
+]
\ No newline at end of file
diff --git a/docker/kibana/8.11.3/Saved Objects/Apache Flagon User Access Dashboard.ndjson b/docker/kibana/8.11.3/Saved Objects/Apache Flagon User Access Dashboard.ndjson
new file mode 100644
index 0000000..68b74bd
--- /dev/null
+++ b/docker/kibana/8.11.3/Saved Objects/Apache Flagon User Access Dashboard.ndjson
@@ -0,0 +1,18 @@
+[
+  {
+    "_id": "ab9f1f90-fce6-11e8-a156-87bcaf41506e",
+    "_type": "dashboard",
+    "_source": {
+      "title": "Apache Flagon User Access Dashboard",
+      "hits": 0,
+      "description": "Abstracts Multi-User Utilization of IT Assets (and Web Usage). Ideal for UserALE.js Web Extension deployments.",
+      "panelsJSON": "[{\"gridData\":{\"h\":15,\"i\":\"2\",\"w\":32,\"x\":16,\"y\":0},\"id\":\"f7ca4560-be7c-11e7-8adf-fd0a12531eca\",\"panelIndex\":\"2\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"spy\":null},\"gridData\":{\"h\":15,\"i\":\"4\",\"w\":16,\"x\":0,\"y\":0},\"id\":\"e36b1f40-be7c-11e7-8adf-fd0a12531eca\",\"panelIndex\":\"4\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"5\",\"w\":36,\"x\":12,\"y\":15},\"id\":\"429c0940-fce6-11e8-a156-87bcaf41506e\",\"panelIndex\":\"5\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"6\",\"w\":12,\"x\":0,\"y\":15},\"id\":\"5b467330-06e2-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"6\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"7\",\"w\":36,\"x\":12,\"y\":45},\"id\":\"e1b6c290-06e1-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"7\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"embeddableConfig\":{\"vis\":{\"colors\":{\"0 - 6\":\"#FCE2DE\"},\"defaultColors\":{\"0 - 6\":\"rgb(255,245,240)\",\"11 - 17\":\"rgb(251,106,74)\",\"17 - 22\":\"rgb(203,24,29)\",\"6 - 11\":\"rgb(252,187,161)\"},\"legendOpen\":true}},\"gridData\":{\"h\":15,\"i\":\"8\",\"w\":48,\"x\":0,\"y\":30},\"id\":\"d5a95ce0-06e3-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"8\",\"type\":\"visualization\",\"version\":\"6.5.4\"},{\"gridData\":{\"h\":15,\"i\":\"9\",\"w\":12,\"x\":0,\"y\":45},\"id\":\"5eeda1e0-06e5-11e9-8c58-f38cfff498f6\",\"panelIndex\":\"9\",\"type\":\"visualization\",\"version\":\"6.5.4\"}]",
+      "optionsJSON": "{\"darkTheme\":true,\"useMargins\":false}",
+      "version": 1,
+      "timeRestore": false,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"UserID Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"userId\",\"negate\":false,\"params\":{\"query\":\"nobody\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"nobody\"},\"query\":{\"match\":{\"userId\":{\"query\":\"nobody\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Host Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"host\",\"negate\":false,\"params\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"172.18.0.1\"},\"query\":{\"match\":{\"host\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Event Type Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"type\",\"negate\":false,\"params\":{\"query\":\"click\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"click\"},\"query\":{\"match\":{\"type\":{\"query\":\"click\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"URL Search\",\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"pageUrl\",\"negate\":false,\"params\":[\"http://senssoft.incubator.apache.org/\"],\"type\":\"phrases\",\"value\":\"http://senssoft.incubator.apache.org/\"},\"query\":{\"bool\":{\"minimum_should_match\":1,\"should\":[{\"match_phrase\":{\"pageUrl\":\"http://senssoft.incubator.apache.org/\"}}]}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":true,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"pageUrl\",\"negate\":false,\"params\":[\"https://github.com/apache/incubator-senssoft\"],\"type\":\"phrases\",\"value\":\"https://github.com/apache/incubator-senssoft\"},\"query\":{\"bool\":{\"minimum_should_match\":1,\"should\":[{\"match_phrase\":{\"pageUrl\":\"https://github.com/apache/incubator-senssoft\"}}]}}}],\"highlightAll\":true,\"version\":true,\"query\":{\"language\":\"lucene\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"default_field\":\"*\",\"query\":\"*\"}}}}"
+      }
+    }
+  }
+]
\ No newline at end of file
diff --git a/docker/kibana/8.11.3/Saved Objects/Apache Flagon Visualizations.ndjson b/docker/kibana/8.11.3/Saved Objects/Apache Flagon Visualizations.ndjson
new file mode 100644
index 0000000..d7781e2
--- /dev/null
+++ b/docker/kibana/8.11.3/Saved Objects/Apache Flagon Visualizations.ndjson
@@ -0,0 +1,427 @@
+[
+  {
+    "_id": "d5a95ce0-06e3-11e9-8c58-f38cfff498f6",
+    "_type": "visualization",
+    "_source": {
+      "title": "Page Activity By Day",
+      "visState": "{\"title\":\"Page Activity By Day\",\"type\":\"heatmap\",\"params\":{\"type\":\"heatmap\",\"addTooltip\":true,\"addLegend\":true,\"enableHover\":false,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":4,\"colorSchema\":\"Reds\",\"setColorRange\":false,\"colorsRange\":[],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":false},\"labels\":{\"show\":false,\"rotate\":0,\"color\":\"#555\",\"overwriteColor\":false}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total Logs\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"clientTime\",\"timeRange\":{\"from\":\"now-2y\",\"to\":\"now\",\"mode\":\"quick\"},\"useNormalizedEsInterval\":true,\"interval\":\"d\",\"time_zone\":\"America/New_York\",\"drop_partials\":false,\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Days\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"pageTitle\",\"size\":8,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Unique Pages\"}}]}",
+      "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 125\":\"rgb(255,245,240)\",\"125 - 250\":\"rgb(252,187,161)\",\"250 - 375\":\"rgb(251,106,74)\",\"375 - 500\":\"rgb(203,24,29)\"}}}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "33e09c60-2ff2-11e9-be20-a737e788a0aa",
+    "_type": "visualization",
+    "_source": {
+      "title": "Funnel",
+      "visState": "{\"title\":\"Funnel\",\"type\":\"histogram\",\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false,\"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\":\"Unique Users\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Unique Users\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"host\",\"customLabel\":\"Unique Users\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"filters\",\"schema\":\"segment\",\"params\":{\"filters\":[{\"input\":{\"query\":\"pageUrl:\\\"http://senssoft.incubator.apache.org/\\\"\"},\"label\":\"Apache SensSoft Landing\"},{\"input\":{\"query\":\"pageUrl:\\\"http://senssoft.incubator.apache.org/releases/\\\"\"},\"label\":\"Apache SensSoft Releases\"},{\"input\":{\"query\":\"pageUrl:\\\"http://www.apache.org/dyn/closer.cgi/incubator/senssoft/apache-senssoft-useralejs-1.0.0/apache-senssoft-useralejs-1.0.0-bin.tar.gz\\\"\"},\"label\":\"Download Mirror\"},{\"input\":{\"query\":\"type:\\\"click\\\" AND pageUrl:\\\"http://www.apache.org/dyn/closer.cgi/incubator/senssoft/apache-senssoft-useralejs-1.0.0/apache-senssoft-useralejs-1.0.0-bin.tar.gz\\\" AND target:\\\"strong\\\"\"},\"label\":\"Apache SensSoft Download\"}]}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "887fec40-1886-11e9-bdac-e790c2bff4d4",
+    "_type": "visualization",
+    "_source": {
+      "title": "A/B Test",
+      "visState": "{\"title\":\"A/B Test\",\"type\":\"histogram\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"HTML Tags\"},\"type\":\"category\"}],\"defaultYExtents\":false,\"drawLinesBetweenPoints\":true,\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"interpolate\":\"linear\",\"legendPosition\":\"right\",\"radiusRatio\":9,\"scale\":\"linear\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"mode\":\"stacked\",\"show\":\"true\",\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"setYExtents\":false,\"showCircles\":true,\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"target\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"HTML Tags\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"toolVersion\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"JS Events\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"language\":\"lucene\",\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"default_field\":\"*\",\"query\":\"*\"}}},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "e36b1f40-be7c-11e7-8adf-fd0a12531eca",
+    "_type": "visualization",
+    "_source": {
+      "title": "Total Number of Logs",
+      "visState": "{\"title\":\"Total Number of Logs\",\"type\":\"metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total number of logs\"}}],\"listeners\":{}}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "2bf40010-be7d-11e7-8adf-fd0a12531eca",
+    "_type": "visualization",
+    "_source": {
+      "title": "Events by Targets",
+      "visState": "{\"title\":\"Events by Targets\",\"type\":\"histogram\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"HTML Tags\"},\"type\":\"category\"}],\"defaultYExtents\":false,\"drawLinesBetweenPoints\":true,\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"interpolate\":\"linear\",\"legendPosition\":\"right\",\"radiusRatio\":9,\"scale\":\"linear\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"mode\":\"stacked\",\"show\":\"true\",\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"setYExtents\":false,\"showCircles\":true,\"times\":[],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"value\"}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"target\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"HTML Tags\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"type\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"JS Events\"}}],\"listeners\":{}}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "64045a30-fce4-11e8-a156-87bcaf41506e",
+    "_type": "visualization",
+    "_source": {
+      "title": "Total Logs by Unique Hosts",
+      "visState": "{\"title\":\"Total Logs by Unique Hosts\",\"type\":\"horizontal_bar\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":200},\"position\":\"left\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Total Logs\"},\"drawLinesBetweenPoints\":true,\"mode\":\"normal\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":true,\"rotate\":75,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"bottom\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Total Logs\"},\"type\":\"value\"}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total Logs\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"host\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Unique Hosts\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"language\":\"lucene\",\"query\":\"\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "f7c690a0-12ef-11e9-a1e0-631cf5fb9335",
+    "_type": "visualization",
+    "_source": {
+      "title": "Top UI Elements Used",
+      "visState": "{\"title\":\"Top UI Elements Used\",\"type\":\"pie\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"type\":\"pie\",\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Element Interactions\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"target\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":25,\"order\":\"desc\",\"orderBy\":\"_term\",\"customLabel\":\"UI Elements\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "ba30fd80-12ee-11e9-a1e0-631cf5fb9335",
+    "_type": "visualization",
+    "_source": {
+      "title": "Number of User Events",
+      "visState": "{\"title\":\"Number of User Events\",\"type\":\"metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Number of User Events\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "20b291b0-12f2-11e9-a1e0-631cf5fb9335",
+    "_type": "visualization",
+    "_source": {
+      "title": "Most Active Users by Host",
+      "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{\"customLabel\":\"Number of User Events\"},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"customLabel\":\"Host\",\"field\":\"host\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderBy\":\"_term\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":5},\"schema\":\"segment\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":200},\"position\":\"left\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Number of User Events\"},\"drawLinesBetweenPoints\":true,\"mode\":\"normal\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":true,\"rotate\":75,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"bottom\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Number of User Events\"},\"type\":\"value\"}]},\"title\":\"Most Active Users by Host\",\"type\":\"horizontal_bar\"}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"language\":\"lucene\",\"query\":\"\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "429c0940-fce6-11e8-a156-87bcaf41506e",
+    "_type": "visualization",
+    "_source": {
+      "title": "Host Activity By Day",
+      "visState": "{\"title\":\"Host Activity By Day\",\"type\":\"heatmap\",\"params\":{\"type\":\"heatmap\",\"addTooltip\":true,\"addLegend\":true,\"enableHover\":false,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":4,\"colorSchema\":\"Reds\",\"setColorRange\":false,\"colorsRange\":[],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":false},\"labels\":{\"show\":false,\"rotate\":0,\"color\":\"#555\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total Logs\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"clientTime\",\"interval\":\"d\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Days\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"host\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Unique Hosts\"}}]}",
+      "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 500\":\"rgb(255,245,240)\",\"500 - 1,000\":\"rgb(252,187,161)\",\"1,000 - 1,500\":\"rgb(251,106,74)\",\"1,500 - 2,000\":\"rgb(203,24,29)\"}}}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "bcd7c950-be7c-11e7-8adf-fd0a12531eca",
+    "_type": "visualization",
+    "_source": {
+      "title": "Top Event Types",
+      "visState": "{\"title\":\"Top Event Types\",\"type\":\"pie\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Top Event Types\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"type\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Event types\"}}],\"listeners\":{}}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "bf327a20-12f3-11e9-a1e0-631cf5fb9335",
+    "_type": "visualization",
+    "_source": {
+      "title": "Top Target UI Element Cloud",
+      "visState": "{\"title\":\"Top Target UI Element Cloud\",\"type\":\"tagcloud\",\"params\":{\"scale\":\"linear\",\"orientation\":\"single\",\"minFontSize\":8,\"maxFontSize\":29,\"hideLabel\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Count of User Events\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"target\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":8,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"UI Elements\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "e1b6c290-06e1-11e9-8c58-f38cfff498f6",
+    "_type": "visualization",
+    "_source": {
+      "title": "Top Pages by Activity",
+      "visState": "{\"title\":\"Top Pages by Activity\",\"type\":\"pie\",\"params\":{\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"type\":\"pie\",\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Top Event Types\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"pageTitle\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Event types\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":\"*\",\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "f7ca4560-be7c-11e7-8adf-fd0a12531eca",
+    "_type": "visualization",
+    "_source": {
+      "title": "Time Series",
+      "visState": "{\"title\":\"Time Series\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(*)\",\"interval\":\"auto\"},\"aggs\":[],\"listeners\":{}}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"query\":{\"query\":{\"query_string\":{\"query\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "36a0eb90-2cd6-11e9-9b9a-95b7b006b436",
+    "_type": "visualization",
+    "_source": {
+      "title": "Time-Series Unique Hosts",
+      "visState": "{\"title\":\"Time-Series Unique Hosts\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(metric=cardinality:host).label('Unique Users (Hosts)')\",\"interval\":\"auto\"},\"aggs\":[]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "28070240-2d12-11e9-9b9a-95b7b006b436",
+    "_type": "visualization",
+    "_source": {
+      "title": "Activity by SessionID",
+      "visState": "{\"type\":\"timelion\",\"title\":\"Activity by SessionID\",\"params\":{\"expression\":\".es(*,split=sessionID:10)\",\"interval\":\"auto\"}}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "5eeda1e0-06e5-11e9-8c58-f38cfff498f6",
+    "_type": "visualization",
+    "_source": {
+      "title": "Number of Unique Pages Visited",
+      "visState": "{\"title\":\"Number of Unique Pages Visited\",\"type\":\"metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"details.url\",\"customLabel\":\"Number of Unique Pages Visited\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "822808b0-2d0c-11e9-9b9a-95b7b006b436",
+    "_type": "visualization",
+    "_source": {
+      "title": "Top Web Pages by Unique Visitors",
+      "visState": "{\"title\":\"Top Web Pages by Unique Visitors\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"host\",\"customLabel\":\"Unique Visitors\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"pageUrl\",\"size\":15,\"order\":\"desc\",\"orderBy\":\"1\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Top Web Pages\"}}]}",
+      "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "d1ba2560-2d03-11e9-9b9a-95b7b006b436",
+    "_type": "visualization",
+    "_source": {
+      "title": "Average Number of Events per Unique Users (Hosts)",
+      "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{\"customBucket\":{\"enabled\":true,\"id\":\"1-bucket\",\"params\":{\"field\":\"host\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderAgg\":{\"enabled\":true,\"id\":\"1-bucket-orderAgg\",\"params\":{},\"schema\":{\"aggFilter\":[\"!top_hits\",\"!percentiles\",\"!median\",\"!std_dev\",\"!derivative\",\"!moving_avg\",\"!serial_diff\",\"!cumulative_sum\",\"!avg_bucket\",\"!max_bucket\",\"!min_bucket\",\"!sum_bucket\"],\"deprecate\":false,\"editor\":false,\"group\":\"none\",\"hideCustomLabel\":true,\"max\":null,\"min\":0,\"name\":\"orderAgg\",\"params\":[],\"title\":\"Order Agg\"},\"type\":\"count\"},\"orderBy\":\"custom\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":50},\"schema\":{\"aggFilter\":[],\"deprecate\":false,\"editor\":false,\"group\":\"none\",\"max\":null,\"min\":0,\"name\":\"bucketAgg\",\"params\":[],\"title\":\"Bucket Agg\"},\"type\":\"terms\"},\"customMetric\":{\"enabled\":true,\"id\":\"1-metric\",\"params\":{},\"schema\":{\"aggFilter\":[\"!top_hits\",\"!percentiles\",\"!percentile_ranks\",\"!median\",\"!std_dev\",\"!sum_bucket\",\"!avg_bucket\",\"!min_bucket\",\"!max_bucket\",\"!derivative\",\"!moving_avg\",\"!serial_diff\",\"!cumulative_sum\"],\"deprecate\":false,\"editor\":false,\"group\":\"none\",\"max\":null,\"min\":0,\"name\":\"metricAgg\",\"params\":[],\"title\":\"Metric Agg\"},\"type\":\"count\"}},\"schema\":\"metric\",\"type\":\"avg_bucket\"}],\"params\":{\"addLegend\":false,\"addTooltip\":true,\"fontSize\":60,\"handleNoResults\":true,\"metric\":{\"colorSchema\":\"Green to Red\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"invertColors\":false,\"labels\":{\"show\":true},\"metricColorMode\":\"None\",\"percentageMode\":false,\"style\":{\"bgColor\":false,\"bgFill\":\"#000\",\"fontSize\":60,\"labelColor\":false,\"subText\":\"\"},\"useRanges\":false},\"type\":\"metric\"},\"title\":\"Average Number of Events per Unique Users (Hosts)\",\"type\":\"metric\"}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "b7324e60-12ec-11e9-a1e0-631cf5fb9335",
+    "_type": "visualization",
+    "_source": {
+      "title": "Top URL Visits By Day",
+      "visState": "{\"title\":\"Top URL Visits By Day\",\"type\":\"heatmap\",\"params\":{\"type\":\"heatmap\",\"addTooltip\":true,\"addLegend\":true,\"enableHover\":false,\"legendPosition\":\"right\",\"times\":[],\"colorsNumber\":4,\"colorSchema\":\"Reds\",\"setColorRange\":false,\"colorsRange\":[],\"invertColors\":false,\"percentageMode\":false,\"valueAxes\":[{\"show\":false,\"id\":\"ValueAxis-1\",\"type\":\"value\",\"scale\":{\"type\":\"linear\",\"defaultYExtents\":false},\"labels\":{\"show\":false,\"rotate\":0,\"color\":\"#555\"}}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Total Logs\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"clientTime\",\"interval\":\"d\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"Days\"}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"pageUrl\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Unique URLs\"}}]}",
+      "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 400\":\"rgb(255,245,240)\",\"400 - 800\":\"rgb(252,187,161)\",\"800 - 1,200\":\"rgb(251,106,74)\",\"1,200 - 1,600\":\"rgb(203,24,29)\"}}}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "bd56f810-a4da-11e9-baf2-196230c538eb",
+    "_type": "visualization",
+    "_source": {
+      "title": "Average Number of Events per Unique Users (userId)",
+      "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{\"customBucket\":{\"enabled\":true,\"id\":\"1-bucket\",\"params\":{\"field\":\"userId\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"order\":\"desc\",\"orderAgg\":{\"enabled\":true,\"id\":\"1-bucket-orderAgg\",\"params\":{},\"schema\":{\"aggFilter\":[\"!top_hits\",\"!percentiles\",\"!median\",\"!std_dev\",\"!derivative\",\"!moving_avg\",\"!serial_diff\",\"!cumulative_sum\",\"!avg_bucket\",\"!max_bucket\",\"!min_bucket\",\"!sum_bucket\"],\"deprecate\":false,\"editor\":false,\"group\":\"none\",\"hideCustomLabel\":true,\"max\":null,\"min\":0,\"name\":\"orderAgg\",\"params\":[],\"title\":\"Order Agg\"},\"type\":\"count\"},\"orderBy\":\"custom\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"size\":50},\"schema\":{\"aggFilter\":[],\"deprecate\":false,\"editor\":false,\"group\":\"none\",\"max\":null,\"min\":0,\"name\":\"bucketAgg\",\"params\":[],\"title\":\"Bucket Agg\"},\"type\":\"terms\"},\"customMetric\":{\"enabled\":true,\"id\":\"1-metric\",\"params\":{},\"schema\":{\"aggFilter\":[\"!top_hits\",\"!percentiles\",\"!percentile_ranks\",\"!median\",\"!std_dev\",\"!sum_bucket\",\"!avg_bucket\",\"!min_bucket\",\"!max_bucket\",\"!derivative\",\"!moving_avg\",\"!serial_diff\",\"!cumulative_sum\"],\"deprecate\":false,\"editor\":false,\"group\":\"none\",\"max\":null,\"min\":0,\"name\":\"metricAgg\",\"params\":[],\"title\":\"Metric Agg\"},\"type\":\"count\"}},\"schema\":\"metric\",\"type\":\"avg_bucket\"}],\"params\":{\"addLegend\":false,\"addTooltip\":true,\"fontSize\":60,\"handleNoResults\":true,\"metric\":{\"colorSchema\":\"Green to Red\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"invertColors\":false,\"labels\":{\"show\":true},\"metricColorMode\":\"None\",\"percentageMode\":false,\"style\":{\"bgColor\":false,\"bgFill\":\"#000\",\"fontSize\":60,\"labelColor\":false,\"subText\":\"\"},\"useRanges\":false},\"type\":\"metric\"},\"title\":\"Average Number of Events per Unique Users (userId)\",\"type\":\"metric\"}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "28b7ad70-a4db-11e9-baf2-196230c538eb",
+    "_type": "visualization",
+    "_source": {
+      "title": "Most Active Users by userId",
+      "visState": "{\"title\":\"Most Active Users by userId\",\"type\":\"horizontal_bar\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":200},\"position\":\"left\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Number of User Events\"},\"drawLinesBetweenPoints\":true,\"mode\":\"normal\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":true,\"rotate\":75,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"bottom\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Number of User Events\"},\"type\":\"value\"}]},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{\"customLabel\":\"Number of User Events\"}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"userId\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"_key\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Host\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"filter\":[],\"query\":{\"language\":\"lucene\",\"query\":\"\"}}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "5b467330-06e2-11e9-8c58-f38cfff498f6",
+    "_type": "visualization",
+    "_source": {
+      "title": "Number of Unique Users (userId)",
+      "visState": "{\"title\":\"Number of Unique Users (userId)\",\"type\":\"metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"userId\",\"customLabel\":\"Number of Unique Users\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "a712e550-a4da-11e9-baf2-196230c538eb",
+    "_type": "visualization",
+    "_source": {
+      "title": "Number of Unique Users (host)",
+      "visState": "{\"title\":\"Number of Unique Users (host)\",\"type\":\"metric\",\"params\":{\"handleNoResults\":true,\"fontSize\":60,\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"schema\":\"metric\",\"params\":{\"field\":\"host\",\"customLabel\":\"Number of Unique Users\"}}]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"7f1f6a80-a4d7-11e9-baf2-196230c538eb\",\"query\":{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true,\"default_field\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  },
+  {
+    "_id": "51622390-a4db-11e9-baf2-196230c538eb",
+    "_type": "visualization",
+    "_source": {
+      "title": "Time-Series Unique Users (userId)",
+      "visState": "{\"title\":\"Time-Series Unique Users (userId)\",\"type\":\"timelion\",\"params\":{\"expression\":\".es(split=userId:5,metric=cardinality:userId)\",\"interval\":\"auto\"},\"aggs\":[]}",
+      "uiStateJSON": "{}",
+      "description": "",
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[]}"
+      }
+    },
+    "_meta": {
+      "savedObjectVersion": 2
+    }
+  }
+]
\ No newline at end of file
diff --git a/docker/kibana/8.11.3/Saved Objects/Drill-Down Search.ndjson b/docker/kibana/8.11.3/Saved Objects/Drill-Down Search.ndjson
new file mode 100644
index 0000000..749609b
--- /dev/null
+++ b/docker/kibana/8.11.3/Saved Objects/Drill-Down Search.ndjson
@@ -0,0 +1,22 @@
+[
+  {
+    "_id": "67105880-06e6-11e9-8c58-f38cfff498f6",
+    "_type": "search",
+    "_source": {
+      "title": "Drill-Down Search",
+      "description": "",
+      "hits": 0,
+      "columns": [
+        "_source"
+      ],
+      "sort": [
+        "clientTime",
+        "desc"
+      ],
+      "version": 1,
+      "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"highlightAll\":true,\"version\":true,\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"URL Search\",\"disabled\":false,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"pageUrl\",\"negate\":false,\"params\":{\"query\":\"http://senssoft.incubator.apache.org/\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"http://senssoft.incubator.apache.org/\"},\"query\":{\"match\":{\"pageUrl\":{\"query\":\"http://senssoft.incubator.apache.org/\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"UserID Search\",\"disabled\":false,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"userId\",\"negate\":false,\"params\":{\"query\":\"nobody\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"nobody\"},\"query\":{\"match\":{\"userId\":{\"query\":\"nobody\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Host Search\",\"disabled\":false,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"host\",\"negate\":false,\"params\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"172.18.0.1\"},\"query\":{\"match\":{\"host\":{\"query\":\"172.18.0.1\",\"type\":\"phrase\"}}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":\"Event Type Search\",\"disabled\":false,\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"key\":\"type\",\"negate\":false,\"params\":{\"query\":\"click\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"click\"},\"query\":{\"match\":{\"type\":{\"query\":\"click\",\"type\":\"phrase\"}}}},{\"meta\":{\"index\":\"bdce0520-06df-11e9-8c58-f38cfff498f6\",\"negate\":false,\"disabled\":false,\"alias\":\"AppSearch\",\"type\":\"phrase\",\"key\":\"toolName\",\"value\":\"MyApp\",\"params\":{\"query\":\"MyApp\",\"type\":\"phrase\"}},\"query\":{\"match\":{\"toolName\":{\"query\":\"MyApp\",\"type\":\"phrase\"}}},\"$state\":{\"store\":\"appState\"}}]}"
+      }
+    }
+  }
+]
\ No newline at end of file
diff --git a/docker/kibana/8.11.3/config/kibana.yml b/docker/kibana/8.11.3/config/kibana.yml
new file mode 100644
index 0000000..cc93fed
--- /dev/null
+++ b/docker/kibana/8.11.3/config/kibana.yml
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+server.name: kibana
+server.host: "0"
+elasticsearch.url: http://localhost:9200
diff --git a/docker/logstash/8.11.3/Dockerfile b/docker/logstash/8.11.3/Dockerfile
new file mode 100644
index 0000000..c5ccecc
--- /dev/null
+++ b/docker/logstash/8.11.3/Dockerfile
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM docker.elastic.co/logstash/logstash:8.11.3
+MAINTAINER Joshua Poore <poorejc@apache.org>
+
+# Ensure default logstash configuration is removed
+RUN rm -f /usr/share/logstash/pipeline/logstash.conf
+
+# Copy Pipeline files over
+ADD pipeline/ /usr/share/logstash/pipeline/
+
+# Copy templates over
+RUN mkdir /usr/share/logstash/templates
+COPY templates/userale.json /usr/share/logstash/templates/userale.json
+
+EXPOSE 8100
+
+CMD ["logstash"]
\ No newline at end of file
diff --git a/docker/logstash/8.11.3/pipeline/logstash-userale.conf b/docker/logstash/8.11.3/pipeline/logstash-userale.conf
new file mode 100644
index 0000000..8b4313f
--- /dev/null
+++ b/docker/logstash/8.11.3/pipeline/logstash-userale.conf
@@ -0,0 +1,52 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+input {
+	http {
+		codec => "json"
+		port => 8100
+		response_headers => { 
+			"Access-Control-Allow-Origin" => "*" 
+            "Access-Control-Allow-Headers" => "Origin, X-Requested-With, Content-Type, Accept"
+        }
+	}
+}
+
+## Add your filters / logstash plugins configuration here
+filter {
+	mutate {
+		remove_field => [ "message", "@version", "headers"]
+	}
+
+	grok {
+    	match => [ "useraleVersion", "(?<major_ver>\d+).(?<minor_ver>\d+)(.(?<patch_ver>\d+))?" ]
+    	match => [ "toolVersion", "(?<tool_major_ver>\d+).(?<tool_minor_ver>\d+)(.(?<tool_patch_ver>\d+))?" ]
+  }
+}
+
+output {
+	# Output data to Elasticsearch instance
+	elasticsearch {
+		hosts => "${ELASTICSEARCH_URL}"
+		index => "userale"
+		manage_template => true
+		template_overwrite => true
+		template => "/usr/share/logstash/templates/userale.json"
+		template_name => "userale"
+	}
+
+	# Debug
+	stdout { codec => rubydebug }
+}
diff --git a/docker/logstash/8.11.3/templates/userale.json b/docker/logstash/8.11.3/templates/userale.json
new file mode 100644
index 0000000..771f413
--- /dev/null
+++ b/docker/logstash/8.11.3/templates/userale.json
@@ -0,0 +1,151 @@
+{
+    "index_patterns": ["userale"],
+    "template": {
+        "settings":
+        {
+            "number_of_shards": 1,
+            "number_of_replicas": 0,
+            "index.refresh_interval": "5s",
+            "analysis": {
+                "analyzer": {
+                    "my_analyzer": {
+                        "tokenizer": "my_tokenizer"
+                    }
+                },
+                "tokenizer": {
+                    "my_tokenizer": {
+                        "type": "path_hierarchy"
+                    }
+                }
+            }
+        },
+        "mappings":
+        {
+            "dynamic_templates": [
+                {
+                "strings_as_keywords": {
+                    "match_mapping_type": "string",
+                    "mapping": {
+                    "type": "keyword"
+                    }
+                }
+                }
+            ],
+            "dynamic": "true",
+            "properties":
+            {
+                "userAction":
+                {
+                    "type": "boolean"
+                },
+                "clientTime":
+                {
+                    "type": "date",
+                    "format": "strict_date_optional_time||epoch_millis"
+                },
+                "startTime":
+                {
+                    "type": "date",
+                    "format": "strict_date_optional_time||epoch_millis"
+                },
+                "endTime":
+                {
+                    "type": "date",
+                    "format": "strict_date_optional_time||epoch_millis"
+                },
+                "count":
+                {
+                    "type": "integer"
+                },
+                "targetChange": 
+                {
+                    "type": "boolean"
+                },
+                "typeChange": 
+                {
+                    "type": "boolean"
+                },
+                "details":
+                {
+                    "properties":
+                    {
+                        "alt":
+                        {
+                            "type": "boolean"
+                        },
+                        "clicks":
+                        {
+                            "type": "integer"
+                        },
+                        "ctrl": 
+                        {
+                            "type": "boolean"
+                        },
+                        "meta": 
+                        {
+                            "type": "boolean"
+                        },
+                        "shift": 
+                        {
+                            "type": "boolean"
+                        },
+                        "window":
+                        {
+                            "type": "boolean"
+                        },
+                        "x":
+                        {
+                            "type": "integer"
+                        },
+                        "y":
+                        {
+                            "type": "integer"
+                        },
+                        "z":
+                        {
+                            "type": "integer"
+                        }
+                    }
+                },
+                "location":
+                {
+                    "properties":
+                    {
+                        "x":
+                        {
+                            "type": "integer"
+                        },
+                        "y":
+                        {
+                            "type": "integer"
+                        }
+                    }
+                },
+                "major_ver":
+                {
+                    "type": "integer"
+                },
+                "minor_ver":
+                {
+                    "type": "integer"
+                },
+                "patch_ver":
+                {
+                    "type": "integer"
+                },
+                "tool_major_ver":
+                {
+                    "type": "integer"
+                },
+                "tool_minor_ver":
+                {
+                    "type": "integer"
+                },
+                "tool_patch_ver":
+                {
+                    "type": "integer"
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/docker/site/Dockerfile b/docker/site/Dockerfile
index f882404..c53d3b9 100644
--- a/docker/site/Dockerfile
+++ b/docker/site/Dockerfile
@@ -39,4 +39,4 @@
 
 # Install system wide dependencies
 RUN apt-get -yqq update && apt-get -yqq install \
-	python
+	python-is-python3
diff --git a/kubernetes/6.2.2/elasticsearch/es-client-svc.yaml b/kubernetes/6.2.2/elasticsearch/es-client-svc.yaml
deleted file mode 100644
index 0d0622e..0000000
--- a/kubernetes/6.2.2/elasticsearch/es-client-svc.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#  http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Discovery Service for Elasticsearch client nodes over port 9200.
-#
-# A Kubernetes Service is an abstraction which defines a logical set of
-# Pods and a policy by which to access them.
-apiVersion: v1
-kind: Service
-metadata:
-  name: elasticsearch-loadbalancer
-  labels:
-    component: elk
-    role: client
-spec:
-  selector:
-    component: elk
-    role: client
-  ports:
-  - name: http
-    port: 9200
-#    targetPort: 9200
-    protocol: TCP
-  type: NodePort
-# type: Loadbalancer only works with certain providers:
-# AWS, Azure, OpenStack, CloudStack, and Google Compute Engine
-#  type: LoadBalancer
diff --git a/kubernetes/6.2.2/elasticsearch/es-client.yaml b/kubernetes/6.2.2/elasticsearch/es-client.yaml
deleted file mode 100644
index 032ba18..0000000
--- a/kubernetes/6.2.2/elasticsearch/es-client.yaml
+++ /dev/null
@@ -1,78 +0,0 @@
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  name: es-client
-  labels:
-    component: elk
-    role: client
-spec:
-  replicas: 2
-  template:
-    metadata:
-      labels:
-        component: elk
-        role: client
-    spec:
-      initContainers:
-      - name: init-sysctl
-        image: busybox:1.27.2
-        imagePullPolicy: IfNotPresent
-        command:
-        - sysctl
-        - -w
-        - vm.max_map_count=262144
-        securityContext:
-          privileged: true
-      containers:
-      - name: es-client
-        image: senssoft/elasticsearch:6.2.2
-        imagePullPolicy: IfNotPresent
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.namespace
-        - name: NODE_NAME
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.name
-        # Client node
-        - name: NODE_MASTER
-          value: "false"
-        - name: NODE_DATA
-          value: "false"
-        - name: NODE_INGEST
-          value: "false"
-        - name: HTTP_ENABLE
-          value: "true"
-        - name: DISCOVERY_SERVICE
-          value: "elasticsearch-discovery"
-        - name: "NETWORK_HOST"
-          value: _site_,_lo_
-        - name: ES_JAVA_OPTS
-          value: -Xms256m -Xmx256m
-        ports:
-        - containerPort: 9200
-          name: http
-        - containerPort: 9300
-          name: transport
-        livenessProbe:
-          tcpSocket:
-            port: transport
-          initialDelaySeconds: 20
-          periodSeconds: 10
-          failureThreshold: 5
-        readinessProbe:
-          httpGet:
-            path: /_cluster/health
-            port: http
-          initialDelaySeconds: 30
-          periodSeconds: 10
-          failureThreshold: 10
-        volumeMounts:
-        - name: storage
-          mountPath: /data
-      volumes:
-          - emptyDir:
-              medium: ""
-            name: "storage"
diff --git a/kubernetes/6.2.2/elasticsearch/es-data.yaml b/kubernetes/6.2.2/elasticsearch/es-data.yaml
deleted file mode 100644
index afe5617..0000000
--- a/kubernetes/6.2.2/elasticsearch/es-data.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  name: es-data
-  labels:
-    component: elk
-    role: data
-spec:
-  replicas: 2
-  template:
-    metadata:
-      labels:
-        component: elk
-        role: data
-    spec:
-      initContainers:
-      - name: init-sysctl
-        image: busybox:1.27.2
-        imagePullPolicy: IfNotPresent
-        command:
-        - sysctl
-        - -w
-        - vm.max_map_count=262144
-        securityContext:
-          privileged: true
-      containers:
-      - name: es-data
-        image: senssoft/elasticsearch:6.2.2
-        imagePullPolicy: IfNotPresent
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.namespace
-        - name: NODE_NAME
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.name
-        # Data node
-        - name: NODE_MASTER
-          value: "false"
-        - name: NODE_DATA
-          value: "true"
-        - name: HTTP_ENABLE
-          value: "false"
-        - name: DISCOVERY_SERVICE
-          value: "elasticsearch-discovery"
-        - name: ES_JAVA_OPTS
-          value: -Xms256m -Xmx256m
-        ports:
-        - containerPort: 9300
-          name: transport
-        livenessProbe:
-          tcpSocket:
-            port: transport
-          initialDelaySeconds: 20
-          periodSeconds: 10
-          failureThreshold: 5
-        volumeMounts:
-        - name: storage
-          mountPath: /data
-      volumes:
-          - emptyDir:
-              medium: ""
-            name: "storage"
diff --git a/kubernetes/6.2.2/elasticsearch/es-master-svc.yaml b/kubernetes/6.2.2/elasticsearch/es-master-svc.yaml
deleted file mode 100644
index 0cb1de8..0000000
--- a/kubernetes/6.2.2/elasticsearch/es-master-svc.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#  http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Discovery Service for Elasticsearch master nodes over port 9300.
-#
-# A Kubernetes Service is an abstraction which defines a logical set of
-# Pods and a policy by which to access them.
-apiVersion: v1
-kind: Service
-metadata:
-  name: elasticsearch-discovery
-  labels:
-    component: elk
-    role: master
-spec:
-  selector:
-    component: elk
-    role: master
-  ports:
-  - name: transport
-    port: 9300
-    protocol: TCP
diff --git a/kubernetes/6.2.2/elasticsearch/es-master.yaml b/kubernetes/6.2.2/elasticsearch/es-master.yaml
deleted file mode 100644
index 592a00c..0000000
--- a/kubernetes/6.2.2/elasticsearch/es-master.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  name: es-master
-  labels:
-    component: elk
-    role: master
-spec:
-  replicas: 3
-  template:
-    metadata:
-      labels:
-        component: elk
-        role: master
-    spec:
-      initContainers:
-      - name: init-sysctl
-        image: busybox:1.27.2
-        imagePullPolicy: IfNotPresent
-        command:
-        - sysctl
-        - -w
-        - vm.max_map_count=262144
-        securityContext:
-          privileged: true
-      containers:
-      - name: es-master
-        image: senssoft/elasticsearch:6.2.2
-        imagePullPolicy: IfNotPresent
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.namespace
-        - name: NODE_NAME
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.name
-        # Dedicated master-eligible node
-        - name: NODE_MASTER
-          value: "true"
-        - name: NODE_DATA
-          value: "false"
-        - name: NODE_INGEST
-          value: "false"
-        - name: NODE_COORDINATE
-          value: "false"
-        - name: NUMBER_OF_MASTERS
-          value: "2"
-        - name: HTTP_ENABLE
-          value: "false"
-        - name: DISCOVERY_SERVICE
-          value: "elasticsearch-discovery"
-        - name: DISCOVERY_TIMEOUT
-          value: "30s"
-        - name: ES_JAVA_OPTS
-          value: -Xms256m -Xmx256m
-        ports:
-        - containerPort: 9300
-          name: transport
-#        Need better readiness check policy than checking if port 9300 is active
-        livenessProbe:
-          tcpSocket:
-            port: transport
-          initialDelaySeconds: 20
-          periodSeconds: 10
-          failureThreshold: 5
-        volumeMounts:
-        - name: storage
-          mountPath: /data
-      volumes:
-          - emptyDir:
-              medium: ""
-            name: "storage"
diff --git a/kubernetes/6.2.2/kibana/kibana-svc.yaml b/kubernetes/6.2.2/kibana/kibana-svc.yaml
deleted file mode 100644
index fbefde0..0000000
--- a/kubernetes/6.2.2/kibana/kibana-svc.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
-  name: kibana
-  labels:
-    component: elk
-    role: kibana
-spec:
-  selector:
-    component: elk
-    role: kibana
-  ports:
-  - name: http
-    port: 5601
-  type: NodePort
\ No newline at end of file
diff --git a/kubernetes/6.2.2/kibana/kibana.yaml b/kubernetes/6.2.2/kibana/kibana.yaml
deleted file mode 100644
index f0f1ed0..0000000
--- a/kubernetes/6.2.2/kibana/kibana.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  name: kibana
-  labels:
-    component: elk
-    role: kibana
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-     component: elk
-     role: kibana
-  template:
-    metadata:
-      labels:
-        component: elk
-        role: kibana
-    spec:
-      containers:
-      - name: kibana
-        image: senssoft/kibana:6.2.2
-        imagePullPolicy: IfNotPresent
-        resources:
-          # need more cpu upon initialization, therefore burstable class
-          limits:
-            cpu: 1000m
-          requests:
-            cpu: 100m
-        env:
-        - name: CLUSTER_NAME
-          value: SensSoft
-        - name: ELASTICSEARCH_URL
-          value: "http://elasticsearch-loadbalancer:9200"
-        - name: ES_JAVA_OPTS
-          value: "-Xms512m -Xmx512m"
-        ports:
-        - containerPort: 5601
-          name: http
\ No newline at end of file
diff --git a/kubernetes/6.2.2/logstash/logstash-svc.yaml b/kubernetes/6.2.2/logstash/logstash-svc.yaml
deleted file mode 100644
index b77a032..0000000
--- a/kubernetes/6.2.2/logstash/logstash-svc.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
-  name: logstash-discovery
-  labels:
-    component: elk
-    role: logstash
-spec:
-  selector:
-    component: elk
-    role: logstash
-  ports:
-#  - name: transport
-#    port: 9600
-#    protocol: TCP
-  - name: http
-    port: 8100
-    protocol: TCP
-  type: NodePort
diff --git a/kubernetes/6.2.2/logstash/logstash.yaml b/kubernetes/6.2.2/logstash/logstash.yaml
deleted file mode 100644
index 8756731..0000000
--- a/kubernetes/6.2.2/logstash/logstash.yaml
+++ /dev/null
@@ -1,52 +0,0 @@
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  name: logstash
-  labels:
-    component: elk
-    role: logstash
-spec:
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        component: elk
-        role: logstash
-    spec:
-      containers:
-      - name: logstash
-        image: senssoft/logstash:6.2.2
-        imagePullPolicy: IfNotPresent
-        command:
-        - logstash
-        - -f
-        - /etc/logstash/conf.d
-        env:
-        - name: ELASTICSEARCH_URL
-          value: "elasticsearch-loadbalancer:9200"
-        - name: ES_JAVA_OPTS
-          value: "-Xms1g -Xmx1g"
-        resources:
-          limits:
-            cpu: 1000m
-          requests:
-            cpu: 100m
-        ports:
-        - containerPort: 8100
-          name: http
-        - containerPort: 9600
-          name: transport
-        # Need better readiness check policy than checking if port 9600 is active
-#        livenessProbe:
-#          tcpSocket:
-#            port: transport
-#          initialDelaySeconds: 20
-#          periodSeconds: 10
-#          failureThreshold: 5
-#        readinessProbe:
-#          httpGet:
-#            path: /?pretty=true
-#            port: http
-#          initialDelaySeconds: 30
-#          periodSeconds: 10
-#          failureThreshold: 10
\ No newline at end of file
diff --git a/kubernetes/README.md b/kubernetes/README.md
index b100fcc..35d50ee 100644
--- a/kubernetes/README.md
+++ b/kubernetes/README.md
@@ -1,293 +1,9 @@
-Apache SensSoft on top of Kubernetes
-====================================
+# Example Kubernetes deployment
 
-Apache SensSoft would like to thank [Pires] for his great documentation on deploying
- the ELK stack in Kubernetes. 
-We have modified [Pires] instructions to fit Apache [SensSoft] requirements and guidelines.
+This script and accompanying yaml files provide an example ELK stack kubernetes deployment. This is intended to be a starting point for deploying a userale logging end point. 
 
-Introduction
-------------
+Prerequisites: A bash enviroment and Kubernetes running with at least 4 GB memory and 4 CPU cores.
 
-The Software as a Sensor™ ([SensSoft]) Project offers an open-source (ALv2.0) software
-tool usability testing platform. It includes a number of components that work together
-to provide a platform for collecting data about user interactions with software tools, 
-as well as archiving, analyzing and visualizing that data.
+Use the `run.sh` script to deploy the stack.
 
-Apache SensSoft's logging infrastructure is powered by a family of [Elastic] tools, mainly 
-[Elasticsearch] for index and retrieval, [Logstash] for shipping data to Elasticsearch,
-and [Kibana] for visualizing and building custom data-viz dashboards.
-
-This guide describes how to build and scale Elasticsearch clusters using Kubernetes.
-
-Current Elasticsearch version is `6.2.2`.
-
-Abstract
---------
-
-Before we start, one needs to know that Elasticsearch best-practices recommend to separate nodes in three roles:
-* `Master` nodes - intended for clustering management only, no data, no HTTP API
-* `Client` nodes - intended for client/search usage, no data, no HTTP API
-* `Data` nodes - intended for storing and indexing your data, no HTTP API
-
-This is enforced throughout this document.
-
-Given this, I'm going to demonstrate how to provision a production grade scenario 
-consisting of 3 master, 2 client and 2 data nodes.
-
-(Very) Important Notes
-----------------------
-
-* Elasticsearch pods need for an init-container to run in privileged mode, so it 
-can set some VM options. For that to happen, the `kubelet` should be running with 
-args `--allow-privileged`, otherwise the init-container will fail to run.
-
-* By default, `ES_JAVA_OPTS` is set to `-Xms256m -Xmx256m`. This is a very low value
- but many users, i.e. `minikube` users, were having issues with pods getting killed 
- because hosts were out of memory. One can change this in the deployment descriptors
- available in this repository.
-
-* As of the moment, Kubernetes pod descriptors use an `emptyDir` for storing data
-in each data node container. This is meant to be for the sake of simplicity and
-should be adapted according to one's storage needs.
-
-Docker Images
--------------
-
-This example uses [this pre-built image](https://hub.docker.com/u/senssoft/) of the custom SensSoft ELK stack.
-
-Perquisites (Install and Setup)
--------------------------------
-
-Ensure that you have [Docker], [kubectl], and [minikube] (optional) installed and started.
-
-Deploy Elasticsearch Cluster
-============================
-
-Rollout Elasticsearch services and pod replicas.
-
-```bash
-kubectl create -f elasticsearch/es-master-svc.yaml
-kubectl create -f elasticsearch/es-client-svc.yaml
-kubectl create -f elasticsearch/es-master.yaml
-kubectl rollout status -f elasticsearch/es-master.yaml
-kubectl create -f elasticsearch/es-client.yaml
-kubectl rollout status -f elasticsearch/es-client.yaml
-kubectl create -f elasticsearch/es-data.yaml
-kubectl rollout status -f elasticsearch/es-data.yaml
-```
-
-or
-
-```bash
-./configure deploy elasticsearch
-```
-
-Check one of the Elasticsearch master nodes logs:
-
-```bash
-$ kubectl get svc,deployment,pods -l component=elk
-NAME                             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
-svc/elasticsearch-discovery      10.103.242.73   <none>        9300/TCP         6m
-svc/elasticsearch-loadbalancer   10.111.110.60   <nodes>       9200:30510/TCP   3m
-
-NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
-deploy/es-client   2         2         2            2           3m
-deploy/es-data     2         2         2            2           2m
-deploy/es-master   3         3         3            3           6m
-
-NAME                            READY     STATUS    RESTARTS   AGE
-po/es-client-cbb74b6fb-tgbmp    1/1       Running   0          3m
-po/es-client-cbb74b6fb-xnp5c    1/1       Running   0          3m
-po/es-data-796d884bfb-fw8w5     1/1       Running   0          2m
-po/es-data-796d884bfb-qs675     1/1       Running   0          2m
-po/es-master-6f79799c8c-9sdtn   1/1       Running   0          6m
-po/es-master-6f79799c8c-g6g9k   1/1       Running   0          6m
-po/es-master-6f79799c8c-w2dcs   1/1       Running   0          6m
-```
-
-```bash
-$ kubectl logs po/es-master-6f79799c8c-9sdtn
-[2018-03-04T19:59:22,520][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] initializing ...
-[2018-03-04T19:59:22,886][INFO ][o.e.e.NodeEnvironment    ] [es-master-6f79799c8c-9sdtn] using [1] data paths, mounts [[/ (overlay)]], net usable_space [14gb], net total_space [16.1gb], types [overlay]
-[2018-03-04T19:59:22,889][INFO ][o.e.e.NodeEnvironment    ] [es-master-6f79799c8c-9sdtn] heap size [247.5mb], compressed ordinary object pointers [true]
-[2018-03-04T19:59:22,902][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] node name [es-master-6f79799c8c-9sdtn], node ID [1720vLNASnmbPxwyElXeKQ]
-[2018-03-04T19:59:22,904][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] version[6.2.2], pid[1], build[10b1edd/2018-02-16T19:01:30.685723Z], OS[Linux/4.9.64/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/1.8.0_161/25.161-b14]
-[2018-03-04T19:59:22,905][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.F63IAHVh, -XX:+HeapDumpOnOutOfMemoryError, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.cgroups.hierarchy.override=/, -Xms256m, -Xmx256m, -Des.path.home=/usr/share/elasticsearch, -Des.path.conf=/usr/share/elasticsearch/config]
-[2018-03-04T19:59:27,519][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [aggs-matrix-stats]
-[2018-03-04T19:59:27,530][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [analysis-common]
-[2018-03-04T19:59:27,531][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [ingest-common]
-[2018-03-04T19:59:27,533][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [lang-expression]
-[2018-03-04T19:59:27,534][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [lang-mustache]
-[2018-03-04T19:59:27,534][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [lang-painless]
-[2018-03-04T19:59:27,534][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [mapper-extras]
-[2018-03-04T19:59:27,540][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [parent-join]
-[2018-03-04T19:59:27,551][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [percolator]
-[2018-03-04T19:59:27,552][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [rank-eval]
-[2018-03-04T19:59:27,552][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [reindex]
-[2018-03-04T19:59:27,553][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [repository-url]
-[2018-03-04T19:59:27,555][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [transport-netty4]
-[2018-03-04T19:59:27,561][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded module [tribe]
-[2018-03-04T19:59:27,565][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded plugin [ingest-geoip]
-[2018-03-04T19:59:27,569][INFO ][o.e.p.PluginsService     ] [es-master-6f79799c8c-9sdtn] loaded plugin [ingest-user-agent]
-[2018-03-04T19:59:37,641][INFO ][o.e.d.DiscoveryModule    ] [es-master-6f79799c8c-9sdtn] using discovery type [zen]
-[2018-03-04T19:59:40,865][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] initialized
-[2018-03-04T19:59:40,869][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] starting ...
-[2018-03-04T19:59:42,001][INFO ][o.e.t.TransportService   ] [es-master-6f79799c8c-9sdtn] publish_address {172.17.0.4:9300}, bound_addresses {0.0.0.0:9300}
-[2018-03-04T19:59:42,079][INFO ][o.e.b.BootstrapChecks    ] [es-master-6f79799c8c-9sdtn] bound or publishing to a non-loopback address, enforcing bootstrap checks
-[2018-03-04T19:59:45,225][WARN ][o.e.d.z.ZenDiscovery     ] [es-master-6f79799c8c-9sdtn] not enough master nodes discovered during pinging (found [[Candidate{node={es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300}, clusterStateVersion=-1}]], but needed [2]), pinging again
-[2018-03-04T19:59:48,273][INFO ][o.e.c.s.MasterService    ] [es-master-6f79799c8c-9sdtn] zen-disco-elected-as-master ([1] nodes joined)[{es-master-6f79799c8c-g6g9k}{9IQhhVe0Sj6reW9pPh0FsA}{FQzU-VNtRlexOnRaK9R2mQ}{172.17.0.6}{172.17.0.6:9300}], reason: new_master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300}, added {{es-master-6f79799c8c-g6g9k}{9IQhhVe0Sj6reW9pPh0FsA}{FQzU-VNtRlexOnRaK9R2mQ}{172.17.0.6}{172.17.0.6:9300},}
-[2018-03-04T19:59:48,329][INFO ][o.e.c.s.ClusterApplierService] [es-master-6f79799c8c-9sdtn] new_master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300}, added {{es-master-6f79799c8c-g6g9k}{9IQhhVe0Sj6reW9pPh0FsA}{FQzU-VNtRlexOnRaK9R2mQ}{172.17.0.6}{172.17.0.6:9300},}, reason: apply cluster state (from master [master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300} committed version [1] source [zen-disco-elected-as-master ([1] nodes joined)[{es-master-6f79799c8c-g6g9k}{9IQhhVe0Sj6reW9pPh0FsA}{FQzU-VNtRlexOnRaK9R2mQ}{172.17.0.6}{172.17.0.6:9300}]]])
-[2018-03-04T19:59:48,349][INFO ][o.e.n.Node               ] [es-master-6f79799c8c-9sdtn] started
-[2018-03-04T19:59:48,437][INFO ][o.e.g.GatewayService     ] [es-master-6f79799c8c-9sdtn] recovered [0] indices into cluster_state
-[2018-03-04T19:59:50,789][INFO ][o.e.c.s.MasterService    ] [es-master-6f79799c8c-9sdtn] zen-disco-node-join[{es-master-6f79799c8c-w2dcs}{WAGDODrFRQOb_G9kh4MdBw}{vnfsSU2BQQKOYPB6S8tlHg}{172.17.0.5}{172.17.0.5:9300}], reason: added {{es-master-6f79799c8c-w2dcs}{WAGDODrFRQOb_G9kh4MdBw}{vnfsSU2BQQKOYPB6S8tlHg}{172.17.0.5}{172.17.0.5:9300},}
-[2018-03-04T19:59:50,880][INFO ][o.e.c.s.ClusterApplierService] [es-master-6f79799c8c-9sdtn] added {{es-master-6f79799c8c-w2dcs}{WAGDODrFRQOb_G9kh4MdBw}{vnfsSU2BQQKOYPB6S8tlHg}{172.17.0.5}{172.17.0.5:9300},}, reason: apply cluster state (from master [master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300} committed version [3] source [zen-disco-node-join[{es-master-6f79799c8c-w2dcs}{WAGDODrFRQOb_G9kh4MdBw}{vnfsSU2BQQKOYPB6S8tlHg}{172.17.0.5}{172.17.0.5:9300}]]])
-[2018-03-04T20:01:07,315][INFO ][o.e.c.s.MasterService    ] [es-master-6f79799c8c-9sdtn] zen-disco-node-join[{es-client-cbb74b6fb-tgbmp}{EunRsql8Q9CqSWJf0FKQbQ}{32GSGju1QbaYe30kTbG_5Q}{172.17.0.8}{172.17.0.8:9300}], reason: added {{es-client-cbb74b6fb-tgbmp}{EunRsql8Q9CqSWJf0FKQbQ}{32GSGju1QbaYe30kTbG_5Q}{172.17.0.8}{172.17.0.8:9300},}
-[2018-03-04T20:01:07,751][INFO ][o.e.c.s.ClusterApplierService] [es-master-6f79799c8c-9sdtn] added {{es-client-cbb74b6fb-tgbmp}{EunRsql8Q9CqSWJf0FKQbQ}{32GSGju1QbaYe30kTbG_5Q}{172.17.0.8}{172.17.0.8:9300},}, reason: apply cluster state (from master [master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300} committed version [4] source [zen-disco-node-join[{es-client-cbb74b6fb-tgbmp}{EunRsql8Q9CqSWJf0FKQbQ}{32GSGju1QbaYe30kTbG_5Q}{172.17.0.8}{172.17.0.8:9300}]]])
-[2018-03-04T20:01:07,822][INFO ][o.e.c.s.MasterService    ] [es-master-6f79799c8c-9sdtn] zen-disco-node-join[{es-client-cbb74b6fb-xnp5c}{SP4_qYhURHuQipeiiuC35w}{ISw5yvwPTUKMIFMvpMYXMA}{172.17.0.7}{172.17.0.7:9300}], reason: added {{es-client-cbb74b6fb-xnp5c}{SP4_qYhURHuQipeiiuC35w}{ISw5yvwPTUKMIFMvpMYXMA}{172.17.0.7}{172.17.0.7:9300},}
-[2018-03-04T20:01:08,133][INFO ][o.e.c.s.ClusterApplierService] [es-master-6f79799c8c-9sdtn] added {{es-client-cbb74b6fb-xnp5c}{SP4_qYhURHuQipeiiuC35w}{ISw5yvwPTUKMIFMvpMYXMA}{172.17.0.7}{172.17.0.7:9300},}, reason: apply cluster state (from master [master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300} committed version [5] source [zen-disco-node-join[{es-client-cbb74b6fb-xnp5c}{SP4_qYhURHuQipeiiuC35w}{ISw5yvwPTUKMIFMvpMYXMA}{172.17.0.7}{172.17.0.7:9300}]]])
-[2018-03-04T20:02:16,606][INFO ][o.e.c.s.MasterService    ] [es-master-6f79799c8c-9sdtn] zen-disco-node-join[{es-data-796d884bfb-qs675}{ZOopEPppSrGGk1f2uB6_Pg}{M7ZPAbbxQ0mnOpRZjNtq0A}{172.17.0.10}{172.17.0.10:9300}], reason: added {{es-data-796d884bfb-qs675}{ZOopEPppSrGGk1f2uB6_Pg}{M7ZPAbbxQ0mnOpRZjNtq0A}{172.17.0.10}{172.17.0.10:9300},}
-[2018-03-04T20:02:17,310][INFO ][o.e.c.s.ClusterApplierService] [es-master-6f79799c8c-9sdtn] added {{es-data-796d884bfb-qs675}{ZOopEPppSrGGk1f2uB6_Pg}{M7ZPAbbxQ0mnOpRZjNtq0A}{172.17.0.10}{172.17.0.10:9300},}, reason: apply cluster state (from master [master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300} committed version [6] source [zen-disco-node-join[{es-data-796d884bfb-qs675}{ZOopEPppSrGGk1f2uB6_Pg}{M7ZPAbbxQ0mnOpRZjNtq0A}{172.17.0.10}{172.17.0.10:9300}]]])
-[2018-03-04T20:02:17,494][INFO ][o.e.c.s.MasterService    ] [es-master-6f79799c8c-9sdtn] zen-disco-node-join[{es-data-796d884bfb-fw8w5}{GAMmdne1Q02pb0tujxGMTQ}{DsiN0UeYQQa9Gzeg_B3ARw}{172.17.0.9}{172.17.0.9:9300}], reason: added {{es-data-796d884bfb-fw8w5}{GAMmdne1Q02pb0tujxGMTQ}{DsiN0UeYQQa9Gzeg_B3ARw}{172.17.0.9}{172.17.0.9:9300},}
-[2018-03-04T20:02:17,753][INFO ][o.e.c.s.ClusterApplierService] [es-master-6f79799c8c-9sdtn] added {{es-data-796d884bfb-fw8w5}{GAMmdne1Q02pb0tujxGMTQ}{DsiN0UeYQQa9Gzeg_B3ARw}{172.17.0.9}{172.17.0.9:9300},}, reason: apply cluster state (from master [master {es-master-6f79799c8c-9sdtn}{1720vLNASnmbPxwyElXeKQ}{S-_neLjjSPWj4ItZ1mv0zQ}{172.17.0.4}{172.17.0.4:9300} committed version [7] source [zen-disco-node-join[{es-data-796d884bfb-fw8w5}{GAMmdne1Q02pb0tujxGMTQ}{DsiN0UeYQQa9Gzeg_B3ARw}{172.17.0.9}{172.17.0.9:9300}]]])
-```
-
-As you can assert, the cluster is up and running.
-
-Access the service
-------------------
-
-Don't forget that services in Kubernetes are only accessible from containers in 
-the cluster. For different behavior one should configure the creation of an 
-external load-balancer. While it's supported within this example service
-descriptor, its usage is out of scope of this document, for now.
-
-Note: if you are using one of the cloud providers which support external load
-balancers, setting the type field to "LoadBalancer" will provision a load
-balancer for your Service. You can uncomment the field in es-client-svc.yaml.
-
-```bash
-$ kubectl get svc elasticsearch-loadbalancer
-NAME                         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
-elasticsearch-loadbalancer   10.111.110.60   <nodes>       9200:30510/TCP   6m
-```
-
-From any host on your cluster (that's running `kube-proxy`), run:
-
-```bash
-$ kubectl exec -it es-data-796d884bfb-fw8w5  -- /bin/bash
-$ curl -XGET http://10.111.110.60:9200
-```
-
-You should see something similar to the following:
-```json
-{
-  "name" : "es-client-cbb74b6fb-tgbmp",
-  "cluster_name" : "SensSoft",
-  "cluster_uuid" : "J7-noNLVQP21dq8MZVnF-w",
-  "version" : {
-    "number" : "6.2.2",
-    "build_hash" : "10b1edd",
-    "build_date" : "2018-02-16T19:01:30.685723Z",
-    "build_snapshot" : false,
-    "lucene_version" : "7.2.1",
-    "minimum_wire_compatibility_version" : "5.6.0",
-    "minimum_index_compatibility_version" : "5.0.0"
-  },
-  "tagline" : "You Know, for Search"
-}
-```
-
-Or if you want to check cluster information:
-
-```
-curl -XGET http://10.111.110.60:9200/_cluster/health?pretty
-```
-
-You should see something similar to the following:
-
-```json
-{
-  "cluster_name" : "SensSoft",
-  "status" : "green",
-  "timed_out" : false,
-  "number_of_nodes" : 7,
-  "number_of_data_nodes" : 2,
-  "active_primary_shards" : 0,
-  "active_shards" : 0,
-  "relocating_shards" : 0,
-  "initializing_shards" : 0,
-  "unassigned_shards" : 0,
-  "delayed_unassigned_shards" : 0,
-  "number_of_pending_tasks" : 0,
-  "number_of_in_flight_fetch" : 0,
-  "task_max_waiting_in_queue_millis" : 0,
-  "active_shards_percent_as_number" : 100.0
-}
-```
-
-Deploy Logstash Service
-=======================
-
-Rollout Logstash service
-
-```bash
-$ ./configure deploy logstash
-```
-
-Check status
-```bash
-$ kubectl get svc,deployment,pods -l role=logstash
-NAME                     CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
-svc/logstash-discovery   10.103.234.11   <nodes>       8100:31010/TCP   3m
-
-NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
-deploy/logstash   1         1         1            1           1m
-
-NAME                          READY     STATUS    RESTARTS   AGE
-po/logstash-9464b7fd8-dn8gv   1/1       Running   1          1m
-```
-
-Deploy Kibana Service
-=====================
-
-Rollout Kibana service
-
-```bash
-$ ./configure.sh deploy kibana
-```
-
-Check status
-```bash
-$ kubectl get svc,deployment,pods -l role=kibana
-NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
-svc/kibana   10.103.73.161   <nodes>       5601:32422/TCP   1m
-
-NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
-deploy/kibana   1         1         1            1           1m
-
-NAME                        READY     STATUS    RESTARTS   AGE
-po/kibana-b6f6b7b8f-plvkz   1/1       Running   0          1m
-```
-
-To view Kibana, either log into the VM or find your minikube VM address and
-goto the assigned external port to view Kibana.
-
-```bash
-$ firefox $(minikube ip):32422
-```
-
-## Todo
-1. Create new service `app` that will include pods tap, distill, site, db, etc.
-2. Need a better way of checking on the state of Logstash. It needs the most time to provision.
-3. Logstash is very unstable.
-
-[Pires]: https://github.com/pires/kubernetes-elasticsearch-cluster/
-[SensSoft]: http://senssoft.incubator.apache.org/
-[Elastic]: https://www.elastic.co/
-[Elasticsearch]: https://www.elastic.co/products/elasticsearch
-[Logstash]: https://www.elastic.co/products/logstash
-[Kibana]: https://www.elastic.co/products/kibana
-[Cheat Sheet]: https://kubernetes.io/docs/user-guide/kubectl-cheatsheet/
-[Docker]: https://www.docker.com
-[kubectl]: https://kubernetes.io/docs/tasks/tools/install-kubectl/
-[minikube]: https://kubernetes.io/docs/tasks/tools/install-minikube/    
\ No newline at end of file
+`test.py` is included as a utility to verify that logs are correctly posted to elastic locally.
\ No newline at end of file
diff --git a/kubernetes/configure.sh b/kubernetes/configure.sh
deleted file mode 100755
index e6ae111..0000000
--- a/kubernetes/configure.sh
+++ /dev/null
@@ -1,225 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#  http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Print out usage documentation.
-help_usage() {
-    echo "configure.sh"
-    echo "A simple utility to deploy Apache SensSoft Kubernetes build."
-    echo "Not meant to be used in production."
-    echo ""
-    echo "Usage: $ configure.sh COMMAND [OPT]"
-    echo ""
-    help_commands
-    echo "e.g."
-    echo "$ $0 deploy all"
-}
-
-# Print out commands.
-help_commands() {
-    echo "The commands are:"
-    echo "    status                View status of Kubernetes deployment"
-    echo "    deploy elk            Deploy ELK stack into Kubernetes cluster"
-    echo "    deploy elasticsearch  Deploy Elasticsearch Kubernetes"
-    echo "    deploy logstash       Deploy Logstash Kubernetes"
-    echo "    deploy kibana         Deploy Kibana Kubernetes"
-    echo "    purge elk             Purge all ELK Kubernetes artifacts"
-    echo "    purge elasticsearch   Purge all Elasticsearch Kubernetes artifacts"
-    echo "    purge logstash        Purge all Logstash Kubernetes artifacts"
-    echo "    purge kibana          Purge all Kibana Kubernetes artifacts"
-    echo "    check                 Check environment for release"
-    echo "    shutdown              Shutdown Kubernetes cluster"
-    echo "    start                 Startup minikube"
-    echo "    stop                  Stop minikube"
-    echo "    delete                Delete minikube"
-    echo ""
-}
-
-# If no arguments were provided, display the usage.
-if [[ "$#" == "0" ]]; then
-    help_usage
-    exit 1
-fi
-
-# Check for a command argument.
-COMMAND=$1
-COMMAND_OPT=$2
-
-if [[ -z $COMMAND ]] || \
-    [[ $COMMAND != "status" && \
-    $COMMAND != "deploy" && \
-    $COMMAND != "check" && \
-    $COMMAND != "shutdown" && \
-    $COMMAND != "purge" && \
-    $COMMAND != "provision" && \
-    $COMMAND != "stop" && \
-    $COMMAND != "delete" ]]; then \
-    echo "Error: Specify a command."
-    echo ""
-    help_commands
-    exit 1
-fi
-
-# Start minikube w/ hyperkit
-if [[ $COMMAND == "provision" ]]; then
-    minikube start --cpus 2 --memory 5120 --vm-driver=virtualbox
-    # this for loop waits until kubectl can access the api server that Minikube has created
-    for i in {1..150}; do # timeout for 5 minutes
-       ./kubectl get po &> /dev/null
-       if [ $? -ne 1 ]; then
-          break
-      fi
-      sleep 2
-    done
-	exit 0
-fi
-
-# Stop minikube w/ hyperkit
-if [[ $COMMAND == "stop" ]]; then
-    minikube stop
-    eval $(minikube docker-env -u)
-	exit 0
-fi
-
-# Start minikube w/ hyperkit
-if [[ $COMMAND == "delete" ]]; then
-    minikube delete
-	exit 0
-fi
-
-# Fetch status of entire Kubernets SensSoft namespace
-if [[ $COMMAND == "status" ]]; then
-    kubectl get svc,deployment,pods -l component=elk
-	exit 0
-fi
-
-function elasticsearch() {
-    echo "Elasticsearch deployment"
-    kubectl create -f elasticsearch/es-master-svc.yaml
-    kubectl create -f elasticsearch/es-client-svc.yaml
-    kubectl create -f elasticsearch/es-master.yaml
-    kubectl rollout status -f elasticsearch/es-master.yaml
-    kubectl create -f elasticsearch/es-client.yaml
-    kubectl rollout status -f elasticsearch/es-client.yaml
-    kubectl create -f elasticsearch/es-data.yaml
-    kubectl rollout status -f elasticsearch/es-data.yaml
-}
-
-function logstash() {
-    echo "Logstash deployment"
-	kubectl create -f logstash/logstash-svc.yaml
-	kubectl create -f logstash/logstash-client.yaml
-	kubectl create -f logstash/logstash.yaml
-	kubectl rollout status -f logstash/logstash.yaml
-}
-
-function kibana() {
-    echo "Kibana deployment"
-	kubectl create -f kibana/kibana-svc.yaml
-	kubectl create -f kibana/kibana.yaml
-	kubectl rollout status -f kibana/kibana.yaml
-}
-
-if [[ $COMMAND == "deploy" && \
-    $COMMAND_OPT == "elasticsearch" ]]; then
-    elasticsearch
-    exit 0
-fi
-
-if [[ $COMMAND == "deploy" && \
-    $COMMAND_OPT == "logstash" ]]; then
-    logstash
-    exit 0
-fi
-
-if [[ $COMMAND == "deploy" && \
-    $COMMAND_OPT == "kibana" ]]; then
-    kibana
-    exit 0
-fi
-
-if [[ $COMMAND == "deploy" && \
-    $COMMAND_OPT == "elk" ]]; then
-    elasticsearch
-    logstash
-    kibana
-    exit 0
-fi
-
-# Delete entire Elasticsearch Kubernetes artifacts
-if [[ $COMMAND == 'purge' && \
-    $COMMAND_OPT == 'elasticsearch' ]]; then
-    for f in elasticsearch/*.yaml
-    do
-        kubectl delete -f $f
-    done
-fi
-
-# Delete entire Logstash Kubernetes artifacts
-if [[ $COMMAND == 'purge' && \
-    $COMMAND_OPT == 'logstash' ]]; then
-    for f in logstash/*.yaml
-    do
-        kubectl delete -f $f
-    done
-fi
-
-# Delete entire Kibana Kubernetes artifacts
-if [[ $COMMAND == 'purge' && \
-    $COMMAND_OPT == 'kibana' ]]; then
-    for f in kibana/*.yaml
-    do
-        kubectl delete -f $f
-    done
-fi
-
-# Delete entire Kubernetes SensSoft namespace
-if [[ $COMMAND == 'purge' && \
-    $COMMAND_OPT == 'elk' ]]; then
-	for f in elasticsearch/*.yaml
-    do
-        kubectl delete -f $f
-    done
-    for f in logstash/*.yaml
-    do
-        kubectl delete -f $f
-    done
-    for f in kibana/*.yaml
-    do
-        kubectl delete -f $f
-    done
-fi
-
-# Prepare for Distill deployment
-if [[ $COMMAND == "distill" ]]; then
-    echo "Error: Unsupported distill build."
-    exit 1
-fi
-
-# Prepare for Tap deployment
-if [[ $COMMAND == "tap" ]]; then
-    echo "Error: Unsupported tap build."
-    exit 1
-fi
-
-# Run production build process checks.
-if [[ $COMMAND == "check" ]]; then
-    echo "Error: Unsupported check build."
-    exit 1
-fi
\ No newline at end of file
diff --git a/kubernetes/resources/elastic.yaml b/kubernetes/resources/elastic.yaml
new file mode 100644
index 0000000..ce201cd
--- /dev/null
+++ b/kubernetes/resources/elastic.yaml
@@ -0,0 +1,22 @@
+apiVersion: elasticsearch.k8s.elastic.co/v1
+kind: Elasticsearch
+metadata:
+  name: quickstart
+spec:
+  version: 8.12.0
+  auth:
+    roles:
+      - secretName: my-roles-secret
+  nodeSets:
+  - name: default
+    count: 3
+    podTemplate:
+      spec:
+        containers:
+        - name: elasticsearch
+          resources:
+            requests:
+              memory: 1Gi
+              cpu: 1
+            limits:
+              memory: 1Gi
\ No newline at end of file
diff --git a/kubernetes/resources/logstash-auth.yaml b/kubernetes/resources/logstash-auth.yaml
new file mode 100644
index 0000000..9935d5c
--- /dev/null
+++ b/kubernetes/resources/logstash-auth.yaml
@@ -0,0 +1,11 @@
+kind: Secret
+apiVersion: v1
+metadata:
+  name: my-roles-secret
+stringData:
+  roles.yml: |-
+    eck_logstash_user_role:
+      cluster: [ "monitor", "manage_ilm", "read_ilm", "manage_logstash_pipelines", "manage_index_templates", "cluster:admin/ingest/pipeline/get"]
+      indices:
+      - names: [ "my-index", "logstash", "logstash-*", "ecs-logstash", "ecs-logstash-*", "logs-*", "metrics-*", "synthetics-*", "traces-*", "userale" ]
+        privileges: [ "manage", "write", "create_index", "read", "view_index_metadata" ]
\ No newline at end of file
diff --git a/kubernetes/resources/logstash.yaml b/kubernetes/resources/logstash.yaml
new file mode 100644
index 0000000..f96e877
--- /dev/null
+++ b/kubernetes/resources/logstash.yaml
@@ -0,0 +1,54 @@
+apiVersion: logstash.k8s.elastic.co/v1alpha1
+kind: Logstash
+metadata:
+  name: quickstart
+spec:
+  count: 1
+  elasticsearchRefs:
+    - name: quickstart
+      clusterName: qs
+  version: 8.12.0
+  pipelines:
+    - pipeline.id: main
+      config.string: |
+        input {
+          http {
+            codec => "json"
+            port => 8100
+            response_headers => { 
+              "Access-Control-Allow-Origin" => "*" 
+              "Access-Control-Allow-Headers" => "*"
+            }
+          }
+        }
+
+        filter {
+          mutate {
+            remove_field => [ "message", "@version", "headers"]
+          }
+
+          grok {
+              match => [ "useraleVersion", "(?<major_ver>\d+).(?<minor_ver>\d+)(.(?<patch_ver>\d+))?" ]
+              match => [ "toolVersion", "(?<tool_major_ver>\d+).(?<tool_minor_ver>\d+)(.(?<tool_patch_ver>\d+))?" ]
+          }
+        }
+
+        output {
+          elasticsearch {
+            hosts => [ "${QS_ES_HOSTS}" ]
+            user => "${QS_ES_USER}"
+            password => "${QS_ES_PASSWORD}"
+            ssl_certificate_authorities => "${QS_ES_SSL_CERTIFICATE_AUTHORITY}"
+            index => "userale"
+          }
+        }
+  services:
+    - name: http
+      service:
+        spec:
+          type: NodePort
+          ports:
+            - port: 8100
+              name: "http"
+              protocol: TCP
+              targetPort: 8100
\ No newline at end of file
diff --git a/kubernetes/run.sh b/kubernetes/run.sh
new file mode 100755
index 0000000..2051b00
--- /dev/null
+++ b/kubernetes/run.sh
@@ -0,0 +1,11 @@
+kubectl create -f https://download.elastic.co/downloads/eck/2.11.0/crds.yaml
+kubectl apply -f https://download.elastic.co/downloads/eck/2.11.0/operator.yaml
+kubectl apply -f resources/logstash-auth.yaml
+kubectl apply -f resources/elastic.yaml
+kubectl apply -f resources/logstash.yaml
+sleep 10
+kubectl wait --for=condition=Ready pod/quickstart-es-default-0 --timeout=60s
+kubectl wait --for=condition=Ready pod/quickstart-ls-0 --timeout=60s
+kubectl port-forward service/quickstart-es-http 9200 >/dev/null 2>&1 &
+kubectl port-forward service/quickstart-ls-http 8100 >/dev/null 2>&1 &
+export ES_PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')
\ No newline at end of file
diff --git a/kubernetes/test.py b/kubernetes/test.py
new file mode 100644
index 0000000..cf5ddf5
--- /dev/null
+++ b/kubernetes/test.py
@@ -0,0 +1,16 @@
+from elasticsearch_dsl import connections
+from elasticsearch_dsl import Search
+from elasticsearch_dsl import Q
+import os
+
+flagonClient = connections.create_connection('flagonTest', hosts=['https://localhost:9200'], basic_auth=("elastic", os.environ['ES_PASSWORD']), verify_certs=False)
+AleS = Search(using='flagonTest', index="userale")
+qLogType = Q("match", logType="raw") | Q("match", logType="custom")
+
+elk_search = AleS \
+    .query(qLogType) \
+    .extra(track_total_hits=True) #breaks return limit of 10000 hits
+
+elk_response = elk_search.scan()
+for hit in elk_response:
+    print(hit)
\ No newline at end of file
diff --git a/release/make-release-artifacts.sh b/release/make-release-artifacts.sh
index 3f7fa44..c92887b 100755
--- a/release/make-release-artifacts.sh
+++ b/release/make-release-artifacts.sh
@@ -101,7 +101,7 @@
 ###############################################################################
 # Determine all filenames and paths, and confirm
 
-release_name=apache-flagon-useralejs-incubating-${current_version}
+release_name=apache-flagon-useralejs-${current_version}
 if [ -z "$rc_suffix" ]; then
     fail Specifying the RC number is required
 else
@@ -109,7 +109,7 @@
 fi
 
 userale_dir=$( pwd )
-working_dir=${TMPDIR:-/tmp}release-working-dir
+working_dir=${TMPDIR:-/tmp}/release-working-dir
 rm -rf ${working_dir}
 staging_dir="${working_dir}/source/"
 src_staging_dir="${working_dir}/source/${release_name}-src"
@@ -204,7 +204,6 @@
 cp ${src_staging_dir}/README.md ${bin_staging_dir}/${release_name}-bin
 cp ${src_staging_dir}/LICENSE ${bin_staging_dir}/${release_name}-bin
 cp ${src_staging_dir}/NOTICE ${bin_staging_dir}/${release_name}-bin
-cp ${src_staging_dir}/DISCLAIMER ${bin_staging_dir}/${release_name}-bin
 
 
 ( cd ${bin_staging_dir} && tar czf ${artifact_dir}/${artifact_name}-bin.tar.gz ${release_name}-bin )
@@ -246,4 +245,4 @@
 echo "You can find these files in: ${artifact_dir}"
 echo "The git commit IDs for the voting emails are:"
 echo -n "incubator-flagon-userale: " && git rev-parse HEAD
-git submodule --quiet foreach 'echo -n "${name}: " && git rev-parse HEAD'
\ No newline at end of file
+git submodule --quiet foreach 'echo -n "${name}: " && git rev-parse HEAD'
diff --git a/site/Dockerfile b/site/Dockerfile
index de73bae..5afd3f9 100644
--- a/site/Dockerfile
+++ b/site/Dockerfile
@@ -1,6 +1,8 @@
 FROM phusion/passenger-full
 LABEL org.opencontainers.image.authors="poorejc@apache.org"
 
+RUN bash -lc 'rvm --default use ruby-3.2.3'
+
 # Cache bundle
 COPY Gemfile* /tmp/
 WORKDIR /tmp
diff --git a/site/_pages/releases.html b/site/_pages/releases.html
index 65f7020..1eaefd6 100644
--- a/site/_pages/releases.html
+++ b/site/_pages/releases.html
@@ -18,7 +18,7 @@
   Apache Flagon artifacts are always distributed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
 </p>
 
-<h1>Apache Flagon UserALE.js version 2.3.0</h1>
+<h1>Apache Flagon UserALE.js version 2.4.0</h1>
 
 <p>
     Apache Flagon UserALE.js is a client side instrumentation library written in JavaScript designed for easy deployment and lightweight configuration in gathering logs from your web applications for user behavioral analytics.
@@ -57,35 +57,35 @@
   </thead>
   <tbody>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz">Apache UserALE.js 2.3.0 Binaries (tar.gz)</a> </td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz.asc">asc (tar.gz)</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz.sha512">sha512 (tar.gz)</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz">Apache UserALE.js 2.4.0 Binaries (tar.gz)</a> </td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.asc">asc (tar.gz)</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.sha512">sha512 (tar.gz)</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip">Apache UserALE.js 2.3.0 Binaries (zip)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip.asc">asc (zip)</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip.sha512">sha512 (zip)</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.zip">Apache UserALE.js 2.4.0 Binaries (zip)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.zip.asc">asc (zip)</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.sha512">sha512 (zip)</a></td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz">Apache UserALE.js 2.3.0 Source (tar.gz)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz.asc">asc (tar.gz)</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz.sha512">sha512 (tar.gz)</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz">Apache UserALE.js 2.4.0 Source (tar.gz)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz.asc">asc (tar.gz)</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz.sha512">sha512 (tar.gz)</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip">Apache UserALE.js 2.3.0 Source (zip)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip.asc">asc (zip)</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip.sha512">sha512 (zip)</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip">Apache UserALE.js 2.4.0 Source (zip)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip.asc">asc (zip)</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip.sha512">sha512 (zip)</a></td>
   </tr>
 
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz">Apache Distill 0.1.0 Source (tar.gz)</a> </td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.asc">asc</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz">Apache Distill 0.1.0 Source (tar.gz)</a> </td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz.asc">asc</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0-py3-none-any.whl">Apache Distill 0.1.0 Wheel</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0-py3-none-any.whl.asc">asc</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl">Apache Distill 0.1.0 Wheel</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl.asc">asc</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl.sha512">sha512</a></td>
   </tr>
   </tbody>
 </table>
diff --git a/site/_site/releases/index.html b/site/_site/releases/index.html
index e83fe1c..7626959 100644
--- a/site/_site/releases/index.html
+++ b/site/_site/releases/index.html
@@ -81,7 +81,7 @@
   Apache Flagon artifacts are always distributed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
 </p>
 
-<h1>Apache Flagon UserALE.js version 2.3.0</h1>
+<h1>Apache Flagon UserALE.js version 2.4.0</h1>
 
 <p>
     Apache Flagon UserALE.js is a client side instrumentation library written in JavaScript designed for easy deployment and lightweight configuration in gathering logs from your web applications for user behavioral analytics.
@@ -120,35 +120,35 @@
   </thead>
   <tbody>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz">Apache UserALE.js 2.3.0 Binaries (tar.gz)</a> </td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz.asc">asc (tar.gz)</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.tar.gz.sha512">sha512 (tar.gz)</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz">Apache UserALE.js 2.4.0 Binaries (tar.gz)</a> </td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.asc">asc (tar.gz)</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.sha512">sha512 (tar.gz)</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip">Apache UserALE.js 2.3.0 Binaries (zip)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip.asc">asc (zip)</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-bin.zip.sha512">sha512 (zip)</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.zip">Apache UserALE.js 2.4.0 Binaries (zip)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.zip.asc">asc (zip)</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-bin.tar.gz.sha512">sha512 (zip)</a></td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz">Apache UserALE.js 2.3.0 Source (tar.gz)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz.asc">asc (tar.gz)</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.tar.gz.sha512">sha512 (tar.gz)</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz">Apache UserALE.js 2.4.0 Source (tar.gz)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz.asc">asc (tar.gz)</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.tar.gz.sha512">sha512 (tar.gz)</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="http://www.apache.org/dyn/closer.lua/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip">Apache UserALE.js 2.3.0 Source (zip)</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip.asc">asc (zip)</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-useralejs-incubating-2.3.0/apache-flagon-useralejs-incubating-2.3.0-src.zip.sha512">sha512 (zip)</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip">Apache UserALE.js 2.4.0 Source (zip)</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip.asc">asc (zip)</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/useralejs/2.4.0/apache-flagon-useralejs-2.4.0-src.zip.sha512">sha512 (zip)</a></td>
   </tr>
 
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz">Apache Distill 0.1.0 Source (tar.gz)</a> </td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.asc">asc</a> </td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a> </td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz">Apache Distill 0.1.0 Source (tar.gz)</a> </td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz.asc">asc</a> </td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a> </td>
   </tr>
   <tr>
-    <td><a style="padding:0 15px 0 15px;" href="https://www.apache.org/dyn/closer.lua/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0-py3-none-any.whl">Apache Distill 0.1.0 Wheel</a></td>
-    <td><a style="padding:0 45px 0 45px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0-py3-none-any.whl.asc">asc</a></td>
-    <td><a style="padding:0 30px 0 30px;" href="https://downloads.apache.org/flagon/apache-flagon-distill-0.1.0/flagon_distill-0.1.0.tar.gz.sha512">sha512</a></td>
+    <td><a style="padding:0 15px 0 15px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl">Apache Distill 0.1.0 Wheel</a></td>
+    <td><a style="padding:0 45px 0 45px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl.asc">asc</a></td>
+    <td><a style="padding:0 30px 0 30px;" href="https://dlcdn.apache.org/flagon/distill/0.1.0/flagon_distill-0.1.0-py3-none-any.whl.sha512">sha512</a></td>
   </tr>
   </tbody>
 </table>