Home Reference Source Repository

src/metrics/MetricsAggregator.js

import { DEFAULT_INTERVAL } from '../constants';

export default class MetricsAggregator {
  /**
   * @param {Object} [options={}] - Options to initialize MetricsAggregator.
   * @param {string} [options.prefix=''] - Prefix of metrics name.
   * @param {Array} [options.metricses=[]] - Metricses to aggregate.
   * @param {number} [options.interval=30000] - Interval to aggregate.
   * @returns {MetricsAggregator} - new MetricsAggregator Instance.
   */
  constructor(options = {}) {
    this.prefix = options.prefix || '';
    this.metricses = options.metricses || [];
    this.interval = options.interval || DEFAULT_INTERVAL;
    this.listener = '';
  }

  aggregate() {
    return this.metricses.reduce((metricses, metrics) => {
      metricses[this.prefix + metrics.getName()] = metrics.getValue();
      return metricses;
    },{});
  }

  listen(callback) {
    this.listener = setInterval(()=>{
      callback && callback(this.aggregate());
    }, this.interval);
    return this.listener;
  }

  stop() {
    return clearInterval(this.listener);
  }

  markMiddleware() {
    const requestMarker = this.metricses.find(metrics => metrics.name === 'requestCount');
    const errorMarker = this.metricses.find(metrics => metrics.name === 'errorCount');
    return (req, res, next) => {
      requestMarker && requestMarker.mark && requestMarker.mark();
      if (res.statusCode >= 400) {
        errorMarker && errorMarker.mark && errorMarker.mark();
      }
      next();
    };
  }
}