Introduce incidenti con dedup, job Sidekiq ogni 3 min, scan log cron, /up/deep, dashboard /admin/ops e push ntfy; include Sentry opzionale e fix test suite. Co-authored-by: Cursor <cursoragent@cursor.com>
34 lines
844 B
Ruby
34 lines
844 B
Ruby
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
|