diff --git a/packages/opentelemetry-exporter-jaeger/src/jaeger.ts b/packages/opentelemetry-exporter-jaeger/src/jaeger.ts index f7cc5009..e14514e4 100644 --- a/packages/opentelemetry-exporter-jaeger/src/jaeger.ts +++ b/packages/opentelemetry-exporter-jaeger/src/jaeger.ts @@ -23,6 +23,7 @@ import * as jaegerTypes from './types'; import { NoopLogger } from '@opentelemetry/core'; import * as types from '@opentelemetry/types'; import { spanToThrift } from './transform'; +import { unrefTimer } from '@opentelemetry/core'; /** * Format and sends span information to Jaeger Exporter. @@ -33,6 +34,7 @@ export class JaegerExporter implements SpanExporter { private readonly _sender: typeof jaegerTypes.UDPSender; private readonly _forceFlush: boolean = true; private readonly _flushTimeout: number; + private _timer: NodeJS.Timeout; constructor(config: jaegerTypes.ExporterConfig) { this._logger = config.logger || new NoopLogger(); @@ -48,6 +50,10 @@ export class JaegerExporter implements SpanExporter { tags: jaegerTypes.ThriftUtils.getThriftTags(tags), }; this._sender.setProcess(this._process); + + const flushInterval = config.flushInterval || 5000; + this._timer = setInterval(this._flush, flushInterval); + unrefTimer(this._timer); } /** Exports a list of spans to Jaeger. */ @@ -63,11 +69,7 @@ export class JaegerExporter implements SpanExporter { shutdown(): void { if (!this._forceFlush) return; // Make an optimistic flush. - this._sender.flush((numSpans: number, err?: string) => { - if (err) { - this._logger.error(`failed to flush span: ${err}`); - } - }); + this._flush(); // Sleeping x seconds before closing the sender's connection to ensure // all spans are flushed. setTimeout(() => { @@ -95,4 +97,12 @@ export class JaegerExporter implements SpanExporter { this._logger.debug('successful append for : %s', thriftSpan.length); if (done) return done(ExportResult.SUCCESS); } + + private _flush(): void { + this._sender.flush((numSpans: number, err?: string) => { + if (err) { + this._logger.error(`failed to flush ${numSpans} spans: ${err}`); + } + }); + } } diff --git a/packages/opentelemetry-exporter-jaeger/src/types.ts b/packages/opentelemetry-exporter-jaeger/src/types.ts index 89f39bf6..fb2f5896 100644 --- a/packages/opentelemetry-exporter-jaeger/src/types.ts +++ b/packages/opentelemetry-exporter-jaeger/src/types.ts @@ -28,6 +28,7 @@ export interface ExporterConfig { maxPacketSize?: number; // default: 65000 forceFlush?: boolean; // default: true flushTimeout?: number; // default: 2000 + flushInterval?: number; // default(ms): 5000 } // Below require is needed as jaeger-client types does not expose the thrift,