Jelajahi Sumber

Merge pull request #15241 from overleaf/em-gcp-opentelemetry

Replace the GCP trace agent with OpenTelemetry

GitOrigin-RevId: 591410029349e4ef5a39a5b79868e57c7bd089b6
Christopher Hoskin 2 tahun lalu
induk
melakukan
5855ba7b49

+ 6 - 4
libraries/metrics/README.md

@@ -5,10 +5,11 @@ Wrappers the [prom-client](https://github.com/siimon/prom-client) npm module to
 Use:
 
 ```
-const metrics = require('@overleaf/metrics')
-metrics.initialize('myapp')
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
 
 const express = require('express')
+const metrics = require('@overleaf/metrics')
 const app = express()
 metrics.injectMetricsRoute(app)
 ```
@@ -24,8 +25,9 @@ app.use(metrics.http.monitor(logger))
 The metrics module can be configured through the following environment variables:
 
 - `DEBUG_METRICS` - enables display of debugging messages to the console.
-- `ENABLE_TRACE_AGENT` - enables @google-cloud/trace-agent on Google Cloud
-- `ENABLE_PROFILE_AGENT` - enables @google-cloud/profiler on Google Cloud
+- `GCP_OPENTELEMETRY` - enables OpenTelemetry tracing for GCP
+- `JAEGER_OPENTELEMETRY` - enables OpenTelemetry tracing for Jaeger (in the dev environment)
+- `METRICS_APP_NAME` - the app label for metrics and spans
 - `METRICS_COMPRESSION_LEVEL` - sets the [compression level](https://www.npmjs.com/package/compression#level) for `/metrics`
 - `STACKDRIVER_LOGGING` - toggles the request logging format
 - `UV_THREADPOOL_SIZE` - sets the libuv [thread pool](http://docs.libuv.org/en/v1.x/threadpool.html) size

+ 1 - 62
libraries/metrics/index.js

@@ -1,72 +1,13 @@
 /* eslint-disable no-console */
-const os = require('os')
+
 const ExpressCompression = require('compression')
 const promClient = require('prom-client')
 const promWrapper = require('./prom_wrapper')
-const tracing = require('./tracing')
-
-const DEFAULT_APP_NAME = 'unknown'
 
-const { collectDefaultMetrics } = promWrapper
 const destructors = []
 
 require('./uv_threadpool_size')
 
-/**
- * Configure the metrics module
- */
-function configure(opts = {}) {
-  const appName = opts.appName || DEFAULT_APP_NAME
-  const hostname = os.hostname()
-  promClient.register.setDefaultLabels({ app: appName, host: hostname })
-  if (opts.ttlInMinutes) {
-    promWrapper.ttlInMinutes = opts.ttlInMinutes
-  }
-}
-
-let initialized = false
-
-/**
- * Configure the metrics module and start the default metrics collectors and
- * profiling agents.
- */
-function initialize(appName, opts = {}) {
-  if (initialized) {
-    return
-  }
-  appName = appName || DEFAULT_APP_NAME
-  if (tracing.tracingEnabled()) {
-    tracing.initialize(appName)
-  }
-  configure({ ...opts, appName })
-  collectDefaultMetrics({ timeout: 5000, prefix: '' })
-  promWrapper.setupSweeping()
-
-  console.log(`ENABLE_TRACE_AGENT set to ${process.env.ENABLE_TRACE_AGENT}`)
-  if (process.env.ENABLE_TRACE_AGENT === 'true') {
-    console.log('starting google trace agent')
-    const traceAgent = require('@google-cloud/trace-agent')
-
-    const traceOpts = { ignoreUrls: [/^\/status/, /^\/health_check/] }
-    traceAgent.start(traceOpts)
-  }
-
-  console.log(`ENABLE_PROFILE_AGENT set to ${process.env.ENABLE_PROFILE_AGENT}`)
-  if (process.env.ENABLE_PROFILE_AGENT === 'true') {
-    console.log('starting google profile agent')
-    const profiler = require('@google-cloud/profiler')
-    profiler.start({
-      serviceContext: {
-        service: appName,
-        version: process.env.BUILD_VERSION,
-      },
-    })
-  }
-
-  inc('process_startup')
-  initialized = true
-}
-
 function registerDestructor(func) {
   destructors.push(func)
 }
@@ -215,8 +156,6 @@ function close() {
   }
 }
 
-module.exports.configure = configure
-module.exports.initialize = initialize
 module.exports.registerDestructor = registerDestructor
 module.exports.injectMetricsRoute = injectMetricsRoute
 module.exports.buildPromKey = buildPromKey

+ 105 - 0
libraries/metrics/initialize.js

@@ -0,0 +1,105 @@
+/* eslint-disable no-console */
+
+/**
+ * This module initializes the metrics module. It should be imported once
+ * before any other module to support code instrumentation.
+ */
+
+const APP_NAME = process.env.METRICS_APP_NAME || 'unknown'
+const BUILD_VERSION = process.env.BUILD_VERSION
+const ENABLE_PROFILE_AGENT = process.env.ENABLE_PROFILE_AGENT === 'true'
+const GCP_OPENTELEMETRY = process.env.GCP_OPENTELEMETRY === 'true'
+const JAEGER_OPENTELEMETRY = process.env.JAEGER_OPENTELEMETRY === 'true'
+
+console.log('Initializing metrics')
+
+if (GCP_OPENTELEMETRY || JAEGER_OPENTELEMETRY) {
+  initializeOpenTelemetryInstrumentation()
+  initializeOpenTelemetryLogging()
+}
+
+if (ENABLE_PROFILE_AGENT) {
+  initializeProfileAgent()
+}
+
+initializePrometheus()
+initializePromWrapper()
+recordProcessStart()
+
+function initializeOpenTelemetryInstrumentation() {
+  console.log('Starting OpenTelemetry instrumentation')
+  const opentelemetry = require('@opentelemetry/sdk-node')
+  const {
+    getNodeAutoInstrumentations,
+  } = require('@opentelemetry/auto-instrumentations-node')
+  const { Resource } = require('@opentelemetry/resources')
+  const {
+    SemanticResourceAttributes,
+  } = require('@opentelemetry/semantic-conventions')
+
+  const resource = new Resource({
+    [SemanticResourceAttributes.SERVICE_NAME]: APP_NAME,
+    [SemanticResourceAttributes.SERVICE_NAMESPACE]: 'Overleaf',
+    'host.type': 'VM',
+  })
+
+  let exporter
+  if (GCP_OPENTELEMETRY) {
+    const GCP = require('@google-cloud/opentelemetry-cloud-trace-exporter')
+    exporter = new GCP.TraceExporter()
+  } else if (JAEGER_OPENTELEMETRY) {
+    const {
+      OTLPTraceExporter,
+    } = require('@opentelemetry/exporter-trace-otlp-http')
+    exporter = new OTLPTraceExporter({
+      url: `http://${process.env.JAEGER_HOST || 'jaeger'}:4318/v1/traces`,
+    })
+  } else {
+    return
+  }
+
+  const sdk = new opentelemetry.NodeSDK({
+    traceExporter: exporter,
+    logger: console,
+    instrumentations: [getNodeAutoInstrumentations()],
+    resource,
+  })
+  sdk.start()
+}
+
+function initializeOpenTelemetryLogging() {
+  const {
+    diag,
+    DiagConsoleLogger,
+    DiagLogLevel,
+  } = require('@opentelemetry/api')
+  diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO)
+}
+
+function initializeProfileAgent() {
+  console.log('Starting Google Profile Agent')
+  const profiler = require('@google-cloud/profiler')
+  profiler.start({
+    serviceContext: {
+      service: APP_NAME,
+      version: BUILD_VERSION,
+    },
+  })
+}
+
+function initializePrometheus() {
+  const os = require('os')
+  const promClient = require('prom-client')
+  promClient.register.setDefaultLabels({ app: APP_NAME, host: os.hostname() })
+  promClient.collectDefaultMetrics({ timeout: 5000, prefix: '' })
+}
+
+function initializePromWrapper() {
+  const promWrapper = require('./prom_wrapper')
+  promWrapper.setupSweeping()
+}
+
+function recordProcessStart() {
+  const metrics = require('.')
+  metrics.inc('process_startup')
+}

+ 0 - 1
libraries/metrics/package.json

@@ -9,7 +9,6 @@
   "dependencies": {
     "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0",
     "@google-cloud/profiler": "^6.0.0",
-    "@google-cloud/trace-agent": "^7.1.2",
     "@opentelemetry/api": "^1.4.1",
     "@opentelemetry/auto-instrumentations-node": "^0.39.1",
     "@opentelemetry/exporter-trace-otlp-http": "^0.41.2",

+ 2 - 1
libraries/metrics/test/acceptance/metrics_tests.js

@@ -10,7 +10,8 @@ const sleep = promisify(setTimeout)
 
 describe('Metrics module', function () {
   before(function () {
-    Metrics.initialize(APP_NAME)
+    process.env.METRICS_APP_NAME = 'test-app'
+    require('../../initialize')
   })
 
   describe('at startup', function () {

+ 0 - 62
libraries/metrics/tracing.js

@@ -1,62 +0,0 @@
-let tracer
-
-function tracingEnabled() {
-  return process.env.GCP_OPENTELEMETRY || process.env.JAEGER_OPENTELEMETRY
-}
-
-function initialize(appName) {
-  const opentelemetry = require('@opentelemetry/sdk-node')
-  const {
-    getNodeAutoInstrumentations,
-  } = require('@opentelemetry/auto-instrumentations-node')
-  const {
-    diag,
-    DiagConsoleLogger,
-    DiagLogLevel,
-    trace,
-  } = require('@opentelemetry/api')
-  const {
-    OTLPTraceExporter,
-  } = require('@opentelemetry/exporter-trace-otlp-http')
-  const { Resource } = require('@opentelemetry/resources')
-  const {
-    SemanticResourceAttributes,
-  } = require('@opentelemetry/semantic-conventions')
-  const GCP = require('@google-cloud/opentelemetry-cloud-trace-exporter')
-
-  diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO)
-
-  const resource = new Resource({
-    [SemanticResourceAttributes.SERVICE_NAME]: appName,
-    [SemanticResourceAttributes.SERVICE_NAMESPACE]: 'Overleaf',
-    'host.type': 'VM',
-  })
-
-  let exporter
-  if (process.env.GCP_OPENTELEMETRY) {
-    exporter = new GCP.TraceExporter()
-  } else if (process.env.JAEGER_OPENTELEMETRY) {
-    exporter = new OTLPTraceExporter({
-      url: `http://${process.env.JAEGER_HOST || 'jaeger'}:4318/v1/traces`,
-    })
-  } else {
-    return
-  }
-
-  const sdk = new opentelemetry.NodeSDK({
-    traceExporter: exporter,
-    logger: console,
-
-    instrumentations: [getNodeAutoInstrumentations()],
-    resource,
-  })
-
-  tracer = trace.getTracer(appName)
-  sdk.start()
-}
-
-function getTracer() {
-  return tracer
-}
-
-module.exports = { initialize, getTracer, tracingEnabled }

+ 44 - 644
package-lock.json

@@ -284,7 +284,6 @@
       "dependencies": {
         "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0",
         "@google-cloud/profiler": "^6.0.0",
-        "@google-cloud/trace-agent": "^7.1.2",
         "@opentelemetry/api": "^1.4.1",
         "@opentelemetry/auto-instrumentations-node": "^0.39.1",
         "@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
@@ -4196,9 +4195,13 @@
       }
     },
     "node_modules/@google-cloud/logging-min/node_modules/uuid": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -4533,9 +4536,9 @@
       }
     },
     "node_modules/@google-cloud/profiler/node_modules/gaxios": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.0.tgz",
-      "integrity": "sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz",
+      "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==",
       "dependencies": {
         "extend": "^3.0.2",
         "https-proxy-agent": "^7.0.1",
@@ -4547,9 +4550,9 @@
       }
     },
     "node_modules/@google-cloud/profiler/node_modules/gaxios/node_modules/https-proxy-agent": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
-      "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+      "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
       "dependencies": {
         "agent-base": "^7.0.2",
         "debug": "4"
@@ -4571,9 +4574,9 @@
       }
     },
     "node_modules/@google-cloud/profiler/node_modules/google-auth-library": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.0.0.tgz",
-      "integrity": "sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.1.0.tgz",
+      "integrity": "sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==",
       "dependencies": {
         "base64-js": "^1.3.0",
         "ecdsa-sig-formatter": "^1.0.11",
@@ -4681,9 +4684,13 @@
       "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
     },
     "node_modules/@google-cloud/profiler/node_modules/uuid": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -4905,201 +4912,6 @@
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
-    "node_modules/@google-cloud/trace-agent": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-7.1.2.tgz",
-      "integrity": "sha512-LcPKMM80bBvaUG3Nb1R4FPYlGZQX/tDMmwN9bx3ML954W61Pj8D3bjwIleSWO36lIdo0tl+Cz6UHJEOKLSNcvw==",
-      "dependencies": {
-        "@google-cloud/common": "^4.0.0",
-        "@opencensus/propagation-stackdriver": "0.1.0",
-        "builtin-modules": "^3.0.0",
-        "console-log-level": "^1.4.0",
-        "continuation-local-storage": "^3.2.1",
-        "extend": "^3.0.2",
-        "gcp-metadata": "^5.0.0",
-        "google-auth-library": "^8.0.2",
-        "hex2dec": "^1.0.1",
-        "is": "^3.2.0",
-        "methods": "^1.1.1",
-        "require-in-the-middle": "^5.0.0",
-        "semver": "^7.0.0",
-        "shimmer": "^1.2.0",
-        "source-map-support": "^0.5.16",
-        "uuid": "^9.0.0"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/@google-cloud/common": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
-      "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==",
-      "dependencies": {
-        "@google-cloud/projectify": "^3.0.0",
-        "@google-cloud/promisify": "^3.0.0",
-        "arrify": "^2.0.1",
-        "duplexify": "^4.1.1",
-        "ent": "^2.2.0",
-        "extend": "^3.0.2",
-        "google-auth-library": "^8.0.2",
-        "retry-request": "^5.0.0",
-        "teeny-request": "^8.0.0"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/@google-cloud/projectify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
-      "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==",
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/@google-cloud/promisify": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
-      "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/duplexify": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
-      "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
-      "dependencies": {
-        "end-of-stream": "^1.4.1",
-        "inherits": "^2.0.3",
-        "readable-stream": "^3.1.1",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/gcp-metadata": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
-      "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
-      "dependencies": {
-        "gaxios": "^5.0.0",
-        "json-bigint": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/google-auth-library": {
-      "version": "8.9.0",
-      "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz",
-      "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==",
-      "dependencies": {
-        "arrify": "^2.0.0",
-        "base64-js": "^1.3.0",
-        "ecdsa-sig-formatter": "^1.0.11",
-        "fast-text-encoding": "^1.0.0",
-        "gaxios": "^5.0.0",
-        "gcp-metadata": "^5.3.0",
-        "gtoken": "^6.1.0",
-        "jws": "^4.0.0",
-        "lru-cache": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/google-p12-pem": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
-      "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
-      "dependencies": {
-        "node-forge": "^1.3.1"
-      },
-      "bin": {
-        "gp12-pem": "build/src/bin/gp12-pem.js"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/gtoken": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
-      "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
-      "dependencies": {
-        "gaxios": "^5.0.1",
-        "google-p12-pem": "^4.0.0",
-        "jws": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/retry-request": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
-      "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
-      "dependencies": {
-        "debug": "^4.1.1",
-        "extend": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/semver": {
-      "version": "7.5.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/teeny-request": {
-      "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz",
-      "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==",
-      "dependencies": {
-        "http-proxy-agent": "^5.0.0",
-        "https-proxy-agent": "^5.0.0",
-        "node-fetch": "^2.6.1",
-        "stream-events": "^1.0.5",
-        "uuid": "^9.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/uuid": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
-    "node_modules/@google-cloud/trace-agent/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
     "node_modules/@grpc/grpc-js": {
       "version": "1.8.21",
       "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.21.tgz",
@@ -6202,77 +6014,6 @@
         "@octokit/openapi-types": "^11.2.0"
       }
     },
-    "node_modules/@opencensus/core": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.1.0.tgz",
-      "integrity": "sha512-Bdbi5vi44a1fwyHNyKh6bwzuFZJeZJPhzdwogk/Kw5juoEeRGPworK1sgtB3loeR8cqLyi5us0mz9h0xqINiSQ==",
-      "dependencies": {
-        "continuation-local-storage": "^3.2.1",
-        "log-driver": "^1.2.7",
-        "semver": "^7.0.0",
-        "shimmer": "^1.2.0",
-        "uuid": "^8.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@opencensus/core/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@opencensus/core/node_modules/semver": {
-      "version": "7.5.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@opencensus/core/node_modules/uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
-    "node_modules/@opencensus/core/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "node_modules/@opencensus/propagation-stackdriver": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.1.0.tgz",
-      "integrity": "sha512-YLklu8jnnYKaJ8gUFz3rM0FVdsWXEJAMLzeeU4JRac6LI34raENy4kvRezZtNEFS5KthaJUsYg04sPc/Ag0w4w==",
-      "dependencies": {
-        "@opencensus/core": "^0.1.0",
-        "hex2dec": "^1.0.1",
-        "uuid": "^8.0.0"
-      }
-    },
-    "node_modules/@opencensus/propagation-stackdriver/node_modules/uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
     "node_modules/@opentelemetry/api": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
@@ -17115,9 +16856,9 @@
       }
     },
     "node_modules/@types/console-log-level": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.2.tgz",
-      "integrity": "sha512-TnhDAntcJthcCMrR3OAKAUjgHyQgoms1yaBJepGv+BtXi8PLf8aX2L/NMCfofRTpVqW0bLklpGTsuqmUSCR2Uw=="
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.3.tgz",
+      "integrity": "sha512-B6Mzad6H4RugduMX84ehFVvGM/JRAd9lZQk4a6dztB4+zcIUehIjKrbWH/nHO2+0wwx05rgyqjXBvOjAv0uL6A=="
     },
     "node_modules/@types/content-disposition": {
       "version": "0.5.5",
@@ -19046,26 +18787,6 @@
       "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
       "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
     },
-    "node_modules/async-listener": {
-      "version": "0.6.10",
-      "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
-      "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==",
-      "dependencies": {
-        "semver": "^5.3.0",
-        "shimmer": "^1.1.0"
-      },
-      "engines": {
-        "node": "<=0.11.8 || >0.11.10"
-      }
-    },
-    "node_modules/async-listener/node_modules/semver": {
-      "version": "5.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
     "node_modules/async-retry": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
@@ -20189,17 +19910,6 @@
         "node": ">= 0.10.x"
       }
     },
-    "node_modules/builtin-modules": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
-      "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/builtins": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/builtins/-/builtins-4.1.0.tgz",
@@ -21575,15 +21285,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/continuation-local-storage": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
-      "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==",
-      "dependencies": {
-        "async-listener": "^0.6.0",
-        "emitter-listener": "^1.1.1"
-      }
-    },
     "node_modules/convert-source-map": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@@ -24185,14 +23886,6 @@
       "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
       "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw=="
     },
-    "node_modules/emitter-listener": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz",
-      "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==",
-      "dependencies": {
-        "shimmer": "^1.2.0"
-      }
-    },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -28416,11 +28109,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/hex2dec": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz",
-      "integrity": "sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA=="
-    },
     "node_modules/hexer": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz",
@@ -31653,14 +31341,6 @@
         "uni-global": "^1.0.0"
       }
     },
-    "node_modules/log-driver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
-      "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==",
-      "engines": {
-        "node": ">=0.8.6"
-      }
-    },
     "node_modules/log-symbols": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -36941,16 +36621,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/require-in-the-middle": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz",
-      "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==",
-      "dependencies": {
-        "debug": "^4.1.1",
-        "module-details-from-path": "^1.0.3",
-        "resolve": "^1.12.0"
-      }
-    },
     "node_modules/require-like": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
@@ -42227,7 +41897,6 @@
         "@google-cloud/bigquery": "^5.6.0",
         "@overleaf/fetch-utils": "*",
         "@overleaf/logger": "*",
-        "@overleaf/metrics": "*",
         "@overleaf/o-error": "*",
         "@overleaf/settings": "*",
         "bunyan": "^1.8.15",
@@ -48203,9 +47872,9 @@
           }
         },
         "uuid": {
-          "version": "9.0.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-          "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+          "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
         },
         "yallist": {
           "version": "4.0.0",
@@ -48329,9 +47998,9 @@
           }
         },
         "gaxios": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.0.tgz",
-          "integrity": "sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w==",
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz",
+          "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==",
           "requires": {
             "extend": "^3.0.2",
             "https-proxy-agent": "^7.0.1",
@@ -48340,9 +48009,9 @@
           },
           "dependencies": {
             "https-proxy-agent": {
-              "version": "7.0.1",
-              "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
-              "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+              "version": "7.0.2",
+              "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+              "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
               "requires": {
                 "agent-base": "^7.0.2",
                 "debug": "4"
@@ -48360,9 +48029,9 @@
           }
         },
         "google-auth-library": {
-          "version": "9.0.0",
-          "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.0.0.tgz",
-          "integrity": "sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==",
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.1.0.tgz",
+          "integrity": "sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==",
           "requires": {
             "base64-js": "^1.3.0",
             "ecdsa-sig-formatter": "^1.0.11",
@@ -48438,9 +48107,9 @@
           "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
         },
         "uuid": {
-          "version": "9.0.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-          "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+          "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
         },
         "webidl-conversions": {
           "version": "3.0.1",
@@ -48614,158 +48283,6 @@
         }
       }
     },
-    "@google-cloud/trace-agent": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-7.1.2.tgz",
-      "integrity": "sha512-LcPKMM80bBvaUG3Nb1R4FPYlGZQX/tDMmwN9bx3ML954W61Pj8D3bjwIleSWO36lIdo0tl+Cz6UHJEOKLSNcvw==",
-      "requires": {
-        "@google-cloud/common": "^4.0.0",
-        "@opencensus/propagation-stackdriver": "0.1.0",
-        "builtin-modules": "^3.0.0",
-        "console-log-level": "^1.4.0",
-        "continuation-local-storage": "^3.2.1",
-        "extend": "^3.0.2",
-        "gcp-metadata": "^5.0.0",
-        "google-auth-library": "^8.0.2",
-        "hex2dec": "^1.0.1",
-        "is": "^3.2.0",
-        "methods": "^1.1.1",
-        "require-in-the-middle": "^5.0.0",
-        "semver": "^7.0.0",
-        "shimmer": "^1.2.0",
-        "source-map-support": "^0.5.16",
-        "uuid": "^9.0.0"
-      },
-      "dependencies": {
-        "@google-cloud/common": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
-          "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==",
-          "requires": {
-            "@google-cloud/projectify": "^3.0.0",
-            "@google-cloud/promisify": "^3.0.0",
-            "arrify": "^2.0.1",
-            "duplexify": "^4.1.1",
-            "ent": "^2.2.0",
-            "extend": "^3.0.2",
-            "google-auth-library": "^8.0.2",
-            "retry-request": "^5.0.0",
-            "teeny-request": "^8.0.0"
-          }
-        },
-        "@google-cloud/projectify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
-          "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA=="
-        },
-        "@google-cloud/promisify": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
-          "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA=="
-        },
-        "duplexify": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
-          "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
-          "requires": {
-            "end-of-stream": "^1.4.1",
-            "inherits": "^2.0.3",
-            "readable-stream": "^3.1.1",
-            "stream-shift": "^1.0.0"
-          }
-        },
-        "gcp-metadata": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
-          "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
-          "requires": {
-            "gaxios": "^5.0.0",
-            "json-bigint": "^1.0.0"
-          }
-        },
-        "google-auth-library": {
-          "version": "8.9.0",
-          "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz",
-          "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==",
-          "requires": {
-            "arrify": "^2.0.0",
-            "base64-js": "^1.3.0",
-            "ecdsa-sig-formatter": "^1.0.11",
-            "fast-text-encoding": "^1.0.0",
-            "gaxios": "^5.0.0",
-            "gcp-metadata": "^5.3.0",
-            "gtoken": "^6.1.0",
-            "jws": "^4.0.0",
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "google-p12-pem": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
-          "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
-          "requires": {
-            "node-forge": "^1.3.1"
-          }
-        },
-        "gtoken": {
-          "version": "6.1.2",
-          "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
-          "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
-          "requires": {
-            "gaxios": "^5.0.1",
-            "google-p12-pem": "^4.0.0",
-            "jws": "^4.0.0"
-          }
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "retry-request": {
-          "version": "5.0.2",
-          "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
-          "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
-          "requires": {
-            "debug": "^4.1.1",
-            "extend": "^3.0.2"
-          }
-        },
-        "semver": {
-          "version": "7.5.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "teeny-request": {
-          "version": "8.0.3",
-          "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz",
-          "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==",
-          "requires": {
-            "http-proxy-agent": "^5.0.0",
-            "https-proxy-agent": "^5.0.0",
-            "node-fetch": "^2.6.1",
-            "stream-events": "^1.0.5",
-            "uuid": "^9.0.0"
-          }
-        },
-        "uuid": {
-          "version": "9.0.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
-          "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-        }
-      }
-    },
     "@grpc/grpc-js": {
       "version": "1.8.21",
       "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.21.tgz",
@@ -49678,63 +49195,6 @@
         "@octokit/openapi-types": "^11.2.0"
       }
     },
-    "@opencensus/core": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.1.0.tgz",
-      "integrity": "sha512-Bdbi5vi44a1fwyHNyKh6bwzuFZJeZJPhzdwogk/Kw5juoEeRGPworK1sgtB3loeR8cqLyi5us0mz9h0xqINiSQ==",
-      "requires": {
-        "continuation-local-storage": "^3.2.1",
-        "log-driver": "^1.2.7",
-        "semver": "^7.0.0",
-        "shimmer": "^1.2.0",
-        "uuid": "^8.0.0"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.5.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "uuid": {
-          "version": "8.3.2",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
-        },
-        "yallist": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-        }
-      }
-    },
-    "@opencensus/propagation-stackdriver": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.1.0.tgz",
-      "integrity": "sha512-YLklu8jnnYKaJ8gUFz3rM0FVdsWXEJAMLzeeU4JRac6LI34raENy4kvRezZtNEFS5KthaJUsYg04sPc/Ag0w4w==",
-      "requires": {
-        "@opencensus/core": "^0.1.0",
-        "hex2dec": "^1.0.1",
-        "uuid": "^8.0.0"
-      },
-      "dependencies": {
-        "uuid": {
-          "version": "8.3.2",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
-        }
-      }
-    },
     "@opentelemetry/api": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
@@ -50897,7 +50357,6 @@
         "@google-cloud/bigquery": "^5.6.0",
         "@overleaf/fetch-utils": "*",
         "@overleaf/logger": "*",
-        "@overleaf/metrics": "*",
         "@overleaf/o-error": "*",
         "@overleaf/settings": "*",
         "bunyan": "^1.8.15",
@@ -51477,7 +50936,6 @@
       "requires": {
         "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0",
         "@google-cloud/profiler": "^6.0.0",
-        "@google-cloud/trace-agent": "^7.1.2",
         "@opentelemetry/api": "^1.4.1",
         "@opentelemetry/auto-instrumentations-node": "^0.39.1",
         "@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
@@ -59687,9 +59145,9 @@
       }
     },
     "@types/console-log-level": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.2.tgz",
-      "integrity": "sha512-TnhDAntcJthcCMrR3OAKAUjgHyQgoms1yaBJepGv+BtXi8PLf8aX2L/NMCfofRTpVqW0bLklpGTsuqmUSCR2Uw=="
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.3.tgz",
+      "integrity": "sha512-B6Mzad6H4RugduMX84ehFVvGM/JRAd9lZQk4a6dztB4+zcIUehIjKrbWH/nHO2+0wwx05rgyqjXBvOjAv0uL6A=="
     },
     "@types/content-disposition": {
       "version": "0.5.5",
@@ -61378,22 +60836,6 @@
       "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
       "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
     },
-    "async-listener": {
-      "version": "0.6.10",
-      "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
-      "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==",
-      "requires": {
-        "semver": "^5.3.0",
-        "shimmer": "^1.1.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-          "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
-        }
-      }
-    },
     "async-retry": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
@@ -62256,11 +61698,6 @@
         "xtend": "^4.0.0"
       }
     },
-    "builtin-modules": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
-      "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw=="
-    },
     "builtins": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/builtins/-/builtins-4.1.0.tgz",
@@ -63327,15 +62764,6 @@
         "qs": "^6.9.4"
       }
     },
-    "continuation-local-storage": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
-      "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==",
-      "requires": {
-        "async-listener": "^0.6.0",
-        "emitter-listener": "^1.1.1"
-      }
-    },
     "convert-source-map": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@@ -65247,14 +64675,6 @@
       "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
       "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw=="
     },
-    "emitter-listener": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz",
-      "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==",
-      "requires": {
-        "shimmer": "^1.2.0"
-      }
-    },
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -68466,11 +67886,6 @@
         }
       }
     },
-    "hex2dec": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz",
-      "integrity": "sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA=="
-    },
     "hexer": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz",
@@ -70974,11 +70389,6 @@
         "uni-global": "^1.0.0"
       }
     },
-    "log-driver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
-      "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg=="
-    },
     "log-symbols": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -75204,16 +74614,6 @@
       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
     },
-    "require-in-the-middle": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz",
-      "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==",
-      "requires": {
-        "debug": "^4.1.1",
-        "module-details-from-path": "^1.0.3",
-        "resolve": "^1.12.0"
-      }
-    },
     "require-like": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",

+ 3 - 0
services/chat/app.js

@@ -1,3 +1,6 @@
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+
 import logger from '@overleaf/logger'
 import settings from '@overleaf/settings'
 import { mongoClient } from './app/js/mongodb.js'

+ 0 - 1
services/chat/app/js/server.js

@@ -9,7 +9,6 @@ import * as messagesController from './Features/Messages/MessageHttpController.j
 
 const __dirname = fileURLToPath(new URL('.', import.meta.url))
 
-metrics.initialize('chat')
 logger.initialize('chat')
 metrics.open_sockets.monitor()
 

+ 3 - 2
services/clsi/app.js

@@ -1,5 +1,5 @@
-const Metrics = require('@overleaf/metrics')
-Metrics.initialize('clsi')
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
 
 const CompileController = require('./app/js/CompileController')
 const ContentController = require('./app/js/ContentController')
@@ -9,6 +9,7 @@ logger.initialize('clsi')
 if (Settings.sentry.dsn != null) {
   logger.initializeErrorReporting(Settings.sentry.dsn)
 }
+const Metrics = require('@overleaf/metrics')
 
 const smokeTest = require('./test/smoke/js/SmokeTests')
 const ContentTypeMapper = require('./app/js/ContentTypeMapper')

+ 3 - 0
services/contacts/app.js

@@ -1,3 +1,6 @@
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+
 import logger from '@overleaf/logger'
 import Settings from '@overleaf/settings'
 import { mongoClient } from './app/js/mongodb.js'

+ 0 - 1
services/contacts/app/js/server.js

@@ -5,7 +5,6 @@ import bodyParser from 'body-parser'
 import * as HttpController from './HttpController.js'
 import * as Errors from './Errors.js'
 
-Metrics.initialize('contacts')
 logger.initialize('contacts')
 Metrics.event_loop?.monitor(logger)
 Metrics.open_sockets.monitor()

+ 14 - 20
services/docstore/app.js

@@ -1,12 +1,8 @@
-/*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS207: Consider shorter variations of null checks
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
+
 const Events = require('events')
 const Metrics = require('@overleaf/metrics')
-Metrics.initialize('docstore')
 const Settings = require('@overleaf/settings')
 const logger = require('@overleaf/logger')
 const express = require('express')
@@ -36,18 +32,18 @@ app.use(Metrics.http.monitor(logger))
 Metrics.injectMetricsRoute(app)
 
 app.param('project_id', function (req, res, next, projectId) {
-  if (projectId != null ? projectId.match(/^[0-9a-f]{24}$/) : undefined) {
-    return next()
+  if (projectId?.match(/^[0-9a-f]{24}$/)) {
+    next()
   } else {
-    return next(new Error('invalid project id'))
+    next(new Error('invalid project id'))
   }
 })
 
 app.param('doc_id', function (req, res, next, docId) {
-  if (docId != null ? docId.match(/^[0-9a-f]{24}$/) : undefined) {
-    return next()
+  if (docId?.match(/^[0-9a-f]{24}$/)) {
+    next()
   } else {
-    return next(new Error('invalid doc id'))
+    next(new Error('invalid doc id'))
   }
 })
 
@@ -93,13 +89,13 @@ app.use(handleValidationErrors())
 app.use(function (error, req, res, next) {
   logger.error({ err: error, req }, 'request errored')
   if (error instanceof Errors.NotFoundError) {
-    return res.sendStatus(404)
+    res.sendStatus(404)
   } else if (error instanceof Errors.DocModifiedError) {
-    return res.sendStatus(409)
+    res.sendStatus(409)
   } else if (error instanceof Errors.DocVersionDecrementedError) {
-    return res.sendStatus(409)
+    res.sendStatus(409)
   } else {
-    return res.status(500).send('Oops, something went wrong')
+    res.status(500).send('Oops, something went wrong')
   }
 })
 
@@ -116,9 +112,7 @@ if (!module.parent) {
           logger.fatal({ err }, `Cannot bind to ${host}:${port}. Exiting.`)
           process.exit(1)
         }
-        return logger.debug(
-          `Docstore starting up, listening on ${host}:${port}`
-        )
+        logger.debug(`Docstore starting up, listening on ${host}:${port}`)
       })
       server.timeout = 120000
       server.keepAliveTimeout = 5000

+ 3 - 2
services/document-updater/app.js

@@ -1,6 +1,7 @@
-const Metrics = require('@overleaf/metrics')
-Metrics.initialize('doc-updater')
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
 
+const Metrics = require('@overleaf/metrics')
 const express = require('express')
 const Settings = require('@overleaf/settings')
 const logger = require('@overleaf/logger')

+ 3 - 1
services/filestore/app.js

@@ -1,6 +1,8 @@
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
+
 const Events = require('events')
 const Metrics = require('@overleaf/metrics')
-Metrics.initialize(process.env.METRICS_APP_NAME || 'filestore')
 
 const logger = require('@overleaf/logger')
 logger.initialize(process.env.METRICS_APP_NAME || 'filestore')

+ 0 - 5
services/git-bridge/Dockerfile

@@ -35,11 +35,6 @@ RUN mkdir -p /opt/cprof && \
   wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
   | tar xzv -C /opt/cprof
 
-# Install Google Cloud Debugger agent
-RUN mkdir /opt/cdbg && \
-  wget -qO- https://storage.googleapis.com/cloud-debugger/compute-java/debian-wheezy/cdbg_java_agent_gce.tar.gz | \
-  tar xvz -C /opt/cdbg
-
 RUN useradd --create-home node
 
 COPY --from=builder /git-bridge.jar /

+ 0 - 4
services/git-bridge/start.sh

@@ -12,8 +12,4 @@ if [ "$ENABLE_PROFILE_AGENT" == "true" ]; then
   GIT_BRIDGE_JVM_ARGS="-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=git-bridge,-cprof_service_version=${VERSION},-cprof_enable_heap_sampling=true ${GIT_BRIDGE_JVM_ARGS}"
 fi
 
-if [ "$ENABLE_DEBUG_AGENT" == "true" ]; then
-  GIT_BRIDGE_JVM_ARGS="-agentpath:/opt/cdbg/cdbg_java_agent.so -Dcom.google.cdbg.module=git-bridge -Dcom.google.cdbg.version=$VERSION ${GIT_BRIDGE_JVM_ARGS}"
-fi
-
 exec java $GIT_BRIDGE_JVM_ARGS -jar /git-bridge.jar /conf/runtime.json

+ 3 - 4
services/history-v1/app.js

@@ -2,10 +2,8 @@
 
 /* eslint-disable no-console */
 
-// Initialize metrics as early as possible because this is where the Google
-// profiling agents are also started.
-const Metrics = require('@overleaf/metrics')
-Metrics.initialize('history-v1')
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
 
 const Events = require('events')
 const BPromise = require('bluebird')
@@ -14,6 +12,7 @@ const cors = require('cors')
 const helmet = require('helmet')
 const HTTPStatus = require('http-status')
 const logger = require('@overleaf/logger')
+const Metrics = require('@overleaf/metrics')
 const cookieParser = require('cookie-parser')
 const bodyParser = require('body-parser')
 const swaggerTools = require('swagger-tools')

+ 0 - 3
services/history-v1/storage/lib/metrics.js

@@ -1,3 +0,0 @@
-const metrics = require('@overleaf/metrics')
-metrics.configure({ appName: 'history-v1' })
-module.exports = metrics

+ 1 - 1
services/history-v1/storage/lib/persistor.js

@@ -1,6 +1,6 @@
 const _ = require('lodash')
 const config = require('config')
-const metrics = require('./metrics')
+const metrics = require('@overleaf/metrics')
 const objectPersistor = require('@overleaf/object-persistor')
 
 const persistorConfig = _.cloneDeep(config.get('persistor'))

+ 8 - 27
services/notifications/app.js

@@ -1,12 +1,7 @@
-/*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS103: Rewrite code to no longer use __guard__
- * DS207: Consider shorter variations of null checks
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
+
 const metrics = require('@overleaf/metrics')
-metrics.initialize('notifications')
 const Settings = require('@overleaf/settings')
 const logger = require('@overleaf/logger')
 logger.initialize('notifications-sharelatex')
@@ -43,27 +38,19 @@ app.get('/status', (req, res) => res.send('notifications sharelatex up'))
 
 app.get('/health_check', (req, res) =>
   HealthCheckController.check(function (err) {
-    if (err != null) {
+    if (err) {
       logger.err({ err }, 'error performing health check')
-      return res.sendStatus(500)
+      res.sendStatus(500)
     } else {
-      return res.sendStatus(200)
+      res.sendStatus(200)
     }
   })
 )
 
 app.get('*', (req, res) => res.sendStatus(404))
 
-const host =
-  __guard__(
-    Settings.internal != null ? Settings.internal.notifications : undefined,
-    x => x.host
-  ) || 'localhost'
-const port =
-  __guard__(
-    Settings.internal != null ? Settings.internal.notifications : undefined,
-    x1 => x1.port
-  ) || 3042
+const host = Settings.internal?.notifications?.host || 'localhost'
+const port = Settings.internal?.notifications?.port || 3042
 
 mongoClient
   .connect()
@@ -76,9 +63,3 @@ mongoClient
     logger.fatal({ err }, 'Cannot connect to mongo. Exiting.')
     process.exit(1)
   })
-
-function __guard__(value, transform) {
-  return typeof value !== 'undefined' && value !== null
-    ? transform(value)
-    : undefined
-}

+ 3 - 0
services/project-history/app.js

@@ -1,3 +1,6 @@
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+
 import Settings from '@overleaf/settings'
 import logger from '@overleaf/logger'
 import OError from '@overleaf/o-error'

+ 0 - 1
services/project-history/app/js/server.js

@@ -13,7 +13,6 @@ if (Settings.sentry.dsn) {
   logger.initializeErrorReporting(Settings.sentry.dsn)
 }
 
-Metrics.initialize('project-history')
 Metrics.event_loop.monitor(logger)
 Metrics.memory.monitor(logger)
 Metrics.leaked_sockets.monitor(logger)

+ 3 - 1
services/real-time/app.js

@@ -1,6 +1,8 @@
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
+
 const Metrics = require('@overleaf/metrics')
 const Settings = require('@overleaf/settings')
-Metrics.initialize(process.env.METRICS_APP_NAME || 'real-time')
 const async = require('async')
 
 const logger = require('@overleaf/logger')

+ 3 - 0
services/spelling/app.js

@@ -1,3 +1,6 @@
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+
 import Settings from '@overleaf/settings'
 import logger from '@overleaf/logger'
 import { app } from './app/js/server.js'

+ 0 - 1
services/spelling/app/js/server.js

@@ -6,7 +6,6 @@ import bodyParser from 'body-parser'
 import * as SpellingAPIController from './SpellingAPIController.js'
 import * as HealthCheckController from './HealthCheckController.js'
 
-metrics.initialize('spelling')
 logger.initialize('spelling')
 if (Settings.sentry?.dsn != null) {
   logger.initializeErrorReporting(Settings.sentry.dsn)

+ 4 - 13
services/web/app.js

@@ -1,16 +1,7 @@
-/* eslint-disable
-    max-len,
-*/
-// TODO: This file was created by bulk-decaffeinate.
-// Fix any style issues and re-enable lint.
-/*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS207: Consider shorter variations of null checks
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
+// Metrics must be initialized before importing anything else
+require('@overleaf/metrics/initialize')
+
 const metrics = require('@overleaf/metrics')
-metrics.initialize(process.env.METRICS_APP_NAME || 'web')
 const Settings = require('@overleaf/settings')
 const logger = require('@overleaf/logger')
 const PlansLocator = require('./app/src/Features/Subscription/PlansLocator')
@@ -24,7 +15,7 @@ logger.logger.serializers.files =
   require('./app/src/infrastructure/LoggerSerializers').files
 logger.logger.serializers.project =
   require('./app/src/infrastructure/LoggerSerializers').project
-if ((Settings.sentry != null ? Settings.sentry.dsn : undefined) != null) {
+if (Settings.sentry?.dsn != null) {
   logger.initializeErrorReporting(Settings.sentry.dsn)
 }