From 41fd196f5c3176d271e3a1b3b51c04a22d1976fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerhard=20St=C3=B6bich?= <18708370+Flarna@users.noreply.github.com> Date: Tue, 19 Nov 2019 03:23:53 +0100 Subject: [PATCH] fix: zipkin-exporter: don't export after shutdown (#526) * fix: zipkin-exporter: don't export after shutdown According to spec and exporter should return FailedNotRetryable error after shutdown was called. * chore: use setTimeout instead setImmediate for browsers * chore: rename shutdown to isShutdown --- .../opentelemetry-exporter-zipkin/src/zipkin.ts | 10 ++++++++++ .../test/zipkin.test.ts | 14 ++++++++++++++ 2 files changed, 24 insertions(+) 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', () => {