diff --git a/packages/dd-trace/src/format.js b/packages/dd-trace/src/format.js index 3009ab571da..570b5aee301 100644 --- a/packages/dd-trace/src/format.js +++ b/packages/dd-trace/src/format.js @@ -32,13 +32,13 @@ const map = { 'resource.name': 'resource' } -function format (span) { +function format (span, isChunkRoot) { const formatted = formatSpan(span) extractSpanLinks(formatted, span) extractSpanEvents(formatted, span) extractRootTags(formatted, span) - extractChunkTags(formatted, span) + extractChunkTags(formatted, span, isChunkRoot) extractTags(formatted, span) return formatted @@ -192,11 +192,10 @@ function extractRootTags (formattedSpan, span) { addTag({}, formattedSpan.metrics, TOP_LEVEL_KEY, 1) } -function extractChunkTags (formattedSpan, span) { +function extractChunkTags (formattedSpan, span, isChunkRoot) { const context = span.context() - const isLocalRoot = span === context._trace.started[0] - if (!isLocalRoot) return + if (!isChunkRoot) return for (const [key, value] of Object.entries(context._trace.tags)) { addTag(formattedSpan.meta, formattedSpan.metrics, key, value) diff --git a/packages/dd-trace/src/span_processor.js b/packages/dd-trace/src/span_processor.js index 9bcb6410361..6ff50b6abcb 100644 --- a/packages/dd-trace/src/span_processor.js +++ b/packages/dd-trace/src/span_processor.js @@ -47,11 +47,14 @@ class SpanProcessor { this._spanSampler.sample(spanContext) this._gitMetadataTagger.tagGitMetadata(spanContext) + let isChunkRoot = true + for (const span of started) { if (span._duration === undefined) { active.push(span) } else { - const formattedSpan = format(span) + const formattedSpan = format(span, isChunkRoot) + isChunkRoot = false this._stats?.onSpanFinished(formattedSpan) formatted.push(formattedSpan) diff --git a/packages/dd-trace/test/format.spec.js b/packages/dd-trace/test/format.spec.js index e1b3a5517c8..3540238bc15 100644 --- a/packages/dd-trace/test/format.spec.js +++ b/packages/dd-trace/test/format.spec.js @@ -293,7 +293,7 @@ describe('format', () => { count: 1 } - trace = format(span) + trace = format(span, true) expect(trace.meta).to.include({ chunk: 'test' @@ -304,13 +304,29 @@ describe('format', () => { }) }) + it('should not extract trace chunk tags when not chunk root', () => { + spanContext._trace.tags = { + chunk: 'test', + count: 1 + } + + trace = format(span, false) + expect(trace.meta).to.not.include({ + chunk: 'test' + }) + + expect(trace.metrics).to.not.include({ + count: 1 + }) + }) + it('should extract empty tags', () => { spanContext._trace.tags = { foo: '', count: 1 } - trace = format(span) + trace = format(span, true) expect(trace.meta).to.include({ foo: '' diff --git a/packages/dd-trace/test/span_processor.spec.js b/packages/dd-trace/test/span_processor.spec.js index 90ab0530a23..86d16ea894d 100644 --- a/packages/dd-trace/test/span_processor.spec.js +++ b/packages/dd-trace/test/span_processor.spec.js @@ -115,7 +115,7 @@ describe('SpanProcessor', () => { expect(trace).to.have.deep.property('finished', []) }) - it('should configure span sampler conrrectly', () => { + it('should configure span sampler correctly', () => { const config = { stats: { enabled: false }, sampler: { @@ -156,4 +156,17 @@ describe('SpanProcessor', () => { expect(finishedSpan.context()).to.have.deep.property('_tags', {}) expect(exporter.export).not.to.have.been.called }) + + it('should call format every time a partial flush is triggered', () => { + config.flushMinSpans = 1 + const processor = new SpanProcessor(exporter, prioritySampler, config) + trace.started = [activeSpan, finishedSpan] + trace.finished = [finishedSpan] + processor.process(activeSpan) + + expect(trace).to.have.deep.property('started', [activeSpan]) + expect(trace).to.have.deep.property('finished', []) + expect(format.callCount).to.equal(1) + expect(format).to.have.been.calledWith(finishedSpan, true) + }) })