From 60132b9e31cd5980eebd84ba42ddb8e4ff0daa23 Mon Sep 17 00:00:00 2001 From: Valentin Marchaud Date: Mon, 20 Apr 2020 19:16:52 +0200 Subject: [PATCH 01/27] feat(aggregators): implement histogram aggregator #927 (#930) * chore(metrics): move each aggregator in its own file * feat(aggregators): implement histogram aggregator #927 * chore: address PR comments * chore: fix ConsoleMetricExporter * chore: address mayur comments * chore: add documentation on internal structure --- .../src/export/Batcher.ts | 2 +- .../src/export/ConsoleMetricExporter.ts | 47 +++--- .../src/export/aggregators/countersum.ts | 37 ++++ .../src/export/aggregators/histogram.ts | 81 +++++++++ .../src/export/aggregators/index.ts | 20 +++ .../measureexact.ts} | 39 +---- .../src/export/aggregators/observer.ts | 37 ++++ .../opentelemetry-metrics/src/export/types.ts | 29 +++- packages/opentelemetry-metrics/src/index.ts | 3 +- .../opentelemetry-metrics/test/Meter.test.ts | 2 +- .../test/export/aggregators/histogram.test.ts | 158 ++++++++++++++++++ 11 files changed, 387 insertions(+), 68 deletions(-) create mode 100644 packages/opentelemetry-metrics/src/export/aggregators/countersum.ts create mode 100644 packages/opentelemetry-metrics/src/export/aggregators/histogram.ts create mode 100644 packages/opentelemetry-metrics/src/export/aggregators/index.ts rename packages/opentelemetry-metrics/src/export/{Aggregator.ts => aggregators/measureexact.ts} (61%) create mode 100644 packages/opentelemetry-metrics/src/export/aggregators/observer.ts create mode 100644 packages/opentelemetry-metrics/test/export/aggregators/histogram.test.ts diff --git a/packages/opentelemetry-metrics/src/export/Batcher.ts b/packages/opentelemetry-metrics/src/export/Batcher.ts index 7caec738381..2e09a3a0f59 100644 --- a/packages/opentelemetry-metrics/src/export/Batcher.ts +++ b/packages/opentelemetry-metrics/src/export/Batcher.ts @@ -18,7 +18,7 @@ import { CounterSumAggregator, MeasureExactAggregator, ObserverAggregator, -} from './Aggregator'; +} from './aggregators'; import { MetricRecord, MetricKind, Aggregator } from './types'; /** diff --git a/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts b/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts index 78e5efc069f..0440f895814 100644 --- a/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts +++ b/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts @@ -14,13 +14,7 @@ * limitations under the License. */ -import { - MetricExporter, - MetricRecord, - MetricKind, - Sum, - Distribution, -} from './types'; +import { MetricExporter, MetricRecord, Distribution, Histogram } from './types'; import { ExportResult } from '@opentelemetry/base'; /** @@ -35,25 +29,26 @@ export class ConsoleMetricExporter implements MetricExporter { for (const metric of metrics) { console.log(metric.descriptor); console.log(metric.labels); - switch (metric.descriptor.metricKind) { - case MetricKind.COUNTER: - const sum = metric.aggregator.toPoint().value as Sum; - console.log('value: ' + sum); - break; - default: - const distribution = metric.aggregator.toPoint() - .value as Distribution; - console.log( - 'min: ' + - distribution.min + - ', max: ' + - distribution.max + - ', count: ' + - distribution.count + - ', sum: ' + - distribution.sum - ); - break; + const point = metric.aggregator.toPoint(); + if (typeof point.value === 'number') { + console.log('value: ' + point.value); + } else if (typeof (point.value as Histogram).buckets === 'object') { + const histogram = point.value as Histogram; + console.log( + `count: ${histogram.count}, sum: ${histogram.sum}, buckets: ${histogram.buckets}` + ); + } else { + const distribution = point.value as Distribution; + console.log( + 'min: ' + + distribution.min + + ', max: ' + + distribution.max + + ', count: ' + + distribution.count + + ', sum: ' + + distribution.sum + ); } } return resultCallback(ExportResult.SUCCESS); diff --git a/packages/opentelemetry-metrics/src/export/aggregators/countersum.ts b/packages/opentelemetry-metrics/src/export/aggregators/countersum.ts new file mode 100644 index 00000000000..6b1fdc1ee98 --- /dev/null +++ b/packages/opentelemetry-metrics/src/export/aggregators/countersum.ts @@ -0,0 +1,37 @@ +/*! + * Copyright 2020, 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 { Aggregator, Point } from '../types'; +import { HrTime } from '@opentelemetry/api'; +import { hrTime } from '@opentelemetry/core'; + +/** Basic aggregator which calculates a Sum from individual measurements. */ +export class CounterSumAggregator implements Aggregator { + private _current: number = 0; + private _lastUpdateTime: HrTime = [0, 0]; + + update(value: number): void { + this._current += value; + this._lastUpdateTime = hrTime(); + } + + toPoint(): Point { + return { + value: this._current, + timestamp: this._lastUpdateTime, + }; + } +} diff --git a/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts b/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts new file mode 100644 index 00000000000..beae9090b9b --- /dev/null +++ b/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts @@ -0,0 +1,81 @@ +/*! + * Copyright 2020, 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 { Aggregator, Point, Histogram } from '../types'; +import { HrTime } from '@opentelemetry/api'; +import { hrTime } from '@opentelemetry/core'; + +/** + * Basic aggregator which observes events and counts them in pre-defined buckets + * and provides the total sum and count of all observations. + */ +export class HistogramAggregator implements Aggregator { + private _lastCheckpoint: Histogram; + private _currentCheckpoint: Histogram; + private _lastCheckpointTime: HrTime; + private readonly _boundaries: number[]; + + constructor(boundaries: number[]) { + if (boundaries === undefined || boundaries.length === 0) { + throw new Error(`HistogramAggregator should be created with boundaries.`); + } + // we need to an ordered set to be able to correctly compute count for each + // boundary since we'll iterate on each in order. + this._boundaries = boundaries.sort(); + this._lastCheckpoint = this._newEmptyCheckpoint(); + this._lastCheckpointTime = hrTime(); + this._currentCheckpoint = this._newEmptyCheckpoint(); + } + + update(value: number): void { + this._currentCheckpoint.count += 1; + this._currentCheckpoint.sum += value; + + for (let i = 0; i < this._boundaries.length; i++) { + if (value < this._boundaries[i]) { + this._currentCheckpoint.buckets.counts[i] += 1; + return; + } + } + + // value is above all observed boundaries + this._currentCheckpoint.buckets.counts[this._boundaries.length] += 1; + } + + reset(): void { + this._lastCheckpointTime = hrTime(); + this._lastCheckpoint = this._currentCheckpoint; + this._currentCheckpoint = this._newEmptyCheckpoint(); + } + + toPoint(): Point { + return { + value: this._lastCheckpoint, + timestamp: this._lastCheckpointTime, + }; + } + + private _newEmptyCheckpoint(): Histogram { + return { + buckets: { + boundaries: this._boundaries, + counts: this._boundaries.map(() => 0).concat([0]), + }, + sum: 0, + count: 0, + }; + } +} diff --git a/packages/opentelemetry-metrics/src/export/aggregators/index.ts b/packages/opentelemetry-metrics/src/export/aggregators/index.ts new file mode 100644 index 00000000000..938e1ad6e38 --- /dev/null +++ b/packages/opentelemetry-metrics/src/export/aggregators/index.ts @@ -0,0 +1,20 @@ +/*! + * Copyright 2020, 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. + */ + +export * from './countersum'; +export * from './observer'; +export * from './measureexact'; +export * from './histogram'; diff --git a/packages/opentelemetry-metrics/src/export/Aggregator.ts b/packages/opentelemetry-metrics/src/export/aggregators/measureexact.ts similarity index 61% rename from packages/opentelemetry-metrics/src/export/Aggregator.ts rename to packages/opentelemetry-metrics/src/export/aggregators/measureexact.ts index d8bd4373b9d..abbad0b4306 100644 --- a/packages/opentelemetry-metrics/src/export/Aggregator.ts +++ b/packages/opentelemetry-metrics/src/export/aggregators/measureexact.ts @@ -14,45 +14,10 @@ * limitations under the License. */ -import { Aggregator, Distribution, Point } from './types'; +import { Aggregator, Point } from '../types'; import { HrTime } from '@opentelemetry/api'; import { hrTime } from '@opentelemetry/core'; - -/** Basic aggregator which calculates a Sum from individual measurements. */ -export class CounterSumAggregator implements Aggregator { - private _current: number = 0; - private _lastUpdateTime: HrTime = [0, 0]; - - update(value: number): void { - this._current += value; - this._lastUpdateTime = hrTime(); - } - - toPoint(): Point { - return { - value: this._current, - timestamp: this._lastUpdateTime, - }; - } -} - -/** Basic aggregator for Observer which keeps the last recorded value. */ -export class ObserverAggregator implements Aggregator { - private _current: number = 0; - private _lastUpdateTime: HrTime = [0, 0]; - - update(value: number): void { - this._current = value; - this._lastUpdateTime = hrTime(); - } - - toPoint(): Point { - return { - value: this._current, - timestamp: this._lastUpdateTime, - }; - } -} +import { Distribution } from '../types'; /** Basic aggregator keeping all raw values (events, sum, max and min). */ export class MeasureExactAggregator implements Aggregator { diff --git a/packages/opentelemetry-metrics/src/export/aggregators/observer.ts b/packages/opentelemetry-metrics/src/export/aggregators/observer.ts new file mode 100644 index 00000000000..d1ba176c30f --- /dev/null +++ b/packages/opentelemetry-metrics/src/export/aggregators/observer.ts @@ -0,0 +1,37 @@ +/*! + * Copyright 2020, 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 { Aggregator, Point } from '../types'; +import { HrTime } from '@opentelemetry/api'; +import { hrTime } from '@opentelemetry/core'; + +/** Basic aggregator for Observer which keeps the last recorded value. */ +export class ObserverAggregator implements Aggregator { + private _current: number = 0; + private _lastUpdateTime: HrTime = [0, 0]; + + update(value: number): void { + this._current = value; + this._lastUpdateTime = hrTime(); + } + + toPoint(): Point { + return { + value: this._current, + timestamp: this._lastUpdateTime, + }; + } +} diff --git a/packages/opentelemetry-metrics/src/export/types.ts b/packages/opentelemetry-metrics/src/export/types.ts index ff4f1173eb0..40b631e0269 100644 --- a/packages/opentelemetry-metrics/src/export/types.ts +++ b/packages/opentelemetry-metrics/src/export/types.ts @@ -37,6 +37,33 @@ export interface Distribution { sum: number; } +export interface Histogram { + /** + * Buckets are implemented using two different array: + * - boundaries contains every boundary (which are upper boundary for each slice) + * - counts contains count of event for each slice + * + * Note that we'll always have n+1 (where n is the number of boundaries) slice + * because we need to count event that are above the highest boundary. This is the + * reason why it's not implement using array of object, because the last slice + * dont have any boundary. + * + * Example if we measure the values: [5, 30, 5, 40, 5, 15, 15, 15, 25] + * with the boundaries [ 10, 20, 30 ], we will have the following state: + * + * buckets: { + * boundaries: [10, 20, 30], + * counts: [3, 3, 2, 1], + * } + */ + buckets: { + boundaries: number[]; + counts: number[]; + }; + sum: number; + count: number; +} + export interface MetricRecord { readonly descriptor: MetricDescriptor; readonly labels: Labels; @@ -80,6 +107,6 @@ export interface Aggregator { } export interface Point { - value: Sum | LastValue | Distribution; + value: Sum | LastValue | Distribution | Histogram; timestamp: HrTime; } diff --git a/packages/opentelemetry-metrics/src/index.ts b/packages/opentelemetry-metrics/src/index.ts index c9f158528f1..113f788dd9d 100644 --- a/packages/opentelemetry-metrics/src/index.ts +++ b/packages/opentelemetry-metrics/src/index.ts @@ -18,7 +18,6 @@ export * from './BoundInstrument'; export * from './Meter'; export * from './Metric'; export * from './MeterProvider'; -export * from './export/Aggregator'; +export * from './export/aggregators'; export * from './export/ConsoleMetricExporter'; export * from './export/types'; -export * from './export/Aggregator'; diff --git a/packages/opentelemetry-metrics/test/Meter.test.ts b/packages/opentelemetry-metrics/test/Meter.test.ts index dd028bec585..0eaab7410db 100644 --- a/packages/opentelemetry-metrics/test/Meter.test.ts +++ b/packages/opentelemetry-metrics/test/Meter.test.ts @@ -33,7 +33,7 @@ import { NoopLogger, hrTime, hrTimeToNanoseconds } from '@opentelemetry/core'; import { CounterSumAggregator, ObserverAggregator, -} from '../src/export/Aggregator'; +} from '../src/export/aggregators'; import { ValueType } from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import { hashLabels } from '../src/Utils'; diff --git a/packages/opentelemetry-metrics/test/export/aggregators/histogram.test.ts b/packages/opentelemetry-metrics/test/export/aggregators/histogram.test.ts new file mode 100644 index 00000000000..efb1c6519af --- /dev/null +++ b/packages/opentelemetry-metrics/test/export/aggregators/histogram.test.ts @@ -0,0 +1,158 @@ +/*! + * 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 { HistogramAggregator } from '../../../src/export/aggregators'; +import { Histogram } from '../../../src'; + +describe('HistogramAggregator', () => { + describe('constructor()', () => { + it('should construct a histogramAggregator', () => { + assert.doesNotThrow(() => { + new HistogramAggregator([1, 2]); + }); + }); + + it('should sort boundaries', () => { + const aggregator = new HistogramAggregator([500, 300, 700]); + const point = aggregator.toPoint().value as Histogram; + assert.deepEqual(point.buckets.boundaries, [300, 500, 700]); + }); + + it('should throw if no boundaries are defined', () => { + // @ts-ignore + assert.throws(() => new HistogramAggregator()); + assert.throws(() => new HistogramAggregator([])); + }); + }); + + describe('.update()', () => { + it('should not update checkpoint', () => { + const aggregator = new HistogramAggregator([100, 200]); + aggregator.update(150); + const point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, 0); + assert.equal(point.sum, 0); + }); + + it('should update the second bucket', () => { + const aggregator = new HistogramAggregator([100, 200]); + aggregator.update(150); + aggregator.reset(); + const point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, 1); + assert.equal(point.sum, 150); + assert.equal(point.buckets.counts[0], 0); + assert.equal(point.buckets.counts[1], 1); + assert.equal(point.buckets.counts[2], 0); + }); + + it('should update the second bucket', () => { + const aggregator = new HistogramAggregator([100, 200]); + aggregator.update(50); + aggregator.reset(); + const point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, 1); + assert.equal(point.sum, 50); + assert.equal(point.buckets.counts[0], 1); + assert.equal(point.buckets.counts[1], 0); + assert.equal(point.buckets.counts[2], 0); + }); + + it('should update the third bucket since value is above all boundaries', () => { + const aggregator = new HistogramAggregator([100, 200]); + aggregator.update(250); + aggregator.reset(); + const point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, 1); + assert.equal(point.sum, 250); + assert.equal(point.buckets.counts[0], 0); + assert.equal(point.buckets.counts[1], 0); + assert.equal(point.buckets.counts[2], 1); + }); + }); + + describe('.count', () => { + it('should return last checkpoint count', () => { + const aggregator = new HistogramAggregator([100]); + let point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, point.count); + aggregator.update(10); + aggregator.reset(); + point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, 1); + assert.equal(point.count, point.count); + }); + }); + + describe('.sum', () => { + it('should return last checkpoint sum', () => { + const aggregator = new HistogramAggregator([100]); + let point = aggregator.toPoint().value as Histogram; + assert.equal(point.sum, point.sum); + aggregator.update(10); + aggregator.reset(); + point = aggregator.toPoint().value as Histogram; + assert.equal(point.sum, 10); + }); + }); + + describe('.reset()', () => { + it('should create a empty checkoint by default', () => { + const aggregator = new HistogramAggregator([100]); + const point = aggregator.toPoint().value as Histogram; + assert.deepEqual(point.buckets.boundaries, [100]); + assert(point.buckets.counts.every(count => count === 0)); + // should contains one bucket for each boundary + one for values outside of the largest boundary + assert.equal(point.buckets.counts.length, 2); + assert.deepEqual(point.buckets.boundaries, [100]); + assert.equal(point.count, 0); + assert.equal(point.sum, 0); + }); + + it('should update checkpoint', () => { + const aggregator = new HistogramAggregator([100]); + aggregator.update(10); + aggregator.reset(); + const point = aggregator.toPoint().value as Histogram; + assert.equal(point.count, 1); + assert.equal(point.sum, 10); + assert.deepEqual(point.buckets.boundaries, [100]); + assert.equal(point.buckets.counts.length, 2); + assert.deepEqual(point.buckets.counts, [1, 0]); + }); + }); + + describe('.toPoint()', () => { + it('should return default checkpoint', () => { + const aggregator = new HistogramAggregator([100]); + const point = aggregator.toPoint().value as Histogram; + assert.deepEqual(aggregator.toPoint().value, point); + assert(aggregator.toPoint().timestamp.every(nbr => nbr > 0)); + }); + + it('should return last checkpoint if updated', () => { + const aggregator = new HistogramAggregator([100]); + aggregator.update(100); + aggregator.reset(); + assert( + aggregator + .toPoint() + .timestamp.every(nbr => typeof nbr === 'number' && nbr !== 0) + ); + }); + }); +}); From 998f3f6d7d0098f5a6c4e56c5c1369a3e8ed4dec Mon Sep 17 00:00:00 2001 From: Bartlomiej Obecny Date: Wed, 22 Apr 2020 21:58:30 +0200 Subject: [PATCH 02/27] =?UTF-8?q?chore:=20adding=20metric=20observable=20t?= =?UTF-8?q?o=20be=20able=20to=20support=20async=20upda=E2=80=A6=20(#964)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: adding metric observable to be able to support async update * chore: reviews * chore: reviews Co-authored-by: Daniel Dyla --- examples/metrics/metrics/observer.js | 11 +++- examples/metrics/metrics/observer.png | Bin 380688 -> 228233 bytes packages/opentelemetry-api/src/index.ts | 1 + .../src/metrics/MetricObservable.ts | 36 +++++++++++++ .../src/metrics/ObserverResult.ts | 4 +- .../package.json | 2 +- packages/opentelemetry-metrics/README.md | 39 +++++++++++++- packages/opentelemetry-metrics/src/Metric.ts | 42 ++++++++------- .../src/MetricObservable.ts | 51 ++++++++++++++++++ .../src/ObserverResult.ts | 16 ++++-- packages/opentelemetry-metrics/src/index.ts | 3 +- .../opentelemetry-metrics/test/Meter.test.ts | 20 +++++-- 12 files changed, 191 insertions(+), 34 deletions(-) create mode 100644 packages/opentelemetry-api/src/metrics/MetricObservable.ts create mode 100644 packages/opentelemetry-metrics/src/MetricObservable.ts diff --git a/examples/metrics/metrics/observer.js b/examples/metrics/metrics/observer.js index bb398bb95aa..6cced2142c2 100644 --- a/examples/metrics/metrics/observer.js +++ b/examples/metrics/metrics/observer.js @@ -1,6 +1,6 @@ 'use strict'; -const { MeterProvider } = require('@opentelemetry/metrics'); +const { MeterProvider, MetricObservable } = require('@opentelemetry/metrics'); const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); const exporter = new PrometheusExporter( @@ -14,7 +14,7 @@ const exporter = new PrometheusExporter( const meter = new MeterProvider({ exporter, - interval: 1000, + interval: 2000, }).getMeter('example-observer'); const otelCpuUsage = meter.createObserver('metric_observer', { @@ -27,9 +27,16 @@ function getCpuUsage() { return Math.random(); } +const observable = new MetricObservable(); + +setInterval(() => { + observable.next(getCpuUsage()); +}, 5000); + otelCpuUsage.setCallback((observerResult) => { observerResult.observe(getCpuUsage, { pid: process.pid, core: '1' }); observerResult.observe(getCpuUsage, { pid: process.pid, core: '2' }); observerResult.observe(getCpuUsage, { pid: process.pid, core: '3' }); observerResult.observe(getCpuUsage, { pid: process.pid, core: '4' }); + observerResult.observe(observable, { pid: process.pid, core: '5' }); }); diff --git a/examples/metrics/metrics/observer.png b/examples/metrics/metrics/observer.png index 7a9184af13f88701ffde851622d13e627a223bde..79f77b0c1c365fad32f55fac794f76543568f2cd 100644 GIT binary patch literal 228233 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

w&AF+zzM@wsb!N1=BJ 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%0AdZNH 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

`9u8 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/$Z6%s`j4{C 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±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 M^-Qq^#~iNy2k$g0m;e9( diff --git a/packages/opentelemetry-api/src/index.ts b/packages/opentelemetry-api/src/index.ts index 070ed01c052..a4a7406e716 100644 --- a/packages/opentelemetry-api/src/index.ts +++ b/packages/opentelemetry-api/src/index.ts @@ -26,6 +26,7 @@ export * from './metrics/BoundInstrument'; export * from './metrics/Meter'; export * from './metrics/MeterProvider'; export * from './metrics/Metric'; +export * from './metrics/MetricObservable'; export * from './metrics/NoopMeter'; export * from './metrics/NoopMeterProvider'; export * from './metrics/ObserverResult'; diff --git a/packages/opentelemetry-api/src/metrics/MetricObservable.ts b/packages/opentelemetry-api/src/metrics/MetricObservable.ts new file mode 100644 index 00000000000..4e25dce4e57 --- /dev/null +++ b/packages/opentelemetry-api/src/metrics/MetricObservable.ts @@ -0,0 +1,36 @@ +/*! + * Copyright 2020, 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. + */ + +/** + * Metric Observable class to handle asynchronous metrics + */ +export interface MetricObservable { + /** + * Sets the next value for observable metric + * @param value + */ + next: (value: number) => void; + /** + * Subscribes for every value change + * @param callback + */ + subscribe: (callback: (value: number) => void) => void; + /** + * Removes the subscriber + * @param [callback] + */ + unsubscribe: (callback?: (value: number) => void) => void; +} diff --git a/packages/opentelemetry-api/src/metrics/ObserverResult.ts b/packages/opentelemetry-api/src/metrics/ObserverResult.ts index 6fb4edba70f..47c3d595c43 100644 --- a/packages/opentelemetry-api/src/metrics/ObserverResult.ts +++ b/packages/opentelemetry-api/src/metrics/ObserverResult.ts @@ -15,11 +15,11 @@ */ import { Labels } from './Metric'; +import { MetricObservable } from './MetricObservable'; /** * Interface that is being used in function setCallback for Observer Metric */ export interface ObserverResult { - observers: Map; - observe(callback: Function, labels: Labels): void; + observe(callback: Function | MetricObservable, labels: Labels): void; } diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index 5b1e97497d2..b6f7cb3e175 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -77,7 +77,7 @@ "ts-node": "^8.6.2", "tslint-consistent-codestyle": "^1.16.0", "tslint-microsoft-contrib": "^6.2.0", - "typescript": "3.6.4", + "typescript": "3.7.2", "webpack": "^4.35.2", "webpack-cli": "^3.3.9", "webpack-merge": "^4.2.2" diff --git a/packages/opentelemetry-metrics/README.md b/packages/opentelemetry-metrics/README.md index eb516f6948d..1de26eab567 100644 --- a/packages/opentelemetry-metrics/README.md +++ b/packages/opentelemetry-metrics/README.md @@ -25,8 +25,8 @@ const { MeterProvider } = require('@opentelemetry/metrics'); const meter = new MeterProvider().getMeter('your-meter-name'); const counter = meter.createCounter('metric_name', { - labelKeys: ["pid"], - description: "Example of a counter" + labelKeys: ['pid'], + description: 'Example of a counter' }); const labels = { pid: process.pid }; @@ -34,6 +34,41 @@ const labels = { pid: process.pid }; // Create a BoundInstrument associated with specified label values. const boundCounter = counter.bind(labels); boundCounter.add(10); + +``` + +### Observable +Choose this kind of metric when only last value is important without worry about aggregation + +```js +const { MeterProvider, MetricObservable } = require('@opentelemetry/metrics'); + +// Initialize the Meter to capture measurements in various ways. +const meter = new MeterProvider().getMeter('your-meter-name'); + +const observer = meter.createObserver('metric_name', { + labelKeys: ['pid', 'core'], + description: 'Example of a observer' +}); + +function getCpuUsage() { + return Math.random(); +} + +const metricObservable = new MetricObservable(); + +observer.setCallback((observerResult) => { + // synchronous callback + observerResult.observe(getCpuUsage, { pid: process.pid, core: '1' }); + // asynchronous callback + observerResult.observe(metricObservable, { pid: process.pid, core: '2' }); +}); + +// simulate asynchronous operation +setInterval(()=> { + metricObservable.next(getCpuUsage()); +}, 2000) + ``` See [examples/prometheus](https://github.com/open-telemetry/opentelemetry-js/tree/master/examples/prometheus) for a short example. diff --git a/packages/opentelemetry-metrics/src/Metric.ts b/packages/opentelemetry-metrics/src/Metric.ts index 6d81b4e2f2f..cd666a210e1 100644 --- a/packages/opentelemetry-metrics/src/Metric.ts +++ b/packages/opentelemetry-metrics/src/Metric.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import { BoundCounter, @@ -30,11 +30,11 @@ import { hashLabels } from './Utils'; /** This is a SDK implementation of {@link Metric} interface. */ export abstract class Metric - implements types.Metric { + implements api.Metric { protected readonly _monotonic: boolean; protected readonly _disabled: boolean; - protected readonly _valueType: types.ValueType; - protected readonly _logger: types.Logger; + protected readonly _valueType: api.ValueType; + protected readonly _logger: api.Logger; private readonly _descriptor: MetricDescriptor; private readonly _instruments: Map = new Map(); @@ -58,7 +58,7 @@ export abstract class Metric * @param labels key-values pairs that are associated with a specific metric * that you want to record. */ - bind(labels: types.Labels): T { + bind(labels: api.Labels): T { const hash = hashLabels(labels); if (this._instruments.has(hash)) return this._instruments.get(hash)!; @@ -71,7 +71,7 @@ export abstract class Metric * Removes the Instrument from the metric, if it is present. * @param labels key-values pairs that are associated with a specific metric. */ - unbind(labels: types.Labels): void { + unbind(labels: api.Labels): void { this._instruments.delete(hashLabels(labels)); } @@ -102,12 +102,12 @@ export abstract class Metric }; } - protected abstract _makeInstrument(labels: types.Labels): T; + protected abstract _makeInstrument(labels: api.Labels): T; } /** This is a SDK implementation of Counter Metric. */ export class CounterMetric extends Metric - implements Pick { + implements Pick { constructor( name: string, options: MetricOptions, @@ -116,7 +116,7 @@ export class CounterMetric extends Metric ) { super(name, options, MetricKind.COUNTER, resource); } - protected _makeInstrument(labels: types.Labels): BoundCounter { + protected _makeInstrument(labels: api.Labels): BoundCounter { return new BoundCounter( labels, this._disabled, @@ -134,13 +134,13 @@ export class CounterMetric extends Metric * @param labels key-values pairs that are associated with a specific metric * that you want to record. */ - add(value: number, labels: types.Labels) { + add(value: number, labels: api.Labels) { this.bind(labels).add(value); } } export class MeasureMetric extends Metric - implements Pick { + implements Pick { protected readonly _absolute: boolean; constructor( @@ -153,7 +153,7 @@ export class MeasureMetric extends Metric this._absolute = options.absolute !== undefined ? options.absolute : true; // Absolute default is true } - protected _makeInstrument(labels: types.Labels): BoundMeasure { + protected _makeInstrument(labels: api.Labels): BoundMeasure { return new BoundMeasure( labels, this._disabled, @@ -165,15 +165,15 @@ export class MeasureMetric extends Metric ); } - record(value: number, labels: types.Labels) { + record(value: number, labels: api.Labels) { this.bind(labels).record(value); } } /** This is a SDK implementation of Observer Metric. */ export class ObserverMetric extends Metric - implements Pick { - private _observerResult: types.ObserverResult = new ObserverResult(); + implements Pick { + private _observerResult = new ObserverResult(); constructor( name: string, @@ -184,7 +184,7 @@ export class ObserverMetric extends Metric super(name, options, MetricKind.OBSERVER, resource); } - protected _makeInstrument(labels: types.Labels): BoundObserver { + protected _makeInstrument(labels: api.Labels): BoundObserver { return new BoundObserver( labels, this._disabled, @@ -196,7 +196,7 @@ export class ObserverMetric extends Metric } getMetricRecord(): MetricRecord[] { - this._observerResult.observers.forEach((callback, labels) => { + this._observerResult.callbackObservers.forEach((callback, labels) => { const instrument = this.bind(labels); instrument.update(callback()); }); @@ -207,7 +207,13 @@ export class ObserverMetric extends Metric * Sets a callback where user can observe value for certain labels * @param callback */ - setCallback(callback: (observerResult: types.ObserverResult) => void): void { + setCallback(callback: (observerResult: api.ObserverResult) => void): void { callback(this._observerResult); + this._observerResult.observers.forEach((observer, labels) => { + observer.subscribe(value => { + const instrument = this.bind(labels); + instrument.update(value); + }); + }); } } diff --git a/packages/opentelemetry-metrics/src/MetricObservable.ts b/packages/opentelemetry-metrics/src/MetricObservable.ts new file mode 100644 index 00000000000..cd52774743c --- /dev/null +++ b/packages/opentelemetry-metrics/src/MetricObservable.ts @@ -0,0 +1,51 @@ +/*! + * Copyright 2020, 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 api from '@opentelemetry/api'; + +type Subscriber = (value?: number) => void; + +/** + * Implements the Metric Observable pattern + */ +export class MetricObservable implements api.MetricObservable { + private _subscribers: Subscriber[] = []; + + next(value: number) { + for (const subscriber of this._subscribers) { + subscriber(value); + } + } + + subscribe(subscriber: Function) { + if (typeof subscriber === 'function') { + this._subscribers.push(subscriber as Subscriber); + } + } + + unsubscribe(subscriber?: Function) { + if (typeof subscriber === 'function') { + for (let i = 0, j = this._subscribers.length; i < j; i++) { + if (this._subscribers[i] === subscriber) { + this._subscribers.splice(i, 1); + break; + } + } + } else { + this._subscribers = []; + } + } +} diff --git a/packages/opentelemetry-metrics/src/ObserverResult.ts b/packages/opentelemetry-metrics/src/ObserverResult.ts index 1cb9ecebd44..2ed593351d8 100644 --- a/packages/opentelemetry-metrics/src/ObserverResult.ts +++ b/packages/opentelemetry-metrics/src/ObserverResult.ts @@ -15,6 +15,7 @@ */ import { + MetricObservable, ObserverResult as TypeObserverResult, Labels, } from '@opentelemetry/api'; @@ -23,8 +24,17 @@ import { * Implementation of {@link TypeObserverResult} */ export class ObserverResult implements TypeObserverResult { - observers = new Map(); - observe(callback: any, labels: Labels): void { - this.observers.set(labels, callback); + callbackObservers: Map = new Map(); + observers: Map = new Map< + Labels, + MetricObservable + >(); + + observe(callback: Function | MetricObservable, labels: Labels): void { + if (typeof callback === 'function') { + this.callbackObservers.set(labels, callback); + } else { + this.observers.set(labels, callback); + } } } diff --git a/packages/opentelemetry-metrics/src/index.ts b/packages/opentelemetry-metrics/src/index.ts index 113f788dd9d..6cb01ff9a88 100644 --- a/packages/opentelemetry-metrics/src/index.ts +++ b/packages/opentelemetry-metrics/src/index.ts @@ -16,8 +16,9 @@ export * from './BoundInstrument'; export * from './Meter'; -export * from './Metric'; export * from './MeterProvider'; +export * from './Metric'; +export * from './MetricObservable'; export * from './export/aggregators'; export * from './export/ConsoleMetricExporter'; export * from './export/types'; diff --git a/packages/opentelemetry-metrics/test/Meter.test.ts b/packages/opentelemetry-metrics/test/Meter.test.ts index 0eaab7410db..7de77a69848 100644 --- a/packages/opentelemetry-metrics/test/Meter.test.ts +++ b/packages/opentelemetry-metrics/test/Meter.test.ts @@ -27,6 +27,7 @@ import { ObserverMetric, MetricRecord, Aggregator, + MetricObservable, } from '../src'; import * as types from '@opentelemetry/api'; import { NoopLogger, hrTime, hrTimeToNanoseconds } from '@opentelemetry/core'; @@ -440,6 +441,7 @@ describe('Meter', () => { }) as ObserverMetric; assert.ok(measure instanceof Metric); }); + it('should set callback and observe value ', () => { const measure = meter.createObserver('name', { description: 'desc', @@ -450,21 +452,28 @@ describe('Meter', () => { return Math.random(); } + const metricObservable = new MetricObservable(); + measure.setCallback((observerResult: types.ObserverResult) => { observerResult.observe(getCpuUsage, { pid: '123', core: '1' }); observerResult.observe(getCpuUsage, { pid: '123', core: '2' }); observerResult.observe(getCpuUsage, { pid: '123', core: '3' }); observerResult.observe(getCpuUsage, { pid: '123', core: '4' }); + observerResult.observe(metricObservable, { pid: '123', core: '5' }); }); + metricObservable.next(0.123); + const metricRecords: MetricRecord[] = measure.getMetricRecord(); - assert.strictEqual(metricRecords.length, 4); + assert.strictEqual(metricRecords.length, 5); - const metric1 = metricRecords[0]; - const metric2 = metricRecords[1]; - const metric3 = metricRecords[2]; - const metric4 = metricRecords[3]; + const metric5 = metricRecords[0]; + assert.strictEqual(hashLabels(metric5.labels), '|#core:5,pid:123'); + const metric1 = metricRecords[1]; + const metric2 = metricRecords[2]; + const metric3 = metricRecords[3]; + const metric4 = metricRecords[4]; assert.strictEqual(hashLabels(metric1.labels), '|#core:1,pid:123'); assert.strictEqual(hashLabels(metric2.labels), '|#core:2,pid:123'); assert.strictEqual(hashLabels(metric3.labels), '|#core:3,pid:123'); @@ -474,6 +483,7 @@ describe('Meter', () => { ensureMetric(metric2); ensureMetric(metric3); ensureMetric(metric4); + ensureMetric(metric5); }); it('should return an observer with resource', () => { From 73212b8469f7e47d889cdb6ec1812de7523fa59f Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 23 Apr 2020 15:16:11 -0700 Subject: [PATCH 03/27] fix(B3Propagator): B3 sampled causing gRPC error (#977) * fix(B3Propagator): B3 sampled causing gRPC error * fix: review comment --- .../src/context/propagation/B3Propagator.ts | 8 +++++++- .../opentelemetry-core/test/context/B3Propagator.test.ts | 4 ++-- .../opentelemetry-core/test/context/composite.test.ts | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts index ce68edc3e2f..9a6f38f67d5 100644 --- a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts +++ b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts @@ -57,7 +57,13 @@ export class B3Propagator implements HttpTextPropagator { // We set the header only if there is an existing sampling decision. // Otherwise we will omit it => Absent. if (spanContext.traceFlags !== undefined) { - setter(carrier, X_B3_SAMPLED, Number(spanContext.traceFlags)); + setter( + carrier, + X_B3_SAMPLED, + (TraceFlags.SAMPLED & spanContext.traceFlags) === TraceFlags.SAMPLED + ? '1' + : '0' + ); } } } diff --git a/packages/opentelemetry-core/test/context/B3Propagator.test.ts b/packages/opentelemetry-core/test/context/B3Propagator.test.ts index 1eb6759c16f..f403bc72a08 100644 --- a/packages/opentelemetry-core/test/context/B3Propagator.test.ts +++ b/packages/opentelemetry-core/test/context/B3Propagator.test.ts @@ -60,7 +60,7 @@ describe('B3Propagator', () => { 'd4cda95b652f4a1592b449d5929fda1b' ); assert.deepStrictEqual(carrier[X_B3_SPAN_ID], '6e0c63257de34c92'); - assert.deepStrictEqual(carrier[X_B3_SAMPLED], TraceFlags.SAMPLED); + assert.deepStrictEqual(carrier[X_B3_SAMPLED], '1'); }); it('should set b3 traceId and spanId headers - ignore tracestate', () => { @@ -82,7 +82,7 @@ describe('B3Propagator', () => { 'd4cda95b652f4a1592b449d5929fda1b' ); assert.deepStrictEqual(carrier[X_B3_SPAN_ID], '6e0c63257de34c92'); - assert.deepStrictEqual(carrier[X_B3_SAMPLED], TraceFlags.NONE); + assert.deepStrictEqual(carrier[X_B3_SAMPLED], '0'); }); it('should not inject empty spancontext', () => { diff --git a/packages/opentelemetry-core/test/context/composite.test.ts b/packages/opentelemetry-core/test/context/composite.test.ts index 10a21af1f32..080b8021549 100644 --- a/packages/opentelemetry-core/test/context/composite.test.ts +++ b/packages/opentelemetry-core/test/context/composite.test.ts @@ -80,7 +80,7 @@ describe('Composite Propagator', () => { assert.strictEqual(carrier[X_B3_TRACE_ID], traceId); assert.strictEqual(carrier[X_B3_SPAN_ID], spanId); - assert.strictEqual(carrier[X_B3_SAMPLED], 1); + assert.strictEqual(carrier[X_B3_SAMPLED], '1'); assert.strictEqual( carrier[TRACE_PARENT_HEADER], `00-${traceId}-${spanId}-01` From b28bed47914ca2ba58ec36eaf1af4035bfcd358d Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Fri, 24 Apr 2020 11:09:37 -0700 Subject: [PATCH 04/27] chore: 0.7.0 release proposal (#973) * chore: 0.7.0 release proposal * chore: update CHANGELOG.md * chore: update CHANGELOG --- CHANGELOG.md | 29 +++++++++++++++++++ examples/basic-tracer-node/package.json | 8 ++--- examples/collector-exporter-node/package.json | 8 ++--- examples/grpc/package.json | 14 ++++----- examples/http/package.json | 14 ++++----- examples/https/package.json | 14 ++++----- examples/metrics/package.json | 6 ++-- examples/opentracing-shim/package.json | 12 ++++---- examples/prometheus/package.json | 6 ++-- examples/tracer-web/package.json | 14 ++++----- .../monitored-example/package.json | 2 +- getting-started/traced-example/package.json | 10 +++---- getting-started/ts-example/package.json | 16 +++++----- lerna.json | 2 +- package.json | 2 +- packages/opentelemetry-api/package.json | 4 +-- packages/opentelemetry-api/src/version.ts | 2 +- packages/opentelemetry-base/package.json | 2 +- packages/opentelemetry-base/src/version.ts | 2 +- .../package.json | 4 +-- .../src/version.ts | 2 +- .../opentelemetry-context-base/package.json | 2 +- .../opentelemetry-context-base/src/version.ts | 2 +- .../package.json | 4 +-- .../src/version.ts | 2 +- .../opentelemetry-context-zone/package.json | 4 +-- .../opentelemetry-context-zone/src/version.ts | 2 +- packages/opentelemetry-core/package.json | 6 ++-- packages/opentelemetry-core/src/version.ts | 2 +- .../package.json | 14 ++++----- .../src/version.ts | 2 +- .../package.json | 12 ++++---- .../src/version.ts | 2 +- .../package.json | 10 +++---- .../src/version.ts | 2 +- .../package.json | 12 ++++---- .../src/version.ts | 2 +- packages/opentelemetry-metrics/package.json | 10 +++---- packages/opentelemetry-metrics/src/version.ts | 2 +- packages/opentelemetry-node/package.json | 14 ++++----- packages/opentelemetry-node/src/version.ts | 2 +- .../opentelemetry-plugin-grpc/package.json | 14 ++++----- .../opentelemetry-plugin-grpc/src/version.ts | 2 +- .../opentelemetry-plugin-http/package.json | 14 ++++----- .../opentelemetry-plugin-http/src/version.ts | 2 +- .../opentelemetry-plugin-https/package.json | 16 +++++----- .../opentelemetry-plugin-https/src/version.ts | 2 +- .../package.json | 14 ++++----- .../src/version.ts | 2 +- packages/opentelemetry-resources/package.json | 6 ++-- .../opentelemetry-resources/src/version.ts | 2 +- .../package.json | 8 ++--- .../src/version.ts | 2 +- .../opentelemetry-test-utils/package.json | 8 ++--- packages/opentelemetry-tracing/package.json | 12 ++++---- packages/opentelemetry-tracing/src/version.ts | 2 +- packages/opentelemetry-web/package.json | 14 ++++----- packages/opentelemetry-web/src/version.ts | 2 +- 58 files changed, 216 insertions(+), 187 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51a03889d38..d4efa616c76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file. ## Unreleased +## 0.7.0 + +Released 2020-04-23 + +#### :boom: Breaking Change +* `opentelemetry-exporter-collector` + * [#901](https://github.com/open-telemetry/opentelemetry-js/pull/901) grpc for node and support for new proto format for node and browser ([@obecny](https://github.com/obecny)) +* `opentelemetry-api`, `opentelemetry-metrics` + * [#964](https://github.com/open-telemetry/opentelemetry-js/pull/964) chore: adding metric observable to be able to support async update ([@obecny](https://github.com/obecny)) + +#### :bug: (Bug Fix) +* `opentelemetry-plugin-http` + * [#960](https://github.com/open-telemetry/opentelemetry-js/pull/960) [http] fix: use url.URL ([@naseemkullah](https://github.com/naseemkullah)) +* `opentelemetry-core` + * [#977](https://github.com/open-telemetry/opentelemetry-js/pull/977) fix(B3Propagator): B3 sampled causing gRPC error ([@mayurkale22](https://github.com/mayurkale22)) + +#### :rocket: (Enhancement) +* `opentelemetry-resources` + * [#899](https://github.com/open-telemetry/opentelemetry-js/pull/899) feat: resource auto-detection ([@mwear](https://github.com/mwear)) +* `opentelemetry-metrics` + * [#930](https://github.com/open-telemetry/opentelemetry-js/pull/930) feat(aggregators): implement histogram aggregator ([@vmarchaud](https://github.com/vmarchaud)) + +#### Committers: 5 +- Naseem ([@naseemkullah](https://github.com/naseemkullah)) +- Matthew Wear ([@mwear](https://github.com/mwear)) +- Bartlomiej Obecny ([@obecny](https://github.com/obecny)) +- Mayur Kale ([@mayurkale22](https://github.com/mayurkale22)) +- Valentin Marchaud ([@vmarchaud](https://github.com/vmarchaud)) + ## 0.6.1 Released 2020-04-08 diff --git a/examples/basic-tracer-node/package.json b/examples/basic-tracer-node/package.json index b74da11b077..cb7aadba81b 100644 --- a/examples/basic-tracer-node/package.json +++ b/examples/basic-tracer-node/package.json @@ -1,7 +1,7 @@ { "name": "example-basic-tracer-node", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of using @opentelemetry/tracing in Node.js", "main": "index.js", "scripts": { @@ -24,9 +24,9 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/exporter-jaeger": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/exporter-jaeger": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/collector-exporter-node/package.json b/examples/collector-exporter-node/package.json index 861b5076b44..e69c72ea593 100644 --- a/examples/collector-exporter-node/package.json +++ b/examples/collector-exporter-node/package.json @@ -1,7 +1,7 @@ { "name": "example-collector-exporter-node", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of using @opentelemetry/collector-exporter in Node.js", "main": "index.js", "scripts": { @@ -26,9 +26,9 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/exporter-collector": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/exporter-collector": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/grpc/package.json b/examples/grpc/package.json index 9de46ad9621..7855d31dc12 100644 --- a/examples/grpc/package.json +++ b/examples/grpc/package.json @@ -1,7 +1,7 @@ { "name": "grpc-example", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of gRPC integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -28,12 +28,12 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/exporter-jaeger": "^0.6.1", - "@opentelemetry/exporter-zipkin": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/plugin-grpc": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/exporter-jaeger": "^0.7.0", + "@opentelemetry/exporter-zipkin": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/plugin-grpc": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "google-protobuf": "^3.9.2", "grpc": "^1.23.3", "node-pre-gyp": "0.12.0" diff --git a/examples/http/package.json b/examples/http/package.json index 139dae4639d..c47fd562fad 100644 --- a/examples/http/package.json +++ b/examples/http/package.json @@ -1,7 +1,7 @@ { "name": "http-example", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of HTTP integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -28,12 +28,12 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/exporter-jaeger": "^0.6.1", - "@opentelemetry/exporter-zipkin": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/plugin-http": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/exporter-jaeger": "^0.7.0", + "@opentelemetry/exporter-zipkin": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/plugin-http": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { diff --git a/examples/https/package.json b/examples/https/package.json index 25df8768b16..33570c1853c 100644 --- a/examples/https/package.json +++ b/examples/https/package.json @@ -1,7 +1,7 @@ { "name": "https-example", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of HTTPs integration with OpenTelemetry", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -29,12 +29,12 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/exporter-jaeger": "^0.6.1", - "@opentelemetry/exporter-zipkin": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/plugin-https": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/exporter-jaeger": "^0.7.0", + "@opentelemetry/exporter-zipkin": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/plugin-https": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { diff --git a/examples/metrics/package.json b/examples/metrics/package.json index fea2183bfd6..b5a5db81bda 100644 --- a/examples/metrics/package.json +++ b/examples/metrics/package.json @@ -1,7 +1,7 @@ { "name": "example-metrics", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of using @opentelemetry/metrics", "main": "index.js", "scripts": { @@ -26,8 +26,8 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/exporter-prometheus": "^0.6.1", - "@opentelemetry/metrics": "^0.6.1" + "@opentelemetry/exporter-prometheus": "^0.7.0", + "@opentelemetry/metrics": "^0.7.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/opentracing-shim/package.json b/examples/opentracing-shim/package.json index d5be857137d..ceb3d297e9e 100644 --- a/examples/opentracing-shim/package.json +++ b/examples/opentracing-shim/package.json @@ -1,7 +1,7 @@ { "name": "opentracing-shim", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of using @opentelemetry/shim-opentracing in Node.js", "main": "index.js", "scripts": { @@ -29,11 +29,11 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/exporter-jaeger": "^0.6.1", - "@opentelemetry/exporter-zipkin": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/shim-opentracing": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/exporter-jaeger": "^0.7.0", + "@opentelemetry/exporter-zipkin": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/shim-opentracing": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "opentracing": "^0.14.4" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", diff --git a/examples/prometheus/package.json b/examples/prometheus/package.json index e5bb3227777..9d0baa9446c 100644 --- a/examples/prometheus/package.json +++ b/examples/prometheus/package.json @@ -1,6 +1,6 @@ { "name": "prometheus-example", - "version": "0.6.1", + "version": "0.7.0", "description": "Example of using @opentelemetry/metrics and @opentelemetry/exporter-prometheus", "main": "index.js", "scripts": { @@ -9,7 +9,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/exporter-prometheus": "^0.6.1", - "@opentelemetry/metrics": "^0.6.1" + "@opentelemetry/exporter-prometheus": "^0.7.0", + "@opentelemetry/metrics": "^0.7.0" } } diff --git a/examples/tracer-web/package.json b/examples/tracer-web/package.json index 6953494e0ec..598a9ee7cd2 100644 --- a/examples/tracer-web/package.json +++ b/examples/tracer-web/package.json @@ -1,7 +1,7 @@ { "name": "web-tracer-example", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Example of using @opentelemetry/web in browser", "main": "index.js", "scripts": { @@ -34,14 +34,14 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/context-zone": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/exporter-collector": "^0.6.1", + "@opentelemetry/context-zone": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/exporter-collector": "^0.7.0", "@opentelemetry/plugin-document-load": "^0.6.1", "@opentelemetry/plugin-user-interaction": "^0.6.1", - "@opentelemetry/plugin-xml-http-request": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", - "@opentelemetry/web": "^0.6.1" + "@opentelemetry/plugin-xml-http-request": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/web": "^0.7.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/getting-started/monitored-example/package.json b/getting-started/monitored-example/package.json index b7e87655c5e..b4b6a7ff0ea 100644 --- a/getting-started/monitored-example/package.json +++ b/getting-started/monitored-example/package.json @@ -9,7 +9,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/metrics": "^0.6.1", + "@opentelemetry/metrics": "^0.7.0", "axios": "^0.19.0", "express": "^4.17.1" } diff --git a/getting-started/traced-example/package.json b/getting-started/traced-example/package.json index fd690d0062c..9675f7d105d 100644 --- a/getting-started/traced-example/package.json +++ b/getting-started/traced-example/package.json @@ -9,11 +9,11 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/exporter-zipkin": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/plugin-http": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/exporter-zipkin": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/plugin-http": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "axios": "^0.19.0", "express": "^4.17.1" } diff --git a/getting-started/ts-example/package.json b/getting-started/ts-example/package.json index 681ffeae323..16eff7a16f5 100644 --- a/getting-started/ts-example/package.json +++ b/getting-started/ts-example/package.json @@ -13,14 +13,14 @@ "ts-node": "^8.6.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/exporter-prometheus": "^0.6.1", - "@opentelemetry/exporter-zipkin": "^0.6.1", - "@opentelemetry/metrics": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/plugin-http": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/exporter-prometheus": "^0.7.0", + "@opentelemetry/exporter-zipkin": "^0.7.0", + "@opentelemetry/metrics": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/plugin-http": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "axios": "^0.19.1", "express": "^4.17.1" } diff --git a/lerna.json b/lerna.json index 0ffc1914b38..07bd971258d 100644 --- a/lerna.json +++ b/lerna.json @@ -5,7 +5,7 @@ "benchmark/*", "packages/*" ], - "version": "0.6.1", + "version": "0.7.0", "changelog": { "repo": "open-telemetry/opentelemetry-js", "labels": { diff --git a/package.json b/package.json index 2ec08f85bc9..329e6c16fac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opentelemetry-base", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry is a distributed tracing and stats collection framework.", "main": "build/src/index.js", "types": "build/src/index.d.ts", diff --git a/packages/opentelemetry-api/package.json b/packages/opentelemetry-api/package.json index d3a5b5e2878..68eca898e61 100644 --- a/packages/opentelemetry-api/package.json +++ b/packages/opentelemetry-api/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/api", - "version": "0.6.1", + "version": "0.7.0", "description": "Public API for OpenTelemetry", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -47,7 +47,7 @@ "access": "public" }, "dependencies": { - "@opentelemetry/context-base": "^0.6.1" + "@opentelemetry/context-base": "^0.7.0" }, "devDependencies": { "@types/mocha": "^7.0.0", diff --git a/packages/opentelemetry-api/src/version.ts b/packages/opentelemetry-api/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-api/src/version.ts +++ b/packages/opentelemetry-api/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-base/package.json b/packages/opentelemetry-base/package.json index 8072e38ee6b..2ea9741afc4 100644 --- a/packages/opentelemetry-base/package.json +++ b/packages/opentelemetry-base/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/base", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry base provides base code for the SDK packages", "main": "build/src/index.js", "browser": { diff --git a/packages/opentelemetry-base/src/version.ts b/packages/opentelemetry-base/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-base/src/version.ts +++ b/packages/opentelemetry-base/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-context-async-hooks/package.json b/packages/opentelemetry-context-async-hooks/package.json index ce54c7ccfdb..2efdf987321 100644 --- a/packages/opentelemetry-context-async-hooks/package.json +++ b/packages/opentelemetry-context-async-hooks/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-async-hooks", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry AsyncHooks-based Context Manager", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -56,6 +56,6 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/context-base": "^0.6.1" + "@opentelemetry/context-base": "^0.7.0" } } diff --git a/packages/opentelemetry-context-async-hooks/src/version.ts b/packages/opentelemetry-context-async-hooks/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-context-async-hooks/src/version.ts +++ b/packages/opentelemetry-context-async-hooks/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-context-base/package.json b/packages/opentelemetry-context-base/package.json index 52cd58348e1..58700ecf849 100644 --- a/packages/opentelemetry-context-base/package.json +++ b/packages/opentelemetry-context-base/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-base", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Base Context Manager", "main": "build/src/index.js", "types": "build/src/index.d.ts", diff --git a/packages/opentelemetry-context-base/src/version.ts b/packages/opentelemetry-context-base/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-context-base/src/version.ts +++ b/packages/opentelemetry-context-base/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json index 1171b269b02..328422eaf0d 100644 --- a/packages/opentelemetry-context-zone-peer-dep/package.json +++ b/packages/opentelemetry-context-zone-peer-dep/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-zone-peer-dep", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Context Zone with peer dependency for zone.js", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -72,7 +72,7 @@ "zone.js": "^0.10.2" }, "dependencies": { - "@opentelemetry/context-base": "^0.6.1" + "@opentelemetry/context-base": "^0.7.0" }, "peerDependencies": { "zone.js": "^0.10.2" diff --git a/packages/opentelemetry-context-zone-peer-dep/src/version.ts b/packages/opentelemetry-context-zone-peer-dep/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-context-zone-peer-dep/src/version.ts +++ b/packages/opentelemetry-context-zone-peer-dep/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json index 134a63333c4..7b128655ce0 100644 --- a/packages/opentelemetry-context-zone/package.json +++ b/packages/opentelemetry-context-zone/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-zone", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Context Zone", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -66,7 +66,7 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/context-zone-peer-dep": "^0.6.1", + "@opentelemetry/context-zone-peer-dep": "^0.7.0", "zone.js": "^0.10.2" }, "sideEffects": true diff --git a/packages/opentelemetry-context-zone/src/version.ts b/packages/opentelemetry-context-zone/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-context-zone/src/version.ts +++ b/packages/opentelemetry-context-zone/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json index 0b1b3cee36b..149e6f2824b 100644 --- a/packages/opentelemetry-core/package.json +++ b/packages/opentelemetry-core/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/core", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Core provides default and no-op implementations of the OpenTelemetry types for trace and metrics", "main": "build/src/index.js", "browser": { @@ -78,8 +78,8 @@ "webpack": "^4.35.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/context-base": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/context-base": "^0.7.0", "semver": "^7.1.3" } } diff --git a/packages/opentelemetry-core/src/version.ts b/packages/opentelemetry-core/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-core/src/version.ts +++ b/packages/opentelemetry-core/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index b6f7cb3e175..ca89b50383c 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-collector", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -83,12 +83,12 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@grpc/proto-loader": "^0.5.3", - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/resources": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@grpc/proto-loader": "^0.5.3", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/resources": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "google-protobuf": "^3.11.4", "grpc": "^1.24.2" } diff --git a/packages/opentelemetry-exporter-collector/src/version.ts b/packages/opentelemetry-exporter-collector/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-exporter-collector/src/version.ts +++ b/packages/opentelemetry-exporter-collector/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json index 7148a4786b8..7cee3b85e07 100644 --- a/packages/opentelemetry-exporter-jaeger/package.json +++ b/packages/opentelemetry-exporter-jaeger/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-jaeger", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Exporter Jaeger allows user to send collected traces to Jaeger", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,7 +41,7 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/resources": "^0.6.1", + "@opentelemetry/resources": "^0.7.0", "@types/mocha": "^7.0.0", "@types/node": "^12.6.9", "codecov": "^3.6.1", @@ -56,10 +56,10 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "jaeger-client": "^3.15.0" } } diff --git a/packages/opentelemetry-exporter-jaeger/src/version.ts b/packages/opentelemetry-exporter-jaeger/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-exporter-jaeger/src/version.ts +++ b/packages/opentelemetry-exporter-jaeger/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-exporter-prometheus/package.json b/packages/opentelemetry-exporter-prometheus/package.json index c2f69dc1714..d8985c4da75 100644 --- a/packages/opentelemetry-exporter-prometheus/package.json +++ b/packages/opentelemetry-exporter-prometheus/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-prometheus", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Exporter Prometheus provides a metrics endpoint for Prometheus", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -54,10 +54,10 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/metrics": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/metrics": "^0.7.0", "prom-client": "^11.5.3" } } diff --git a/packages/opentelemetry-exporter-prometheus/src/version.ts b/packages/opentelemetry-exporter-prometheus/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-exporter-prometheus/src/version.ts +++ b/packages/opentelemetry-exporter-prometheus/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index f36753df11c..394981afa34 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-zipkin", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Zipkin Exporter allows the user to send collected traces to Zipkin.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -54,10 +54,10 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/resources": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/resources": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0" } } diff --git a/packages/opentelemetry-exporter-zipkin/src/version.ts b/packages/opentelemetry-exporter-zipkin/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-exporter-zipkin/src/version.ts +++ b/packages/opentelemetry-exporter-zipkin/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-metrics/package.json b/packages/opentelemetry-metrics/package.json index a4c02a7a9e7..1e7a12497c1 100644 --- a/packages/opentelemetry-metrics/package.json +++ b/packages/opentelemetry-metrics/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/metrics", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry metrics SDK", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -57,9 +57,9 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/resources": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/resources": "^0.7.0" } } diff --git a/packages/opentelemetry-metrics/src/version.ts b/packages/opentelemetry-metrics/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-metrics/src/version.ts +++ b/packages/opentelemetry-metrics/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-node/package.json b/packages/opentelemetry-node/package.json index 9a78149ffe4..e2eb356c3da 100644 --- a/packages/opentelemetry-node/package.json +++ b/packages/opentelemetry-node/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/node", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Node SDK provides automatic telemetry (tracing, metrics, etc) for Node.js applications", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,8 +41,8 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-base": "^0.6.1", - "@opentelemetry/resources": "^0.6.1", + "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/resources": "^0.7.0", "@types/mocha": "^7.0.0", "@types/node": "^12.6.8", "@types/semver": "^6.0.1", @@ -60,10 +60,10 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/context-async-hooks": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/context-async-hooks": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "require-in-the-middle": "^5.0.0", "semver": "^7.1.3" } diff --git a/packages/opentelemetry-node/src/version.ts b/packages/opentelemetry-node/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-node/src/version.ts +++ b/packages/opentelemetry-node/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-plugin-grpc/package.json b/packages/opentelemetry-plugin-grpc/package.json index 248c6af83be..65e48d832ea 100644 --- a/packages/opentelemetry-plugin-grpc/package.json +++ b/packages/opentelemetry-plugin-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-grpc", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry grpc automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,10 +41,10 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-async-hooks": "^0.6.1", - "@opentelemetry/context-base": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/context-async-hooks": "^0.7.0", + "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "@types/mocha": "^7.0.0", "@types/node": "^12.6.9", "@types/semver": "^6.2.0", @@ -65,8 +65,8 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/core": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/core": "^0.7.0", "shimmer": "^1.2.1" } } diff --git a/packages/opentelemetry-plugin-grpc/src/version.ts b/packages/opentelemetry-plugin-grpc/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-plugin-grpc/src/version.ts +++ b/packages/opentelemetry-plugin-grpc/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-plugin-http/package.json b/packages/opentelemetry-plugin-http/package.json index 887c9fec98c..9e43384dd54 100644 --- a/packages/opentelemetry-plugin-http/package.json +++ b/packages/opentelemetry-plugin-http/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-http", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry http automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,10 +41,10 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-async-hooks": "^0.6.1", - "@opentelemetry/context-base": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/context-async-hooks": "^0.7.0", + "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "@types/got": "^9.6.7", "@types/mocha": "^7.0.0", "@types/node": "^12.12.9", @@ -72,8 +72,8 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/core": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/core": "^0.7.0", "semver": "^7.1.3", "shimmer": "^1.2.1" } diff --git a/packages/opentelemetry-plugin-http/src/version.ts b/packages/opentelemetry-plugin-http/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-plugin-http/src/version.ts +++ b/packages/opentelemetry-plugin-http/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-plugin-https/package.json b/packages/opentelemetry-plugin-https/package.json index 6f2e25d140b..c79f068a7e8 100644 --- a/packages/opentelemetry-plugin-https/package.json +++ b/packages/opentelemetry-plugin-https/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-https", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry https automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,10 +41,10 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-async-hooks": "^0.6.1", - "@opentelemetry/context-base": "^0.6.1", - "@opentelemetry/node": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/context-async-hooks": "^0.7.0", + "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/node": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "@types/got": "^9.6.7", "@types/mocha": "^7.0.0", "@types/node": "^12.12.9", @@ -72,9 +72,9 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/plugin-http": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/plugin-http": "^0.7.0", "semver": "^7.1.3", "shimmer": "^1.2.1" } diff --git a/packages/opentelemetry-plugin-https/src/version.ts b/packages/opentelemetry-plugin-https/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-plugin-https/src/version.ts +++ b/packages/opentelemetry-plugin-https/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-plugin-xml-http-request/package.json b/packages/opentelemetry-plugin-xml-http-request/package.json index 6ffdbbd2a88..fa1a100e078 100644 --- a/packages/opentelemetry-plugin-xml-http-request/package.json +++ b/packages/opentelemetry-plugin-xml-http-request/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-xml-http-request", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry XMLHttpRequest automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -44,8 +44,8 @@ }, "devDependencies": { "@babel/core": "^7.6.0", - "@opentelemetry/context-zone": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/context-zone": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "@types/mocha": "^7.0.0", "@types/node": "^12.6.8", "@types/shimmer": "^1.0.1", @@ -76,10 +76,10 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/web": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/web": "^0.7.0", "shimmer": "^1.2.1" } } diff --git a/packages/opentelemetry-plugin-xml-http-request/src/version.ts b/packages/opentelemetry-plugin-xml-http-request/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-plugin-xml-http-request/src/version.ts +++ b/packages/opentelemetry-plugin-xml-http-request/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index 532fd101503..51925febfbb 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/resources", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry SDK resources", "main": "build/src/index.js", "browser": { @@ -61,8 +61,8 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", "gcp-metadata": "^3.5.0" } } diff --git a/packages/opentelemetry-resources/src/version.ts b/packages/opentelemetry-resources/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-resources/src/version.ts +++ b/packages/opentelemetry-resources/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-shim-opentracing/package.json b/packages/opentelemetry-shim-opentracing/package.json index 05254b2562e..1f9bdb58da0 100644 --- a/packages/opentelemetry-shim-opentracing/package.json +++ b/packages/opentelemetry-shim-opentracing/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/shim-opentracing", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTracing to OpenTelemetry shim", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -39,7 +39,7 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/tracing": "^0.7.0", "@types/mocha": "^7.0.0", "@types/node": "^12.6.9", "codecov": "^3.6.1", @@ -54,8 +54,8 @@ "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/core": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/core": "^0.7.0", "opentracing": "^0.14.4" } } diff --git a/packages/opentelemetry-shim-opentracing/src/version.ts b/packages/opentelemetry-shim-opentracing/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-shim-opentracing/src/version.ts +++ b/packages/opentelemetry-shim-opentracing/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-test-utils/package.json b/packages/opentelemetry-test-utils/package.json index 48641ad4c41..9ba91bec737 100644 --- a/packages/opentelemetry-test-utils/package.json +++ b/packages/opentelemetry-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@opentelemetry/test-utils", "private": true, - "version": "0.6.1", + "version": "0.7.0", "description": "Test utilities.", "main": "build/testUtils.js", "scripts": { @@ -23,9 +23,9 @@ }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1", + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0", "gts": "^1.1.2", "ts-node": "^8.6.2", "tslint-consistent-codestyle": "^1.16.0", diff --git a/packages/opentelemetry-tracing/package.json b/packages/opentelemetry-tracing/package.json index 5425c35f225..13c0d9e29a8 100644 --- a/packages/opentelemetry-tracing/package.json +++ b/packages/opentelemetry-tracing/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/tracing", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Tracing", "main": "build/src/index.js", "browser": { @@ -73,10 +73,10 @@ "webpack": "^4.35.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/base": "^0.6.1", - "@opentelemetry/context-base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/resources": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/base": "^0.7.0", + "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/resources": "^0.7.0" } } diff --git a/packages/opentelemetry-tracing/src/version.ts b/packages/opentelemetry-tracing/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-tracing/src/version.ts +++ b/packages/opentelemetry-tracing/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-web/package.json b/packages/opentelemetry-web/package.json index 6b296fcc93a..b8ce2dff7d4 100644 --- a/packages/opentelemetry-web/package.json +++ b/packages/opentelemetry-web/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/web", - "version": "0.6.1", + "version": "0.7.0", "description": "OpenTelemetry Web Tracer", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -43,8 +43,8 @@ }, "devDependencies": { "@babel/core": "^7.6.0", - "@opentelemetry/context-zone": "^0.6.1", - "@opentelemetry/resources": "^0.6.1", + "@opentelemetry/context-zone": "^0.7.0", + "@opentelemetry/resources": "^0.7.0", "@types/jquery": "^3.3.31", "@types/mocha": "^7.0.0", "@types/node": "^12.6.8", @@ -76,9 +76,9 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/api": "^0.6.1", - "@opentelemetry/context-base": "^0.6.1", - "@opentelemetry/core": "^0.6.1", - "@opentelemetry/tracing": "^0.6.1" + "@opentelemetry/api": "^0.7.0", + "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", + "@opentelemetry/tracing": "^0.7.0" } } diff --git a/packages/opentelemetry-web/src/version.ts b/packages/opentelemetry-web/src/version.ts index 74e9e923376..103553581ce 100644 --- a/packages/opentelemetry-web/src/version.ts +++ b/packages/opentelemetry-web/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.6.1'; +export const VERSION = '0.7.0'; From 69f191337a46251f0c7f12758e14a018817b95d8 Mon Sep 17 00:00:00 2001 From: legendecas Date: Tue, 28 Apr 2020 21:07:45 +0800 Subject: [PATCH 05/27] chore: enable declaration map to allow jumping through packages (#986) --- packages/tsconfig.base.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tsconfig.base.json b/packages/tsconfig.base.json index 116c12d66d2..3d1763d3a2f 100644 --- a/packages/tsconfig.base.json +++ b/packages/tsconfig.base.json @@ -3,6 +3,7 @@ "allowUnreachableCode": false, "allowUnusedLabels": false, "declaration": true, + "declarationMap": true, "forceConsistentCasingInFileNames": true, "module": "commonjs", "noEmitOnError": true, From e4e71b8b49d516bb6902ee6562f7ca1eba689182 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Tue, 28 Apr 2020 20:21:51 -0400 Subject: [PATCH 06/27] Use global API instances (#943) --- packages/opentelemetry-api/README.md | 4 + packages/opentelemetry-api/src/api/context.ts | 43 ++++++++-- .../opentelemetry-api/src/api/global-utils.ts | 67 +++++++++++++++ packages/opentelemetry-api/src/api/metrics.ts | 29 ++++++- .../opentelemetry-api/src/api/propagation.ts | 36 ++++++++- packages/opentelemetry-api/src/api/trace.ts | 33 ++++++-- .../opentelemetry-api/test/api/api.test.ts | 11 ++- .../opentelemetry-api/test/api/global.test.ts | 81 +++++++++++++++++++ .../test/NodeTracerProvider.test.ts | 1 + .../test/registration.test.ts | 43 ++++++---- .../test/grpc.test.ts | 2 +- .../test/functionals/http-enable.test.ts | 2 +- .../test/functionals/http-package.test.ts | 10 ++- .../test/integrations/http-enable.test.ts | 11 ++- .../test/functionals/https-enable.test.ts | 1 + .../test/functionals/https-package.test.ts | 37 +++++---- .../test/integrations/https-enable.test.ts | 12 ++- .../test/xhr.test.ts | 2 +- .../test/BasicTracerProvider.test.ts | 8 +- .../test/WebTracerProvider.test.ts | 5 +- .../test/registration.test.ts | 41 +++++----- 21 files changed, 397 insertions(+), 82 deletions(-) create mode 100644 packages/opentelemetry-api/src/api/global-utils.ts create mode 100644 packages/opentelemetry-api/test/api/global.test.ts diff --git a/packages/opentelemetry-api/README.md b/packages/opentelemetry-api/README.md index 2e8d75cd41e..46ca4fd212e 100644 --- a/packages/opentelemetry-api/README.md +++ b/packages/opentelemetry-api/README.md @@ -91,6 +91,10 @@ const meterProvider = new MeterProvider({ api.metrics.setGlobalMeterProvider(meterProvider); ``` +## Version Compatibility + +Because the npm installer and node module resolution algorithm could potentially allow two or more copies of any given package to exist within the same `node_modules` structure, the OpenTelemetry API takes advantage of a variable on the `global` object to store the global API. When an API method in the API package is called, it checks if this `global` API exists and proxies calls to it if and only if it is a compatible API version. This means if a package has a dependency on an OpenTelemetry API version which is not compatible with the API used by the end user, the package will receive a no-op implementation of the API. + ## Advanced Use ### API Registration Options diff --git a/packages/opentelemetry-api/src/api/context.ts b/packages/opentelemetry-api/src/api/context.ts index 3c5f7f0ea7c..b127917990b 100644 --- a/packages/opentelemetry-api/src/api/context.ts +++ b/packages/opentelemetry-api/src/api/context.ts @@ -15,17 +15,24 @@ */ import { + Context, ContextManager, NoopContextManager, - Context, } from '@opentelemetry/context-base'; +import { + API_BACKWARDS_COMPATIBILITY_VERSION, + GLOBAL_CONTEXT_MANAGER_API_KEY, + makeGetter, + _global, +} from './global-utils'; + +const NOOP_CONTEXT_MANAGER = new NoopContextManager(); /** * Singleton object which represents the entry point to the OpenTelemetry Context API */ export class ContextAPI { private static _instance?: ContextAPI; - private _contextManager: ContextManager = new NoopContextManager(); /** Empty private constructor prevents end users from constructing a new instance of the API */ private constructor() {} @@ -45,7 +52,17 @@ export class ContextAPI { public setGlobalContextManager( contextManager: ContextManager ): ContextManager { - this._contextManager = contextManager; + if (_global[GLOBAL_CONTEXT_MANAGER_API_KEY]) { + // global context manager has already been set + return this._getContextManager(); + } + + _global[GLOBAL_CONTEXT_MANAGER_API_KEY] = makeGetter( + API_BACKWARDS_COMPATIBILITY_VERSION, + contextManager, + NOOP_CONTEXT_MANAGER + ); + return contextManager; } @@ -53,7 +70,7 @@ export class ContextAPI { * Get the currently active context */ public active(): Context { - return this._contextManager.active(); + return this._getContextManager().active(); } /** @@ -66,7 +83,7 @@ export class ContextAPI { context: Context, fn: T ): ReturnType { - return this._contextManager.with(context, fn); + return this._getContextManager().with(context, fn); } /** @@ -76,6 +93,20 @@ export class ContextAPI { * @param context context to bind to the event emitter or function. Defaults to the currently active context */ public bind(target: T, context: Context = this.active()): T { - return this._contextManager.bind(target, context); + return this._getContextManager().bind(target, context); + } + + private _getContextManager(): ContextManager { + return ( + _global[GLOBAL_CONTEXT_MANAGER_API_KEY]?.( + API_BACKWARDS_COMPATIBILITY_VERSION + ) ?? NOOP_CONTEXT_MANAGER + ); + } + + /** Disable and remove the global context manager */ + public disable() { + this._getContextManager().disable(); + delete _global[GLOBAL_CONTEXT_MANAGER_API_KEY]; } } diff --git a/packages/opentelemetry-api/src/api/global-utils.ts b/packages/opentelemetry-api/src/api/global-utils.ts new file mode 100644 index 00000000000..3114d1b6d02 --- /dev/null +++ b/packages/opentelemetry-api/src/api/global-utils.ts @@ -0,0 +1,67 @@ +/*! + * Copyright 2020, 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 { ContextManager } from '@opentelemetry/context-base'; +import { HttpTextPropagator } from '../context/propagation/HttpTextPropagator'; +import { MeterProvider } from '../metrics/MeterProvider'; +import { TracerProvider } from '../trace/tracer_provider'; + +export const GLOBAL_CONTEXT_MANAGER_API_KEY = Symbol.for( + 'io.opentelemetry.js.api.context' +); +export const GLOBAL_METRICS_API_KEY = Symbol.for( + 'io.opentelemetry.js.api.metrics' +); +export const GLOBAL_PROPAGATION_API_KEY = Symbol.for( + 'io.opentelemetry.js.api.propagation' +); +export const GLOBAL_TRACE_API_KEY = Symbol.for('io.opentelemetry.js.api.trace'); + +type Get = (version: number) => T; +type MyGlobals = Partial<{ + [GLOBAL_CONTEXT_MANAGER_API_KEY]: Get; + [GLOBAL_METRICS_API_KEY]: Get; + [GLOBAL_PROPAGATION_API_KEY]: Get; + [GLOBAL_TRACE_API_KEY]: Get; +}>; + +export const _global = global as typeof global & MyGlobals; + +/** + * Make a function which accepts a version integer and returns the instance of an API if the version + * is compatible, or a fallback version (usually NOOP) if it is not. + * + * @param requiredVersion Backwards compatibility version which is required to return the instance + * @param instance Instance which should be returned if the required version is compatible + * @param fallback Fallback instance, usually NOOP, which will be returned if the required version is not compatible + */ +export function makeGetter( + requiredVersion: number, + instance: T, + fallback: T +): Get { + return (version: number): T => + version === requiredVersion ? instance : fallback; +} + +/** + * A number which should be incremented each time a backwards incompatible + * change is made to the API. This number is used when an API package + * attempts to access the global API to ensure it is getting a compatible + * version. If the global API is not compatible with the API package + * attempting to get it, a NOOP API implementation will be returned. + */ +export const API_BACKWARDS_COMPATIBILITY_VERSION = 0; diff --git a/packages/opentelemetry-api/src/api/metrics.ts b/packages/opentelemetry-api/src/api/metrics.ts index 118c20db996..dedf58be54b 100644 --- a/packages/opentelemetry-api/src/api/metrics.ts +++ b/packages/opentelemetry-api/src/api/metrics.ts @@ -17,13 +17,18 @@ import { Meter } from '../metrics/Meter'; import { MeterProvider } from '../metrics/MeterProvider'; import { NOOP_METER_PROVIDER } from '../metrics/NoopMeterProvider'; +import { + API_BACKWARDS_COMPATIBILITY_VERSION, + GLOBAL_METRICS_API_KEY, + makeGetter, + _global, +} from './global-utils'; /** * Singleton object which represents the entry point to the OpenTelemetry Metrics API */ export class MetricsAPI { private static _instance?: MetricsAPI; - private _meterProvider: MeterProvider = NOOP_METER_PROVIDER; /** Empty private constructor prevents end users from constructing a new instance of the API */ private constructor() {} @@ -41,7 +46,17 @@ export class MetricsAPI { * Set the current global meter. Returns the initialized global meter provider. */ public setGlobalMeterProvider(provider: MeterProvider): MeterProvider { - this._meterProvider = provider; + if (_global[GLOBAL_METRICS_API_KEY]) { + // global meter provider has already been set + return this.getMeterProvider(); + } + + _global[GLOBAL_METRICS_API_KEY] = makeGetter( + API_BACKWARDS_COMPATIBILITY_VERSION, + provider, + NOOP_METER_PROVIDER + ); + return provider; } @@ -49,7 +64,10 @@ export class MetricsAPI { * Returns the global meter provider. */ public getMeterProvider(): MeterProvider { - return this._meterProvider; + return ( + _global[GLOBAL_METRICS_API_KEY]?.(API_BACKWARDS_COMPATIBILITY_VERSION) ?? + NOOP_METER_PROVIDER + ); } /** @@ -58,4 +76,9 @@ export class MetricsAPI { public getMeter(name: string, version?: string): Meter { return this.getMeterProvider().getMeter(name, version); } + + /** Remove the global meter provider */ + public disable() { + delete _global[GLOBAL_METRICS_API_KEY]; + } } diff --git a/packages/opentelemetry-api/src/api/propagation.ts b/packages/opentelemetry-api/src/api/propagation.ts index f26c3c6f805..a8af5242448 100644 --- a/packages/opentelemetry-api/src/api/propagation.ts +++ b/packages/opentelemetry-api/src/api/propagation.ts @@ -20,6 +20,12 @@ import { HttpTextPropagator } from '../context/propagation/HttpTextPropagator'; import { NOOP_HTTP_TEXT_PROPAGATOR } from '../context/propagation/NoopHttpTextPropagator'; import { defaultSetter, SetterFunction } from '../context/propagation/setter'; import { ContextAPI } from './context'; +import { + API_BACKWARDS_COMPATIBILITY_VERSION, + GLOBAL_PROPAGATION_API_KEY, + makeGetter, + _global, +} from './global-utils'; const contextApi = ContextAPI.getInstance(); @@ -28,7 +34,6 @@ const contextApi = ContextAPI.getInstance(); */ export class PropagationAPI { private static _instance?: PropagationAPI; - private _propagator: HttpTextPropagator = NOOP_HTTP_TEXT_PROPAGATOR; /** Empty private constructor prevents end users from constructing a new instance of the API */ private constructor() {} @@ -48,7 +53,17 @@ export class PropagationAPI { public setGlobalPropagator( propagator: HttpTextPropagator ): HttpTextPropagator { - this._propagator = propagator; + if (_global[GLOBAL_PROPAGATION_API_KEY]) { + // global propagator has already been set + return this._getGlobalPropagator(); + } + + _global[GLOBAL_PROPAGATION_API_KEY] = makeGetter( + API_BACKWARDS_COMPATIBILITY_VERSION, + propagator, + NOOP_HTTP_TEXT_PROPAGATOR + ); + return propagator; } @@ -64,7 +79,7 @@ export class PropagationAPI { setter: SetterFunction = defaultSetter, context = contextApi.active() ): void { - return this._propagator.inject(context, carrier, setter); + return this._getGlobalPropagator().inject(context, carrier, setter); } /** @@ -79,6 +94,19 @@ export class PropagationAPI { getter: GetterFunction = defaultGetter, context = contextApi.active() ): Context { - return this._propagator.extract(context, carrier, getter); + return this._getGlobalPropagator().extract(context, carrier, getter); + } + + /** Remove the global propagator */ + public disable() { + delete _global[GLOBAL_PROPAGATION_API_KEY]; + } + + private _getGlobalPropagator(): HttpTextPropagator { + return ( + _global[GLOBAL_PROPAGATION_API_KEY]?.( + API_BACKWARDS_COMPATIBILITY_VERSION + ) ?? NOOP_HTTP_TEXT_PROPAGATOR + ); } } diff --git a/packages/opentelemetry-api/src/api/trace.ts b/packages/opentelemetry-api/src/api/trace.ts index 4af88e70e6a..bae7353e08f 100644 --- a/packages/opentelemetry-api/src/api/trace.ts +++ b/packages/opentelemetry-api/src/api/trace.ts @@ -15,15 +15,20 @@ */ import { NOOP_TRACER_PROVIDER } from '../trace/NoopTracerProvider'; -import { TracerProvider } from '../trace/tracer_provider'; import { Tracer } from '../trace/tracer'; +import { TracerProvider } from '../trace/tracer_provider'; +import { + API_BACKWARDS_COMPATIBILITY_VERSION, + GLOBAL_TRACE_API_KEY, + makeGetter, + _global, +} from './global-utils'; /** * Singleton object which represents the entry point to the OpenTelemetry Tracing API */ export class TraceAPI { private static _instance?: TraceAPI; - private _tracerProvider: TracerProvider = NOOP_TRACER_PROVIDER; /** Empty private constructor prevents end users from constructing a new instance of the API */ private constructor() {} @@ -41,15 +46,28 @@ export class TraceAPI { * Set the current global tracer. Returns the initialized global tracer provider */ public setGlobalTracerProvider(provider: TracerProvider): TracerProvider { - this._tracerProvider = provider; - return provider; + if (_global[GLOBAL_TRACE_API_KEY]) { + // global tracer provider has already been set + return this.getTracerProvider(); + } + + _global[GLOBAL_TRACE_API_KEY] = makeGetter( + API_BACKWARDS_COMPATIBILITY_VERSION, + provider, + NOOP_TRACER_PROVIDER + ); + + return this.getTracerProvider(); } /** * Returns the global tracer provider. */ public getTracerProvider(): TracerProvider { - return this._tracerProvider; + return ( + _global[GLOBAL_TRACE_API_KEY]?.(API_BACKWARDS_COMPATIBILITY_VERSION) ?? + NOOP_TRACER_PROVIDER + ); } /** @@ -58,4 +76,9 @@ export class TraceAPI { public getTracer(name: string, version?: string): Tracer { return this.getTracerProvider().getTracer(name, version); } + + /** Remove the global tracer provider */ + public disable() { + delete _global[GLOBAL_TRACE_API_KEY]; + } } diff --git a/packages/opentelemetry-api/test/api/api.test.ts b/packages/opentelemetry-api/test/api/api.test.ts index e9994038cc9..d02453d2528 100644 --- a/packages/opentelemetry-api/test/api/api.test.ts +++ b/packages/opentelemetry-api/test/api/api.test.ts @@ -22,6 +22,10 @@ import api, { NoopTracer, SpanOptions, Span, + context, + trace, + propagation, + metrics, } from '../../src'; describe('API', () => { @@ -41,8 +45,11 @@ describe('API', () => { }; const dummySpan = new NoopSpan(spanContext); - afterEach(() => { - api.trace.setGlobalTracerProvider(new NoopTracerProvider()); + beforeEach(() => { + context.disable(); + trace.disable(); + propagation.disable(); + metrics.disable(); }); it('should not crash', () => { diff --git a/packages/opentelemetry-api/test/api/global.test.ts b/packages/opentelemetry-api/test/api/global.test.ts new file mode 100644 index 00000000000..5ff4e25a2bf --- /dev/null +++ b/packages/opentelemetry-api/test/api/global.test.ts @@ -0,0 +1,81 @@ +/*! + * Copyright 2020, 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 { NoopContextManager } from '@opentelemetry/context-base'; +import { + _global, + GLOBAL_CONTEXT_MANAGER_API_KEY, +} from '../../src/api/global-utils'; + +const api1 = require('../../src') as typeof import('../../src'); + +// clear cache and load a second instance of the api +for (const key of Object.keys(require.cache)) { + delete require.cache[key]; +} +const api2 = require('../../src') as typeof import('../../src'); + +describe('Global Utils', () => { + // prove they are separate instances + assert.notEqual(api1, api2); + // that return separate noop instances to start + assert.notStrictEqual( + api1.context['_getContextManager'](), + api2.context['_getContextManager']() + ); + + beforeEach(() => { + api1.context.disable(); + api1.propagation.disable(); + api1.trace.disable(); + api1.metrics.disable(); + }); + + it('should change the global context manager', () => { + const original = api1.context['_getContextManager'](); + const newContextManager = new NoopContextManager(); + api1.context.setGlobalContextManager(newContextManager); + assert.notStrictEqual(api1.context['_getContextManager'](), original); + assert.strictEqual(api1.context['_getContextManager'](), newContextManager); + }); + + it('should load an instance from one which was set in the other', () => { + api1.context.setGlobalContextManager(new NoopContextManager()); + assert.strictEqual( + api1.context['_getContextManager'](), + api2.context['_getContextManager']() + ); + }); + + it('should disable both if one is disabled', () => { + const original = api1.context['_getContextManager'](); + + api1.context.setGlobalContextManager(new NoopContextManager()); + + assert.notStrictEqual(original, api1.context['_getContextManager']()); + api2.context.disable(); + assert.strictEqual(original, api1.context['_getContextManager']()); + }); + + it('should return the module NoOp implementation if the version is a mismatch', () => { + const original = api1.context['_getContextManager'](); + api1.context.setGlobalContextManager(new NoopContextManager()); + const afterSet = _global[GLOBAL_CONTEXT_MANAGER_API_KEY]!(-1); + + assert.strictEqual(original, afterSet); + }); +}); diff --git a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts index 1cd0298e622..d38dda53196 100644 --- a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts +++ b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts @@ -58,6 +58,7 @@ describe('NodeTracerProvider', () => { Object.keys(require.cache).forEach(key => delete require.cache[key]); provider.stop(); contextManager.disable(); + context.disable(); }); describe('constructor', () => { diff --git a/packages/opentelemetry-node/test/registration.test.ts b/packages/opentelemetry-node/test/registration.test.ts index e36d910d456..d3056734707 100644 --- a/packages/opentelemetry-node/test/registration.test.ts +++ b/packages/opentelemetry-node/test/registration.test.ts @@ -17,30 +17,33 @@ import { context, NoopHttpTextPropagator, - NoopTracerProvider, propagation, trace, } from '@opentelemetry/api'; -import { HttpTraceContext } from '@opentelemetry/core'; import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; import { NoopContextManager } from '@opentelemetry/context-base'; +import { HttpTraceContext } from '@opentelemetry/core'; import * as assert from 'assert'; import { NodeTracerProvider } from '../src'; describe('API registration', () => { beforeEach(() => { - context.setGlobalContextManager(new NoopContextManager()); - propagation.setGlobalPropagator(new NoopHttpTextPropagator()); - trace.setGlobalTracerProvider(new NoopTracerProvider()); + context.disable(); + trace.disable(); + propagation.disable(); }); it('should register default implementations', () => { const tracerProvider = new NodeTracerProvider(); tracerProvider.register(); - assert.ok(context['_contextManager'] instanceof AsyncHooksContextManager); - assert.ok(propagation['_propagator'] instanceof HttpTraceContext); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok( + context['_getContextManager']() instanceof AsyncHooksContextManager + ); + assert.ok( + propagation['_getGlobalPropagator']() instanceof HttpTraceContext + ); + assert.ok(trace.getTracerProvider() === tracerProvider); }); it('should register configured implementations', () => { @@ -54,10 +57,10 @@ describe('API registration', () => { propagator, }); - assert.ok(context['_contextManager'] === contextManager); - assert.ok(propagation['_propagator'] === propagator); + assert.ok(context['_getContextManager']() === contextManager); + assert.ok(propagation['_getGlobalPropagator']() === propagator); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok(trace.getTracerProvider() === tracerProvider); }); it('should skip null context manager', () => { @@ -66,10 +69,12 @@ describe('API registration', () => { contextManager: null, }); - assert.ok(context['_contextManager'] instanceof NoopContextManager); + assert.ok(context['_getContextManager']() instanceof NoopContextManager); - assert.ok(propagation['_propagator'] instanceof HttpTraceContext); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok( + propagation['_getGlobalPropagator']() instanceof HttpTraceContext + ); + assert.ok(trace.getTracerProvider() === tracerProvider); }); it('should skip null propagator', () => { @@ -78,9 +83,13 @@ describe('API registration', () => { propagator: null, }); - assert.ok(propagation['_propagator'] instanceof NoopHttpTextPropagator); + assert.ok( + propagation['_getGlobalPropagator']() instanceof NoopHttpTextPropagator + ); - assert.ok(context['_contextManager'] instanceof AsyncHooksContextManager); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok( + context['_getContextManager']() instanceof AsyncHooksContextManager + ); + assert.ok(trace.getTracerProvider() === tracerProvider); }); }); diff --git a/packages/opentelemetry-plugin-grpc/test/grpc.test.ts b/packages/opentelemetry-plugin-grpc/test/grpc.test.ts index 56ad4f09bfa..c137361b242 100644 --- a/packages/opentelemetry-plugin-grpc/test/grpc.test.ts +++ b/packages/opentelemetry-plugin-grpc/test/grpc.test.ts @@ -312,7 +312,7 @@ describe('GrpcPlugin', () => { }); afterEach(() => { - contextManager.disable(); + context.disable(); }); it('should return a plugin', () => { diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts index 94c9c410f60..10fa530ba34 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts @@ -85,7 +85,7 @@ describe('HttpPlugin', () => { }); afterEach(() => { - contextManager.disable(); + context.disable(); }); it('should return a plugin', () => { diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts index c6880fda542..9b69793d28e 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { SpanKind } from '@opentelemetry/api'; +import { context, SpanKind } from '@opentelemetry/api'; +import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; import { NoopLogger } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/node'; import { @@ -40,6 +41,13 @@ const memoryExporter = new InMemorySpanExporter(); const protocol = 'http'; describe('Packages', () => { + beforeEach(() => { + context.setGlobalContextManager(new AsyncHooksContextManager().enable()); + }); + + afterEach(() => { + context.disable(); + }); describe('get', () => { const logger = new NoopLogger(); const provider = new NodeTracerProvider({ diff --git a/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts index 0a529c684ec..8b083785766 100644 --- a/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts @@ -15,7 +15,7 @@ */ import { NoopLogger } from '@opentelemetry/core'; -import { SpanKind, Span } from '@opentelemetry/api'; +import { SpanKind, Span, context } from '@opentelemetry/api'; import * as assert from 'assert'; import * as http from 'http'; import { plugin } from '../../src/http'; @@ -31,6 +31,7 @@ import { } from '@opentelemetry/tracing'; import { HttpPluginConfig } from '../../src/types'; import { AttributeNames } from '../../src/enums/AttributeNames'; +import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; const protocol = 'http'; const serverPort = 32345; const hostname = 'localhost'; @@ -41,6 +42,14 @@ export const customAttributeFunction = (span: Span): void => { }; describe('HttpPlugin Integration tests', () => { + beforeEach(() => { + memoryExporter.reset(); + context.setGlobalContextManager(new AsyncHooksContextManager().enable()); + }); + + afterEach(() => { + context.disable(); + }); describe('enable()', () => { before(function(done) { // mandatory diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts index 16ed7f67e8d..5648223fe06 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts @@ -92,6 +92,7 @@ describe('HttpsPlugin', () => { afterEach(() => { contextManager.disable(); + context.disable(); }); it('should return a plugin', () => { diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts index 106d00a32e8..0b6935fe36b 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts @@ -14,27 +14,28 @@ * limitations under the License. */ +import { context, Span, SpanKind } from '@opentelemetry/api'; +import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; import { NoopLogger } from '@opentelemetry/core'; -import { SpanKind, Span } from '@opentelemetry/api'; +import { NodeTracerProvider } from '@opentelemetry/node'; +import { Http } from '@opentelemetry/plugin-http'; +import { + InMemorySpanExporter, + SimpleSpanProcessor, +} from '@opentelemetry/tracing'; import * as assert from 'assert'; -import * as https from 'https'; +import axios, { AxiosResponse } from 'axios'; +import * as got from 'got'; import * as http from 'http'; +import * as https from 'https'; import * as nock from 'nock'; +import * as path from 'path'; +import * as request from 'request-promise-native'; +import * as superagent from 'superagent'; +import * as url from 'url'; import { plugin } from '../../src/https'; import { assertSpan } from '../utils/assertSpan'; import { DummyPropagation } from '../utils/DummyPropagation'; -import * as url from 'url'; -import axios, { AxiosResponse } from 'axios'; -import * as superagent from 'superagent'; -import * as got from 'got'; -import * as request from 'request-promise-native'; -import * as path from 'path'; -import { - InMemorySpanExporter, - SimpleSpanProcessor, -} from '@opentelemetry/tracing'; -import { Http } from '@opentelemetry/plugin-http'; -import { NodeTracerProvider } from '@opentelemetry/node'; const memoryExporter = new InMemorySpanExporter(); @@ -43,6 +44,14 @@ export const customAttributeFunction = (span: Span): void => { }; describe('Packages', () => { + beforeEach(() => { + memoryExporter.reset(); + context.setGlobalContextManager(new AsyncHooksContextManager().enable()); + }); + + afterEach(() => { + context.disable(); + }); describe('get', () => { const logger = new NoopLogger(); diff --git a/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts b/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts index fa8be0e518e..d66ee4ae90a 100644 --- a/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts +++ b/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts @@ -20,7 +20,7 @@ import { Http, AttributeNames, } from '@opentelemetry/plugin-http'; -import { SpanKind, Span } from '@opentelemetry/api'; +import { SpanKind, Span, context } from '@opentelemetry/api'; import * as assert from 'assert'; import * as http from 'http'; import * as https from 'https'; @@ -35,6 +35,7 @@ import { InMemorySpanExporter, SimpleSpanProcessor, } from '@opentelemetry/tracing'; +import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; const protocol = 'https'; const serverPort = 42345; @@ -46,6 +47,15 @@ export const customAttributeFunction = (span: Span): void => { }; describe('HttpsPlugin Integration tests', () => { + beforeEach(() => { + memoryExporter.reset(); + context.setGlobalContextManager(new AsyncHooksContextManager().enable()); + }); + + afterEach(() => { + context.disable(); + }); + describe('enable()', () => { before(function(done) { // mandatory diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index c35741cd38b..52693d840ae 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -105,7 +105,7 @@ describe('xhr', () => { }); afterEach(() => { - contextManager.disable(); + types.context.disable(); }); before(() => { diff --git a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts index 832128e9c4c..4b38b090462 100644 --- a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts +++ b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts @@ -15,6 +15,7 @@ */ import { Context, context, SpanContext, TraceFlags } from '@opentelemetry/api'; +import { ContextManager } from '@opentelemetry/context-base'; import { ALWAYS_SAMPLER, NEVER_SAMPLER, @@ -25,16 +26,12 @@ import { TraceState, } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { - NoopContextManager, - ContextManager, -} from '@opentelemetry/context-base'; import * as assert from 'assert'; import { BasicTracerProvider, Span } from '../src'; describe('BasicTracerProvider', () => { beforeEach(() => { - context.setGlobalContextManager(new NoopContextManager()); + context.disable(); }); describe('constructor', () => { @@ -338,6 +335,7 @@ describe('BasicTracerProvider', () => { context.setGlobalContextManager({ active: () => setActiveSpan(Context.ROOT_CONTEXT, ('foo' as any) as Span), + disable: () => {}, } as ContextManager); const tracer = new BasicTracerProvider().getTracer('default'); diff --git a/packages/opentelemetry-web/test/WebTracerProvider.test.ts b/packages/opentelemetry-web/test/WebTracerProvider.test.ts index e22d4cef861..60007a44796 100644 --- a/packages/opentelemetry-web/test/WebTracerProvider.test.ts +++ b/packages/opentelemetry-web/test/WebTracerProvider.test.ts @@ -15,11 +15,11 @@ */ import { context } from '@opentelemetry/api'; -import { B3Propagator, BasePlugin, NoopLogger } from '@opentelemetry/core'; import { ContextManager } from '@opentelemetry/context-base'; import { ZoneContextManager } from '@opentelemetry/context-zone'; -import { Tracer, Span } from '@opentelemetry/tracing'; +import { B3Propagator, BasePlugin, NoopLogger } from '@opentelemetry/core'; import { Resource, TELEMETRY_SDK_RESOURCE } from '@opentelemetry/resources'; +import { Span, Tracer } from '@opentelemetry/tracing'; import * as assert from 'assert'; import * as sinon from 'sinon'; import { WebTracerConfig } from '../src'; @@ -48,6 +48,7 @@ describe('WebTracerProvider', () => { afterEach(() => { contextManager.disable(); + context.disable(); }); it('should construct an instance with required only options', () => { diff --git a/packages/opentelemetry-web/test/registration.test.ts b/packages/opentelemetry-web/test/registration.test.ts index 497bc868d0c..adcee3a94ec 100644 --- a/packages/opentelemetry-web/test/registration.test.ts +++ b/packages/opentelemetry-web/test/registration.test.ts @@ -17,29 +17,30 @@ import { context, NoopHttpTextPropagator, - NoopTracerProvider, propagation, trace, } from '@opentelemetry/api'; -import { HttpTraceContext } from '@opentelemetry/core'; import { NoopContextManager } from '@opentelemetry/context-base'; +import { HttpTraceContext } from '@opentelemetry/core'; import * as assert from 'assert'; -import { WebTracerProvider, StackContextManager } from '../src'; +import { StackContextManager, WebTracerProvider } from '../src'; describe('API registration', () => { beforeEach(() => { - context.setGlobalContextManager(new NoopContextManager()); - propagation.setGlobalPropagator(new NoopHttpTextPropagator()); - trace.setGlobalTracerProvider(new NoopTracerProvider()); + context.disable(); + trace.disable(); + propagation.disable(); }); it('should register default implementations', () => { const tracerProvider = new WebTracerProvider(); tracerProvider.register(); - assert.ok(context['_contextManager'] instanceof StackContextManager); - assert.ok(propagation['_propagator'] instanceof HttpTraceContext); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok(context['_getContextManager']() instanceof StackContextManager); + assert.ok( + propagation['_getGlobalPropagator']() instanceof HttpTraceContext + ); + assert.ok(trace.getTracerProvider() === tracerProvider); }); it('should register configured implementations', () => { @@ -53,10 +54,10 @@ describe('API registration', () => { propagator, }); - assert.ok(context['_contextManager'] === contextManager); - assert.ok(propagation['_propagator'] === propagator); + assert.ok(context['_getContextManager']() === contextManager); + assert.ok(propagation['_getGlobalPropagator']() === propagator); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok(trace.getTracerProvider() === tracerProvider); }); it('should skip null context manager', () => { @@ -65,10 +66,12 @@ describe('API registration', () => { contextManager: null, }); - assert.ok(context['_contextManager'] instanceof NoopContextManager); + assert.ok(context['_getContextManager']() instanceof NoopContextManager); - assert.ok(propagation['_propagator'] instanceof HttpTraceContext); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok( + propagation['_getGlobalPropagator']() instanceof HttpTraceContext + ); + assert.ok(trace.getTracerProvider() === tracerProvider); }); it('should skip null propagator', () => { @@ -77,9 +80,11 @@ describe('API registration', () => { propagator: null, }); - assert.ok(propagation['_propagator'] instanceof NoopHttpTextPropagator); + assert.ok( + propagation['_getGlobalPropagator']() instanceof NoopHttpTextPropagator + ); - assert.ok(context['_contextManager'] instanceof StackContextManager); - assert.ok(trace['_tracerProvider'] === tracerProvider); + assert.ok(context['_getContextManager']() instanceof StackContextManager); + assert.ok(trace.getTracerProvider() === tracerProvider); }); }); From 5d2aef3f4de0d2bdbfd5d2745e133de343d1ef8d Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Thu, 30 Apr 2020 00:06:00 +1200 Subject: [PATCH 07/27] fix(opentracing-shim): update opentracing shim example (#990) --- examples/opentracing-shim/client.js | 2 +- examples/opentracing-shim/server.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/opentracing-shim/client.js b/examples/opentracing-shim/client.js index 6f98c2efc50..451467e3ef9 100644 --- a/examples/opentracing-shim/client.js +++ b/examples/opentracing-shim/client.js @@ -4,7 +4,7 @@ const http = require('http'); const opentracing = require('opentracing'); const shim = require('./shim').shim('http_client_service'); -opentracing.setGlobalTracer(shim); +opentracing.initGlobalTracer(shim); const tracer = opentracing.globalTracer(); makeRequest(); diff --git a/examples/opentracing-shim/server.js b/examples/opentracing-shim/server.js index 23661667e95..66c0803ccda 100644 --- a/examples/opentracing-shim/server.js +++ b/examples/opentracing-shim/server.js @@ -5,7 +5,7 @@ const opentracing = require('opentracing'); const utils = require('./utils'); const shim = require('./shim').shim('http_server_service'); -opentracing.setGlobalTracer(shim); +opentracing.initGlobalTracer(shim); const tracer = opentracing.globalTracer(); startServer(3000); From 5ea299da7825927d8bd08db6436b43c1a7c0146b Mon Sep 17 00:00:00 2001 From: Valentin Marchaud Date: Wed, 29 Apr 2020 17:38:56 +0200 Subject: [PATCH 08/27] feat(context): implement withAsync #752 (#926) --- .../src/AsyncHooksContextManager.ts | 71 ++++++-- .../test/AsyncHooksContextManager.test.ts | 166 ++++++++++++++++++ 2 files changed, 225 insertions(+), 12 deletions(-) diff --git a/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts b/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts index 138ab5e2f0e..4ea8fe78d4a 100644 --- a/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts +++ b/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts @@ -29,6 +29,19 @@ type PatchedEventEmitter = { __ot_listeners?: { [name: string]: WeakMap, Func> }; } & EventEmitter; +class Reference { + constructor(private _value: T) {} + + set(value: T) { + this._value = value; + return this; + } + + get() { + return this._value; + } +} + const ADD_LISTENER_METHODS = [ 'addListener' as 'addListener', 'on' as 'on', @@ -39,9 +52,7 @@ const ADD_LISTENER_METHODS = [ export class AsyncHooksContextManager implements ContextManager { private _asyncHook: asyncHooks.AsyncHook; - private _contexts: { - [uid: number]: Context | undefined | null; - } = Object.create(null); + private _contextRefs: Map | undefined> = new Map(); constructor() { this._asyncHook = asyncHooks.createHook({ @@ -52,9 +63,8 @@ export class AsyncHooksContextManager implements ContextManager { } active(): Context { - return ( - this._contexts[asyncHooks.executionAsyncId()] || Context.ROOT_CONTEXT - ); + const ref = this._contextRefs.get(asyncHooks.executionAsyncId()); + return ref === undefined ? Context.ROOT_CONTEXT : ref.get(); } with ReturnType>( @@ -62,8 +72,15 @@ export class AsyncHooksContextManager implements ContextManager { fn: T ): ReturnType { const uid = asyncHooks.executionAsyncId(); - const oldContext = this._contexts[uid]; - this._contexts[uid] = context; + let ref = this._contextRefs.get(uid); + let oldContext: Context | undefined = undefined; + if (ref === undefined) { + ref = new Reference(context); + this._contextRefs.set(uid, ref); + } else { + oldContext = ref.get(); + ref.set(context); + } try { return fn(); } catch (err) { @@ -72,7 +89,34 @@ export class AsyncHooksContextManager implements ContextManager { if (oldContext === undefined) { this._destroy(uid); } else { - this._contexts[uid] = oldContext; + ref.set(oldContext); + } + } + } + + async withAsync, U extends (...args: unknown[]) => T>( + context: Context, + fn: U + ): Promise { + const uid = asyncHooks.executionAsyncId(); + let ref = this._contextRefs.get(uid); + let oldContext: Context | undefined = undefined; + if (ref === undefined) { + ref = new Reference(context); + this._contextRefs.set(uid, ref); + } else { + oldContext = ref.get(); + ref.set(context); + } + try { + return await fn(); + } catch (err) { + throw err; + } finally { + if (oldContext === undefined) { + this._destroy(uid); + } else { + ref.set(oldContext); } } } @@ -97,7 +141,7 @@ export class AsyncHooksContextManager implements ContextManager { disable(): this { this._asyncHook.disable(); - this._contexts = {}; + this._contextRefs.clear(); return this; } @@ -232,7 +276,10 @@ export class AsyncHooksContextManager implements ContextManager { * @param uid id of the async context */ private _init(uid: number) { - this._contexts[uid] = this._contexts[asyncHooks.executionAsyncId()]; + const ref = this._contextRefs.get(asyncHooks.executionAsyncId()); + if (ref !== undefined) { + this._contextRefs.set(uid, ref); + } } /** @@ -241,6 +288,6 @@ export class AsyncHooksContextManager implements ContextManager { * @param uid uid of the async context */ private _destroy(uid: number) { - delete this._contexts[uid]; + this._contextRefs.delete(uid); } } diff --git a/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts b/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts index 5bc4b99edec..8c6c648a883 100644 --- a/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts +++ b/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts @@ -104,6 +104,172 @@ describe('AsyncHooksContextManager', () => { }); }); + describe('.withAsync()', () => { + it('should run the callback', async () => { + let done = false; + await contextManager.withAsync(Context.ROOT_CONTEXT, async () => { + done = true; + }); + + assert.ok(done); + }); + + it('should run the callback with active scope', async () => { + const test = Context.ROOT_CONTEXT.setValue(key1, 1); + await contextManager.withAsync(test, async () => { + assert.strictEqual(contextManager.active(), test, 'should have scope'); + }); + }); + + it('should run the callback (when disabled)', async () => { + contextManager.disable(); + let done = false; + await contextManager.withAsync(Context.ROOT_CONTEXT, async () => { + done = true; + }); + + assert.ok(done); + }); + + it('should rethrow errors', async () => { + contextManager.disable(); + let done = false; + const err = new Error(); + + try { + await contextManager.withAsync(Context.ROOT_CONTEXT, async () => { + throw err; + }); + } catch (e) { + assert.ok(e === err); + done = true; + } + + assert.ok(done); + }); + + it('should finally restore an old scope', async () => { + const scope1 = '1' as any; + const scope2 = '2' as any; + let done = false; + + await contextManager.withAsync(scope1, async () => { + assert.strictEqual(contextManager.active(), scope1); + await contextManager.withAsync(scope2, async () => { + assert.strictEqual(contextManager.active(), scope2); + done = true; + }); + assert.strictEqual(contextManager.active(), scope1); + }); + + assert.ok(done); + }); + }); + + describe('.withAsync/with()', () => { + it('with() inside withAsync() should correctly restore context', async () => { + const scope1 = '1' as any; + const scope2 = '2' as any; + let done = false; + + await contextManager.withAsync(scope1, async () => { + assert.strictEqual(contextManager.active(), scope1); + contextManager.with(scope2, () => { + assert.strictEqual(contextManager.active(), scope2); + done = true; + }); + assert.strictEqual(contextManager.active(), scope1); + }); + + assert.ok(done); + }); + + it('withAsync() inside with() should correctly restore conxtext', done => { + const scope1 = '1' as any; + const scope2 = '2' as any; + + contextManager.with(scope1, async () => { + assert.strictEqual(contextManager.active(), scope1); + await contextManager.withAsync(scope2, async () => { + assert.strictEqual(contextManager.active(), scope2); + }); + assert.strictEqual(contextManager.active(), scope1); + return done(); + }); + assert.strictEqual(contextManager.active(), Context.ROOT_CONTEXT); + }); + + it('not awaited withAsync() inside with() should not restore context', done => { + const scope1 = '1' as any; + const scope2 = '2' as any; + let _done: boolean = false; + + contextManager.with(scope1, () => { + assert.strictEqual(contextManager.active(), scope1); + contextManager + .withAsync(scope2, async () => { + assert.strictEqual(contextManager.active(), scope2); + }) + .then(() => { + assert.strictEqual(contextManager.active(), scope1); + _done = true; + }); + // in this case the current scope is 2 since we + // didnt waited the withAsync call + assert.strictEqual(contextManager.active(), scope2); + setTimeout(() => { + assert.strictEqual(contextManager.active(), scope1); + assert(_done); + return done(); + }, 100); + }); + assert.strictEqual(contextManager.active(), Context.ROOT_CONTEXT); + }); + + it('withAsync() inside a setTimeout inside a with() should correctly restore context', done => { + const scope1 = '1' as any; + const scope2 = '2' as any; + + contextManager.with(scope1, () => { + assert.strictEqual(contextManager.active(), scope1); + setTimeout(() => { + assert.strictEqual(contextManager.active(), scope1); + contextManager + .withAsync(scope2, async () => { + assert.strictEqual(contextManager.active(), scope2); + }) + .then(() => { + assert.strictEqual(contextManager.active(), scope1); + return done(); + }); + }, 5); + assert.strictEqual(contextManager.active(), scope1); + }); + assert.strictEqual(contextManager.active(), Context.ROOT_CONTEXT); + }); + + it('with() inside a setTimeout inside withAsync() should correctly restore context', done => { + const scope1 = '1' as any; + const scope2 = '2' as any; + + contextManager + .withAsync(scope1, async () => { + assert.strictEqual(contextManager.active(), scope1); + setTimeout(() => { + assert.strictEqual(contextManager.active(), scope1); + contextManager.with(scope2, () => { + assert.strictEqual(contextManager.active(), scope2); + return done(); + }); + }, 5); + assert.strictEqual(contextManager.active(), scope1); + }) + .then(() => { + assert.strictEqual(contextManager.active(), scope1); + }); + }); + }); + describe('.bind(function)', () => { it('should return the same target (when enabled)', () => { const test = { a: 1 }; From 23677a16f60f6dea89f449607b5549f711d6ff99 Mon Sep 17 00:00:00 2001 From: legendecas Date: Thu, 30 Apr 2020 01:37:29 +0800 Subject: [PATCH 09/27] refactor: merge opentelemetry-base to opentelemetry-core (#991) They act a very similar role in the SDK. Co-authored-by: Daniel Dyla --- .circleci/config.yml | 1 - README.md | 2 - packages/opentelemetry-base/LICENSE | 201 ------------------ packages/opentelemetry-base/README.md | 28 --- packages/opentelemetry-base/package.json | 62 ------ packages/opentelemetry-base/src/index.ts | 18 -- .../src/platform/browser/index.ts | 17 -- .../opentelemetry-base/src/platform/index.ts | 20 -- .../src/platform/node/index.ts | 17 -- packages/opentelemetry-base/src/version.ts | 18 -- packages/opentelemetry-base/tsconfig.json | 11 - packages/opentelemetry-base/tslint.json | 4 - .../src/ExportResult.ts | 2 +- packages/opentelemetry-core/src/index.ts | 1 + .../src/platform/browser/index.ts | 3 +- .../src/platform/browser/sdk-info.ts} | 0 .../src/platform/node/index.ts | 1 + .../src/platform/node/sdk-info.ts} | 0 .../package.json | 1 - .../src/CollectorExporter.ts | 3 +- .../src/transform.ts | 5 +- .../test/common/CollectorExporter.test.ts | 3 +- .../package.json | 1 - .../src/jaeger.ts | 3 +- .../test/jaeger.test.ts | 3 +- .../package.json | 1 - .../src/prometheus.ts | 7 +- .../package.json | 1 - .../src/zipkin.ts | 3 +- .../test/zipkin.test.ts | 7 +- packages/opentelemetry-metrics/package.json | 1 - .../src/export/ConsoleMetricExporter.ts | 2 +- .../src/export/Controller.ts | 3 +- .../src/export/NoopExporter.ts | 2 +- .../opentelemetry-metrics/src/export/types.ts | 2 +- .../package.json | 1 - packages/opentelemetry-resources/package.json | 2 +- .../opentelemetry-resources/src/Resource.ts | 2 +- .../test/Resource.test.ts | 2 +- .../test/resource-assertions.test.ts | 2 +- .../test/util/resource-assertions.ts | 2 +- packages/opentelemetry-tracing/package.json | 1 - .../src/export/ConsoleSpanExporter.ts | 3 +- .../src/export/InMemorySpanExporter.ts | 2 +- .../src/export/SpanExporter.ts | 2 +- .../test/export/InMemorySpanExporter.test.ts | 3 +- 46 files changed, 35 insertions(+), 441 deletions(-) delete mode 100644 packages/opentelemetry-base/LICENSE delete mode 100644 packages/opentelemetry-base/README.md delete mode 100644 packages/opentelemetry-base/package.json delete mode 100644 packages/opentelemetry-base/src/index.ts delete mode 100644 packages/opentelemetry-base/src/platform/browser/index.ts delete mode 100644 packages/opentelemetry-base/src/platform/index.ts delete mode 100644 packages/opentelemetry-base/src/platform/node/index.ts delete mode 100644 packages/opentelemetry-base/src/version.ts delete mode 100644 packages/opentelemetry-base/tsconfig.json delete mode 100644 packages/opentelemetry-base/tslint.json rename packages/{opentelemetry-base => opentelemetry-core}/src/ExportResult.ts (94%) rename packages/{opentelemetry-base/src/platform/browser/constants.ts => opentelemetry-core/src/platform/browser/sdk-info.ts} (100%) rename packages/{opentelemetry-base/src/platform/node/constants.ts => opentelemetry-core/src/platform/node/sdk-info.ts} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 177e915a7fa..3764a844a51 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,7 +10,6 @@ cache_1: &cache_1 - ./node_modules - ./package-lock.json - packages/opentelemetry-api/node_modules - - packages/opentelemetry-base/node_modules - packages/opentelemetry-context-async-hooks/node_modules - packages/opentelemetry-context-base/node_modules - packages/opentelemetry-context-zone/node_modules diff --git a/README.md b/README.md index 84a4fab324c..d330f482441 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,6 @@ Maintainers ([@open-telemetry/js-maintainers](https://github.com/orgs/open-telem | [@opentelemetry/metrics][otel-metrics] | This module provides instruments and meters for reporting of time series data. | | [@opentelemetry/node][otel-node] | This module provides automatic tracing for Node.js applications. It is intended for use on the server only. | | [@opentelemetry/web][otel-web] | This module provides automated instrumentation and tracing for Web applications. It is intended for use in the browser only. | -| [@opentelemetry/base][otel-base] | This package provides base code for the SDK packages (tracing and metrics). | ### Compatible Exporters @@ -202,7 +201,6 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [docs]: https://open-telemetry.github.io/opentelemetry-js -[otel-base]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-base [otel-metrics]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-metrics [otel-node]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-node diff --git a/packages/opentelemetry-base/LICENSE b/packages/opentelemetry-base/LICENSE deleted file mode 100644 index 261eeb9e9f8..00000000000 --- a/packages/opentelemetry-base/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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 - - http://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. diff --git a/packages/opentelemetry-base/README.md b/packages/opentelemetry-base/README.md deleted file mode 100644 index 9cf3819ca4e..00000000000 --- a/packages/opentelemetry-base/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# OpenTelemetry Base -[![Gitter chat][gitter-image]][gitter-url] -[![NPM Published Version][npm-img]][npm-url] -[![dependencies][dependencies-image]][dependencies-url] -[![devDependencies][devDependencies-image]][devDependencies-url] -[![Apache License][license-image]][license-image] - -This package provides base code for the SDK packages. - -## Useful links -- For more information on OpenTelemetry, visit: -- For more about OpenTelemetry JavaScript: -- For help or feedback on this project, join us on [gitter][gitter-url] - -## License - -Apache 2.0 - See [LICENSE][license-url] for more information. - -[gitter-image]: https://badges.gitter.im/open-telemetry/opentelemetry-js.svg -[gitter-url]: https://gitter.im/open-telemetry/opentelemetry-node?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge -[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/master/LICENSE -[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat -[dependencies-image]: https://david-dm.org/open-telemetry/opentelemetry-js/status.svg?path=packages/opentelemetry-base -[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-base -[devDependencies-image]: https://david-dm.org/open-telemetry/opentelemetry-js/dev-status.svg?path=packages/opentelemetry-base -[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-base&type=dev -[npm-url]: https://www.npmjs.com/package/@opentelemetry/base -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fbase.svg diff --git a/packages/opentelemetry-base/package.json b/packages/opentelemetry-base/package.json deleted file mode 100644 index 2ea9741afc4..00000000000 --- a/packages/opentelemetry-base/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "@opentelemetry/base", - "version": "0.7.0", - "description": "OpenTelemetry base provides base code for the SDK packages", - "main": "build/src/index.js", - "browser": { - "./src/platform/index.ts": "./src/platform/browser/index.ts", - "./build/src/platform/index.js": "./build/src/platform/browser/index.js" - }, - "types": "build/src/index.d.ts", - "repository": "open-telemetry/opentelemetry-js", - "scripts": { - "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts", - "tdd": "npm run tdd:node", - "tdd:node": "npm run test -- --watch-extensions ts --watch", - "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", - "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", - "precompile": "tsc --version", - "version:update": "node ../../scripts/version-update.js", - "compile": "npm run version:update && tsc -p .", - "prepare": "npm run compile" - }, - "keywords": [ - "opentelemetry", - "nodejs", - "tracing", - "profiling", - "metrics", - "stats" - ], - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - }, - "files": [ - "build/src/**/*.js", - "build/src/**/*.d.ts", - "doc", - "LICENSE", - "README.md" - ], - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", - "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.1.0", - "nyc": "^15.0.0", - "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", - "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", - "typescript": "3.7.2" - } -} diff --git a/packages/opentelemetry-base/src/index.ts b/packages/opentelemetry-base/src/index.ts deleted file mode 100644 index 1c2e67e6b78..00000000000 --- a/packages/opentelemetry-base/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * 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. - */ - -export * from './ExportResult'; -export * from './platform'; diff --git a/packages/opentelemetry-base/src/platform/browser/index.ts b/packages/opentelemetry-base/src/platform/browser/index.ts deleted file mode 100644 index 953b08f4dac..00000000000 --- a/packages/opentelemetry-base/src/platform/browser/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * Copyright 2020, 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. - */ - -export * from './constants'; diff --git a/packages/opentelemetry-base/src/platform/index.ts b/packages/opentelemetry-base/src/platform/index.ts deleted file mode 100644 index 6c6d039c914..00000000000 --- a/packages/opentelemetry-base/src/platform/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/*! - * Copyright 2020, 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. - */ - -// Use the node platform by default. The "browser" field of package.json is used -// to override this file to use `./browser/index.ts` when packaged with -// webpack, Rollup, etc. -export * from './node'; diff --git a/packages/opentelemetry-base/src/platform/node/index.ts b/packages/opentelemetry-base/src/platform/node/index.ts deleted file mode 100644 index 953b08f4dac..00000000000 --- a/packages/opentelemetry-base/src/platform/node/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * Copyright 2020, 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. - */ - -export * from './constants'; diff --git a/packages/opentelemetry-base/src/version.ts b/packages/opentelemetry-base/src/version.ts deleted file mode 100644 index 103553581ce..00000000000 --- a/packages/opentelemetry-base/src/version.ts +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * 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. - */ - -// this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; diff --git a/packages/opentelemetry-base/tsconfig.json b/packages/opentelemetry-base/tsconfig.json deleted file mode 100644 index a2042cd68b1..00000000000 --- a/packages/opentelemetry-base/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base", - "compilerOptions": { - "rootDir": ".", - "outDir": "build" - }, - "include": [ - "src/**/*.ts", - "test/**/*.ts" - ] -} diff --git a/packages/opentelemetry-base/tslint.json b/packages/opentelemetry-base/tslint.json deleted file mode 100644 index 0710b135d07..00000000000 --- a/packages/opentelemetry-base/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-base/src/ExportResult.ts b/packages/opentelemetry-core/src/ExportResult.ts similarity index 94% rename from packages/opentelemetry-base/src/ExportResult.ts rename to packages/opentelemetry-core/src/ExportResult.ts index 3f94eddd57b..1306c98b046 100644 --- a/packages/opentelemetry-base/src/ExportResult.ts +++ b/packages/opentelemetry-core/src/ExportResult.ts @@ -1,5 +1,5 @@ /*! - * Copyright 2019, OpenTelemetry Authors + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-core/src/index.ts b/packages/opentelemetry-core/src/index.ts index 60b8b04f925..46f1baf8be1 100644 --- a/packages/opentelemetry-core/src/index.ts +++ b/packages/opentelemetry-core/src/index.ts @@ -18,6 +18,7 @@ export * from './common/ConsoleLogger'; export * from './common/NoopLogger'; export * from './common/time'; export * from './common/types'; +export * from './ExportResult'; export * from './version'; export * from './context/context'; export * from './context/propagation/B3Propagator'; diff --git a/packages/opentelemetry-core/src/platform/browser/index.ts b/packages/opentelemetry-core/src/platform/browser/index.ts index 4668bb35aa2..36164efce55 100644 --- a/packages/opentelemetry-core/src/platform/browser/index.ts +++ b/packages/opentelemetry-core/src/platform/browser/index.ts @@ -14,7 +14,8 @@ * limitations under the License. */ +export * from './hex-to-base64'; export * from './id'; export * from './performance'; +export * from './sdk-info'; export * from './timer-util'; -export * from './hex-to-base64'; diff --git a/packages/opentelemetry-base/src/platform/browser/constants.ts b/packages/opentelemetry-core/src/platform/browser/sdk-info.ts similarity index 100% rename from packages/opentelemetry-base/src/platform/browser/constants.ts rename to packages/opentelemetry-core/src/platform/browser/sdk-info.ts diff --git a/packages/opentelemetry-core/src/platform/node/index.ts b/packages/opentelemetry-core/src/platform/node/index.ts index 4668bb35aa2..47a879b04dd 100644 --- a/packages/opentelemetry-core/src/platform/node/index.ts +++ b/packages/opentelemetry-core/src/platform/node/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export * from './sdk-info'; export * from './id'; export * from './performance'; export * from './timer-util'; diff --git a/packages/opentelemetry-base/src/platform/node/constants.ts b/packages/opentelemetry-core/src/platform/node/sdk-info.ts similarity index 100% rename from packages/opentelemetry-base/src/platform/node/constants.ts rename to packages/opentelemetry-core/src/platform/node/sdk-info.ts diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index ca89b50383c..27a209fa1a6 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -85,7 +85,6 @@ "dependencies": { "@grpc/proto-loader": "^0.5.3", "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/resources": "^0.7.0", "@opentelemetry/tracing": "^0.7.0", diff --git a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts b/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts index 7199848da8e..070042b121b 100644 --- a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { ExportResult } from '@opentelemetry/base'; -import { NoopLogger } from '@opentelemetry/core'; +import { ExportResult, NoopLogger } from '@opentelemetry/core'; import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing'; import { Attributes, Logger } from '@opentelemetry/api'; import { onInit, onShutdown, sendSpans } from './platform/index'; diff --git a/packages/opentelemetry-exporter-collector/src/transform.ts b/packages/opentelemetry-exporter-collector/src/transform.ts index 580434c9908..3f67635ce67 100644 --- a/packages/opentelemetry-exporter-collector/src/transform.ts +++ b/packages/opentelemetry-exporter-collector/src/transform.ts @@ -21,7 +21,6 @@ import { TimedEvent, TraceState, } from '@opentelemetry/api'; -import { SDK_INFO } from '@opentelemetry/base'; import * as core from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from '@opentelemetry/tracing'; @@ -218,8 +217,8 @@ export function toCollectorExportTraceServiceRequest( const instrumentationLibrarySpans: opentelemetryProto.trace.v1.InstrumentationLibrarySpans = { spans: spansToBeSent, instrumentationLibrary: { - name: name || `${SDK_INFO.NAME} - ${SDK_INFO.LANGUAGE}`, - version: SDK_INFO.VERSION, + name: name || `${core.SDK_INFO.NAME} - ${core.SDK_INFO.LANGUAGE}`, + version: core.SDK_INFO.VERSION, }, }; const resourceSpan: opentelemetryProto.trace.v1.ResourceSpans = { diff --git a/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts b/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts index 175222f0e48..749de6b2175 100644 --- a/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { ExportResult } from '@opentelemetry/base'; -import { NoopLogger } from '@opentelemetry/core'; +import { ExportResult, NoopLogger } from '@opentelemetry/core'; import { ReadableSpan } from '@opentelemetry/tracing'; import * as assert from 'assert'; import * as sinon from 'sinon'; diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json index 7cee3b85e07..99ccd8073d8 100644 --- a/packages/opentelemetry-exporter-jaeger/package.json +++ b/packages/opentelemetry-exporter-jaeger/package.json @@ -57,7 +57,6 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/tracing": "^0.7.0", "jaeger-client": "^3.15.0" diff --git a/packages/opentelemetry-exporter-jaeger/src/jaeger.ts b/packages/opentelemetry-exporter-jaeger/src/jaeger.ts index 83f66584925..62d1320b4e9 100644 --- a/packages/opentelemetry-exporter-jaeger/src/jaeger.ts +++ b/packages/opentelemetry-exporter-jaeger/src/jaeger.ts @@ -15,8 +15,7 @@ */ import * as api from '@opentelemetry/api'; -import { ExportResult } from '@opentelemetry/base'; -import { NoopLogger } from '@opentelemetry/core'; +import { ExportResult, NoopLogger } from '@opentelemetry/core'; import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing'; import { Socket } from 'dgram'; import { spanToThrift } from './transform'; diff --git a/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts b/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts index 53105fd3cea..1ff6808a136 100644 --- a/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts +++ b/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts @@ -16,11 +16,10 @@ import * as assert from 'assert'; import { JaegerExporter } from '../src'; -import { NoopLogger } from '@opentelemetry/core'; +import { ExportResult, 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'; import { TraceFlags } from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; diff --git a/packages/opentelemetry-exporter-prometheus/package.json b/packages/opentelemetry-exporter-prometheus/package.json index d8985c4da75..d8c759f1be5 100644 --- a/packages/opentelemetry-exporter-prometheus/package.json +++ b/packages/opentelemetry-exporter-prometheus/package.json @@ -55,7 +55,6 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/metrics": "^0.7.0", "prom-client": "^11.5.3" diff --git a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts index 9d266ecdc17..a9a5b2588dc 100644 --- a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts +++ b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts @@ -14,8 +14,11 @@ * limitations under the License. */ -import { ExportResult } from '@opentelemetry/base'; -import { NoopLogger, hrTimeToMilliseconds } from '@opentelemetry/core'; +import { + ExportResult, + NoopLogger, + hrTimeToMilliseconds, +} from '@opentelemetry/core'; import { CounterSumAggregator, LastValue, diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 394981afa34..5dea64a4fb6 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -55,7 +55,6 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/resources": "^0.7.0", "@opentelemetry/tracing": "^0.7.0" diff --git a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts index 56a06469f20..ca57625fdd2 100644 --- a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts +++ b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts @@ -18,9 +18,8 @@ import * as types from '@opentelemetry/api'; import * as http from 'http'; import * as https from 'https'; import * as url from 'url'; -import { NoopLogger } from '@opentelemetry/core'; +import { ExportResult, NoopLogger } from '@opentelemetry/core'; import { SpanExporter, ReadableSpan } from '@opentelemetry/tracing'; -import { ExportResult } from '@opentelemetry/base'; import * as zipkinTypes from './types'; import { toZipkinSpan, diff --git a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts index bd0105e5536..6f0c06087a2 100644 --- a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts @@ -17,8 +17,11 @@ import * as assert from 'assert'; import * as nock from 'nock'; import { ReadableSpan } from '@opentelemetry/tracing'; -import { ExportResult } from '@opentelemetry/base'; -import { NoopLogger, hrTimeToMicroseconds } from '@opentelemetry/core'; +import { + ExportResult, + NoopLogger, + hrTimeToMicroseconds, +} from '@opentelemetry/core'; import * as types from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import { ZipkinExporter } from '../src'; diff --git a/packages/opentelemetry-metrics/package.json b/packages/opentelemetry-metrics/package.json index 1e7a12497c1..9ea621828e7 100644 --- a/packages/opentelemetry-metrics/package.json +++ b/packages/opentelemetry-metrics/package.json @@ -58,7 +58,6 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/resources": "^0.7.0" } diff --git a/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts b/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts index 0440f895814..90f2f6be5d8 100644 --- a/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts +++ b/packages/opentelemetry-metrics/src/export/ConsoleMetricExporter.ts @@ -15,7 +15,7 @@ */ import { MetricExporter, MetricRecord, Distribution, Histogram } from './types'; -import { ExportResult } from '@opentelemetry/base'; +import { ExportResult } from '@opentelemetry/core'; /** * This is implementation of {@link MetricExporter} that prints metrics data to diff --git a/packages/opentelemetry-metrics/src/export/Controller.ts b/packages/opentelemetry-metrics/src/export/Controller.ts index ccef3213eb6..5ce3d0ee681 100644 --- a/packages/opentelemetry-metrics/src/export/Controller.ts +++ b/packages/opentelemetry-metrics/src/export/Controller.ts @@ -14,10 +14,9 @@ * limitations under the License. */ -import { unrefTimer } from '@opentelemetry/core'; +import { ExportResult, unrefTimer } from '@opentelemetry/core'; import { Meter } from '../Meter'; import { MetricExporter } from './types'; -import { ExportResult } from '@opentelemetry/base'; const DEFAULT_EXPORT_INTERVAL = 60_000; diff --git a/packages/opentelemetry-metrics/src/export/NoopExporter.ts b/packages/opentelemetry-metrics/src/export/NoopExporter.ts index 84eab150b8d..05b3694939a 100644 --- a/packages/opentelemetry-metrics/src/export/NoopExporter.ts +++ b/packages/opentelemetry-metrics/src/export/NoopExporter.ts @@ -15,7 +15,7 @@ */ import { MetricExporter, MetricRecord } from './types'; -import { ExportResult } from '@opentelemetry/base'; +import { ExportResult } from '@opentelemetry/core'; export class NoopExporter implements MetricExporter { // By default does nothing diff --git a/packages/opentelemetry-metrics/src/export/types.ts b/packages/opentelemetry-metrics/src/export/types.ts index 40b631e0269..cffe91bc47c 100644 --- a/packages/opentelemetry-metrics/src/export/types.ts +++ b/packages/opentelemetry-metrics/src/export/types.ts @@ -15,7 +15,7 @@ */ import { ValueType, HrTime, Labels } from '@opentelemetry/api'; -import { ExportResult } from '@opentelemetry/base'; +import { ExportResult } from '@opentelemetry/core'; /** The kind of metric. */ export enum MetricKind { diff --git a/packages/opentelemetry-plugin-xml-http-request/package.json b/packages/opentelemetry-plugin-xml-http-request/package.json index fa1a100e078..b12a130ed7f 100644 --- a/packages/opentelemetry-plugin-xml-http-request/package.json +++ b/packages/opentelemetry-plugin-xml-http-request/package.json @@ -77,7 +77,6 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/web": "^0.7.0", "shimmer": "^1.2.1" diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index 51925febfbb..21b3d4cfed5 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -62,7 +62,7 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", + "@opentelemetry/core": "^0.7.0", "gcp-metadata": "^3.5.0" } } diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index 0a76dad9684..bed19ee739f 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SDK_INFO } from '@opentelemetry/base'; +import { SDK_INFO } from '@opentelemetry/core'; import { TELEMETRY_SDK_RESOURCE } from './constants'; import { ResourceLabels } from './types'; diff --git a/packages/opentelemetry-resources/test/Resource.test.ts b/packages/opentelemetry-resources/test/Resource.test.ts index 2623094817d..4061932532f 100644 --- a/packages/opentelemetry-resources/test/Resource.test.ts +++ b/packages/opentelemetry-resources/test/Resource.test.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import { SDK_INFO } from '@opentelemetry/base'; +import { SDK_INFO } from '@opentelemetry/core'; import { Resource } from '../src'; import { assertTelemetrySDKResource } from './util/resource-assertions'; diff --git a/packages/opentelemetry-resources/test/resource-assertions.test.ts b/packages/opentelemetry-resources/test/resource-assertions.test.ts index d3b0e17957c..2ccff2e1b43 100644 --- a/packages/opentelemetry-resources/test/resource-assertions.test.ts +++ b/packages/opentelemetry-resources/test/resource-assertions.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SDK_INFO } from '@opentelemetry/base'; +import { SDK_INFO } from '@opentelemetry/core'; import { Resource } from '../src/Resource'; import { CLOUD_RESOURCE, diff --git a/packages/opentelemetry-resources/test/util/resource-assertions.ts b/packages/opentelemetry-resources/test/util/resource-assertions.ts index 02332191a16..db33bd76325 100644 --- a/packages/opentelemetry-resources/test/util/resource-assertions.ts +++ b/packages/opentelemetry-resources/test/util/resource-assertions.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SDK_INFO } from '@opentelemetry/base'; +import { SDK_INFO } from '@opentelemetry/core'; import * as assert from 'assert'; import { Resource } from '../../src/Resource'; import { diff --git a/packages/opentelemetry-tracing/package.json b/packages/opentelemetry-tracing/package.json index 13c0d9e29a8..967241ecb8a 100644 --- a/packages/opentelemetry-tracing/package.json +++ b/packages/opentelemetry-tracing/package.json @@ -74,7 +74,6 @@ }, "dependencies": { "@opentelemetry/api": "^0.7.0", - "@opentelemetry/base": "^0.7.0", "@opentelemetry/context-base": "^0.7.0", "@opentelemetry/core": "^0.7.0", "@opentelemetry/resources": "^0.7.0" diff --git a/packages/opentelemetry-tracing/src/export/ConsoleSpanExporter.ts b/packages/opentelemetry-tracing/src/export/ConsoleSpanExporter.ts index 7f5fc968047..42c5875bd6c 100644 --- a/packages/opentelemetry-tracing/src/export/ConsoleSpanExporter.ts +++ b/packages/opentelemetry-tracing/src/export/ConsoleSpanExporter.ts @@ -16,8 +16,7 @@ import { SpanExporter } from './SpanExporter'; import { ReadableSpan } from './ReadableSpan'; -import { ExportResult } from '@opentelemetry/base'; -import { hrTimeToMicroseconds } from '@opentelemetry/core'; +import { ExportResult, hrTimeToMicroseconds } from '@opentelemetry/core'; /** * This is implementation of {@link SpanExporter} that prints spans to the diff --git a/packages/opentelemetry-tracing/src/export/InMemorySpanExporter.ts b/packages/opentelemetry-tracing/src/export/InMemorySpanExporter.ts index 5415075ddb2..b3de120411f 100644 --- a/packages/opentelemetry-tracing/src/export/InMemorySpanExporter.ts +++ b/packages/opentelemetry-tracing/src/export/InMemorySpanExporter.ts @@ -16,7 +16,7 @@ import { SpanExporter } from './SpanExporter'; import { ReadableSpan } from './ReadableSpan'; -import { ExportResult } from '@opentelemetry/base'; +import { ExportResult } from '@opentelemetry/core'; /** * This class can be used for testing purposes. It stores the exported spans diff --git a/packages/opentelemetry-tracing/src/export/SpanExporter.ts b/packages/opentelemetry-tracing/src/export/SpanExporter.ts index 88e191c1ffd..72f7ff25726 100644 --- a/packages/opentelemetry-tracing/src/export/SpanExporter.ts +++ b/packages/opentelemetry-tracing/src/export/SpanExporter.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ExportResult } from '@opentelemetry/base'; +import { ExportResult } from '@opentelemetry/core'; import { ReadableSpan } from './ReadableSpan'; /** diff --git a/packages/opentelemetry-tracing/test/export/InMemorySpanExporter.test.ts b/packages/opentelemetry-tracing/test/export/InMemorySpanExporter.test.ts index cfd215ff884..f83f96ce02f 100644 --- a/packages/opentelemetry-tracing/test/export/InMemorySpanExporter.test.ts +++ b/packages/opentelemetry-tracing/test/export/InMemorySpanExporter.test.ts @@ -20,9 +20,8 @@ import { SimpleSpanProcessor, BasicTracerProvider, } from '../../src'; -import { ExportResult } from '@opentelemetry/base'; import { context } from '@opentelemetry/api'; -import { setActiveSpan } from '@opentelemetry/core'; +import { ExportResult, setActiveSpan } from '@opentelemetry/core'; describe('InMemorySpanExporter', () => { const memoryExporter = new InMemorySpanExporter(); From 8461bdcf38b86cb2413b3fcf95f39827a4b7a9ef Mon Sep 17 00:00:00 2001 From: Mark Wolff Date: Thu, 30 Apr 2020 12:49:25 -0400 Subject: [PATCH 10/27] fix: pluginloader typo (#998) --- packages/opentelemetry-node/src/instrumentation/PluginLoader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-node/src/instrumentation/PluginLoader.ts b/packages/opentelemetry-node/src/instrumentation/PluginLoader.ts index 5517134bc7c..be278696a82 100644 --- a/packages/opentelemetry-node/src/instrumentation/PluginLoader.ts +++ b/packages/opentelemetry-node/src/instrumentation/PluginLoader.ts @@ -120,7 +120,7 @@ export class PluginLoader { } this.logger.info( - `PluginLoader#load: trying loading ${name}@${version}` + `PluginLoader#load: trying to load ${name}@${version}` ); if (!version) return exports; From ea773c8a4fbc9a912205597553a5368273da6fce Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Sat, 2 May 2020 00:29:19 +1200 Subject: [PATCH 11/27] fix(opentracing-shim): register tracer provider for complete traces (#1009) --- examples/opentracing-shim/shim.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/opentracing-shim/shim.js b/examples/opentracing-shim/shim.js index 993445ab268..38e6db223d6 100644 --- a/examples/opentracing-shim/shim.js +++ b/examples/opentracing-shim/shim.js @@ -10,6 +10,8 @@ function shim(serviceName) { const provider = new NodeTracerProvider(); provider.addSpanProcessor(new SimpleSpanProcessor(getExporter(serviceName))); + // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings + provider.register(); return new TracerShim(provider.getTracer('opentracing-shim')); } From 4c29ae9f507224421e5ff1670ceb6c9662c817b3 Mon Sep 17 00:00:00 2001 From: Simon Leigh Date: Sat, 2 May 2020 00:49:01 +1200 Subject: [PATCH 12/27] fix: permission denied error when cloning submodules (#1008) --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 50b83a59cdb..bebf3ea829e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "packages/opentelemetry-exporter-collector/src/platform/node/protos"] path = packages/opentelemetry-exporter-collector/src/platform/node/protos - url = git@github.com:open-telemetry/opentelemetry-proto.git + url = https://github.com/open-telemetry/opentelemetry-proto.git From d246c54dfee458b987368e88f1eff64cb0acf2fb Mon Sep 17 00:00:00 2001 From: Mark Wolff Date: Fri, 1 May 2020 14:07:08 -0400 Subject: [PATCH 13/27] fix: add missing error status handler (#1005) --- packages/opentelemetry-plugin-grpc/src/grpc.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/opentelemetry-plugin-grpc/src/grpc.ts b/packages/opentelemetry-plugin-grpc/src/grpc.ts index f53cd493aea..44efeb2a938 100644 --- a/packages/opentelemetry-plugin-grpc/src/grpc.ts +++ b/packages/opentelemetry-plugin-grpc/src/grpc.ts @@ -297,6 +297,10 @@ export class GrpcPlugin extends BasePlugin { }); call.on('error', (err: grpcTypes.ServiceError) => { + span.setStatus({ + code: _grpcStatusCodeToCanonicalCode(err.code), + message: err.message, + }); span.addEvent('finished with error'); span.setAttributes({ [AttributeNames.GRPC_ERROR_NAME]: err.name, From 6cf5406caf9db2bf0a27302388b43ce6a39c9465 Mon Sep 17 00:00:00 2001 From: Ivan Senic Date: Fri, 1 May 2020 21:21:27 +0200 Subject: [PATCH 14/27] fix(opentelemetry-plugin-xml-http-request): define span kind as CLIENT for xmlhttprequests (#1002) --- .../opentelemetry-plugin-xml-http-request/src/xhr.ts | 1 + .../test/xhr.test.ts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts b/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts index b4009d68618..88eec64ae62 100644 --- a/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts +++ b/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts @@ -316,6 +316,7 @@ export class XMLHttpRequestPlugin extends BasePlugin { } const currentSpan = this._tracer.startSpan(url, { + kind: api.SpanKind.CLIENT, attributes: { [AttributeNames.COMPONENT]: this.component, [AttributeNames.HTTP_METHOD]: method, diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index 52693d840ae..270762ca216 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -210,6 +210,15 @@ describe('xhr', () => { assert.strictEqual(span.name, url, 'span has wrong name'); }); + it('span should have correct kind', () => { + const span: tracing.ReadableSpan = exportSpy.args[0][0][0]; + assert.strictEqual( + span.kind, + types.SpanKind.CLIENT, + 'span has wrong kind' + ); + }); + it('span should have correct attributes', () => { const span: tracing.ReadableSpan = exportSpy.args[0][0][0]; const attributes = span.attributes; From 817397b79799c288f64b9ba9f7c18fc33faeb444 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Fri, 1 May 2020 16:13:19 -0400 Subject: [PATCH 15/27] chore: test on node 14 (#1003) --- .circleci/config.yml | 6 +++--- README.md | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3764a844a51..350ee4946b4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -184,9 +184,9 @@ jobs: - image: node:12 environment: *node_test_env <<: *node_unit_tests - node13: + node14: docker: - - image: node:13 + - image: node:14 environment: *node_test_env <<: *node_unit_tests node12-browsers: @@ -213,6 +213,6 @@ workflows: - node8 - node10 - node12 - - node13 + - node14 - node12-browsers diff --git a/README.md b/README.md index d330f482441..6a1eee3042e 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,25 @@ To get started tracing your own application, see the [Getting Started Guide](get If you are a library author looking to build OpenTelemetry into your library, please see [the documentation][docs]. As a library author, it is important that you only depend on properties and methods published on the public API. If you use any properties or methods from the SDK that are not officially a part of the public API, your library may break if an [Application Owner](#application-owner) uses a different SDK implementation. +## Supported Runtimes + +Platform Version | Supported +---------------- | --------- +Node.JS `v14` | ✅ +Node.JS `v12` | ✅ +Node.JS `v10` | ✅ +Node.JS `v8` | See [Node Support](#node-support) below +Web Browsers | ✅ See [Browser Support](#browser-support) below + +### Node Support +Automated tests are run using the latest release of each currently supported LTS version of Node.JS. +While Node.JS v8 is no longer supported by the Node.JS team, the latest version of Node.JS v8 is still included in our testing suite. +Please note that versions of Node.JS v8 prior to `v8.5.0` will NOT work, because OpenTelemetry Node depends on the `perf_hooks` module introduced in `v8.5.0` + +### Browser Support +Automated browser tests are run in the latest version of Headless Chrome. +There is currently no list of officially supported browsers, but OpenTelemetry is developed using standard web technologies with wide support and should work in currently supported versions of major browsers. + ## Release Schedule OpenTelemetry JS is under active development. From 16ae2a7513a8624ce79dcabe97587a11492fac0a Mon Sep 17 00:00:00 2001 From: Valentin Marchaud Date: Mon, 4 May 2020 23:36:10 +0200 Subject: [PATCH 16/27] feat(metrics): use MetricDescriptor to determine aggregator #989 (#1014) --- packages/opentelemetry-metrics/src/Metric.ts | 8 ++++---- .../opentelemetry-metrics/src/export/Batcher.ts | 15 ++++++++++----- packages/opentelemetry-metrics/test/Meter.test.ts | 3 ++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/opentelemetry-metrics/src/Metric.ts b/packages/opentelemetry-metrics/src/Metric.ts index cd666a210e1..0fce307d6ae 100644 --- a/packages/opentelemetry-metrics/src/Metric.ts +++ b/packages/opentelemetry-metrics/src/Metric.ts @@ -35,7 +35,7 @@ export abstract class Metric protected readonly _disabled: boolean; protected readonly _valueType: api.ValueType; protected readonly _logger: api.Logger; - private readonly _descriptor: MetricDescriptor; + protected readonly _descriptor: MetricDescriptor; private readonly _instruments: Map = new Map(); constructor( @@ -124,7 +124,7 @@ export class CounterMetric extends Metric this._valueType, this._logger, // @todo: consider to set to CounterSumAggregator always. - this._batcher.aggregatorFor(MetricKind.COUNTER) + this._batcher.aggregatorFor(this._descriptor) ); } @@ -161,7 +161,7 @@ export class MeasureMetric extends Metric this._absolute, this._valueType, this._logger, - this._batcher.aggregatorFor(MetricKind.MEASURE) + this._batcher.aggregatorFor(this._descriptor) ); } @@ -191,7 +191,7 @@ export class ObserverMetric extends Metric this._monotonic, this._valueType, this._logger, - this._batcher.aggregatorFor(MetricKind.OBSERVER) + this._batcher.aggregatorFor(this._descriptor) ); } diff --git a/packages/opentelemetry-metrics/src/export/Batcher.ts b/packages/opentelemetry-metrics/src/export/Batcher.ts index 2e09a3a0f59..7b2fbd417f5 100644 --- a/packages/opentelemetry-metrics/src/export/Batcher.ts +++ b/packages/opentelemetry-metrics/src/export/Batcher.ts @@ -19,7 +19,12 @@ import { MeasureExactAggregator, ObserverAggregator, } from './aggregators'; -import { MetricRecord, MetricKind, Aggregator } from './types'; +import { + MetricRecord, + MetricKind, + Aggregator, + MetricDescriptor, +} from './types'; /** * Base class for all batcher types. @@ -31,8 +36,8 @@ import { MetricRecord, MetricKind, Aggregator } from './types'; export abstract class Batcher { protected readonly _batchMap = new Map(); - /** Returns an aggregator based off metric kind. */ - abstract aggregatorFor(metricKind: MetricKind): Aggregator; + /** Returns an aggregator based off metric descriptor. */ + abstract aggregatorFor(metricKind: MetricDescriptor): Aggregator; /** Stores record information to be ready for exporting. */ abstract process(record: MetricRecord): void; @@ -47,8 +52,8 @@ export abstract class Batcher { * passes them for exporting. */ export class UngroupedBatcher extends Batcher { - aggregatorFor(metricKind: MetricKind): Aggregator { - switch (metricKind) { + aggregatorFor(metricDescriptor: MetricDescriptor): Aggregator { + switch (metricDescriptor.metricKind) { case MetricKind.COUNTER: return new CounterSumAggregator(); case MetricKind.OBSERVER: diff --git a/packages/opentelemetry-metrics/test/Meter.test.ts b/packages/opentelemetry-metrics/test/Meter.test.ts index 7de77a69848..77f3cdcdd05 100644 --- a/packages/opentelemetry-metrics/test/Meter.test.ts +++ b/packages/opentelemetry-metrics/test/Meter.test.ts @@ -28,6 +28,7 @@ import { MetricRecord, Aggregator, MetricObservable, + MetricDescriptor, } from '../src'; import * as types from '@opentelemetry/api'; import { NoopLogger, hrTime, hrTimeToNanoseconds } from '@opentelemetry/core'; @@ -566,7 +567,7 @@ class CustomBatcher extends Batcher { process(record: MetricRecord): void { throw new Error('process method not implemented.'); } - aggregatorFor(metricKind: MetricKind): Aggregator { + aggregatorFor(metricKind: MetricDescriptor): Aggregator { throw new Error('aggregatorFor method not implemented.'); } } From b1ea4543e7d1c5b63381411612241de8af1d2397 Mon Sep 17 00:00:00 2001 From: legendecas Date: Wed, 6 May 2020 01:38:12 +0800 Subject: [PATCH 17/27] refactor: normalize namespace import name for @opentelemetry/api (#1016) --- .../opentelemetry-core/src/common/time.ts | 24 ++++----- .../src/trace/TraceState.ts | 4 +- .../test/common/time.test.ts | 12 ++--- .../src/types.ts | 4 +- .../test/jaeger.test.ts | 6 +-- .../test/transform.test.ts | 18 +++---- .../src/export/types.ts | 4 +- .../src/prometheus.ts | 6 +-- .../src/transform.ts | 20 +++---- .../src/types.ts | 4 +- .../src/zipkin.ts | 4 +- .../test/transform.test.ts | 38 +++++++------- .../test/zipkin.test.ts | 14 ++--- .../src/BoundInstrument.ts | 46 ++++++++-------- packages/opentelemetry-metrics/src/Meter.ts | 24 ++++----- .../src/MeterProvider.ts | 6 +-- .../test/Batcher.test.ts | 8 +-- .../opentelemetry-metrics/test/Meter.test.ts | 26 +++++----- .../test/functionals/https-disable.test.ts | 4 +- .../src/types.ts | 6 +-- .../test/xhr.test.ts | 26 ++++------ packages/opentelemetry-tracing/src/Span.ts | 52 +++++++++---------- packages/opentelemetry-web/src/utils.ts | 16 +++--- 23 files changed, 184 insertions(+), 188 deletions(-) diff --git a/packages/opentelemetry-core/src/common/time.ts b/packages/opentelemetry-core/src/common/time.ts index 13416ca2d79..13fdec0450f 100644 --- a/packages/opentelemetry-core/src/common/time.ts +++ b/packages/opentelemetry-core/src/common/time.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { otperformance as performance } from '../platform'; import { TimeOriginLegacy } from './types'; @@ -25,7 +25,7 @@ const SECOND_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS); * Converts a number to HrTime * @param epochMillis */ -function numberToHrtime(epochMillis: number): types.HrTime { +function numberToHrtime(epochMillis: number): api.HrTime { const epochSeconds = epochMillis / 1000; // Decimals only. const seconds = Math.trunc(epochSeconds); @@ -49,7 +49,7 @@ function getTimeOrigin(): number { * Returns an hrtime calculated via performance component. * @param performanceNow */ -export function hrTime(performanceNow?: number): types.HrTime { +export function hrTime(performanceNow?: number): api.HrTime { const timeOrigin = numberToHrtime(getTimeOrigin()); const now = numberToHrtime( typeof performanceNow === 'number' ? performanceNow : performance.now() @@ -72,10 +72,10 @@ export function hrTime(performanceNow?: number): types.HrTime { * Converts a TimeInput to an HrTime, defaults to _hrtime(). * @param time */ -export function timeInputToHrTime(time: types.TimeInput): types.HrTime { +export function timeInputToHrTime(time: api.TimeInput): api.HrTime { // process.hrtime if (isTimeInputHrTime(time)) { - return time as types.HrTime; + return time as api.HrTime; } else if (typeof time === 'number') { // Must be a performance.now() if it's smaller than process start time. if (time < getTimeOrigin()) { @@ -97,9 +97,9 @@ export function timeInputToHrTime(time: types.TimeInput): types.HrTime { * @param endTime */ export function hrTimeDuration( - startTime: types.HrTime, - endTime: types.HrTime -): types.HrTime { + startTime: api.HrTime, + endTime: api.HrTime +): api.HrTime { let seconds = endTime[0] - startTime[0]; let nanos = endTime[1] - startTime[1]; @@ -117,7 +117,7 @@ export function hrTimeDuration( * Convert hrTime to timestamp, for example "2019-05-14T17:00:00.000123456Z" * @param hrTime */ -export function hrTimeToTimeStamp(hrTime: types.HrTime): string { +export function hrTimeToTimeStamp(hrTime: api.HrTime): string { const precision = NANOSECOND_DIGITS; const tmp = `${'0'.repeat(precision)}${hrTime[1]}Z`; const nanoString = tmp.substr(tmp.length - precision - 1); @@ -129,7 +129,7 @@ export function hrTimeToTimeStamp(hrTime: types.HrTime): string { * Convert hrTime to nanoseconds. * @param hrTime */ -export function hrTimeToNanoseconds(hrTime: types.HrTime): number { +export function hrTimeToNanoseconds(hrTime: api.HrTime): number { return hrTime[0] * SECOND_TO_NANOSECONDS + hrTime[1]; } @@ -137,7 +137,7 @@ export function hrTimeToNanoseconds(hrTime: types.HrTime): number { * Convert hrTime to milliseconds. * @param hrTime */ -export function hrTimeToMilliseconds(hrTime: types.HrTime): number { +export function hrTimeToMilliseconds(hrTime: api.HrTime): number { return Math.round(hrTime[0] * 1e3 + hrTime[1] / 1e6); } @@ -145,7 +145,7 @@ export function hrTimeToMilliseconds(hrTime: types.HrTime): number { * Convert hrTime to microseconds. * @param hrTime */ -export function hrTimeToMicroseconds(hrTime: types.HrTime): number { +export function hrTimeToMicroseconds(hrTime: api.HrTime): number { return Math.round(hrTime[0] * 1e6 + hrTime[1] / 1e3); } diff --git a/packages/opentelemetry-core/src/trace/TraceState.ts b/packages/opentelemetry-core/src/trace/TraceState.ts index cb42e83b64d..951b04964be 100644 --- a/packages/opentelemetry-core/src/trace/TraceState.ts +++ b/packages/opentelemetry-core/src/trace/TraceState.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { validateKey, validateValue } from '../internal/validators'; const MAX_TRACE_STATE_ITEMS = 32; @@ -31,7 +31,7 @@ const LIST_MEMBER_KEY_VALUE_SPLITTER = '='; * - The value of any key can be updated. Modified keys MUST be moved to the * beginning of the list. */ -export class TraceState implements types.TraceState { +export class TraceState implements api.TraceState { private _internalState: Map = new Map(); constructor(rawTraceState?: string) { diff --git a/packages/opentelemetry-core/test/common/time.test.ts b/packages/opentelemetry-core/test/common/time.test.ts index 54bfa6e09e3..07c404c8c98 100644 --- a/packages/opentelemetry-core/test/common/time.test.ts +++ b/packages/opentelemetry-core/test/common/time.test.ts @@ -17,7 +17,7 @@ import * as assert from 'assert'; import { otperformance as performance } from '../../src/platform'; import * as sinon from 'sinon'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { hrTime, timeInputToHrTime, @@ -141,16 +141,16 @@ describe('time', () => { describe('#hrTimeDuration', () => { it('should return duration', () => { - const startTime: types.HrTime = [22, 400000000]; - const endTime: types.HrTime = [32, 800000000]; + const startTime: api.HrTime = [22, 400000000]; + const endTime: api.HrTime = [32, 800000000]; const output = hrTimeDuration(startTime, endTime); assert.deepStrictEqual(output, [10, 400000000]); }); it('should handle nanosecond overflow', () => { - const startTime: types.HrTime = [22, 400000000]; - const endTime: types.HrTime = [32, 200000000]; + const startTime: api.HrTime = [22, 400000000]; + const endTime: api.HrTime = [32, 200000000]; const output = hrTimeDuration(startTime, endTime); assert.deepStrictEqual(output, [9, 800000000]); @@ -159,7 +159,7 @@ describe('time', () => { describe('#hrTimeToTimeStamp', () => { it('should return timestamp', () => { - const time: types.HrTime = [1573513121, 123456]; + const time: api.HrTime = [1573513121, 123456]; const output = hrTimeToTimeStamp(time); assert.deepStrictEqual(output, '2019-11-11T22:58:41.000123456Z'); diff --git a/packages/opentelemetry-exporter-jaeger/src/types.ts b/packages/opentelemetry-exporter-jaeger/src/types.ts index c902cfd3095..45987a2ee7d 100644 --- a/packages/opentelemetry-exporter-jaeger/src/types.ts +++ b/packages/opentelemetry-exporter-jaeger/src/types.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; /** * Options for Jaeger configuration */ export interface ExporterConfig { - logger?: types.Logger; + logger?: api.Logger; serviceName: string; tags?: Tag[]; host?: string; // default: 'localhost' diff --git a/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts b/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts index 1ff6808a136..9ceaf1bc982 100644 --- a/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts +++ b/packages/opentelemetry-exporter-jaeger/test/jaeger.test.ts @@ -17,7 +17,7 @@ import * as assert from 'assert'; import { JaegerExporter } from '../src'; import { ExportResult, NoopLogger } from '@opentelemetry/core'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { ThriftProcess } from '../src/types'; import { ReadableSpan } from '@opentelemetry/tracing'; import { TraceFlags } from '@opentelemetry/api'; @@ -130,13 +130,13 @@ describe('JaegerExporter', () => { }; const readableSpan: ReadableSpan = { name: 'my-span1', - kind: types.SpanKind.CLIENT, + kind: api.SpanKind.CLIENT, spanContext, startTime: [1566156729, 709], endTime: [1566156731, 709], ended: true, status: { - code: types.CanonicalCode.DATA_LOSS, + code: api.CanonicalCode.DATA_LOSS, }, attributes: {}, links: [], diff --git a/packages/opentelemetry-exporter-jaeger/test/transform.test.ts b/packages/opentelemetry-exporter-jaeger/test/transform.test.ts index c79fb6d1b65..58477ad0fb4 100644 --- a/packages/opentelemetry-exporter-jaeger/test/transform.test.ts +++ b/packages/opentelemetry-exporter-jaeger/test/transform.test.ts @@ -18,7 +18,7 @@ import * as assert from 'assert'; import { spanToThrift } from '../src/transform'; import { ReadableSpan } from '@opentelemetry/tracing'; import { Resource } from '@opentelemetry/resources'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { ThriftUtils, Utils, ThriftReferenceType } from '../src/types'; import { hrTimeToMicroseconds } from '@opentelemetry/core'; import { TraceFlags } from '@opentelemetry/api'; @@ -34,13 +34,13 @@ describe('transform', () => { it('should convert an OpenTelemetry span to a Thrift', () => { const readableSpan: ReadableSpan = { name: 'my-span', - kind: types.SpanKind.INTERNAL, + kind: api.SpanKind.INTERNAL, spanContext, startTime: [1566156729, 709], endTime: [1566156731, 709], ended: true, status: { - code: types.CanonicalCode.OK, + code: api.CanonicalCode.OK, }, attributes: { testBool: true, @@ -155,13 +155,13 @@ describe('transform', () => { it('should convert an OpenTelemetry span to a Thrift when links, events and attributes are empty', () => { const readableSpan: ReadableSpan = { name: 'my-span1', - kind: types.SpanKind.CLIENT, + kind: api.SpanKind.CLIENT, spanContext, startTime: [1566156729, 709], endTime: [1566156731, 709], ended: true, status: { - code: types.CanonicalCode.DATA_LOSS, + code: api.CanonicalCode.DATA_LOSS, message: 'data loss', }, attributes: {}, @@ -213,13 +213,13 @@ describe('transform', () => { it('should convert an OpenTelemetry span to a Thrift with ThriftReference', () => { const readableSpan: ReadableSpan = { name: 'my-span', - kind: types.SpanKind.INTERNAL, + kind: api.SpanKind.INTERNAL, spanContext, startTime: [1566156729, 709], endTime: [1566156731, 709], ended: true, status: { - code: types.CanonicalCode.OK, + code: api.CanonicalCode.OK, }, attributes: {}, parentSpanId: '3e0c63257de34c92', @@ -255,7 +255,7 @@ describe('transform', () => { it('should left pad trace ids', () => { const readableSpan: ReadableSpan = { name: 'my-span1', - kind: types.SpanKind.CLIENT, + kind: api.SpanKind.CLIENT, spanContext: { traceId: '92b449d5929fda1b', spanId: '6e0c63257de34c92', @@ -265,7 +265,7 @@ describe('transform', () => { endTime: [1566156731, 709], ended: true, status: { - code: types.CanonicalCode.DATA_LOSS, + code: api.CanonicalCode.DATA_LOSS, message: 'data loss', }, attributes: {}, diff --git a/packages/opentelemetry-exporter-prometheus/src/export/types.ts b/packages/opentelemetry-exporter-prometheus/src/export/types.ts index bfdc74cc19f..c3a04f5d531 100644 --- a/packages/opentelemetry-exporter-prometheus/src/export/types.ts +++ b/packages/opentelemetry-exporter-prometheus/src/export/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; /** * Configuration interface for prometheus exporter @@ -49,5 +49,5 @@ export interface ExporterConfig { startServer?: boolean; /** Standard logging interface */ - logger?: types.Logger; + logger?: api.Logger; } diff --git a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts index a9a5b2588dc..9e745f62669 100644 --- a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts +++ b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts @@ -29,7 +29,7 @@ import { ObserverAggregator, Sum, } from '@opentelemetry/metrics'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { createServer, IncomingMessage, Server, ServerResponse } from 'http'; import { Counter, Gauge, labelValues, Metric, Registry } from 'prom-client'; import * as url from 'url'; @@ -44,7 +44,7 @@ export class PrometheusExporter implements MetricExporter { }; private readonly _registry = new Registry(); - private readonly _logger: types.Logger; + private readonly _logger: api.Logger; private readonly _port: number; private readonly _endpoint: string; private readonly _server: Server; @@ -159,7 +159,7 @@ export class PrometheusExporter implements MetricExporter { // TODO: only counter and gauge are implemented in metrics so far } - private _getLabelValues(keys: string[], labels: types.Labels) { + private _getLabelValues(keys: string[], labels: api.Labels) { const labelValues: labelValues = {}; for (let i = 0; i < keys.length; i++) { if (labels[keys[i]] !== null) { diff --git a/packages/opentelemetry-exporter-zipkin/src/transform.ts b/packages/opentelemetry-exporter-zipkin/src/transform.ts index b52e152f7af..b92d3e2f231 100644 --- a/packages/opentelemetry-exporter-zipkin/src/transform.ts +++ b/packages/opentelemetry-exporter-zipkin/src/transform.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { ReadableSpan } from '@opentelemetry/tracing'; import { hrTimeToMicroseconds } from '@opentelemetry/core'; import * as zipkinTypes from './types'; import { Resource } from '@opentelemetry/resources'; const ZIPKIN_SPAN_KIND_MAPPING = { - [types.SpanKind.CLIENT]: zipkinTypes.SpanKind.CLIENT, - [types.SpanKind.SERVER]: zipkinTypes.SpanKind.SERVER, - [types.SpanKind.CONSUMER]: zipkinTypes.SpanKind.CONSUMER, - [types.SpanKind.PRODUCER]: zipkinTypes.SpanKind.PRODUCER, + [api.SpanKind.CLIENT]: zipkinTypes.SpanKind.CLIENT, + [api.SpanKind.SERVER]: zipkinTypes.SpanKind.SERVER, + [api.SpanKind.CONSUMER]: zipkinTypes.SpanKind.CONSUMER, + [api.SpanKind.PRODUCER]: zipkinTypes.SpanKind.PRODUCER, // When absent, the span is local. - [types.SpanKind.INTERNAL]: undefined, + [api.SpanKind.INTERNAL]: undefined, }; export const statusCodeTagName = 'ot.status_code'; @@ -68,8 +68,8 @@ export function toZipkinSpan( /** Converts OpenTelemetry Attributes and Status to Zipkin Tags format. */ export function _toZipkinTags( - attributes: types.Attributes, - status: types.Status, + attributes: api.Attributes, + status: api.Status, statusCodeTagName: string, statusDescriptionTagName: string, resource: Resource @@ -78,7 +78,7 @@ export function _toZipkinTags( for (const key of Object.keys(attributes)) { tags[key] = String(attributes[key]); } - tags[statusCodeTagName] = String(types.CanonicalCode[status.code]); + tags[statusCodeTagName] = String(api.CanonicalCode[status.code]); if (status.message) { tags[statusDescriptionTagName] = status.message; } @@ -94,7 +94,7 @@ export function _toZipkinTags( * Converts OpenTelemetry Events to Zipkin Annotations format. */ export function _toZipkinAnnotations( - events: types.TimedEvent[] + events: api.TimedEvent[] ): zipkinTypes.Annotation[] { return events.map(event => ({ timestamp: hrTimeToMicroseconds(event.time), diff --git a/packages/opentelemetry-exporter-zipkin/src/types.ts b/packages/opentelemetry-exporter-zipkin/src/types.ts index 343faf09b64..051673d5829 100644 --- a/packages/opentelemetry-exporter-zipkin/src/types.ts +++ b/packages/opentelemetry-exporter-zipkin/src/types.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; /** * Exporter config */ export interface ExporterConfig { - logger?: types.Logger; + logger?: api.Logger; serviceName: string; url?: string; // Optional mapping overrides for OpenTelemetry status code and description. diff --git a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts index ca57625fdd2..39906b3d76d 100644 --- a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts +++ b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import * as http from 'http'; import * as https from 'https'; import * as url from 'url'; @@ -32,7 +32,7 @@ import { OT_REQUEST_HEADER } from './utils'; */ export class ZipkinExporter implements SpanExporter { static readonly DEFAULT_URL = 'http://localhost:9411/api/v2/spans'; - private readonly _logger: types.Logger; + private readonly _logger: api.Logger; private readonly _serviceName: string; private readonly _statusCodeTagName: string; private readonly _statusDescriptionTagName: string; diff --git a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts index 6f5854d2e6b..60761e67797 100644 --- a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { Span, BasicTracerProvider } from '@opentelemetry/tracing'; import { NoopLogger, @@ -38,10 +38,10 @@ const tracer = new BasicTracerProvider({ logger, }).getTracer('default'); const parentId = '5c1c63257de34c67'; -const spanContext: types.SpanContext = { +const spanContext: api.SpanContext = { traceId: 'd4cda95b652f4a1592b449d5929fda1b', spanId: '6e0c63257de34c92', - traceFlags: types.TraceFlags.SAMPLED, + traceFlags: api.TraceFlags.SAMPLED, }; const DUMMY_RESOUCE = new Resource({ @@ -57,7 +57,7 @@ describe('transform', () => { tracer, 'my-span', spanContext, - types.SpanKind.SERVER, + api.SpanKind.SERVER, parentId ); span.setAttributes({ @@ -107,7 +107,7 @@ describe('transform', () => { tracer, 'my-span', spanContext, - types.SpanKind.SERVER + api.SpanKind.SERVER ); span.end(); @@ -141,14 +141,14 @@ describe('transform', () => { }); // SpanKind mapping tests [ - { ot: types.SpanKind.CLIENT, zipkin: 'CLIENT' }, - { ot: types.SpanKind.SERVER, zipkin: 'SERVER' }, - { ot: types.SpanKind.CONSUMER, zipkin: 'CONSUMER' }, - { ot: types.SpanKind.PRODUCER, zipkin: 'PRODUCER' }, - { ot: types.SpanKind.INTERNAL, zipkin: undefined }, + { ot: api.SpanKind.CLIENT, zipkin: 'CLIENT' }, + { ot: api.SpanKind.SERVER, zipkin: 'SERVER' }, + { ot: api.SpanKind.CONSUMER, zipkin: 'CONSUMER' }, + { ot: api.SpanKind.PRODUCER, zipkin: 'PRODUCER' }, + { ot: api.SpanKind.INTERNAL, zipkin: undefined }, ].forEach(item => it(`should map OpenTelemetry SpanKind ${ - types.SpanKind[item.ot] + api.SpanKind[item.ot] } to Zipkin ${item.zipkin}`, () => { const span = new Span(tracer, 'my-span', spanContext, item.ot); span.end(); @@ -190,7 +190,7 @@ describe('transform', () => { tracer, 'my-span', spanContext, - types.SpanKind.SERVER, + api.SpanKind.SERVER, parentId ); span.setAttributes({ @@ -219,11 +219,11 @@ describe('transform', () => { tracer, 'my-span', spanContext, - types.SpanKind.SERVER, + api.SpanKind.SERVER, parentId ); - const status: types.Status = { - code: types.CanonicalCode.ABORTED, + const status: api.Status = { + code: api.CanonicalCode.ABORTED, }; span.setStatus(status); span.setAttributes({ @@ -249,11 +249,11 @@ describe('transform', () => { tracer, 'my-span', spanContext, - types.SpanKind.SERVER, + api.SpanKind.SERVER, parentId ); - const status: types.Status = { - code: types.CanonicalCode.ABORTED, + const status: api.Status = { + code: api.CanonicalCode.ABORTED, message: 'my-message', }; span.setStatus(status); @@ -284,7 +284,7 @@ describe('transform', () => { tracer, 'my-span', spanContext, - types.SpanKind.SERVER, + api.SpanKind.SERVER, parentId ); span.addEvent('my-event1'); diff --git a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts index 6f0c06087a2..2adbca51e58 100644 --- a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts @@ -22,7 +22,7 @@ import { NoopLogger, hrTimeToMicroseconds, } from '@opentelemetry/core'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import { ZipkinExporter } from '../src'; import * as zipkinTypes from '../src/types'; @@ -36,7 +36,7 @@ function getReadableSpan() { const duration = 2000; const readableSpan: ReadableSpan = { name: 'my-span', - kind: types.SpanKind.INTERNAL, + kind: api.SpanKind.INTERNAL, spanContext: { traceId: 'd4cda95b652f4a1592b449d5929fda1b', spanId: '6e0c63257de34c92', @@ -47,7 +47,7 @@ function getReadableSpan() { ended: true, duration: [duration, 0], status: { - code: types.CanonicalCode.OK, + code: api.CanonicalCode.OK, }, attributes: {}, links: [], @@ -133,7 +133,7 @@ describe('ZipkinExporter', () => { const span1: ReadableSpan = { name: 'my-span', - kind: types.SpanKind.INTERNAL, + kind: api.SpanKind.INTERNAL, parentSpanId, spanContext: { traceId: 'd4cda95b652f4a1592b449d5929fda1b', @@ -145,7 +145,7 @@ describe('ZipkinExporter', () => { ended: true, duration: [duration, 0], status: { - code: types.CanonicalCode.OK, + code: api.CanonicalCode.OK, }, attributes: { key1: 'value1', @@ -163,7 +163,7 @@ describe('ZipkinExporter', () => { }; const span2: ReadableSpan = { name: 'my-span', - kind: types.SpanKind.SERVER, + kind: api.SpanKind.SERVER, spanContext: { traceId: 'd4cda95b652f4a1592b449d5929fda1b', spanId: '6e0c63257de34c92', @@ -174,7 +174,7 @@ describe('ZipkinExporter', () => { ended: true, duration: [duration, 0], status: { - code: types.CanonicalCode.OK, + code: api.CanonicalCode.OK, }, attributes: {}, links: [], diff --git a/packages/opentelemetry-metrics/src/BoundInstrument.ts b/packages/opentelemetry-metrics/src/BoundInstrument.ts index e7db73dd401..94338a29eb4 100644 --- a/packages/opentelemetry-metrics/src/BoundInstrument.ts +++ b/packages/opentelemetry-metrics/src/BoundInstrument.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { Aggregator } from './export/types'; import { ObserverResult } from './ObserverResult'; @@ -23,16 +23,16 @@ import { ObserverResult } from './ObserverResult'; * the TimeSeries. */ export class BaseBoundInstrument { - protected _labels: types.Labels; - protected _logger: types.Logger; + protected _labels: api.Labels; + protected _logger: api.Logger; protected _monotonic: boolean; constructor( - labels: types.Labels, - logger: types.Logger, + labels: api.Labels, + logger: api.Logger, monotonic: boolean, private readonly _disabled: boolean, - private readonly _valueType: types.ValueType, + private readonly _valueType: api.ValueType, private readonly _aggregator: Aggregator ) { this._labels = labels; @@ -43,7 +43,7 @@ export class BaseBoundInstrument { update(value: number): void { if (this._disabled) return; - if (this._valueType === types.ValueType.INT && !Number.isInteger(value)) { + if (this._valueType === api.ValueType.INT && !Number.isInteger(value)) { this._logger.warn( `INT value type cannot accept a floating-point value for ${Object.values( this._labels @@ -55,7 +55,7 @@ export class BaseBoundInstrument { this._aggregator.update(value); } - getLabels(): types.Labels { + getLabels(): api.Labels { return this._labels; } @@ -69,13 +69,13 @@ export class BaseBoundInstrument { * value of single instrument in the `Counter` associated with specified Labels. */ export class BoundCounter extends BaseBoundInstrument - implements types.BoundCounter { + implements api.BoundCounter { constructor( - labels: types.Labels, + labels: api.Labels, disabled: boolean, monotonic: boolean, - valueType: types.ValueType, - logger: types.Logger, + valueType: api.ValueType, + logger: api.Logger, aggregator: Aggregator ) { super(labels, logger, monotonic, disabled, valueType, aggregator); @@ -97,16 +97,16 @@ export class BoundCounter extends BaseBoundInstrument * BoundMeasure is an implementation of the {@link BoundMeasure} interface. */ export class BoundMeasure extends BaseBoundInstrument - implements types.BoundMeasure { + implements api.BoundMeasure { private readonly _absolute: boolean; constructor( - labels: types.Labels, + labels: api.Labels, disabled: boolean, monotonic: boolean, absolute: boolean, - valueType: types.ValueType, - logger: types.Logger, + valueType: api.ValueType, + logger: api.Logger, aggregator: Aggregator ) { super(labels, logger, monotonic, disabled, valueType, aggregator); @@ -115,8 +115,8 @@ export class BoundMeasure extends BaseBoundInstrument record( value: number, - correlationContext?: types.CorrelationContext, - spanContext?: types.SpanContext + correlationContext?: api.CorrelationContext, + spanContext?: api.SpanContext ): void { if (this._absolute && value < 0) { this._logger.error( @@ -135,19 +135,19 @@ export class BoundMeasure extends BaseBoundInstrument * BoundObserver is an implementation of the {@link BoundObserver} interface. */ export class BoundObserver extends BaseBoundInstrument - implements types.BoundObserver { + implements api.BoundObserver { constructor( - labels: types.Labels, + labels: api.Labels, disabled: boolean, monotonic: boolean, - valueType: types.ValueType, - logger: types.Logger, + valueType: api.ValueType, + logger: api.Logger, aggregator: Aggregator ) { super(labels, logger, monotonic, disabled, valueType, aggregator); } - setCallback(callback: (observerResult: types.ObserverResult) => void): void { + setCallback(callback: (observerResult: api.ObserverResult) => void): void { const observerResult = new ObserverResult(); callback(observerResult); } diff --git a/packages/opentelemetry-metrics/src/Meter.ts b/packages/opentelemetry-metrics/src/Meter.ts index 091a96b435d..425af55c20c 100644 --- a/packages/opentelemetry-metrics/src/Meter.ts +++ b/packages/opentelemetry-metrics/src/Meter.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { ConsoleLogger } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { BaseBoundInstrument } from './BoundInstrument'; @@ -32,8 +32,8 @@ import { NoopExporter } from './export/NoopExporter'; /** * Meter is an implementation of the {@link Meter} interface. */ -export class Meter implements types.Meter { - private readonly _logger: types.Logger; +export class Meter implements api.Meter { + private readonly _logger: api.Logger; private readonly _metrics = new Map>(); private readonly _batcher: Batcher; private readonly _resource: Resource; @@ -58,13 +58,13 @@ export class Meter implements types.Meter { */ createMeasure( name: string, - options?: types.MetricOptions - ): types.Metric { + options?: api.MetricOptions + ): api.Metric { if (!this._isValidName(name)) { this._logger.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return types.NOOP_MEASURE_METRIC; + return api.NOOP_MEASURE_METRIC; } const opt: MetricOptions = { absolute: true, // Measures are defined as absolute by default @@ -88,13 +88,13 @@ export class Meter implements types.Meter { */ createCounter( name: string, - options?: types.MetricOptions - ): types.Metric { + options?: api.MetricOptions + ): api.Metric { if (!this._isValidName(name)) { this._logger.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return types.NOOP_COUNTER_METRIC; + return api.NOOP_COUNTER_METRIC; } const opt: MetricOptions = { monotonic: true, // Counters are defined as monotonic by default @@ -115,13 +115,13 @@ export class Meter implements types.Meter { */ createObserver( name: string, - options?: types.MetricOptions - ): types.Metric { + options?: api.MetricOptions + ): api.Metric { if (!this._isValidName(name)) { this._logger.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return types.NOOP_OBSERVER_METRIC; + return api.NOOP_OBSERVER_METRIC; } const opt: MetricOptions = { monotonic: false, // Observers are defined as non-monotonic by default diff --git a/packages/opentelemetry-metrics/src/MeterProvider.ts b/packages/opentelemetry-metrics/src/MeterProvider.ts index 09bd9f8e66a..4bb0d33928a 100644 --- a/packages/opentelemetry-metrics/src/MeterProvider.ts +++ b/packages/opentelemetry-metrics/src/MeterProvider.ts @@ -15,7 +15,7 @@ */ import { ConsoleLogger } from '@opentelemetry/core'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import { Meter } from '.'; import { DEFAULT_CONFIG, MeterConfig } from './types'; @@ -23,10 +23,10 @@ import { DEFAULT_CONFIG, MeterConfig } from './types'; /** * This class represents a meter provider which platform libraries can extend */ -export class MeterProvider implements types.MeterProvider { +export class MeterProvider implements api.MeterProvider { private readonly _meters: Map = new Map(); readonly resource: Resource = Resource.createTelemetrySDKResource(); - readonly logger: types.Logger; + readonly logger: api.Logger; constructor(private _config: MeterConfig = DEFAULT_CONFIG) { this.logger = _config.logger || new ConsoleLogger(_config.logLevel); diff --git a/packages/opentelemetry-metrics/test/Batcher.test.ts b/packages/opentelemetry-metrics/test/Batcher.test.ts index c09998bd32d..5c2e00b3fbe 100644 --- a/packages/opentelemetry-metrics/test/Batcher.test.ts +++ b/packages/opentelemetry-metrics/test/Batcher.test.ts @@ -15,16 +15,16 @@ */ import * as assert from 'assert'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { Meter, MeterProvider } from '../src'; describe('Batcher', () => { describe('Ungrouped', () => { let meter: Meter; - let fooCounter: types.BoundCounter; - let barCounter: types.BoundCounter; - let counter: types.Metric; + let fooCounter: api.BoundCounter; + let barCounter: api.BoundCounter; + let counter: api.Metric; beforeEach(() => { meter = new MeterProvider({ logger: new NoopLogger(), diff --git a/packages/opentelemetry-metrics/test/Meter.test.ts b/packages/opentelemetry-metrics/test/Meter.test.ts index 77f3cdcdd05..ffa85fe6345 100644 --- a/packages/opentelemetry-metrics/test/Meter.test.ts +++ b/packages/opentelemetry-metrics/test/Meter.test.ts @@ -30,7 +30,7 @@ import { MetricObservable, MetricDescriptor, } from '../src'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { NoopLogger, hrTime, hrTimeToNanoseconds } from '@opentelemetry/core'; import { CounterSumAggregator, @@ -45,7 +45,7 @@ describe('Meter', () => { let meter: Meter; const keya = 'keya'; const keyb = 'keyb'; - const labels: types.Labels = { [keyb]: 'value2', [keya]: 'value1' }; + const labels: api.Labels = { [keyb]: 'value2', [keya]: 'value1' }; beforeEach(() => { meter = new MeterProvider({ @@ -200,7 +200,7 @@ describe('Meter', () => { // should skip below metric const counter2 = meter.createCounter('name1', { - valueType: types.ValueType.INT, + valueType: api.ValueType.INT, }) as CounterMetric; counter2.bind(labels).add(500); @@ -233,19 +233,19 @@ describe('Meter', () => { it('should return no op metric if name is an empty string', () => { const counter = meter.createCounter(''); - assert.ok(counter instanceof types.NoopMetric); + assert.ok(counter instanceof api.NoopMetric); }); it('should return no op metric if name does not start with a letter', () => { const counter1 = meter.createCounter('1name'); const counter_ = meter.createCounter('_name'); - assert.ok(counter1 instanceof types.NoopMetric); - assert.ok(counter_ instanceof types.NoopMetric); + assert.ok(counter1 instanceof api.NoopMetric); + assert.ok(counter_ instanceof api.NoopMetric); }); it('should return no op metric if name is an empty string contain only letters, numbers, ".", "_", and "-"', () => { const counter = meter.createCounter('name with invalid characters^&*('); - assert.ok(counter instanceof types.NoopMetric); + assert.ok(counter instanceof api.NoopMetric); }); }); }); @@ -292,19 +292,19 @@ describe('Meter', () => { describe('names', () => { it('should return no op metric if name is an empty string', () => { const measure = meter.createMeasure(''); - assert.ok(measure instanceof types.NoopMetric); + assert.ok(measure instanceof api.NoopMetric); }); it('should return no op metric if name does not start with a letter', () => { const measure1 = meter.createMeasure('1name'); const measure_ = meter.createMeasure('_name'); - assert.ok(measure1 instanceof types.NoopMetric); - assert.ok(measure_ instanceof types.NoopMetric); + assert.ok(measure1 instanceof api.NoopMetric); + assert.ok(measure_ instanceof api.NoopMetric); }); it('should return no op metric if name is an empty string contain only letters, numbers, ".", "_", and "-"', () => { const measure = meter.createMeasure('name with invalid characters^&*('); - assert.ok(measure instanceof types.NoopMetric); + assert.ok(measure instanceof api.NoopMetric); }); }); @@ -455,7 +455,7 @@ describe('Meter', () => { const metricObservable = new MetricObservable(); - measure.setCallback((observerResult: types.ObserverResult) => { + measure.setCallback((observerResult: api.ObserverResult) => { observerResult.observe(getCpuUsage, { pid: '123', core: '1' }); observerResult.observe(getCpuUsage, { pid: '123', core: '2' }); observerResult.observe(getCpuUsage, { pid: '123', core: '3' }); @@ -527,7 +527,7 @@ describe('Meter', () => { const counter = meter.createCounter('counter', { description: 'test', labelKeys: [key], - valueType: types.ValueType.INT, + valueType: api.ValueType.INT, }); const labels = { [key]: 'counter-value' }; const boundCounter = counter.bind(labels); diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts index 572ea6ea1a9..d323be77ba7 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts @@ -25,7 +25,7 @@ import * as sinon from 'sinon'; import { plugin } from '../../src/https'; import { httpsRequest } from '../utils/httpsRequest'; import { NodeTracerProvider } from '@opentelemetry/node'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; describe('HttpsPlugin', () => { let server: https.Server; @@ -37,7 +37,7 @@ describe('HttpsPlugin', () => { logger, }); // const tracer = provider.getTracer('test-https') - let tracer: types.Tracer; + let tracer: api.Tracer; before(() => { nock.cleanAll(); nock.enableNetConnect(); diff --git a/packages/opentelemetry-plugin-xml-http-request/src/types.ts b/packages/opentelemetry-plugin-xml-http-request/src/types.ts index c8b36457cf4..0fb63f676ac 100644 --- a/packages/opentelemetry-plugin-xml-http-request/src/types.ts +++ b/packages/opentelemetry-plugin-xml-http-request/src/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; /** * method "open" from XMLHttpRequest @@ -51,11 +51,11 @@ export interface XhrMem { status?: number; statusText?: string; // span assigned to xhr - span: types.Span; + span: api.Span; // span url - not available on types.Span spanUrl?: string; // startTime of send function - used to filter cors preflight requests - sendStartTime?: types.HrTime; + sendStartTime?: api.HrTime; // resources created between send and end plus some additional timeout createdResources?: { observer: PerformanceObserver; diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index 270762ca216..08b0b209eea 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { B3Propagator, LogLevel, @@ -101,23 +101,23 @@ describe('xhr', () => { beforeEach(() => { contextManager = new ZoneContextManager().enable(); - types.context.setGlobalContextManager(contextManager); + api.context.setGlobalContextManager(contextManager); }); afterEach(() => { - types.context.disable(); + api.context.disable(); }); before(() => { - types.propagation.setGlobalPropagator(new B3Propagator()); + api.propagation.setGlobalPropagator(new B3Propagator()); }); describe('when request is successful', () => { - let webTracerWithZone: types.Tracer; + let webTracerWithZone: api.Tracer; let webTracerProviderWithZone: WebTracerProvider; let dummySpanExporter: DummySpanExporter; let exportSpy: any; - let rootSpan: types.Span; + let rootSpan: api.Span; let spyEntries: any; const url = `${window.location.origin}/xml-http-request.js`; let fakeNow = 0; @@ -212,11 +212,7 @@ describe('xhr', () => { it('span should have correct kind', () => { const span: tracing.ReadableSpan = exportSpy.args[0][0][0]; - assert.strictEqual( - span.kind, - types.SpanKind.CLIENT, - 'span has wrong kind' - ); + assert.strictEqual(span.kind, api.SpanKind.CLIENT, 'span has wrong kind'); }); it('span should have correct attributes', () => { @@ -335,7 +331,7 @@ describe('xhr', () => { describe('AND origin match with window.location', () => { it('should set trace headers', () => { - const span: types.Span = exportSpy.args[0][0][0]; + const span: api.Span = exportSpy.args[0][0][0]; assert.strictEqual( requests[0].requestHeaders[X_B3_TRACE_ID], span.context().traceId, @@ -367,7 +363,7 @@ describe('xhr', () => { ); }); it('should set trace headers', () => { - const span: types.Span = exportSpy.args[0][0][0]; + const span: api.Span = exportSpy.args[0][0][0]; assert.strictEqual( requests[0].requestHeaders[X_B3_TRACE_ID], span.context().traceId, @@ -420,10 +416,10 @@ describe('xhr', () => { describe('when request is NOT successful', () => { let webTracerWithZoneProvider: WebTracerProvider; - let webTracerWithZone: types.Tracer; + let webTracerWithZone: api.Tracer; let dummySpanExporter: DummySpanExporter; let exportSpy: any; - let rootSpan: types.Span; + let rootSpan: api.Span; let spyEntries: any; const url = 'https://raw.githubusercontent.com/open-telemetry/opentelemetry-js/master/package.json'; diff --git a/packages/opentelemetry-tracing/src/Span.ts b/packages/opentelemetry-tracing/src/Span.ts index 4028564a4d0..c2f08461d5a 100644 --- a/packages/opentelemetry-tracing/src/Span.ts +++ b/packages/opentelemetry-tracing/src/Span.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { hrTime, hrTimeDuration, @@ -30,25 +30,25 @@ import { TraceParams } from './types'; /** * This class represents a span. */ -export class Span implements types.Span, ReadableSpan { +export class Span implements api.Span, ReadableSpan { // Below properties are included to implement ReadableSpan for export // purposes but are not intended to be written-to directly. - readonly spanContext: types.SpanContext; - readonly kind: types.SpanKind; + readonly spanContext: api.SpanContext; + readonly kind: api.SpanKind; readonly parentSpanId?: string; - readonly attributes: types.Attributes = {}; - readonly links: types.Link[] = []; - readonly events: types.TimedEvent[] = []; - readonly startTime: types.HrTime; + readonly attributes: api.Attributes = {}; + readonly links: api.Link[] = []; + readonly events: api.TimedEvent[] = []; + readonly startTime: api.HrTime; readonly resource: Resource; name: string; - status: types.Status = { - code: types.CanonicalCode.OK, + status: api.Status = { + code: api.CanonicalCode.OK, }; - endTime: types.HrTime = [0, 0]; + endTime: api.HrTime = [0, 0]; private _ended = false; - private _duration: types.HrTime = [-1, -1]; - private readonly _logger: types.Logger; + private _duration: api.HrTime = [-1, -1]; + private readonly _logger: api.Logger; private readonly _spanProcessor: SpanProcessor; private readonly _traceParams: TraceParams; @@ -56,11 +56,11 @@ export class Span implements types.Span, ReadableSpan { constructor( parentTracer: Tracer, spanName: string, - spanContext: types.SpanContext, - kind: types.SpanKind, + spanContext: api.SpanContext, + kind: api.SpanKind, parentSpanId?: string, - links: types.Link[] = [], - startTime: types.TimeInput = hrTime() + links: api.Link[] = [], + startTime: api.TimeInput = hrTime() ) { this.name = spanName; this.spanContext = spanContext; @@ -75,7 +75,7 @@ export class Span implements types.Span, ReadableSpan { this._spanProcessor.onStart(this); } - context(): types.SpanContext { + context(): api.SpanContext { return this.spanContext; } @@ -98,7 +98,7 @@ export class Span implements types.Span, ReadableSpan { return this; } - setAttributes(attributes: types.Attributes): this { + setAttributes(attributes: api.Attributes): this { Object.keys(attributes).forEach(key => { this.setAttribute(key, attributes[key]); }); @@ -114,8 +114,8 @@ export class Span implements types.Span, ReadableSpan { */ addEvent( name: string, - attributesOrStartTime?: types.Attributes | types.TimeInput, - startTime?: types.TimeInput + attributesOrStartTime?: api.Attributes | api.TimeInput, + startTime?: api.TimeInput ): this { if (this._isSpanEnded()) return this; if (this.events.length >= this._traceParams.numberOfEventsPerSpan!) { @@ -124,7 +124,7 @@ export class Span implements types.Span, ReadableSpan { } if (isTimeInput(attributesOrStartTime)) { if (typeof startTime === 'undefined') { - startTime = attributesOrStartTime as types.TimeInput; + startTime = attributesOrStartTime as api.TimeInput; } attributesOrStartTime = undefined; } @@ -133,13 +133,13 @@ export class Span implements types.Span, ReadableSpan { } this.events.push({ name, - attributes: attributesOrStartTime as types.Attributes, + attributes: attributesOrStartTime as api.Attributes, time: timeInputToHrTime(startTime), }); return this; } - setStatus(status: types.Status): this { + setStatus(status: api.Status): this { if (this._isSpanEnded()) return this; this.status = status; return this; @@ -151,7 +151,7 @@ export class Span implements types.Span, ReadableSpan { return this; } - end(endTime: types.TimeInput = hrTime()): void { + end(endTime: api.TimeInput = hrTime()): void { if (this._isSpanEnded()) { this._logger.error('You can only call end() on a span once.'); return; @@ -179,7 +179,7 @@ export class Span implements types.Span, ReadableSpan { return this; } - get duration(): types.HrTime { + get duration(): api.HrTime { return this._duration; } diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 0beec8d9f0b..e5a3cd43fed 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -16,7 +16,7 @@ import { PerformanceEntries, PerformanceResourceTimingInfo } from './types'; import { PerformanceTimingNames as PTN } from './enums/PerformanceTimingNames'; -import * as types from '@opentelemetry/api'; +import * as api from '@opentelemetry/api'; import { hrTimeToNanoseconds, timeInputToHrTime } from '@opentelemetry/core'; /** @@ -35,10 +35,10 @@ export function hasKey(obj: O, key: keyof any): key is keyof O { * @param entries */ export function addSpanNetworkEvent( - span: types.Span, + span: api.Span, performanceName: string, entries: PerformanceEntries -): types.Span | undefined { +): api.Span | undefined { if ( hasKey(entries, performanceName) && typeof entries[performanceName] === 'number' @@ -82,8 +82,8 @@ export function sortResources(filteredResources: PerformanceResourceTiming[]) { */ export function getResource( spanUrl: string, - startTimeHR: types.HrTime, - endTimeHR: types.HrTime, + startTimeHR: api.HrTime, + endTimeHR: api.HrTime, resources: PerformanceResourceTiming[], ignoredResources: WeakSet = new WeakSet< PerformanceResourceTiming @@ -147,7 +147,7 @@ export function getResource( function findMainRequest( resources: PerformanceResourceTiming[], corsPreFlightRequestEndTime: number, - spanEndTimeHR: types.HrTime + spanEndTimeHR: api.HrTime ): PerformanceResourceTiming { const spanEndTime = hrTimeToNanoseconds(spanEndTimeHR); const minTime = hrTimeToNanoseconds( @@ -189,8 +189,8 @@ function findMainRequest( */ function filterResourcesForSpan( spanUrl: string, - startTimeHR: types.HrTime, - endTimeHR: types.HrTime, + startTimeHR: api.HrTime, + endTimeHR: api.HrTime, resources: PerformanceResourceTiming[], ignoredResources: WeakSet ) { From a5444dcaeb5aba9a07d533b4fca7e149bc7dab93 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Tue, 5 May 2020 16:25:22 -0400 Subject: [PATCH 18/27] fix: left pad short b3 trace identifiers (#1021) --- .../src/context/propagation/B3Propagator.ts | 11 ++++++++--- .../test/context/B3Propagator.test.ts | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts index 9a6f38f67d5..27689c5de9f 100644 --- a/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts +++ b/packages/opentelemetry-core/src/context/propagation/B3Propagator.ts @@ -26,7 +26,7 @@ import { getParentSpanContext, setExtractedSpanContext } from '../context'; export const X_B3_TRACE_ID = 'x-b3-traceid'; export const X_B3_SPAN_ID = 'x-b3-spanid'; export const X_B3_SAMPLED = 'x-b3-sampled'; -const VALID_TRACEID_REGEX = /^[0-9a-f]{32}$/i; +const VALID_TRACEID_REGEX = /^([0-9a-f]{16}){1,2}$/i; const VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i; const INVALID_ID_REGEX = /^0+$/i; @@ -72,16 +72,21 @@ export class B3Propagator implements HttpTextPropagator { const traceIdHeader = getter(carrier, X_B3_TRACE_ID); const spanIdHeader = getter(carrier, X_B3_SPAN_ID); const sampledHeader = getter(carrier, X_B3_SAMPLED); - const traceId = Array.isArray(traceIdHeader) + + const traceIdHeaderValue = Array.isArray(traceIdHeader) ? traceIdHeader[0] : traceIdHeader; const spanId = Array.isArray(spanIdHeader) ? spanIdHeader[0] : spanIdHeader; + const options = Array.isArray(sampledHeader) ? sampledHeader[0] : sampledHeader; - if (typeof traceId !== 'string' || typeof spanId !== 'string') + if (typeof traceIdHeaderValue !== 'string' || typeof spanId !== 'string') { return context; + } + + const traceId = traceIdHeaderValue.padStart(32, '0'); if (isValidTraceId(traceId) && isValidSpanId(spanId)) { return setExtractedSpanContext(context, { diff --git a/packages/opentelemetry-core/test/context/B3Propagator.test.ts b/packages/opentelemetry-core/test/context/B3Propagator.test.ts index f403bc72a08..7b779c3b949 100644 --- a/packages/opentelemetry-core/test/context/B3Propagator.test.ts +++ b/packages/opentelemetry-core/test/context/B3Propagator.test.ts @@ -289,5 +289,21 @@ describe('B3Propagator', () => { assert.ok(ctx2 === Context.ROOT_CONTEXT); assert.ok(ctx3 === Context.ROOT_CONTEXT); }); + + it('should left-pad 64 bit trace ids with 0', () => { + carrier[X_B3_TRACE_ID] = '8448eb211c80319c'; + carrier[X_B3_SPAN_ID] = 'b7ad6b7169203331'; + carrier[X_B3_SAMPLED] = '1'; + const extractedSpanContext = getExtractedSpanContext( + b3Propagator.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ); + + assert.deepStrictEqual(extractedSpanContext, { + spanId: 'b7ad6b7169203331', + traceId: '00000000000000008448eb211c80319c', + isRemote: true, + traceFlags: TraceFlags.SAMPLED, + }); + }); }); }); From e2205ef906f1f70a2cc02cc89c79d735df780761 Mon Sep 17 00:00:00 2001 From: legendecas Date: Wed, 6 May 2020 11:13:42 +0800 Subject: [PATCH 19/27] fix: prevent duplicated resource creation (#1015) --- packages/opentelemetry-metrics/src/MeterProvider.ts | 12 +++++++++--- .../opentelemetry-metrics/test/MeterProvider.test.ts | 10 +++++++++- .../opentelemetry-tracing/src/BasicTracerProvider.ts | 11 ++++++++--- .../test/BasicTracerProvider.test.ts | 8 ++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/packages/opentelemetry-metrics/src/MeterProvider.ts b/packages/opentelemetry-metrics/src/MeterProvider.ts index 4bb0d33928a..0315a76e35d 100644 --- a/packages/opentelemetry-metrics/src/MeterProvider.ts +++ b/packages/opentelemetry-metrics/src/MeterProvider.ts @@ -24,12 +24,18 @@ import { DEFAULT_CONFIG, MeterConfig } from './types'; * This class represents a meter provider which platform libraries can extend */ export class MeterProvider implements api.MeterProvider { + private readonly _config: MeterConfig; private readonly _meters: Map = new Map(); - readonly resource: Resource = Resource.createTelemetrySDKResource(); + readonly resource: Resource; readonly logger: api.Logger; - constructor(private _config: MeterConfig = DEFAULT_CONFIG) { - this.logger = _config.logger || new ConsoleLogger(_config.logLevel); + constructor(config: MeterConfig = DEFAULT_CONFIG) { + this.logger = config.logger ?? new ConsoleLogger(config.logLevel); + this.resource = config.resource ?? Resource.createTelemetrySDKResource(); + this._config = Object.assign({}, config, { + logger: this.logger, + resource: this.resource, + }); } /** diff --git a/packages/opentelemetry-metrics/test/MeterProvider.test.ts b/packages/opentelemetry-metrics/test/MeterProvider.test.ts index 82877759b36..45c54db6bb7 100644 --- a/packages/opentelemetry-metrics/test/MeterProvider.test.ts +++ b/packages/opentelemetry-metrics/test/MeterProvider.test.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import { MeterProvider, Meter } from '../src'; +import { MeterProvider, Meter, CounterMetric } from '../src'; import { NoopLogger } from '@opentelemetry/core'; describe('MeterProvider', () => { @@ -39,6 +39,14 @@ describe('MeterProvider', () => { assert.ok(meter instanceof Meter); }); + it('should propagate resources', () => { + const meterProvider = new MeterProvider(); + const meter = meterProvider.getMeter('test-meter-provider'); + const counter = meter.createCounter('test-counter') as CounterMetric; + assert.strictEqual((meter as any)._resource, meterProvider.resource); + assert.strictEqual(counter.resource, meterProvider.resource); + }); + it('should return the meter with default version without a version option', () => { const provider = new MeterProvider(); const meter1 = provider.getMeter('default'); diff --git a/packages/opentelemetry-tracing/src/BasicTracerProvider.ts b/packages/opentelemetry-tracing/src/BasicTracerProvider.ts index fe44199e617..375f998aa75 100644 --- a/packages/opentelemetry-tracing/src/BasicTracerProvider.ts +++ b/packages/opentelemetry-tracing/src/BasicTracerProvider.ts @@ -27,6 +27,7 @@ import { Resource } from '@opentelemetry/resources'; * This class represents a basic tracer provider which platform libraries can extend */ export class BasicTracerProvider implements api.TracerProvider { + private readonly _config: TracerConfig; private readonly _registeredSpanProcessors: SpanProcessor[] = []; private readonly _tracers: Map = new Map(); @@ -34,9 +35,13 @@ export class BasicTracerProvider implements api.TracerProvider { readonly logger: api.Logger; readonly resource: Resource; - constructor(private _config: TracerConfig = DEFAULT_CONFIG) { - this.logger = _config.logger || new ConsoleLogger(_config.logLevel); - this.resource = _config.resource || Resource.createTelemetrySDKResource(); + constructor(config: TracerConfig = DEFAULT_CONFIG) { + this.logger = config.logger ?? new ConsoleLogger(config.logLevel); + this.resource = config.resource ?? Resource.createTelemetrySDKResource(); + this._config = Object.assign({}, config, { + logger: this.logger, + resource: this.resource, + }); } getTracer(name: string, version = '*', config?: TracerConfig): Tracer { diff --git a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts index 4b38b090462..6de7339798d 100644 --- a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts +++ b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts @@ -121,6 +121,14 @@ describe('BasicTracerProvider', () => { assert.ok(span instanceof Span); }); + it('should propagate resources', () => { + const tracerProvider = new BasicTracerProvider(); + const tracer = tracerProvider.getTracer('default'); + const span = tracer.startSpan('my-span') as Span; + assert.strictEqual(tracer.resource, tracerProvider.resource); + assert.strictEqual(span.resource, tracerProvider.resource); + }); + it('should start a span with name and options', () => { const tracer = new BasicTracerProvider().getTracer('default'); const span = tracer.startSpan('my-span', {}); From c1bcce85571b02b5548f56b34a392a80ca8e2ffa Mon Sep 17 00:00:00 2001 From: legendecas Date: Wed, 6 May 2020 23:46:49 +0800 Subject: [PATCH 20/27] fix: observers should not expose bind/unbind method (#1001) --- .../src/metrics/BoundInstrument.ts | 12 ----- .../opentelemetry-api/src/metrics/Meter.ts | 9 ++-- .../opentelemetry-api/src/metrics/Metric.ts | 46 +++++++++++-------- .../src/metrics/NoopMeter.ts | 33 ++++++------- .../src/BoundInstrument.ts | 9 +--- packages/opentelemetry-metrics/src/Meter.ts | 15 ++---- packages/opentelemetry-metrics/src/Metric.ts | 10 ++-- .../test/Batcher.test.ts | 2 +- 8 files changed, 57 insertions(+), 79 deletions(-) diff --git a/packages/opentelemetry-api/src/metrics/BoundInstrument.ts b/packages/opentelemetry-api/src/metrics/BoundInstrument.ts index 87defee0dcf..07302bd22fb 100644 --- a/packages/opentelemetry-api/src/metrics/BoundInstrument.ts +++ b/packages/opentelemetry-api/src/metrics/BoundInstrument.ts @@ -16,7 +16,6 @@ import { CorrelationContext } from '../correlation_context/CorrelationContext'; import { SpanContext } from '../trace/span_context'; -import { ObserverResult } from './ObserverResult'; /** An Instrument for Counter Metric. */ export interface BoundCounter { @@ -45,14 +44,3 @@ export interface BoundMeasure { spanContext: SpanContext ): void; } - -/** Base interface for the Observer metrics. */ -export interface BoundObserver { - /** - * Sets callback for the observer. The callback is called once and then it - * sets observers for values. The observers are called periodically to - * retrieve the value. - * @param callback - */ - setCallback(callback: (observerResult: ObserverResult) => void): void; -} diff --git a/packages/opentelemetry-api/src/metrics/Meter.ts b/packages/opentelemetry-api/src/metrics/Meter.ts index 5231629c910..0b43708c4d0 100644 --- a/packages/opentelemetry-api/src/metrics/Meter.ts +++ b/packages/opentelemetry-api/src/metrics/Meter.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { Metric, MetricOptions } from './Metric'; -import { BoundCounter, BoundMeasure, BoundObserver } from './BoundInstrument'; +import { MetricOptions, Counter, Measure, Observer } from './Metric'; /** * An interface to allow the recording metrics. @@ -30,7 +29,7 @@ export interface Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createMeasure(name: string, options?: MetricOptions): Metric; + createMeasure(name: string, options?: MetricOptions): Measure; /** * Creates a new `Counter` metric. Generally, this kind of metric when the @@ -39,12 +38,12 @@ export interface Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createCounter(name: string, options?: MetricOptions): Metric; + createCounter(name: string, options?: MetricOptions): Counter; /** * Creates a new `Observer` metric. * @param name the name of the metric. * @param [options] the metric options. */ - createObserver(name: string, options?: MetricOptions): Metric; + createObserver(name: string, options?: MetricOptions): Observer; } diff --git a/packages/opentelemetry-api/src/metrics/Metric.ts b/packages/opentelemetry-api/src/metrics/Metric.ts index d57896a1d32..4b02812723e 100644 --- a/packages/opentelemetry-api/src/metrics/Metric.ts +++ b/packages/opentelemetry-api/src/metrics/Metric.ts @@ -17,6 +17,7 @@ import { CorrelationContext } from '../correlation_context/CorrelationContext'; import { SpanContext } from '../trace/span_context'; import { ObserverResult } from './ObserverResult'; +import { BoundCounter, BoundMeasure } from './BoundInstrument'; /** * Options needed for metric creation @@ -77,7 +78,18 @@ export enum ValueType { * Metric represents a base class for different types of metric * pre aggregations. */ -export interface Metric { +export interface Metric { + /** + * Clears all bound instruments from the Metric. + */ + clear(): void; +} + +/** + * UnboundMetric represents a base class for different types of metric + * pre aggregations without label value bound yet. + */ +export interface UnboundMetric extends Metric { /** * Returns a Instrument associated with specified Labels. * It is recommended to keep a reference to the Instrument instead of always @@ -92,31 +104,16 @@ export interface Metric { * @param labels key-values pairs that are associated with a specific metric. */ unbind(labels: Labels): void; - - /** - * Clears all timeseries from the Metric. - */ - clear(): void; } -export interface MetricUtils { +export interface Counter extends UnboundMetric { /** * Adds the given value to the current value. Values cannot be negative. */ add(value: number, labels: Labels): void; +} - /** - * Sets a callback where user can observe value for certain labels - * @param callback a function that will be called once to set observers - * for values - */ - setCallback(callback: (observerResult: ObserverResult) => void): void; - - /** - * Sets the given value. Values can be negative. - */ - set(value: number, labels: Labels): void; - +export interface Measure extends UnboundMetric { /** * Records the given value to this measure. */ @@ -136,6 +133,17 @@ export interface MetricUtils { ): void; } +/** Base interface for the Observer metrics. */ +export interface Observer extends Metric { + /** + * Sets a callback where user can observe value for certain labels. The + * observers are called periodically to retrieve the value. + * @param callback a function that will be called once to set observers + * for values + */ + setCallback(callback: (observerResult: ObserverResult) => void): void; +} + /** * key-value pairs passed by the user. */ diff --git a/packages/opentelemetry-api/src/metrics/NoopMeter.ts b/packages/opentelemetry-api/src/metrics/NoopMeter.ts index bfc2e70a930..dcd6a5dea1f 100644 --- a/packages/opentelemetry-api/src/metrics/NoopMeter.ts +++ b/packages/opentelemetry-api/src/metrics/NoopMeter.ts @@ -15,8 +15,15 @@ */ import { Meter } from './Meter'; -import { MetricOptions, Metric, Labels, MetricUtils } from './Metric'; -import { BoundMeasure, BoundCounter, BoundObserver } from './BoundInstrument'; +import { + MetricOptions, + UnboundMetric, + Labels, + Counter, + Measure, + Observer, +} from './Metric'; +import { BoundMeasure, BoundCounter } from './BoundInstrument'; import { CorrelationContext } from '../correlation_context/CorrelationContext'; import { SpanContext } from '../trace/span_context'; import { ObserverResult } from './ObserverResult'; @@ -33,7 +40,7 @@ export class NoopMeter implements Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createMeasure(name: string, options?: MetricOptions): Metric { + createMeasure(name: string, options?: MetricOptions): Measure { return NOOP_MEASURE_METRIC; } @@ -42,7 +49,7 @@ export class NoopMeter implements Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createCounter(name: string, options?: MetricOptions): Metric { + createCounter(name: string, options?: MetricOptions): Counter { return NOOP_COUNTER_METRIC; } @@ -51,12 +58,12 @@ export class NoopMeter implements Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createObserver(name: string, options?: MetricOptions): Metric { + createObserver(name: string, options?: MetricOptions): Observer { return NOOP_OBSERVER_METRIC; } } -export class NoopMetric implements Metric { +export class NoopMetric implements UnboundMetric { private readonly _instrument: T; constructor(instrument: T) { @@ -90,14 +97,14 @@ export class NoopMetric implements Metric { } export class NoopCounterMetric extends NoopMetric - implements Pick { + implements Counter { add(value: number, labels: Labels) { this.bind(labels).add(value); } } export class NoopMeasureMetric extends NoopMetric - implements Pick { + implements Measure { record( value: number, labels: Labels, @@ -114,8 +121,7 @@ export class NoopMeasureMetric extends NoopMetric } } -export class NoopObserverMetric extends NoopMetric - implements Pick { +export class NoopObserverMetric extends NoopMetric implements Observer { setCallback(callback: (observerResult: ObserverResult) => void): void {} } @@ -135,10 +141,6 @@ export class NoopBoundMeasure implements BoundMeasure { } } -export class NoopBoundObserver implements BoundObserver { - setCallback(callback: (observerResult: ObserverResult) => void): void {} -} - export const NOOP_METER = new NoopMeter(); export const NOOP_BOUND_COUNTER = new NoopBoundCounter(); export const NOOP_COUNTER_METRIC = new NoopCounterMetric(NOOP_BOUND_COUNTER); @@ -146,5 +148,4 @@ export const NOOP_COUNTER_METRIC = new NoopCounterMetric(NOOP_BOUND_COUNTER); export const NOOP_BOUND_MEASURE = new NoopBoundMeasure(); export const NOOP_MEASURE_METRIC = new NoopMeasureMetric(NOOP_BOUND_MEASURE); -export const NOOP_BOUND_OBSERVER = new NoopBoundObserver(); -export const NOOP_OBSERVER_METRIC = new NoopObserverMetric(NOOP_BOUND_OBSERVER); +export const NOOP_OBSERVER_METRIC = new NoopObserverMetric(); diff --git a/packages/opentelemetry-metrics/src/BoundInstrument.ts b/packages/opentelemetry-metrics/src/BoundInstrument.ts index 94338a29eb4..d451bcb6011 100644 --- a/packages/opentelemetry-metrics/src/BoundInstrument.ts +++ b/packages/opentelemetry-metrics/src/BoundInstrument.ts @@ -16,7 +16,6 @@ import * as api from '@opentelemetry/api'; import { Aggregator } from './export/types'; -import { ObserverResult } from './ObserverResult'; /** * This class represent the base to BoundInstrument, which is responsible for generating @@ -134,8 +133,7 @@ export class BoundMeasure extends BaseBoundInstrument /** * BoundObserver is an implementation of the {@link BoundObserver} interface. */ -export class BoundObserver extends BaseBoundInstrument - implements api.BoundObserver { +export class BoundObserver extends BaseBoundInstrument { constructor( labels: api.Labels, disabled: boolean, @@ -146,9 +144,4 @@ export class BoundObserver extends BaseBoundInstrument ) { super(labels, logger, monotonic, disabled, valueType, aggregator); } - - setCallback(callback: (observerResult: api.ObserverResult) => void): void { - const observerResult = new ObserverResult(); - callback(observerResult); - } } diff --git a/packages/opentelemetry-metrics/src/Meter.ts b/packages/opentelemetry-metrics/src/Meter.ts index 425af55c20c..ee2d5a5427c 100644 --- a/packages/opentelemetry-metrics/src/Meter.ts +++ b/packages/opentelemetry-metrics/src/Meter.ts @@ -56,10 +56,7 @@ export class Meter implements api.Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createMeasure( - name: string, - options?: api.MetricOptions - ): api.Metric { + createMeasure(name: string, options?: api.MetricOptions): api.Measure { if (!this._isValidName(name)) { this._logger.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` @@ -86,10 +83,7 @@ export class Meter implements api.Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createCounter( - name: string, - options?: api.MetricOptions - ): api.Metric { + createCounter(name: string, options?: api.MetricOptions): api.Counter { if (!this._isValidName(name)) { this._logger.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` @@ -113,10 +107,7 @@ export class Meter implements api.Meter { * @param name the name of the metric. * @param [options] the metric options. */ - createObserver( - name: string, - options?: api.MetricOptions - ): api.Metric { + createObserver(name: string, options?: api.MetricOptions): api.Observer { if (!this._isValidName(name)) { this._logger.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` diff --git a/packages/opentelemetry-metrics/src/Metric.ts b/packages/opentelemetry-metrics/src/Metric.ts index 0fce307d6ae..ce9d89df520 100644 --- a/packages/opentelemetry-metrics/src/Metric.ts +++ b/packages/opentelemetry-metrics/src/Metric.ts @@ -30,7 +30,7 @@ import { hashLabels } from './Utils'; /** This is a SDK implementation of {@link Metric} interface. */ export abstract class Metric - implements api.Metric { + implements api.UnboundMetric { protected readonly _monotonic: boolean; protected readonly _disabled: boolean; protected readonly _valueType: api.ValueType; @@ -106,8 +106,7 @@ export abstract class Metric } /** This is a SDK implementation of Counter Metric. */ -export class CounterMetric extends Metric - implements Pick { +export class CounterMetric extends Metric implements api.Counter { constructor( name: string, options: MetricOptions, @@ -139,8 +138,7 @@ export class CounterMetric extends Metric } } -export class MeasureMetric extends Metric - implements Pick { +export class MeasureMetric extends Metric implements api.Measure { protected readonly _absolute: boolean; constructor( @@ -172,7 +170,7 @@ export class MeasureMetric extends Metric /** This is a SDK implementation of Observer Metric. */ export class ObserverMetric extends Metric - implements Pick { + implements api.Observer { private _observerResult = new ObserverResult(); constructor( diff --git a/packages/opentelemetry-metrics/test/Batcher.test.ts b/packages/opentelemetry-metrics/test/Batcher.test.ts index 5c2e00b3fbe..72c68608bbe 100644 --- a/packages/opentelemetry-metrics/test/Batcher.test.ts +++ b/packages/opentelemetry-metrics/test/Batcher.test.ts @@ -24,7 +24,7 @@ describe('Batcher', () => { let meter: Meter; let fooCounter: api.BoundCounter; let barCounter: api.BoundCounter; - let counter: api.Metric; + let counter: api.Counter; beforeEach(() => { meter = new MeterProvider({ logger: new NoopLogger(), From 2b14af35d804c32cdf01c30bfbea564fe06bd266 Mon Sep 17 00:00:00 2001 From: legendecas Date: Thu, 7 May 2020 01:42:02 +0800 Subject: [PATCH 21/27] fix: multi span processor should flush child span processors (#1024) --- .../src/MultiSpanProcessor.ts | 4 +++- .../test/MultiSpanProcessor.test.ts | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts b/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts index b4d4c9d3fa3..343da23af25 100644 --- a/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts @@ -25,7 +25,9 @@ export class MultiSpanProcessor implements SpanProcessor { constructor(private readonly _spanProcessors: SpanProcessor[]) {} forceFlush(): void { - // do nothing as all spans are being exported without waiting + for (const spanProcessor of this._spanProcessors) { + spanProcessor.forceFlush(); + } } onStart(span: Span): void { diff --git a/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts b/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts index 62b33fe224a..8b95d68aafd 100644 --- a/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts +++ b/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts @@ -65,4 +65,19 @@ describe('MultiSpanProcessor', () => { assert.strictEqual(processor1.spans.length, 0); assert.strictEqual(processor1.spans.length, processor2.spans.length); }); + + it('should force span processors to flush', () => { + let flushed = false; + const processor: SpanProcessor = { + forceFlush: () => { + flushed = true; + }, + onStart: span => {}, + onEnd: span => {}, + shutdown: () => {}, + }; + const multiSpanProcessor = new MultiSpanProcessor([processor]); + multiSpanProcessor.forceFlush(); + assert.ok(flushed); + }); }); From e5a31d75f89235313e6ebcbba13fe22075a718d7 Mon Sep 17 00:00:00 2001 From: Valentin Marchaud Date: Wed, 6 May 2020 20:33:29 +0200 Subject: [PATCH 22/27] feat(http-plugin): add options to disable new spans if no parent #931 (#948) --- packages/opentelemetry-plugin-http/README.md | 2 + .../opentelemetry-plugin-http/src/http.ts | 38 +++++- .../opentelemetry-plugin-http/src/types.ts | 4 + .../test/functionals/http-enable.test.ts | 120 ++++++++++++++++++ 4 files changed, 159 insertions(+), 5 deletions(-) diff --git a/packages/opentelemetry-plugin-http/README.md b/packages/opentelemetry-plugin-http/README.md index 8daf06f8446..bcdc59e230e 100644 --- a/packages/opentelemetry-plugin-http/README.md +++ b/packages/opentelemetry-plugin-http/README.md @@ -55,6 +55,8 @@ Http plugin has few options available to choose from. You can set the following: | [`ignoreIncomingPaths`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L28) | `IgnoreMatcher[]` | Http plugin will not trace all incoming requests that match paths | | [`ignoreOutgoingUrls`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L28) | `IgnoreMatcher[]` | Http plugin will not trace all outgoing requests that match urls | | [`serverName`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L28) | `string` | The primary server name of the matched virtual host. | +| `requireParentforOutgoingSpans` | Boolean | Require that is a parent span to create new span for outgoing requests. | +| `requireParentforIncomingSpans` | Boolean | Require that is a parent span to create new span for incoming requests. | ## Useful links - For more information on OpenTelemetry, visit: diff --git a/packages/opentelemetry-plugin-http/src/http.ts b/packages/opentelemetry-plugin-http/src/http.ts index 51263cc89e0..c6c9aaa9337 100644 --- a/packages/opentelemetry-plugin-http/src/http.ts +++ b/packages/opentelemetry-plugin-http/src/http.ts @@ -22,8 +22,14 @@ import { SpanKind, SpanOptions, Status, + SpanContext, + TraceFlags, } from '@opentelemetry/api'; -import { BasePlugin } from '@opentelemetry/core'; +import { + BasePlugin, + NoRecordingSpan, + getExtractedSpanContext, +} from '@opentelemetry/core'; import { ClientRequest, IncomingMessage, @@ -57,6 +63,12 @@ export class HttpPlugin extends BasePlugin { /** keep track on spans not ended */ private readonly _spanNotEnded: WeakSet; + private readonly _emptySpanContext: SpanContext = { + traceId: '', + spanId: '', + traceFlags: TraceFlags.NONE, + }; + constructor(readonly moduleName: string, readonly version: string) { super(`@opentelemetry/plugin-${moduleName}`, VERSION); // For now component is equal to moduleName but it can change in the future. @@ -396,7 +408,6 @@ export class HttpPlugin extends BasePlugin { const spanOptions: SpanOptions = { kind: SpanKind.CLIENT, }; - const span = plugin._startHttpSpan(operationName, spanOptions); return plugin._tracer.withSpan(span, () => { @@ -417,9 +428,26 @@ export class HttpPlugin extends BasePlugin { } private _startHttpSpan(name: string, options: SpanOptions) { - const span = this._tracer - .startSpan(name, options) - .setAttribute(AttributeNames.COMPONENT, this.component); + /* + * If a parent is required but not present, we use a `NoRecordingSpan` to still + * propagate context without recording it. + */ + const requireParent = + options.kind === SpanKind.CLIENT + ? this._config.requireParentforOutgoingSpans + : this._config.requireParentforIncomingSpans; + let span: Span; + if (requireParent === true && this._tracer.getCurrentSpan() === undefined) { + const spanContext = + getExtractedSpanContext(context.active()) ?? plugin._emptySpanContext; + // TODO: Refactor this when a solution is found in + // https://github.com/open-telemetry/opentelemetry-specification/issues/530 + span = new NoRecordingSpan(spanContext); + } else { + span = this._tracer + .startSpan(name, options) + .setAttribute(AttributeNames.COMPONENT, this.component); + } this._spanNotEnded.add(span); return span; } diff --git a/packages/opentelemetry-plugin-http/src/types.ts b/packages/opentelemetry-plugin-http/src/types.ts index 335e0bbc304..b7e230d37a1 100644 --- a/packages/opentelemetry-plugin-http/src/types.ts +++ b/packages/opentelemetry-plugin-http/src/types.ts @@ -69,6 +69,10 @@ export interface HttpPluginConfig extends PluginConfig { applyCustomAttributesOnSpan?: HttpCustomAttributeFunction; /** The primary server name of the matched virtual host. */ serverName?: string; + /** Require parent to create span for outgoing requests */ + requireParentforOutgoingSpans?: boolean; + /** Require parent to create span for incoming requests */ + requireParentforIncomingSpans?: boolean; } export interface Err extends Error { diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts index 10fa530ba34..7197a7410d9 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts @@ -696,5 +696,125 @@ describe('HttpPlugin', () => { req.end(); }); }); + + describe('with require parent span', () => { + beforeEach(done => { + memoryExporter.reset(); + plugin.enable(http, provider, provider.logger, {}); + server = http.createServer((request, response) => { + response.end('Test Server Response'); + }); + server.listen(serverPort, done); + }); + + afterEach(() => { + server.close(); + plugin.disable(); + }); + + it(`should not trace without parent with options enabled (both client & server)`, async () => { + plugin.disable(); + const config: HttpPluginConfig = { + requireParentforIncomingSpans: true, + requireParentforOutgoingSpans: true, + }; + plugin.enable(http, provider, provider.logger, config); + const testPath = `/test/test`; + await httpRequest.get( + `${protocol}://${hostname}:${serverPort}${testPath}` + ); + const spans = memoryExporter.getFinishedSpans(); + assert.strictEqual(spans.length, 0); + }); + + it(`should not trace without parent with options enabled (client only)`, async () => { + plugin.disable(); + const config: HttpPluginConfig = { + requireParentforOutgoingSpans: true, + }; + plugin.enable(http, provider, provider.logger, config); + const testPath = `/test/test`; + const result = await httpRequest.get( + `${protocol}://${hostname}:${serverPort}${testPath}` + ); + assert( + result.reqHeaders[DummyPropagation.TRACE_CONTEXT_KEY] !== undefined + ); + assert( + result.reqHeaders[DummyPropagation.SPAN_CONTEXT_KEY] !== undefined + ); + const spans = memoryExporter.getFinishedSpans(); + assert.strictEqual(spans.length, 1); + assert.strictEqual( + spans.every(span => span.kind === SpanKind.SERVER), + true + ); + }); + + it(`should not trace without parent with options enabled (server only)`, async () => { + plugin.disable(); + const config: HttpPluginConfig = { + requireParentforIncomingSpans: true, + }; + plugin.enable(http, provider, provider.logger, config); + const testPath = `/test/test`; + const result = await httpRequest.get( + `${protocol}://${hostname}:${serverPort}${testPath}` + ); + assert( + result.reqHeaders[DummyPropagation.TRACE_CONTEXT_KEY] !== undefined + ); + assert( + result.reqHeaders[DummyPropagation.SPAN_CONTEXT_KEY] !== undefined + ); + const spans = memoryExporter.getFinishedSpans(); + assert.strictEqual(spans.length, 1); + assert.strictEqual( + spans.every(span => span.kind === SpanKind.CLIENT), + true + ); + }); + + it(`should trace with parent with both requireParent options enabled`, done => { + plugin.disable(); + const config: HttpPluginConfig = { + requireParentforIncomingSpans: true, + requireParentforOutgoingSpans: true, + }; + plugin.enable(http, provider, provider.logger, config); + const testPath = `/test/test`; + const tracer = provider.getTracer('default'); + const span = tracer.startSpan('parentSpan', { + kind: SpanKind.INTERNAL, + }); + tracer.withSpan(span, () => { + httpRequest + .get(`${protocol}://${hostname}:${serverPort}${testPath}`) + .then(result => { + span.end(); + assert( + result.reqHeaders[DummyPropagation.TRACE_CONTEXT_KEY] !== + undefined + ); + assert( + result.reqHeaders[DummyPropagation.SPAN_CONTEXT_KEY] !== + undefined + ); + const spans = memoryExporter.getFinishedSpans(); + assert.strictEqual(spans.length, 2); + assert.strictEqual( + spans.filter(span => span.kind === SpanKind.CLIENT).length, + 1 + ); + assert.strictEqual( + spans.filter(span => span.kind === SpanKind.INTERNAL).length, + 1 + ); + return done(); + }) + .catch(done); + }); + }); + }); }); }); From b5569f83620eafd4f5661381005ed51e67448fe4 Mon Sep 17 00:00:00 2001 From: Justin Walz Date: Wed, 6 May 2020 11:56:36 -0700 Subject: [PATCH 23/27] Fix typo in opentelemetry-tracing types.js (#1029) --- packages/opentelemetry-tracing/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-tracing/src/types.ts b/packages/opentelemetry-tracing/src/types.ts index 008ac1523ca..7f5dedb0317 100644 --- a/packages/opentelemetry-tracing/src/types.ts +++ b/packages/opentelemetry-tracing/src/types.ts @@ -29,7 +29,7 @@ import { Resource } from '@opentelemetry/resources'; */ export interface TracerConfig { /** - * Attributed that will be applied on every span created by Tracer. + * Attributes that will be applied on every span created by Tracer. * Useful to add infrastructure and environment information to your spans. */ defaultAttributes?: Attributes; From c454d6cf2c895be39e7ae9d1b55c039ed952dcb4 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Wed, 6 May 2020 15:32:34 -0400 Subject: [PATCH 24/27] Reintroduce node 13 tests (#1026) --- .circleci/config.yml | 6 ++++++ README.md | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 350ee4946b4..e1dc9feb5b4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -184,6 +184,11 @@ jobs: - image: node:12 environment: *node_test_env <<: *node_unit_tests + node13: + docker: + - image: node:13 + environment: *node_test_env + <<: *node_unit_tests node14: docker: - image: node:14 @@ -213,6 +218,7 @@ workflows: - node8 - node10 - node12 + - node13 - node14 - node12-browsers diff --git a/README.md b/README.md index 6a1eee3042e..46ba523ad74 100644 --- a/README.md +++ b/README.md @@ -59,13 +59,14 @@ If you are a library author looking to build OpenTelemetry into your library, pl Platform Version | Supported ---------------- | --------- Node.JS `v14` | ✅ +Node.JS `v13` | ✅ Node.JS `v12` | ✅ Node.JS `v10` | ✅ Node.JS `v8` | See [Node Support](#node-support) below Web Browsers | ✅ See [Browser Support](#browser-support) below ### Node Support -Automated tests are run using the latest release of each currently supported LTS version of Node.JS. +Automated tests are run using the latest release of each currently active version of Node.JS. While Node.JS v8 is no longer supported by the Node.JS team, the latest version of Node.JS v8 is still included in our testing suite. Please note that versions of Node.JS v8 prior to `v8.5.0` will NOT work, because OpenTelemetry Node depends on the `perf_hooks` module introduced in `v8.5.0` From 8a29221c08a90fd6fe85970210b4c3c8a3867de7 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Thu, 7 May 2020 11:26:02 -0400 Subject: [PATCH 25/27] chore: fix build on latest typings (#1035) --- .../test/prometheus.test.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts index 2ed9852a542..6475d69cfbb 100644 --- a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts +++ b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts @@ -522,8 +522,5 @@ describe('PrometheusExporter', () => { }); function errorHandler(done: Mocha.Done): (err: Error) => void { - return () => { - assert.ok(false, 'error getting metrics'); - done(); - }; + return err => done(err); } From 1dd3804df2f5f886a2756765731440cee5af00a0 Mon Sep 17 00:00:00 2001 From: Bartlomiej Obecny Date: Thu, 7 May 2020 21:19:47 +0200 Subject: [PATCH 26/27] chore: fixing build (#1036) --- packages/opentelemetry-plugin-grpc/test/grpc.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/opentelemetry-plugin-grpc/test/grpc.test.ts b/packages/opentelemetry-plugin-grpc/test/grpc.test.ts index c137361b242..a54410a2808 100644 --- a/packages/opentelemetry-plugin-grpc/test/grpc.test.ts +++ b/packages/opentelemetry-plugin-grpc/test/grpc.test.ts @@ -436,8 +436,7 @@ describe('GrpcPlugin', () => { return provider.getTracer('default').withSpan(span, async () => { const rootSpan = provider.getTracer('default').getCurrentSpan(); if (!rootSpan) { - assert.ok(false); - return; // return so typechecking passes for rootSpan.end() + return assert.ok(false); } assert.deepStrictEqual(rootSpan, span); @@ -531,8 +530,7 @@ describe('GrpcPlugin', () => { return provider.getTracer('default').withSpan(span, async () => { const rootSpan = provider.getTracer('default').getCurrentSpan(); if (!rootSpan) { - assert.ok(false); - return; // return so typechecking passes for rootSpan.end() + return assert.ok(false); } assert.deepStrictEqual(rootSpan, span); From 45ea74aeb74d0050da2230b023f8d526bc34f28f Mon Sep 17 00:00:00 2001 From: legendecas Date: Sat, 9 May 2020 01:38:23 +0800 Subject: [PATCH 27/27] fix(tracing): span processor should receive a readable span as parameters (#1037) --- .../test/transform.test.ts | 6 +-- .../test/functionals/utils.test.ts | 2 +- .../src/MultiSpanProcessor.ts | 6 +-- .../src/NoopSpanProcessor.ts | 6 +-- packages/opentelemetry-tracing/src/Span.ts | 4 -- .../src/SpanProcessor.ts | 10 ++-- .../src/export/BatchSpanProcessor.ts | 7 ++- .../src/export/SimpleSpanProcessor.ts | 8 +-- .../test/MultiSpanProcessor.test.ts | 29 ++++++---- .../opentelemetry-tracing/test/Span.test.ts | 53 +++++++------------ 10 files changed, 62 insertions(+), 69 deletions(-) diff --git a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts index 60761e67797..0bb180c1800 100644 --- a/packages/opentelemetry-exporter-zipkin/test/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/transform.test.ts @@ -68,7 +68,7 @@ describe('transform', () => { span.end(); const zipkinSpan = toZipkinSpan( - span.toReadableSpan(), + span, 'my-service', statusCodeTagName, statusDescriptionTagName @@ -112,7 +112,7 @@ describe('transform', () => { span.end(); const zipkinSpan = toZipkinSpan( - span.toReadableSpan(), + span, 'my-service', statusCodeTagName, statusDescriptionTagName @@ -154,7 +154,7 @@ describe('transform', () => { span.end(); const zipkinSpan = toZipkinSpan( - span.toReadableSpan(), + span, 'my-service', statusCodeTagName, statusDescriptionTagName diff --git a/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts b/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts index 6314d480924..d79588e2879 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts @@ -261,7 +261,7 @@ describe('Utility', () => { ); /* tslint:disable-next-line:no-any */ utils.setSpanWithError(span, new Error(errorMessage), obj as any); - const attributes = span.toReadableSpan().attributes; + const attributes = span.attributes; assert.strictEqual( attributes[AttributeNames.HTTP_ERROR_MESSAGE], errorMessage diff --git a/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts b/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts index 343da23af25..92a04dd530f 100644 --- a/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/MultiSpanProcessor.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { Span } from '@opentelemetry/api'; import { SpanProcessor } from './SpanProcessor'; +import { ReadableSpan } from './export/ReadableSpan'; /** * Implementation of the {@link SpanProcessor} that simply forwards all @@ -30,13 +30,13 @@ export class MultiSpanProcessor implements SpanProcessor { } } - onStart(span: Span): void { + onStart(span: ReadableSpan): void { for (const spanProcessor of this._spanProcessors) { spanProcessor.onStart(span); } } - onEnd(span: Span): void { + onEnd(span: ReadableSpan): void { for (const spanProcessor of this._spanProcessors) { spanProcessor.onEnd(span); } diff --git a/packages/opentelemetry-tracing/src/NoopSpanProcessor.ts b/packages/opentelemetry-tracing/src/NoopSpanProcessor.ts index 2898e77cfa9..c00bcb393a4 100644 --- a/packages/opentelemetry-tracing/src/NoopSpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/NoopSpanProcessor.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { Span } from '@opentelemetry/api'; import { SpanProcessor } from './SpanProcessor'; +import { ReadableSpan } from './export/ReadableSpan'; /** No-op implementation of SpanProcessor */ export class NoopSpanProcessor implements SpanProcessor { - onStart(span: Span): void {} - onEnd(span: Span): void {} + onStart(span: ReadableSpan): void {} + onEnd(span: ReadableSpan): void {} shutdown(): void {} forceFlush(): void {} } diff --git a/packages/opentelemetry-tracing/src/Span.ts b/packages/opentelemetry-tracing/src/Span.ts index c2f08461d5a..7a6c97bda74 100644 --- a/packages/opentelemetry-tracing/src/Span.ts +++ b/packages/opentelemetry-tracing/src/Span.ts @@ -175,10 +175,6 @@ export class Span implements api.Span, ReadableSpan { return true; } - toReadableSpan(): ReadableSpan { - return this; - } - get duration(): api.HrTime { return this._duration; } diff --git a/packages/opentelemetry-tracing/src/SpanProcessor.ts b/packages/opentelemetry-tracing/src/SpanProcessor.ts index 0320455ae98..7f8deae0a9c 100644 --- a/packages/opentelemetry-tracing/src/SpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/SpanProcessor.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Span } from '@opentelemetry/api'; +import { ReadableSpan } from './export/ReadableSpan'; /** * SpanProcessor is the interface Tracer SDK uses to allow synchronous hooks @@ -27,18 +27,18 @@ export interface SpanProcessor { forceFlush(): void; /** - * Called when a {@link Span} is started, if the `span.isRecording()` + * Called when a {@link ReadableSpan} is started, if the `span.isRecording()` * returns true. * @param span the Span that just started. */ - onStart(span: Span): void; + onStart(span: ReadableSpan): void; /** - * Called when a {@link Span} is ended, if the `span.isRecording()` + * Called when a {@link ReadableSpan} is ended, if the `span.isRecording()` * returns true. * @param span the Span that just ended. */ - onEnd(span: Span): void; + onEnd(span: ReadableSpan): void; /** * Shuts down the processor. Called when SDK is shut down. This is an diff --git a/packages/opentelemetry-tracing/src/export/BatchSpanProcessor.ts b/packages/opentelemetry-tracing/src/export/BatchSpanProcessor.ts index 87fd79bded7..381ec393f43 100644 --- a/packages/opentelemetry-tracing/src/export/BatchSpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/export/BatchSpanProcessor.ts @@ -15,7 +15,6 @@ */ import { unrefTimer } from '@opentelemetry/core'; -import { Span } from '../Span'; import { SpanProcessor } from '../SpanProcessor'; import { BufferConfig } from '../types'; import { ReadableSpan } from './ReadableSpan'; @@ -53,13 +52,13 @@ export class BatchSpanProcessor implements SpanProcessor { } // does nothing. - onStart(span: Span): void {} + onStart(span: ReadableSpan): void {} - onEnd(span: Span): void { + onEnd(span: ReadableSpan): void { if (this._isShutdown) { return; } - this._addToBuffer(span.toReadableSpan()); + this._addToBuffer(span); } shutdown(): void { diff --git a/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts b/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts index e76797cfcfd..073ffb3f206 100644 --- a/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { Span } from '../Span'; import { SpanProcessor } from '../SpanProcessor'; import { SpanExporter } from './SpanExporter'; +import { ReadableSpan } from './ReadableSpan'; /** * An implementation of the {@link SpanProcessor} that converts the {@link Span} @@ -33,13 +33,13 @@ export class SimpleSpanProcessor implements SpanProcessor { } // does nothing. - onStart(span: Span): void {} + onStart(span: ReadableSpan): void {} - onEnd(span: Span): void { + onEnd(span: ReadableSpan): void { if (this._isShutdown) { return; } - this._exporter.export([span.toReadableSpan()], () => {}); + this._exporter.export([span], () => {}); } shutdown(): void { diff --git a/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts b/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts index 8b95d68aafd..b83da007a65 100644 --- a/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts +++ b/packages/opentelemetry-tracing/test/MultiSpanProcessor.test.ts @@ -31,33 +31,44 @@ class TestProcessor implements SpanProcessor { } describe('MultiSpanProcessor', () => { - const tracer = new BasicTracerProvider().getTracer('default'); - const span = tracer.startSpan('one'); - it('should handle empty span processor', () => { const multiSpanProcessor = new MultiSpanProcessor([]); - multiSpanProcessor.onStart(span); - multiSpanProcessor.onEnd(span); + + const tracerProvider = new BasicTracerProvider(); + tracerProvider.addSpanProcessor(multiSpanProcessor); + const tracer = tracerProvider.getTracer('default'); + const span = tracer.startSpan('one'); + span.end(); multiSpanProcessor.shutdown(); }); it('should handle one span processor', () => { const processor1 = new TestProcessor(); const multiSpanProcessor = new MultiSpanProcessor([processor1]); - multiSpanProcessor.onStart(span); + + const tracerProvider = new BasicTracerProvider(); + tracerProvider.addSpanProcessor(multiSpanProcessor); + const tracer = tracerProvider.getTracer('default'); + const span = tracer.startSpan('one'); assert.strictEqual(processor1.spans.length, 0); - multiSpanProcessor.onEnd(span); + span.end(); assert.strictEqual(processor1.spans.length, 1); + multiSpanProcessor.shutdown(); }); it('should handle two span processor', () => { const processor1 = new TestProcessor(); const processor2 = new TestProcessor(); const multiSpanProcessor = new MultiSpanProcessor([processor1, processor2]); - multiSpanProcessor.onStart(span); + + const tracerProvider = new BasicTracerProvider(); + tracerProvider.addSpanProcessor(multiSpanProcessor); + const tracer = tracerProvider.getTracer('default'); + const span = tracer.startSpan('one'); assert.strictEqual(processor1.spans.length, 0); assert.strictEqual(processor1.spans.length, processor2.spans.length); - multiSpanProcessor.onEnd(span); + + span.end(); assert.strictEqual(processor1.spans.length, 1); assert.strictEqual(processor1.spans.length, processor2.spans.length); diff --git a/packages/opentelemetry-tracing/test/Span.test.ts b/packages/opentelemetry-tracing/test/Span.test.ts index 0eeeda7ab96..db737573719 100644 --- a/packages/opentelemetry-tracing/test/Span.test.ts +++ b/packages/opentelemetry-tracing/test/Span.test.ts @@ -220,28 +220,25 @@ describe('Span', () => { parentId ); - const readableSpan = span.toReadableSpan(); - assert.strictEqual(readableSpan.name, 'my-span'); - assert.strictEqual(readableSpan.kind, SpanKind.INTERNAL); - assert.strictEqual(readableSpan.parentSpanId, parentId); - assert.strictEqual(readableSpan.spanContext.traceId, spanContext.traceId); - assert.deepStrictEqual(readableSpan.status, { + assert.strictEqual(span.name, 'my-span'); + assert.strictEqual(span.kind, SpanKind.INTERNAL); + assert.strictEqual(span.parentSpanId, parentId); + assert.strictEqual(span.spanContext.traceId, spanContext.traceId); + assert.deepStrictEqual(span.status, { code: CanonicalCode.OK, }); - assert.deepStrictEqual(readableSpan.attributes, {}); - assert.deepStrictEqual(readableSpan.links, []); - assert.deepStrictEqual(readableSpan.events, []); + assert.deepStrictEqual(span.attributes, {}); + assert.deepStrictEqual(span.links, []); + assert.deepStrictEqual(span.events, []); }); it('should return ReadableSpan with attributes', () => { const span = new Span(tracer, 'my-span', spanContext, SpanKind.CLIENT); span.setAttribute('attr1', 'value1'); - let readableSpan = span.toReadableSpan(); - assert.deepStrictEqual(readableSpan.attributes, { attr1: 'value1' }); + assert.deepStrictEqual(span.attributes, { attr1: 'value1' }); span.setAttributes({ attr2: 123, attr1: false }); - readableSpan = span.toReadableSpan(); - assert.deepStrictEqual(readableSpan.attributes, { + assert.deepStrictEqual(span.attributes, { attr1: false, attr2: 123, }); @@ -249,8 +246,7 @@ describe('Span', () => { span.end(); // shouldn't add new attribute span.setAttribute('attr3', 'value3'); - readableSpan = span.toReadableSpan(); - assert.deepStrictEqual(readableSpan.attributes, { + assert.deepStrictEqual(span.attributes, { attr1: false, attr2: 123, }); @@ -271,9 +267,8 @@ describe('Span', () => { }, ] ); - const readableSpan = span.toReadableSpan(); - assert.strictEqual(readableSpan.links.length, 2); - assert.deepStrictEqual(readableSpan.links, [ + assert.strictEqual(span.links.length, 2); + assert.deepStrictEqual(span.links, [ { context: linkContext, }, @@ -289,17 +284,15 @@ describe('Span', () => { it('should return ReadableSpan with events', () => { const span = new Span(tracer, 'my-span', spanContext, SpanKind.CLIENT); span.addEvent('sent'); - let readableSpan = span.toReadableSpan(); - assert.strictEqual(readableSpan.events.length, 1); - const [event] = readableSpan.events; + assert.strictEqual(span.events.length, 1); + const [event] = span.events; assert.deepStrictEqual(event.name, 'sent'); assert.ok(!event.attributes); assert.ok(event.time[0] > 0); span.addEvent('rev', { attr1: 'value', attr2: 123, attr3: true }); - readableSpan = span.toReadableSpan(); - assert.strictEqual(readableSpan.events.length, 2); - const [event1, event2] = readableSpan.events; + assert.strictEqual(span.events.length, 2); + const [event1, event2] = span.events; assert.deepStrictEqual(event1.name, 'sent'); assert.ok(!event1.attributes); assert.ok(event1.time[0] > 0); @@ -314,9 +307,7 @@ describe('Span', () => { span.end(); // shouldn't add new event span.addEvent('sent'); - assert.strictEqual(readableSpan.events.length, 2); - readableSpan = span.toReadableSpan(); - assert.strictEqual(readableSpan.events.length, 2); + assert.strictEqual(span.events.length, 2); }); it('should return ReadableSpan with new status', () => { @@ -325,12 +316,8 @@ describe('Span', () => { code: CanonicalCode.PERMISSION_DENIED, message: 'This is an error', }); - const readableSpan = span.toReadableSpan(); - assert.strictEqual( - readableSpan.status.code, - CanonicalCode.PERMISSION_DENIED - ); - assert.strictEqual(readableSpan.status.message, 'This is an error'); + assert.strictEqual(span.status.code, CanonicalCode.PERMISSION_DENIED); + assert.strictEqual(span.status.message, 'This is an error'); span.end(); // shouldn't update status