@@ -23,6 +23,7 @@ import {exporter} from './tracing';
2323import { SpanKind } from '@opentelemetry/api' ;
2424import sinon = require( 'sinon' ) ;
2525import { PubsubMessage } from '../src/publisher' ;
26+ import { Duration } from '../src/temporal' ;
2627
2728describe ( 'OpenTelemetryTracer' , ( ) => {
2829 beforeEach ( ( ) => {
@@ -292,6 +293,7 @@ describe('OpenTelemetryTracer', () => {
292293 firstSpan . attributes [ 'messaging.destination.name' ] ,
293294 tests . topicInfo . topicId ,
294295 ) ;
296+ assert . strictEqual ( firstSpan . attributes [ 'messaging.operation' ] , 'create' ) ;
295297 assert . strictEqual (
296298 firstSpan . attributes [ 'messaging.system' ] ,
297299 'gcp_pubsub' ,
@@ -346,6 +348,10 @@ describe('OpenTelemetryTracer', () => {
346348 assert . ok ( parentReadSpan && childReadSpan ) ;
347349
348350 assert . strictEqual ( childReadSpan . name , 'sub subscribe' ) ;
351+ assert . strictEqual (
352+ childReadSpan . attributes [ 'messaging.operation' ] ,
353+ 'receive' ,
354+ ) ;
349355 assert . strictEqual (
350356 childReadSpan . attributes [ 'messaging.destination.name' ] ,
351357 'sub' ,
@@ -388,5 +394,92 @@ describe('OpenTelemetryTracer', () => {
388394 assert . strictEqual ( publishReadSpan . links . length , 1 ) ;
389395 assert . strictEqual ( childReadSpan . links . length , 1 ) ;
390396 } ) ;
397+
398+ it ( 'creates ack rpc span' , ( ) => {
399+ const message : PubsubMessage = { } ;
400+ const topicName = 'projects/test/topics/topicfoo' ;
401+ const subName = 'subTest' ;
402+ const producerSpan = otel . PubsubSpans . createPublisherSpan (
403+ message ,
404+ topicName ,
405+ 'test' ,
406+ ) as trace . Span ;
407+ const span = otel . PubsubSpans . createAckRpcSpan (
408+ [ producerSpan ] ,
409+ subName ,
410+ 'tests' ,
411+ ) ;
412+ assert . ok ( span ) ;
413+ producerSpan . end ( ) ;
414+ span . end ( ) ;
415+
416+ const spans = exporter . getFinishedSpans ( ) ;
417+ assert . strictEqual ( spans . length , 2 ) ;
418+
419+ const firstSpan = spans . pop ( ) ;
420+ assert . ok ( firstSpan ) ;
421+ assert . strictEqual ( firstSpan . kind , SpanKind . CLIENT ) ;
422+ assert . strictEqual ( firstSpan . name , `${ subName } ack` ) ;
423+ assert . strictEqual (
424+ firstSpan . attributes [ 'messaging.destination.name' ] ,
425+ subName ,
426+ ) ;
427+ assert . strictEqual (
428+ firstSpan . attributes [ 'messaging.batch.message_count' ] ,
429+ 1 ,
430+ ) ;
431+ assert . strictEqual (
432+ firstSpan . attributes [ 'messaging.system' ] ,
433+ 'gcp_pubsub' ,
434+ ) ;
435+ } ) ;
436+
437+ it ( 'creates modack rpc span' , ( ) => {
438+ const message : PubsubMessage = { } ;
439+ const topicName = 'projects/test/topics/topicfoo' ;
440+ const subName = 'subTest' ;
441+ const producerSpan = otel . PubsubSpans . createPublisherSpan (
442+ message ,
443+ topicName ,
444+ 'test' ,
445+ ) as trace . Span ;
446+ const span = otel . PubsubSpans . createModackRpcSpan (
447+ [ producerSpan ] ,
448+ subName ,
449+ 'modack' ,
450+ 'test' ,
451+ Duration . from ( { seconds : 1 } ) ,
452+ true ,
453+ ) ;
454+ assert . ok ( span ) ;
455+ producerSpan . end ( ) ;
456+ span . end ( ) ;
457+
458+ const spans = exporter . getFinishedSpans ( ) ;
459+ assert . strictEqual ( spans . length , 2 ) ;
460+
461+ const firstSpan = spans . pop ( ) ;
462+ assert . ok ( firstSpan ) ;
463+ assert . strictEqual ( firstSpan . kind , SpanKind . CLIENT ) ;
464+ assert . strictEqual ( firstSpan . name , `${ subName } modack` ) ;
465+ assert . strictEqual (
466+ firstSpan . attributes [ 'messaging.destination.name' ] ,
467+ subName ,
468+ ) ;
469+ assert . strictEqual (
470+ firstSpan . attributes [
471+ 'messaging.gcp_pubsub.message.ack_deadline_seconds'
472+ ] ,
473+ 1 ,
474+ ) ;
475+ assert . strictEqual (
476+ firstSpan . attributes [ 'messaging.gcp_pubsub.is_receipt_modack' ] ,
477+ true ,
478+ ) ;
479+ assert . strictEqual (
480+ firstSpan . attributes [ 'messaging.system' ] ,
481+ 'gcp_pubsub' ,
482+ ) ;
483+ } ) ;
391484 } ) ;
392485} ) ;
0 commit comments