Sha256: 3697fe01a49faafd0a3a097f073bba496568922cefca71864d809c7dfac27c4a

Contents?: true

Size: 1.55 KB

Versions: 2

Compression:

Stored size: 1.55 KB

Contents

require 'singleton'

class HealthReporter
  include Singleton

  def self.self_test
    @@self_test
  end

  def self.self_test=(self_test)
    @@self_test = self_test
  end

  def self.unhealthy_cache_ttl
    @@unhealthy_cache_ttl
  end

  def self.unhealthy_cache_ttl=(unhealthy_cache_ttl)
    @@unhealthy_cache_ttl = unhealthy_cache_ttl
  end

  def self.healthy_cache_ttl
    @@healthy_cache_ttl
  end

  def self.healthy_cache_ttl=(healthy_cache_ttl)
    @@healthy_cache_ttl = healthy_cache_ttl
  end

  @@self_test = lambda{ true }
  @@unhealthy_cache_ttl = 30
  @@healthy_cache_ttl   = 60
  @@last_check_time     = nil
  @@healthy             = nil #Initialized as nil so that first call will set it
  @@semaphore           = Mutex.new

  # TODO
  # def register_dependency_check(url:, code: 200)
  #   raise "Configured URL #{url} is invalid" unless url =~ URI::regexp
  #
  #   dependencies[]
  # end

  def self.healthy?
    @@semaphore.synchronize {
      perform_health_check if @@healthy.nil? or cache_ttl_expired
      @@healthy
    }
  end

  private

  def self.perform_health_check
    @@healthy = sanitize(@@self_test.call)
    @@last_check_time = Time.now
  end

  def self.sanitize(result)
    unless [true, false].include?(result)
      raise "Invalid non-boolean response from registered self-check lambda: #{result.to_s}"
    end
    result
  end

  def self.cache_ttl_expired
    return true if @@last_check_time.nil?
    Time.now > (@@last_check_time + ttl)
  end

  def self.ttl
    return @@healthy_cache_ttl if @@healthy
    @@unhealthy_cache_ttl
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
health-reporter-0.0.3 lib/health_reporter/reporter.rb
health-reporter-0.0.2 lib/health_reporter/reporter.rb