Class: TestBench::Telemetry

Inherits:
Object
  • Object
show all
Defined in:
lib/test_bench/telemetry/sink.rb,
lib/test_bench/telemetry/event.rb,
lib/test_bench/telemetry/sink/file.rb,
lib/test_bench/telemetry/telemetry.rb,
lib/test_bench/telemetry/event_data.rb,
lib/test_bench/telemetry/substitute.rb,
lib/test_bench/telemetry/sink/handler.rb,
lib/test_bench/telemetry/controls/file.rb,
lib/test_bench/telemetry/controls/sink.rb,
lib/test_bench/telemetry/controls/time.rb,
lib/test_bench/telemetry/controls/event.rb,
lib/test_bench/telemetry/controls/random.rb,
lib/test_bench/telemetry/sink/projection.rb,
lib/test_bench/telemetry/substitute/sink.rb,
lib/test_bench/telemetry/controls/handler.rb,
lib/test_bench/telemetry/controls/event_data.rb,
lib/test_bench/telemetry/controls/process_id.rb,
lib/test_bench/telemetry/controls/projection.rb,
lib/test_bench/telemetry/controls/event/metadata.rb,
lib/test_bench/telemetry/event_data/serialization.rb,
lib/test_bench/telemetry/controls/event/event_data.rb,
lib/test_bench/telemetry/sink/handler/event_registry.rb,
lib/test_bench/telemetry/controls/projection/receiver.rb

Direct Known Subclasses

Substitute::Telemetry

Defined Under Namespace

Modules: Controls, Event, Sink, Substitute Classes: EventData

Constant Summary collapse

RegistrationError =
Class.new(RuntimeError)
GetError =
Class.new(RuntimeError)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#sinksObject



6
7
8
# File 'lib/test_bench/telemetry/telemetry.rb', line 6

def sinks
  @sinks ||= []
end

Class Method Details

.build(*sinks) ⇒ Object



11
12
13
14
15
16
17
18
19
# File 'lib/test_bench/telemetry/telemetry.rb', line 11

def self.build(*sinks)
  instance = new

  sinks.each do |sink|
    instance.register(sink)
  end

  instance
end

.configure(receiver, *sinks, attr_name: nil) ⇒ Object



21
22
23
24
25
26
# File 'lib/test_bench/telemetry/telemetry.rb', line 21

def self.configure(receiver, *sinks, attr_name: nil)
  attr_name ||= :telemetry

  instance = build(*sinks)
  receiver.public_send(:"#{attr_name}=", instance)
end

.current_timeObject



55
56
57
# File 'lib/test_bench/telemetry/telemetry.rb', line 55

def self.current_time
  ::Time.now
end

.process_idObject



59
60
61
# File 'lib/test_bench/telemetry/telemetry.rb', line 59

def self.process_id
  ::Process.pid
end

Instance Method Details

#current_timeObject



47
48
49
# File 'lib/test_bench/telemetry/telemetry.rb', line 47

def current_time
  self.class.current_time
end

#get_sink(sink_class) ⇒ Object



93
94
95
96
97
98
99
100
101
# File 'lib/test_bench/telemetry/telemetry.rb', line 93

def get_sink(sink_class)
  sink, *other_sinks = get_sinks(sink_class)

  if other_sinks.any?
    raise GetError, "Multiple sinks match: #{sink_class.inspect}"
  end

  sink
end

#get_sinks(sink_class) ⇒ Object



103
104
105
106
107
# File 'lib/test_bench/telemetry/telemetry.rb', line 103

def get_sinks(sink_class)
  sinks.select do |sink|
    sink.instance_of?(sink_class)
  end
end

#process_idObject



51
52
53
# File 'lib/test_bench/telemetry/telemetry.rb', line 51

def process_id
  self.class.process_id
end

#record(event) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/test_bench/telemetry/telemetry.rb', line 28

def record(event)
  if event.is_a?(Event)
    event. ||= Event::Metadata.new

    event_data = Event::Export.(event)
  else
    event_data = event
  end

  event_data.process_id ||= process_id
  event_data.time ||= current_time

  sinks.each do |sink|
    sink.receive(event_data)
  end

  event_data
end

#register(sink) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/test_bench/telemetry/telemetry.rb', line 63

def register(sink)
  if registered?(sink)
    raise RegistrationError, "Already registered #{sink.inspect}"
  end

  sinks.push(sink)
end

#registered?(sink_or_sink_class) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/test_bench/telemetry/telemetry.rb', line 79

def registered?(sink_or_sink_class)
  if sink_or_sink_class.is_a?(Sink)
    sink = sink_or_sink_class

    sinks.include?(sink)
  else
    sink_class = sink_or_sink_class

    sink = get_sink(sink_class)

    !sink.nil?
  end
end

#unregister(sink) ⇒ Object



71
72
73
74
75
76
77
# File 'lib/test_bench/telemetry/telemetry.rb', line 71

def unregister(sink)
  deleted_sink = sinks.delete(sink)

  if deleted_sink.nil?
    raise RegistrationError, "Not registered #{sink.inspect}"
  end
end