module Ops class HealthMonitorJob include Sidekiq::Job sidekiq_options retry: 1, queue: "default" INTERVAL_SECS = ENV.fetch("OPS_HEALTH_INTERVAL_SECS", "180").to_i REDIS_CHAIN_KEY = "ops:health_monitor:chain" HEARTBEAT_KEY = "ops:health_monitor:last_run" def self.ensure_chain return unless redis return if redis.get(REDIS_CHAIN_KEY) redis.set(REDIS_CHAIN_KEY, "1", ex: INTERVAL_SECS * 2) perform_in(INTERVAL_SECS) end def self.redis @redis ||= Redis.new(url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0")) rescue Redis::CannotConnectError nil end def perform self.class.redis&.set(HEARTBEAT_KEY, Time.current.to_i, ex: INTERVAL_SECS * 3) Ops::HealthChecks.new.call ensure self.class.perform_in(INTERVAL_SECS) end end end