@@ -51,11 +51,7 @@ import type {
5151 Producer ,
5252 RecordMetadata ,
5353} from 'kafkajs' ;
54- import {
55- ConsumerExtended ,
56- EVENT_LISTENERS_SET ,
57- ProducerExtended ,
58- } from './internal-types' ;
54+ import { EVENT_LISTENERS_SET } from './internal-types' ;
5955import { bufferTextMapGetter } from './propagator' ;
6056import {
6157 ATTR_MESSAGING_BATCH_MESSAGE_COUNT ,
@@ -88,6 +84,22 @@ interface ConsumerSpanOptions {
8884 ctx ?: Context | undefined ;
8985 link ?: Link ;
9086}
87+ // This interface acts as a strict subset of the KafkaJS Consumer and
88+ // Producer interfaces (just for the event we're needing)
89+ interface KafkaEventEmitter {
90+ on (
91+ eventName :
92+ | kafkaJs . ConsumerEvents [ 'REQUEST' ]
93+ | kafkaJs . ProducerEvents [ 'REQUEST' ] ,
94+ listener : ( event : kafkaJs . RequestEvent ) => void
95+ ) : void ;
96+ events : {
97+ REQUEST :
98+ | kafkaJs . ConsumerEvents [ 'REQUEST' ]
99+ | kafkaJs . ProducerEvents [ 'REQUEST' ] ;
100+ } ;
101+ [ EVENT_LISTENERS_SET ] ?: boolean ;
102+ }
91103
92104interface StandardAttributes < OP extends string = string > extends Attributes {
93105 [ ATTR_MESSAGING_SYSTEM ] : string ;
@@ -229,37 +241,27 @@ export class KafkaJsInstrumentation extends InstrumentationBase<KafkaJsInstrumen
229241 instrumentation . _getConsumerRunPatch ( )
230242 ) ;
231243
232- instrumentation . _setConsumerEventListeners ( newConsumer ) ;
244+ instrumentation . _setKafkaEventListeners ( newConsumer ) ;
233245
234246 return newConsumer ;
235247 } ;
236248 } ;
237249 }
238250
239- private _setConsumerEventListeners ( consumer : ConsumerExtended ) {
240- if ( consumer [ EVENT_LISTENERS_SET ] ) return ;
251+ private _setKafkaEventListeners ( kafkaObj : KafkaEventEmitter ) {
252+ if ( kafkaObj [ EVENT_LISTENERS_SET ] ) return ;
241253
242- consumer . on ( consumer . events . END_BATCH_PROCESS , event =>
243- this . _consumedMessages . add ( event . payload . batchSize , {
244- [ ATTR_MESSAGING_SYSTEM ] : MESSAGING_SYSTEM_VALUE_KAFKA ,
245- [ ATTR_MESSAGING_OPERATION_NAME ] : 'receive' ,
246- [ ATTR_MESSAGING_DESTINATION_NAME ] : event . payload . topic ,
247- [ ATTR_MESSAGING_DESTINATION_PARTITION_ID ] : String (
248- event . payload . partition
249- ) ,
250- } )
251- ) ;
252- consumer . on ( consumer . events . REQUEST , event => {
254+ kafkaObj . on ( kafkaObj . events . REQUEST , event => {
253255 const [ address , port ] = event . payload . broker . split ( ':' ) ;
254256 this . _clientDuration . record ( event . payload . duration / 1000 , {
255257 [ ATTR_MESSAGING_SYSTEM ] : MESSAGING_SYSTEM_VALUE_KAFKA ,
256- [ ATTR_MESSAGING_OPERATION_NAME ] : `${ event . payload . apiName } ` , // potentially suffix with @${event.payload.apiVersion}?
258+ [ ATTR_MESSAGING_OPERATION_NAME ] : `${ event . payload . apiName } ` , // potentially suffix with @v ${event.payload.apiVersion}?
257259 [ ATTR_SERVER_ADDRESS ] : address ,
258260 [ ATTR_SERVER_PORT ] : Number . parseInt ( port , 10 ) ,
259261 } ) ;
260262 } ) ;
261263
262- consumer [ EVENT_LISTENERS_SET ] = true ;
264+ kafkaObj [ EVENT_LISTENERS_SET ] = true ;
263265 }
264266
265267 private _getProducerPatch ( ) {
@@ -289,29 +291,13 @@ export class KafkaJsInstrumentation extends InstrumentationBase<KafkaJsInstrumen
289291 instrumentation . _getProducerSendPatch ( )
290292 ) ;
291293
292- instrumentation . _setProducerEventListeners ( newProducer ) ;
294+ instrumentation . _setKafkaEventListeners ( newProducer ) ;
293295
294296 return newProducer ;
295297 } ;
296298 } ;
297299 }
298300
299- private _setProducerEventListeners ( producer : ProducerExtended ) {
300- if ( producer [ EVENT_LISTENERS_SET ] ) return ;
301-
302- producer . on ( producer . events . REQUEST , event => {
303- const [ address , port ] = event . payload . broker . split ( ':' ) ;
304- this . _clientDuration . record ( event . payload . duration / 1000 , {
305- [ ATTR_MESSAGING_SYSTEM ] : MESSAGING_SYSTEM_VALUE_KAFKA ,
306- [ ATTR_MESSAGING_OPERATION_NAME ] : `${ event . payload . apiName } ` , // potentially suffix with @${event.payload.apiVersion}?
307- [ ATTR_SERVER_ADDRESS ] : address ,
308- [ ATTR_SERVER_PORT ] : Number . parseInt ( port ) ,
309- } ) ;
310- } ) ;
311-
312- producer [ EVENT_LISTENERS_SET ] = true ;
313- }
314-
315301 private _getConsumerRunPatch ( ) {
316302 const instrumentation = this ;
317303 return ( original : Consumer [ 'run' ] ) => {
@@ -383,6 +369,14 @@ export class KafkaJsInstrumentation extends InstrumentationBase<KafkaJsInstrumen
383369 ) ,
384370 }
385371 ) ,
372+ prepareCounter ( instrumentation . _consumedMessages , 1 , {
373+ [ ATTR_MESSAGING_SYSTEM ] : MESSAGING_SYSTEM_VALUE_KAFKA ,
374+ [ ATTR_MESSAGING_OPERATION_NAME ] : 'process' ,
375+ [ ATTR_MESSAGING_DESTINATION_NAME ] : payload . topic ,
376+ [ ATTR_MESSAGING_DESTINATION_PARTITION_ID ] : String (
377+ payload . partition
378+ ) ,
379+ } ) ,
386380 ] ;
387381
388382 const eachMessagePromise = context . with (
@@ -426,7 +420,20 @@ export class KafkaJsInstrumentation extends InstrumentationBase<KafkaJsInstrumen
426420 ( ) => {
427421 const startTime = Date . now ( ) ;
428422 const spans : Span [ ] = [ ] ;
429- const pendingMetrics : RecordPendingMetric [ ] = [ ] ;
423+ const pendingMetrics : RecordPendingMetric [ ] = [
424+ prepareCounter (
425+ instrumentation . _consumedMessages ,
426+ payload . batch . messages . length ,
427+ {
428+ [ ATTR_MESSAGING_SYSTEM ] : MESSAGING_SYSTEM_VALUE_KAFKA ,
429+ [ ATTR_MESSAGING_OPERATION_NAME ] : 'process' ,
430+ [ ATTR_MESSAGING_DESTINATION_NAME ] : payload . batch . topic ,
431+ [ ATTR_MESSAGING_DESTINATION_PARTITION_ID ] : String (
432+ payload . batch . partition
433+ ) ,
434+ }
435+ ) ,
436+ ] ;
430437 payload . batch . messages . forEach ( message => {
431438 const propagatedContext : Context = propagation . extract (
432439 ROOT_CONTEXT ,
0 commit comments