lib/metrics/queue.js (46 lines of code) (raw):

/* * Copyright Elasticsearch B.V. and other contributors where applicable. * Licensed under the BSD 2-Clause License; you may not use this file except in * compliance with the BSD 2-Clause License. */ 'use strict'; class QueueMetricsCollector { constructor() { this.stats = { 'queue.latency.min.ms': 0, 'queue.latency.max.ms': 0, 'queue.latency.avg.ms': 0, }; this.total = 0; this.count = 0; this.min = 0; this.max = 0; } // Updates the data used to generate our stats // // Unlike the Stats and RuntimeCollector, this function // also returns the instantiated collector. // // @param {number} time A javascript ms timestamp updateStats(time) { if (this.min === 0 || this.min > time) { this.min = time; } if (this.max < time) { this.max = time; } this.count++; this.total += time; } // standard `collect` method for stats collectors // // called by the MetricReporter object prior to its sending data // // @param {function} cb callback function collect(cb) { // update average based on count and total this.stats['queue.latency.avg.ms'] = 0; if (this.count > 0) { this.stats['queue.latency.avg.ms'] = this.total / this.count; } this.stats['queue.latency.max.ms'] = this.max; this.stats['queue.latency.min.ms'] = this.min; // reset for next run this.total = 0; this.count = 0; this.max = 0; this.min = 0; if (cb) process.nextTick(cb); } } // Creates and Registers a Metric Collector // // Unlike the Stats and RuntimeCollector, this function // also returns the instantiated collector. // // @param {string} queueOrTopicName // @param {MetricRegistry} registry // @returns QueueMetricsCollector function createQueueMetrics(queueOrTopicName, registry) { const collector = new QueueMetricsCollector(); registry.registerCollector(collector); for (const metric of Object.keys(collector.stats)) { registry.getOrCreateGauge( metric, function returnCurrentValue() { return collector.stats[metric]; }, { queue_name: queueOrTopicName }, ); } return collector; } module.exports = { createQueueMetrics, QueueMetricsCollector, };