Class: Julewire::Core::Diagnostics::Health
- Inherits:
-
Object
- Object
- Julewire::Core::Diagnostics::Health
- Defined in:
- lib/julewire/core/diagnostics/health.rb
Instance Method Summary collapse
- #clear_degradation ⇒ Object
- #clear_degradation_if_unchanged(marker) ⇒ Object
- #clear_failures! ⇒ Object
- #counts ⇒ Object
- #degradation_marker ⇒ Object
- #degraded?(status_from: :current) ⇒ Boolean
- #increment(key, by: 1) ⇒ Object
-
#initialize(counter_keys:, callback_failure_counter: nil, callback_metadata: {}, failure_counter: nil, track_failures: true) ⇒ Health
constructor
A new instance of Health.
- #last_callback_failure ⇒ Object
- #last_failure ⇒ Object
- #last_loss ⇒ Object
- #record_callback_failure(callback_failure) ⇒ Object
- #record_failure(error, callback: nil, counter: @failure_counter, degrade: true, **metadata) ⇒ Object
- #record_loss(reason:, counter: reason, degrade: true, **metadata) ⇒ Object
- #record_success ⇒ Object
- #snapshot(status: nil, status_from: :current, include_loss: false, **fields) ⇒ Object
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_degradation ⇒ Object
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 |
#counts ⇒ Object
32 33 34 |
# File 'lib/julewire/core/diagnostics/health.rb', line 32 def counts @mutex.synchronize { @counts.dup.freeze } end |
#degradation_marker ⇒ Object
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
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_failure ⇒ Object
44 45 46 |
# File 'lib/julewire/core/diagnostics/health.rb', line 44 def last_callback_failure @mutex.synchronize { @last_callback_failure } end |
#last_failure ⇒ Object
48 49 50 |
# File 'lib/julewire/core/diagnostics/health.rb', line 48 def last_failure @mutex.synchronize { @last_failure } end |
#last_loss ⇒ Object
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_success ⇒ Object
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 |