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