Browse Source

Pull out metric middleware logic (#2854)

* Pull out metric middleware logic

* improve number conversion

* change logic as discussed in PR

* npm run build:locale-pack
Mikael Finstad 4 years ago
parent
commit
d8d27ad1f1

+ 5 - 0
packages/@uppy/companion/src/companion.js

@@ -73,6 +73,11 @@ module.exports.app = (options = {}) => {
   emitter(options.multipleInstances && options.redisUrl, options.redisPubSubScope)
 
   const app = express()
+
+  if (options.metrics) {
+    app.use(middlewares.metrics())
+  }
+
   app.use(cookieParser()) // server tokens are added to cookies
 
   app.use(interceptGrantErrorResponse)

+ 19 - 0
packages/@uppy/companion/src/server/middlewares.js

@@ -1,6 +1,10 @@
 const uniq = require('lodash/uniq')
 const cors = require('cors')
+// @ts-ignore
+const promBundle = require('express-prom-bundle')
 
+// @ts-ignore
+const { version } = require('../../package.json')
 const tokenService = require('./helpers/jwt')
 const logger = require('./logger')
 
@@ -113,3 +117,18 @@ exports.cors = (options = {}) => (req, res, next) => {
     exposedHeaders: exposedHeaders.join(','),
   })(req, res, next)
 }
+
+exports.metrics = () => {
+  const metricsMiddleware = promBundle({ includeMethod: true })
+  // @ts-ignore Not in the typings, but it does exist
+  const { promClient } = metricsMiddleware
+  const { collectDefaultMetrics } = promClient
+  collectDefaultMetrics({ register: promClient.register })
+
+  // Add version as a prometheus gauge
+  const versionGauge = new promClient.Gauge({ name: 'companion_version', help: 'npm version as an integer' })
+  // @ts-ignore
+  const numberVersion = Number(version.replace(/\D/g, ''))
+  versionGauge.set(numberVersion)
+  return metricsMiddleware
+}

+ 6 - 22
packages/@uppy/companion/src/standalone/index.js

@@ -5,16 +5,13 @@ const morgan = require('morgan')
 const bodyParser = require('body-parser')
 const { URL } = require('url')
 const merge = require('lodash/merge')
-// @ts-ignore
-const promBundle = require('express-prom-bundle')
 const session = require('express-session')
 const addRequestId = require('express-request-id')()
 const logger = require('../server/logger')
 const redis = require('../server/redis')
 const companion = require('../companion')
 const helper = require('./helper')
-// @ts-ignore
-const { version } = require('../../package.json')
+const middlewares = require('../server/middlewares')
 
 /**
  * Configures an Express app for running Companion standalone
@@ -24,22 +21,6 @@ const { version } = require('../../package.json')
 function server (inputCompanionOptions = {}) {
   const app = express()
 
-  // for server metrics tracking.
-  let metricsMiddleware
-  if (process.env.COMPANION_HIDE_METRICS !== 'true') {
-    metricsMiddleware = promBundle({ includeMethod: true })
-    // @ts-ignore Not in the typings, but it does exist
-    const { promClient } = metricsMiddleware
-    const { collectDefaultMetrics } = promClient
-    collectDefaultMetrics({ register: promClient.register })
-
-    // Add version as a prometheus gauge
-    const versionGauge = new promClient.Gauge({ name: 'companion_version', help: 'npm version as an integer' })
-    // @ts-ignore
-    const numberVersion = version.replace(/\D/g, '') * 1
-    versionGauge.set(numberVersion)
-  }
-
   // Query string keys whose values should not end up in logging output.
   const sensitiveKeys = new Set(['access_token', 'uppyAuthToken'])
 
@@ -93,9 +74,12 @@ function server (inputCompanionOptions = {}) {
     }
   })
 
+  // for server metrics tracking.
   // make app metrics available at '/metrics'.
+  // TODO for the next major version: use instead companion option "metrics": true and remove this code
+  // Se discussion: https://github.com/transloadit/uppy/pull/2854/files/64be97205e4012818abfcc8b0b8b7fe09de91729#diff-68f5e3eb307c1c9d1fd02224fd7888e2f74718744e1b6e35d929fcab1cc50ed1
   if (process.env.COMPANION_HIDE_METRICS !== 'true') {
-    app.use(metricsMiddleware)
+    app.use(middlewares.metrics())
   }
 
   app.use(bodyParser.json())
@@ -167,7 +151,7 @@ function server (inputCompanionOptions = {}) {
     process.exit(1)
   }
 
-  // add companion to server middlewear
+  // add companion to server middleware
   if (process.env.COMPANION_PATH) {
     app.use(process.env.COMPANION_PATH, companionApp)
   } else {

+ 2 - 1
packages/@uppy/locales/src/en_US.js

@@ -36,6 +36,7 @@ en_US.strings = {
   dashboardTitle: 'File Uploader',
   dashboardWindowTitle: 'File Uploader Window (Press escape to close)',
   dataUploadedOfTotal: '%{complete} of %{total}',
+  discardRecordedFile: 'Discard recorded file',
   done: 'Done',
   dropHereOr: 'Drop files here or %{browse}',
   dropHint: 'Drop your files here',
@@ -119,7 +120,7 @@ en_US.strings = {
   stopRecording: 'Stop video recording',
   streamActive: 'Stream active',
   streamPassive: 'Stream passive',
-  submitRecordedFile: 'Submit captured video',
+  submitRecordedFile: 'Submit recorded file',
   takePicture: 'Take a picture',
   timedOut: 'Upload stalled for %{seconds} seconds, aborting.',
   unselectAllFilesFromFolderNamed: 'Unselect all files from folder %{name}',

+ 4 - 1
website/src/docs/companion.md

@@ -286,7 +286,8 @@ See [env.example.sh](https://github.com/transloadit/uppy/blob/master/env.example
   sendSelfEndpoint: "localhost:3020",
   secret: 'mysecret',
   uploadUrls: ['https://myuploadurl.com', 'http://myuploadurl2.com']
-  debug: true
+  debug: true,
+  metrics: false
 }
 ```
 
@@ -319,6 +320,8 @@ See [env.example.sh](https://github.com/transloadit/uppy/blob/master/env.example
 
 11. **debug(optional)** - A boolean flag to tell Companion whether or not to log useful debug information while running.
 
+12. **metrics(optional)** - A boolean flag to tell Companion whether or not to provide an endpoint `/metrics` with Prometheus metrics.
+
 ### Provider Redirect URIs
 
 When generating your provider API keys on their corresponding developer platforms (e.g [Google Developer Console](https://console.developers.google.com/)), you'd need to provide a `redirect URI` for the OAuth authorization process. In general the redirect URI for each provider takes the format: