Module: SidekiqAlive

Defined in:
lib/sidekiq_alive.rb,
lib/sidekiq_alive/redis.rb,
lib/sidekiq_alive/config.rb,
lib/sidekiq_alive/server.rb,
lib/sidekiq_alive/worker.rb,
lib/sidekiq_alive/helpers.rb,
lib/sidekiq_alive/version.rb,
lib/sidekiq_alive/redis/base.rb,
lib/sidekiq_alive/redis/redis_gem.rb,
lib/sidekiq_alive/redis/redis_client_gem.rb

Defined Under Namespace

Modules: Helpers, Redis Classes: Config, Server, Worker

Constant Summary collapse

VERSION =
"2.2.1"

Class Method Summary collapse

Class Method Details

.alive?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/sidekiq_alive.rb', line 103

def alive?
  redis.ttl(current_lifeness_key) != -2
end

.configObject



117
118
119
# File 'lib/sidekiq_alive.rb', line 117

def config
  @config ||= SidekiqAlive::Config.instance
end

.current_instance_register_keyObject



87
88
89
# File 'lib/sidekiq_alive.rb', line 87

def current_instance_register_key
  "#{config.registered_instance_key}::#{hostname}"
end

.current_instance_registered?Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/sidekiq_alive.rb', line 91

def current_instance_registered?
  redis.get(current_instance_register_key)
end

.current_lifeness_keyObject



121
122
123
# File 'lib/sidekiq_alive.rb', line 121

def current_lifeness_key
  "#{config.liveness_key}::#{hostname}"
end

.current_queueObject



54
55
56
# File 'lib/sidekiq_alive.rb', line 54

def current_queue
  "#{config.queue_prefix}-#{hostname}"
end

.hostnameObject



125
126
127
# File 'lib/sidekiq_alive.rb', line 125

def hostname
  ENV["HOSTNAME"] || "HOSTNAME_NOT_SET"
end

.loggerObject



113
114
115
# File 'lib/sidekiq_alive.rb', line 113

def logger
  config.logger || Sidekiq.logger
end

.purge_pending_jobsObject



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/sidekiq_alive.rb', line 73

def purge_pending_jobs
  schedule_set = Sidekiq::ScheduledSet.new
  jobs = if Helpers.sidekiq_5
    schedule_set.select { |job| job.klass == "SidekiqAlive::Worker" && job.queue == current_queue }
  else
    schedule_set.scan('"class":"SidekiqAlive::Worker"').select { |job| job.queue == current_queue }
  end
  logger.info("[SidekiqAlive] Purging #{jobs.count} pending for #{hostname}")
  jobs.each(&:delete)

  logger.info("[SidekiqAlive] Removing queue #{current_queue}")
  Sidekiq::Queue.new(current_queue).clear
end

.redisObject



99
100
101
# File 'lib/sidekiq_alive.rb', line 99

def redis
  @redis ||= Redis.adapter
end

.register_current_instanceObject



58
59
60
# File 'lib/sidekiq_alive.rb', line 58

def register_current_instance
  register_instance(current_instance_register_key)
end

.register_instance(instance_name) ⇒ Object



150
151
152
# File 'lib/sidekiq_alive.rb', line 150

def register_instance(instance_name)
  redis.set(instance_name, time: Time.now.to_i, ex: config.registration_ttl.to_i)
end

.registered_instancesObject



69
70
71
# File 'lib/sidekiq_alive.rb', line 69

def registered_instances
  redis.match("#{config.registered_instance_key}::*")
end

.setup {|config| ... } ⇒ Object

CONFIG —————————————

Yields:



109
110
111
# File 'lib/sidekiq_alive.rb', line 109

def setup
  yield(config)
end

.shutdown_infoObject



129
130
131
# File 'lib/sidekiq_alive.rb', line 129

def shutdown_info
  "Shutting down sidekiq-alive!"
end

.startObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/sidekiq_alive.rb', line 13

def start
  Sidekiq.configure_server do |sq_config|
    sq_config.on(:startup) do
      SidekiqAlive::Worker.sidekiq_options(queue: current_queue)
      if Helpers.sidekiq_7
        sq_config.queues
      else
        sq_config.respond_to?(:[]) ? sq_config[:queues] : sq_config.options[:queues]
      end.unshift(current_queue)

      # If no weight is set, webui might not show this queue for given instance/process.
      if Helpers.sidekiq_7
        sq_config.default_capsule.weights[current_queue] = 1
      end

      logger.info(startup_info)

      register_current_instance
      store_alive_key
      # Passing the hostname argument it's only for debugging enqueued jobs
      SidekiqAlive::Worker.perform_async(hostname)
      @server_pid = fork { SidekiqAlive::Server.run! }

      logger.info(successful_startup_text)
    end

    sq_config.on(:quiet) do
      unregister_current_instance
      config.shutdown_callback.call
    end

    sq_config.on(:shutdown) do
      Process.kill("TERM", @server_pid) unless @server_pid.nil?
      Process.wait(@server_pid) unless @server_pid.nil?

      unregister_current_instance
      config.shutdown_callback.call
    end
  end
end

.startup_infoObject



133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/sidekiq_alive.rb', line 133

def startup_info
  info = {
    hostname: hostname,
    port: config.port,
    ttl: config.time_to_live,
    queue: current_queue,
    liveness_key: current_lifeness_key,
    register_key: current_instance_register_key,
  }

  "Starting sidekiq-alive: #{info}"
end

.store_alive_keyObject



95
96
97
# File 'lib/sidekiq_alive.rb', line 95

def store_alive_key
  redis.set(current_lifeness_key, time: Time.now.to_i, ex: config.time_to_live.to_i)
end

.successful_startup_textObject



146
147
148
# File 'lib/sidekiq_alive.rb', line 146

def successful_startup_text
  "Successfully started sidekiq-alive, registered with key: #{current_instance_register_key}"
end

.unregister_current_instanceObject



62
63
64
65
66
67
# File 'lib/sidekiq_alive.rb', line 62

def unregister_current_instance
  # Delete any pending jobs for this instance
  logger.info(shutdown_info)
  purge_pending_jobs
  redis.delete(current_instance_register_key)
end