raygun4ruby 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b7c357c986e52b60665b3ee8af64d7a2c421747825e16b928fc91b76ae58f2a
4
- data.tar.gz: 671db6dc795dfe165f531b16443b483865ca659c83b25df617c09ce706f4ca48
3
+ metadata.gz: 6a0724f9d47f49615745fe91cc15eb47c033036cfa20c8bb0432c7bcc9bebb33
4
+ data.tar.gz: d5addaabbd8cac2efaf4bcd919246113f8ca5c3220dd976a51cb6f51cd1a8bb5
5
5
  SHA512:
6
- metadata.gz: 7287d1190a0fa828a3cd9acc0ac4935249e080f1749730ad2dc2c6b9ef868f42f0e0293ba6c9c1eb5a9828d8b52ba6cfd832783512938614cf1e6921d7365a73
7
- data.tar.gz: 9a35eeba3f42c226c98f077a27870096853e8a1e06073736e0b02bc1114725f1feeed66f2434adc35dc41f5c2b5c3181f7ab04da29886a18b638899e25460dee
6
+ metadata.gz: 59aba8123eb5282a7d1589a65d721579e594cd2dc5b5fdfb7e05f14b9bc711242cdeac17f907c41e67813b029658f9f03049637ce54e99c0ba22c22426720507
7
+ data.tar.gz: '0597d91a00bbe36f2d13d26f9116ddb16b792c9f30393b6d73f60714b762f7787d58eefe61dab621cab149d24c8a241018e088ac5e63d67245a31c7218b95fa1'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 4.0.1 (29/07/2024):
2
+
3
+ - Adds the ability to unwrap `Sidekiq::JobRetry::Handled` exceptions (or ignore them entirely) ([#185](https://github.com/MindscapeHQ/raygun4ruby/pull/185))
4
+
1
5
  ## 4.0.0 (20/05/2024):
2
6
 
3
7
  - BREAKING CHANGE: Remove support for end-of-life Ruby verisons and Rails versions prior to 6.0.0
data/README.md CHANGED
@@ -402,6 +402,10 @@ class FailingWorker
402
402
  end
403
403
  ```
404
404
 
405
+ ##### Sidekiq Retries
406
+
407
+ By default, Raygun4Ruby will unwrap `Sidekiq::JobRetry::Handled` exceptions and report the original error via `Exception#cause`. If you would prefer not to hear about retries, you can set `config.track_retried_sidekiq_jobs` to `false` in your Raygun configuration.
408
+
405
409
  ### Other Configuration options
406
410
 
407
411
  For a complete list of configuration options see the [configuration.rb](https://github.com/MindscapeHQ/raygun4ruby/blob/master/lib/raygun/configuration.rb) file
@@ -89,6 +89,9 @@ module Raygun
89
89
  # Should we register an error handler with [Rails' built in API](https://edgeguides.rubyonrails.org/error_reporting.html)
90
90
  config_option :register_rails_error_handler
91
91
 
92
+ # Should we track jobs that are retried in Sidekiq (ones that raise Sidekiq::JobRetry::Handled). Set to "false" to ignore.
93
+ config_option :track_retried_sidekiq_jobs
94
+
92
95
  # Exception classes to ignore by default
93
96
  IGNORE_DEFAULT = ['ActiveRecord::RecordNotFound',
94
97
  'ActionController::RoutingError',
@@ -143,7 +146,8 @@ module Raygun
143
146
  breadcrumb_level: :info,
144
147
  record_raw_data: false,
145
148
  send_in_background: false,
146
- error_report_send_timeout: 10
149
+ error_report_send_timeout: 10,
150
+ track_retried_sidekiq_jobs: true
147
151
  )
148
152
  end
149
153
 
@@ -16,6 +16,10 @@ class Raygun::ErrorSubscriber
16
16
  tags: ["rails_error_reporter", *tags].compact
17
17
  }
18
18
 
19
- Raygun.track_exception(error, data)
19
+ if source == "job.sidekiq" && defined?(Sidekiq)
20
+ Raygun::SidekiqReporter.call(error, data)
21
+ else
22
+ Raygun.track_exception(error, data)
23
+ end
20
24
  end
21
25
  end
@@ -6,7 +6,7 @@
6
6
  module Raygun
7
7
 
8
8
  class SidekiqReporter
9
- def self.call(exception, context_hash, config)
9
+ def self.call(exception, context_hash = {}, config = nil)
10
10
  user = affected_user(context_hash)
11
11
  data = {
12
12
  custom_data: {
@@ -14,6 +14,16 @@ module Raygun
14
14
  },
15
15
  tags: ['sidekiq']
16
16
  }
17
+
18
+ if exception.is_a?(Sidekiq::JobRetry::Handled) && exception.cause
19
+ if Raygun.configuration.track_retried_sidekiq_jobs
20
+ data.merge!(sidekiq_retried: true)
21
+ exception = exception.cause
22
+ else
23
+ return false
24
+ end
25
+ end
26
+
17
27
  if exception.instance_variable_defined?(:@__raygun_correlation_id) && correlation_id = exception.instance_variable_get(:@__raygun_correlation_id)
18
28
  data.merge!(correlation_id: correlation_id)
19
29
  end
@@ -1,3 +1,3 @@
1
1
  module Raygun
2
- VERSION = "4.0.0"
2
+ VERSION = "4.0.1"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  require_relative "../test_helper.rb"
2
2
 
3
3
  require "sidekiq"
4
+
4
5
  # Convince Sidekiq it's on a server :)
5
6
  module Sidekiq
6
7
  class << self
@@ -15,6 +16,8 @@ require "raygun/sidekiq"
15
16
  class SidekiqFailureTest < Raygun::UnitTest
16
17
 
17
18
  def setup
19
+ require "sidekiq/job_retry"
20
+
18
21
  super
19
22
  Raygun.configuration.send_in_background = false
20
23
 
@@ -32,6 +35,61 @@ class SidekiqFailureTest < Raygun::UnitTest
32
35
  assert response && response.success?, "Expected success, got #{response.class}: #{response.inspect}"
33
36
  end
34
37
 
38
+ def test_failure_backend_unwraps_retries
39
+ WebMock.reset!
40
+
41
+ unwrapped_stub = stub_request(:post, 'https://api.raygun.com/entries').
42
+ with(body: /StandardError/).
43
+ to_return(status: 202)
44
+
45
+ begin
46
+ raise StandardError.new("Some job in Sidekiq failed, oh dear!")
47
+ rescue
48
+ raise Sidekiq::JobRetry::Handled
49
+ end
50
+
51
+ rescue Sidekiq::JobRetry::Handled => e
52
+
53
+ response = Raygun::SidekiqReporter.call(
54
+ e,
55
+ { sidekick_name: "robin" },
56
+ {} # config
57
+ )
58
+
59
+ assert_requested unwrapped_stub
60
+ assert response && response.success?, "Expected success, got #{response.class}: #{response.inspect}"
61
+ end
62
+
63
+ def test_failured_backend_ignores_retries_if_configured
64
+ Raygun.configuration.track_retried_sidekiq_jobs = false
65
+
66
+ begin
67
+ raise StandardError.new("Some job in Sidekiq failed, oh dear!")
68
+ rescue
69
+ raise Sidekiq::JobRetry::Handled
70
+ end
71
+
72
+ rescue Sidekiq::JobRetry::Handled => e
73
+
74
+ refute Raygun::SidekiqReporter.call(e,
75
+ { sidekick_name: "robin" },
76
+ {} # config
77
+ )
78
+ ensure
79
+ Raygun.configuration.track_retried_sidekiq_jobs = true
80
+ end
81
+
82
+ # See https://github.com/MindscapeHQ/raygun4ruby/issues/183
83
+ # (This is how Sidekiq pre 7.1.5 calls error handlers: https://github.com/sidekiq/sidekiq/blob/1ba89bbb22d2fd574b11702d8b6ed63ae59e2256/lib/sidekiq/config.rb#L269)
84
+ def test_failure_backend_appears_to_work_without_config_argument
85
+ response = Raygun::SidekiqReporter.call(
86
+ StandardError.new("Oh no! Your Sidekiq has failed!"),
87
+ { sidekick_name: "robin" }
88
+ )
89
+
90
+ assert response && response.success?, "Expected success, got #{response.class}: #{response.inspect}"
91
+ end
92
+
35
93
  def test_we_are_in_sidekiqs_list_of_error_handlers
36
94
  # Sidekiq 7.x stores error handlers inside a configuration object, while 6.x and below stores them directly against the Sidekiq module
37
95
  error_handlers = Sidekiq.respond_to?(:error_handlers) ? Sidekiq.error_handlers : Sidekiq.default_configuration.error_handlers
@@ -39,4 +97,26 @@ class SidekiqFailureTest < Raygun::UnitTest
39
97
  assert error_handlers.include?(Raygun::SidekiqReporter)
40
98
  end
41
99
 
100
+ def test_rails_error_reporter_uses_sidekiq_reporter
101
+ WebMock.reset!
102
+
103
+ tagged_request = stub_request(:post, 'https://api.raygun.com/entries').
104
+ with(body: /"sidekiq"/). # should have a sidekiq tag!
105
+ to_return(status: 202)
106
+
107
+ error = StandardError.new("Oh no! Your Sidekiq has failed!")
108
+
109
+ response = Raygun::ErrorSubscriber.new.report(
110
+ error,
111
+ handled: true,
112
+ severity: "error",
113
+ context: { sidekick_name: "robin" },
114
+ source: "job.sidekiq"
115
+ )
116
+
117
+ assert response && response.success?, "Expected success, got #{response.class}: #{response.inspect}"
118
+
119
+ assert_requested tagged_request
120
+ end
121
+
42
122
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raygun4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mindscape
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-05-19 00:00:00.000000000 Z
12
+ date: 2024-07-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty