class Philae::CollectionProbe

Public Class Methods

new(*args) click to toggle source
# File lib/philae/collection_probe.rb, line 3
def initialize(*args)
  raise ArgumentError, "can't be instantiate, use specialized class"
end

Public Instance Methods

check() click to toggle source
# File lib/philae/collection_probe.rb, line 11
def check
  results = []
  result_queue = Queue.new
  probes.each do |probe|
    Thread.new do
      begin
        result = probe.check
      rescue StandardError => e
        result = {
          healthy: false,
          error: "probe #{probe.name} check failed: #{e.class} - #{e.message}",
        }
      end
      result[:probe] = probe
      result_queue.push result
    end
  end

  loop do
    results.push result_queue.pop
    break if results.count == probes.length
  end

  failed_results = results.select do |result|
    result[:healthy] == false
  end

  error = failed_results.map do |result|
    msg = "#{result[:probe].name}: #{result[:comment]} "
    msg += result[:code] if result[:code]
    msg += result[:error] if result[:error]
    next msg
  end.join(', ')

  if failed_results.count == probes.count
    return { healthy: false, comment: "All #{name} nodes are down", error: error }
  elsif failed_results.count > 0
    return { healthy: true, comment: "#{failed_results.count} #{name} nodes are down: #{error}" }
  else
    return { healthy: true, comment: '' }
  end
end
probes() click to toggle source
# File lib/philae/collection_probe.rb, line 7
def probes
  raise ArgumentError, 'specialized class should implement :probes'
end