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" ]
@@ -72,7 +128,10 @@ defmodule Broadway.TelemetryTest do
72128 [ :broadway , :processor , :message , :start ] ,
73129 fn _event_name , _measurements , metadata , _config ->
74130 { _module , adapter_options } = metadata . producer
75- queue_name = adapter_options |> Keyword . fetch! ( :queue_url ) |> String . split ( "/" ) |> List . last ( )
131+
132+ queue_name =
133+ adapter_options |> Keyword . fetch! ( :queue_url ) |> String . split ( "/" ) |> List . last ( )
134+
76135 send ( test_pid , { :queue_name , queue_name } )
77136 end ,
78137 % { }
@@ -92,4 +151,78 @@ defmodule Broadway.TelemetryTest do
92151
93152 :telemetry . detach ( "test-extract-queue-name" )
94153 end
154+
155+ test "[:broadway, :handle_failed, :start] and :stop are emitted from a processor" do
156+ test_pid = self ( )
157+
158+ :telemetry . attach_many (
159+ "test-handle-failed-processor" ,
160+ [
161+ [ :broadway , :handle_failed , :start ] ,
162+ [ :broadway , :handle_failed , :stop ]
163+ ] ,
164+ fn event_name , _measurements , metadata , _config ->
165+ send ( test_pid , { :telemetry_event , event_name , metadata } )
166+ end ,
167+ % { }
168+ )
169+
170+ { :ok , _pid } =
171+ start_supervised (
172+ { FailingMessageServer ,
173+ name: :test_handle_failed_processor , context: % { test_pid: test_pid } }
174+ )
175+
176+ ref = Broadway . test_message ( :test_handle_failed_processor , "data" )
177+
178+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :start ] , start_metadata }
179+ assert start_metadata . module == FailingMessageServer
180+ assert [ % Message { } ] = start_metadata . messages
181+
182+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :stop ] , stop_metadata }
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 . module == FailingBatchServer
217+ assert [ % Message { } ] = start_metadata . messages
218+
219+ assert_receive { :telemetry_event , [ :broadway , :handle_failed , :stop ] , stop_metadata }
220+ assert stop_metadata . module == FailingBatchServer
221+ assert [ % Message { } ] = stop_metadata . messages
222+
223+ assert_receive :handle_failed_called
224+ assert_receive { :ack , ^ ref , _successful , _failed }
225+
226+ :telemetry . detach ( "test-handle-failed-batch-processor" )
227+ end
95228end
0 commit comments