Class: Rivulet::Telemetry

Inherits:
Object
  • Object
show all
Defined in:
lib/rivulet/telemetry.rb,
lib/rivulet/telemetry/node.rb,
lib/rivulet/telemetry/timing_wrapper.rb,
lib/rivulet/telemetry/sequel_extension.rb

Defined Under Namespace

Modules: SequelExtension, TimingWrapper Classes: Node

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTelemetry

Returns a new instance of Telemetry.



5
6
7
8
9
10
# File 'lib/rivulet/telemetry.rb', line 5

def initialize
  @started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  @root       = nil
  @stack      = []
  @db_ms      = 0.0
end

Instance Attribute Details

#db_msObject (readonly)

Returns the value of attribute db_ms.



3
4
5
# File 'lib/rivulet/telemetry.rb', line 3

def db_ms
  @db_ms
end

Instance Method Details

#flowObject



45
46
47
# File 'lib/rivulet/telemetry.rb', line 45

def flow
  @root
end


49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/rivulet/telemetry.rb', line 49

def print_flow(node = @root, offset = 0)
  entry = " " * 2 * offset
  entry += "#{node.name} (#{node.self_ms})"
  entry += " =>" if node.children.any?
  entry += "\n"

  node.children.each do |cnode|
    entry += print_flow(cnode, offset + 1)
  end

  entry
end

#record_db(ms) ⇒ Object



37
38
39
# File 'lib/rivulet/telemetry.rb', line 37

def record_db(ms)
  @db_ms = (@db_ms + ms).round(3)
end

#start_recording(activity) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/rivulet/telemetry.rb', line 12

def start_recording(activity)
  node = Rivulet::Telemetry::Node.new(
    name: activity.class.name,
    started_at: Process.clock_gettime(Process::CLOCK_MONOTONIC),
    children: []
  )

  if @stack.empty?
    @root = node
  else
    @stack.last[:children] << node
  end

  @stack << node
end

#stop_recording(activity) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/rivulet/telemetry.rb', line 28

def stop_recording(activity)
  node = @stack.pop
  node.ended_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  node.duration_ms =
    ((node.ended_at - node.started_at) * 1000.0).round(3)
  node.self_ms =
    (node.duration_ms - node.children.sum(&:duration_ms)).round(3)
end

#total_msObject



41
42
43
# File 'lib/rivulet/telemetry.rb', line 41

def total_ms
  ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - @started_at) * 1000).round(3)
end