diff --git a/packages/opentelemetry-basic-tracer/src/BasicTracer.ts b/packages/opentelemetry-basic-tracer/src/BasicTracer.ts index afa09ada986..5485ad496e2 100644 --- a/packages/opentelemetry-basic-tracer/src/BasicTracer.ts +++ b/packages/opentelemetry-basic-tracer/src/BasicTracer.ts @@ -96,7 +96,9 @@ export class BasicTracer implements types.Tracer { options.startTime ); // Set default attributes - span.setAttributes(this._defaultAttributes); + span.setAttributes( + Object.assign({}, this._defaultAttributes, options.attributes) + ); return span; } diff --git a/packages/opentelemetry-basic-tracer/test/BasicTracer.test.ts b/packages/opentelemetry-basic-tracer/test/BasicTracer.test.ts index 379f8dda463..e5d41cbb833 100644 --- a/packages/opentelemetry-basic-tracer/test/BasicTracer.test.ts +++ b/packages/opentelemetry-basic-tracer/test/BasicTracer.test.ts @@ -107,6 +107,39 @@ describe('BasicTracer', () => { span.end(); }); + it('should start a span with defaultAttributes and spanoptions->attributes', () => { + const tracer = new BasicTracer({ + scopeManager: new NoopScopeManager(), + defaultAttributes: { foo: 'bar' }, + }); + const span = tracer.startSpan('my-span', { + attributes: { foo: 'foo', bar: 'bar' }, + }) as Span; + assert.deepStrictEqual(span.attributes, { bar: 'bar', foo: 'foo' }); + span.end(); + }); + + it('should start a span with defaultAttributes and undefined spanoptions->attributes', () => { + const tracer = new BasicTracer({ + scopeManager: new NoopScopeManager(), + defaultAttributes: { foo: 'bar' }, + }); + const span = tracer.startSpan('my-span', {}) as Span; + assert.deepStrictEqual(span.attributes, { foo: 'bar' }); + span.end(); + }); + + it('should start a span with spanoptions->attributes', () => { + const tracer = new BasicTracer({ + scopeManager: new NoopScopeManager(), + }); + const span = tracer.startSpan('my-span', { + attributes: { foo: 'foo', bar: 'bar' }, + }) as Span; + assert.deepStrictEqual(span.attributes, { foo: 'foo', bar: 'bar' }); + span.end(); + }); + it('should start a span with name and parent spancontext', () => { const tracer = new BasicTracer({ scopeManager: new NoopScopeManager(), diff --git a/packages/opentelemetry-basic-tracer/test/Span.test.ts b/packages/opentelemetry-basic-tracer/test/Span.test.ts index af09e61ce89..4355b172165 100644 --- a/packages/opentelemetry-basic-tracer/test/Span.test.ts +++ b/packages/opentelemetry-basic-tracer/test/Span.test.ts @@ -24,10 +24,12 @@ import { } from '@opentelemetry/types'; import { BasicTracer } from '../src'; import { NoopScopeManager } from '@opentelemetry/scope-base'; +import { NoopLogger } from '@opentelemetry/core'; describe('Span', () => { const tracer = new BasicTracer({ scopeManager: new NoopScopeManager(), + logger: new NoopLogger(), }); const name = 'span1'; const spanContext: SpanContext = {