diff --git a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts index fdad1f2ef1..2be9f91fcf 100644 --- a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts +++ b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts @@ -39,6 +39,7 @@ export class ZipkinExporter implements SpanExporter { private readonly _statusCodeTagName: string; private readonly _statusDescriptionTagName: string; private readonly _reqOpts: http.RequestOptions; + private _isShutdown: boolean; constructor(config: zipkinTypes.ExporterConfig) { const urlStr = config.url || ZipkinExporter.DEFAULT_URL; @@ -60,6 +61,7 @@ export class ZipkinExporter implements SpanExporter { this._statusCodeTagName = config.statusCodeTagName || statusCodeTagName; this._statusDescriptionTagName = config.statusDescriptionTagName || statusDescriptionTagName; + this._isShutdown = false; } /** @@ -70,6 +72,10 @@ export class ZipkinExporter implements SpanExporter { resultCallback: (result: ExportResult) => void ) { this._logger.debug('Zipkin exporter export'); + if (this._isShutdown) { + setTimeout(() => resultCallback(ExportResult.FAILED_NOT_RETRYABLE)); + return; + } return this._sendSpans(spans, resultCallback); } @@ -78,6 +84,10 @@ export class ZipkinExporter implements SpanExporter { */ shutdown() { this._logger.debug('Zipkin exporter shutdown'); + if (this._isShutdown) { + return; + } + this._isShutdown = true; // Make an optimistic flush. if (this._forceFlush) { // @todo get spans from span processor (batch) diff --git a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts index dfc1cf08e9..2a09e37230 100644 --- a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts @@ -311,6 +311,20 @@ describe('ZipkinExporter', () => { assert.strictEqual(result, ExportResult.FAILED_RETRYABLE); }); }); + + it('should return FailedNonRetryable after shutdown', done => { + const exporter = new ZipkinExporter({ + serviceName: 'my-service', + logger: new NoopLogger(), + }); + + exporter.shutdown(); + + exporter.export([getReadableSpan()], (result: ExportResult) => { + assert.strictEqual(result, ExportResult.FAILED_NOT_RETRYABLE); + done(); + }); + }); }); describe('shutdown', () => {