diff --git a/libraries/metrics/index.js b/libraries/metrics/index.js index 11ea2ddd32..4a8ee39195 100644 --- a/libraries/metrics/index.js +++ b/libraries/metrics/index.js @@ -1,4 +1,3 @@ -let Metrics console.log('using prometheus') const ExpressCompression = require('compression') @@ -13,173 +12,185 @@ const destructors = [] require('./uv_threadpool_size') -module.exports = Metrics = { - register: prom.registry, +function initialize(_name, opts = {}) { + appname = _name + collectDefaultMetrics({ timeout: 5000, prefix: buildPromKey() }) + if (opts.ttlInMinutes) { + prom.ttlInMinutes = opts.ttlInMinutes + } - initialize(_name, opts = {}) { - appname = _name - collectDefaultMetrics({ timeout: 5000, prefix: Metrics.buildPromKey() }) - if (opts.ttlInMinutes) { - prom.ttlInMinutes = opts.ttlInMinutes - } + 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') - 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) + } - const traceOpts = { ignoreUrls: [/^\/status/, /^\/health_check/] } - traceAgent.start(traceOpts) - } - - console.log(`ENABLE_DEBUG_AGENT set to ${process.env.ENABLE_DEBUG_AGENT}`) - if (process.env.ENABLE_DEBUG_AGENT === 'true') { - console.log('starting google debug agent') - const debugAgent = require('@google-cloud/debug-agent') - debugAgent.start({ - allowExpressions: true, - serviceContext: { - service: appname, - version: process.env.BUILD_VERSION - } - }) - } - - 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 - } - }) - } - - Metrics.inc('process_startup') - }, - - registerDestructor(func) { - destructors.push(func) - }, - - injectMetricsRoute(app) { - app.get( - '/metrics', - ExpressCompression({ - level: parseInt(process.env.METRICS_COMPRESSION_LEVEL || '1', 10) - }), - function(req, res) { - res.set('Content-Type', prom.registry.contentType) - res.end(prom.registry.metrics()) + console.log(`ENABLE_DEBUG_AGENT set to ${process.env.ENABLE_DEBUG_AGENT}`) + if (process.env.ENABLE_DEBUG_AGENT === 'true') { + console.log('starting google debug agent') + const debugAgent = require('@google-cloud/debug-agent') + debugAgent.start({ + allowExpressions: true, + serviceContext: { + service: appname, + version: process.env.BUILD_VERSION } - ) - }, + }) + } - buildPromKey(key = '') { - return key.replace(/[^a-zA-Z0-9]/g, '_') - }, + 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 + } + }) + } - sanitizeValue(value) { - return parseFloat(value) - }, + inc('process_startup') +} - set(key, value, sampleRate = 1) { - console.log('counts are not currently supported') - }, +function registerDestructor(func) { + destructors.push(func) +} - inc(key, sampleRate = 1, opts = {}) { - key = Metrics.buildPromKey(key) - opts.app = appname - opts.host = hostname - prom.metric('counter', key).inc(opts) - if (process.env.DEBUG_METRICS) { - console.log('doing inc', key, opts) +function injectMetricsRoute(app) { + app.get( + '/metrics', + ExpressCompression({ + level: parseInt(process.env.METRICS_COMPRESSION_LEVEL || '1', 10) + }), + function(req, res) { + res.set('Content-Type', prom.registry.contentType) + res.end(prom.registry.metrics()) } - }, + ) +} - count(key, count, sampleRate = 1, opts = {}) { - key = Metrics.buildPromKey(key) - opts.app = appname - opts.host = hostname - prom.metric('counter', key).inc(opts, count) - if (process.env.DEBUG_METRICS) { - console.log('doing count/inc', key, opts) - } - }, +function buildPromKey(key = '') { + return key.replace(/[^a-zA-Z0-9]/g, '_') +} - summary(key, value, opts = {}) { - key = Metrics.buildPromKey(key) - opts.app = appname - opts.host = hostname - prom.metric('summary', key).observe(opts, value) - if (process.env.DEBUG_METRICS) { - console.log('doing summary', key, value, opts) - } - }, +function sanitizeValue(value) { + return parseFloat(value) +} - timing(key, timeSpan, sampleRate, opts = {}) { - key = Metrics.buildPromKey('timer_' + key) - opts.app = appname - opts.host = hostname - prom.metric('summary', key).observe(opts, timeSpan) - if (process.env.DEBUG_METRICS) { - console.log('doing timing', key, opts) - } - }, +function set(key, value, sampleRate = 1) { + console.log('counts are not currently supported') +} - Timer: class { - constructor(key, sampleRate = 1, opts = {}) { - this.start = new Date() - key = Metrics.buildPromKey(key) - this.key = key - this.sampleRate = sampleRate - this.opts = opts - } +function inc(key, sampleRate = 1, opts = {}) { + key = buildPromKey(key) + opts.app = appname + opts.host = hostname + prom.metric('counter', key).inc(opts) + if (process.env.DEBUG_METRICS) { + console.log('doing inc', key, opts) + } +} - done() { - const timeSpan = new Date() - this.start - Metrics.timing(this.key, timeSpan, this.sampleRate, this.opts) - return timeSpan - } - }, +function count(key, count, sampleRate = 1, opts = {}) { + key = buildPromKey(key) + opts.app = appname + opts.host = hostname + prom.metric('counter', key).inc(opts, count) + if (process.env.DEBUG_METRICS) { + console.log('doing count/inc', key, opts) + } +} - gauge(key, value, sampleRate = 1, opts = {}) { - key = Metrics.buildPromKey(key) - prom.metric('gauge', key).set( - { - app: appname, - host: hostname, - status: opts.status - }, - this.sanitizeValue(value) - ) - if (process.env.DEBUG_METRICS) { - console.log('doing gauge', key, opts) - } - }, +function summary(key, value, opts = {}) { + key = buildPromKey(key) + opts.app = appname + opts.host = hostname + prom.metric('summary', key).observe(opts, value) + if (process.env.DEBUG_METRICS) { + console.log('doing summary', key, value, opts) + } +} - globalGauge(key, value, sampleRate = 1, opts = {}) { - key = Metrics.buildPromKey(key) - prom - .metric('gauge', key) - .set({ app: appname, status: opts.status }, this.sanitizeValue(value)) - }, +function timing(key, timeSpan, sampleRate, opts = {}) { + key = buildPromKey('timer_' + key) + opts.app = appname + opts.host = hostname + prom.metric('summary', key).observe(opts, timeSpan) + if (process.env.DEBUG_METRICS) { + console.log('doing timing', key, opts) + } +} + +class Timer { + constructor(key, sampleRate = 1, opts = {}) { + this.start = new Date() + key = buildPromKey(key) + this.key = key + this.sampleRate = sampleRate + this.opts = opts + } + + done() { + const timeSpan = new Date() - this.start + timing(this.key, timeSpan, this.sampleRate, this.opts) + return timeSpan + } +} + +function gauge(key, value, sampleRate = 1, opts = {}) { + key = buildPromKey(key) + prom.metric('gauge', key).set( + { + app: appname, + host: hostname, + status: opts.status + }, + this.sanitizeValue(value) + ) + if (process.env.DEBUG_METRICS) { + console.log('doing gauge', key, opts) + } +} + +function globalGauge(key, value, sampleRate = 1, opts = {}) { + key = buildPromKey(key) + prom + .metric('gauge', key) + .set({ app: appname, status: opts.status }, this.sanitizeValue(value)) +} + +function close() { + for (const func of destructors) { + func() + } +} + +module.exports = { + initialize, + registerDestructor, + injectMetricsRoute, + buildPromKey, + sanitizeValue, + set, + inc, + count, + summary, + timing, + Timer, + gauge, + globalGauge, + close, + + register: prom.registry, mongodb: require('./mongodb'), http: require('./http'), open_sockets: require('./open_sockets'), event_loop: require('./event_loop'), memory: require('./memory'), - - timeAsyncMethod: require('./timeAsyncMethod'), - - close() { - for (const func of destructors) { - func() - } - } + timeAsyncMethod: require('./timeAsyncMethod') }