constructor(opts, collector, harvester) {
    super()

    this.defaultPeriod = this.periodMs = opts.periodMs
    this.defaultLimit = this.limit = opts.limit
    this.runId = opts.runId
    this.isAsync = opts.isAsync || false
    // function to pass in to determine if we can start a given aggregator
    this.isEnabled =
      opts.enabled ||
      function defaultEnabled() {
        return true
      }
    this.enabled = this.isEnabled(opts.config)

    /**
     * The name of the collector endpoint that the
     * aggregator will communicate with.
     *
     * @see https://source.datanerd.us/agents/agent-specs/tree/main/endpoints/protocol-version-17
     *
     * @type {string}
     * @memberof Aggregator
     */
    this.method = opts.method
    this.collector = collector
    this.sendTimer = null
    harvester.add(this)
  }
Baseline data aggregator that is used to ship data to the New Relic
data collector. Specific data aggregators, e.g. an errors aggregator,
extend this base object.

Aggregators fire of several events. The events are named according to the
pattern `<finished|starting>_data_send-<endpoint_name>`. As an example,
if the aggregator is collecting data to send to the `error_event_data`
endpoint, there will be two events:

+ `starting_data_send-error_event_data`
+ `finished_data_send-error_event_data`

For a list of possible endpoints, see
{@link https://source.datanerd.us/agents/agent-specs/tree/main/endpoints/protocol-version-17}.

Note: effort has been made to document the events for every endpoint this
agent interacts with, but due to the dynamic nature of the event names we
may have missed some.