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
|
module Sentry
module Cron
module MonitorCheckIns
MAX_SLUG_LENGTH = 50
module Patch
def perform(*args, **opts)
slug = self.class.sentry_monitor_slug
monitor_config = self.class.sentry_monitor_config
check_in_id = Sentry.capture_check_in(slug,
:in_progress,
monitor_config: monitor_config)
start = Sentry.utc_now.to_i
begin
# need to do this on ruby <= 2.6 sadly
ret = method(:perform).super_method.arity == 0 ? super() : super
duration = Sentry.utc_now.to_i - start
Sentry.capture_check_in(slug,
:ok,
check_in_id: check_in_id,
duration: duration,
monitor_config: monitor_config)
ret
rescue Exception
duration = Sentry.utc_now.to_i - start
Sentry.capture_check_in(slug,
:error,
check_in_id: check_in_id,
duration: duration,
monitor_config: monitor_config)
raise
end
end
end
module ClassMethods
def sentry_monitor_check_ins(slug: nil, monitor_config: nil)
if monitor_config && Sentry.configuration
cron_config = Sentry.configuration.cron
monitor_config.checkin_margin ||= cron_config.default_checkin_margin
monitor_config.max_runtime ||= cron_config.default_max_runtime
monitor_config.timezone ||= cron_config.default_timezone
end
@sentry_monitor_slug = slug
@sentry_monitor_config = monitor_config
prepend Patch
end
def sentry_monitor_slug(name: self.name)
@sentry_monitor_slug ||= begin
slug = name.gsub('::', '-').downcase
slug[-MAX_SLUG_LENGTH..-1] || slug
end
end
def sentry_monitor_config
@sentry_monitor_config
end
end
def self.included(base)
base.extend(ClassMethods)
end
end
end
end
|