diff --git a/sentry-ruby/lib/sentry/cron/configuration.rb b/sentry-ruby/lib/sentry/cron/configuration.rb index 897f5a511..92616eb56 100644 --- a/sentry-ruby/lib/sentry/cron/configuration.rb +++ b/sentry-ruby/lib/sentry/cron/configuration.rb @@ -15,6 +15,14 @@ class Configuration # @return [Integer, nil] attr_accessor :default_max_runtime + # How many consecutive failed check-ins it takes to create an issue. + # @return [Integer, nil] + attr_accessor :default_failure_issue_threshold + + # How many consecutive OK check-ins it takes to resolve an issue. + # @return [Integer, nil] + attr_accessor :default_recovery_threshold + # tz database style timezone string # @return [String, nil] attr_accessor :default_timezone diff --git a/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb b/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb index 314733cfb..e04ac6e1e 100644 --- a/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb +++ b/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb @@ -48,6 +48,8 @@ def sentry_monitor_check_ins(slug: nil, monitor_config: nil) 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.failure_issue_threshold ||= cron_config.default_failure_issue_threshold + monitor_config.recovery_threshold ||= cron_config.default_recovery_threshold monitor_config.timezone ||= cron_config.default_timezone end diff --git a/sentry-ruby/lib/sentry/cron/monitor_config.rb b/sentry-ruby/lib/sentry/cron/monitor_config.rb index 36d7b52e8..6e86b0cf9 100644 --- a/sentry-ruby/lib/sentry/cron/monitor_config.rb +++ b/sentry-ruby/lib/sentry/cron/monitor_config.rb @@ -19,14 +19,24 @@ class MonitorConfig # @return [Integer, nil] attr_accessor :max_runtime + # How many consecutive failed check-ins it takes to create an issue. + # @return [Integer, nil] + attr_accessor :failure_issue_threshold + + # How many consecutive OK check-ins it takes to resolve an issue. + # @return [Integer, nil] + attr_accessor :recovery_threshold + # tz database style timezone string # @return [String, nil] attr_accessor :timezone - def initialize(schedule, checkin_margin: nil, max_runtime: nil, timezone: nil) + def initialize(schedule, checkin_margin: nil, max_runtime: nil, failure_issue_threshold: nil, recovery_threshold: nil, timezone: nil) @schedule = schedule @checkin_margin = checkin_margin @max_runtime = max_runtime + @failure_issue_threshold = failure_issue_threshold + @recovery_threshold = recovery_threshold @timezone = timezone end @@ -45,6 +55,8 @@ def to_h schedule: schedule.to_h, checkin_margin: checkin_margin, max_runtime: max_runtime, + failure_issue_threshold: failure_issue_threshold, + recovery_threshold: recovery_threshold, timezone: timezone }.compact end diff --git a/sentry-ruby/spec/sentry/cron/monitor_check_ins_spec.rb b/sentry-ruby/spec/sentry/cron/monitor_check_ins_spec.rb index b1aafc4b2..9e80143e3 100644 --- a/sentry-ruby/spec/sentry/cron/monitor_check_ins_spec.rb +++ b/sentry-ruby/spec/sentry/cron/monitor_check_ins_spec.rb @@ -250,6 +250,8 @@ def perform(a, b = 42, c: 99) perform_basic_setup do |config| config.cron.default_checkin_margin = 10 config.cron.default_max_runtime = 20 + config.cron.default_failure_issue_threshold = 3 + config.cron.default_recovery_threshold = 5 config.cron.default_timezone = 'Europe/Vienna' end @@ -294,6 +296,8 @@ def perform(a, b = 42, c: 99) expect(in_progress_event.status).to eq(:in_progress) expect(in_progress_event.monitor_config.checkin_margin).to eq(10) expect(in_progress_event.monitor_config.max_runtime).to eq(20) + expect(in_progress_event.monitor_config.failure_issue_threshold).to eq(3) + expect(in_progress_event.monitor_config.recovery_threshold).to eq(5) expect(in_progress_event.monitor_config.timezone).to eq('Europe/Vienna') ok_event = sentry_events.last @@ -302,6 +306,8 @@ def perform(a, b = 42, c: 99) expect(ok_event.status).to eq(:ok) expect(ok_event.monitor_config.checkin_margin).to eq(10) expect(ok_event.monitor_config.max_runtime).to eq(20) + expect(ok_event.monitor_config.failure_issue_threshold).to eq(3) + expect(ok_event.monitor_config.recovery_threshold).to eq(5) expect(ok_event.monitor_config.timezone).to eq('Europe/Vienna') end end diff --git a/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb b/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb index 11dd57952..6bf4e275e 100644 --- a/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb +++ b/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb @@ -9,6 +9,8 @@ '5 * * * *', checkin_margin: 10, max_runtime: 20, + failure_issue_threshold: 3, + recovery_threshold: 5, timezone: 'Europe/Vienna' ) @@ -16,6 +18,8 @@ expect(subject.schedule.value).to eq('5 * * * *') expect(subject.checkin_margin).to eq(10) expect(subject.max_runtime).to eq(20) + expect(subject.failure_issue_threshold).to eq(3) + expect(subject.recovery_threshold).to eq(5) expect(subject.timezone).to eq('Europe/Vienna') end end @@ -31,6 +35,8 @@ :hour, checkin_margin: 10, max_runtime: 20, + failure_issue_threshold: 3, + recovery_threshold: 5, timezone: 'Europe/Vienna' ) @@ -39,6 +45,8 @@ expect(subject.schedule.unit).to eq(:hour) expect(subject.checkin_margin).to eq(10) expect(subject.max_runtime).to eq(20) + expect(subject.failure_issue_threshold).to eq(3) + expect(subject.recovery_threshold).to eq(5) expect(subject.timezone).to eq('Europe/Vienna') end end @@ -49,6 +57,8 @@ '5 * * * *', checkin_margin: 10, max_runtime: 20, + failure_issue_threshold: 3, + recovery_threshold: 5, timezone: 'Europe/Vienna' ) @@ -57,6 +67,8 @@ schedule: { type: :crontab, value: '5 * * * *' }, checkin_margin: 10, max_runtime: 20, + failure_issue_threshold: 3, + recovery_threshold: 5, timezone: 'Europe/Vienna' }) end @@ -67,6 +79,8 @@ :hour, checkin_margin: 10, max_runtime: 20, + failure_issue_threshold: 3, + recovery_threshold: 5, timezone: 'Europe/Vienna' ) @@ -75,8 +89,17 @@ schedule: { type: :interval, value: 5, unit: :hour }, checkin_margin: 10, max_runtime: 20, + failure_issue_threshold: 3, + recovery_threshold: 5, timezone: 'Europe/Vienna' }) end + + it 'omits nil attributes' do + subject = described_class.from_crontab('5 * * * *') + + hash = subject.to_h + expect(hash).to eq({ schedule: { type: :crontab, value: '5 * * * *' } }) + end end end