@adalo/metrics 0.1.50 → 0.1.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/metricsClient.d.ts +9 -5
- package/lib/metricsClient.d.ts.map +1 -1
- package/lib/metricsClient.js +15 -9
- package/lib/metricsClient.js.map +1 -1
- package/lib/metricsRedisClient.d.ts +0 -1
- package/lib/metricsRedisClient.d.ts.map +1 -1
- package/lib/metricsRedisClient.js +1 -8
- package/lib/metricsRedisClient.js.map +1 -1
- package/package.json +1 -1
- package/src/metricsClient.js +15 -8
- package/src/metricsRedisClient.js +1 -8
package/lib/metricsClient.d.ts
CHANGED
|
@@ -127,14 +127,18 @@ export class MetricsClient {
|
|
|
127
127
|
* Push all gauges and counters to PushGateway and optionally log.
|
|
128
128
|
*/
|
|
129
129
|
pushMetrics: () => Promise<void>;
|
|
130
|
+
_startPush: (interval?: number, customPushMetics?: undefined) => void;
|
|
130
131
|
/**
|
|
131
|
-
* Start periodic metrics collection
|
|
132
|
+
* Start periodic metrics collection and push.
|
|
132
133
|
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
134
|
+
* This method wraps the internal `_startPush` method.
|
|
135
|
+
* If a `customPushMetrics` function is provided, it will be executed
|
|
136
|
+
* at the given interval instead of the default `pushMetrics` behavior.
|
|
137
|
+
*
|
|
138
|
+
* @param {number} [interval=this.intervalSec] - Interval in seconds between pushes.
|
|
139
|
+
* @param {() => void | Promise<void>} [customPushMetrics] - Optional custom push function. If provided, Prometheus push is skipped.
|
|
136
140
|
*/
|
|
137
|
-
startPush: (interval?: number | undefined, customPushMetics
|
|
141
|
+
startPush: (interval?: number | undefined, customPushMetics: any) => void;
|
|
138
142
|
cleanup: () => Promise<never>;
|
|
139
143
|
/**
|
|
140
144
|
* Remove old/stale dyno/instance metrics from PushGateway.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metricsClient.d.ts","sourceRoot":"","sources":["../src/metricsClient.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;IACE;;;;;;;;;;;;;OAaG;IACH;QAZ2B,OAAO;QACP,MAAM;QACN,WAAW;QACV,OAAO;QACP,SAAS;QACV,cAAc;QACd,iBAAiB;QACjB,WAAW;QACV,gBAAgB;QAChB,mBAAmB;QAClB,iBAAiB;OAuD7C;IApDC,gBAA4E;IAC5E,eAAqE;IACrE,oBAG6B;IAC7B,iBAAuE;IACvE,mBAC+D;IAC/D,uBACoE;IACpE,kBAC0E;IAC1E,oBAGI;IACJ,wCAAiD;IAEjD,mBAAyF;IAEzF,uEAAsC;IAGtC;;;;MAIC;IAED,wEAOC;IACD,WAAgB;IAChB,aAAkB;IAClB,sBAA2B;IAE3B,mEAAmE;IACnE;YADkB,MAAM,SAAc,MAAM,GAAG,QAAQ,MAAM,CAAC;MACvC;IACvB,yBAAyB;IACzB,uBAAgC;IASlC;;;OAGG;IACH,4BAmDC;IAED;;;;;;;;OAQG;IACH;QAN2B,IAAI,EAApB,MAAM;QACU,IAAI,EAApB,MAAM;QACuC,QAAQ,UAAzC,MAAM,GAAC,QAAQ,MAAM,CAAC;QACf,UAAU;UAC3B,OAAO,aAAa,EAAE,KAAK,CAuBvC;IAED;;;;;;;;;;;OAWG;IACH;QAR0B,IAAI,EAAnB,MAAM;QACS,IAAI,EAAnB,MAAM;QACY,UAAU;kBAEhB,MAAM,mBAAmB,MAAM,KAAK,IAAI,CAuB9D;IAED;;;OAGG;IACH,0BAFa,MAAM,CA2BlB;IAED;;;OAGG;IACH,oBAFa,MAAM,CAiBlB;IAED;;;OAGG;IACH,2BAFa,MAAM,CAWlB;IAED;;;OAGG;IACH,2BAFa,MAAM,CAgBlB;IAED;;;OAGG;IACH,cAFa,QAAQ,MAAM,CAAC,CAO3B;IAED;;;OAGG;IACH,oEA8BC;IAED;;OAEG;IACH,iCAgCC;IAED
|
|
1
|
+
{"version":3,"file":"metricsClient.d.ts","sourceRoot":"","sources":["../src/metricsClient.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;IACE;;;;;;;;;;;;;OAaG;IACH;QAZ2B,OAAO;QACP,MAAM;QACN,WAAW;QACV,OAAO;QACP,SAAS;QACV,cAAc;QACd,iBAAiB;QACjB,WAAW;QACV,gBAAgB;QAChB,mBAAmB;QAClB,iBAAiB;OAuD7C;IApDC,gBAA4E;IAC5E,eAAqE;IACrE,oBAG6B;IAC7B,iBAAuE;IACvE,mBAC+D;IAC/D,uBACoE;IACpE,kBAC0E;IAC1E,oBAGI;IACJ,wCAAiD;IAEjD,mBAAyF;IAEzF,uEAAsC;IAGtC;;;;MAIC;IAED,wEAOC;IACD,WAAgB;IAChB,aAAkB;IAClB,sBAA2B;IAE3B,mEAAmE;IACnE;YADkB,MAAM,SAAc,MAAM,GAAG,QAAQ,MAAM,CAAC;MACvC;IACvB,yBAAyB;IACzB,uBAAgC;IASlC;;;OAGG;IACH,4BAmDC;IAED;;;;;;;;OAQG;IACH;QAN2B,IAAI,EAApB,MAAM;QACU,IAAI,EAApB,MAAM;QACuC,QAAQ,UAAzC,MAAM,GAAC,QAAQ,MAAM,CAAC;QACf,UAAU;UAC3B,OAAO,aAAa,EAAE,KAAK,CAuBvC;IAED;;;;;;;;;;;OAWG;IACH;QAR0B,IAAI,EAAnB,MAAM;QACS,IAAI,EAAnB,MAAM;QACY,UAAU;kBAEhB,MAAM,mBAAmB,MAAM,KAAK,IAAI,CAuB9D;IAED;;;OAGG;IACH,0BAFa,MAAM,CA2BlB;IAED;;;OAGG;IACH,oBAFa,MAAM,CAiBlB;IAED;;;OAGG;IACH,2BAFa,MAAM,CAWlB;IAED;;;OAGG;IACH,2BAFa,MAAM,CAgBlB;IAED;;;OAGG;IACH,cAFa,QAAQ,MAAM,CAAC,CAO3B;IAED;;;OAGG;IACH,oEA8BC;IAED;;OAEG;IACH,iCAgCC;IAED,sEAuBC;IAED;;;;;;;;;OASG;IACH,0EAEC;IAED,8BAKC;IAED;;;;;;;;;OASG;IACH,yBAuDC;IAED;;;;;;;;;OASG;IACH;;;;;;sBAFa,QAAQ,IAAI,CAAC,CAUzB;IAED;;;;;;;OAOG;IACH;;;sBAFa,QAAQ,IAAI,CAAC,CAYzB;IAED;;;;;;OAMG;IACH,6BAHW,MAAM,EAAE,KACN,MAAM,EAAE,CAIpB;IAED;;;;MAEC;IAED,gCAGC;IAID,8BAEC;IAED,gCAEC;IAED,4EAEC;CACF"}
|
package/lib/metricsClient.js
CHANGED
|
@@ -314,15 +314,7 @@ class MetricsClient {
|
|
|
314
314
|
console.error(`${this.prefixLogs} Failed to push metrics:`, err);
|
|
315
315
|
}
|
|
316
316
|
};
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Start periodic metrics collection + push.
|
|
320
|
-
*
|
|
321
|
-
* @param {number} [interval] Interval in seconds
|
|
322
|
-
* @param {function(): void|Promise<void>} [customPushMetics]
|
|
323
|
-
* Optional custom push function. If provided, Prometheus push is skipped.
|
|
324
|
-
*/
|
|
325
|
-
startPush = (interval = this.intervalSec, customPushMetics = undefined) => {
|
|
317
|
+
_startPush = (interval = this.intervalSec, customPushMetics = undefined) => {
|
|
326
318
|
if (!this.enabled) {
|
|
327
319
|
console.warn(`${this.prefixLogs} Metrics disabled`);
|
|
328
320
|
return;
|
|
@@ -341,6 +333,20 @@ class MetricsClient {
|
|
|
341
333
|
}
|
|
342
334
|
console.warn(`${this.prefixLogs} Metrics collection started. (interval: ${this.intervalSec}s)`);
|
|
343
335
|
};
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Start periodic metrics collection and push.
|
|
339
|
+
*
|
|
340
|
+
* This method wraps the internal `_startPush` method.
|
|
341
|
+
* If a `customPushMetrics` function is provided, it will be executed
|
|
342
|
+
* at the given interval instead of the default `pushMetrics` behavior.
|
|
343
|
+
*
|
|
344
|
+
* @param {number} [interval=this.intervalSec] - Interval in seconds between pushes.
|
|
345
|
+
* @param {() => void | Promise<void>} [customPushMetrics] - Optional custom push function. If provided, Prometheus push is skipped.
|
|
346
|
+
*/
|
|
347
|
+
startPush = (interval, customPushMetics) => {
|
|
348
|
+
this._startPush(interval, customPushMetics);
|
|
349
|
+
};
|
|
344
350
|
cleanup = async () => {
|
|
345
351
|
if (this.enabled) {
|
|
346
352
|
await this.gatewayDelete();
|
package/lib/metricsClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metricsClient.js","names":["client","require","fs","os","https","MetricsClient","constructor","config","appName","process","env","BUILD_APP_NAME","dynoId","HOSTNAME","processType","BUILD_DYNO_PROCESS_TYPE","enabled","METRICS_ENABLED","logValues","METRICS_LOG_VALUES","pushgatewayUrl","METRICS_PUSHGATEWAY_URL","authToken","pushgatewaySecret","METRICS_PUSHGATEWAY_SECRET","intervalSec","parseInt","METRICS_INTERVAL_SEC","startupValidation","prefixLogs","_registry","Registry","collectDefaultMetrics","register","defaultLabels","app","dyno_id","process_type","gateway","Pushgateway","headers","Authorization","agent","Agent","keepAlive","gauges","counters","countersFunctions","gaugeUpdaters","_lastUsageMicros","_lastCheckTime","Date","now","_clearOldWorkers","removeOldMetrics","scripDefaultMetrics","_initDefaultMetrics","_setCleanupHandlers","createGauge","name","help","updateFn","getCpuUsagePercent","getAvailableCPUs","getContainerMemoryUsage","measureLag","getContainerMemoryLimit","uptime","createCounter","labelNames","withDefaultLabels","Object","keys","g","Gauge","registers","c","Counter","data","value","inc","stat","readFileSync","match","currentUsage","deltaUsage","deltaTime","cpuMaxPath","existsSync","quotaStr","periodStr","trim","split","cpus","length","memoryUsage","rss","path","val","parsed","totalmem","Promise","resolve","start","setImmediate","countHttpRequestMiddleware","req","res","next","on","endpoint","route","originalUrl","url","appId","params","body","query","databaseId","datasourceId","app_http_requests_total","method","status_code","statusCode","duration","requestSize","pushMetrics","entries","result","undefined","set","err","console","error","gatewayPush","values","forEach","counter","reset","metrics","getMetricsAsJSON","log","JSON","stringify","startPush","interval","customPushMetics","warn","setInterval","catch","cleanup","gatewayDelete","exit","fetch","Accept","ok","status","text","regex","RegExp","instances","Set","exec","instance","add","size","groupings","delete","jobName","push","labels","getDefaultLabels","metricsEnabled","metricsLogValues","registry","module","exports"],"sources":["../src/metricsClient.js"],"sourcesContent":["const client = require('prom-client')\nconst fs = require('fs')\nconst os = require('os')\nconst https = require('https')\n\n/**\n * MetricsClient handles Prometheus metrics collection and push.\n * Supports gauges, counters, default metrics, and custom metrics.\n */\nclass MetricsClient {\n /**\n * @param {Object} config\n * @param {string} [config.appName] Name of the application\n * @param {string} [config.dynoId] Dyno/instance ID\n * @param {string} [config.processType] Process type (web, worker, etc.)\n * @param {boolean} [config.enabled] Enable metrics collection\n * @param {boolean} [config.logValues] Log metrics values to console\n * @param {string} [config.pushgatewayUrl] PushGateway URL\n * @param {string} [config.pushgatewaySecret] PushGateway secret token\n * @param {number} [config.intervalSec] Interval in seconds for pushing metrics\n * @param {boolean} [config.removeOldMetrics] Enable to clear metrics by service name\n * @param {boolean} [config.scripDefaultMetrics] Enable to scip default metrics creation\n * @param {function} [config.startupValidation] Add to validate on start push.\n */\n constructor(config = {}) {\n this.appName = config.appName || process.env.BUILD_APP_NAME || 'unknown-app'\n this.dynoId = config.dynoId || process.env.HOSTNAME || 'unknown-dyno'\n this.processType =\n config.processType ||\n process.env.BUILD_DYNO_PROCESS_TYPE ||\n 'undefined_build_dyno_type'\n this.enabled = config.enabled ?? process.env.METRICS_ENABLED === 'true'\n this.logValues =\n config.logValues ?? process.env.METRICS_LOG_VALUES === 'true'\n this.pushgatewayUrl =\n config.pushgatewayUrl || process.env.METRICS_PUSHGATEWAY_URL || ''\n this.authToken =\n config.pushgatewaySecret || process.env.METRICS_PUSHGATEWAY_SECRET || ''\n this.intervalSec =\n config.intervalSec ||\n parseInt(process.env.METRICS_INTERVAL_SEC || '', 10) ||\n 15\n this.startupValidation = config.startupValidation\n\n this.prefixLogs = `[${this.processType}] [${this.appName}] [${this.dynoId}] [Monitoring]`\n\n this._registry = new client.Registry()\n client.collectDefaultMetrics({ register: this._registry })\n\n this.defaultLabels = {\n app: this.appName,\n dyno_id: this.dynoId,\n process_type: this.processType,\n }\n\n this.gateway = new client.Pushgateway(\n this.pushgatewayUrl,\n {\n headers: { Authorization: `Basic ${this.authToken}` },\n agent: new https.Agent({ keepAlive: true }),\n },\n this._registry\n )\n this.gauges = {}\n this.counters = {}\n this.countersFunctions = {}\n\n /** @type {Object<string, function(): number | Promise<number>>} */\n this.gaugeUpdaters = {}\n this._lastUsageMicros = 0\n this._lastCheckTime = Date.now()\n\n this._clearOldWorkers(config.removeOldMetrics)\n if (!config.scripDefaultMetrics) {\n this._initDefaultMetrics()\n }\n this._setCleanupHandlers()\n }\n\n /**\n * Register all built-in default Gauges and Counters.\n * @private\n */\n _initDefaultMetrics = () => {\n this.createGauge({\n name: 'app_process_cpu_usage_percent',\n help: 'Current CPU usage of the Node.js process in percent',\n updateFn: this.getCpuUsagePercent,\n })\n\n this.createGauge({\n name: 'app_available_cpu_count',\n help: 'How many CPU cores are available to this process',\n updateFn: this.getAvailableCPUs,\n })\n\n this.createGauge({\n name: 'app_container_memory_usage_bytes',\n help: 'Current container RAM usage from cgroup',\n updateFn: this.getContainerMemoryUsage,\n })\n\n this.createGauge({\n name: 'app_event_loop_lag_ms',\n help: 'Estimated event loop lag in milliseconds',\n updateFn: this.measureLag,\n })\n\n this.createGauge({\n name: 'app_container_memory_limit_bytes',\n help: 'Max RAM available to container from cgroup (memory.max)',\n updateFn: this.getContainerMemoryLimit,\n })\n\n this.createGauge({\n name: 'app_uptime_seconds',\n help: 'How long the process has been running',\n updateFn: process.uptime,\n })\n\n this.createCounter({\n name: 'app_http_requests_total',\n help: 'Total number of HTTP requests handled by this process',\n labelNames: this.withDefaultLabels([\n 'method',\n 'route',\n 'endpoint',\n 'appId',\n 'databaseId',\n 'duration',\n 'requestSize',\n 'status_code',\n ]),\n })\n }\n\n /**\n * Create a gauge metric.\n * @param {Object} options - Gauge configuration\n * @param {string} options.name - Name of the gauge\n * @param {string} options.help - Help text describing the gauge\n * @param {function(): number|Promise<number>} [options.updateFn] - Optional function returning the gauge value\n * @param {string[]} [options.labelNames] - Optional custom label names\n * @returns {import('prom-client').Gauge} The created Prometheus gauge\n */\n createGauge = ({\n name,\n help,\n updateFn,\n labelNames = Object.keys(this.defaultLabels),\n }) => {\n if (this.gauges[name]) return this.gauges[name]\n\n const g = new client.Gauge({\n name,\n help,\n labelNames,\n registers: [this._registry],\n })\n this.gauges[name] = g\n\n if (updateFn && typeof updateFn === 'function') {\n this.gaugeUpdaters[name] = updateFn\n }\n\n return g\n }\n\n /**\n * Create a Prometheus Counter metric.\n *\n * @param {Object} params - Counter configuration\n * @param {string} params.name - Metric name\n * @param {string} params.help - Metric description\n * @param {string[]} [params.labelNames] - Optional list of label names. Defaults to this.defaultLabels keys.\n *\n * @returns {(labels?: Object, incrementValue?: number) => void}\n * A function to increment the counter.\n * Usage: (labels?, incrementValue?)\n */\n createCounter({ name, help, labelNames = Object.keys(this.defaultLabels) }) {\n if (this.counters[name]) return this.countersFunctions[name]\n\n const c = new client.Counter({\n name,\n help,\n labelNames,\n registers: [this._registry],\n })\n this.counters[name] = c\n\n this.countersFunctions = {\n ...this.countersFunctions,\n [name]: (data = {}, value = 1) => {\n c.inc({ ...this.defaultLabels, ...data }, value)\n },\n }\n\n return this.countersFunctions[name]\n }\n\n /**\n * Get CPU usage percent (cgroup-aware)\n * @returns {number}\n */\n getCpuUsagePercent = () => {\n try {\n const stat = fs.readFileSync('/sys/fs/cgroup/cpu.stat', 'utf-8')\n const match = stat.match(/usage_usec (\\d+)/)\n if (!match) return 0\n\n const now = Date.now()\n const currentUsage = parseInt(match[1], 10)\n\n if (this._lastUsageMicros === 0) {\n this._lastUsageMicros = currentUsage\n this._lastCheckTime = now\n return 0\n }\n\n const deltaUsage = currentUsage - this._lastUsageMicros\n const deltaTime = now - this._lastCheckTime\n\n this._lastUsageMicros = currentUsage\n this._lastCheckTime = now\n\n return (deltaUsage / (deltaTime * 1000)) * 100\n } catch {\n return 0\n }\n }\n\n /**\n * Get available CPU cores.\n * @returns {number}\n */\n getAvailableCPUs() {\n try {\n const cpuMaxPath = '/sys/fs/cgroup/cpu.max'\n if (fs.existsSync(cpuMaxPath)) {\n const [quotaStr, periodStr] = fs\n .readFileSync(cpuMaxPath, 'utf8')\n .trim()\n .split(' ')\n if (quotaStr === 'max') return os.cpus().length\n return parseInt(quotaStr, 10) / parseInt(periodStr, 10)\n }\n return os.cpus().length\n } catch {\n return 1\n }\n }\n\n /**\n * Get container memory usage in bytes.\n * @returns {number}\n */\n getContainerMemoryUsage() {\n try {\n return parseInt(\n fs.readFileSync('/sys/fs/cgroup/memory.current', 'utf-8').trim(),\n 10\n )\n } catch {\n return process.memoryUsage().rss\n }\n }\n\n /**\n * Get container memory limit in bytes.\n * @returns {number}\n */\n getContainerMemoryLimit() {\n try {\n const path = '/sys/fs/cgroup/memory.max'\n if (fs.existsSync(path)) {\n const val = fs.readFileSync(path, 'utf-8').trim()\n if (val !== 'max') {\n const parsed = parseInt(val, 10)\n if (parsed && parsed < os.totalmem()) return parsed\n }\n }\n return os.totalmem()\n } catch {\n return os.totalmem()\n }\n }\n\n /**\n * Measure event loop lag in ms.\n * @returns {Promise<number>}\n */\n measureLag() {\n return new Promise(resolve => {\n const start = Date.now()\n setImmediate(() => resolve(Date.now() - start))\n })\n }\n\n /**\n * Express middleware to count HTTP requests.\n * Increments the `app_http_requests_total` counter.\n */\n countHttpRequestMiddleware = (req, res, next) => {\n const start = Date.now()\n res.on('finish', () => {\n const endpoint = req.route?.path || req.path || 'unknown'\n const route = req.originalUrl || req.url || 'unknown'\n const appId =\n req.params?.appId || req.body?.appId || req.query?.appId || ''\n const databaseId =\n req.params?.databaseId ||\n req.body?.databaseId ||\n req.query?.databaseId ||\n req.params?.datasourceId ||\n req.body?.datasourceId ||\n req.query?.datasourceId ||\n ''\n this.countersFunctions?.app_http_requests_total({\n method: req.method,\n route,\n endpoint,\n status_code: res.statusCode,\n appId,\n databaseId,\n duration: Date.now() - start,\n requestSize: req.headers['content-length']\n ? parseInt(req.headers['content-length'], 10)\n : 0,\n })\n })\n\n next()\n }\n\n /**\n * Push all gauges and counters to PushGateway and optionally log.\n */\n pushMetrics = async () => {\n try {\n for (const [name, updateFn] of Object.entries(this.gaugeUpdaters)) {\n try {\n if (!updateFn) {\n return\n }\n const result = updateFn()\n const val = result instanceof Promise ? await result : result\n if (val !== undefined) this.gauges[name].set(this.defaultLabels, val)\n } catch (err) {\n console.error(\n `${this.prefixLogs} Failed to update gauge ${name}:`,\n err\n )\n }\n }\n\n await this.gatewayPush()\n\n Object.values(this.counters).forEach(counter => counter.reset())\n\n if (this.logValues) {\n const metrics = await this._registry.getMetricsAsJSON()\n console.log(\n `${this.prefixLogs} Metrics:\\n`,\n JSON.stringify(metrics, null, 2)\n )\n }\n } catch (err) {\n console.error(`${this.prefixLogs} Failed to push metrics:`, err)\n }\n }\n\n /**\n * Start periodic metrics collection + push.\n *\n * @param {number} [interval] Interval in seconds\n * @param {function(): void|Promise<void>} [customPushMetics]\n * Optional custom push function. If provided, Prometheus push is skipped.\n */\n startPush = (interval = this.intervalSec, customPushMetics = undefined) => {\n if (!this.enabled) {\n console.warn(`${this.prefixLogs} Metrics disabled`)\n return\n }\n\n if (this.startupValidation && !this.startupValidation()) {\n return\n }\n\n if (customPushMetics) {\n setInterval(customPushMetics, interval * 1000)\n } else {\n setInterval(() => {\n this.pushMetrics().catch(err => {\n console.error(`${this.prefixLogs} Failed to push metrics:`, err)\n })\n }, interval * 1000)\n }\n\n console.warn(\n `${this.prefixLogs} Metrics collection started. (interval: ${this.intervalSec}s)`\n )\n }\n\n cleanup = async () => {\n if (this.enabled) {\n await this.gatewayDelete()\n }\n process.exit(0)\n }\n\n /**\n * Remove old/stale dyno/instance metrics from PushGateway.\n *\n * Compares existing PushGateway metrics for this job and deletes any instances\n * that do not match the current dynoId.\n *\n * @param {boolean} removeOldMetrics If true, performs cleanup; otherwise does nothing\n * @returns {Promise<void>}\n * @private\n */\n _clearOldWorkers = async removeOldMetrics => {\n if (!removeOldMetrics) return\n\n try {\n const url = `${this.pushgatewayUrl}/metrics`\n const res = await fetch(url, {\n headers: {\n Authorization: `Basic ${this.authToken}`,\n Accept: 'text/plain',\n },\n })\n\n if (!res.ok) {\n console.error(\n `${this.prefixLogs} Failed to fetch metrics: ${res.status}`\n )\n return\n }\n\n const text = await res.text()\n\n const regex = new RegExp(\n `(?:instance=\"([^\"]+)\".*job=\"${this.appName}\"|job=\"${this.appName}\".*instance=\"([^\"]+)\")`,\n 'g'\n )\n const instances = new Set()\n let match\n // eslint-disable-next-line no-cond-assign\n while ((match = regex.exec(text)) !== null) {\n const instance = match[1] || match[2]\n if (instance && instance !== this.dynoId) instances.add(instance)\n }\n\n if (instances.size === 0) {\n console.log(`${this.prefixLogs} No old dynos to delete.`)\n return\n }\n\n for (const instance of instances) {\n await this.gatewayDelete({\n groupings: {\n instance,\n },\n })\n console.log(\n `${this.prefixLogs} Deleted metrics for old dyno: ${instance}`\n )\n }\n\n console.log(\n `${this.prefixLogs} Cleared all old instances for job ${this.appName}`\n )\n } catch (err) {\n console.error(`${this.prefixLogs} Error deleting old metrics:`, err)\n }\n }\n\n /**\n * Delete metrics for this job/instance from PushGateway.\n *\n * @param {Object} [params]\n * @param {string} [params.jobName] Job name (defaults to appName)\n * @param {Object} [params.groupings] Grouping labels\n * @param {string} [params.groupings.process_type] Process type label\n * @param {string} [params.groupings.instance] Instance/dyno ID\n * @returns {Promise<void>}\n */\n gatewayDelete = async (params = {}) => {\n return this.gateway.delete({\n jobName: params.jobName || this.appName,\n groupings: {\n process_type: params.groupings?.process_type || this.processType,\n instance: params.groupings?.instance || this.dynoId,\n },\n })\n }\n\n /**\n * Push metrics to PushGateway.\n *\n * @param {object} [params]\n * @param {string} [params.jobName]\n * @param {object} [params.groupings]\n * @returns {Promise<void>}\n */\n gatewayPush = async (params = {}) => {\n const groupings = {\n process_type: this.processType,\n instance: this.dynoId,\n ...(params.groupings || {}),\n }\n return this.gateway.push({\n jobName: params.jobName || this.appName,\n groupings,\n })\n }\n\n /**\n * Merge the default metric labels (`app`, `dyno_id`, `process_type`)\n * with custom label names.\n *\n * @param {string[]} labels Additional label names\n * @returns {string[]} Combined label names\n */\n withDefaultLabels = (labels = []) => {\n return [...Object.keys(this.defaultLabels), ...labels]\n }\n\n getDefaultLabels = (labels = []) => {\n return this.defaultLabels\n }\n\n _setCleanupHandlers = () => {\n process.on('SIGINT', this.cleanup)\n process.on('SIGTERM', this.cleanup)\n }\n\n // GETTERS\n\n get metricsEnabled() {\n return this.enabled\n }\n\n get metricsLogValues() {\n return this.logValues\n }\n\n get registry() {\n return this._registry\n }\n}\n\nmodule.exports = { MetricsClient }\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"metricsClient.js","names":["client","require","fs","os","https","MetricsClient","constructor","config","appName","process","env","BUILD_APP_NAME","dynoId","HOSTNAME","processType","BUILD_DYNO_PROCESS_TYPE","enabled","METRICS_ENABLED","logValues","METRICS_LOG_VALUES","pushgatewayUrl","METRICS_PUSHGATEWAY_URL","authToken","pushgatewaySecret","METRICS_PUSHGATEWAY_SECRET","intervalSec","parseInt","METRICS_INTERVAL_SEC","startupValidation","prefixLogs","_registry","Registry","collectDefaultMetrics","register","defaultLabels","app","dyno_id","process_type","gateway","Pushgateway","headers","Authorization","agent","Agent","keepAlive","gauges","counters","countersFunctions","gaugeUpdaters","_lastUsageMicros","_lastCheckTime","Date","now","_clearOldWorkers","removeOldMetrics","scripDefaultMetrics","_initDefaultMetrics","_setCleanupHandlers","createGauge","name","help","updateFn","getCpuUsagePercent","getAvailableCPUs","getContainerMemoryUsage","measureLag","getContainerMemoryLimit","uptime","createCounter","labelNames","withDefaultLabels","Object","keys","g","Gauge","registers","c","Counter","data","value","inc","stat","readFileSync","match","currentUsage","deltaUsage","deltaTime","cpuMaxPath","existsSync","quotaStr","periodStr","trim","split","cpus","length","memoryUsage","rss","path","val","parsed","totalmem","Promise","resolve","start","setImmediate","countHttpRequestMiddleware","req","res","next","on","endpoint","route","originalUrl","url","appId","params","body","query","databaseId","datasourceId","app_http_requests_total","method","status_code","statusCode","duration","requestSize","pushMetrics","entries","result","undefined","set","err","console","error","gatewayPush","values","forEach","counter","reset","metrics","getMetricsAsJSON","log","JSON","stringify","_startPush","interval","customPushMetics","warn","setInterval","catch","startPush","cleanup","gatewayDelete","exit","fetch","Accept","ok","status","text","regex","RegExp","instances","Set","exec","instance","add","size","groupings","delete","jobName","push","labels","getDefaultLabels","metricsEnabled","metricsLogValues","registry","module","exports"],"sources":["../src/metricsClient.js"],"sourcesContent":["const client = require('prom-client')\nconst fs = require('fs')\nconst os = require('os')\nconst https = require('https')\n\n/**\n * MetricsClient handles Prometheus metrics collection and push.\n * Supports gauges, counters, default metrics, and custom metrics.\n */\nclass MetricsClient {\n /**\n * @param {Object} config\n * @param {string} [config.appName] Name of the application\n * @param {string} [config.dynoId] Dyno/instance ID\n * @param {string} [config.processType] Process type (web, worker, etc.)\n * @param {boolean} [config.enabled] Enable metrics collection\n * @param {boolean} [config.logValues] Log metrics values to console\n * @param {string} [config.pushgatewayUrl] PushGateway URL\n * @param {string} [config.pushgatewaySecret] PushGateway secret token\n * @param {number} [config.intervalSec] Interval in seconds for pushing metrics\n * @param {boolean} [config.removeOldMetrics] Enable to clear metrics by service name\n * @param {boolean} [config.scripDefaultMetrics] Enable to scip default metrics creation\n * @param {function} [config.startupValidation] Add to validate on start push.\n */\n constructor(config = {}) {\n this.appName = config.appName || process.env.BUILD_APP_NAME || 'unknown-app'\n this.dynoId = config.dynoId || process.env.HOSTNAME || 'unknown-dyno'\n this.processType =\n config.processType ||\n process.env.BUILD_DYNO_PROCESS_TYPE ||\n 'undefined_build_dyno_type'\n this.enabled = config.enabled ?? process.env.METRICS_ENABLED === 'true'\n this.logValues =\n config.logValues ?? process.env.METRICS_LOG_VALUES === 'true'\n this.pushgatewayUrl =\n config.pushgatewayUrl || process.env.METRICS_PUSHGATEWAY_URL || ''\n this.authToken =\n config.pushgatewaySecret || process.env.METRICS_PUSHGATEWAY_SECRET || ''\n this.intervalSec =\n config.intervalSec ||\n parseInt(process.env.METRICS_INTERVAL_SEC || '', 10) ||\n 15\n this.startupValidation = config.startupValidation\n\n this.prefixLogs = `[${this.processType}] [${this.appName}] [${this.dynoId}] [Monitoring]`\n\n this._registry = new client.Registry()\n client.collectDefaultMetrics({ register: this._registry })\n\n this.defaultLabels = {\n app: this.appName,\n dyno_id: this.dynoId,\n process_type: this.processType,\n }\n\n this.gateway = new client.Pushgateway(\n this.pushgatewayUrl,\n {\n headers: { Authorization: `Basic ${this.authToken}` },\n agent: new https.Agent({ keepAlive: true }),\n },\n this._registry\n )\n this.gauges = {}\n this.counters = {}\n this.countersFunctions = {}\n\n /** @type {Object<string, function(): number | Promise<number>>} */\n this.gaugeUpdaters = {}\n this._lastUsageMicros = 0\n this._lastCheckTime = Date.now()\n\n this._clearOldWorkers(config.removeOldMetrics)\n if (!config.scripDefaultMetrics) {\n this._initDefaultMetrics()\n }\n this._setCleanupHandlers()\n }\n\n /**\n * Register all built-in default Gauges and Counters.\n * @private\n */\n _initDefaultMetrics = () => {\n this.createGauge({\n name: 'app_process_cpu_usage_percent',\n help: 'Current CPU usage of the Node.js process in percent',\n updateFn: this.getCpuUsagePercent,\n })\n\n this.createGauge({\n name: 'app_available_cpu_count',\n help: 'How many CPU cores are available to this process',\n updateFn: this.getAvailableCPUs,\n })\n\n this.createGauge({\n name: 'app_container_memory_usage_bytes',\n help: 'Current container RAM usage from cgroup',\n updateFn: this.getContainerMemoryUsage,\n })\n\n this.createGauge({\n name: 'app_event_loop_lag_ms',\n help: 'Estimated event loop lag in milliseconds',\n updateFn: this.measureLag,\n })\n\n this.createGauge({\n name: 'app_container_memory_limit_bytes',\n help: 'Max RAM available to container from cgroup (memory.max)',\n updateFn: this.getContainerMemoryLimit,\n })\n\n this.createGauge({\n name: 'app_uptime_seconds',\n help: 'How long the process has been running',\n updateFn: process.uptime,\n })\n\n this.createCounter({\n name: 'app_http_requests_total',\n help: 'Total number of HTTP requests handled by this process',\n labelNames: this.withDefaultLabels([\n 'method',\n 'route',\n 'endpoint',\n 'appId',\n 'databaseId',\n 'duration',\n 'requestSize',\n 'status_code',\n ]),\n })\n }\n\n /**\n * Create a gauge metric.\n * @param {Object} options - Gauge configuration\n * @param {string} options.name - Name of the gauge\n * @param {string} options.help - Help text describing the gauge\n * @param {function(): number|Promise<number>} [options.updateFn] - Optional function returning the gauge value\n * @param {string[]} [options.labelNames] - Optional custom label names\n * @returns {import('prom-client').Gauge} The created Prometheus gauge\n */\n createGauge = ({\n name,\n help,\n updateFn,\n labelNames = Object.keys(this.defaultLabels),\n }) => {\n if (this.gauges[name]) return this.gauges[name]\n\n const g = new client.Gauge({\n name,\n help,\n labelNames,\n registers: [this._registry],\n })\n this.gauges[name] = g\n\n if (updateFn && typeof updateFn === 'function') {\n this.gaugeUpdaters[name] = updateFn\n }\n\n return g\n }\n\n /**\n * Create a Prometheus Counter metric.\n *\n * @param {Object} params - Counter configuration\n * @param {string} params.name - Metric name\n * @param {string} params.help - Metric description\n * @param {string[]} [params.labelNames] - Optional list of label names. Defaults to this.defaultLabels keys.\n *\n * @returns {(labels?: Object, incrementValue?: number) => void}\n * A function to increment the counter.\n * Usage: (labels?, incrementValue?)\n */\n createCounter({ name, help, labelNames = Object.keys(this.defaultLabels) }) {\n if (this.counters[name]) return this.countersFunctions[name]\n\n const c = new client.Counter({\n name,\n help,\n labelNames,\n registers: [this._registry],\n })\n this.counters[name] = c\n\n this.countersFunctions = {\n ...this.countersFunctions,\n [name]: (data = {}, value = 1) => {\n c.inc({ ...this.defaultLabels, ...data }, value)\n },\n }\n\n return this.countersFunctions[name]\n }\n\n /**\n * Get CPU usage percent (cgroup-aware)\n * @returns {number}\n */\n getCpuUsagePercent = () => {\n try {\n const stat = fs.readFileSync('/sys/fs/cgroup/cpu.stat', 'utf-8')\n const match = stat.match(/usage_usec (\\d+)/)\n if (!match) return 0\n\n const now = Date.now()\n const currentUsage = parseInt(match[1], 10)\n\n if (this._lastUsageMicros === 0) {\n this._lastUsageMicros = currentUsage\n this._lastCheckTime = now\n return 0\n }\n\n const deltaUsage = currentUsage - this._lastUsageMicros\n const deltaTime = now - this._lastCheckTime\n\n this._lastUsageMicros = currentUsage\n this._lastCheckTime = now\n\n return (deltaUsage / (deltaTime * 1000)) * 100\n } catch {\n return 0\n }\n }\n\n /**\n * Get available CPU cores.\n * @returns {number}\n */\n getAvailableCPUs() {\n try {\n const cpuMaxPath = '/sys/fs/cgroup/cpu.max'\n if (fs.existsSync(cpuMaxPath)) {\n const [quotaStr, periodStr] = fs\n .readFileSync(cpuMaxPath, 'utf8')\n .trim()\n .split(' ')\n if (quotaStr === 'max') return os.cpus().length\n return parseInt(quotaStr, 10) / parseInt(periodStr, 10)\n }\n return os.cpus().length\n } catch {\n return 1\n }\n }\n\n /**\n * Get container memory usage in bytes.\n * @returns {number}\n */\n getContainerMemoryUsage() {\n try {\n return parseInt(\n fs.readFileSync('/sys/fs/cgroup/memory.current', 'utf-8').trim(),\n 10\n )\n } catch {\n return process.memoryUsage().rss\n }\n }\n\n /**\n * Get container memory limit in bytes.\n * @returns {number}\n */\n getContainerMemoryLimit() {\n try {\n const path = '/sys/fs/cgroup/memory.max'\n if (fs.existsSync(path)) {\n const val = fs.readFileSync(path, 'utf-8').trim()\n if (val !== 'max') {\n const parsed = parseInt(val, 10)\n if (parsed && parsed < os.totalmem()) return parsed\n }\n }\n return os.totalmem()\n } catch {\n return os.totalmem()\n }\n }\n\n /**\n * Measure event loop lag in ms.\n * @returns {Promise<number>}\n */\n measureLag() {\n return new Promise(resolve => {\n const start = Date.now()\n setImmediate(() => resolve(Date.now() - start))\n })\n }\n\n /**\n * Express middleware to count HTTP requests.\n * Increments the `app_http_requests_total` counter.\n */\n countHttpRequestMiddleware = (req, res, next) => {\n const start = Date.now()\n res.on('finish', () => {\n const endpoint = req.route?.path || req.path || 'unknown'\n const route = req.originalUrl || req.url || 'unknown'\n const appId =\n req.params?.appId || req.body?.appId || req.query?.appId || ''\n const databaseId =\n req.params?.databaseId ||\n req.body?.databaseId ||\n req.query?.databaseId ||\n req.params?.datasourceId ||\n req.body?.datasourceId ||\n req.query?.datasourceId ||\n ''\n this.countersFunctions?.app_http_requests_total({\n method: req.method,\n route,\n endpoint,\n status_code: res.statusCode,\n appId,\n databaseId,\n duration: Date.now() - start,\n requestSize: req.headers['content-length']\n ? parseInt(req.headers['content-length'], 10)\n : 0,\n })\n })\n\n next()\n }\n\n /**\n * Push all gauges and counters to PushGateway and optionally log.\n */\n pushMetrics = async () => {\n try {\n for (const [name, updateFn] of Object.entries(this.gaugeUpdaters)) {\n try {\n if (!updateFn) {\n return\n }\n const result = updateFn()\n const val = result instanceof Promise ? await result : result\n if (val !== undefined) this.gauges[name].set(this.defaultLabels, val)\n } catch (err) {\n console.error(\n `${this.prefixLogs} Failed to update gauge ${name}:`,\n err\n )\n }\n }\n\n await this.gatewayPush()\n\n Object.values(this.counters).forEach(counter => counter.reset())\n\n if (this.logValues) {\n const metrics = await this._registry.getMetricsAsJSON()\n console.log(\n `${this.prefixLogs} Metrics:\\n`,\n JSON.stringify(metrics, null, 2)\n )\n }\n } catch (err) {\n console.error(`${this.prefixLogs} Failed to push metrics:`, err)\n }\n }\n\n _startPush = (interval = this.intervalSec, customPushMetics = undefined) => {\n if (!this.enabled) {\n console.warn(`${this.prefixLogs} Metrics disabled`)\n return\n }\n\n if (this.startupValidation && !this.startupValidation()) {\n return\n }\n\n if (customPushMetics) {\n setInterval(customPushMetics, interval * 1000)\n } else {\n setInterval(() => {\n this.pushMetrics().catch(err => {\n console.error(`${this.prefixLogs} Failed to push metrics:`, err)\n })\n }, interval * 1000)\n }\n\n console.warn(\n `${this.prefixLogs} Metrics collection started. (interval: ${this.intervalSec}s)`\n )\n }\n\n /**\n * Start periodic metrics collection and push.\n *\n * This method wraps the internal `_startPush` method.\n * If a `customPushMetrics` function is provided, it will be executed\n * at the given interval instead of the default `pushMetrics` behavior.\n *\n * @param {number} [interval=this.intervalSec] - Interval in seconds between pushes.\n * @param {() => void | Promise<void>} [customPushMetrics] - Optional custom push function. If provided, Prometheus push is skipped.\n */\n startPush = (interval, customPushMetics) => {\n this._startPush(interval, customPushMetics)\n }\n\n cleanup = async () => {\n if (this.enabled) {\n await this.gatewayDelete()\n }\n process.exit(0)\n }\n\n /**\n * Remove old/stale dyno/instance metrics from PushGateway.\n *\n * Compares existing PushGateway metrics for this job and deletes any instances\n * that do not match the current dynoId.\n *\n * @param {boolean} removeOldMetrics If true, performs cleanup; otherwise does nothing\n * @returns {Promise<void>}\n * @private\n */\n _clearOldWorkers = async removeOldMetrics => {\n if (!removeOldMetrics) return\n\n try {\n const url = `${this.pushgatewayUrl}/metrics`\n const res = await fetch(url, {\n headers: {\n Authorization: `Basic ${this.authToken}`,\n Accept: 'text/plain',\n },\n })\n\n if (!res.ok) {\n console.error(\n `${this.prefixLogs} Failed to fetch metrics: ${res.status}`\n )\n return\n }\n\n const text = await res.text()\n\n const regex = new RegExp(\n `(?:instance=\"([^\"]+)\".*job=\"${this.appName}\"|job=\"${this.appName}\".*instance=\"([^\"]+)\")`,\n 'g'\n )\n const instances = new Set()\n let match\n // eslint-disable-next-line no-cond-assign\n while ((match = regex.exec(text)) !== null) {\n const instance = match[1] || match[2]\n if (instance && instance !== this.dynoId) instances.add(instance)\n }\n\n if (instances.size === 0) {\n console.log(`${this.prefixLogs} No old dynos to delete.`)\n return\n }\n\n for (const instance of instances) {\n await this.gatewayDelete({\n groupings: {\n instance,\n },\n })\n console.log(\n `${this.prefixLogs} Deleted metrics for old dyno: ${instance}`\n )\n }\n\n console.log(\n `${this.prefixLogs} Cleared all old instances for job ${this.appName}`\n )\n } catch (err) {\n console.error(`${this.prefixLogs} Error deleting old metrics:`, err)\n }\n }\n\n /**\n * Delete metrics for this job/instance from PushGateway.\n *\n * @param {Object} [params]\n * @param {string} [params.jobName] Job name (defaults to appName)\n * @param {Object} [params.groupings] Grouping labels\n * @param {string} [params.groupings.process_type] Process type label\n * @param {string} [params.groupings.instance] Instance/dyno ID\n * @returns {Promise<void>}\n */\n gatewayDelete = async (params = {}) => {\n return this.gateway.delete({\n jobName: params.jobName || this.appName,\n groupings: {\n process_type: params.groupings?.process_type || this.processType,\n instance: params.groupings?.instance || this.dynoId,\n },\n })\n }\n\n /**\n * Push metrics to PushGateway.\n *\n * @param {object} [params]\n * @param {string} [params.jobName]\n * @param {object} [params.groupings]\n * @returns {Promise<void>}\n */\n gatewayPush = async (params = {}) => {\n const groupings = {\n process_type: this.processType,\n instance: this.dynoId,\n ...(params.groupings || {}),\n }\n return this.gateway.push({\n jobName: params.jobName || this.appName,\n groupings,\n })\n }\n\n /**\n * Merge the default metric labels (`app`, `dyno_id`, `process_type`)\n * with custom label names.\n *\n * @param {string[]} labels Additional label names\n * @returns {string[]} Combined label names\n */\n withDefaultLabels = (labels = []) => {\n return [...Object.keys(this.defaultLabels), ...labels]\n }\n\n getDefaultLabels = (labels = []) => {\n return this.defaultLabels\n }\n\n _setCleanupHandlers = () => {\n process.on('SIGINT', this.cleanup)\n process.on('SIGTERM', this.cleanup)\n }\n\n // GETTERS\n\n get metricsEnabled() {\n return this.enabled\n }\n\n get metricsLogValues() {\n return this.logValues\n }\n\n get registry() {\n return this._registry\n }\n}\n\nmodule.exports = { MetricsClient }\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,7 +14,6 @@ export class RedisMetricsClient extends MetricsClient {
|
|
|
14
14
|
redisClient: any;
|
|
15
15
|
metricsConfig?: Object | undefined;
|
|
16
16
|
});
|
|
17
|
-
_parentStartPush: (intervalSec?: number | undefined) => void;
|
|
18
17
|
getConfiguredQueueNames: () => string[];
|
|
19
18
|
startupValidation: () => boolean;
|
|
20
19
|
/** Redis client used for queue & Redis metrics */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metricsRedisClient.d.ts","sourceRoot":"","sources":["../src/metricsRedisClient.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH;IACE;;;;OAIG;IACH;QAHwB,WAAW,EAAxB,GAAG;QACc,aAAa;
|
|
1
|
+
{"version":3,"file":"metricsRedisClient.d.ts","sourceRoot":"","sources":["../src/metricsRedisClient.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH;IACE;;;;OAIG;IACH;QAHwB,WAAW,EAAxB,GAAG;QACc,aAAa;OA+FxC;IAtCC,wCAAsD;IACtD,iCAA0C;IAE1C,kDAAkD;IAClD,iBAA8B;IAE9B,4DAA4D;IAC5D,0BAA2B;IAE3B,qCAAqC;IACrC,oDAIE;IAEF,yCAAyC;IACzC,2DAIE;IAEF,mCAAmC;IACnC,sDAIE;IAEF,sCAAsC;IACtC,qDAIE;IAKJ;;;OAGG;IACH,2BAFa,QAAQ,IAAI,CAAC,CAiEzB;IAED;;;;OAIG;IACH,uCAHW,MAAM,KACJ,QAAQ,IAAI,CAAC,CAkDzB;IAED;;;OAGG;IACH,2BAFa,QAAQ,IAAI,CAAC,CAsCzB;IAED;;;OAGG;IACH,sDASC;CAuBF"}
|
|
@@ -52,9 +52,6 @@ class RedisMetricsClient extends MetricsClient {
|
|
|
52
52
|
intervalSec: METRICS_QUEUE_INTERVAL_SEC,
|
|
53
53
|
startupValidation
|
|
54
54
|
});
|
|
55
|
-
this._parentStartPush = this.startPush.bind(this);
|
|
56
|
-
// @ts-ignore
|
|
57
|
-
console.trace("_parentStartPush: ", this._parentStartPush);
|
|
58
55
|
this.getConfiguredQueueNames = getConfiguredQueueNames;
|
|
59
56
|
this.startupValidation = startupValidation;
|
|
60
57
|
|
|
@@ -215,12 +212,8 @@ class RedisMetricsClient extends MetricsClient {
|
|
|
215
212
|
* Start periodic collection.
|
|
216
213
|
* @param {number} [intervalSec=this.intervalSec] - Interval in seconds
|
|
217
214
|
*/
|
|
218
|
-
|
|
219
215
|
startPush = (intervalSec = this.intervalSec) => {
|
|
220
|
-
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
this._parentStartPush(intervalSec, () => {
|
|
216
|
+
this._startPush(intervalSec, () => {
|
|
224
217
|
this.collectQueueMetrics().catch(err => {
|
|
225
218
|
console.error(`[queue-metrics] Failed to collect queue & Redis metrics:`, err);
|
|
226
219
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metricsRedisClient.js","names":["Queue","require","MetricsClient","RedisMetricsClient","constructor","redisClient","metricsConfig","METRICS_QUEUE_INTERVAL_SEC","intervalSec","parseInt","process","env","getConfiguredQueueNames","METRICS_APP_REDIS_BQ","Error","allQueues","split","map","q","trim","filter","Boolean","length","Set","startupValidation","queueNames","console","info","error","message","scripDefaultMetrics","processType","_parentStartPush","startPush","bind","trace","queueCache","Map","queueJobsGauge","createGauge","name","help","labelNames","withDefaultLabels","redisConnectionsGauge","redisMemoryGauge","redisStatsGauge","_setCleanupHandlers","collectRedisMetrics","getRedisInfo","section","Promise","resolve","reject","err","result","clientsInfo","memoryInfo","statsInfo","all","labels","getDefaultLabels","parseRedisInfo","infoStr","Object","fromEntries","line","startsWith","parts","clients","memory","stats","connected_clients","set","connection_type","used_memory","memory_type","maxmemory","instantaneous_ops_per_sec","operation","warn","collectSingleQueueMetrics","queueName","has","redis","isWorker","getEvents","sendEvents","queue","get","health","checkHealth","queue_name","status","waiting","active","succeeded","failed","delayed","collectQueueMetrics","allSettled","gatewayPush","metricsLogValues","metricObjects","registry","getMetricsAsJSON","JSON","stringify","includes","catch","on","cleanup","close","quit","exit","module","exports"],"sources":["../src/metricsRedisClient.js"],"sourcesContent":["const Queue = require('bee-queue')\nconst { MetricsClient } = require('.')\n\n/**\n * RedisMetricsClient extends MetricsClient to collect\n * Redis and Bee Queue metrics periodically and push them to Prometheus Pushgateway.\n *\n * @extends MetricsClient\n */\nclass RedisMetricsClient extends MetricsClient {\n /**\n * @param {Object} options - Metrics client options + Redis client\n * @param {any} options.redisClient - Redis client instance (required)\n * @param {Object} [options.metricsConfig] - MetricsClient configuration overrides\n */\n constructor({ redisClient, metricsConfig = {} } = {}) {\n const METRICS_QUEUE_INTERVAL_SEC =\n metricsConfig.intervalSec ||\n parseInt(process.env.METRICS_QUEUE_INTERVAL_SEC || '', 10) ||\n 5\n\n const getConfiguredQueueNames = () => {\n if (!process.env.METRICS_APP_REDIS_BQ) {\n throw new Error(\n 'No queues configured for monitoring. Set METRICS_APP_REDIS_BQ with comma-separated queue names'\n )\n }\n\n const allQueues = process.env.METRICS_APP_REDIS_BQ.split(',')\n .map(q => q.trim())\n .filter(Boolean)\n\n if (allQueues.length === 0) {\n throw new Error(\n 'METRICS_APP_REDIS_BQ is empty or contains only whitespace. ' +\n 'Example: METRICS_APP_REDIS_BQ=\"adalo-compile,adalo-migrations\"'\n )\n }\n\n return [...new Set(allQueues)]\n }\n\n const startupValidation = () => {\n try {\n const queueNames = getConfiguredQueueNames()\n console.info(\n `[queue-metrics] Queue & Redis metrics collection starting for ${queueNames.length} queues`\n )\n return true\n } catch (error) {\n console.error(`[queue-metrics] ❌ Cannot start: ${error.message}`)\n console.error(\n `[queue-metrics] 💡 Example: METRICS_APP_REDIS_BQ=\"adalo-compile,adalo-migrations\"`\n )\n console.error(\n `[queue-metrics] 💡 Optional: METRICS_QUEUE_INTERVAL_SEC=\"10\"`\n )\n console.error(`[queue-metrics] Skipping queue metrics collection`)\n return false\n }\n }\n\n super({\n ...metricsConfig,\n scripDefaultMetrics: true,\n processType: metricsConfig.processType || 'queue-metrics',\n intervalSec: METRICS_QUEUE_INTERVAL_SEC,\n startupValidation,\n })\n this._parentStartPush = this.startPush.bind(this);\n // @ts-ignore\n console.trace(\"_parentStartPush: \", this._parentStartPush)\n\n this.getConfiguredQueueNames = getConfiguredQueueNames\n this.startupValidation = startupValidation\n\n /** Redis client used for queue & Redis metrics */\n this.redisClient = redisClient\n\n /** Cache for queue objects to avoid multiple connections */\n this.queueCache = new Map()\n\n /** Gauge for queue jobs by status */\n this.queueJobsGauge = this.createGauge({\n name: 'app_queue_jobs_count',\n help: 'Number of app jobs in the queue by status',\n labelNames: this.withDefaultLabels(['queue_name', 'status']),\n })\n\n /** Gauge for Redis client connections */\n this.redisConnectionsGauge = this.createGauge({\n name: 'app_redis_connections_count',\n help: 'Number of Redis client connections',\n labelNames: this.withDefaultLabels(['connection_type']),\n })\n\n /** Gauge for Redis memory usage */\n this.redisMemoryGauge = this.createGauge({\n name: 'app_redis_memory_bytes',\n help: 'Redis memory usage in bytes',\n labelNames: this.withDefaultLabels(['memory_type']),\n })\n\n /** Gauge for Redis operation stats */\n this.redisStatsGauge = this.createGauge({\n name: 'app_redis_stats_total',\n help: 'Redis operation statistics',\n labelNames: this.withDefaultLabels(['operation']),\n })\n\n this._setCleanupHandlers()\n }\n\n /**\n * Collect basic Redis INFO metrics: clients, memory, stats\n * @returns {Promise<void>}\n */\n collectRedisMetrics = async () => {\n try {\n const getRedisInfo = section =>\n new Promise((resolve, reject) => {\n this.redisClient.info(section, (err, result) => {\n if (err) reject(err)\n else resolve(result)\n })\n })\n\n const [clientsInfo, memoryInfo, statsInfo] = await Promise.all([\n getRedisInfo('clients'),\n getRedisInfo('memory'),\n getRedisInfo('stats'),\n ])\n\n const labels = this.getDefaultLabels()\n\n const parseRedisInfo = infoStr =>\n Object.fromEntries(\n infoStr\n .split('\\r\\n')\n .filter(line => line && !line.startsWith('#'))\n .map(line => line.split(':', 2))\n .filter(parts => parts.length === 2 && parts[0] && parts[1])\n )\n\n const clients = parseRedisInfo(clientsInfo)\n const memory = parseRedisInfo(memoryInfo)\n const stats = parseRedisInfo(statsInfo)\n\n if (clients.connected_clients) {\n this.redisConnectionsGauge.set(\n { ...labels, connection_type: 'connected' },\n parseInt(clients.connected_clients, 10) || 0\n )\n }\n\n if (memory.used_memory) {\n this.redisMemoryGauge.set(\n { ...labels, memory_type: 'used' },\n parseInt(memory.used_memory, 10) || 0\n )\n }\n if (memory.maxmemory) {\n this.redisMemoryGauge.set(\n { ...labels, memory_type: 'max' },\n parseInt(memory.maxmemory, 10) || 0\n )\n }\n\n if (stats.instantaneous_ops_per_sec) {\n this.redisStatsGauge.set(\n { ...labels, operation: 'ops_per_sec' },\n parseInt(stats.instantaneous_ops_per_sec, 10) || 0\n )\n }\n } catch (error) {\n console.warn(\n `[redis-metrics] Failed to collect Redis metrics:`,\n error.message\n )\n }\n }\n\n /**\n * Collect metrics for a single Bee Queue and set gauges\n * @param {string} queueName - Name of the queue\n * @returns {Promise<void>}\n */\n collectSingleQueueMetrics = async queueName => {\n try {\n if (!this.queueCache.has(queueName)) {\n this.queueCache.set(\n queueName,\n new Queue(queueName, {\n redis: this.redisClient,\n isWorker: false,\n getEvents: false,\n sendEvents: false,\n })\n )\n }\n\n const queue = this.queueCache.get(queueName)\n const health = await queue.checkHealth()\n\n const labels = {\n ...this.getDefaultLabels(),\n queue_name: queueName,\n }\n\n this.queueJobsGauge.set(\n { ...labels, status: 'waiting' },\n health.waiting || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'active' },\n health.active || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'succeeded' },\n health.succeeded || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'failed' },\n health.failed || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'delayed' },\n health.delayed || 0\n )\n } catch (error) {\n console.warn(\n `[queue-metrics] Failed to collect metrics for queue ${queueName}:`,\n error.message\n )\n }\n }\n\n /**\n * Collect metrics for all queues and Redis, then push to Pushgateway\n * @returns {Promise<void>}\n */\n collectQueueMetrics = async () => {\n try {\n const queueNames = this.getConfiguredQueueNames()\n\n await this.collectRedisMetrics()\n await Promise.allSettled(\n queueNames.map(queueName => this.collectSingleQueueMetrics(queueName))\n )\n\n await this.gatewayPush()\n\n if (this.metricsLogValues) {\n const metricObjects = await this.registry.getMetricsAsJSON()\n console.info(\n `[queue-metrics] Collected metrics for ${queueNames.length} queues:`,\n JSON.stringify(metricObjects, null, 2)\n )\n }\n } catch (error) {\n if (\n error.message?.includes('No queues configured') ||\n error.message?.includes('METRICS_APP_REDIS_BQ')\n ) {\n console.error(\n `[queue-metrics] ❌ Configuration error: ${error.message}`\n )\n console.error(\n `[queue-metrics] 💡 Example config: METRICS_APP_REDIS_BQ=\"adalo-compile,adalo-migrations\"`\n )\n } else {\n console.error(\n `[queue-metrics] Failed to collect queue metrics: ${error.message}`\n )\n }\n throw error\n }\n }\n\n /**\n * Start periodic collection.\n * @param {number} [intervalSec=this.intervalSec] - Interval in seconds\n */\n\n startPush = (intervalSec = this.intervalSec) => {\n if (!this._parentStartPush) {\n return;\n }\n this._parentStartPush(intervalSec, () => {\n this.collectQueueMetrics().catch(err => {\n console.error(\n `[queue-metrics] Failed to collect queue & Redis metrics:`,\n err\n )\n })\n })\n }\n\n _setCleanupHandlers = () => {\n process.on('SIGINT', this.cleanup)\n process.on('SIGTERM', this.cleanup)\n }\n\n /**\n * Cleanup queues and Redis client\n */\n cleanup = async () => {\n for (const [queueName, queue] of this.queueCache) {\n try {\n await queue.close()\n } catch (err) {\n console.error(`[queue-metrics] Error closing queue ${queueName}:`, err)\n }\n }\n\n // Close Redis connection\n this.redisClient?.quit()\n process.exit(0)\n }\n}\n\nmodule.exports = { RedisMetricsClient }\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"metricsRedisClient.js","names":["Queue","require","MetricsClient","RedisMetricsClient","constructor","redisClient","metricsConfig","METRICS_QUEUE_INTERVAL_SEC","intervalSec","parseInt","process","env","getConfiguredQueueNames","METRICS_APP_REDIS_BQ","Error","allQueues","split","map","q","trim","filter","Boolean","length","Set","startupValidation","queueNames","console","info","error","message","scripDefaultMetrics","processType","queueCache","Map","queueJobsGauge","createGauge","name","help","labelNames","withDefaultLabels","redisConnectionsGauge","redisMemoryGauge","redisStatsGauge","_setCleanupHandlers","collectRedisMetrics","getRedisInfo","section","Promise","resolve","reject","err","result","clientsInfo","memoryInfo","statsInfo","all","labels","getDefaultLabels","parseRedisInfo","infoStr","Object","fromEntries","line","startsWith","parts","clients","memory","stats","connected_clients","set","connection_type","used_memory","memory_type","maxmemory","instantaneous_ops_per_sec","operation","warn","collectSingleQueueMetrics","queueName","has","redis","isWorker","getEvents","sendEvents","queue","get","health","checkHealth","queue_name","status","waiting","active","succeeded","failed","delayed","collectQueueMetrics","allSettled","gatewayPush","metricsLogValues","metricObjects","registry","getMetricsAsJSON","JSON","stringify","includes","startPush","_startPush","catch","on","cleanup","close","quit","exit","module","exports"],"sources":["../src/metricsRedisClient.js"],"sourcesContent":["const Queue = require('bee-queue')\nconst { MetricsClient } = require('.')\n\n/**\n * RedisMetricsClient extends MetricsClient to collect\n * Redis and Bee Queue metrics periodically and push them to Prometheus Pushgateway.\n *\n * @extends MetricsClient\n */\nclass RedisMetricsClient extends MetricsClient {\n /**\n * @param {Object} options - Metrics client options + Redis client\n * @param {any} options.redisClient - Redis client instance (required)\n * @param {Object} [options.metricsConfig] - MetricsClient configuration overrides\n */\n constructor({ redisClient, metricsConfig = {} } = {}) {\n const METRICS_QUEUE_INTERVAL_SEC =\n metricsConfig.intervalSec ||\n parseInt(process.env.METRICS_QUEUE_INTERVAL_SEC || '', 10) ||\n 5\n\n const getConfiguredQueueNames = () => {\n if (!process.env.METRICS_APP_REDIS_BQ) {\n throw new Error(\n 'No queues configured for monitoring. Set METRICS_APP_REDIS_BQ with comma-separated queue names'\n )\n }\n\n const allQueues = process.env.METRICS_APP_REDIS_BQ.split(',')\n .map(q => q.trim())\n .filter(Boolean)\n\n if (allQueues.length === 0) {\n throw new Error(\n 'METRICS_APP_REDIS_BQ is empty or contains only whitespace. ' +\n 'Example: METRICS_APP_REDIS_BQ=\"adalo-compile,adalo-migrations\"'\n )\n }\n\n return [...new Set(allQueues)]\n }\n\n const startupValidation = () => {\n try {\n const queueNames = getConfiguredQueueNames()\n console.info(\n `[queue-metrics] Queue & Redis metrics collection starting for ${queueNames.length} queues`\n )\n return true\n } catch (error) {\n console.error(`[queue-metrics] ❌ Cannot start: ${error.message}`)\n console.error(\n `[queue-metrics] 💡 Example: METRICS_APP_REDIS_BQ=\"adalo-compile,adalo-migrations\"`\n )\n console.error(\n `[queue-metrics] 💡 Optional: METRICS_QUEUE_INTERVAL_SEC=\"10\"`\n )\n console.error(`[queue-metrics] Skipping queue metrics collection`)\n return false\n }\n }\n\n super({\n ...metricsConfig,\n scripDefaultMetrics: true,\n processType: metricsConfig.processType || 'queue-metrics',\n intervalSec: METRICS_QUEUE_INTERVAL_SEC,\n startupValidation,\n })\n\n this.getConfiguredQueueNames = getConfiguredQueueNames\n this.startupValidation = startupValidation\n\n /** Redis client used for queue & Redis metrics */\n this.redisClient = redisClient\n\n /** Cache for queue objects to avoid multiple connections */\n this.queueCache = new Map()\n\n /** Gauge for queue jobs by status */\n this.queueJobsGauge = this.createGauge({\n name: 'app_queue_jobs_count',\n help: 'Number of app jobs in the queue by status',\n labelNames: this.withDefaultLabels(['queue_name', 'status']),\n })\n\n /** Gauge for Redis client connections */\n this.redisConnectionsGauge = this.createGauge({\n name: 'app_redis_connections_count',\n help: 'Number of Redis client connections',\n labelNames: this.withDefaultLabels(['connection_type']),\n })\n\n /** Gauge for Redis memory usage */\n this.redisMemoryGauge = this.createGauge({\n name: 'app_redis_memory_bytes',\n help: 'Redis memory usage in bytes',\n labelNames: this.withDefaultLabels(['memory_type']),\n })\n\n /** Gauge for Redis operation stats */\n this.redisStatsGauge = this.createGauge({\n name: 'app_redis_stats_total',\n help: 'Redis operation statistics',\n labelNames: this.withDefaultLabels(['operation']),\n })\n\n this._setCleanupHandlers()\n }\n\n /**\n * Collect basic Redis INFO metrics: clients, memory, stats\n * @returns {Promise<void>}\n */\n collectRedisMetrics = async () => {\n try {\n const getRedisInfo = section =>\n new Promise((resolve, reject) => {\n this.redisClient.info(section, (err, result) => {\n if (err) reject(err)\n else resolve(result)\n })\n })\n\n const [clientsInfo, memoryInfo, statsInfo] = await Promise.all([\n getRedisInfo('clients'),\n getRedisInfo('memory'),\n getRedisInfo('stats'),\n ])\n\n const labels = this.getDefaultLabels()\n\n const parseRedisInfo = infoStr =>\n Object.fromEntries(\n infoStr\n .split('\\r\\n')\n .filter(line => line && !line.startsWith('#'))\n .map(line => line.split(':', 2))\n .filter(parts => parts.length === 2 && parts[0] && parts[1])\n )\n\n const clients = parseRedisInfo(clientsInfo)\n const memory = parseRedisInfo(memoryInfo)\n const stats = parseRedisInfo(statsInfo)\n\n if (clients.connected_clients) {\n this.redisConnectionsGauge.set(\n { ...labels, connection_type: 'connected' },\n parseInt(clients.connected_clients, 10) || 0\n )\n }\n\n if (memory.used_memory) {\n this.redisMemoryGauge.set(\n { ...labels, memory_type: 'used' },\n parseInt(memory.used_memory, 10) || 0\n )\n }\n if (memory.maxmemory) {\n this.redisMemoryGauge.set(\n { ...labels, memory_type: 'max' },\n parseInt(memory.maxmemory, 10) || 0\n )\n }\n\n if (stats.instantaneous_ops_per_sec) {\n this.redisStatsGauge.set(\n { ...labels, operation: 'ops_per_sec' },\n parseInt(stats.instantaneous_ops_per_sec, 10) || 0\n )\n }\n } catch (error) {\n console.warn(\n `[redis-metrics] Failed to collect Redis metrics:`,\n error.message\n )\n }\n }\n\n /**\n * Collect metrics for a single Bee Queue and set gauges\n * @param {string} queueName - Name of the queue\n * @returns {Promise<void>}\n */\n collectSingleQueueMetrics = async queueName => {\n try {\n if (!this.queueCache.has(queueName)) {\n this.queueCache.set(\n queueName,\n new Queue(queueName, {\n redis: this.redisClient,\n isWorker: false,\n getEvents: false,\n sendEvents: false,\n })\n )\n }\n\n const queue = this.queueCache.get(queueName)\n const health = await queue.checkHealth()\n\n const labels = {\n ...this.getDefaultLabels(),\n queue_name: queueName,\n }\n\n this.queueJobsGauge.set(\n { ...labels, status: 'waiting' },\n health.waiting || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'active' },\n health.active || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'succeeded' },\n health.succeeded || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'failed' },\n health.failed || 0\n )\n this.queueJobsGauge.set(\n { ...labels, status: 'delayed' },\n health.delayed || 0\n )\n } catch (error) {\n console.warn(\n `[queue-metrics] Failed to collect metrics for queue ${queueName}:`,\n error.message\n )\n }\n }\n\n /**\n * Collect metrics for all queues and Redis, then push to Pushgateway\n * @returns {Promise<void>}\n */\n collectQueueMetrics = async () => {\n try {\n const queueNames = this.getConfiguredQueueNames()\n\n await this.collectRedisMetrics()\n await Promise.allSettled(\n queueNames.map(queueName => this.collectSingleQueueMetrics(queueName))\n )\n\n await this.gatewayPush()\n\n if (this.metricsLogValues) {\n const metricObjects = await this.registry.getMetricsAsJSON()\n console.info(\n `[queue-metrics] Collected metrics for ${queueNames.length} queues:`,\n JSON.stringify(metricObjects, null, 2)\n )\n }\n } catch (error) {\n if (\n error.message?.includes('No queues configured') ||\n error.message?.includes('METRICS_APP_REDIS_BQ')\n ) {\n console.error(\n `[queue-metrics] ❌ Configuration error: ${error.message}`\n )\n console.error(\n `[queue-metrics] 💡 Example config: METRICS_APP_REDIS_BQ=\"adalo-compile,adalo-migrations\"`\n )\n } else {\n console.error(\n `[queue-metrics] Failed to collect queue metrics: ${error.message}`\n )\n }\n throw error\n }\n }\n\n /**\n * Start periodic collection.\n * @param {number} [intervalSec=this.intervalSec] - Interval in seconds\n */\n startPush = (intervalSec = this.intervalSec) => {\n this._startPush(intervalSec, () => {\n this.collectQueueMetrics().catch(err => {\n console.error(\n `[queue-metrics] Failed to collect queue & Redis metrics:`,\n err\n )\n })\n })\n }\n\n _setCleanupHandlers = () => {\n process.on('SIGINT', this.cleanup)\n process.on('SIGTERM', this.cleanup)\n }\n\n /**\n * Cleanup queues and Redis client\n */\n cleanup = async () => {\n for (const [queueName, queue] of this.queueCache) {\n try {\n await queue.close()\n } catch (err) {\n console.error(`[queue-metrics] Error closing queue ${queueName}:`, err)\n }\n }\n\n // Close Redis connection\n this.redisClient?.quit()\n process.exit(0)\n }\n}\n\nmodule.exports = { RedisMetricsClient }\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
package/src/metricsClient.js
CHANGED
|
@@ -370,14 +370,7 @@ class MetricsClient {
|
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
-
|
|
374
|
-
* Start periodic metrics collection + push.
|
|
375
|
-
*
|
|
376
|
-
* @param {number} [interval] Interval in seconds
|
|
377
|
-
* @param {function(): void|Promise<void>} [customPushMetics]
|
|
378
|
-
* Optional custom push function. If provided, Prometheus push is skipped.
|
|
379
|
-
*/
|
|
380
|
-
startPush = (interval = this.intervalSec, customPushMetics = undefined) => {
|
|
373
|
+
_startPush = (interval = this.intervalSec, customPushMetics = undefined) => {
|
|
381
374
|
if (!this.enabled) {
|
|
382
375
|
console.warn(`${this.prefixLogs} Metrics disabled`)
|
|
383
376
|
return
|
|
@@ -402,6 +395,20 @@ class MetricsClient {
|
|
|
402
395
|
)
|
|
403
396
|
}
|
|
404
397
|
|
|
398
|
+
/**
|
|
399
|
+
* Start periodic metrics collection and push.
|
|
400
|
+
*
|
|
401
|
+
* This method wraps the internal `_startPush` method.
|
|
402
|
+
* If a `customPushMetrics` function is provided, it will be executed
|
|
403
|
+
* at the given interval instead of the default `pushMetrics` behavior.
|
|
404
|
+
*
|
|
405
|
+
* @param {number} [interval=this.intervalSec] - Interval in seconds between pushes.
|
|
406
|
+
* @param {() => void | Promise<void>} [customPushMetrics] - Optional custom push function. If provided, Prometheus push is skipped.
|
|
407
|
+
*/
|
|
408
|
+
startPush = (interval, customPushMetics) => {
|
|
409
|
+
this._startPush(interval, customPushMetics)
|
|
410
|
+
}
|
|
411
|
+
|
|
405
412
|
cleanup = async () => {
|
|
406
413
|
if (this.enabled) {
|
|
407
414
|
await this.gatewayDelete()
|
|
@@ -67,9 +67,6 @@ class RedisMetricsClient extends MetricsClient {
|
|
|
67
67
|
intervalSec: METRICS_QUEUE_INTERVAL_SEC,
|
|
68
68
|
startupValidation,
|
|
69
69
|
})
|
|
70
|
-
this._parentStartPush = this.startPush.bind(this);
|
|
71
|
-
// @ts-ignore
|
|
72
|
-
console.trace("_parentStartPush: ", this._parentStartPush)
|
|
73
70
|
|
|
74
71
|
this.getConfiguredQueueNames = getConfiguredQueueNames
|
|
75
72
|
this.startupValidation = startupValidation
|
|
@@ -281,12 +278,8 @@ class RedisMetricsClient extends MetricsClient {
|
|
|
281
278
|
* Start periodic collection.
|
|
282
279
|
* @param {number} [intervalSec=this.intervalSec] - Interval in seconds
|
|
283
280
|
*/
|
|
284
|
-
|
|
285
281
|
startPush = (intervalSec = this.intervalSec) => {
|
|
286
|
-
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
this._parentStartPush(intervalSec, () => {
|
|
282
|
+
this._startPush(intervalSec, () => {
|
|
290
283
|
this.collectQueueMetrics().catch(err => {
|
|
291
284
|
console.error(
|
|
292
285
|
`[queue-metrics] Failed to collect queue & Redis metrics:`,
|