Class: Julewire::Core::Diagnostics::Health

Inherits:
Object
  • Object
show all
Defined in:
lib/julewire/core/diagnostics/health.rb

Instance Method Summary collapse

Constructor Details

#initialize(counter_keys:, callback_failure_counter: nil, callback_metadata: {}, failure_counter: nil, track_failures: true) ⇒ Health

Returns a new instance of Health.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/julewire/core/diagnostics/health.rb', line 7

def initialize(
  counter_keys:,
  callback_failure_counter: nil,
  callback_metadata: {},
  failure_counter: nil,
  track_failures: true
)
  @callback_failure_counter = callback_failure_counter
  @callback_metadata = 
  @failure_counter = failure_counter
  @track_failures = track_failures
  @mutex = Mutex.new
  counter_keys = counter_keys.to_a
  counter_keys = counter_keys.union([:failures]) if @track_failures
  @counts = counter_keys.to_h { [it, 0] }
  @current_degradation = nil
  @last_callback_failure = nil
  @last_failure = nil
  @last_loss = nil
end

Instance Method Details

#clear_degradationObject



56
57
58
# File 'lib/julewire/core/diagnostics/health.rb', line 56

def clear_degradation
  @mutex.synchronize { @current_degradation = nil }
end

#clear_degradation_if_unchanged(marker) ⇒ Object



60
61
62
# File 'lib/julewire/core/diagnostics/health.rb', line 60

def clear_degradation_if_unchanged(marker)
  @mutex.synchronize { @current_degradation = nil if @current_degradation.equal?(marker) }
end

#clear_failures!Object



64
65
66
67
68
69
70
71
72
# File 'lib/julewire/core/diagnostics/health.rb', line 64

def clear_failures!
  @mutex.synchronize do
    @current_degradation = nil
    @last_callback_failure = nil
    @last_failure = nil
    @last_loss = nil
  end
  self
end

#countsObject



32
33
34
# File 'lib/julewire/core/diagnostics/health.rb', line 32

def counts
  @mutex.synchronize { @counts.dup.freeze }
end

#degradation_markerObject



36
37
38
# File 'lib/julewire/core/diagnostics/health.rb', line 36

def degradation_marker
  @mutex.synchronize { @current_degradation }
end

#degraded?(status_from: :current) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/julewire/core/diagnostics/health.rb', line 40

def degraded?(status_from: :current)
  @mutex.synchronize { degraded_unlocked?(status_from) }
end

#increment(key, by: 1) ⇒ Object



28
29
30
# File 'lib/julewire/core/diagnostics/health.rb', line 28

def increment(key, by: 1)
  @mutex.synchronize { increment_unlocked(key, by: by) }
end

#last_callback_failureObject



44
45
46
# File 'lib/julewire/core/diagnostics/health.rb', line 44

def last_callback_failure
  @mutex.synchronize { @last_callback_failure }
end

#last_failureObject



48
49
50
# File 'lib/julewire/core/diagnostics/health.rb', line 48

def last_failure
  @mutex.synchronize { @last_failure }
end

#last_lossObject



52
53
54
# File 'lib/julewire/core/diagnostics/health.rb', line 52

def last_loss
  @mutex.synchronize { @last_loss }
end

#record_callback_failure(callback_failure) ⇒ Object



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

def record_callback_failure(callback_failure)
  @mutex.synchronize do
    @last_callback_failure = callback_failure.to_h
    increment_unlocked(@callback_failure_counter) if @callback_failure_counter
  end
end

#record_failure(error, callback: nil, counter: @failure_counter, degrade: true, **metadata) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
# File 'lib/julewire/core/diagnostics/health.rb', line 74

def record_failure(error, callback: nil, counter: @failure_counter, degrade: true, **)
  failure = FailureSnapshot.build(error, **)
  @mutex.synchronize do
    increment_unlocked(:failures) if @track_failures
    increment_unlocked(counter) if counter && counter != :failures && @counts.key?(counter)
    @last_failure = failure
    @current_degradation = failure if degrade
  end
  notify_failure_callback(callback, error, )
  failure
end

#record_loss(reason:, counter: reason, degrade: true, **metadata) ⇒ Object



93
94
95
96
97
98
99
100
101
# File 'lib/julewire/core/diagnostics/health.rb', line 93

def record_loss(reason:, counter: reason, degrade: true, **)
  loss = { reason: reason }.merge().compact.freeze
  @mutex.synchronize do
    increment_unlocked(counter) if counter && @counts.key?(counter)
    @last_loss = loss
    @current_degradation = loss if degrade
  end
  loss
end

#record_successObject



103
104
105
106
# File 'lib/julewire/core/diagnostics/health.rb', line 103

def record_success
  @mutex.synchronize { @current_degradation = nil }
  self
end

#snapshot(status: nil, status_from: :current, include_loss: false, **fields) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
# File 'lib/julewire/core/diagnostics/health.rb', line 108

def snapshot(status: nil, status_from: :current, include_loss: false, **fields)
  @mutex.synchronize do
    result = {
      counts: @counts.dup.freeze,
      last_failure: @last_failure,
      status: status || (degraded_unlocked?(status_from) ? :degraded : :ok)
    }
    result[:last_loss] = @last_loss if include_loss
    result.merge(fields).compact.freeze
  end
end