Source: measured-core/lib/metrics/Metric.js

/**
 * Interface for Metric types.
 *
 * Implementations
 * <p>
 * <li><a href="Counter.html">Counter</a>, things that increment or decrement.</li>
 * <li><a href="Gauge.html">Gauge</a>, values that can be read instantly via a supplied call back.</li>
 * <li><a href="Histogram.html">Histogram</a>, keeps a reservoir of statistically relevant values to explore their distribution.</li>
 * <li><a href="Meter.html">Meter</a>, things that are measured as events / interval.</li>
 * <li><a href="NoOpMeter.html">NoOpMeter</a>, an empty impl of meter, useful for supplying to a Timer, when you only care about the Histogram.</li>
 * <li><a href="SettableGauge.html">SettableGauge</a>, just like a Gauge but its value is set directly rather than supplied by a callback.</li>
 * <li><a href="CachedGauge.html">CachedGauge</a>, A Cached Gauge takes a function that returns a promise that resolves a value that should be cached and updated on a given interval.</li>
 * <li><a href="Timer.html">Timer</a>, timers are a combination of Meters and Histograms. They measure the rate as well as distribution of scalar events.</li>
 * </p>
 *
 * @interface Metric
 */
// eslint-disable-next-line no-unused-vars
class Metric {
  /**
   * Please note that dispite its name, this method can return raw numbers on
   * certain implementations such as counters and gauges.
   *
   * @return {any} Returns the data from the Metric
   */
  toJSON() {}

  /**
   * The type of the Metric Impl. {@link MetricTypes}.
   * @return {string} The type of the Metric Impl.
   */
  getType() {}
}

/**
 * An enum like object that is the set of core metric types that all implementors of {@link Metric} are.
 *
 * @typedef MetricTypes
 * @interface MetricTypes
 * @type {Object.<string, string>}
 * @property {COUNTER} The type for Counters.
 * @property {GAUGE} The type for Gauges.
 * @property {HISTOGRAM} The type for Histograms.
 * @property {METER} The type for Meters.
 * @property {TIMER} The type for Timers.
 */
const MetricTypes = {
  COUNTER: 'Counter',
  GAUGE: 'Gauge',
  HISTOGRAM: 'Histogram',
  METER: 'Meter',
  TIMER: 'Timer'
};

module.exports = {
  MetricTypes
};