6868import static org .mockito .Mockito .spy ;
6969import static org .mockito .Mockito .times ;
7070import static org .mockito .Mockito .verify ;
71+ import static org .mockito .Mockito .verifyNoInteractions ;
7172import static org .mockito .Mockito .when ;
7273
7374public class TaskManagerTests extends ESTestCase {
@@ -281,13 +282,72 @@ public void testTaskAccounting() {
281282 /**
282283 * Check that registering a task also causes tracing to be started on that task.
283284 */
284- public void testRegisterTaskStartsTracing () {
285+ public void testRegisterTaskStartsTracingIfTraceParentExists () {
285286 final Tracer mockTracer = mock (Tracer .class );
286287 final TaskManager taskManager = new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer );
287288
289+ // fake a trace parent
290+ threadPool .getThreadContext ().putHeader (Task .TRACE_PARENT_HTTP_HEADER , "traceparent" );
288291 final boolean hasParentTask = randomBoolean ();
289292 final TaskId parentTask = hasParentTask ? new TaskId ("parentNode" , 1 ) : TaskId .EMPTY_TASK_ID ;
290293
294+ try (var ignored = threadPool .getThreadContext ().newTraceContext ()) {
295+
296+ final Task task = taskManager .register ("testType" , "testAction" , new TaskAwareRequest () {
297+
298+ @ Override
299+ public void setParentTask (TaskId taskId ) {}
300+
301+ @ Override
302+ public void setRequestId (long requestId ) {}
303+
304+ @ Override
305+ public TaskId getParentTask () {
306+ return parentTask ;
307+ }
308+ });
309+
310+ Map <String , Object > attributes = hasParentTask
311+ ? Map .of (Tracer .AttributeKeys .TASK_ID , task .getId (), Tracer .AttributeKeys .PARENT_TASK_ID , parentTask .toString ())
312+ : Map .of (Tracer .AttributeKeys .TASK_ID , task .getId ());
313+ verify (mockTracer ).startTrace (any (), eq (task ), eq ("testAction" ), eq (attributes ));
314+ }
315+ }
316+
317+ /**
318+ * Check that registering a task also causes tracing to be started on that task.
319+ */
320+ public void testRegisterTaskSkipsTracingIfTraceParentMissing () {
321+ final Tracer mockTracer = mock (Tracer .class );
322+ final TaskManager taskManager = new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer );
323+
324+ // no trace parent
325+ try (var ignored = threadPool .getThreadContext ().newTraceContext ()) {
326+ final Task task = taskManager .register ("testType" , "testAction" , new TaskAwareRequest () {
327+
328+ @ Override
329+ public void setParentTask (TaskId taskId ) {}
330+
331+ @ Override
332+ public void setRequestId (long requestId ) {}
333+
334+ @ Override
335+ public TaskId getParentTask () {
336+ return TaskId .EMPTY_TASK_ID ;
337+ }
338+ });
339+ }
340+
341+ verifyNoInteractions (mockTracer );
342+ }
343+
344+ /**
345+ * Check that unregistering a task also causes tracing to be stopped on that task.
346+ */
347+ public void testUnregisterTaskStopsTracingIfTraceContextExists () {
348+ final Tracer mockTracer = mock (Tracer .class );
349+ final TaskManager taskManager = new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer );
350+
291351 final Task task = taskManager .register ("testType" , "testAction" , new TaskAwareRequest () {
292352
293353 @ Override
@@ -298,20 +358,21 @@ public void setRequestId(long requestId) {}
298358
299359 @ Override
300360 public TaskId getParentTask () {
301- return parentTask ;
361+ return TaskId . EMPTY_TASK_ID ;
302362 }
303363 });
304364
305- Map <String , Object > attributes = hasParentTask
306- ? Map .of (Tracer .AttributeKeys .TASK_ID , task .getId (), Tracer .AttributeKeys .PARENT_TASK_ID , parentTask .toString ())
307- : Map .of (Tracer .AttributeKeys .TASK_ID , task .getId ());
308- verify (mockTracer ).startTrace (any (), eq (task ), eq ("testAction" ), eq (attributes ));
365+ // fake a trace context (trace parent)
366+ threadPool .getThreadContext ().putHeader (Task .TRACE_PARENT_HTTP_HEADER , "traceparent" );
367+
368+ taskManager .unregister (task );
369+ verify (mockTracer ).stopTrace (task );
309370 }
310371
311372 /**
312373 * Check that unregistering a task also causes tracing to be stopped on that task.
313374 */
314- public void testUnregisterTaskStopsTracing () {
375+ public void testUnregisterTaskStopsTracingIfTraceContextMissing () {
315376 final Tracer mockTracer = mock (Tracer .class );
316377 final TaskManager taskManager = new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer );
317378
@@ -329,18 +390,22 @@ public TaskId getParentTask() {
329390 }
330391 });
331392
332- taskManager . unregister ( task );
393+ // no trace context
333394
334- verify (mockTracer ).stopTrace (task );
395+ taskManager .unregister (task );
396+ verifyNoInteractions (mockTracer );
335397 }
336398
337399 /**
338- * Check that registering and executing a task also causes tracing to be started and stopped on that task .
400+ * Check that registering and executing a task also causes tracing to be started if a trace parent exists .
339401 */
340- public void testRegisterAndExecuteStartsAndStopsTracing () {
402+ public void testRegisterAndExecuteStartsTracingIfTraceParentExists () {
341403 final Tracer mockTracer = mock (Tracer .class );
342404 final TaskManager taskManager = new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer );
343405
406+ // fake a trace parent
407+ threadPool .getThreadContext ().putHeader (Task .TRACE_PARENT_HTTP_HEADER , "traceparent" );
408+
344409 final Task task = taskManager .registerAndExecute (
345410 "testType" ,
346411 new TransportAction <ActionRequest , ActionResponse >(
@@ -375,25 +440,68 @@ public TaskId getParentTask() {
375440 verify (mockTracer ).startTrace (any (), eq (task ), eq ("actionName" ), anyMap ());
376441 }
377442
443+ /**
444+ * Check that registering and executing a task skips tracing if trace parent does not exists.
445+ */
446+ public void testRegisterAndExecuteSkipsTracingIfTraceParentMissing () {
447+ final Tracer mockTracer = mock (Tracer .class );
448+ final TaskManager taskManager = new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer );
449+
450+ // clean thread context without trace parent
451+
452+ final Task task = taskManager .registerAndExecute (
453+ "testType" ,
454+ new TransportAction <ActionRequest , ActionResponse >(
455+ "actionName" ,
456+ new ActionFilters (Set .of ()),
457+ taskManager ,
458+ EsExecutors .DIRECT_EXECUTOR_SERVICE
459+ ) {
460+ @ Override
461+ protected void doExecute (Task task , ActionRequest request , ActionListener <ActionResponse > listener ) {
462+ listener .onResponse (new ActionResponse () {
463+ @ Override
464+ public void writeTo (StreamOutput out ) {}
465+ });
466+ }
467+ },
468+ new ActionRequest () {
469+ @ Override
470+ public ActionRequestValidationException validate () {
471+ return null ;
472+ }
473+
474+ @ Override
475+ public TaskId getParentTask () {
476+ return TaskId .EMPTY_TASK_ID ;
477+ }
478+ },
479+ null ,
480+ ActionTestUtils .assertNoFailureListener (r -> {})
481+ );
482+
483+ verifyNoInteractions (mockTracer );
484+ }
485+
378486 public void testRegisterWithEnabledDisabledTracing () {
379487 final Tracer mockTracer = mock (Tracer .class );
380488 final TaskManager taskManager = spy (new TaskManager (Settings .EMPTY , threadPool , Set .of (), mockTracer ));
381489
382490 taskManager .register ("type" , "action" , makeTaskRequest (true , 123 ), false );
383- verify (taskManager , times (0 )).startTrace (any (), any ());
491+ verify (taskManager , times (0 )).maybeStartTrace (any (), any ());
384492
385493 taskManager .register ("type" , "action" , makeTaskRequest (false , 234 ), false );
386- verify (taskManager , times (0 )).startTrace (any (), any ());
494+ verify (taskManager , times (0 )).maybeStartTrace (any (), any ());
387495
388496 clearInvocations (taskManager );
389497
390498 taskManager .register ("type" , "action" , makeTaskRequest (true , 345 ), true );
391- verify (taskManager , times (1 )).startTrace (any (), any ());
499+ verify (taskManager , times (1 )).maybeStartTrace (any (), any ());
392500
393501 clearInvocations (taskManager );
394502
395503 taskManager .register ("type" , "action" , makeTaskRequest (false , 456 ), true );
396- verify (taskManager , times (1 )).startTrace (any (), any ());
504+ verify (taskManager , times (1 )).maybeStartTrace (any (), any ());
397505 }
398506
399507 static class CancellableRequest extends AbstractTransportRequest {
0 commit comments