class Datadog::Profiling::Recorder

Stores profiling events gathered by `Collector`s

Attributes

max_size[R]

Public Class Methods

new(event_classes, max_size, last_flush_time: Time.now.utc) click to toggle source
# File lib/ddtrace/profiling/recorder.rb, line 11
def initialize(event_classes, max_size, last_flush_time: Time.now.utc)
  @buffers = {}
  @last_flush_time = last_flush_time
  @max_size = max_size

  # Add a buffer for each class
  event_classes.each do |event_class|
    @buffers[event_class] = Profiling::Buffer.new(max_size)
  end

  # Event classes can only be added ahead of time
  @buffers.freeze
end

Public Instance Methods

[](event_class) click to toggle source
# File lib/ddtrace/profiling/recorder.rb, line 25
def [](event_class)
  @buffers[event_class]
end
empty?() click to toggle source

NOTE: Remember that if the recorder is being accessed by multiple threads, this is an inherently racy operation.

# File lib/ddtrace/profiling/recorder.rb, line 67
def empty?
  @buffers.values.all?(&:empty?)
end
flush() click to toggle source
# File lib/ddtrace/profiling/recorder.rb, line 45
def flush
  event_count = 0

  event_groups, start, finish = update_time do
    @buffers.collect do |event_class, buffer|
      events = buffer.pop
      next if events.empty?

      event_count += events.length
      EventGroup.new(event_class, events)
    end.compact
  end

  Flush.new(
    start,
    finish,
    event_groups,
    event_count
  )
end
push(events) click to toggle source
# File lib/ddtrace/profiling/recorder.rb, line 29
def push(events)
  if events.is_a?(Array)
    # Push multiple events
    event_class = events.first.class
    raise UnknownEventError, event_class unless @buffers.key?(event_class)

    @buffers[event_class].concat(events)
  else
    # Push single event
    event_class = events.class
    raise UnknownEventError, event_class unless @buffers.key?(event_class)

    @buffers[event_class].push(events)
  end
end

Private Instance Methods

update_time() { || ... } click to toggle source
# File lib/ddtrace/profiling/recorder.rb, line 86
def update_time
  start = @last_flush_time
  result = yield
  @last_flush_time = Time.now.utc

  # Return event groups, start time, finish time
  [result, start, @last_flush_time]
end