From e37e15e74edf2d543870503bd06cda6e6fdccc08 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Mon, 19 Oct 2026 16:17:34 -0700 Subject: [PATCH 1/3] feat(crons): Add GoodJob cron monitoring Sends check-ins for GoodJob cron entries when the :good_job_cron patch is enabled, using the cron key as the slug and the entry's schedule as the monitor config. Keys can be skipped with config.rails.good_job_exclude_cron_jobs. Co-Authored-By: Claude --- sentry-rails/Gemfile | 6 + .../ruby-3.0_rails-6.1.0.gemfile.lock | 8 + .../ruby-3.0_rails-7.0.0.gemfile.lock | 8 + .../ruby-3.0_rails-7.1.0.gemfile.lock | 8 + .../ruby-3.1_rails-6.1.0.gemfile.lock | 9 + .../ruby-3.1_rails-7.0.0.gemfile.lock | 9 + .../ruby-3.1_rails-7.1.0.gemfile.lock | 9 + .../ruby-3.1_rails-7.2.0.gemfile.lock | 9 + .../ruby-3.2_rails-6.1.0.gemfile.lock | 9 + .../ruby-3.2_rails-7.0.0.gemfile.lock | 9 + .../ruby-3.2_rails-7.1.0.gemfile.lock | 9 + .../ruby-3.2_rails-7.2.0.gemfile.lock | 9 + .../ruby-3.2_rails-8.0.0.gemfile.lock | 9 + .../ruby-3.3_rails-6.1.0.gemfile.lock | 9 + .../ruby-3.3_rails-7.0.0.gemfile.lock | 9 + .../ruby-3.3_rails-7.1.0.gemfile.lock | 9 + .../ruby-3.3_rails-7.2.0.gemfile.lock | 9 + .../ruby-3.3_rails-8.0.0.gemfile.lock | 9 + .../ruby-3.4_rails-7.1.0.gemfile.lock | 9 + .../ruby-3.4_rails-7.2.0.gemfile.lock | 9 + .../ruby-3.4_rails-8.0.0.gemfile.lock | 9 + .../ruby-3.4_rails-8.1.3.gemfile.lock | 9 + .../ruby-4.0_rails-6.1.0.gemfile.lock | 9 + .../ruby-4.0_rails-7.0.0.gemfile.lock | 9 + .../ruby-4.0_rails-7.1.0.gemfile.lock | 9 + .../ruby-4.0_rails-8.0.0.gemfile.lock | 9 + .../ruby-4.0_rails-8.1.3.gemfile.lock | 9 + sentry-rails/lib/sentry/rails.rb | 1 + .../lib/sentry/rails/configuration.rb | 6 + .../lib/sentry/rails/good_job_cron.rb | 129 ++++++++++++++ .../spec/active_job/good_job_cron_spec.rb | 167 ++++++++++++++++++ 31 files changed, 540 insertions(+) create mode 100644 sentry-rails/lib/sentry/rails/good_job_cron.rb create mode 100644 sentry-rails/spec/active_job/good_job_cron_spec.rb diff --git a/sentry-rails/Gemfile b/sentry-rails/Gemfile index 434fb3de1..40a9ba1f5 100644 --- a/sentry-rails/Gemfile +++ b/sentry-rails/Gemfile @@ -107,6 +107,12 @@ unless RUBY_PLATFORM.include?("java") gem "resque-scheduler", "~> 5.0" gem "mock_redis" end + + # good_job is a dev-only dependency for the GoodJob cron spec, which drives + # real cron entries through the test adapter (GoodJob itself needs Postgres). + if rails_version >= Gem::Version.new("6.1.0") && ruby_version >= Gem::Version.new("3.0") + gem "good_job" + end end gem "sprockets-rails" diff --git a/sentry-rails/gemfiles/ruby-3.0_rails-6.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.0_rails-6.1.0.gemfile.lock index 1c2496ae5..e9a76eff3 100644 --- a/sentry-rails/gemfiles/ruby-3.0_rails-6.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.0_rails-6.1.0.gemfile.lock @@ -118,6 +118,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.14.8) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -337,6 +344,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick diff --git a/sentry-rails/gemfiles/ruby-3.0_rails-7.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.0_rails-7.0.0.gemfile.lock index 9304bc94f..3c36197c1 100644 --- a/sentry-rails/gemfiles/ruby-3.0_rails-7.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.0_rails-7.0.0.gemfile.lock @@ -133,6 +133,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.14.8) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -354,6 +361,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick diff --git a/sentry-rails/gemfiles/ruby-3.0_rails-7.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.0_rails-7.1.0.gemfile.lock index 915119099..e254c24ba 100644 --- a/sentry-rails/gemfiles/ruby-3.0_rails-7.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.0_rails-7.1.0.gemfile.lock @@ -139,6 +139,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.14.8) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -378,6 +385,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) diff --git a/sentry-rails/gemfiles/ruby-3.1_rails-6.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.1_rails-6.1.0.gemfile.lock index 0dfd87a86..3b904bb80 100644 --- a/sentry-rails/gemfiles/ruby-3.1_rails-6.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.1_rails-6.1.0.gemfile.lock @@ -118,6 +118,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -345,6 +352,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick @@ -401,6 +409,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.1_rails-7.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.1_rails-7.0.0.gemfile.lock index 8eb410585..b2a49c047 100644 --- a/sentry-rails/gemfiles/ruby-3.1_rails-7.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.1_rails-7.0.0.gemfile.lock @@ -133,6 +133,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -362,6 +369,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick @@ -419,6 +427,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.1_rails-7.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.1_rails-7.1.0.gemfile.lock index 5f4cfcf74..620d0fdc9 100644 --- a/sentry-rails/gemfiles/ruby-3.1_rails-7.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.1_rails-7.1.0.gemfile.lock @@ -139,6 +139,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -391,6 +398,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -452,6 +460,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.1_rails-7.2.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.1_rails-7.2.0.gemfile.lock index 3c41516a6..e009d2d21 100644 --- a/sentry-rails/gemfiles/ruby-3.1_rails-7.2.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.1_rails-7.2.0.gemfile.lock @@ -133,6 +133,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -385,6 +392,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -446,6 +454,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.2_rails-6.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.2_rails-6.1.0.gemfile.lock index 73f951575..030c4bb96 100644 --- a/sentry-rails/gemfiles/ruby-3.2_rails-6.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.2_rails-6.1.0.gemfile.lock @@ -118,6 +118,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -345,6 +352,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick @@ -403,6 +411,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.2_rails-7.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.2_rails-7.0.0.gemfile.lock index 8d89da0c3..867da9a1e 100644 --- a/sentry-rails/gemfiles/ruby-3.2_rails-7.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.2_rails-7.0.0.gemfile.lock @@ -132,6 +132,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -361,6 +368,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick @@ -419,6 +427,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.2_rails-7.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.2_rails-7.1.0.gemfile.lock index 5650a5078..eec74be29 100644 --- a/sentry-rails/gemfiles/ruby-3.2_rails-7.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.2_rails-7.1.0.gemfile.lock @@ -138,6 +138,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -394,6 +401,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -456,6 +464,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.2_rails-7.2.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.2_rails-7.2.0.gemfile.lock index 4876bf6a1..4516714b5 100644 --- a/sentry-rails/gemfiles/ruby-3.2_rails-7.2.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.2_rails-7.2.0.gemfile.lock @@ -132,6 +132,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -386,6 +393,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -448,6 +456,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.2_rails-8.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.2_rails-8.0.0.gemfile.lock index 5c4ad7db9..d6ecfb9e2 100644 --- a/sentry-rails/gemfiles/ruby-3.2_rails-8.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.2_rails-8.0.0.gemfile.lock @@ -130,6 +130,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -384,6 +391,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -445,6 +453,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.3_rails-6.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.3_rails-6.1.0.gemfile.lock index 4d0d8fe69..e451e48fd 100644 --- a/sentry-rails/gemfiles/ruby-3.3_rails-6.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.3_rails-6.1.0.gemfile.lock @@ -118,6 +118,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -345,6 +352,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick @@ -403,6 +411,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.3_rails-7.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.3_rails-7.0.0.gemfile.lock index 2f7933d92..03bbac876 100644 --- a/sentry-rails/gemfiles/ruby-3.3_rails-7.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.3_rails-7.0.0.gemfile.lock @@ -132,6 +132,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -361,6 +368,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 mini_magick @@ -419,6 +427,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.3_rails-7.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.3_rails-7.1.0.gemfile.lock index 6f9edd5df..b99c24d72 100644 --- a/sentry-rails/gemfiles/ruby-3.3_rails-7.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.3_rails-7.1.0.gemfile.lock @@ -138,6 +138,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -394,6 +401,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -456,6 +464,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.3_rails-7.2.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.3_rails-7.2.0.gemfile.lock index a4448b2d6..9ba4a154f 100644 --- a/sentry-rails/gemfiles/ruby-3.3_rails-7.2.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.3_rails-7.2.0.gemfile.lock @@ -132,6 +132,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -386,6 +393,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -448,6 +456,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.3_rails-8.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.3_rails-8.0.0.gemfile.lock index 0af4a6fb4..28f351d3f 100644 --- a/sentry-rails/gemfiles/ruby-3.3_rails-8.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.3_rails-8.0.0.gemfile.lock @@ -130,6 +130,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -384,6 +391,7 @@ DEPENDENCIES debug! delayed_job delayed_job_active_record + good_job irb jdbc-sqlite3 json (< 3) @@ -445,6 +453,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.4_rails-7.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.4_rails-7.1.0.gemfile.lock index c7a455d2b..2b9210776 100644 --- a/sentry-rails/gemfiles/ruby-3.4_rails-7.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.4_rails-7.1.0.gemfile.lock @@ -138,6 +138,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -380,6 +387,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -444,6 +452,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.4_rails-7.2.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.4_rails-7.2.0.gemfile.lock index 4b089ff36..1c42c33d9 100644 --- a/sentry-rails/gemfiles/ruby-3.4_rails-7.2.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.4_rails-7.2.0.gemfile.lock @@ -132,6 +132,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -373,6 +380,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -437,6 +445,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.4_rails-8.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-3.4_rails-8.0.0.gemfile.lock index cf032c701..e1a759bd8 100644 --- a/sentry-rails/gemfiles/ruby-3.4_rails-8.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.4_rails-8.0.0.gemfile.lock @@ -130,6 +130,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -370,6 +377,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -433,6 +441,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-3.4_rails-8.1.3.gemfile.lock b/sentry-rails/gemfiles/ruby-3.4_rails-8.1.3.gemfile.lock index ef730d905..eb9ec8a68 100644 --- a/sentry-rails/gemfiles/ruby-3.4_rails-8.1.3.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-3.4_rails-8.1.3.gemfile.lock @@ -133,6 +133,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -373,6 +380,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -437,6 +445,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-4.0_rails-6.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-4.0_rails-6.1.0.gemfile.lock index f56cdaabd..12f2063ba 100644 --- a/sentry-rails/gemfiles/ruby-4.0_rails-6.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-4.0_rails-6.1.0.gemfile.lock @@ -118,6 +118,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -332,6 +339,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 mini_magick @@ -392,6 +400,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-4.0_rails-7.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-4.0_rails-7.0.0.gemfile.lock index c0b115707..c04c44016 100644 --- a/sentry-rails/gemfiles/ruby-4.0_rails-7.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-4.0_rails-7.0.0.gemfile.lock @@ -132,6 +132,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -347,6 +354,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 mini_magick @@ -407,6 +415,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-4.0_rails-7.1.0.gemfile.lock b/sentry-rails/gemfiles/ruby-4.0_rails-7.1.0.gemfile.lock index c7a455d2b..2b9210776 100644 --- a/sentry-rails/gemfiles/ruby-4.0_rails-7.1.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-4.0_rails-7.1.0.gemfile.lock @@ -138,6 +138,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -380,6 +387,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -444,6 +452,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-4.0_rails-8.0.0.gemfile.lock b/sentry-rails/gemfiles/ruby-4.0_rails-8.0.0.gemfile.lock index cf032c701..e1a759bd8 100644 --- a/sentry-rails/gemfiles/ruby-4.0_rails-8.0.0.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-4.0_rails-8.0.0.gemfile.lock @@ -130,6 +130,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -370,6 +377,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -433,6 +441,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/gemfiles/ruby-4.0_rails-8.1.3.gemfile.lock b/sentry-rails/gemfiles/ruby-4.0_rails-8.1.3.gemfile.lock index ef730d905..eb9ec8a68 100644 --- a/sentry-rails/gemfiles/ruby-4.0_rails-8.1.3.gemfile.lock +++ b/sentry-rails/gemfiles/ruby-4.0_rails-8.1.3.gemfile.lock @@ -133,6 +133,13 @@ GEM raabro (~> 1.4) globalid (1.4.0) activesupport (>= 6.1) + good_job (4.22.1) + activejob (>= 6.1.0) + activerecord (>= 6.1.0) + concurrent-ruby (>= 1.3.1) + fugit (>= 1.11.0) + railties (>= 6.1.0) + thor (>= 1.0.0) i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.9.4) @@ -373,6 +380,7 @@ DEPENDENCIES delayed_job delayed_job_active_record drb + good_job irb jdbc-sqlite3 json (< 3) @@ -437,6 +445,7 @@ CHECKSUMS et-orbi (1.4.2) sha256=bb555dae668419cb24caa2a293a170e58be6d4df1e017c51f5030bdc133cd20c fugit (1.14.0) sha256=e311a9cc85a54bb67649df45060e721282a1e2c8ebad40e41874a3a7d576f37e globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 + good_job (4.22.1) sha256=20b0531f49167786e4ddbe68ddc1c249079dfc9bbd674866fdc289375cfa62d2 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 io-console (0.9.4) sha256=a403304f32928ee85e56d457b4612ca43f2703b561a3258844992bd24085fbb1 irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 diff --git a/sentry-rails/lib/sentry/rails.rb b/sentry-rails/lib/sentry/rails.rb index 8af39f372..e87048ae0 100644 --- a/sentry-rails/lib/sentry/rails.rb +++ b/sentry-rails/lib/sentry/rails.rb @@ -8,6 +8,7 @@ require "sentry/rails/structured_logging" require "sentry/rails/engine" require "sentry/rails/railtie" +require "sentry/rails/good_job_cron" module Sentry module Rails diff --git a/sentry-rails/lib/sentry/rails/configuration.rb b/sentry-rails/lib/sentry/rails/configuration.rb index d5589ab0f..315bbb1d0 100644 --- a/sentry-rails/lib/sentry/rails/configuration.rb +++ b/sentry-rails/lib/sentry/rails/configuration.rb @@ -183,6 +183,11 @@ class Configuration # Defaults to true. Set to false to opt out. attr_accessor :active_job_propagate_traces + # GoodJob cron keys to skip when the :good_job_cron patch is enabled. + # Strings and Symbols match the key exactly; Regexps are matched against it. + # @return [Array] + attr_accessor :good_job_exclude_cron_jobs + # Configuration for structured logging feature # @return [StructuredLoggingConfiguration] attr_reader :structured_logging @@ -205,6 +210,7 @@ def initialize @active_support_logger_subscription_items = Sentry::Rails::ACTIVE_SUPPORT_LOGGER_SUBSCRIPTION_ITEMS_DEFAULT.dup @active_job_report_on_retry_error = false @active_job_propagate_traces = true + @good_job_exclude_cron_jobs = [] @structured_logging = StructuredLoggingConfiguration.new end end diff --git a/sentry-rails/lib/sentry/rails/good_job_cron.rb b/sentry-rails/lib/sentry/rails/good_job_cron.rb new file mode 100644 index 000000000..49534aaf6 --- /dev/null +++ b/sentry-rails/lib/sentry/rails/good_job_cron.rb @@ -0,0 +1,129 @@ +# frozen_string_literal: true + +module Sentry + module Rails + # Sends Crons check-ins for GoodJob cron entries. + # Enable with `config.enabled_patches << :good_job_cron`. + module GoodJobCron + PAYLOAD_KEY = "_sentry_good_job_cron" + CURRENT_ENTRY = :sentry_good_job_cron_entry + + module CronEntry + def enqueue(*args) + Thread.current[CURRENT_ENTRY] = self unless Sentry::Rails::GoodJobCron.excluded?(self) + super + ensure + Thread.current[CURRENT_ENTRY] = nil + end + end + + module Job + def serialize + @_sentry_good_job_cron ||= Sentry::Rails::GoodJobCron.monitor_for(Thread.current[CURRENT_ENTRY], self) + payload = super + payload[PAYLOAD_KEY] = @_sentry_good_job_cron if @_sentry_good_job_cron + payload + end + + def deserialize(job_data) + super + @_sentry_good_job_cron = job_data[PAYLOAD_KEY] + end + end + + class << self + def excluded?(entry) + return false unless Sentry.initialized? + + key = entry.key.to_s + Array(Sentry.configuration.rails.good_job_exclude_cron_jobs).any? do |pattern| + (pattern.is_a?(Symbol) ? pattern.to_s : pattern) === key + end + rescue StandardError => e + Sentry.sdk_logger.error(Sentry::LOGGER_PROGNAME) { "Could not check good_job_exclude_cron_jobs for #{entry.key}: #{e.class}: #{e.message}" } + false + end + + # Runs where GoodJob evaluates the schedule, so the time zone matches. + def monitor_for(entry, job) + return unless entry && Sentry.initialized? + + job_class = entry.job_class + return unless job_class.respond_to?(:call) || job.class.name == job_class.to_s.delete_prefix("::") + return if job.class < Sentry::Cron::MonitorCheckIns::Patch + + slug = entry.key.to_s.downcase.gsub(/[^a-z0-9_-]+/, "-").gsub(/\A-+|-+\z/, "") + slug = slug[0, Sentry::Cron::MonitorCheckIns::MAX_SLUG_LENGTH].delete_suffix("-") + return if slug.empty? + + # Entries whose cron is a proc can change schedule between runs. + cron = entry.params[:cron] + config = Sentry::Cron::FugitSchedule.from_cron(::Fugit.parse(cron)) if cron.is_a?(String) + { "slug" => slug, "crontab" => config&.schedule&.value, "timezone" => config&.timezone }.compact + rescue StandardError => e + Sentry.sdk_logger.error(Sentry::LOGGER_PROGNAME) { "Not monitoring GoodJob cron entry #{entry.key}: #{e.class}: #{e.message}" } + nil + end + + def perform(job) + data = job.instance_variable_get(:@_sentry_good_job_cron) + return yield unless data && Sentry.initialized? + + slug = data["slug"] + if data["crontab"] + cron_config = Sentry.configuration.cron + monitor_config = Sentry::Cron::MonitorConfig.from_crontab( + data["crontab"], + timezone: data["timezone"], + checkin_margin: cron_config.default_checkin_margin, + max_runtime: cron_config.default_max_runtime + ) + end + + check_in_id = Sentry.capture_check_in(slug, :in_progress, monitor_config: monitor_config) + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + begin + ret = yield + rescue Exception + duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start + Sentry.capture_check_in(slug, :error, check_in_id: check_in_id, duration: duration, monitor_config: monitor_config) + raise + end + + duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start + Sentry.capture_check_in(slug, :ok, check_in_id: check_in_id, duration: duration, monitor_config: monitor_config) + ret + end + + def patch + return if @patched + + @patched = true + ActiveSupport.on_load(:active_job) do + prepend Sentry::Rails::GoodJobCron::Job + around_perform { |job, block| Sentry::Rails::GoodJobCron.perform(job, &block) } + end + + apply = proc do + # safe_constantize also loads it under the classic autoloader. + entry_class = "GoodJob::CronEntry".safe_constantize + if entry_class && !(entry_class < Sentry::Rails::GoodJobCron::CronEntry) + entry_class.prepend(Sentry::Rails::GoodJobCron::CronEntry) + end + end + ::Rails.application.reloader.to_prepare(&apply) + apply.call if ::Rails.application.initialized? + end + end + end + end +end + +Sentry.register_patch(:good_job_cron) do |config| + if defined?(::GoodJob) && defined?(::Rails.application) && ::Rails.application + Sentry::Rails::GoodJobCron.patch + else + config.sdk_logger.warn(Sentry::LOGGER_PROGNAME) { "You tried to enable the GoodJob cron integration but the `good_job` gem was not detected." } + end +end diff --git a/sentry-rails/spec/active_job/good_job_cron_spec.rb b/sentry-rails/spec/active_job/good_job_cron_spec.rb new file mode 100644 index 000000000..0d1a006af --- /dev/null +++ b/sentry-rails/spec/active_job/good_job_cron_spec.rb @@ -0,0 +1,167 @@ +# frozen_string_literal: true + +require "spec_helper" + +begin + require "good_job" +rescue LoadError +end + +if defined?(::GoodJob) + RSpec.describe Sentry::Rails::GoodJobCron, type: :job do + include_context "active_job backend harness", adapter: :test + include_context "test adapter" + + let(:excluded_jobs) { [] } + let(:configure_sentry) do + proc do |config| + config.enabled_patches << :good_job_cron + config.rails.good_job_exclude_cron_jobs = excluded_jobs + end + end + + # Runs jobs from their full serialized payload, like GoodJob does. + def queue_adapter_for_test + Rails52FullPayloadTestAdapter.new + end + + def drain + jobs = queue_adapter.enqueued_jobs.dup + queue_adapter.enqueued_jobs.clear + jobs.each { |payload| ::ActiveJob::Base.execute(payload[:_sentry_full_payload]) } + end + + def run_entry(key, **params) + GoodJob::CronEntry.new(params.merge(key: key)).enqueue(Time.now) + drain + end + + def check_ins + sentry_events.select { |event| event.is_a?(Sentry::CheckInEvent) } + end + + let(:report_job) do + job_fixture("ReportJob") do + def perform(*); end + end + end + + before { report_job } + + it "sends in_progress and ok check-ins with the cron key and schedule" do + run_entry(:nightly_report, class: "ReportJob", cron: "0 9 * * 1-5 Europe/Vienna") + + in_progress, ok = check_ins + expect(check_ins.size).to eq(2) + expect(in_progress.monitor_slug).to eq("nightly_report") + expect(in_progress.status).to eq(:in_progress) + expect(in_progress.monitor_config.to_h).to eq( + schedule: { type: :crontab, value: "0 9 * * 1-5" }, + timezone: "Europe/Vienna" + ) + expect(ok.status).to eq(:ok) + expect(ok.check_in_id).to eq(in_progress.check_in_id) + end + + it "sends an error check-in when the job fails" do + job_fixture("FailingReportJob") do + def perform + raise "boom" + end + end + + expect { run_entry(:failing_report, class: "FailingReportJob", cron: "every hour") }.to raise_error("boom") + expect(check_ins.map(&:status)).to eq([:in_progress, :error]) + expect(check_ins.first.monitor_config.to_h[:schedule]).to eq(type: :crontab, value: "0 * * * *") + end + + it "uses each entry's key and schedule when entries share a job class" do + run_entry(:report_eu, class: "ReportJob", args: ["eu"], cron: "0 9 * * * Europe/Berlin") + run_entry(:report_us, class: ReportJob, args: ["us"], cron: "0 9 * * * America/New_York") + + in_progress = check_ins.select { |check_in| check_in.status == :in_progress } + expect(in_progress.map { |check_in| [check_in.monitor_slug, check_in.monitor_config.timezone] }).to eq( + [["report_eu", "Europe/Berlin"], ["report_us", "America/New_York"]] + ) + end + + it "uses the zone GoodJob evaluates zoneless schedules in" do + Time.use_zone("Tokyo") do + run_entry(:tokyo_report, class: "ReportJob", cron: "0 9 * * *") + end + + expect(check_ins.first.monitor_config.timezone).to eq("Asia/Tokyo") + end + + it "sends check-ins without a config for schedules Crons cannot express" do + run_entry(:every_ten_seconds, class: "ReportJob", cron: "every 10 seconds") + + expect(check_ins.map(&:status)).to eq([:in_progress, :ok]) + expect(check_ins.map(&:monitor_config)).to all(be_nil) + end + + it "sends check-ins without a config for proc schedules" do + run_entry(:dynamic_report, class: "ReportJob", cron: ->(_last_ran) { "0 9 * * *" }) + + expect(check_ins.map(&:monitor_slug)).to eq(["dynamic_report", "dynamic_report"]) + expect(check_ins.map(&:monitor_config)).to all(be_nil) + end + + it "leaves jobs that include Sentry::Cron::MonitorCheckIns alone" do + job_fixture("MonitoredJob") do + include Sentry::Cron::MonitorCheckIns + sentry_monitor_check_ins slug: "own-slug" + + def perform; end + end + + run_entry(:monitored, class: "MonitoredJob", cron: "0 9 * * *") + + expect(check_ins.map(&:monitor_slug)).to eq(["own-slug", "own-slug"]) + end + + it "does not monitor jobs enqueued outside a cron entry" do + report_job.perform_later + drain + + expect(check_ins).to be_empty + end + + it "excludes nothing by default" do + expect(Sentry.configuration.rails.good_job_exclude_cron_jobs).to eq([]) + end + + context "with excluded jobs" do + let(:excluded_jobs) { [:clear_cache, "purge", /\Atmp_/] } + + it "skips entries whose key matches a symbol or string" do + run_entry(:clear_cache, class: "ReportJob", cron: "0 9 * * *") + run_entry(:purge, class: "ReportJob", cron: "0 9 * * *") + + expect(check_ins).to be_empty + end + + it "skips entries whose key matches a regexp" do + run_entry(:tmp_cleanup, class: "ReportJob", cron: "0 9 * * *") + + expect(check_ins).to be_empty + end + + it "monitors entries that do not match" do + run_entry(:clear_cache_daily, class: "ReportJob", cron: "0 9 * * *") + + expect(check_ins.map(&:monitor_slug)).to eq(["clear_cache_daily", "clear_cache_daily"]) + end + end + + context "with an exclusion pattern that raises" do + let(:excluded_jobs) { [->(_key) { raise "boom" }] } + + it "still enqueues and monitors the job" do + run_entry(:daily_report, class: "ReportJob", cron: "0 9 * * *") + + expect(check_ins.map(&:monitor_slug)).to eq(["daily_report", "daily_report"]) + end + end + end +end From 8bdd87a14e81da87383a50be07a72d362f2597e3 Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Tue, 20 Oct 2026 10:44:37 -0700 Subject: [PATCH 2/3] test(crons): Cover GoodJob cron retries Co-Authored-By: Claude --- .../spec/active_job/good_job_cron_spec.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sentry-rails/spec/active_job/good_job_cron_spec.rb b/sentry-rails/spec/active_job/good_job_cron_spec.rb index 0d1a006af..ea500b38a 100644 --- a/sentry-rails/spec/active_job/good_job_cron_spec.rb +++ b/sentry-rails/spec/active_job/good_job_cron_spec.rb @@ -75,6 +75,23 @@ def perform expect(check_ins.first.monitor_config.to_h[:schedule]).to eq(type: :crontab, value: "0 * * * *") end + it "checks in again when a failed run is retried" do + job_fixture("FlakyReportJob") do + retry_on RuntimeError, wait: 0, attempts: 2 + + def perform + raise "boom" if executions == 1 + end + end + + run_entry(:flaky_report, class: "FlakyReportJob", cron: "0 9 * * *") + drain + + expect(check_ins.map(&:status)).to eq([:in_progress, :error, :in_progress, :ok]) + expect(check_ins.map(&:monitor_slug).uniq).to eq(["flaky_report"]) + expect(check_ins[2].monitor_config.to_h[:schedule]).to eq(type: :crontab, value: "0 9 * * *") + end + it "uses each entry's key and schedule when entries share a job class" do run_entry(:report_eu, class: "ReportJob", args: ["eu"], cron: "0 9 * * * Europe/Berlin") run_entry(:report_us, class: ReportJob, args: ["us"], cron: "0 9 * * * America/New_York") From 2fb94f31fc40e3d6a532760c677bfd34d0d2f32f Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Wed, 21 Oct 2026 14:43:19 -0700 Subject: [PATCH 3/3] ref(crons): Use the shared slug helper Co-Authored-By: Claude --- sentry-rails/lib/sentry/rails/good_job_cron.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sentry-rails/lib/sentry/rails/good_job_cron.rb b/sentry-rails/lib/sentry/rails/good_job_cron.rb index 49534aaf6..386d56347 100644 --- a/sentry-rails/lib/sentry/rails/good_job_cron.rb +++ b/sentry-rails/lib/sentry/rails/good_job_cron.rb @@ -52,9 +52,8 @@ def monitor_for(entry, job) return unless job_class.respond_to?(:call) || job.class.name == job_class.to_s.delete_prefix("::") return if job.class < Sentry::Cron::MonitorCheckIns::Patch - slug = entry.key.to_s.downcase.gsub(/[^a-z0-9_-]+/, "-").gsub(/\A-+|-+\z/, "") - slug = slug[0, Sentry::Cron::MonitorCheckIns::MAX_SLUG_LENGTH].delete_suffix("-") - return if slug.empty? + slug = Sentry::Cron::Slug.from(entry.key) + return unless slug # Entries whose cron is a proc can change schedule between runs. cron = entry.params[:cron]