metrics.js

const Config = require('@bespoken-sdk/shared/lib/config')
const Job = require('./job')
const logger = require('@bespoken-sdk/shared/lib/logger')('METRICS')
const Result = require('./result')

/**
 * Defines the interface for publishing metrics to data/reporting tools
 */
class Metrics {
  /**
   * @returns {Metrics}
   */
  static instance () {
    const metricsClass = Config.get('metrics')
    // Special handling for datadog-metrics class, as that is also the name of the package provided by DataDog
    if (metricsClass === 'datadog-metrics') {
      const DataDog = require('./datadog-metrics')
      Config.singleton('metrics', new DataDog())
    }
    return Config.instance('metrics', Metrics)
  }

  /**
   * Called to initialize the metrics client
   * @param {Job} job The job the metrics client is publishing data for
   * @returns {Promise<void>}
   */
  async initialize (job) {
    logger.debug('no-op published: ' + job)
    return Promise.resolve()
  }

  /**
   * Called to publish data about a specific result.
   * Must be implemented by sub-classes.
   * @abstract
   * @param {Job} job
   * @param {Result} result
   * @returns {Promise<void>}
   */
  async publish (job, result) {
    logger.debug('no-op published: ' + job + ' result: ' + result)
    return Promise.resolve()
  }
}

module.exports = Metrics