@@ -200,6 +200,44 @@ def emit(self, span):
200200 # trace2 should be left in the queue because worker is terminated.
201201 self .assertEqual (worker ._queue .qsize (), 1 )
202202
203+ @mock .patch ('logging.exception' )
204+ def test__thread_main_alive_on_emit_failed (self , mock ):
205+
206+ class Exporter (object ):
207+ def __init__ (self ):
208+ self .exported = []
209+
210+ def emit (self , span ):
211+ if len (self .exported ) < 2 :
212+ self .exported .extend (span )
213+ else :
214+ raise Exception ("This exporter is broken !" )
215+
216+ exporter = Exporter ()
217+ worker = background_thread ._Worker (exporter , max_batch_size = 2 )
218+
219+ span_data0 = [mock .Mock ()]
220+ span_data1 = [mock .Mock ()]
221+ span_data2 = [mock .Mock ()]
222+
223+ worker .enqueue (span_data0 )
224+ worker .enqueue (span_data1 )
225+ worker .enqueue (span_data2 )
226+ worker .enqueue (background_thread ._WORKER_TERMINATOR )
227+
228+ worker ._thread_main ()
229+
230+ # Span 2 should throw an exception, only span 0 and 1 are left
231+ self .assertEqual (exporter .exported , span_data0 + span_data1 )
232+
233+ # Logging exception should have been called on the exporter exception
234+ expected = '%s failed to emit spans.Dropping %s spans from queue.'
235+ mock .assert_called_with (expected , 'Exporter' , 1 )
236+
237+ # Nothing should be left in the queue because worker is terminated
238+ # and the data was dropped.
239+ self .assertEqual (worker ._queue .qsize (), 0 )
240+
203241 def test_flush (self ):
204242 from six .moves import queue
205243
0 commit comments