diff --git a/docker/.env b/docker/.env
index e63e1dbf8d..11e44fdde8 100644
--- a/docker/.env
+++ b/docker/.env
@@ -19,3 +19,6 @@ TB_VERSION=latest
DATABASE=postgres
LOAD_BALANCER_NAME=haproxy-certbot
+
+# If enabled Prometheus and Grafana containers are deployed along with other containers
+MONITORING_ENABLED=false
\ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
index 9664edc48e..01f89ebb6c 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -100,3 +100,13 @@ $ ./docker-start-services.sh
Where:
- `FROM_VERSION` - from which version upgrade should be started. See [Upgrade Instructions](https://thingsboard.io/docs/user-guide/install/upgrade-instructions) for valid `fromVersion` values.
+
+
+## Monitoring
+
+If you want to enable monitoring with Prometheus and Grafana you need to set MONITORING_ENABLED environment variable to true.
+After this Prometheus and Grafana containers will be deployed. You can reach Prometheus at `http://localhost:9090` and Grafana at `http://localhost:3000` (default login is `admin` and password `foobar`).
+To change Grafana password you need to update `GF_SECURITY_ADMIN_PASSWORD` environment variable at `./monitoring/grafana/config.monitoring` file.
+Dashboards are loaded from `./monitoring/grafana/provisioning/dashboards` directory.
+
+If you want to add new monitoring jobs for Prometheus update `./monitoring/prometheus/prometheus.yml` file.
\ No newline at end of file
diff --git a/docker/compose-utils.sh b/docker/compose-utils.sh
index 6afc5ea2c1..db10fcd046 100755
--- a/docker/compose-utils.sh
+++ b/docker/compose-utils.sh
@@ -61,6 +61,18 @@ function additionalComposeQueueArgs() {
echo $ADDITIONAL_COMPOSE_QUEUE_ARGS
}
+function additionalComposeMonitoringArgs() {
+ source .env
+
+ if [ "$MONITORING_ENABLED" = true ]
+ then
+ ADDITIONAL_COMPOSE_MONITORING_ARGS="-f docker-compose.prometheus-grafana.yml"
+ echo $ADDITIONAL_COMPOSE_MONITORING_ARGS
+ else
+ echo ""
+ fi
+}
+
function additionalStartupServices() {
source .env
ADDITIONAL_STARTUP_SERVICES=""
diff --git a/docker/docker-compose.prometheus-grafana.yml b/docker/docker-compose.prometheus-grafana.yml
new file mode 100644
index 0000000000..4fd53c68ec
--- /dev/null
+++ b/docker/docker-compose.prometheus-grafana.yml
@@ -0,0 +1,47 @@
+#
+# Copyright © 2016-2021 The Thingsboard Authors
+#
+# Licensed 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.
+#
+
+version: '2.2'
+
+volumes:
+ prometheus_data: {}
+ grafana_data: {}
+
+services:
+
+ prometheus:
+ image: prom/prometheus:v2.1.0
+ volumes:
+ - ./monitoring/prometheus/:/etc/prometheus/
+ - prometheus_data:/prometheus
+ command:
+ - '--config.file=/etc/prometheus/prometheus.yml'
+ ports:
+ - 9090:9090
+ restart: always
+ grafana:
+ image: grafana/grafana
+ user: "472"
+ depends_on:
+ - prometheus
+ ports:
+ - 3000:3000
+ volumes:
+ - grafana_data:/var/lib/grafana
+ - ./monitoring/grafana/provisioning/:/etc/grafana/provisioning/
+ env_file:
+ - monitoring/grafana/config.monitoring
+ restart: always
\ No newline at end of file
diff --git a/docker/docker-remove-services.sh b/docker/docker-remove-services.sh
index b2937e6c37..cd7a648b80 100755
--- a/docker/docker-remove-services.sh
+++ b/docker/docker-remove-services.sh
@@ -23,4 +23,6 @@ ADDITIONAL_COMPOSE_QUEUE_ARGS=$(additionalComposeQueueArgs) || exit $?
ADDITIONAL_COMPOSE_ARGS=$(additionalComposeArgs) || exit $?
-docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS $ADDITIONAL_COMPOSE_QUEUE_ARGS down -v
+ADDITIONAL_COMPOSE_MONITORING_ARGS=$(additionalComposeMonitoringArgs) || exit $?
+
+docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS $ADDITIONAL_COMPOSE_QUEUE_ARGS $ADDITIONAL_COMPOSE_MONITORING_ARGS down -v
diff --git a/docker/docker-start-services.sh b/docker/docker-start-services.sh
index a3cb339652..75f98897ee 100755
--- a/docker/docker-start-services.sh
+++ b/docker/docker-start-services.sh
@@ -23,4 +23,6 @@ ADDITIONAL_COMPOSE_QUEUE_ARGS=$(additionalComposeQueueArgs) || exit $?
ADDITIONAL_COMPOSE_ARGS=$(additionalComposeArgs) || exit $?
-docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS $ADDITIONAL_COMPOSE_QUEUE_ARGS up -d
+ADDITIONAL_COMPOSE_MONITORING_ARGS=$(additionalComposeMonitoringArgs) || exit $?
+
+docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS $ADDITIONAL_COMPOSE_QUEUE_ARGS $ADDITIONAL_COMPOSE_MONITORING_ARGS up -d
diff --git a/docker/docker-stop-services.sh b/docker/docker-stop-services.sh
index d6751a1836..95f7f696f5 100755
--- a/docker/docker-stop-services.sh
+++ b/docker/docker-stop-services.sh
@@ -23,4 +23,6 @@ ADDITIONAL_COMPOSE_QUEUE_ARGS=$(additionalComposeQueueArgs) || exit $?
ADDITIONAL_COMPOSE_ARGS=$(additionalComposeArgs) || exit $?
-docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS $ADDITIONAL_COMPOSE_QUEUE_ARGS stop
+ADDITIONAL_COMPOSE_MONITORING_ARGS=$(additionalComposeMonitoringArgs) || exit $?
+
+docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS $ADDITIONAL_COMPOSE_QUEUE_ARGS $ADDITIONAL_COMPOSE_MONITORING_ARGS stop
diff --git a/docker/monitoring/grafana/config.monitoring b/docker/monitoring/grafana/config.monitoring
new file mode 100644
index 0000000000..f12466bb05
--- /dev/null
+++ b/docker/monitoring/grafana/config.monitoring
@@ -0,0 +1,2 @@
+GF_SECURITY_ADMIN_PASSWORD=foobar
+GF_USERS_ALLOW_SIGN_UP=false
diff --git a/docker/monitoring/grafana/provisioning/dashboards/dashboard.yml b/docker/monitoring/grafana/provisioning/dashboards/dashboard.yml
new file mode 100644
index 0000000000..17a0d20d15
--- /dev/null
+++ b/docker/monitoring/grafana/provisioning/dashboards/dashboard.yml
@@ -0,0 +1,27 @@
+#
+# Copyright © 2016-2021 The Thingsboard Authors
+#
+# Licensed 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.
+#
+
+apiVersion: 1
+
+providers:
+- name: 'Prometheus'
+ orgId: 1
+ folder: ''
+ type: file
+ disableDeletion: false
+ editable: true
+ options:
+ path: /etc/grafana/provisioning/dashboards
diff --git a/docker/monitoring/grafana/provisioning/datasources/datasource.yml b/docker/monitoring/grafana/provisioning/datasources/datasource.yml
new file mode 100644
index 0000000000..c57361a4fa
--- /dev/null
+++ b/docker/monitoring/grafana/provisioning/datasources/datasource.yml
@@ -0,0 +1,66 @@
+#
+# Copyright © 2016-2021 The Thingsboard Authors
+#
+# Licensed 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.
+#
+
+# config file version
+apiVersion: 1
+
+# list of datasources that should be deleted from the database
+deleteDatasources:
+ - name: Prometheus
+ orgId: 1
+
+# list of datasources to insert/update depending
+# whats available in the database
+datasources:
+ # name of the datasource. Required
+- name: Prometheus
+ # datasource type. Required
+ type: prometheus
+ # access mode. direct or proxy. Required
+ access: proxy
+ # org id. will default to orgId 1 if not specified
+ orgId: 1
+ # url
+ url: http://prometheus:9090
+ # database password, if used
+ password:
+ # database user, if used
+ user:
+ # database name, if used
+ database:
+ # enable/disable basic auth
+ basicAuth: false
+ # basic auth username, if used
+ basicAuthUser:
+ # basic auth password, if used
+ basicAuthPassword:
+ # enable/disable with credentials headers
+ withCredentials:
+ # mark as default datasource. Max one per org
+ isDefault: true
+ #