11defmodule Broadway.TelemetryTest do
22 use ExUnit.Case
33
4+ alias Broadway.Message
5+
46 defmodule MessageServer do
57 use Broadway
68
@@ -24,6 +26,60 @@ defmodule Broadway.TelemetryTest do
2426 end
2527 end
2628
29+ defmodule FailingMessageServer do
30+ use Broadway
31+
32+ def start_link ( opts ) do
33+ Broadway . start_link ( __MODULE__ ,
34+ name: opts [ :name ] ,
35+ producer: [ module: { Broadway.DummyProducer , [ ] } ] ,
36+ processors: [ default: [ ] ] ,
37+ context: opts [ :context ]
38+ )
39+ end
40+
41+ @ impl true
42+ def handle_message ( _ , message , _context ) do
43+ Message . failed ( message , "forced failure" )
44+ end
45+
46+ @ impl true
47+ def handle_failed ( messages , % { test_pid: test_pid } = _context ) do
48+ send ( test_pid , :handle_failed_called )
49+ messages
50+ end
51+ end
52+
53+ defmodule FailingBatchServer do
54+ use Broadway
55+
56+ def start_link ( opts ) do
57+ Broadway . start_link ( __MODULE__ ,
58+ name: opts [ :name ] ,
59+ producer: [ module: { Broadway.DummyProducer , [ ] } ] ,
60+ processors: [ default: [ ] ] ,
61+ batchers: [ default: [ batch_size: 1 ] ] ,
62+ context: opts [ :context ]
63+ )
64+ end
65+
66+ @ impl true
67+ def handle_message ( _ , message , _context ) do
68+ message
69+ end
70+
71+ @ impl true
72+ def handle_batch ( _batcher , messages , _batch_info , _context ) do
73+ Enum . map ( messages , & Message . failed ( & 1 , "forced batch failure" ) )
74+ end
75+
76+ @ impl true
77+ def handle_failed ( messages , % { test_pid: test_pid } = _context ) do
78+ send ( test_pid , :handle_failed_called )
79+ messages
80+ end
81+ end
82+
2783 test "[:broadway, :processor, :message, :start] and :stop events include producer metadata" do
2884 test_pid = self ( )
2985 producer_options = [ queue_url: "https://sqs.amazonaws.com/123456789/my-queue" ]
@@ -92,4 +148,84 @@ defmodule Broadway.TelemetryTest do
92148
93149 :telemetry . detach ( "test-extract-queue-name" )
94150 end
151+
152+ test "[:broadway, :handle_failed, :start] and :stop are emitted from a processor" do
153+ test_pid = self ( )
154+
155+ :telemetry . attach_many (
156+ "test-handle-failed-processor" ,
157+ [
158+ [ :broadway , :handle_failed , :start ] ,
159+ [ :broadway , :handle_failed , :stop ]
160+ ] ,
161+ fn event_name , _measurements , metadata , _config ->
162+ send ( test_pid , { :telemetry_event , event_name , metadata } )
163+ end ,
164+ % { }
165+ )
166+
167+ { :ok , _pid } =
168+ start_supervised (
169+ { FailingMessageServer ,
170+ name: :test_handle_failed_processor , context: % { test_pid: test_pid } }
171+ )
172+
173+ ref = Broadway . test_message ( :test_handle_failed_processor , "data" )
174+
175+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :start ] , start_metadata }
176+ assert start_metadata . topology_name == :test_handle_failed_processor
177+ assert start_metadata . module == FailingMessageServer
178+ assert start_metadata . processor_key == :default
179+ assert [ % Message { } ] = start_metadata . messages
180+
181+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :stop ] , stop_metadata }
182+ assert stop_metadata . topology_name == :test_handle_failed_processor
183+ assert stop_metadata . module == FailingMessageServer
184+ assert [ % Message { } ] = stop_metadata . messages
185+
186+ assert_receive :handle_failed_called
187+ assert_receive { :ack , ^ ref , _successful , _failed }
188+
189+ :telemetry . detach ( "test-handle-failed-processor" )
190+ end
191+
192+ test "[:broadway, :handle_failed, :start] and :stop are emitted from a batch processor" do
193+ test_pid = self ( )
194+
195+ :telemetry . attach_many (
196+ "test-handle-failed-batch-processor" ,
197+ [
198+ [ :broadway , :handle_failed , :start ] ,
199+ [ :broadway , :handle_failed , :stop ]
200+ ] ,
201+ fn event_name , _measurements , metadata , _config ->
202+ send ( test_pid , { :telemetry_event , event_name , metadata } )
203+ end ,
204+ % { }
205+ )
206+
207+ { :ok , _pid } =
208+ start_supervised (
209+ { FailingBatchServer ,
210+ name: :test_handle_failed_batch_processor , context: % { test_pid: test_pid } }
211+ )
212+
213+ ref = Broadway . test_message ( :test_handle_failed_batch_processor , "data" )
214+
215+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :start ] , start_metadata }
216+ assert start_metadata . topology_name == :test_handle_failed_batch_processor
217+ assert start_metadata . module == FailingBatchServer
218+ assert % Broadway.BatchInfo { } = start_metadata . batch_info
219+ assert [ % Message { } ] = start_metadata . messages
220+
221+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :stop ] , stop_metadata }
222+ assert stop_metadata . topology_name == :test_handle_failed_batch_processor
223+ assert stop_metadata . module == FailingBatchServer
224+ assert [ % Message { } ] = stop_metadata . messages
225+
226+ assert_receive :handle_failed_called
227+ assert_receive { :ack , ^ ref , _successful , _failed }
228+
229+ :telemetry . detach ( "test-handle-failed-batch-processor" )
230+ end
95231end
0 commit comments