Class: Julewire::Core::Diagnostics::Tail

Inherits:
Object
  • Object
show all
Defined in:
lib/julewire/core/diagnostics/tail.rb,
lib/julewire/core/diagnostics/tail/renderer.rb

Defined Under Namespace

Classes: Entry, Renderer

Constant Summary collapse

DEFAULT_CAPACITY =
200
DEFAULT_NAME =
:tail
COUNTER_KEYS =
%i[captured failures].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name: DEFAULT_NAME, capacity: DEFAULT_CAPACITY, formatter: Records::Formatter.new, renderer: Renderer.new, serializer: nil) ⇒ Tail

Returns a new instance of Tail.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/julewire/core/diagnostics/tail.rb', line 27

def initialize(
  name: DEFAULT_NAME,
  capacity: DEFAULT_CAPACITY,
  formatter: Records::Formatter.new,
  renderer: Renderer.new,
  serializer: nil
)
  @name = Core.normalize_name(name)
  @capacity = Validation.validate_integer_limit!(capacity, name: :capacity, positive: true)
  Validation.validate_callable!(formatter, name: :formatter)
  Validation.validate_callable!(renderer, name: :renderer)
  @formatter = formatter
  @renderer = renderer
  @serializer = serializer
  @serializer_pool_key = :"julewire_core_tail_serializers_#{object_id}"
  initialize_state
end

Instance Attribute Details

#capacityObject (readonly)

Returns the value of attribute capacity.



25
26
27
# File 'lib/julewire/core/diagnostics/tail.rb', line 25

def capacity
  @capacity
end

#nameObject (readonly)

Returns the value of attribute name.



25
26
27
# File 'lib/julewire/core/diagnostics/tail.rb', line 25

def name
  @name
end

Class Method Details

.attach!(runtime = Julewire) ⇒ Object



18
19
20
21
22
# File 'lib/julewire/core/diagnostics/tail.rb', line 18

def attach!(runtime = Julewire, **)
  destination = new(**)
  runtime.configure { it.destinations.add(destination) }
  destination
end

Instance Method Details

#after_fork!Object



88
89
90
91
# File 'lib/julewire/core/diagnostics/tail.rb', line 88

def after_fork!
  initialize_state
  self
end

#clearObject



78
79
80
81
82
# File 'lib/julewire/core/diagnostics/tail.rb', line 78

def clear
  @state_ref.update { State.new(it.sequence, EMPTY_ENTRIES) }
  @health.clear_failures!
  self
end

#closeObject



86
# File 'lib/julewire/core/diagnostics/tail.rb', line 86

def close(*) = self

#emit(record) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/julewire/core/diagnostics/tail.rb', line 45

def emit(record)
  snapshot = snapshot_record(record)
  @state_ref.update do |state|
    sequence = state.sequence + 1
    entries = (state.items + [Entry.new(sequence, Time.now.utc, snapshot)]).last(@capacity)
    State.new(sequence, entries)
  end
  @health.increment(:captured)
  nil
rescue StandardError => e
  record_failure(e, record)
  nil
end

#entries(limit: nil) ⇒ Object



59
60
61
62
63
# File 'lib/julewire/core/diagnostics/tail.rb', line 59

def entries(limit: nil)
  limit = normalize_limit(limit)
  snapshot = @state_ref.get.items.dup
  limit ? snapshot.last(limit) : snapshot
end

#flushObject



84
# File 'lib/julewire/core/diagnostics/tail.rb', line 84

def flush(*) = self

#healthObject



93
94
95
# File 'lib/julewire/core/diagnostics/tail.rb', line 93

def health
  @health.snapshot(capacity: @capacity, size: entries.length)
end

#records(limit: nil) ⇒ Object



65
66
67
# File 'lib/julewire/core/diagnostics/tail.rb', line 65

def records(limit: nil)
  entries(limit: limit).map(&:record)
end

#render(limit: nil, color: false) ⇒ Object



69
70
71
# File 'lib/julewire/core/diagnostics/tail.rb', line 69

def render(limit: nil, color: false)
  @renderer.call(entries(limit: limit), color: color)
end

#write(io = $stdout, limit: nil, color: nil) ⇒ Object



73
74
75
76
# File 'lib/julewire/core/diagnostics/tail.rb', line 73

def write(io = $stdout, limit: nil, color: nil)
  io.write(render(limit: limit, color: color.nil? ? io.tty? : color))
  io
end