@adalo/metrics 0.1.29 → 0.1.31

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.
@@ -49,6 +49,7 @@ export class MetricsClient {
49
49
  gateway: client.Pushgateway<"text/plain; version=0.0.4; charset=utf-8">;
50
50
  gauges: {};
51
51
  counters: {};
52
+ countersFunctions: {};
52
53
  /** @type {Object<string, function(): number | Promise<number>>} */
53
54
  gaugeUpdaters: {
54
55
  [x: string]: () => number | Promise<number>;
@@ -85,8 +86,8 @@ export class MetricsClient {
85
86
  * @param {string[]} [params.labelNames] - Optional list of label names. Defaults to this.defaultLabels keys.
86
87
  *
87
88
  * @returns {(labels?: Object, incrementValue?: number) => void}
88
- * A trigger function to increment the counter.
89
- * Usage: triggerFn(labels?, incrementValue?)
89
+ * A function to increment the counter.
90
+ * Usage: (labels?, incrementValue?)
90
91
  */
91
92
  createCounter({ name, help, labelNames }: {
92
93
  name: string;
@@ -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,aAAa;QACb,mBAAmB;QAClB,iBAAiB;OAwD7C;IArDC,gBACiE;IACjE,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;IAElB,mEAAmE;IACnE;YADkB,MAAM,SAAc,MAAM,GAAG,QAAQ,MAAM,CAAC;MACvC;IACvB,2BAAgC;IAChC,yBAAyB;IACzB,uBAAgC;IASlC;;;OAGG;IACH,4BAkDC;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;;;;;;OAMG;IACH,qEAHuB,IAAI,GAAC,QAAQ,IAAI,CAAC,uBA0BxC;IAED,8BAKC;IAED;;;;;;;;;OASG;IACH,yBAuDC;IAED;;;;;;;;;OASG;IACH;;;;;;sBAFa,QAAQ,IAAI,CAAC,CAUzB;IAED;;;;;;;OAOG;IACH;;;sBAFa,QAAQ,IAAI,CAAC,CAazB;IAED;;;;;;OAMG;IACH,6BAHW,MAAM,EAAE,KACN,MAAM,EAAE,CAIpB;IAED;;;;MAEC;IAED,gCAGC;IAID,8BAEC;IAED,gCAEC;IAED,4EAEC;CACF"}
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,aAAa;QACb,mBAAmB;QAClB,iBAAiB;OAyD7C;IAtDC,gBACiE;IACjE,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,2BAAgC;IAChC,yBAAyB;IACzB,uBAAgC;IASlC;;;OAGG;IACH,4BAkDC;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,CAsB9D;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,oEAiCC;IAED;;OAEG;IACH,iCAgCC;IAED;;;;;;OAMG;IACH,qEAHuB,IAAI,GAAC,QAAQ,IAAI,CAAC,uBA0BxC;IAED,8BAKC;IAED;;;;;;;;;OASG;IACH,yBAuDC;IAED;;;;;;;;;OASG;IACH;;;;;;sBAFa,QAAQ,IAAI,CAAC,CAUzB;IAED;;;;;;;OAOG;IACH;;;sBAFa,QAAQ,IAAI,CAAC,CAazB;IAED;;;;;;OAMG;IACH,6BAHW,MAAM,EAAE,KACN,MAAM,EAAE,CAIpB;IAED;;;;MAEC;IAED,gCAGC;IAID,8BAEC;IAED,gCAEC;IAED,4EAEC;CACF"}
@@ -54,6 +54,7 @@ class MetricsClient {
54
54
  }, this._registry);
55
55
  this.gauges = {};
56
56
  this.counters = {};
57
+ this.countersFunctions = {};
57
58
 
58
59
  /** @type {Object<string, function(): number | Promise<number>>} */
59
60
  this.gaugeUpdaters = {};
@@ -148,15 +149,15 @@ class MetricsClient {
148
149
  * @param {string[]} [params.labelNames] - Optional list of label names. Defaults to this.defaultLabels keys.
149
150
  *
150
151
  * @returns {(labels?: Object, incrementValue?: number) => void}
151
- * A trigger function to increment the counter.
152
- * Usage: triggerFn(labels?, incrementValue?)
152
+ * A function to increment the counter.
153
+ * Usage: (labels?, incrementValue?)
153
154
  */
154
155
  createCounter({
155
156
  name,
156
157
  help,
157
158
  labelNames = Object.keys(this.defaultLabels)
158
159
  }) {
159
- if (this.counters[name]) return this.counters[name].triggerFn;
160
+ if (this.counters[name]) return this.countersFunctions[name];
160
161
  const c = new client.Counter({
161
162
  name,
162
163
  help,
@@ -164,19 +165,18 @@ class MetricsClient {
164
165
  registers: [this._registry]
165
166
  });
166
167
  this.counters[name] = c;
167
- const triggerFn = (data = {}, value = 1) => {
168
- console.log("triggerFn: data", {
168
+ this.countersFunctions[name] = (data = {}, value = 1) => {
169
+ console.log('triggerFn: data', {
169
170
  ...this.defaultLabels,
170
171
  ...data
171
172
  });
172
- console.log("triggerFn: value", value);
173
+ console.log('triggerFn: value', value);
173
174
  c.inc({
174
175
  ...this.defaultLabels,
175
176
  ...data
176
177
  }, value);
177
178
  };
178
- this.counters[name].triggerFn = triggerFn;
179
- return triggerFn;
179
+ return this.countersFunctions[name];
180
180
  }
181
181
 
182
182
  /**
@@ -272,14 +272,14 @@ class MetricsClient {
272
272
  */
273
273
  countHttpRequestMiddleware = (req, res, next) => {
274
274
  const start = Date.now();
275
- console.log("countHttpRequestMiddleware start");
275
+ console.log('countHttpRequestMiddleware start');
276
276
  res.on('finish', () => {
277
277
  console.log("countHttpRequestMiddleware res.on('finish'");
278
278
  const route = req.route?.path || req.path || 'unknown';
279
279
  const appId = req.params?.appId || req.body?.appId || req.query?.appId || '';
280
280
  const databaseId = req.params?.databaseId || req.body?.databaseId || req.query?.databaseId || '';
281
- console.log("countHttpRequestMiddleware this.counters?.app_http_requests_total?.triggerFn", this.counters?.app_http_requests_total?.triggerFn);
282
- this.counters?.app_http_requests_total?.triggerFn({
281
+ console.log('countHttpRequestMiddleware this.counters?.app_http_requests_total', this.countersFunctions?.app_http_requests_total);
282
+ this.countersFunctions?.app_http_requests_total({
283
283
  method: req.method,
284
284
  route,
285
285
  status_code: res.statusCode,
@@ -438,7 +438,7 @@ class MetricsClient {
438
438
  instance: this.dynoId,
439
439
  ...(params.groupings || {})
440
440
  };
441
- console.log("this.gateway.push");
441
+ console.log('this.gateway.push');
442
442
  return this.gateway.push({
443
443
  jobName: params.jobName || this.appName,
444
444
  groupings
@@ -1 +1 @@
1
- {"version":3,"file":"metricsClient.js","names":["client","require","fs","os","https","MetricsClient","constructor","config","appName","process","env","METRICS_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","gaugeUpdaters","customsMetricsTracking","_lastUsageMicros","_lastCheckTime","Date","now","_clearOldWorkers","removeAllJobs","then","_","scripDefaultMetrics","_initDefaultMetrics","_setCleanupHandlers","createGauge","name","help","updateFn","getCpuUsagePercent","getAvailableCPUs","getContainerMemoryUsage","measureLag","getContainerMemoryLimit","uptime","createCounter","labelNames","withDefaultLabels","Object","keys","g","Gauge","registers","triggerFn","c","Counter","data","value","console","log","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","route","appId","params","body","query","databaseId","app_http_requests_total","method","status_code","statusCode","duration","requestSize","pushMetrics","entries","result","undefined","set","err","error","gatewayPush","values","forEach","counter","reset","metrics","getMetricsAsJSON","JSON","stringify","startPush","interval","customPushMetics","warn","setInterval","catch","cleanup","gatewayDelete","exit","url","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.removeAllJobs] Enable to clear all jobs at startup\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 =\n config.appName || process.env.METRICS_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\n /** @type {Object<string, function(): number | Promise<number>>} */\n this.gaugeUpdaters = {}\n this.customsMetricsTracking = {}\n this._lastUsageMicros = 0\n this._lastCheckTime = Date.now()\n this._clearOldWorkers(config.removeAllJobs).then(_ => {\n if (config.scripDefaultMetrics) {\n this._initDefaultMetrics()\n }\n this._setCleanupHandlers()\n })\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 '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 trigger function to increment the counter.\n * Usage: triggerFn(labels?, incrementValue?)\n */\n createCounter({ name, help, labelNames = Object.keys(this.defaultLabels) }) {\n if (this.counters[name]) return this.counters[name].triggerFn\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 const triggerFn = (data = {}, value = 1) => {\n console.log(\"triggerFn: data\", { ...this.defaultLabels, ...data } )\n console.log(\"triggerFn: value\", value )\n c.inc({ ...this.defaultLabels, ...data }, value)\n }\n\n this.counters[name].triggerFn = triggerFn\n return triggerFn\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 console.log(\"countHttpRequestMiddleware start\")\n res.on('finish', () => {\n console.log(\"countHttpRequestMiddleware res.on('finish'\")\n\n const route = req.route?.path || req.path || '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 ''\n console.log(\"countHttpRequestMiddleware this.counters?.app_http_requests_total?.triggerFn\", this.counters?.app_http_requests_total?.triggerFn)\n\n this.counters?.app_http_requests_total?.triggerFn({\n method: req.method,\n route,\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} removeAllJobs If true, performs cleanup; otherwise does nothing\n * @returns {Promise<void>}\n * @private\n */\n _clearOldWorkers = async removeAllJobs => {\n if (!removeAllJobs) 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 console.log(\"this.gateway.push\")\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","METRICS_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","customsMetricsTracking","_lastUsageMicros","_lastCheckTime","Date","now","_clearOldWorkers","removeAllJobs","then","_","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","console","log","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","route","appId","params","body","query","databaseId","app_http_requests_total","method","status_code","statusCode","duration","requestSize","pushMetrics","entries","result","undefined","set","err","error","gatewayPush","values","forEach","counter","reset","metrics","getMetricsAsJSON","JSON","stringify","startPush","interval","customPushMetics","warn","setInterval","catch","cleanup","gatewayDelete","exit","url","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.removeAllJobs] Enable to clear all jobs at startup\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 =\n config.appName || process.env.METRICS_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.customsMetricsTracking = {}\n this._lastUsageMicros = 0\n this._lastCheckTime = Date.now()\n this._clearOldWorkers(config.removeAllJobs).then(_ => {\n if (config.scripDefaultMetrics) {\n this._initDefaultMetrics()\n }\n this._setCleanupHandlers()\n })\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 '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[name] = (data = {}, value = 1) => {\n console.log('triggerFn: data', { ...this.defaultLabels, ...data })\n console.log('triggerFn: value', value)\n c.inc({ ...this.defaultLabels, ...data }, value)\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 console.log('countHttpRequestMiddleware start')\n res.on('finish', () => {\n console.log(\"countHttpRequestMiddleware res.on('finish'\")\n\n const route = req.route?.path || req.path || '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 ''\n console.log(\n 'countHttpRequestMiddleware this.counters?.app_http_requests_total',\n this.countersFunctions?.app_http_requests_total\n )\n\n this.countersFunctions?.app_http_requests_total({\n method: req.method,\n route,\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} removeAllJobs If true, performs cleanup; otherwise does nothing\n * @returns {Promise<void>}\n * @private\n */\n _clearOldWorkers = async removeAllJobs => {\n if (!removeAllJobs) 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 console.log('this.gateway.push')\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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adalo/metrics",
3
- "version": "0.1.29",
3
+ "version": "0.1.31",
4
4
  "description": "Reusable metrics utilities for Node.js and Laravel apps",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -64,6 +64,7 @@ class MetricsClient {
64
64
  )
65
65
  this.gauges = {}
66
66
  this.counters = {}
67
+ this.countersFunctions = {}
67
68
 
68
69
  /** @type {Object<string, function(): number | Promise<number>>} */
69
70
  this.gaugeUpdaters = {}
@@ -175,11 +176,11 @@ class MetricsClient {
175
176
  * @param {string[]} [params.labelNames] - Optional list of label names. Defaults to this.defaultLabels keys.
176
177
  *
177
178
  * @returns {(labels?: Object, incrementValue?: number) => void}
178
- * A trigger function to increment the counter.
179
- * Usage: triggerFn(labels?, incrementValue?)
179
+ * A function to increment the counter.
180
+ * Usage: (labels?, incrementValue?)
180
181
  */
181
182
  createCounter({ name, help, labelNames = Object.keys(this.defaultLabels) }) {
182
- if (this.counters[name]) return this.counters[name].triggerFn
183
+ if (this.counters[name]) return this.countersFunctions[name]
183
184
 
184
185
  const c = new client.Counter({
185
186
  name,
@@ -189,14 +190,13 @@ class MetricsClient {
189
190
  })
190
191
  this.counters[name] = c
191
192
 
192
- const triggerFn = (data = {}, value = 1) => {
193
- console.log("triggerFn: data", { ...this.defaultLabels, ...data } )
194
- console.log("triggerFn: value", value )
193
+ this.countersFunctions[name] = (data = {}, value = 1) => {
194
+ console.log('triggerFn: data', { ...this.defaultLabels, ...data })
195
+ console.log('triggerFn: value', value)
195
196
  c.inc({ ...this.defaultLabels, ...data }, value)
196
197
  }
197
198
 
198
- this.counters[name].triggerFn = triggerFn
199
- return triggerFn
199
+ return this.countersFunctions[name]
200
200
  }
201
201
 
202
202
  /**
@@ -303,7 +303,7 @@ class MetricsClient {
303
303
  */
304
304
  countHttpRequestMiddleware = (req, res, next) => {
305
305
  const start = Date.now()
306
- console.log("countHttpRequestMiddleware start")
306
+ console.log('countHttpRequestMiddleware start')
307
307
  res.on('finish', () => {
308
308
  console.log("countHttpRequestMiddleware res.on('finish'")
309
309
 
@@ -315,9 +315,12 @@ class MetricsClient {
315
315
  req.body?.databaseId ||
316
316
  req.query?.databaseId ||
317
317
  ''
318
- console.log("countHttpRequestMiddleware this.counters?.app_http_requests_total?.triggerFn", this.counters?.app_http_requests_total?.triggerFn)
318
+ console.log(
319
+ 'countHttpRequestMiddleware this.counters?.app_http_requests_total',
320
+ this.countersFunctions?.app_http_requests_total
321
+ )
319
322
 
320
- this.counters?.app_http_requests_total?.triggerFn({
323
+ this.countersFunctions?.app_http_requests_total({
321
324
  method: req.method,
322
325
  route,
323
326
  status_code: res.statusCode,
@@ -510,7 +513,7 @@ class MetricsClient {
510
513
  instance: this.dynoId,
511
514
  ...(params.groupings || {}),
512
515
  }
513
- console.log("this.gateway.push")
516
+ console.log('this.gateway.push')
514
517
  return this.gateway.push({
515
518
  jobName: params.jobName || this.appName,
516
519
  groupings,