Source: measured-node-metrics/lib/nodeProcessMetrics.js

const { Gauge } = require('measured-core');
const process = require('process');

/**
 * The default reporting interval for node process metrics is 30 seconds.
 *
 * @type {number}
 */
const DEFAULT_NODE_PROCESS_METRICS_REPORTING_INTERVAL_IN_SECONDS = 30;

/**
 * A map of Metric generating functions, that create Metrics to measure node process stats.
 * @type {Object.<string, function>}
 */
const nodeProcessMetrics = {
  /**
   * Creates a gauge that reports the rss from the node memory usage api.
   * See {@link https://nodejs.org/api/process.html#process_process_memoryusage} for more information.
   *
   * @return {Gauge}
   */
  'node.process.memory-usage.rss': () => {
    return new Gauge(() => {
      return process.memoryUsage().rss;
    });
  },
  /**
   * See {@link https://nodejs.org/api/process.html#process_process_memoryusage} for more information.
   *
   * @return {Gauge}
   */
  'node.process.memory-usage.heap-total': () => {
    return new Gauge(() => {
      return process.memoryUsage().heapTotal;
    });
  },
  /**
   * See {@link https://nodejs.org/api/process.html#process_process_memoryusage} for more information.
   *
   * @return {Gauge}
   */
  'node.process.memory-usage.heap-used': () => {
    return new Gauge(() => {
      return process.memoryUsage().heapUsed;
    });
  },
  /**
   * See {@link https://nodejs.org/api/process.html#process_process_memoryusage} for more information.
   *
   * @return {Gauge}
   */
  'node.process.memory-usage.external': () => {
    return new Gauge(() => {
      const mem = process.memoryUsage();
      return Object.prototype.hasOwnProperty.call(mem, 'external') ? mem.external : 0;
    });
  },
  /**
   * Gauge to track how long the node process has been running.
   *
   * See {@link https://nodejs.org/api/process.html#process_process_uptime} for more information.
   * @return {Gauge}
   */
  'node.process.uptime': () => {
    return new Gauge(() => {
      return Math.floor(process.uptime());
    });
  }
};

/**
 * This module contains the methods to create and register default node process metrics to a metrics registry.
 *
 * @module node-process-metrics
 */
module.exports = {
  /**
   * Method that can be used to add a set of default node process metrics to your app.
   *
   * @param {SelfReportingMetricsRegistry} metricsRegistry
   * @param {Dimensions} [customDimensions]
   * @param {number} [reportingIntervalInSeconds]
   */
  createProcessMetrics: (metricsRegistry, customDimensions, reportingIntervalInSeconds) => {
    customDimensions = customDimensions || {};
    reportingIntervalInSeconds =
      reportingIntervalInSeconds || DEFAULT_NODE_PROCESS_METRICS_REPORTING_INTERVAL_IN_SECONDS;

    Object.keys(nodeProcessMetrics).forEach(metricName => {
      metricsRegistry.register(
        metricName,
        nodeProcessMetrics[metricName](),
        customDimensions,
        reportingIntervalInSeconds
      );
    });
  },

  /**
   * Map of metric names to a corresponding function that creates and returns a Metric that tracks it.
   * See {@link nodeProcessMetrics}
   */
  nodeProcessMetrics
};