@@ -404,6 +404,123 @@ describe('Plugin', () => {
404404 rawExpectedSchema . receive
405405 )
406406 } )
407+
408+ describe ( 'consumer (eachBatch)' , ( ) => {
409+ let consumer
410+ const batchMessages = [ { key : 'key1' , value : 'test2' } , { key : 'key2' , value : 'test3' } ]
411+
412+ beforeEach ( async ( ) => {
413+ consumer = kafka . consumer ( { groupId : 'test-group' } )
414+ await consumer . connect ( )
415+ await consumer . subscribe ( { topic : testTopic , fromBeginning : true } )
416+ } )
417+
418+ afterEach ( async ( ) => {
419+ await consumer . disconnect ( )
420+ } )
421+
422+ it ( 'should be instrumented' , async ( ) => {
423+ const meta = {
424+ 'span.kind' : 'consumer' ,
425+ component : 'kafkajs' ,
426+ 'kafka.topic' : testTopic ,
427+ 'messaging.destination.name' : testTopic ,
428+ 'messaging.system' : 'kafka' ,
429+ }
430+ if ( clusterIdAvailable ) meta [ 'kafka.cluster_id' ] = testKafkaClusterId
431+
432+ const expectedSpanPromise = expectSpanWithDefaults ( {
433+ name : expectedSchema . receive . opName ,
434+ service : expectedSchema . receive . serviceName ,
435+ meta,
436+ metrics : {
437+ 'messaging.batch.message_count' : batchMessages . length ,
438+ } ,
439+ resource : testTopic ,
440+ error : 0 ,
441+ type : 'worker' ,
442+ } )
443+
444+ await consumer . run ( {
445+ eachBatch : ( ) => { } ,
446+ } )
447+ return Promise . all ( [ sendMessages ( kafka , testTopic , batchMessages ) , expectedSpanPromise ] )
448+ } )
449+
450+ it ( 'should run the consumer in the context of the consumer span' , done => {
451+ const firstSpan = tracer . scope ( ) . active ( )
452+
453+ let eachBatch = async ( { batch } ) => {
454+ const currentSpan = tracer . scope ( ) . active ( )
455+
456+ try {
457+ assert . notEqual ( currentSpan , firstSpan )
458+ assert . strictEqual ( currentSpan . context ( ) . _name , expectedSchema . receive . opName )
459+ done ( )
460+ } catch ( e ) {
461+ done ( e )
462+ } finally {
463+ eachBatch = ( ) => { } // avoid being called for each message
464+ }
465+ }
466+
467+ consumer . run ( { eachBatch : ( ...args ) => eachBatch ( ...args ) } )
468+ . then ( ( ) => sendMessages ( kafka , testTopic , batchMessages ) )
469+ . catch ( done )
470+ } )
471+
472+ it ( 'should propagate context via span links' , async ( ) => {
473+ const expectedSpanPromise = agent . assertSomeTraces ( traces => {
474+ const span = traces [ 0 ] [ 0 ]
475+ const links = span . meta [ '_dd.span_links' ] ? JSON . parse ( span . meta [ '_dd.span_links' ] ) : [ ]
476+
477+ assertObjectContains ( span , {
478+ name : expectedSchema . receive . opName ,
479+ service : expectedSchema . receive . serviceName ,
480+ resource : testTopic ,
481+ } )
482+
483+ assert . strictEqual ( links . length , batchMessages . length )
484+ } )
485+
486+ await consumer . run ( { eachBatch : ( ) => { } } )
487+ await Promise . all ( [ sendMessages ( kafka , testTopic , batchMessages ) , expectedSpanPromise ] )
488+ } )
489+
490+ it ( 'should not fail when messages have headers without trace context' , async ( ) => {
491+ const messagesWithHeaders = [
492+ { key : 'key1' , value : 'test1' , headers : { 'x-custom-header' : 'value' } } ,
493+ ]
494+ const meta = {
495+ 'span.kind' : 'consumer' ,
496+ component : 'kafkajs' ,
497+ 'kafka.topic' : testTopic ,
498+ 'messaging.destination.name' : testTopic ,
499+ 'messaging.system' : 'kafka' ,
500+ }
501+ if ( clusterIdAvailable ) meta [ 'kafka.cluster_id' ] = testKafkaClusterId
502+
503+ const expectedSpanPromise = expectSpanWithDefaults ( {
504+ name : expectedSchema . receive . opName ,
505+ service : expectedSchema . receive . serviceName ,
506+ meta,
507+ resource : testTopic ,
508+ error : 0 ,
509+ type : 'worker' ,
510+ } )
511+
512+ await consumer . run ( { eachBatch : ( ) => { } } )
513+ return Promise . all ( [ sendMessages ( kafka , testTopic , messagesWithHeaders ) , expectedSpanPromise ] )
514+ } )
515+
516+ withNamingSchema (
517+ async ( ) => {
518+ await consumer . run ( { eachBatch : ( ) => { } } )
519+ await sendMessages ( kafka , testTopic , batchMessages )
520+ } ,
521+ rawExpectedSchema . receive
522+ )
523+ } )
407524 } )
408525 } )
409526 } )
0 commit comments