Class: Delayed::Worker::ConsulHealthCheck

Inherits:
HealthCheck
  • Object
show all
Defined in:
lib/delayed/worker/consul_health_check.rb

Constant Summary collapse

CONSUL_CONFIG_KEYS =
%w[url acl_token].map(&:freeze).freeze
DEFAULT_SERVICE_NAME =
"inst-jobs_worker"

Instance Attribute Summary collapse

Attributes inherited from HealthCheck

#config, #worker_name

Instance Method Summary collapse

Methods inherited from HealthCheck

build, inherited, reschedule_abandoned_jobs

Constructor Details

#initializeConsulHealthCheck

Returns a new instance of ConsulHealthCheck.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/delayed/worker/consul_health_check.rb', line 16

def initialize(*, **)
  super
  # Because we don't want the consul client to be a hard dependency we're
  # only requiring it once it's absolutely needed
  require "diplomat"

  if config.keys.any? { |k| CONSUL_CONFIG_KEYS.include?(k) }
    consul_config = Diplomat::Configuration.new.tap do |conf|
      CONSUL_CONFIG_KEYS.each do |key|
        conf.send("#{key}=", config[key]) if config[key]
      end
    end
    @service_client = Diplomat::Service.new(configuration: consul_config)
    @health_client = Diplomat::Health.new(configuration: consul_config)
  else
    @service_client = Diplomat::Service.new
    @health_client = Diplomat::Health.new
  end
end

Instance Attribute Details

#health_clientObject (readonly)

Returns the value of attribute health_client.



14
15
16
# File 'lib/delayed/worker/consul_health_check.rb', line 14

def health_client
  @health_client
end

#service_clientObject (readonly)

Returns the value of attribute service_client.



14
15
16
# File 'lib/delayed/worker/consul_health_check.rb', line 14

def service_client
  @service_client
end

Instance Method Details

#live_workersObject



48
49
50
51
52
53
54
55
# File 'lib/delayed/worker/consul_health_check.rb', line 48

def live_workers
  # Filter out critical workers (probably nodes failing their serf health check)
  live_nodes = @health_client.service(service_name, {
                                        filter: "not Checks.Status == critical"
                                      })

  live_nodes.map { |n| n.Service["ID"] }
end

#startObject



36
37
38
39
40
41
42
# File 'lib/delayed/worker/consul_health_check.rb', line 36

def start
  @service_client.register({
                             id: worker_name,
                             name: service_name,
                             check: check_attributes
                           })
end

#stopObject



44
45
46
# File 'lib/delayed/worker/consul_health_check.rb', line 44

def stop
  @service_client.deregister(worker_name)
end