diff --git a/examples/oracle/demo/README.md b/examples/oracle/demo/README.md
index b0e8a7a..392a93d 100644
--- a/examples/oracle/demo/README.md
+++ b/examples/oracle/demo/README.md
@@ -3,6 +3,8 @@
:white_check_mark: Setup and start Redis Enterprise database (Target)
:white_check_mark: Setup and start Redis Connect
:white_check_mark: Perform Initial load and CDC with Redis Connect
+:white_check_mark: Setup Grafana dashboard for Redis Connect metrics
+
# Prerequisites
@@ -448,3 +450,24 @@ demo$ sudo docker exec -it re-node1 bash -c 'redis-cli -p 12000 ft.search idx_em
+
+-------------------------------
+
+### Dashboard
+
+#### Prerequisites
+1. Redis Connect cluster timeseries metrics should be [enabled](../demo/config/jobmanager.properties#L9).
+2. Redis Connect job metrics should be enabled [enabled](../demo/config/samples/payloads/cdc-custom-job.json#L23).
+
+###### Standalone Grafana
+Use your existing Grafana install and add [redis-datasource](https://redisgrafana.github.io/redis-datasource/overview/) plugin.
+1. Configure two Redis data sources, one with JobManager and another one with Target name using [redis-datasource](https://redisgrafana.github.io/redis-datasource/overview/) plugin.
+2. Import [Sample Redis Connect Dashboard](../demo/config/samples/dashboard/redis-connnnect-dashboard.json)
+3. Validate and fix dashboard variables if they don't load properly
+
+###### Containerized Grafana
+If you used the demo script to set up Redis Enterprise in a docker container then, a containerized Grafana with [redis-datasource](https://redisgrafana.github.io/redis-datasource/overview/) plugin should already be installed and running.
+
+1. Open Grafana UI by going to http://localhost:13000 and login with `redisconnect/Redis@123` credentials.
+2. Import [Sample Redis Connect Dashboard](../demo/config/samples/dashboard/redis-connnnect-dashboard.json)
+3. Validate and fix dashboard variables if they don't load properly
diff --git a/examples/oracle/demo/cleanup_re.sh b/examples/oracle/demo/cleanup_re.sh
new file mode 100755
index 0000000..65a1334
--- /dev/null
+++ b/examples/oracle/demo/cleanup_re.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+version="${1:-latest}"
+cleanup="${2:-yes}"
+
+container_name="re-node1-$version-$(hostname)"
+
+# delete the existing container if it exist
+if [ "${cleanup}" = "yes" ]; then
+ echo "Stopping and removing ${container_name} docker container from $(hostname)."
+ docker container stop "${container_name}"; docker container rm "${container_name}"; docker stop grafana; docker rm grafana; docker network rm redis-connect;
+else
+ echo "Skipping removing ${container_name} docker container from $(hostname)."
+fi
+
+echo "done"
\ No newline at end of file
diff --git a/examples/oracle/demo/config/jobmanager.properties b/examples/oracle/demo/config/jobmanager.properties
index eaac4e8..b6ad404 100644
--- a/examples/oracle/demo/config/jobmanager.properties
+++ b/examples/oracle/demo/config/jobmanager.properties
@@ -6,7 +6,7 @@
#cluster.name=default
#cluster.leader.heartbeat.lease.renewal.interval=5000
#cluster.election.attempt.interval=5000
-#cluster.timeseries.metrics.enabled=false
+cluster.timeseries.metrics.enabled=true
##### Job Manager Services properties
#job.manager.services.enabled=true
diff --git a/examples/oracle/demo/config/samples/dashboard/datasource.yml b/examples/oracle/demo/config/samples/dashboard/datasource.yml
index b9b71f5..c202056 100644
--- a/examples/oracle/demo/config/samples/dashboard/datasource.yml
+++ b/examples/oracle/demo/config/samples/dashboard/datasource.yml
@@ -3,7 +3,7 @@ apiVersion: 1
datasources:
- name: JobManager
type: redis-datasource
- url: redis://:
+ url: redis://host.docker.internal:14001
jsonData:
client: standalone
poolSize: 5
@@ -11,17 +11,17 @@ datasources:
pingInterval: 0
pipelineWindow: 0
acl: true
- user:
+ user: redisconnect
editable: true
secureJsonData:
- password:
+ password: Redis123
access: proxy
orgId: 1
isDefault: false
version: 1
- name: Target
type: redis-datasource
- url: redis://:
+ url: redis://host.docker.internal:14000
jsonData:
client: standalone
poolSize: 5
@@ -29,10 +29,10 @@ datasources:
pingInterval: 0
pipelineWindow: 0
acl: true
- user:
+ user: redisconnect
editable: true
secureJsonData:
- password:
+ password: Redis123
access: proxy
orgId: 1
isDefault: false
diff --git a/examples/oracle/demo/load_c##rcuser_schema.sh b/examples/oracle/demo/load_c##rcuser_schema.sh
index fc284a5..58d786c 100755
--- a/examples/oracle/demo/load_c##rcuser_schema.sh
+++ b/examples/oracle/demo/load_c##rcuser_schema.sh
@@ -11,8 +11,8 @@ sqlplus c##rcuser/rcpwd@ORCLPDB1 <<- EOF
job varchar2(40),
mgr number(4,0),
hiredate date,
- sal number(10,4),
- comm number(10,4),
+ sal number(10,2),
+ comm number(10,2),
dept number(4,0),
constraint pk_emp primary key (empno)
);
diff --git a/examples/oracle/demo/setup_re.sh b/examples/oracle/demo/setup_re.sh
index 2ae38ee..66b87c5 100755
--- a/examples/oracle/demo/setup_re.sh
+++ b/examples/oracle/demo/setup_re.sh
@@ -1,91 +1,137 @@
#!/bin/bash
-sudo docker kill re-node1;sudo docker rm re-node1;
-sudo docker kill redisinsight;sudo docker rm redisinsight;
-sudo docker kill grafana; sudo docker rm grafana;
-# shellcheck disable=SC2046
-sudo docker rmi -f $(sudo docker images | grep redislabs | awk '{print $3}')
-# Start 1 docker container since we can't do HA with vanilla docker instance. Use docker swarm, RE on VM's or RE's K8s operator to achieve HA, clustering etc.
+
+version="${1:-latest}"
+platform="${2:-linux/amd64}"
+
+container_name="re-node1-$version-$(hostname)"
+
+# Start 1 docker container since we can't do HA with vanilla docker instance. Use docker swarm, RE on VM's or RE K8s operator to achieve HA, clustering etc.
+
echo "Starting Redis Enterprise as Docker containers..."
-sudo docker run -d --cap-add sys_resource -h re-node1 --name re-node1 -p 18443:8443 -p 19443:9443 -p 14000-14005:12000-12005 -p 18070:8070 redislabs/redis:latest
+IS_RUNNING=$(docker ps --filter name="${container_name}" --format '{{.ID}}')
+if [ -n "${IS_RUNNING}" ]; then
+ echo "${container_name} is running. Stopping ${container_name} and removing container..."
+ docker container stop "${container_name}"
+ docker container rm "${container_name}"
+ docker container stop grafana
+ docker container rm grafana
+ docker network rm redis-connect
+else
+ IS_STOPPED=$(docker ps -a --filter name="${container_name}" --format '{{.ID}}')
+ if [ -n "${IS_STOPPED}" ]; then
+ echo "${container_name} is stopped. Removing container..."
+ docker container rm "${container_name}"
+ docker container rm grafana
+ docker network rm redis-connect
+ fi
+fi
+
+docker network create -d bridge redis-connect
+
+docker run -d \
+ --init \
+ --platform "${platform}" \
+ --cap-add sys_resource \
+ --name "${container_name}" \
+ --network=redis-connect \
+ -h "${container_name}" \
+ -p 18443:8443 \
+ -p 19443:9443 \
+ -p 14000-14001:12000-12001 \
+ -p 18070:8070 \
+ redislabs/redis:"${version}"
+
+while ! nc -vz localhost 18443 < /dev/null
+do
+ echo "$(date) - still trying"
+ sleep 2
+done
+echo "$(date) - connected to admin ui port successfully"
+
+while ! nc -vz localhost 19443 < /dev/null
+do
+ echo "$(date) - still trying"
+ sleep 2
+done
+echo "$(date) - connected to rest api port successfully"
+
+while ! nc -vz localhost 18070 < /dev/null
+do
+ echo "$(date) - still trying"
+ sleep 2
+done
+echo "$(date) - connected to metrics exporter port successfully"
+
# Create Redis Enterprise cluster
echo "Waiting for the servers to start..."
sleep 60
echo "Creating Redis Enterprise cluster..."
-sudo docker exec -it --privileged re-node1 "/opt/redislabs/bin/rladmin" cluster create name re-cluster.local username demo@redis.com password redislabs
-echo ""
-# Test the cluster
-sudo docker exec -it re-node1 bash -c "/opt/redislabs/bin/rladmin info cluster"
+
+while [[ "$(curl -o ./cluster -w ''%{http_code}'' -X POST -H 'Content-Type:application/json' -d '{"action":"create_cluster","cluster":{"name":"re-cluster.local"},"node":{"paths":{"persistent_path":"/var/opt/redislabs/persist","ephemeral_path":"/var/opt/redislabs/tmp"}},"credentials":{"username":"demo@redis.com","password":"redislabs"}}' -k https://localhost:19443/v1/bootstrap/create_cluster)" != "200" ]]; do sleep 5; done
+echo "Cluster.." && cat ./cluster
+
+# Test the cluster. cluster info and nodes
+while [[ "$(curl -o ./bootstrap -w ''%{http_code}'' -u demo@redis.com:redislabs -k https://localhost:19443/v1/bootstrap)" != "200" ]]; do sleep 5; done
+echo "Bootstrap.." && cat ./bootstrap
+while [[ "$(curl -o ./nodes -w ''%{http_code}'' -u demo@redis.com:redislabs -k https://localhost:19443/v1/nodes)" != "200" ]]; do sleep 5; done
+echo "Nodes.." && cat ./nodes
# Get the module info to be used for database creation
-tee -a list_modules.sh <