@@ -69,21 +69,21 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
69
69
assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
70
70
end
71
71
72
- test "reports non-exception errors to Sentry" do
72
+ test "reports normalized non-exception errors to Sentry" do
73
73
Sentry.Test . start_collecting ( )
74
74
75
75
emit_telemetry_for_failed_job ( :error , :undef , [ ] )
76
76
77
77
assert [ event ] = Sentry.Test . pop_sentry_reports ( )
78
78
assert % { job: % Oban.Job { } } = event . integration_meta . oban
79
79
80
- assert event . message == % Sentry.Interfaces.Message {
81
- formatted: "Oban job #{ @ worker_as_string } errored out: :undef" ,
82
- message: "Oban job #{ @ worker_as_string } errored out: %s" ,
83
- params: [ ":undef" ]
84
- }
80
+ assert event . message == nil
85
81
86
- assert [ % Sentry.Interfaces.Thread { stacktrace: % { frames: [ stacktrace ] } } ] = event . threads
82
+ assert [ % { stacktrace: % { frames: [ stacktrace ] } } = exception ] = event . exception
83
+
84
+ assert exception . type == "UndefinedFunctionError"
85
+ assert exception . value == "function #{ @ worker_as_string } .process/1 is undefined or private"
86
+ assert exception . mechanism . handled == true
87
87
assert stacktrace . module == MyWorker
88
88
assert stacktrace . function == "#{ @ worker_as_string } .process/1"
89
89
@@ -94,6 +94,53 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
94
94
assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
95
95
end
96
96
97
+ test "reports exits to Sentry" do
98
+ Sentry.Test . start_collecting ( )
99
+
100
+ emit_telemetry_for_failed_job ( :exit , :oops , [ ] )
101
+
102
+ assert [ event ] = Sentry.Test . pop_sentry_reports ( )
103
+ assert % { job: % Oban.Job { } } = event . integration_meta . oban
104
+
105
+ assert event . message == % Sentry.Interfaces.Message {
106
+ message: "Oban job #{ @ worker_as_string } exited: %s" ,
107
+ params: [ ":oops" ] ,
108
+ formatted: "Oban job #{ @ worker_as_string } exited: :oops"
109
+ }
110
+
111
+ assert event . exception == [ ]
112
+
113
+ assert event . tags . oban_queue == "default"
114
+ assert event . tags . oban_state == "available"
115
+ assert event . tags . oban_worker == @ worker_as_string
116
+
117
+ assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
118
+ end
119
+
120
+ test "reports throws to Sentry" do
121
+ Sentry.Test . start_collecting ( )
122
+
123
+ emit_telemetry_for_failed_job ( :throw , :this_was_not_caught , [ ] )
124
+
125
+ assert [ event ] = Sentry.Test . pop_sentry_reports ( )
126
+ assert % { job: % Oban.Job { } } = event . integration_meta . oban
127
+
128
+ assert event . message == % Sentry.Interfaces.Message {
129
+ message: "Oban job #{ @ worker_as_string } exited with an uncaught throw: %s" ,
130
+ params: [ ":this_was_not_caught" ] ,
131
+ formatted:
132
+ "Oban job #{ @ worker_as_string } exited with an uncaught throw: :this_was_not_caught"
133
+ }
134
+
135
+ assert event . exception == [ ]
136
+
137
+ assert event . tags . oban_queue == "default"
138
+ assert event . tags . oban_state == "available"
139
+ assert event . tags . oban_worker == @ worker_as_string
140
+
141
+ assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
142
+ end
143
+
97
144
for reason <- [ :cancel , :discard ] do
98
145
test "doesn't report Oban.PerformError with reason #{ inspect ( reason ) } " do
99
146
Sentry.Test . start_collecting ( )
@@ -116,13 +163,12 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
116
163
% { "id" => "123" , "entity" => "user" , "type" => "delete" }
117
164
|> MyWorker . new ( )
118
165
|> Ecto.Changeset . apply_action! ( :validate )
119
- |> Map . replace! ( :unsaved_error , % { kind: kind , reason: reason , stacktrace: stacktrace } )
120
166
121
167
assert :ok =
122
168
ErrorReporter . handle_event (
123
169
[ :oban , :job , :exception ] ,
124
170
% { } ,
125
- % { job: job } ,
171
+ % { job: job , kind: kind , reason: reason , stacktrace: stacktrace } ,
126
172
:no_config
127
173
)
128
174
0 commit comments