From 7bfe2500359c24c6e364f8b35e9089b84c06b1b5 Mon Sep 17 00:00:00 2001
From: Semyon Bezrukov <semen.bezrukov@onlyoffice.com>
Date: Thu, 23 Jul 2020 15:42:17 +0300
Subject: [PATCH] Add Graphite (#265)

---
 .travis.yml                     |  3 +++
 README.md                       |  4 ++++
 run-document-server.sh          | 18 ++++++++++++++++++
 tests/graphite.yml              | 32 ++++++++++++++++++++++++++++++++
 tests/graphite/statsd/config.js |  7 +++++++
 5 files changed, 64 insertions(+)
 create mode 100644 tests/graphite.yml
 create mode 100644 tests/graphite/statsd/config.js

diff --git a/.travis.yml b/.travis.yml
index 94a1ff0..4371198 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -55,6 +55,9 @@ env:
   # redis
   - config: redis.yml
 
+  # graphite
+  - config: graphite.yml
+
 services:
   - docker
 
diff --git a/README.md b/README.md
index e11f94c..cdf7c42 100644
--- a/README.md
+++ b/README.md
@@ -181,6 +181,10 @@ Below is the complete list of parameters that can be set using environment varia
 - **JWT_HEADER**: Defines the http header that will be used to send the JSON Web Token. Defaults to `Authorization`.
 - **JWT_IN_BODY**: Specifies the enabling the token validation in the request body to the ONLYOFFICE Document Server. Defaults to `false`.
 - **USE_UNAUTHORIZED_STORAGE**: Set to `true`if using selfsigned certificates for your storage server e.g. Nextcloud. Defaults to `false`
+- **METRICS_ENABLED**: Specifies the enabling StatsD for ONLYOFFICE Document Server. Defaults to `false`.
+- **METRICS_HOST**: Defines StatsD listening host. Defaults to `localhost`.
+- **METRICS_PORT**: Defines StatsD listening port. Defaults to `8125`.
+- **METRICS_PREFIX**: Defines StatsD metrics prefix for backend services. Defaults to `ds.`.
 
 ## Installing ONLYOFFICE Document Server integrated with Community and Mail Servers
 
diff --git a/run-document-server.sh b/run-document-server.sh
index b040372..21ddea3 100755
--- a/run-document-server.sh
+++ b/run-document-server.sh
@@ -78,6 +78,11 @@ read_setting(){
   deprecated_var AMQP_SERVER_URL AMQP_URI
   deprecated_var AMQP_SERVER_TYPE AMQP_TYPE
 
+  METRICS_ENABLED="${METRICS_ENABLED:-false}"
+  METRICS_HOST="${METRICS_HOST:-localhost}"
+  METRICS_PORT="${METRICS_PORT:-8125}"
+  METRICS_PREFIX="${METRICS_PREFIX:-.ds}"
+
   DB_HOST=${DB_HOST:-${POSTGRESQL_SERVER_HOST:-$(${JSON} services.CoAuthoring.sql.dbHost)}}
   case $DB_TYPE in
     "postgres")
@@ -179,6 +184,15 @@ waiting_for_redis(){
 waiting_for_datacontainer(){
   waiting_for_connection ${ONLYOFFICE_DATA_CONTAINER_HOST} ${ONLYOFFICE_DATA_CONTAINER_PORT}
 }
+
+update_statsd_settings(){
+  ${JSON} -I -e "if(this.statsd===undefined)this.statsd={};"
+  ${JSON} -I -e "this.statsd.useMetrics = '${METRICS_ENABLED}'"
+  ${JSON} -I -e "this.statsd.host = '${METRICS_HOST}'"
+  ${JSON} -I -e "this.statsd.port = '${METRICS_PORT}'"
+  ${JSON} -I -e "this.statsd.prefix = '${METRICS_PREFIX}'"
+}
+
 update_db_settings(){
   ${JSON} -I -e "this.services.CoAuthoring.sql.type = '${DB_TYPE}'"
   ${JSON} -I -e "this.services.CoAuthoring.sql.dbHost = '${DB_HOST}'"
@@ -420,6 +434,10 @@ if [ ${ONLYOFFICE_DATA_CONTAINER_HOST} = "localhost" ]; then
 
   read_setting
 
+  if [ $METRICS_ENABLED = "true" ]; then
+    update_statsd_settings
+  fi
+
   update_welcome_page
 
   update_log_settings
diff --git a/tests/graphite.yml b/tests/graphite.yml
new file mode 100644
index 0000000..2bc4694
--- /dev/null
+++ b/tests/graphite.yml
@@ -0,0 +1,32 @@
+version: '2.1'
+services:
+  onlyoffice-documentserver:
+    container_name: onlyoffice-documentserver
+    build:
+      context: ../.
+    depends_on:
+      - onlyoffice-graphite
+    environment:
+      - METRICS_ENABLED=${METRICS_ENABLED:-true}
+      - METRICS_HOST=${METRICS_HOST:-localhost}
+      - METRICS_PORT=${METRICS_PORT:-8125}
+      - METRICS_PREFIX=${METRICS_PREFIX:-ds.}
+    stdin_open: true
+    restart: always
+    expose:
+      - '2003'
+    ports:
+      - '80:80'
+    volumes:
+      - ./graphite/statsd:/var/www/onlyoffice/documentserver/server/Metrics/config
+
+  onlyoffice-graphite:
+    container_name: onlyoffice-graphite
+    image: graphiteapp/graphite-statsd
+    environment:
+      - GRAPHITE_STATSD_HOST=${GRAPHITE_STATSD_HOST:-onlyoffice-documentserver}
+      - GRAPHITE_TIME_ZONE=${GRAPHITE_TIME_ZONE:-Etc/UTC}
+    ports:
+      - '8888:80'
+    stdin_open: true
+    restart: always
diff --git a/tests/graphite/statsd/config.js b/tests/graphite/statsd/config.js
new file mode 100644
index 0000000..2ebffe6
--- /dev/null
+++ b/tests/graphite/statsd/config.js
@@ -0,0 +1,7 @@
+{
+  "graphiteHost": "onlyoffice-graphite",
+  "graphitePort": 2003,
+  "port": 8125,
+  "flushInterval": 60000,
+  "backends": [ "./backends/graphite.js" ]
+}