/
sidekiq_alive.rb
106 lines (82 loc) · 2.24 KB
/
sidekiq_alive.rb
1
2
3
4
5
6
7
8
9
10
11
12
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
require "sidekiq"
require "singleton"
require "sidekiq_alive/version"
require "sidekiq_alive/config"
module SidekiqAlive
def self.start
Sidekiq.configure_server do |config|
config.on(:startup) do
SidekiqAlive.tap do |sa|
sa.logger.info(banner)
sa.register_current_instance
sa.store_alive_key
sa::Worker.perform_async(hostname)
sa::Server.start
sa.logger.info(successful_startup_text)
end
end
end
end
def self.register_current_instance
register_instance(current_instance_register_key)
end
def self.registered_instances
redis.keys("#{config.registered_instance_key}::*")
end
def self.current_instance_register_key
"#{config.registered_instance_key}::#{hostname}"
end
def self.store_alive_key
redis.set(current_lifeness_key,
Time.now.to_i,
{ ex: config.time_to_live.to_i })
end
def self.redis
Sidekiq.redis { |r| r }
end
def self.alive?
redis.ttl(current_lifeness_key) == -2 ? false : true
end
# CONFIG ---------------------------------------
def self.setup
yield(config)
end
def self.logger
Sidekiq::Logging.logger
end
def self.config
@config ||= SidekiqAlive::Config.instance
end
def self.current_lifeness_key
"#{config.liveness_key}::#{hostname}"
end
def self.hostname
ENV['HOSTNAME'] || 'HOSTNAME_NOT_SET'
end
def self.banner
<<-BANNER.strip_heredoc
=================== SidekiqAlive =================
Hostname: #{hostname}
Liveness key: #{current_lifeness_key}
Port: #{config.port}
Time to live: #{config.time_to_live}s
Current instance register key: #{current_instance_register_key}
starting ...
BANNER
end
def self.successful_startup_text
<<-BANNER.strip_heredoc
=================== SidekiqAlive Ready! =================
Registered instances:
- #{registered_instances.join("\n\s\s- ")}
BANNER
end
def self.register_instance(instance_name)
redis.set(instance_name,
Time.now.to_i,
{ ex: config.time_to_live.to_i + 60 })
end
end
require "sidekiq_alive/worker"
require "sidekiq_alive/server"
SidekiqAlive.start unless ENV['DISABLE_SIDEKIQ_ALIVE']