diff --git a/src/telemetry-tracing.ts b/src/telemetry-tracing.ts index e6f44b0d2..54a516d1b 100644 --- a/src/telemetry-tracing.ts +++ b/src/telemetry-tracing.ts @@ -537,7 +537,7 @@ export class PubsubSpans { const span: Span = getTracer().startSpan( `${subInfo.subId ?? subInfo.subName} ack`, { - kind: SpanKind.CONSUMER, + kind: SpanKind.CLIENT, attributes: spanAttributes, links, }, @@ -585,7 +585,7 @@ export class PubsubSpans { const span: Span = getTracer().startSpan( `${subInfo.subId ?? subInfo.subName} ${type}`, { - kind: SpanKind.CONSUMER, + kind: SpanKind.CLIENT, attributes: spanAttributes, links, }, diff --git a/test/telemetry-tracing.ts b/test/telemetry-tracing.ts index 02715a304..4ef42f105 100644 --- a/test/telemetry-tracing.ts +++ b/test/telemetry-tracing.ts @@ -23,6 +23,7 @@ import {exporter} from './tracing'; import {SpanKind} from '@opentelemetry/api'; import sinon = require('sinon'); import {PubsubMessage} from '../src/publisher'; +import {Duration} from '../src/temporal'; describe('OpenTelemetryTracer', () => { beforeEach(() => { @@ -292,6 +293,7 @@ describe('OpenTelemetryTracer', () => { firstSpan.attributes['messaging.destination.name'], tests.topicInfo.topicId, ); + assert.strictEqual(firstSpan.attributes['messaging.operation'], 'create'); assert.strictEqual( firstSpan.attributes['messaging.system'], 'gcp_pubsub', @@ -346,6 +348,10 @@ describe('OpenTelemetryTracer', () => { assert.ok(parentReadSpan && childReadSpan); assert.strictEqual(childReadSpan.name, 'sub subscribe'); + assert.strictEqual( + childReadSpan.attributes['messaging.operation'], + 'receive', + ); assert.strictEqual( childReadSpan.attributes['messaging.destination.name'], 'sub', @@ -388,5 +394,92 @@ describe('OpenTelemetryTracer', () => { assert.strictEqual(publishReadSpan.links.length, 1); assert.strictEqual(childReadSpan.links.length, 1); }); + + it('creates ack rpc span', () => { + const message: PubsubMessage = {}; + const topicName = 'projects/test/topics/topicfoo'; + const subName = 'subTest'; + const producerSpan = otel.PubsubSpans.createPublisherSpan( + message, + topicName, + 'test', + ) as trace.Span; + const span = otel.PubsubSpans.createAckRpcSpan( + [producerSpan], + subName, + 'tests', + ); + assert.ok(span); + producerSpan.end(); + span.end(); + + const spans = exporter.getFinishedSpans(); + assert.strictEqual(spans.length, 2); + + const firstSpan = spans.pop(); + assert.ok(firstSpan); + assert.strictEqual(firstSpan.kind, SpanKind.CLIENT); + assert.strictEqual(firstSpan.name, `${subName} ack`); + assert.strictEqual( + firstSpan.attributes['messaging.destination.name'], + subName, + ); + assert.strictEqual( + firstSpan.attributes['messaging.batch.message_count'], + 1, + ); + assert.strictEqual( + firstSpan.attributes['messaging.system'], + 'gcp_pubsub', + ); + }); + + it('creates modack rpc span', () => { + const message: PubsubMessage = {}; + const topicName = 'projects/test/topics/topicfoo'; + const subName = 'subTest'; + const producerSpan = otel.PubsubSpans.createPublisherSpan( + message, + topicName, + 'test', + ) as trace.Span; + const span = otel.PubsubSpans.createModackRpcSpan( + [producerSpan], + subName, + 'modack', + 'test', + Duration.from({seconds: 1}), + true, + ); + assert.ok(span); + producerSpan.end(); + span.end(); + + const spans = exporter.getFinishedSpans(); + assert.strictEqual(spans.length, 2); + + const firstSpan = spans.pop(); + assert.ok(firstSpan); + assert.strictEqual(firstSpan.kind, SpanKind.CLIENT); + assert.strictEqual(firstSpan.name, `${subName} modack`); + assert.strictEqual( + firstSpan.attributes['messaging.destination.name'], + subName, + ); + assert.strictEqual( + firstSpan.attributes[ + 'messaging.gcp_pubsub.message.ack_deadline_seconds' + ], + 1, + ); + assert.strictEqual( + firstSpan.attributes['messaging.gcp_pubsub.is_receipt_modack'], + true, + ); + assert.strictEqual( + firstSpan.attributes['messaging.system'], + 'gcp_pubsub', + ); + }); }); });