class NewRelic::TelemetrySdk::Harvester

This class handles sending data to New Relic automatically at configured intervals.

@example

harvester = NewRelic::TelemetrySdk::Harvester.new 
trace_client = NewRelic::TelemetrySdk::TraceClient.new
buffer = NewRelic::TelemetrySdk::Buffer.new
harvester.register 'external_spans', buffer, trace_client
harvester.start

@api public

Public Class Methods

new() click to toggle source
# File lib/newrelic/telemetry_sdk/harvester.rb, line 21
def initialize
  @pipelines = {}
  @shutdown = false
  @running = false
  @lock = Mutex.new
end

Public Instance Methods

[](name) click to toggle source
# File lib/newrelic/telemetry_sdk/harvester.rb, line 54
def [] name
  @pipelines[name]
end
interval() click to toggle source
# File lib/newrelic/telemetry_sdk/harvester.rb, line 58
def interval
  TelemetrySdk.config.harvest_interval
end
register(name, buffer, client) click to toggle source

Register a pipeline (i.e. a buffer from which data can be harvested via a flush method and a client that can be used to send that data). @param name [String]

A unique name for the type of data associated with this pipeline.
Examples: 'spans', 'external_spans'

@param buffer [Buffer]

An instance of NewRelic::TelemetrySdk::Buffer in which data can be
stored for harvest.

@param client [Client]

An instance of a NewRelic::TelemetrySdk::Client subclass which will
send harvested data to the correct New Relic backend (e.g. TraceClient
for spans).

@api public

# File lib/newrelic/telemetry_sdk/harvester.rb, line 42
def register name, buffer, client
  logger.info "Registering pipeline #{name}"
  @lock.synchronize do
    @pipelines[name] = {
      buffer: buffer,
      client: client
    }
  end
rescue => e
  log_error "Encountered error while registering buffer #{name}.", e
end
running?() click to toggle source
# File lib/newrelic/telemetry_sdk/harvester.rb, line 62
def running?
  @running
end
start() click to toggle source

Start scheduled harvests via this harvester.

@api public

# File lib/newrelic/telemetry_sdk/harvester.rb, line 69
def start
  logger.info "Harvesting every #{interval} seconds"
  @running = true
  @harvest_thread = Thread.new do
    begin
      while !@shutdown do
        sleep interval
        harvest
      end
      harvest
      @running = false
    rescue => e
      log_error "Encountered error in harvester", e
    end
  end
end
stop() click to toggle source

Stop scheduled harvests via this harvester. Any remaining buffered data will be sent before the harvest thread is stopped.

@api public

# File lib/newrelic/telemetry_sdk/harvester.rb, line 90
def stop
  logger.info "Stopping harvester"
  @shutdown = true
  @harvest_thread.join if @running
rescue => e
  log_error "Encountered error stopping harvester", e
end

Private Instance Methods

harvest() click to toggle source
# File lib/newrelic/telemetry_sdk/harvester.rb, line 100
def harvest
  @lock.synchronize do
    @pipelines.values.each do |pipeline|
      send_data_via pipeline
    end
  end
end
send_data_via(pipeline) click to toggle source
# File lib/newrelic/telemetry_sdk/harvester.rb, line 108
def send_data_via pipeline
  batch = pipeline[:buffer].flush
  if !batch.nil? && batch[0].respond_to?(:any?) && batch[0].any?
    pipeline[:client].report_batch batch
  end
end