/*! * Copyright 2019, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import * as assert from 'assert'; import { JaegerExporter } from '../src'; import { NoopLogger } from '@opentelemetry/core'; import * as types from '@opentelemetry/api'; import { ThriftProcess } from '../src/types'; import { ReadableSpan } from '@opentelemetry/tracing'; import { ExportResult } from '@opentelemetry/base'; describe('JaegerExporter', () => { describe('constructor', () => { it('should construct an exporter', () => { const exporter = new JaegerExporter({ serviceName: 'opentelemetry' }); assert.ok(typeof exporter.export === 'function'); assert.ok(typeof exporter.shutdown === 'function'); const process: ThriftProcess = exporter['_sender']._process; assert.strictEqual(process.serviceName, 'opentelemetry'); assert.strictEqual(process.tags.length, 0); }); it('should construct an exporter with host, port, logger and tags', () => { const exporter = new JaegerExporter({ serviceName: 'opentelemetry', host: 'localhost', port: 8080, logger: new NoopLogger(), tags: [{ key: 'opentelemetry-exporter-jaeger', value: '0.1.0' }], }); assert.ok(typeof exporter.export === 'function'); assert.ok(typeof exporter.shutdown === 'function'); const process: ThriftProcess = exporter['_sender']._process; assert.strictEqual(process.serviceName, 'opentelemetry'); assert.strictEqual(process.tags.length, 1); assert.strictEqual(process.tags[0].key, 'opentelemetry-exporter-jaeger'); assert.strictEqual(process.tags[0].vType, 'STRING'); assert.strictEqual(process.tags[0].vStr, '0.1.0'); }); it('should construct an exporter with forceFlush and flushTimeout', () => { const exporter = new JaegerExporter({ serviceName: 'opentelemetry', forceFlush: true, flushTimeout: 5000, }); assert.ok(typeof exporter.export === 'function'); assert.ok(typeof exporter.shutdown === 'function'); assert.ok(exporter['_forceFlushOnShutdown']); assert.strictEqual(exporter['_onShutdownFlushTimeout'], 5000); }); it('should construct an exporter without forceFlush and flushTimeout', () => { const exporter = new JaegerExporter({ serviceName: 'opentelemetry', }); assert.ok(typeof exporter.export === 'function'); assert.ok(typeof exporter.shutdown === 'function'); assert.ok(exporter['_forceFlushOnShutdown']); assert.strictEqual(exporter['_onShutdownFlushTimeout'], 2000); }); it('should construct an exporter with forceFlush = false', () => { const exporter = new JaegerExporter({ serviceName: 'opentelemetry', forceFlush: false, }); assert.ok(typeof exporter.export === 'function'); assert.ok(typeof exporter.shutdown === 'function'); assert.ok(!exporter['_forceFlushOnShutdown']); }); }); describe('export', () => { let exporter: JaegerExporter; beforeEach(() => { exporter = new JaegerExporter({ serviceName: 'opentelemetry', }); }); afterEach(() => { exporter.shutdown(); }); it('should skip send with empty list', () => { exporter.export([], (result: ExportResult) => { assert.strictEqual(result, ExportResult.SUCCESS); }); }); it('should send spans to Jaeger backend and return with Success', () => { const spanContext = { traceId: 'd4cda95b652f4a1592b449d5929fda1b', spanId: '6e0c63257de34c92', }; const readableSpan: ReadableSpan = { name: 'my-span1', kind: types.SpanKind.CLIENT, spanContext, startTime: [1566156729, 709], endTime: [1566156731, 709], status: { code: types.CanonicalCode.DATA_LOSS, }, attributes: {}, links: [], events: [], duration: [32, 800000000], }; exporter.export([readableSpan], (result: ExportResult) => { assert.strictEqual(result, ExportResult.SUCCESS); }); }); }); });