Class: Datadog::Profiling::Recorder

Inherits:
Object
  • Object
show all
Defined in:
lib/ddtrace/profiling/recorder.rb

Overview

Stores profiling events gathered by Collectors

Defined Under Namespace

Classes: UnknownEventError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(event_classes, max_size, last_flush_time: Time.now.utc) ⇒ Recorder

Returns a new instance of Recorder.



11
12
13
14
15
16
17
18
19
20
21
22
23
# 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

Instance Attribute Details

#max_sizeObject (readonly)

Returns the value of attribute max_size.



9
10
11
# File 'lib/ddtrace/profiling/recorder.rb', line 9

def max_size
  @max_size
end

Instance Method Details

#[](event_class) ⇒ Object



25
26
27
# File 'lib/ddtrace/profiling/recorder.rb', line 25

def [](event_class)
  @buffers[event_class]
end

#empty?Boolean

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

Returns:

  • (Boolean)


67
68
69
# File 'lib/ddtrace/profiling/recorder.rb', line 67

def empty?
  @buffers.values.all?(&:empty?)
end

#flushObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 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) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 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