From f604fb92e5007dc5f8aebc9794f15f6d6ff99369 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Tue, 6 Nov 2018 11:14:26 +0000 Subject: [PATCH 1/8] Get default Prometheus metrics working --- libraries/metrics/metrics.coffee | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index e9a25966b5..d3468945a4 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -1,6 +1,10 @@ StatsD = require('lynx') statsd = new StatsD(process.env["STATSD_HOST"] or "localhost", 8125, {on_error:->}) +prom = require('prom-client') +Register = require('prom-client').register +collectDefaultMetrics = prom.collectDefaultMetrics + name = "unknown" hostname = require('os').hostname() @@ -14,10 +18,17 @@ require "./uv_threadpool_size" module.exports = Metrics = initialize: (_name) -> name = _name + collectDefaultMetrics({ timeout: 5000, prefix: name }) registerDestructor: (func) -> destructors.push func + injectMetricsRoute: (app) -> + app.get('/metrics', (req, res) -> + res.set('Content-Type', Register.contentType) + res.end(Register.metrics()) + ) + set : (key, value, sampleRate = 1)-> statsd.set buildKey(key), value, sampleRate From 6d4d05957ea92c7d0276d4b4a30742abb9634098 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Tue, 6 Nov 2018 14:22:03 +0000 Subject: [PATCH 2/8] Get counter metric working --- libraries/metrics/metrics.coffee | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index d3468945a4..f40a0b3ee2 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -11,6 +11,8 @@ hostname = require('os').hostname() buildKey = (key)-> "#{name}.#{hostname}.#{key}" buildGlobalKey = (key)-> "#{name}.global.#{key}" +counters = {} + destructors = [] require "./uv_threadpool_size" @@ -34,6 +36,14 @@ module.exports = Metrics = inc : (key, sampleRate = 1)-> statsd.increment buildKey(key), sampleRate + if !counters[key] + console.log("No Metric") + counters[key] = new prom.Counter({ + name: key, + help: key #https://prometheus.io/docs/instrumenting/writing_exporters/#help-strings this is probably wrong + labelNames: ['name','host'] + }) + counters[key].inc({name: name, host: hostname}) count : (key, count, sampleRate = 1)-> statsd.count buildKey(key), count, sampleRate From 56eaae89f968325d2eceaaee7426abd27564855e Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Tue, 6 Nov 2018 16:15:41 +0000 Subject: [PATCH 3/8] Add Gauges --- libraries/metrics/metrics.coffee | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index f40a0b3ee2..7bc568c2de 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -12,6 +12,7 @@ buildKey = (key)-> "#{name}.#{hostname}.#{key}" buildGlobalKey = (key)-> "#{name}.global.#{key}" counters = {} +gauges = {} destructors = [] @@ -37,10 +38,9 @@ module.exports = Metrics = inc : (key, sampleRate = 1)-> statsd.increment buildKey(key), sampleRate if !counters[key] - console.log("No Metric") counters[key] = new prom.Counter({ name: key, - help: key #https://prometheus.io/docs/instrumenting/writing_exporters/#help-strings this is probably wrong + help: key, labelNames: ['name','host'] }) counters[key].inc({name: name, host: hostname}) @@ -63,9 +63,23 @@ module.exports = Metrics = gauge : (key, value, sampleRate = 1)-> statsd.gauge buildKey(key), value, sampleRate + if !gauges[key] + gauges[key] = new prom.Gauge({ + name: key, + help: key, + labelNames: ['name','host'] + }) + gauges[key].set({name: name, host: hostname},value) globalGauge: (key, value, sampleRate = 1)-> statsd.gauge buildGlobalKey(key), value, sampleRate + if !gauges[key] + gauges[key] = new prom.Gauge({ + name: key, + help: key, + labelNames: ['name','host'] + }) + gauges[key].set({name: name},value) mongodb: require "./mongodb" http: require "./http" From bb3cff5744474a4f7f2080ace3d5175f20e04496 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Wed, 7 Nov 2018 11:21:45 +0000 Subject: [PATCH 4/8] Add prom-client to package.json --- libraries/metrics/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/metrics/package.json b/libraries/metrics/package.json index e19c11ddf2..d3421a3619 100644 --- a/libraries/metrics/package.json +++ b/libraries/metrics/package.json @@ -7,8 +7,9 @@ "url": "https://github.com/sharelatex/metrics-sharelatex.git" }, "dependencies": { - "lynx": "~0.1.1", "coffee-script": "1.6.0", + "lynx": "~0.1.1", + "prom-client": "^11.1.3", "underscore": "~1.6.0" }, "devDependencies": { From d0e1324dba044a3cdb2c7c11130863b4773030f2 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Wed, 7 Nov 2018 12:44:10 +0000 Subject: [PATCH 5/8] Sanitize metric keys for Prometheus --- libraries/metrics/metrics.coffee | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index 7bc568c2de..d06cc3972c 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -32,11 +32,15 @@ module.exports = Metrics = res.end(Register.metrics()) ) + sanitizeKey: (key) -> + key.replace /[^a-zA-Z0-9]/g, "_" + set : (key, value, sampleRate = 1)-> statsd.set buildKey(key), value, sampleRate inc : (key, sampleRate = 1)-> statsd.increment buildKey(key), sampleRate + key = this.sanitizeKey(key) if !counters[key] counters[key] = new prom.Counter({ name: key, @@ -63,6 +67,7 @@ module.exports = Metrics = gauge : (key, value, sampleRate = 1)-> statsd.gauge buildKey(key), value, sampleRate + key = this.sanitizeKey(key) if !gauges[key] gauges[key] = new prom.Gauge({ name: key, @@ -73,6 +78,7 @@ module.exports = Metrics = globalGauge: (key, value, sampleRate = 1)-> statsd.gauge buildGlobalKey(key), value, sampleRate + key = this.sanitizeKey(key) if !gauges[key] gauges[key] = new prom.Gauge({ name: key, From 65fccf8abe50fe6f986b75934be76ad6bef0cb82 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Wed, 7 Nov 2018 16:08:31 +0000 Subject: [PATCH 6/8] Ensure gauge values are numeric, not string --- libraries/metrics/metrics.coffee | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index d06cc3972c..63cfacf1ea 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -35,6 +35,9 @@ module.exports = Metrics = sanitizeKey: (key) -> key.replace /[^a-zA-Z0-9]/g, "_" + sanitizeValue: (value) -> + parseFloat(value) + set : (key, value, sampleRate = 1)-> statsd.set buildKey(key), value, sampleRate @@ -74,7 +77,7 @@ module.exports = Metrics = help: key, labelNames: ['name','host'] }) - gauges[key].set({name: name, host: hostname},value) + gauges[key].set({name: name, host: hostname},this.sanitizeValue(value)) globalGauge: (key, value, sampleRate = 1)-> statsd.gauge buildGlobalKey(key), value, sampleRate @@ -85,7 +88,7 @@ module.exports = Metrics = help: key, labelNames: ['name','host'] }) - gauges[key].set({name: name},value) + gauges[key].set({name: name},this.sanitizeValue(value)) mongodb: require "./mongodb" http: require "./http" From c576a86c148b0f983b2f580c5f5818c4668a4270 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 20 Nov 2018 13:50:04 +0000 Subject: [PATCH 7/8] Update metrics.coffee --- libraries/metrics/metrics.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index 63cfacf1ea..22dfd22548 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -21,7 +21,7 @@ require "./uv_threadpool_size" module.exports = Metrics = initialize: (_name) -> name = _name - collectDefaultMetrics({ timeout: 5000, prefix: name }) + collectDefaultMetrics({ timeout: 5000, prefix: name + "_" }) registerDestructor: (func) -> destructors.push func From 1a3b4273158651184e34c76f2e35bf3685e4cb2f Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 20 Nov 2018 14:54:09 +0000 Subject: [PATCH 8/8] bump to 1.9.0 --- libraries/metrics/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/metrics/package.json b/libraries/metrics/package.json index d3421a3619..cd47fc1466 100644 --- a/libraries/metrics/package.json +++ b/libraries/metrics/package.json @@ -1,6 +1,6 @@ { "name": "metrics-sharelatex", - "version": "1.8.1", + "version": "1.9.0", "description": "A drop-in metrics and monitoring module for node.js apps", "repository": { "type": "git",