Skip to content
Merged
16 changes: 16 additions & 0 deletions packages/opentelemetry-tracing/src/BasicTracerProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,22 @@ export class BasicTracerProvider implements TracerProvider {
}
}

forceFlush(): Promise<void> {
const promises = this._registeredSpanProcessors.map(
(spanProcessor: SpanProcessor) => {
return spanProcessor.forceFlush();
}
);

return Promise.all(promises)
Comment thread
weyert marked this conversation as resolved.
Outdated
.then(() => {
return void 0;
})
.catch(error => {
throw error;
});
}

shutdown() {
return this.activeSpanProcessor.shutdown();
}
Expand Down
50 changes: 50 additions & 0 deletions packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import { Resource } from '@opentelemetry/resources';
import * as assert from 'assert';
import * as sinon from 'sinon';
import { BasicTracerProvider, Span } from '../src';
import { NoopSpanProcessor } from '../src/NoopSpanProcessor';

describe('BasicTracerProvider', () => {
let removeEvent: Function | undefined;
Expand Down Expand Up @@ -392,6 +393,55 @@ describe('BasicTracerProvider', () => {
});
});

describe('.forceFlush()', () => {
it('should call forceFlush on all registered span processors', done => {
const tracerProvider = new BasicTracerProvider();
const spanProcessorOne = new NoopSpanProcessor();
const spyOne = sinon.spy(spanProcessorOne, 'forceFlush');
const spanProcessorTwo = new NoopSpanProcessor();
const spyTwo = sinon.spy(spanProcessorTwo, 'forceFlush');

tracerProvider.addSpanProcessor(spanProcessorOne);
tracerProvider.addSpanProcessor(spanProcessorTwo);

tracerProvider
.forceFlush()
.then(() => {
assert(spyOne.calledOnce);
assert(spyTwo.calledOnce);
done();
})
.catch(error => {
done(error);
});
});

it('should throw error when calling forceFlush on all registered span processors fails', done => {
const forceFlushStub = sinon.stub(
NoopSpanProcessor.prototype,
'forceFlush'
);
forceFlushStub.returns(Promise.reject('Error'));

const tracerProvider = new BasicTracerProvider();
const spanProcessorOne = new NoopSpanProcessor();
const spanProcessorTwo = new NoopSpanProcessor();
tracerProvider.addSpanProcessor(spanProcessorOne);
tracerProvider.addSpanProcessor(spanProcessorTwo);

tracerProvider
.forceFlush()
.then(() => {
done(new Error('Successful forceFlush not expected'));
})
.catch(_error => {
forceFlushStub.restore();
sinon.assert.calledTwice(forceFlushStub);
done();
});
});
});

describe('.bind()', () => {
it('should bind context with NoopContextManager context manager', done => {
const tracer = new BasicTracerProvider().getTracer('default');
Expand Down