Module: Zhong

Extended by:
Forwardable
Defined in:
lib/zhong.rb,
lib/zhong/at.rb,
lib/zhong/job.rb,
lib/zhong/web.rb,
lib/zhong/util.rb,
lib/zhong/every.rb,
lib/zhong/version.rb,
lib/zhong/scheduler.rb,
lib/zhong/web_helpers.rb

Defined Under Namespace

Modules: Util, WebHelpers Classes: At, Every, Job, MultiAt, Scheduler, Web

Constant Summary collapse

VERSION =
"0.3.0".freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.heartbeat_keyObject



71
72
73
# File 'lib/zhong.rb', line 71

def self.heartbeat_key
  @heartbeat_key ||= "zhong:heartbeat"
end

.loggerObject



61
62
63
64
65
# File 'lib/zhong.rb', line 61

def self.logger
  @logger ||= Logger.new(STDOUT).tap do |logger|
    logger.formatter = -> (_, datetime, _, msg) { "#{datetime}: #{msg}\n" }
  end
end

.redisObject



67
68
69
# File 'lib/zhong.rb', line 67

def self.redis
  @redis ||= Redis.new(url: ENV["REDIS_URL"])
end

.tzObject

Returns the value of attribute tz.



22
23
24
# File 'lib/zhong.rb', line 22

def tz
  @tz
end

Class Method Details

.all_heartbeatsObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/zhong.rb', line 43

def self.all_heartbeats
  heartbeats = redis.hgetall(heartbeat_key)
  now = redis_time

  old_beats, new_beats = heartbeats.partition do |_, v|
    Time.at(v.to_i) < (now - 15.minutes)
  end

  redis.multi do
    old_beats.each { |b| redis.hdel(heartbeat_key, b) }
  end

  new_beats.map do |k, v|
    host, pid = k.split("#", 2)
    {host: host, pid: pid, last_seen: Time.at(v.to_i)}
  end
end

.any_running?(grace = 60.seconds) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/zhong.rb', line 35

def self.any_running?(grace = 60.seconds)
  latest_heartbeat && latest_heartbeat > (redis_time - grace)
end

.latest_heartbeatObject



39
40
41
# File 'lib/zhong.rb', line 39

def self.latest_heartbeat
  all_heartbeats.map { |h| h[:last_seen] }.sort.last
end

.schedule(&block) ⇒ Object



27
28
29
# File 'lib/zhong.rb', line 27

def self.schedule(&block)
  scheduler.instance_eval(&block) if block_given?
end

.schedulerObject



31
32
33
# File 'lib/zhong.rb', line 31

def self.scheduler
  @scheduler ||= Scheduler.new
end