From 0d0b668de88254e82c548a25eadbcb90f24b86bb Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Tue, 2 Nov 2021 15:10:06 -0400 Subject: [PATCH 01/13] feat!(metrics): remove batch observer (#2566) --- examples/metrics/metrics/observer.js | 56 +----- .../src/NoopMeter.ts | 22 +-- .../opentelemetry-api-metrics/src/index.ts | 1 - .../src/types/BatchObserverResult.ts | 30 ---- .../src/types/Meter.ts | 13 -- .../src/types/Metric.ts | 7 - .../opentelemetry-sdk-metrics-base/README.md | 54 ------ .../src/BatchObserver.ts | 64 ------- .../src/BatchObserverResult.ts | 62 ------- .../src/Meter.ts | 25 --- .../test/Meter.test.ts | 166 ------------------ 11 files changed, 5 insertions(+), 495 deletions(-) delete mode 100644 experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts delete mode 100644 experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts delete mode 100644 experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts diff --git a/examples/metrics/metrics/observer.js b/examples/metrics/metrics/observer.js index a31345f2a50..a2ad804e2c2 100644 --- a/examples/metrics/metrics/observer.js +++ b/examples/metrics/metrics/observer.js @@ -27,66 +27,12 @@ meter.createObservableGauge('cpu_core_usage', { description: 'Example of a sync observable gauge with callback', }, async (observableResult) => { // this callback is called once per each interval await new Promise((resolve) => { - setTimeout(()=> {resolve()}, 50); + setTimeout(() => { resolve(); }, 50); }); observableResult.observe(getRandomValue(), { core: '1' }); observableResult.observe(getRandomValue(), { core: '2' }); }); -// no callback as they will be updated in batch observer -const tempMetric = meter.createObservableGauge('cpu_temp_per_app', { - description: 'Example of sync observable gauge used with async batch observer', -}); - -// no callback as they will be updated in batch observer -const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { - description: 'Example of sync observable gauge used with async batch observer', -}); - -meter.createBatchObserver((batchObserverResult) => { - Promise.all([ - someAsyncMetrics(), - // simulate waiting - new Promise((resolve, reject) => { - setTimeout(resolve, 300); - }), - ]).then(([apps, waiting]) => { - apps.forEach(app => { - batchObserverResult.observe({ app: app.name, core: '1' }, [ - tempMetric.observation(app.core1.temp), - cpuUsageMetric.observation(app.core1.usage), - ]); - batchObserverResult.observe({ app: app.name, core: '2' }, [ - tempMetric.observation(app.core2.temp), - cpuUsageMetric.observation(app.core2.usage), - ]); - }); - }); - }, { - maxTimeoutUpdateMS: 500, - }, -); - -function someAsyncMetrics() { - return new Promise((resolve) => { - setTimeout(() => { - const stats = [ - { - name: 'app1', - core1: { usage: getRandomValue(), temp: getRandomValue() * 100 }, - core2: { usage: getRandomValue(), temp: getRandomValue() * 100 }, - }, - { - name: 'app2', - core1: { usage: getRandomValue(), temp: getRandomValue() * 100 }, - core2: { usage: getRandomValue(), temp: getRandomValue() * 100 }, - }, - ]; - resolve(stats); - }, 200); - }); -} - function getRandomValue() { return Math.random(); } diff --git a/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts b/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts index d60562fe782..54b99b658fd 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { BatchObserverResult } from './types/BatchObserverResult'; import { Meter } from './types/Meter'; import { MetricOptions, @@ -105,17 +104,6 @@ export class NoopMeter implements Meter { ): ObservableUpDownCounter { return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC; } - - /** - * Returns constant noop batch observer. - * @param name the name of the metric. - * @param callback the batch observer callback - */ - createBatchObserver( - _callback: (batchObserverResult: BatchObserverResult) => void - ): NoopBatchObserver { - return NOOP_BATCH_OBSERVER; - } } export class NoopMetric {} @@ -141,16 +129,14 @@ export class NoopObservableBaseMetric extends NoopMetric implements ObservableBa } } -export class NoopBatchObserver {} - export const NOOP_METER = new NoopMeter(); +// Synchronous instruments export const NOOP_COUNTER_METRIC = new NoopCounterMetric(); -export const NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric(); export const NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric(); +export const NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric(); +// Asynchronous instruments +export const NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableBaseMetric(); export const NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableBaseMetric(); export const NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC = new NoopObservableBaseMetric(); -export const NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableBaseMetric(); - -export const NOOP_BATCH_OBSERVER = new NoopBatchObserver(); diff --git a/experimental/packages/opentelemetry-api-metrics/src/index.ts b/experimental/packages/opentelemetry-api-metrics/src/index.ts index 7203a857c90..ffdac631255 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/index.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/index.ts @@ -16,7 +16,6 @@ export * from './NoopMeter'; export * from './NoopMeterProvider'; -export * from './types/BatchObserverResult'; export * from './types/Meter'; export * from './types/MeterProvider'; export * from './types/Metric'; diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts b/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts deleted file mode 100644 index 971156a774c..00000000000 --- a/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright The 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 { Labels } from './Metric'; -import { Observation } from './Observation'; - -/** - * Interface that is being used in callback function for BatchObserver - */ -export interface BatchObserverResult { - /** - * Used to observe (update) observations for certain labels - * @param labels - * @param observations - */ - observe(labels: Labels, observations: Observation[]): void; -} diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts index cd30fe8f4c7..a3e37538ea6 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts @@ -14,13 +14,11 @@ * limitations under the License. */ -import { BatchObserverResult } from './BatchObserverResult'; import { MetricOptions, Counter, Histogram, ObservableGauge, - BatchObserverOptions, UpDownCounter, ObservableCounter, ObservableUpDownCounter, @@ -115,15 +113,4 @@ export interface Meter { options?: MetricOptions, callback?: (observableResult: ObservableResult) => void ): ObservableUpDownCounter; - - /** - * Creates a new `BatchObserver`, can be used to update many metrics - * at the same time and when operations needs to be async - * @param callback the batch observer callback - * @param [options] the batch observer options. - */ - createBatchObserver( - callback: (batchObserverResult: BatchObserverResult) => void, - options?: BatchObserverOptions - ): void; } diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts index 424666f4eea..90fc93fdace 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts @@ -63,13 +63,6 @@ export interface MetricOptions { aggregationTemporality?: AggregationTemporality; } -export interface BatchObserverOptions { - /** - * Indicates how long the batch metric should wait to update before cancel - */ - maxTimeoutUpdateMS?: number; -} - /** The Type of value. It describes how the data is reported. */ export enum ValueType { INT, diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/README.md b/experimental/packages/opentelemetry-sdk-metrics-base/README.md index c68fb1cf684..b89b7658e80 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/README.md +++ b/experimental/packages/opentelemetry-sdk-metrics-base/README.md @@ -183,60 +183,6 @@ function getRandomValue() { } ``` -### Batch Observer - -Choose this kind of metric when you need to update multiple observables with the results of a single async calculation. - -```js -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); -const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); - -const exporter = new PrometheusExporter( - { - startServer: true, - }, - () => { - console.log('prometheus scrape endpoint: http://localhost:9464/metrics'); - }, -); - -const meter = new MeterProvider({ - exporter, - interval: 3000, -}).getMeter('example-observer'); - -const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { - description: 'CPU', -}); - -const MemUsageMetric = meter.createObservableGauge('mem_usage_per_app', { - description: 'Memory', -}); - -meter.createBatchObserver((batchObserverResult) => { - getSomeAsyncMetrics().then(metrics => { - batchObserverResult.observe({ app: 'myApp' }, [ - cpuUsageMetric.observation(metrics.value1), - MemUsageMetric.observation(metrics.value2) - ]); - }); -}); - -function getSomeAsyncMetrics() { - return new Promise((resolve, reject) => { - setTimeout(() => { - resolve({ - value1: Math.random(), - value2: Math.random(), - }); - }, 100) - }); -} - -``` - -See [examples/prometheus](https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/prometheus) for a short example. - ### Histogram `Histogram` is a non-additive synchronous instrument useful for recording any non-additive number, positive or negative. diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts deleted file mode 100644 index 576102cb46c..00000000000 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright The 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-metrics'; -import { diag } from '@opentelemetry/api'; -import { BatchObserverResult } from './BatchObserverResult'; - -const NOOP_CALLBACK = () => {}; -const MAX_TIMEOUT_UPDATE_MS = 500; - -/** This is a SDK implementation of Batch Observer. */ -export class BatchObserver { - private _callback: (observableResult: api.BatchObserverResult) => void; - private _maxTimeoutUpdateMS: number; - - constructor( - options: api.BatchObserverOptions, - callback?: (observableResult: api.BatchObserverResult) => void - ) { - this._maxTimeoutUpdateMS = - options.maxTimeoutUpdateMS ?? MAX_TIMEOUT_UPDATE_MS; - this._callback = callback || NOOP_CALLBACK; - } - - collect(): Promise { - diag.debug('getMetricRecord - start'); - return new Promise(resolve => { - const batchObserverResult = new BatchObserverResult(); - - // cancels after MAX_TIMEOUT_MS - no more waiting for results - const timer = setTimeout(() => { - batchObserverResult.cancelled = true; - // remove callback to prevent user from updating the values later if - // for any reason the batchObserverResult will be referenced - batchObserverResult.onObserveCalled(); - resolve(); - diag.debug('getMetricRecord - timeout'); - }, this._maxTimeoutUpdateMS); - - // sets callback for each "observe" method - batchObserverResult.onObserveCalled(() => { - clearTimeout(timer); - resolve(); - diag.debug('getMetricRecord - end'); - }); - - // calls the BatchObserverResult callback - this._callback(batchObserverResult); - }); - } -} diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts deleted file mode 100644 index d05284010f2..00000000000 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright The 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-metrics'; -import { ObservableBaseMetric } from './ObservableBaseMetric'; - -/** - * Implementation of api BatchObserverResult - */ -export class BatchObserverResult implements api.BatchObserverResult { - private _callback: (() => void) | undefined; - private _immediate: NodeJS.Immediate | undefined; - /** - * Cancels the further updates. - * This is used to prevent updating the value of result that took too - * long to update. For example to avoid update after timeout. - * See {@link BatchObserver.collect} - */ - cancelled = false; - - /** - * used to save a callback that will be called after the observations are - * updated - * @param [callback] - */ - onObserveCalled(callback?: () => void): void { - this._callback = callback; - } - - observe(labels: api.Labels, observations: api.Observation[]): void { - if (this.cancelled || !this._callback) { - return; - } - observations.forEach(observation => { - const observable = observation.observable as ObservableBaseMetric; - observable.bind(labels).update(observation.value); - }); - if (!this._immediate) { - this._immediate = setImmediate(() => { - if (typeof this._callback === 'function') { - this._callback(); - // prevent user from updating the values later if for any reason - // the batchObserverResult will be referenced and then try to use - this._callback = undefined; - } - }); - } - } -} diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts index 143d50692a1..d4f3692451b 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts @@ -18,7 +18,6 @@ import { diag } from '@opentelemetry/api'; import * as api from '@opentelemetry/api-metrics'; import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { BatchObserver } from './BatchObserver'; import { BaseBoundInstrument } from './BoundInstrument'; import { CounterMetric } from './CounterMetric'; import { PushController } from './export/Controller'; @@ -40,7 +39,6 @@ const merge = require('lodash.merge'); * Meter is an implementation of the {@link Meter} interface. */ export class Meter implements api.Meter { - private readonly _batchObservers: BatchObserver[] = []; private readonly _metrics = new Map>(); private readonly _processor: Processor; private readonly _resource: Resource; @@ -255,23 +253,6 @@ export class Meter implements api.Meter { return observableUpDownCounter; } - /** - * Creates a new batch observer. - * @param callback the batch observer callback - * @param [options] the batch options. - */ - createBatchObserver( - callback: (observableResult: api.BatchObserverResult) => void, - options: api.BatchObserverOptions = {} - ): BatchObserver { - const opt: api.BatchObserverOptions = { - ...options, - }; - const batchObserver = new BatchObserver(opt, callback); - this._batchObservers.push(batchObserver); - return batchObserver; - } - /** * Collects all the metrics created with this `Meter` for export. * @@ -280,12 +261,6 @@ export class Meter implements api.Meter { * meter instance. */ async collect(): Promise { - // call batch observers first - const observations = this._batchObservers.map(observer => { - return observer.collect(); - }); - await Promise.all(observations); - // after this all remaining metrics can be run const metricsRecords = Array.from(this._metrics.values()).map(metric => { return metric.getMetricRecord(); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts b/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts index b422add2683..851ba684ebb 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts @@ -35,8 +35,6 @@ import { ObservableGaugeMetric, HistogramMetric, } from '../src'; -import { BatchObserver } from '../src/BatchObserver'; -import { BatchObserverResult } from '../src/BatchObserverResult'; import { SumAggregator } from '../src/export/aggregators'; import { ObservableCounterMetric } from '../src/ObservableCounterMetric'; import { ObservableUpDownCounterMetric } from '../src/ObservableUpDownCounterMetric'; @@ -1145,170 +1143,6 @@ describe('Meter', () => { }); }); - describe('#batchObserver', () => { - it('should create a batch observer', () => { - const observer = meter.createBatchObserver(() => {}); - assert.ok(observer instanceof BatchObserver); - }); - - it('should create batch observer with options', () => { - const observer = meter.createBatchObserver(() => {}, { - maxTimeoutUpdateMS: 100, - }); - assert.ok(observer instanceof BatchObserver); - }); - - it('should use callback to observe values ', async () => { - const tempMetric = meter.createObservableGauge('cpu_temp_per_app', { - description: 'desc', - }) as ObservableGaugeMetric; - - const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { - description: 'desc', - }) as ObservableGaugeMetric; - - meter.createBatchObserver(batchObserverResult => { - interface StatItem { - usage: number; - temp: number; - } - - interface Stat { - name: string; - core1: StatItem; - core2: StatItem; - } - - function someAsyncMetrics() { - return new Promise(resolve => { - const stats: Stat[] = [ - { - name: 'app1', - core1: { usage: 2.1, temp: 67 }, - core2: { usage: 3.1, temp: 69 }, - }, - { - name: 'app2', - core1: { usage: 1.2, temp: 67 }, - core2: { usage: 4.5, temp: 69 }, - }, - ]; - resolve(stats); - }); - } - - Promise.all([ - someAsyncMetrics(), - // simulate waiting - new Promise((resolve, reject) => { - setTimeout(resolve, 1); - }), - ]).then((stats: unknown[]) => { - const apps = (stats[0] as unknown) as Stat[]; - apps.forEach(app => { - batchObserverResult.observe({ app: app.name, core: '1' }, [ - tempMetric.observation(app.core1.temp), - cpuUsageMetric.observation(app.core1.usage), - ]); - batchObserverResult.observe({ app: app.name, core: '2' }, [ - tempMetric.observation(app.core2.temp), - cpuUsageMetric.observation(app.core2.usage), - ]); - }); - }); - }); - - await meter.collect(); - const records = meter.getProcessor().checkPointSet(); - assert.strictEqual(records.length, 8); - - const metric1 = records[0]; - const metric2 = records[1]; - const metric3 = records[2]; - const metric4 = records[3]; - assert.strictEqual(hashLabels(metric1.labels), '|#app:app1,core:1'); - assert.strictEqual(hashLabels(metric2.labels), '|#app:app1,core:2'); - assert.strictEqual(hashLabels(metric3.labels), '|#app:app2,core:1'); - assert.strictEqual(hashLabels(metric4.labels), '|#app:app2,core:2'); - - ensureMetric(metric1, 'cpu_temp_per_app', 67); - ensureMetric(metric2, 'cpu_temp_per_app', 69); - ensureMetric(metric3, 'cpu_temp_per_app', 67); - ensureMetric(metric4, 'cpu_temp_per_app', 69); - - const metric5 = records[4]; - const metric6 = records[5]; - const metric7 = records[6]; - const metric8 = records[7]; - assert.strictEqual(hashLabels(metric5.labels), '|#app:app1,core:1'); - assert.strictEqual(hashLabels(metric6.labels), '|#app:app1,core:2'); - assert.strictEqual(hashLabels(metric7.labels), '|#app:app2,core:1'); - assert.strictEqual(hashLabels(metric8.labels), '|#app:app2,core:2'); - - ensureMetric(metric5, 'cpu_usage_per_app', 2.1); - ensureMetric(metric6, 'cpu_usage_per_app', 3.1); - ensureMetric(metric7, 'cpu_usage_per_app', 1.2); - ensureMetric(metric8, 'cpu_usage_per_app', 4.5); - }); - - it('should not observe values when timeout', done => { - const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { - description: 'desc', - }) as ObservableGaugeMetric; - - meter.createBatchObserver( - batchObserverResult => { - Promise.all([ - // simulate waiting 11ms - new Promise((resolve, reject) => { - setTimeout(resolve, 11); - }), - ]).then(async () => { - // try to hack to be able to update - (batchObserverResult as BatchObserverResult).cancelled = false; - batchObserverResult.observe({ foo: 'bar' }, [ - cpuUsageMetric.observation(123), - ]); - - // simulate some waiting - await setTimeout(() => {}, 5); - - const cpuUsageMetricRecords: MetricRecord[] = await cpuUsageMetric.getMetricRecord(); - const value = cpuUsageMetric - .bind({ foo: 'bar' }) - .getAggregator() - .toPoint().value; - - assert.deepStrictEqual(value, 0); - assert.strictEqual(cpuUsageMetricRecords.length, 0); - done(); - }); - }, - { - maxTimeoutUpdateMS: 10, // timeout after 10ms - } - ); - - meter.collect(); - }); - - it('should pipe through instrumentation library', async () => { - const observableGauge = meter.createObservableGauge( - 'name', - {}, - (observableResult: api.ObservableResult) => { - observableResult.observe(42, { foo: 'bar' }); - } - ) as ObservableGaugeMetric; - assert.ok(observableGauge.instrumentationLibrary); - - const [record] = await observableGauge.getMetricRecord(); - const { name, version } = record.instrumentationLibrary; - assert.strictEqual(name, 'test-meter'); - assert.strictEqual(version, undefined); - }); - }); - describe('#getMetrics', () => { it('should create a DOUBLE counter', async () => { const key = 'key'; From 85d511038415085adffbd9048f4d2fdcc8a612d0 Mon Sep 17 00:00:00 2001 From: "(Eliseo) Nathaniel Ruiz Nowell" Date: Tue, 2 Nov 2021 16:42:09 -0400 Subject: [PATCH 02/13] doc: Move upgrade propagator notes to correct section (#2579) * Move upgrade propagator notes to correct section * Fix the named reference to HttpBaggagePropagator Co-authored-by: Bartlomiej Obecny * Update README.md Co-authored-by: Daniel Dyla Co-authored-by: Bartlomiej Obecny --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e78162d7b8e..076f707a9b6 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,9 @@ Collector exporter packages and types are renamed: - `CollectorExporterNodeBase` => `OTLPExporterNodeBase` - `CollectorMetricExporter` => `OTLPMetricExporter` - `CollectorTraceExporter` => `OTLPTraceExporter` +- W3C propagators in @opentelemetry/core were renamed + - `HttpTraceContextPropagator` -> `W3CTraceContextPropagator` + - `HttpBaggagePropagator` -> `W3CBaggagePropagator` ### 0.24.x to 0.25.x @@ -346,9 +349,6 @@ Collector exporter packages and types are renamed: - @opentelemetry/web -> @opentelemetry/sdk-trace-web - @opentelemetry/metrics -> @opentelemetry/sdk-metrics-base - @opentelemetry/node-sdk -> @opentelemetry/sdk-node -- W3C propagators in @opentelemetry/core were renamed - - `HttpTraceContextPropagator` -> `W3CTraceContextPropagator` - - `W3CBaggagePropagator` -> `W3CBaggagePropagator` ### 0.23.x to 0.24.x From a1b47ac4407e5af85d2d98be0308938e70d3cddf Mon Sep 17 00:00:00 2001 From: Dylan Arbour Date: Thu, 4 Nov 2021 13:05:29 -0400 Subject: [PATCH 03/13] docs: fix URLs in README post-experimental move (#2600) --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 076f707a9b6..97f16841678 100644 --- a/README.md +++ b/README.md @@ -536,13 +536,13 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [docs]: https://open-telemetry.github.io/opentelemetry-js [compliance-matrix]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/spec-compliance-matrix.md -[otel-metrics]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-metrics-base +[otel-metrics]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-metrics-base [otel-node]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-node -[otel-instrumentation-fetch]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-fetch -[otel-instrumentation-grpc]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-grpc -[otel-instrumentation-http]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-http -[otel-instrumentation-xml-http-request]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-instrumentation-xml-http-request +[otel-instrumentation-fetch]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-fetch +[otel-instrumentation-grpc]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-grpc +[otel-instrumentation-http]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http +[otel-instrumentation-xml-http-request]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-xml-http-request [otel-shim-opentracing]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-shim-opentracing [otel-tracing]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-base @@ -551,16 +551,16 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [otel-core]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-core [generate-api-documentation]: https://github.com/open-telemetry/opentelemetry-js/blob/main/CONTRIBUTING.md#generating-api-documentation -[otel-contrib-instrumentation-dns]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-dns -[otel-contrib-instrumentation-ioredis]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-ioredis -[otel-contrib-instrumentation-mongodb]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-mongodb -[otel-contrib-instrumentation-mysql]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-mysql -[otel-contrib-instrumentation-pg]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-pg -[otel-contrib-instrumentation-redis]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-redis -[otel-contrib-instrumentation-express]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-express -[otel-contrib-instrumentation-user-interaction]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/web/opentelemetry-instrumentation-user-interaction -[otel-contrib-instrumentation-document-load]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/web/opentelemetry-instrumentation-document-load -[otel-contrib-instrumentation-hapi]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-hapi -[otel-contrib-instrumentation-koa]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-instrumentation-koa +[otel-contrib-instrumentation-dns]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-dns +[otel-contrib-instrumentation-ioredis]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-ioredis +[otel-contrib-instrumentation-mongodb]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-mongodb +[otel-contrib-instrumentation-mysql]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-mysql +[otel-contrib-instrumentation-pg]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-pg +[otel-contrib-instrumentation-redis]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-redis +[otel-contrib-instrumentation-express]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-express +[otel-contrib-instrumentation-user-interaction]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/web/opentelemetry-instrumentation-user-interaction +[otel-contrib-instrumentation-document-load]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/web/opentelemetry-instrumentation-document-load +[otel-contrib-instrumentation-hapi]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-hapi +[otel-contrib-instrumentation-koa]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-koa [spec-versioning]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md From 37483bcac75d690286b9165b22a3f0e8d4c1d2a5 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 5 Nov 2021 14:08:59 +0100 Subject: [PATCH 04/13] chore(deps): update dependency karma to v6 (#1826) --- experimental/packages/opentelemetry-api-metrics/package.json | 2 +- .../opentelemetry-exporter-metrics-otlp-http/package.json | 2 +- .../opentelemetry-exporter-trace-otlp-http/package.json | 2 +- .../packages/opentelemetry-instrumentation-fetch/package.json | 2 +- .../opentelemetry-instrumentation-xml-http-request/package.json | 2 +- .../packages/opentelemetry-instrumentation/package.json | 2 +- packages/opentelemetry-context-zone-peer-dep/package.json | 2 +- packages/opentelemetry-context-zone/package.json | 2 +- packages/opentelemetry-core/package.json | 2 +- packages/opentelemetry-exporter-zipkin/package.json | 2 +- packages/opentelemetry-propagator-jaeger/package.json | 2 +- packages/opentelemetry-sdk-trace-base/package.json | 2 +- packages/opentelemetry-sdk-trace-web/package.json | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/experimental/packages/opentelemetry-api-metrics/package.json b/experimental/packages/opentelemetry-api-metrics/package.json index ecc624c4b9e..cb99f060160 100644 --- a/experimental/packages/opentelemetry-api-metrics/package.json +++ b/experimental/packages/opentelemetry-api-metrics/package.json @@ -60,7 +60,7 @@ "@types/webpack-env": "1.16.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json index e1979a7a8fd..027c72b2e48 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json @@ -65,7 +65,7 @@ "codecov": "3.8.3", "cpx": "1.5.0", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json index ce223c06e5e..ccbd298c676 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json @@ -65,7 +65,7 @@ "codecov": "3.8.3", "cpx": "1.5.0", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/package.json b/experimental/packages/opentelemetry-instrumentation-fetch/package.json index f7c060a8dec..91a15f2e6ef 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/package.json +++ b/experimental/packages/opentelemetry-instrumentation-fetch/package.json @@ -60,7 +60,7 @@ "babel-loader": "8.2.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json index 2145f91b33e..66a8d6ac66f 100644 --- a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json +++ b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json @@ -60,7 +60,7 @@ "babel-loader": "8.2.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/experimental/packages/opentelemetry-instrumentation/package.json b/experimental/packages/opentelemetry-instrumentation/package.json index 194e7d041b2..7163baebec9 100644 --- a/experimental/packages/opentelemetry-instrumentation/package.json +++ b/experimental/packages/opentelemetry-instrumentation/package.json @@ -82,7 +82,7 @@ "codecov": "3.8.3", "cpx": "1.5.0", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json index aefebb26021..555b34790f9 100644 --- a/packages/opentelemetry-context-zone-peer-dep/package.json +++ b/packages/opentelemetry-context-zone-peer-dep/package.json @@ -57,7 +57,7 @@ "babel-loader": "8.2.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json index f844a972d53..e97763680b3 100644 --- a/packages/opentelemetry-context-zone/package.json +++ b/packages/opentelemetry-context-zone/package.json @@ -51,7 +51,7 @@ "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", "codecov": "3.8.3", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-mocha": "2.0.1", "karma-spec-reporter": "0.0.32", diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json index fd33b2ad216..e7431e4f83a 100644 --- a/packages/opentelemetry-core/package.json +++ b/packages/opentelemetry-core/package.json @@ -64,7 +64,7 @@ "@types/webpack-env": "1.16.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index c14b9d9ae3b..0742a343870 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -62,7 +62,7 @@ "babel-loader": "8.2.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/packages/opentelemetry-propagator-jaeger/package.json b/packages/opentelemetry-propagator-jaeger/package.json index e8ee5ccb1b0..3a781b7c1d8 100644 --- a/packages/opentelemetry-propagator-jaeger/package.json +++ b/packages/opentelemetry-propagator-jaeger/package.json @@ -56,7 +56,7 @@ "@types/webpack-env": "1.16.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/packages/opentelemetry-sdk-trace-base/package.json b/packages/opentelemetry-sdk-trace-base/package.json index f08887ceeee..03a7c2426fe 100644 --- a/packages/opentelemetry-sdk-trace-base/package.json +++ b/packages/opentelemetry-sdk-trace-base/package.json @@ -62,7 +62,7 @@ "@types/webpack-env": "1.16.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-mocha": "2.0.1", diff --git a/packages/opentelemetry-sdk-trace-web/package.json b/packages/opentelemetry-sdk-trace-web/package.json index 2cc79a26727..45ed1a12591 100644 --- a/packages/opentelemetry-sdk-trace-web/package.json +++ b/packages/opentelemetry-sdk-trace-web/package.json @@ -60,7 +60,7 @@ "babel-loader": "8.2.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", - "karma": "5.2.3", + "karma": "6.3.7", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "3.0.3", "karma-jquery": "0.2.4", From c8272749e102198f3b88c7029ee770c5cec97b8b Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Fri, 5 Nov 2021 14:40:35 +0100 Subject: [PATCH 05/13] fix(deps): update dependency @opentelemetry/resource-detector-aws to v1 (#2573) --- experimental/packages/opentelemetry-sdk-node/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json index 28a9e746c1c..ab87164ad12 100644 --- a/experimental/packages/opentelemetry-sdk-node/package.json +++ b/experimental/packages/opentelemetry-sdk-node/package.json @@ -45,7 +45,7 @@ "@opentelemetry/api-metrics": "0.26.0", "@opentelemetry/core": "1.0.0", "@opentelemetry/instrumentation": "0.26.0", - "@opentelemetry/resource-detector-aws": "0.24.0", + "@opentelemetry/resource-detector-aws": "1.0.1", "@opentelemetry/resource-detector-gcp": "0.24.0", "@opentelemetry/resources": "1.0.0", "@opentelemetry/sdk-metrics-base": "0.26.0", From 03709c7bdae4cb3b1e485c5de1ad5a7deaf62298 Mon Sep 17 00:00:00 2001 From: Olivier Albertini Date: Fri, 5 Nov 2021 14:20:03 -0400 Subject: [PATCH 06/13] docs(instrumentation): update links in the Readme (#2576) --- .../README.md | 2 +- .../README.md | 2 +- .../README.md | 22 +++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/README.md b/experimental/packages/opentelemetry-instrumentation-fetch/README.md index 8e98c147f60..36e0af54882 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/README.md +++ b/experimental/packages/opentelemetry-instrumentation-fetch/README.md @@ -66,7 +66,7 @@ Fetch instrumentation plugin has few options available to choose from. You can s | Options | Type | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------- | -| [`applyCustomAttributesOnSpan`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-fetch/src/fetch.ts#L47) | `HttpCustomAttributeFunction` | Function for adding custom attributes | +| [`applyCustomAttributesOnSpan`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts#L64) | `HttpCustomAttributeFunction` | Function for adding custom attributes | ## Useful links diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/README.md b/experimental/packages/opentelemetry-instrumentation-grpc/README.md index ebfc7d4ffcf..04487f6bf1f 100644 --- a/experimental/packages/opentelemetry-instrumentation-grpc/README.md +++ b/experimental/packages/opentelemetry-instrumentation-grpc/README.md @@ -46,7 +46,7 @@ gRPC instrumentation accepts the following configuration: | Options | Type | Description | | ------- | ---- | ----------- | -| [`ignoreGrpcMethods`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-grpc/src/types.ts#L32) | `IgnoreMatcher[]` | gRPC instrumentation will not trace any methods that match anything in this list. You may pass a string (case-insensitive match), a `RegExp` object, or a filter function. | +| [`ignoreGrpcMethods`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-grpc/src/types.ts#L25) | `IgnoreMatcher[]` | gRPC instrumentation will not trace any methods that match anything in this list. You may pass a string (case-insensitive match), a `RegExp` object, or a filter function. | ## Useful links diff --git a/experimental/packages/opentelemetry-instrumentation-http/README.md b/experimental/packages/opentelemetry-instrumentation-http/README.md index 6d5fb9a073b..9b1c579a3e3 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/README.md +++ b/experimental/packages/opentelemetry-instrumentation-http/README.md @@ -47,17 +47,17 @@ Http instrumentation has few options available to choose from. You can set the f | Options | Type | Description | | ------- | ---- | ----------- | -| [`applyCustomAttributesOnSpan`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L91) | `HttpCustomAttributeFunction` | Function for adding custom attributes | -| [`requestHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#93) | `HttpRequestCustomAttributeFunction` | Function for adding custom attributes before request is handled | -| [`responseHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L95) | `HttpResponseCustomAttributeFunction` | Function for adding custom attributes before response is handled | -| [`startIncomingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L97) | `StartIncomingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in incomingRequest | -| [`startOutgoingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L99) | `StartOutgoingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in outgoingRequest | -| [`ignoreIncomingPaths`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L87) | `IgnoreMatcher[]` | Http instrumentation will not trace all incoming requests that match paths | -| [`ignoreOutgoingUrls`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L89) | `IgnoreMatcher[]` | Http instrumentation will not trace all outgoing requests that match urls | -| [`serverName`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L101) | `string` | The primary server name of the matched virtual host. | -| [`requireParentforOutgoingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L103) | Boolean | Require that is a parent span to create new span for outgoing requests. | -| [`requireParentforIncomingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L105) | Boolean | Require that is a parent span to create new span for incoming requests. | -| [`headersToSpanAttributes`](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-instrumentation-http/src/types.ts#L107) | `object` | List of case insensitive HTTP headers to convert to span attributes. Client (outgoing requests, incoming responses) and server (incoming requests, outgoing responses) headers will be converted to span attributes in the form of `http.{request\|response}.header.header_name`, e.g. `http.response.header.content_length` | +| [`applyCustomAttributesOnSpan`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L91) | `HttpCustomAttributeFunction` | Function for adding custom attributes | +| [`requestHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#93) | `HttpRequestCustomAttributeFunction` | Function for adding custom attributes before request is handled | +| [`responseHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L95) | `HttpResponseCustomAttributeFunction` | Function for adding custom attributes before response is handled | +| [`startIncomingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L97) | `StartIncomingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in incomingRequest | +| [`startOutgoingSpanHook`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L99) | `StartOutgoingSpanCustomAttributeFunction` | Function for adding custom attributes before a span is started in outgoingRequest | +| [`ignoreIncomingPaths`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L87) | `IgnoreMatcher[]` | Http instrumentation will not trace all incoming requests that match paths | +| [`ignoreOutgoingUrls`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L89) | `IgnoreMatcher[]` | Http instrumentation will not trace all outgoing requests that match urls | +| [`serverName`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L101) | `string` | The primary server name of the matched virtual host. | +| [`requireParentforOutgoingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L103) | Boolean | Require that is a parent span to create new span for outgoing requests. | +| [`requireParentforIncomingSpans`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L105) | Boolean | Require that is a parent span to create new span for incoming requests. | +| [`headersToSpanAttributes`](https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-instrumentation-http/src/types.ts#L107) | `object` | List of case insensitive HTTP headers to convert to span attributes. Client (outgoing requests, incoming responses) and server (incoming requests, outgoing responses) headers will be converted to span attributes in the form of `http.{request\|response}.header.header_name`, e.g. `http.response.header.content_length` | ## Useful links From 491dd807d1b556905a3801336ea5f191cf437cac Mon Sep 17 00:00:00 2001 From: Bartlomiej Obecny Date: Fri, 5 Nov 2021 19:49:50 +0100 Subject: [PATCH 07/13] fix: fixing compatibility versions for detectors (#2584) Co-authored-by: Daniel Dyla --- .../opentelemetry-sdk-node/package.json | 18 +++++++++--------- .../opentelemetry-sdk-node/test/sdk.test.ts | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json index ab87164ad12..2cec14bdf11 100644 --- a/experimental/packages/opentelemetry-sdk-node/package.json +++ b/experimental/packages/opentelemetry-sdk-node/package.json @@ -42,15 +42,15 @@ "access": "public" }, "dependencies": { - "@opentelemetry/api-metrics": "0.26.0", - "@opentelemetry/core": "1.0.0", - "@opentelemetry/instrumentation": "0.26.0", - "@opentelemetry/resource-detector-aws": "1.0.1", - "@opentelemetry/resource-detector-gcp": "0.24.0", - "@opentelemetry/resources": "1.0.0", - "@opentelemetry/sdk-metrics-base": "0.26.0", - "@opentelemetry/sdk-trace-base": "1.0.0", - "@opentelemetry/sdk-trace-node": "1.0.0" + "@opentelemetry/api-metrics": "~0.26.0", + "@opentelemetry/core": "~1.0.0", + "@opentelemetry/instrumentation": "~0.26.0", + "@opentelemetry/resource-detector-aws": "~1.0.0", + "@opentelemetry/resource-detector-gcp": "~0.26.0", + "@opentelemetry/resources": "~1.0.0", + "@opentelemetry/sdk-metrics-base": "~0.26.0", + "@opentelemetry/sdk-trace-base": "~1.0.0", + "@opentelemetry/sdk-trace-node": "~1.0.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.1.0" diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 5b593cba4c7..7bfc913ce16 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -131,7 +131,7 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider); assert.ok( - context['_getContextManager']() instanceof DefaultContextManager + context['_getContextManager']().constructor.name === DefaultContextManager.name ); assert.ok( propagation['_getGlobalPropagator']() instanceof CompositePropagator @@ -154,7 +154,7 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider); assert.ok( - context['_getContextManager']() instanceof DefaultContextManager + context['_getContextManager']().constructor.name === DefaultContextManager.name ); assert.ok( propagation['_getGlobalPropagator']() instanceof CompositePropagator From 28c9e8829488a7fa131803447b0511195ae1fdf0 Mon Sep 17 00:00:00 2001 From: James <45812677+JamesJHPark@users.noreply.github.com> Date: Fri, 5 Nov 2021 12:03:29 -0700 Subject: [PATCH 08/13] Docs: Document the HrTime format (#2604) --- packages/opentelemetry-core/src/common/time.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-core/src/common/time.ts b/packages/opentelemetry-core/src/common/time.ts index bb7b2bd3d73..52a3fc0fd19 100644 --- a/packages/opentelemetry-core/src/common/time.ts +++ b/packages/opentelemetry-core/src/common/time.ts @@ -22,7 +22,15 @@ const NANOSECOND_DIGITS = 9; const SECOND_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS); /** - * Converts a number to HrTime + * Converts a number to HrTime, HrTime = [number, number]. + * The first number is UNIX Epoch time in seconds since 00:00:00 UTC on 1 January 1970. + * The second number represents the partial second elapsed since Unix Epoch time represented by first number in nanoseconds. + * For example, 2021-01-01T12:30:10.150Z in UNIX Epoch time in milliseconds is represented as 1609504210150. + * numberToHrtime calculates the first number by converting and truncating the Epoch time in milliseconds to seconds: + * HrTime[0] = Math.trunc(1609504210150 / 1000) = 1609504210. + * numberToHrtime calculates the second number by converting the digits after the decimal point of the subtraction, (1609504210150 / 1000) - HrTime[0], to nanoseconds: + * HrTime[1] = Number((1609504210.150 - HrTime[0]).toFixed(9)) * SECOND_TO_NANOSECONDS = 150000000. + * This is represented in HrTime format as [1609504210, 150000000]. * @param epochMillis */ function numberToHrtime(epochMillis: number): api.HrTime { From 517a31a4f60f2c07067293bf51439e7a48ae6a49 Mon Sep 17 00:00:00 2001 From: Georg Pirklbauer Date: Mon, 8 Nov 2021 15:02:29 +0100 Subject: [PATCH 09/13] feat: Rename Labels to Attributes (#2523) Co-authored-by: Daniel Dyla --- .../src/NoopMeter.ts | 8 +- .../src/types/Meter.ts | 2 +- .../src/types/Metric.ts | 18 +-- .../src/types/ObservableResult.ts | 4 +- .../noop-implementations/noop-meter.test.ts | 6 +- .../src/transformMetrics.ts | 8 +- .../test/common/transformMetrics.test.ts | 4 +- ...cher.ts => PrometheusAttributesBatcher.ts} | 8 +- .../src/PrometheusExporter.ts | 6 +- .../src/PrometheusSerializer.ts | 50 +++---- .../test/ExactProcessor.ts | 6 +- .../test/PrometheusExporter.test.ts | 62 ++++----- .../test/PrometheusLabelsBatcher.test.ts | 30 ++--- .../test/PrometheusSerializer.test.ts | 52 ++++---- .../opentelemetry-sdk-metrics-base/README.md | 22 ++-- .../src/BoundInstrument.ts | 36 +++--- .../src/CounterMetric.ts | 10 +- .../src/HistogramMetric.ts | 8 +- .../src/Metric.ts | 22 ++-- .../src/ObservableBaseMetric.ts | 8 +- .../src/ObservableCounterMetric.ts | 4 +- .../src/ObservableResult.ts | 8 +- .../src/UpDownCounterMetric.ts | 10 +- .../src/Utils.ts | 12 +- .../src/export/ConsoleMetricExporter.ts | 2 +- .../src/export/Processor.ts | 8 +- .../src/export/types.ts | 4 +- .../test/Meter.test.ts | 122 +++++++++--------- .../test/Processor.test.ts | 4 +- .../test/export/ConsoleMetricExporter.test.ts | 12 +- 30 files changed, 278 insertions(+), 278 deletions(-) rename experimental/packages/opentelemetry-exporter-prometheus/src/{PrometheusLabelsBatcher.ts => PrometheusAttributesBatcher.ts} (90%) diff --git a/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts b/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts index 54b99b658fd..a5568b545df 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts @@ -17,7 +17,7 @@ import { Meter } from './types/Meter'; import { MetricOptions, - Labels, + Attributes, Counter, Histogram, ObservableGauge, @@ -109,15 +109,15 @@ export class NoopMeter implements Meter { export class NoopMetric {} export class NoopCounterMetric extends NoopMetric implements Counter { - add(_value: number, _labels: Labels): void {} + add(_value: number, _attributes: Attributes): void {} } export class NoopUpDownCounterMetric extends NoopMetric implements UpDownCounter { - add(_value: number, _labels: Labels): void {} + add(_value: number, _attributes: Attributes): void {} } export class NoopHistogramMetric extends NoopMetric implements Histogram { - record(_value: number, _labels: Labels): void {} + record(_value: number, _attributes: Attributes): void {} } export class NoopObservableBaseMetric extends NoopMetric implements ObservableBase { diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts index a3e37538ea6..ce4d57a4f86 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts @@ -39,7 +39,7 @@ export interface MeterOptions { * An interface to allow the recording metrics. * * {@link Metric}s are used for recording pre-defined aggregation (`Counter`), - * or raw values (`Histogram`) in which the aggregation and labels + * or raw values (`Histogram`) in which the aggregation and attributes * for the exported metric are deferred. */ export interface Meter { diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts index 90fc93fdace..3ba86d3e874 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts @@ -37,8 +37,8 @@ export interface MetricOptions { */ unit?: string; - /** The map of constant labels for the Metric. */ - constantLabels?: Map; + /** The map of constant attributes for the Metric. */ + constantAttributes?: Map; /** * Indicates the metric is a verbose metric that is disabled by default @@ -93,30 +93,30 @@ export enum AggregationTemporality { */ export interface Counter { /** - * Adds the given value to the current value. Values cannot be negative. + * Increment value of counter by the input. Inputs may not be negative. */ - add(value: number, labels?: Labels): void; + add(value: number, attributes?: Attributes): void; } export interface UpDownCounter { /** - * Adds the given value to the current value. Values can be negative. + * Increment value of counter by the input. Inputs may be negative. */ - add(value: number, labels?: Labels): void; + add(value: number, attributes?: Attributes): void; } export interface Histogram { /** * Records the given value to this histogram. */ - record(value: number, labels?: Labels): void; + record(value: number, attributes?: Attributes): void; } /** Base interface for the Observable metrics. */ export interface ObservableBase { observation: ( value: number, - labels?: Labels, + attributes?: Attributes, ) => Observation; } @@ -132,4 +132,4 @@ export type ObservableCounter = ObservableBase; /** * key-value pairs passed by the user. */ -export type Labels = { [key: string]: string }; +export type Attributes = { [key: string]: string }; diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts b/experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts index c909833ab9c..74f71d4accf 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { Labels } from './Metric'; +import { Attributes } from './Metric'; /** * Interface that is being used in callback function for Observable Metric */ export interface ObservableResult { - observe(value: number, labels: Labels): void; + observe(value: number, attributes: Attributes): void; } diff --git a/experimental/packages/opentelemetry-api-metrics/test/noop-implementations/noop-meter.test.ts b/experimental/packages/opentelemetry-api-metrics/test/noop-implementations/noop-meter.test.ts index b09c2cdd0e0..4d5fced1f9a 100644 --- a/experimental/packages/opentelemetry-api-metrics/test/noop-implementations/noop-meter.test.ts +++ b/experimental/packages/opentelemetry-api-metrics/test/noop-implementations/noop-meter.test.ts @@ -25,16 +25,16 @@ describe('NoopMeter', () => { it('should not crash', () => { const meter = new NoopMeterProvider().getMeter('test-noop'); const counter = meter.createCounter('some-name'); - const labels = {}; + const attributes = {}; // ensure NoopMetric does not crash. - counter.add(1, labels); + counter.add(1, attributes); // ensure the correct noop const is returned assert.strictEqual(counter, NOOP_COUNTER_METRIC); const histogram = meter.createHistogram('some-name'); - histogram.record(1, labels); + histogram.record(1, attributes); // ensure the correct noop const is returned assert.strictEqual(histogram, NOOP_HISTOGRAM_METRIC); diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts index c7b9169563f..b63947c28bc 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts @@ -15,7 +15,7 @@ */ import { SpanAttributes, HrTime } from '@opentelemetry/api'; -import { Labels, ValueType } from '@opentelemetry/api-metrics'; +import { Attributes as Labels, ValueType } from '@opentelemetry/api-metrics'; import * as core from '@opentelemetry/core'; import { AggregatorKind, @@ -54,7 +54,7 @@ export function toAggregationTemporality( } /** - * Returns an DataPoint which can have integers or doublle values + * Returns an DataPoint which can have integers or double values * @param metric * @param startTime */ @@ -63,7 +63,7 @@ export function toDataPoint( startTime: number ): otlpTypes.opentelemetryProto.metrics.v1.DataPoint { return { - labels: toCollectorLabels(metric.labels), + labels: toCollectorLabels(metric.attributes), value: metric.aggregator.toPoint().value as number, startTimeUnixNano: startTime, timeUnixNano: core.hrTimeToNanoseconds( @@ -86,7 +86,7 @@ export function toHistogramPoint( timestamp: HrTime; }; return { - labels: toCollectorLabels(metric.labels), + labels: toCollectorLabels(metric.attributes), sum: value.sum, count: value.count, startTimeUnixNano: startTime, diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts index b14e1b96d5c..3169c02c801 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts @@ -158,7 +158,7 @@ describe('transformMetrics', () => { ); }); - it('should convert metric labels value to string', () => { + it('should convert metric attributes value to string', () => { const metric = transform.toCollectorMetric( { descriptor: { @@ -168,7 +168,7 @@ describe('transformMetrics', () => { metricKind: 0, valueType: 0, }, - labels: { foo: (1 as unknown) as string }, + attributes: { foo: (1 as unknown) as string }, aggregator: new SumAggregator(), resource: new Resource({}), aggregationTemporality: 0, diff --git a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusLabelsBatcher.ts b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusAttributesBatcher.ts similarity index 90% rename from experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusLabelsBatcher.ts rename to experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusAttributesBatcher.ts index d04e87f5327..1ac7bb5ac9a 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusLabelsBatcher.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusAttributesBatcher.ts @@ -26,7 +26,7 @@ interface BatcherCheckpoint { records: Map; } -export class PrometheusLabelsBatcher { +export class PrometheusAttributesBatcher { private _batchMap = new Map(); get hasMetric(): boolean { @@ -45,10 +45,10 @@ export class PrometheusLabelsBatcher { this._batchMap.set(name, item); } const recordMap = item.records; - const labels = Object.keys(record.labels) - .map(k => `${k}=${record.labels[k]}`) + const attributes = Object.keys(record.attributes) + .map(k => `${k}=${record.attributes[k]}`) .join(','); - recordMap.set(labels, record); + recordMap.set(attributes, record); } checkPointSet(): PrometheusCheckpoint[] { diff --git a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts index 3028f227239..807b7a66362 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusExporter.ts @@ -25,7 +25,7 @@ import { createServer, IncomingMessage, Server, ServerResponse } from 'http'; import * as url from 'url'; import { ExporterConfig } from './export/types'; import { PrometheusSerializer } from './PrometheusSerializer'; -import { PrometheusLabelsBatcher } from './PrometheusLabelsBatcher'; +import { PrometheusAttributesBatcher } from './PrometheusAttributesBatcher'; export class PrometheusExporter implements MetricExporter { static readonly DEFAULT_OPTIONS = { @@ -43,10 +43,10 @@ export class PrometheusExporter implements MetricExporter { private readonly _prefix?: string; private readonly _appendTimestamp: boolean; private _serializer: PrometheusSerializer; - private _batcher = new PrometheusLabelsBatcher(); + private _batcher = new PrometheusAttributesBatcher(); // This will be required when histogram is implemented. Leaving here so it is not forgotten - // Histogram cannot have a label named 'le' + // Histogram cannot have a attribute named 'le' // private static readonly RESERVED_HISTOGRAM_LABEL = 'le'; /** diff --git a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts index 35473b14a3d..c08943cffab 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts @@ -19,7 +19,7 @@ import { MetricKind, } from '@opentelemetry/sdk-metrics-base'; import { PrometheusCheckpoint } from './types'; -import { Labels } from '@opentelemetry/api-metrics'; +import { Attributes } from '@opentelemetry/api-metrics'; import { hrTimeToMilliseconds } from '@opentelemetry/core'; type PrometheusDataTypeLiteral = @@ -33,7 +33,7 @@ function escapeString(str: string) { return str.replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); } -function escapeLabelValue(str: string) { +function escapeAttributeValue(str: string) { if (typeof str !== 'string') { str = String(str); } @@ -45,7 +45,7 @@ const invalidCharacterRegex = /[^a-z0-9_]/gi; * Ensures metric names are valid Prometheus metric names by removing * characters allowed by OpenTelemetry but disallowed by Prometheus. * - * https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels + * https://prometheus.io/docs/concepts/data_model/#metric-names-and-attributes * * 1. Names must match `[a-zA-Z_:][a-zA-Z0-9_:]*` * @@ -123,33 +123,33 @@ function toPrometheusType( function stringify( metricName: string, - labels: Labels, + attributes: Attributes, value: number, timestamp?: number, - additionalLabels?: Labels + additionalAttributes?: Attributes ) { - let hasLabel = false; - let labelsStr = ''; + let hasAttribute = false; + let attributesStr = ''; - for (const [key, val] of Object.entries(labels)) { - const sanitizedLabelName = sanitizePrometheusMetricName(key); - hasLabel = true; - labelsStr += `${ - labelsStr.length > 0 ? ',' : '' - }${sanitizedLabelName}="${escapeLabelValue(val)}"`; + for (const [key, val] of Object.entries(attributes)) { + const sanitizedAttributeName = sanitizePrometheusMetricName(key); + hasAttribute = true; + attributesStr += `${ + attributesStr.length > 0 ? ',' : '' + }${sanitizedAttributeName}="${escapeAttributeValue(val)}"`; } - if (additionalLabels) { - for (const [key, val] of Object.entries(additionalLabels)) { - const sanitizedLabelName = sanitizePrometheusMetricName(key); - hasLabel = true; - labelsStr += `${ - labelsStr.length > 0 ? ',' : '' - }${sanitizedLabelName}="${escapeLabelValue(val)}"`; + if (additionalAttributes) { + for (const [key, val] of Object.entries(additionalAttributes)) { + const sanitizedAttributeName = sanitizePrometheusMetricName(key); + hasAttribute = true; + attributesStr += `${ + attributesStr.length > 0 ? ',' : '' + }${sanitizedAttributeName}="${escapeAttributeValue(val)}"`; } } - if (hasLabel) { - metricName += `{${labelsStr}}`; + if (hasAttribute) { + metricName += `{${attributesStr}}`; } return `${metricName} ${valueString(value)}${ @@ -219,7 +219,7 @@ export class PrometheusSerializer { const timestamp = hrTimeToMilliseconds(hrtime); results += stringify( name, - record.labels, + record.attributes, value, this._appendTimestamp ? timestamp : undefined, undefined @@ -233,7 +233,7 @@ export class PrometheusSerializer { for (const key of ['count', 'sum'] as ('count' | 'sum')[]) { results += stringify( name + '_' + key, - record.labels, + record.attributes, value[key], this._appendTimestamp ? timestamp : undefined, undefined @@ -260,7 +260,7 @@ export class PrometheusSerializer { } results += stringify( name + '_bucket', - record.labels, + record.attributes, cumulativeSum, this._appendTimestamp ? timestamp : undefined, { diff --git a/experimental/packages/opentelemetry-exporter-prometheus/test/ExactProcessor.ts b/experimental/packages/opentelemetry-exporter-prometheus/test/ExactProcessor.ts index 6330e93eb5e..f69b716ad42 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/test/ExactProcessor.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/test/ExactProcessor.ts @@ -41,9 +41,9 @@ export class ExactProcessor extends Processor { } process(record: MetricRecord): void { - const labels = Object.keys(record.labels) - .map(k => `${k}=${record.labels[k]}`) + const attributes = Object.keys(record.attributes) + .map(k => `${k}=${record.attributes[k]}`) .join(','); - this._batchMap.set(record.descriptor.name + labels, record); + this._batchMap.set(record.descriptor.name + attributes, record); } } diff --git a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts index 3528df2c428..8808c092ee0 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts @@ -243,14 +243,14 @@ describe('PrometheusExporter', () => { description: 'a test description', }); - counter.add(10, { key1: 'labelValue1' }); + counter.add(10, { key1: 'attributeValue1' }); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { // TODO: Remove this special case once the PR is ready. // This is to test the special case where counters are destroyed // and recreated in the exporter in order to get around prom-client's // aggregation and use ours. - counter.add(10, { key1: 'labelValue1' }); + counter.add(10, { key1: 'attributeValue1' }); exporter.export(meter.getProcessor().checkPointSet(), () => { http .get('http://localhost:9464/metrics', res => { @@ -266,7 +266,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_total a test description', '# TYPE counter_total counter', - `counter_total{key1="labelValue1"} 20 ${mockedHrTimeMs}`, + `counter_total{key1="attributeValue1"} 20 ${mockedHrTimeMs}`, '', ]); @@ -321,13 +321,13 @@ describe('PrometheusExporter', () => { }); }); - it('should export multiple labels', done => { + it('should export multiple attributes', done => { const counter = meter.createCounter('counter_total', { description: 'a test description', }) as CounterMetric; - counter.add(10, { counterKey1: 'labelValue1' }); - counter.add(20, { counterKey1: 'labelValue2' }); + counter.add(10, { counterKey1: 'attributeValue1' }); + counter.add(20, { counterKey1: 'attributeValue2' }); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { http @@ -339,8 +339,8 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_total a test description', '# TYPE counter_total counter', - `counter_total{counterKey1="labelValue1"} 10 ${mockedHrTimeMs}`, - `counter_total{counterKey1="labelValue2"} 20 ${mockedHrTimeMs}`, + `counter_total{counterKey1="attributeValue1"} 10 ${mockedHrTimeMs}`, + `counter_total{counterKey1="attributeValue2"} 20 ${mockedHrTimeMs}`, '', ]); @@ -352,14 +352,14 @@ describe('PrometheusExporter', () => { }); }); - it('should export multiple labels on manual shutdown', done => { + it('should export multiple attributes on manual shutdown', done => { const counter = meter.createCounter('counter_total', { description: 'a test description', }) as CounterMetric; - counter.add(10, { counterKey1: 'labelValue1' }); - counter.add(20, { counterKey1: 'labelValue2' }); - counter.add(30, { counterKey1: 'labelValue3' }); + counter.add(10, { counterKey1: 'attributeValue1' }); + counter.add(20, { counterKey1: 'attributeValue2' }); + counter.add(30, { counterKey1: 'attributeValue3' }); meterProvider.shutdown().then(() => { // exporter has been shut down along with meter provider. http @@ -393,7 +393,7 @@ describe('PrometheusExporter', () => { it('should add a description if missing', done => { const counter = meter.createCounter('counter_total'); - counter.add(10, { key1: 'labelValue1' }); + counter.add(10, { key1: 'attributeValue1' }); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { http @@ -405,7 +405,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_total description missing', '# TYPE counter_total counter', - `counter_total{key1="labelValue1"} 10 ${mockedHrTimeMs}`, + `counter_total{key1="attributeValue1"} 10 ${mockedHrTimeMs}`, '', ]); @@ -420,7 +420,7 @@ describe('PrometheusExporter', () => { it('should sanitize names', done => { const counter = meter.createCounter('counter.bad-name'); - counter.add(10, { key1: 'labelValue1' }); + counter.add(10, { key1: 'attributeValue1' }); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { http @@ -432,7 +432,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_bad_name_total description missing', '# TYPE counter_bad_name_total counter', - `counter_bad_name_total{key1="labelValue1"} 10 ${mockedHrTimeMs}`, + `counter_bad_name_total{key1="attributeValue1"} 10 ${mockedHrTimeMs}`, '', ]); @@ -449,7 +449,7 @@ describe('PrometheusExporter', () => { description: 'a test description', }); - counter.add(20, { key1: 'labelValue1' }); + counter.add(20, { key1: 'attributeValue1' }); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { http @@ -458,7 +458,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(chunk.toString().split('\n'), [ '# HELP counter a test description', '# TYPE counter gauge', - `counter{key1="labelValue1"} 20 ${mockedHrTimeMs}`, + `counter{key1="attributeValue1"} 20 ${mockedHrTimeMs}`, '', ]); @@ -482,7 +482,7 @@ describe('PrometheusExporter', () => { }, (observableResult: ObservableResult) => { observableResult.observe(getValue(), { - key1: 'labelValue1', + key1: 'attributeValue1', }); } ); @@ -498,7 +498,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP metric_observable_counter a test description', '# TYPE metric_observable_counter gauge', - `metric_observable_counter{key1="labelValue1"} 20 ${mockedHrTimeMs}`, + `metric_observable_counter{key1="attributeValue1"} 20 ${mockedHrTimeMs}`, '', ]); }); @@ -522,7 +522,7 @@ describe('PrometheusExporter', () => { }, (observableResult: ObservableResult) => { observableResult.observe(getValue(), { - key1: 'labelValue1', + key1: 'attributeValue1', }); } ); @@ -538,7 +538,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP metric_observable_up_down_counter a test description', '# TYPE metric_observable_up_down_counter gauge', - `metric_observable_up_down_counter{key1="labelValue1"} 20 ${mockedHrTimeMs}`, + `metric_observable_up_down_counter{key1="attributeValue1"} 20 ${mockedHrTimeMs}`, '', ]); }); @@ -555,7 +555,7 @@ describe('PrometheusExporter', () => { description: 'a test description', }); - histogram.record(20, { key1: 'labelValue1' }); + histogram.record(20, { key1: 'attributeValue1' }); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { @@ -568,9 +568,9 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP test_histogram a test description', '# TYPE test_histogram histogram', - `test_histogram_count{key1="labelValue1"} 1 ${mockedHrTimeMs}`, - `test_histogram_sum{key1="labelValue1"} 20 ${mockedHrTimeMs}`, - `test_histogram_bucket{key1="labelValue1",le="+Inf"} 1 ${mockedHrTimeMs}`, + `test_histogram_count{key1="attributeValue1"} 1 ${mockedHrTimeMs}`, + `test_histogram_sum{key1="attributeValue1"} 20 ${mockedHrTimeMs}`, + `test_histogram_bucket{key1="attributeValue1",le="+Inf"} 1 ${mockedHrTimeMs}`, '', ]); @@ -591,7 +591,7 @@ describe('PrometheusExporter', () => { beforeEach(() => { meter = new MeterProvider().getMeter('test-prometheus'); counter = meter.createCounter('counter') as CounterMetric; - counter.add(10, { key1: 'labelValue1' }); + counter.add(10, { key1: 'attributeValue1' }); }); afterEach(done => { @@ -620,7 +620,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP test_prefix_counter_total description missing', '# TYPE test_prefix_counter_total counter', - `test_prefix_counter_total{key1="labelValue1"} 10 ${mockedHrTimeMs}`, + `test_prefix_counter_total{key1="attributeValue1"} 10 ${mockedHrTimeMs}`, '', ]); @@ -650,7 +650,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_total description missing', '# TYPE counter_total counter', - `counter_total{key1="labelValue1"} 10 ${mockedHrTimeMs}`, + `counter_total{key1="attributeValue1"} 10 ${mockedHrTimeMs}`, '', ]); @@ -680,7 +680,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_total description missing', '# TYPE counter_total counter', - `counter_total{key1="labelValue1"} 10 ${mockedHrTimeMs}`, + `counter_total{key1="attributeValue1"} 10 ${mockedHrTimeMs}`, '', ]); @@ -710,7 +710,7 @@ describe('PrometheusExporter', () => { assert.deepStrictEqual(lines, [ '# HELP counter_total description missing', '# TYPE counter_total counter', - 'counter_total{key1="labelValue1"} 10', + 'counter_total{key1="attributeValue1"} 10', '', ]); diff --git a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusLabelsBatcher.test.ts b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusLabelsBatcher.test.ts index 8ef180a27e9..0f1f00f370d 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusLabelsBatcher.test.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusLabelsBatcher.test.ts @@ -14,14 +14,14 @@ * limitations under the License. */ import * as assert from 'assert'; -import { PrometheusLabelsBatcher } from '../src/PrometheusLabelsBatcher'; +import { PrometheusAttributesBatcher } from '../src/PrometheusAttributesBatcher'; import { CounterMetric, AggregatorKind, MeterProvider, Meter, } from '@opentelemetry/sdk-metrics-base'; -import { Labels } from '@opentelemetry/api-metrics'; +import { Attributes } from '@opentelemetry/api-metrics'; describe('PrometheusBatcher', () => { let meter: Meter; @@ -31,14 +31,14 @@ describe('PrometheusBatcher', () => { describe('constructor', () => { it('should construct a batcher', () => { - const batcher = new PrometheusLabelsBatcher(); - assert(batcher instanceof PrometheusLabelsBatcher); + const batcher = new PrometheusAttributesBatcher(); + assert(batcher instanceof PrometheusAttributesBatcher); }); }); describe('process', () => { it('should aggregate metric records with same metric name', async () => { - const batcher = new PrometheusLabelsBatcher(); + const batcher = new PrometheusAttributesBatcher(); const counter = meter.createCounter('test_counter') as CounterMetric; counter.add(1, { val: '1' }); counter.add(1, { val: '2' }); @@ -53,20 +53,20 @@ describe('PrometheusBatcher', () => { assert.strictEqual(checkPointSet[0].records.length, 2); }); - it('should recognize identical labels with different key-insertion order', async () => { - const batcher = new PrometheusLabelsBatcher(); + it('should recognize identical attributes with different key-insertion order', async () => { + const batcher = new PrometheusAttributesBatcher(); const counter = meter.createCounter('test_counter') as CounterMetric; - const label1: Labels = {}; - label1.key1 = '1'; - label1.key2 = '2'; + const attribute1: Attributes = {}; + attribute1.key1 = '1'; + attribute1.key2 = '2'; - const label2: Labels = {}; - label2.key2 = '2'; - label2.key1 = '1'; + const attribute2: Attributes = {}; + attribute2.key2 = '2'; + attribute2.key1 = '1'; - counter.add(1, label1); - counter.add(1, label2); + counter.bind(attribute1).add(1); + counter.bind(attribute2).add(1); const records = await counter.getMetricRecord(); records.forEach(it => batcher.process(it)); diff --git a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts index 88a54223447..865353b116b 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts @@ -25,13 +25,13 @@ import { } from '@opentelemetry/sdk-metrics-base'; import { diag, DiagLogLevel } from '@opentelemetry/api'; import * as assert from 'assert'; -import { Labels } from '@opentelemetry/api-metrics'; +import { Attributes } from '@opentelemetry/api-metrics'; import { PrometheusSerializer } from '../src/PrometheusSerializer'; -import { PrometheusLabelsBatcher } from '../src/PrometheusLabelsBatcher'; +import { PrometheusAttributesBatcher } from '../src/PrometheusAttributesBatcher'; import { ExactProcessor } from './ExactProcessor'; import { mockedHrTimeMs, mockAggregator } from './util'; -const labels = { +const attributes = { foo1: 'bar1', foo2: 'bar2', }; @@ -55,7 +55,7 @@ describe('PrometheusSerializer', () => { processor: new ExactProcessor(SumAggregator), }).getMeter('test'); const counter = meter.createCounter('test_total') as CounterMetric; - counter.add(1, labels); + counter.add(1, attributes); const records = await counter.getMetricRecord(); const record = records[0]; @@ -77,7 +77,7 @@ describe('PrometheusSerializer', () => { processor: new ExactProcessor(SumAggregator), }).getMeter('test'); const counter = meter.createCounter('test_total') as CounterMetric; - counter.add(1, labels); + counter.add(1, attributes); const records = await counter.getMetricRecord(); const record = records[0]; @@ -103,7 +103,7 @@ describe('PrometheusSerializer', () => { 'test', {}, observableResult => { - observableResult.observe(1, labels); + observableResult.observe(1, attributes); } ) as ObservableGaugeMetric; await meter.collect(); @@ -130,7 +130,7 @@ describe('PrometheusSerializer', () => { 'test', {}, observableResult => { - observableResult.observe(1, labels); + observableResult.observe(1, attributes); } ) as ObservableGaugeMetric; await meter.collect(); @@ -157,7 +157,7 @@ describe('PrometheusSerializer', () => { description: 'foobar', }) as HistogramMetric; - histogram.record(5, labels); + histogram.record(5, attributes); const records = await histogram.getMetricRecord(); const record = records[0]; @@ -185,7 +185,7 @@ describe('PrometheusSerializer', () => { description: 'foobar', boundaries: [1, 10, 100], }) as HistogramMetric; - histogram.record(5, labels); + histogram.record(5, attributes); const records = await histogram.getMetricRecord(); const record = records[0]; @@ -213,7 +213,7 @@ describe('PrometheusSerializer', () => { const histogram = meter.createHistogram('test', { description: 'foobar', }) as HistogramMetric; - histogram.record(5, labels); + histogram.record(5, attributes); const records = await histogram.getMetricRecord(); const record = records[0]; @@ -245,7 +245,7 @@ describe('PrometheusSerializer', () => { const meter = new MeterProvider({ processor: new ExactProcessor(SumAggregator), }).getMeter('test'); - const processor = new PrometheusLabelsBatcher(); + const processor = new PrometheusAttributesBatcher(); const counter = meter.createCounter('test_total', { description: 'foobar', }) as CounterMetric; @@ -272,7 +272,7 @@ describe('PrometheusSerializer', () => { const meter = new MeterProvider({ processor: new ExactProcessor(SumAggregator), }).getMeter('test'); - const processor = new PrometheusLabelsBatcher(); + const processor = new PrometheusAttributesBatcher(); const counter = meter.createCounter('test_total', { description: 'foobar', }) as CounterMetric; @@ -303,14 +303,14 @@ describe('PrometheusSerializer', () => { const meter = new MeterProvider({ processor: new ExactProcessor(LastValueAggregator), }).getMeter('test'); - const processor = new PrometheusLabelsBatcher(); + const processor = new PrometheusAttributesBatcher(); const observableGauge = meter.createObservableGauge( 'test', { description: 'foobar', }, observableResult => { - observableResult.observe(1, labels); + observableResult.observe(1, attributes); } ) as ObservableGaugeMetric; await meter.collect(); @@ -346,9 +346,9 @@ describe('PrometheusSerializer', () => { histogram.record(5, { val: '2' }); const records = await histogram.getMetricRecord(); - const labelBatcher = new PrometheusLabelsBatcher(); - records.forEach(it => labelBatcher.process(it)); - const checkPointSet = labelBatcher.checkPointSet(); + const attributeBatcher = new PrometheusAttributesBatcher(); + records.forEach(it => attributeBatcher.process(it)); + const checkPointSet = attributeBatcher.checkPointSet(); const result = serializer.serialize(checkPointSet); assert.strictEqual( @@ -425,7 +425,7 @@ describe('PrometheusSerializer', () => { describe('with SumAggregator', () => { mockAggregator(SumAggregator); - it('should serialize records without labels', async () => { + it('should serialize records without attributes', async () => { const serializer = new PrometheusSerializer(); const meter = new MeterProvider({ @@ -444,7 +444,7 @@ describe('PrometheusSerializer', () => { assert.strictEqual(result, `test_total 1 ${mockedHrTimeMs}\n`); }); - it('should serialize non-string label values', async () => { + it('should serialize non-string attribute values', async () => { const serializer = new PrometheusSerializer(); const meter = new MeterProvider({ @@ -456,7 +456,7 @@ describe('PrometheusSerializer', () => { NaN: NaN, null: null, undefined: undefined, - } as unknown) as Labels); + } as unknown) as Attributes); const records = await counter.getMetricRecord(); const record = records[0]; @@ -485,7 +485,7 @@ describe('PrometheusSerializer', () => { const counter = meter.createUpDownCounter( 'test' ) as UpDownCounterMetric; - counter.add(esac[0], labels); + counter.add(esac[0], attributes); const records = await counter.getMetricRecord(); const record = records[0]; @@ -500,7 +500,7 @@ describe('PrometheusSerializer', () => { } }); - it('should escape backslash (\\), double-quote ("), and line feed (\\n) in label values', async () => { + it('should escape backslash (\\), double-quote ("), and line feed (\\n) in attribute values', async () => { const serializer = new PrometheusSerializer(); const meter = new MeterProvider({ @@ -514,7 +514,7 @@ describe('PrometheusSerializer', () => { backslashN: '\u005c\u006e', // \n => \\n (\u005c\u005c\u006e) backslashDoubleQuote: '\u005c\u0022', // \" => \\\" (\u005c\u005c\u005c\u0022) backslashLineFeed: '\u005c\u000a', // \↵ => \\\n (\u005c\u005c\u005c\u006e) - } as unknown) as Labels); + } as unknown) as Attributes); const records = await counter.getMetricRecord(); const record = records[0]; @@ -535,19 +535,19 @@ describe('PrometheusSerializer', () => { ); }); - it('should sanitize label names', async () => { + it('should sanitize attribute names', async () => { const serializer = new PrometheusSerializer(); const meter = new MeterProvider({ processor: new ExactProcessor(SumAggregator), }).getMeter('test_total'); const counter = meter.createCounter('test') as CounterMetric; - // if you try to use a label name like account-id prometheus will complain + // if you try to use a attribute name like account-id prometheus will complain // with an error like: // error while linting: text format parsing error in line 282: expected '=' after label name, found '-' counter.add(1, ({ 'account-id': '123456', - } as unknown) as Labels); + } as unknown) as Attributes); const records = await counter.getMetricRecord(); const record = records[0]; diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/README.md b/experimental/packages/opentelemetry-sdk-metrics-base/README.md index b89b7658e80..cf1d5bcdc2e 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/README.md +++ b/experimental/packages/opentelemetry-sdk-metrics-base/README.md @@ -36,8 +36,8 @@ const counter = meter.createCounter('metric_name', { description: 'Example of a counter' }); -const labels = { pid: process.pid }; -counter.add(10, labels); +const attributes = { pid: process.pid }; +counter.add(10, attributes); ``` ### UpDownCounter @@ -61,8 +61,8 @@ const counter = meter.createUpDownCounter('metric_name', { description: 'Example of a UpDownCounter' }); -const labels = { pid: process.pid }; -counter.add(Math.random() > 0.5 ? 1 : -1, labels); +const attributes = { pid: process.pid }; +counter.add(Math.random() > 0.5 ? 1 : -1, attributes); ``` ### Observable Gauge @@ -81,7 +81,7 @@ meter.createObservableGauge('your_metric_name', { description: 'Example of an async observable gauge with callback', }, async (observableResult) => { const value = await getAsyncValue(); - observableResult.observe(value, { label: '1' }); + observableResult.observe(value, { attribute: '1' }); }); function getAsyncValue() { @@ -96,8 +96,8 @@ function getAsyncValue() { meter.createObservableGauge('your_metric_name', { description: 'Example of a sync observable gauge with callback', }, (observableResult) => { - observableResult.observe(getRandomValue(), { label: '1' }); - observableResult.observe(getRandomValue(), { label: '2' }); + observableResult.observe(getRandomValue(), { attribute: '1' }); + observableResult.observe(getRandomValue(), { attribute: '2' }); }); function getRandomValue() { @@ -120,7 +120,7 @@ meter.createObservableUpDownCounter('your_metric_name', { description: 'Example of an async observable up down counter with callback', }, async (observableResult) => { const value = await getAsyncValue(); - observableResult.observe(value, { label: '1' }); + observableResult.observe(value, { attribute: '1' }); }); function getAsyncValue() { @@ -135,7 +135,7 @@ function getAsyncValue() { meter.createObservableUpDownCounter('your_metric_name', { description: 'Example of a sync observable up down counter with callback', }, (observableResult) => { - observableResult.observe(getRandomValue(), { label: '1' }); + observableResult.observe(getRandomValue(), { attribute: '1' }); }); function getRandomValue() { @@ -159,7 +159,7 @@ meter.createObservableCounter('example_metric', { description: 'Example of an async observable counter with callback', }, async (observableResult) => { const value = await getAsyncValue(); - observableResult.observe(value, { label: '1' }); + observableResult.observe(value, { attribute: '1' }); }); function getAsyncValue() { @@ -175,7 +175,7 @@ meter.createObservableCounter('example_metric', { description: 'Example of a sync observable counter with callback', }, (observableResult) => { const value = getRandomValue(); - observableResult.observe(value, { label: '1' }); + observableResult.observe(value, { attribute: '1' }); }); function getRandomValue() { diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts index e09524e3a2f..71d330626bc 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts @@ -23,15 +23,15 @@ import { Aggregator } from './export/types'; * the TimeSeries. */ export class BaseBoundInstrument { - protected _labels: api.Labels; + protected _attributes: api.Attributes; constructor( - labels: api.Labels, + attributes: api.Attributes, private readonly _disabled: boolean, private readonly _valueType: api.ValueType, private readonly _aggregator: Aggregator ) { - this._labels = labels; + this._attributes = attributes; } update(value: number): void { @@ -39,7 +39,7 @@ export class BaseBoundInstrument { if (typeof value !== 'number') { diag.error( `Metric cannot accept a non-number value for ${Object.values( - this._labels + this._attributes )}.` ); return; @@ -48,7 +48,7 @@ export class BaseBoundInstrument { if (this._valueType === api.ValueType.INT && !Number.isInteger(value)) { diag.warn( `INT value type cannot accept a floating-point value for ${Object.values( - this._labels + this._attributes )}, ignoring the fractional digits.` ); value = Math.trunc(value); @@ -57,8 +57,8 @@ export class BaseBoundInstrument { this._aggregator.update(value); } - getLabels(): api.Labels { - return this._labels; + getAttributes(): api.Attributes { + return this._attributes; } getAggregator(): Aggregator { @@ -68,23 +68,23 @@ export class BaseBoundInstrument { /** * BoundCounter allows the SDK to observe/record a single metric event. The - * value of single instrument in the `Counter` associated with specified Labels. + * value of single instrument in the `Counter` associated with specified Attributes. */ export class BoundCounter extends BaseBoundInstrument implements api.Counter { constructor( - labels: api.Labels, + attributes: api.Attributes, disabled: boolean, valueType: api.ValueType, aggregator: Aggregator ) { - super(labels, disabled, valueType, aggregator); + super(attributes, disabled, valueType, aggregator); } add(value: number): void { if (value < 0) { - diag.error(`Counter cannot descend for ${Object.values(this._labels)}`); + diag.error(`Counter cannot descend for ${Object.values(this._attributes)}`); return; } @@ -95,18 +95,18 @@ export class BoundCounter /** * BoundUpDownCounter allows the SDK to observe/record a single metric event. * The value of single instrument in the `UpDownCounter` associated with - * specified Labels. + * specified Attributes. */ export class BoundUpDownCounter extends BaseBoundInstrument implements api.UpDownCounter { constructor( - labels: api.Labels, + attributes: api.Attributes, disabled: boolean, valueType: api.ValueType, aggregator: Aggregator ) { - super(labels, disabled, valueType, aggregator); + super(attributes, disabled, valueType, aggregator); } add(value: number): void { @@ -121,12 +121,12 @@ export class BoundHistogram extends BaseBoundInstrument implements api.Histogram { constructor( - labels: api.Labels, + attributes: api.Attributes, disabled: boolean, valueType: api.ValueType, aggregator: Aggregator ) { - super(labels, disabled, valueType, aggregator); + super(attributes, disabled, valueType, aggregator); } record(value: number): void { @@ -139,11 +139,11 @@ export class BoundHistogram */ export class BoundObservable extends BaseBoundInstrument { constructor( - labels: api.Labels, + attributes: api.Attributes, disabled: boolean, valueType: api.ValueType, aggregator: Aggregator ) { - super(labels, disabled, valueType, aggregator); + super(attributes, disabled, valueType, aggregator); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts index 4f4fe3f04d4..cda71ac9210 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts @@ -33,9 +33,9 @@ export class CounterMetric extends Metric implements api.Counter { ) { super(name, options, MetricKind.COUNTER, resource, instrumentationLibrary); } - protected _makeInstrument(labels: api.Labels): BoundCounter { + protected _makeInstrument(attributes: api.Attributes): BoundCounter { return new BoundCounter( - labels, + attributes, this._disabled, this._valueType, this._processor.aggregatorFor(this._descriptor) @@ -45,10 +45,10 @@ export class CounterMetric extends Metric implements api.Counter { /** * Adds the given value to the current value. Values cannot be negative. * @param value the value to add. - * @param [labels = {}] key-values pairs that are associated with a specific metric + * @param [attributes = {}] key-values pairs that are associated with a specific metric * that you want to record. */ - add(value: number, labels: api.Labels = {}): void { - this.bind(labels).add(value); + add(value: number, attributes: api.Attributes = {}): void { + this.bind(attributes).add(value); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts index 20a7ade3a77..07c969b51d6 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts @@ -42,16 +42,16 @@ export class HistogramMetric ); } - protected _makeInstrument(labels: api.Labels): BoundHistogram { + protected _makeInstrument(attributes: api.Attributes): BoundHistogram { return new BoundHistogram( - labels, + attributes, this._disabled, this._valueType, this._processor.aggregatorFor(this._descriptor) ); } - record(value: number, labels: api.Labels = {}): void { - this.bind(labels).record(value); + record(value: number, attributes: api.Attributes = {}): void { + this.bind(attributes).record(value); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/Metric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/Metric.ts index 4dc8b96878c..dd7ad028fa4 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/Metric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/Metric.ts @@ -18,7 +18,7 @@ import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { BaseBoundInstrument } from './BoundInstrument'; import { MetricDescriptor, MetricKind, MetricRecord } from './export/types'; -import { hashLabels } from './Utils'; +import { hashAttributes } from './Utils'; /** This is a SDK implementation of {@link Metric} interface. */ export abstract class Metric { @@ -50,28 +50,28 @@ export abstract class Metric { } /** - * Returns an Instrument associated with specified Labels. + * Returns an Instrument associated with specified Attributes. * It is recommended to keep a reference to the Instrument instead of always * calling this method for each operation. - * @param labels key-values pairs that are associated with a specific metric + * @param attributes key-values pairs that are associated with a specific metric * that you want to record. */ - bind(labels: api.Labels): T { - const hash = hashLabels(labels); + bind(attributes: api.Attributes): T { + const hash = hashAttributes(attributes); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (this._instruments.has(hash)) return this._instruments.get(hash)!; - const instrument = this._makeInstrument(labels); + const instrument = this._makeInstrument(attributes); this._instruments.set(hash, instrument); return instrument; } /** * Removes the Instrument from the metric, if it is present. - * @param labels key-values pairs that are associated with a specific metric. + * @param attributes key-values pairs that are associated with a specific metric. */ - unbind(labels: api.Labels): void { - this._instruments.delete(hashLabels(labels)); + unbind(attributes: api.Attributes): void { + this._instruments.delete(hashAttributes(attributes)); } /** @@ -97,7 +97,7 @@ export abstract class Metric { resolve( Array.from(this._instruments.values()).map(instrument => ({ descriptor: this._descriptor, - labels: instrument.getLabels(), + attributes: instrument.getAttributes(), aggregator: instrument.getAggregator(), aggregationTemporality: this.getAggregationTemporality(), resource: this.resource, @@ -118,5 +118,5 @@ export abstract class Metric { }; } - protected abstract _makeInstrument(labels: api.Labels): T; + protected abstract _makeInstrument(attributes: api.Attributes): T; } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts index 60626680a57..a5c24c9c0b9 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts @@ -47,9 +47,9 @@ export abstract class ObservableBaseMetric this._callback = callback || NOOP_CALLBACK; } - protected _makeInstrument(labels: api.Labels): BoundObservable { + protected _makeInstrument(attributes: api.Attributes): BoundObservable { return new BoundObservable( - labels, + attributes, this._disabled, this._valueType, this._processor.aggregatorFor(this._descriptor) @@ -66,8 +66,8 @@ export abstract class ObservableBaseMetric } protected _processResults(observableResult: ObservableResult): void { - observableResult.values.forEach((value, labels) => { - const instrument = this.bind(labels); + observableResult.values.forEach((value, attributes) => { + const instrument = this.bind(attributes); instrument.update(value); }); } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts index 5465f14eff8..e4b79b58783 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts @@ -46,8 +46,8 @@ export class ObservableCounterMetric } protected override _processResults(observableResult: ObservableResult): void { - observableResult.values.forEach((value, labels) => { - const instrument = this.bind(labels); + observableResult.values.forEach((value, attributes) => { + const instrument = this.bind(attributes); // ObservableCounter is monotonic which means it should only accept values // greater or equal then previous value const previous = instrument.getAggregator().toPoint(); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts index 51fc07899ec..3ad7ee8a60c 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts @@ -16,16 +16,16 @@ import { ObservableResult as TypeObservableResult, - Labels, + Attributes, } from '@opentelemetry/api-metrics'; /** * Implementation of {@link TypeObservableResult} */ export class ObservableResult implements TypeObservableResult { - values: Map = new Map(); + values: Map = new Map(); - observe(value: number, labels: Labels): void { - this.values.set(labels, value); + observe(value: number, attributes: Attributes): void { + this.values.set(attributes, value); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts index 491a4647dc8..6706ee01f7a 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts @@ -41,9 +41,9 @@ export class UpDownCounterMetric instrumentationLibrary ); } - protected _makeInstrument(labels: api.Labels): BoundUpDownCounter { + protected _makeInstrument(attributes: api.Attributes): BoundUpDownCounter { return new BoundUpDownCounter( - labels, + attributes, this._disabled, this._valueType, this._processor.aggregatorFor(this._descriptor) @@ -53,10 +53,10 @@ export class UpDownCounterMetric /** * Adds the given value to the current value. Values cannot be negative. * @param value the value to add. - * @param [labels = {}] key-values pairs that are associated with a specific + * @param [attributes = {}] key-values pairs that are associated with a specific * metric that you want to record. */ - add(value: number, labels: api.Labels = {}): void { - this.bind(labels).add(value); + add(value: number, attributes: api.Attributes = {}): void { + this.bind(attributes).add(value); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/Utils.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/Utils.ts index 6b0fa1503d0..8de8687fe62 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/Utils.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/Utils.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Labels } from '@opentelemetry/api-metrics'; +import { Attributes } from '@opentelemetry/api-metrics'; /** * Type guard to remove nulls from arrays @@ -26,11 +26,11 @@ export function notNull(value: T | null): value is T { } /** - * Converting the unordered labels into unique identifier string. - * @param labels user provided unordered Labels. + * Converting the unordered attributes into unique identifier string. + * @param attributes user provided unordered Attributes. */ -export function hashLabels(labels: Labels): string { - let keys = Object.keys(labels); +export function hashAttributes(attributes: Attributes): string { + let keys = Object.keys(attributes); if (keys.length === 0) return ''; keys = keys.sort(); @@ -38,6 +38,6 @@ export function hashLabels(labels: Labels): string { if (result.length > 2) { result += ','; } - return (result += key + ':' + labels[key]); + return (result += key + ':' + attributes[key]); }, '|#'); } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/ConsoleMetricExporter.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/ConsoleMetricExporter.ts index acade23dc72..ccdcc8400db 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/ConsoleMetricExporter.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/ConsoleMetricExporter.ts @@ -30,7 +30,7 @@ export class ConsoleMetricExporter implements MetricExporter { ): void { for (const metric of metrics) { console.log(metric.descriptor); - console.log(metric.labels); + console.log(metric.attributes); const point = metric.aggregator.toPoint(); if (typeof point.value === 'number') { console.log('value: ' + point.value); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/Processor.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/Processor.ts index 3cc23c70f00..519ffe99d47 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/Processor.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/Processor.ts @@ -44,7 +44,7 @@ export abstract class Processor { } /** - * Processor which retains all dimensions/labels. It accepts all records and + * Processor which retains all dimensions/attributes. It accepts all records and * passes them for exporting. */ export class UngroupedProcessor extends Processor { @@ -70,9 +70,9 @@ export class UngroupedProcessor extends Processor { } process(record: MetricRecord): void { - const labels = Object.keys(record.labels) - .map(k => `${k}=${record.labels[k]}`) + const attributes = Object.keys(record.attributes) + .map(k => `${k}=${record.attributes[k]}`) .join(','); - this._batchMap.set(record.descriptor.name + labels, record); + this._batchMap.set(record.descriptor.name + attributes, record); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/types.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/types.ts index 61b22f45132..0f64af0901e 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/types.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/types.ts @@ -16,7 +16,7 @@ import { HrTime } from '@opentelemetry/api'; import { - Labels, + Attributes, AggregationTemporality, ValueType, } from '@opentelemetry/api-metrics'; @@ -77,7 +77,7 @@ export type PointValueType = Sum | LastValue | Histogram; export interface MetricRecord { readonly descriptor: MetricDescriptor; - readonly labels: Labels; + readonly attributes: Attributes; readonly aggregator: Aggregator; readonly aggregationTemporality: AggregationTemporality; readonly resource: Resource; diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts b/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts index 851ba684ebb..7d227177dc7 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts @@ -38,7 +38,7 @@ import { import { SumAggregator } from '../src/export/aggregators'; import { ObservableCounterMetric } from '../src/ObservableCounterMetric'; import { ObservableUpDownCounterMetric } from '../src/ObservableUpDownCounterMetric'; -import { hashLabels } from '../src/Utils'; +import { hashAttributes } from '../src/Utils'; const nonNumberValues = [ // type undefined @@ -71,7 +71,7 @@ describe('Meter', () => { let meter: Meter; const keya = 'keya'; const keyb = 'keyb'; - const labels: api.Labels = { [keyb]: 'value2', [keya]: 'value1' }; + const attributes: api.Attributes = { [keyb]: 'value2', [keya]: 'value1' }; beforeEach(() => { meter = new MeterProvider().getMeter('test-meter'); @@ -100,7 +100,7 @@ describe('Meter', () => { it('should be able to call add() directly on counter', async () => { const counter = meter.createCounter('name') as CounterMetric; - counter.add(10, labels); + counter.add(10, attributes); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -110,7 +110,7 @@ describe('Meter', () => { hrTimeToNanoseconds(lastTimestamp) > hrTimeToNanoseconds(performanceTimeOrigin) ); - counter.add(10, labels); + counter.add(10, attributes); assert.strictEqual(record1.aggregator.toPoint().value, 20); assert.ok( @@ -119,7 +119,7 @@ describe('Meter', () => { ); }); - it('should be able to call add with no labels', async () => { + it('should be able to call add with no attributes', async () => { const counter = meter.createCounter('name', { description: 'desc', unit: '1', @@ -156,7 +156,7 @@ describe('Meter', () => { describe('.bind()', () => { it('should create a counter instrument', async () => { const counter = meter.createCounter('name') as CounterMetric; - const boundCounter = counter.bind(labels); + const boundCounter = counter.bind(attributes); boundCounter.add(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -168,15 +168,15 @@ describe('Meter', () => { it('should return the aggregator', () => { const counter = meter.createCounter('name') as CounterMetric; - const boundCounter = counter.bind(labels); + const boundCounter = counter.bind(attributes); boundCounter.add(20); assert.ok(boundCounter.getAggregator() instanceof SumAggregator); - assert.strictEqual(boundCounter.getLabels(), labels); + assert.strictEqual(boundCounter.getAttributes(), attributes); }); it('should add positive values only', async () => { const counter = meter.createCounter('name') as CounterMetric; - const boundCounter = counter.bind(labels); + const boundCounter = counter.bind(attributes); boundCounter.add(10); assert.strictEqual(meter.getProcessor().checkPointSet().length, 0); await meter.collect(); @@ -191,18 +191,18 @@ describe('Meter', () => { const counter = meter.createCounter('name', { disabled: true, }) as CounterMetric; - const boundCounter = counter.bind(labels); + const boundCounter = counter.bind(attributes); boundCounter.add(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); assert.strictEqual(record1.aggregator.toPoint().value, 0); }); - it('should return same instrument on same label values', async () => { + it('should return same instrument on same attribute values', async () => { const counter = meter.createCounter('name') as CounterMetric; - const boundCounter = counter.bind(labels); + const boundCounter = counter.bind(attributes); boundCounter.add(10); - const boundCounter1 = counter.bind(labels); + const boundCounter1 = counter.bind(attributes); boundCounter1.add(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -215,11 +215,11 @@ describe('Meter', () => { describe('.unbind()', () => { it('should remove a counter instrument', () => { const counter = meter.createCounter('name') as CounterMetric; - const boundCounter = counter.bind(labels); + const boundCounter = counter.bind(attributes); assert.strictEqual(counter['_instruments'].size, 1); - counter.unbind(labels); + counter.unbind(attributes); assert.strictEqual(counter['_instruments'].size, 0); - const boundCounter1 = counter.bind(labels); + const boundCounter1 = counter.bind(attributes); assert.strictEqual(counter['_instruments'].size, 1); assert.notStrictEqual(boundCounter, boundCounter1); }); @@ -231,7 +231,7 @@ describe('Meter', () => { it('should clear all instruments', () => { const counter = meter.createCounter('name') as CounterMetric; - counter.bind(labels); + counter.bind(attributes); assert.strictEqual(counter['_instruments'].size, 1); counter.clear(); assert.strictEqual(counter['_instruments'].size, 0); @@ -241,13 +241,13 @@ describe('Meter', () => { describe('.registerMetric()', () => { it('skip already registered Metric', async () => { const counter1 = meter.createCounter('name1') as CounterMetric; - counter1.bind(labels).add(10); + counter1.bind(attributes).add(10); // should skip below metric const counter2 = meter.createCounter('name1', { valueType: api.ValueType.INT, }) as CounterMetric; - counter2.bind(labels).add(500); + counter2.bind(attributes).add(500); await meter.collect(); const record = meter.getProcessor().checkPointSet(); @@ -319,7 +319,7 @@ describe('Meter', () => { it('should be able to call add() directly on UpDownCounter', async () => { const upDownCounter = meter.createUpDownCounter('name'); - upDownCounter.add(10, labels); + upDownCounter.add(10, attributes); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -329,7 +329,7 @@ describe('Meter', () => { hrTimeToNanoseconds(lastTimestamp) > hrTimeToNanoseconds(performanceTimeOrigin) ); - upDownCounter.add(10, labels); + upDownCounter.add(10, attributes); assert.strictEqual(record1.aggregator.toPoint().value, 20); assert.ok( @@ -338,7 +338,7 @@ describe('Meter', () => { ); }); - it('should be able to call add with no labels', async () => { + it('should be able to call add with no attributes', async () => { const upDownCounter = meter.createUpDownCounter('name', { description: 'desc', unit: '1', @@ -365,7 +365,7 @@ describe('Meter', () => { describe('.bind()', () => { it('should create a UpDownCounter instrument', async () => { const upDownCounter = meter.createUpDownCounter('name') as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); boundCounter.add(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -379,28 +379,28 @@ describe('Meter', () => { const upDownCounter = meter.createUpDownCounter( 'name' ) as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); boundCounter.add(20); assert.ok(boundCounter.getAggregator() instanceof SumAggregator); - assert.strictEqual(boundCounter.getLabels(), labels); + assert.strictEqual(boundCounter.getAttributes(), attributes); }); it('should not add the instrument data when disabled', async () => { const upDownCounter = meter.createUpDownCounter('name', { disabled: true, }) as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); boundCounter.add(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); assert.strictEqual(record1.aggregator.toPoint().value, 0); }); - it('should return same instrument on same label values', async () => { + it('should return same instrument on same attribute values', async () => { const upDownCounter = meter.createUpDownCounter('name') as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); boundCounter.add(10); - const boundCounter1 = upDownCounter.bind(labels); + const boundCounter1 = upDownCounter.bind(attributes); boundCounter1.add(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -413,7 +413,7 @@ describe('Meter', () => { const upDownCounter = meter.createUpDownCounter('name', { valueType: api.ValueType.INT, }) as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); [-1.1, 2.2].forEach(val => { boundCounter.add(val); @@ -427,7 +427,7 @@ describe('Meter', () => { const upDownCounter = meter.createUpDownCounter('name', { valueType: api.ValueType.DOUBLE, }) as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); await Promise.all( nonNumberValues.map(async val => { @@ -445,7 +445,7 @@ describe('Meter', () => { const upDownCounter = meter.createUpDownCounter('name', { valueType: api.ValueType.DOUBLE, }) as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); await Promise.all( nonNumberValues.map(async val => { @@ -465,11 +465,11 @@ describe('Meter', () => { const upDownCounter = meter.createUpDownCounter( 'name' ) as UpDownCounterMetric; - const boundCounter = upDownCounter.bind(labels); + const boundCounter = upDownCounter.bind(attributes); assert.strictEqual(upDownCounter['_instruments'].size, 1); - upDownCounter.unbind(labels); + upDownCounter.unbind(attributes); assert.strictEqual(upDownCounter['_instruments'].size, 0); - const boundCounter1 = upDownCounter.bind(labels); + const boundCounter1 = upDownCounter.bind(attributes); assert.strictEqual(upDownCounter['_instruments'].size, 1); assert.notStrictEqual(boundCounter, boundCounter1); }); @@ -483,7 +483,7 @@ describe('Meter', () => { const upDownCounter = meter.createUpDownCounter( 'name' ) as CounterMetric; - upDownCounter.bind(labels); + upDownCounter.bind(attributes); assert.strictEqual(upDownCounter['_instruments'].size, 1); upDownCounter.clear(); assert.strictEqual(upDownCounter['_instruments'].size, 0); @@ -493,13 +493,13 @@ describe('Meter', () => { describe('.registerMetric()', () => { it('skip already registered Metric', async () => { const counter1 = meter.createCounter('name1') as CounterMetric; - counter1.bind(labels).add(10); + counter1.bind(attributes).add(10); // should skip below metric const counter2 = meter.createCounter('name1', { valueType: api.ValueType.INT, }) as CounterMetric; - counter2.bind(labels).add(500); + counter2.bind(attributes).add(500); await meter.collect(); const record = meter.getProcessor().checkPointSet(); @@ -641,7 +641,7 @@ describe('Meter', () => { const histogram = meter.createHistogram( 'name' ) as HistogramMetric; - const boundHistogram = histogram.bind(labels); + const boundHistogram = histogram.bind(attributes); assert.doesNotThrow(() => boundHistogram.record(10)); }); @@ -649,7 +649,7 @@ describe('Meter', () => { const histogram = meter.createHistogram('name', { disabled: true, }) as HistogramMetric; - const boundHistogram = histogram.bind(labels); + const boundHistogram = histogram.bind(attributes); boundHistogram.record(10); await meter.collect(); @@ -669,7 +669,7 @@ describe('Meter', () => { it('should accept negative (and positive) values', async () => { const histogram = meter.createHistogram('name') as HistogramMetric; - const boundHistogram = histogram.bind(labels); + const boundHistogram = histogram.bind(attributes); boundHistogram.record(-10); boundHistogram.record(50); @@ -692,13 +692,13 @@ describe('Meter', () => { ); }); - it('should return same instrument on same label values', async () => { + it('should return same instrument on same attribute values', async () => { const histogram = meter.createHistogram( 'name' ) as HistogramMetric; - const boundHistogram1 = histogram.bind(labels); + const boundHistogram1 = histogram.bind(attributes); boundHistogram1.record(10); - const boundHistogram2 = histogram.bind(labels); + const boundHistogram2 = histogram.bind(attributes); boundHistogram2.record(100); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -720,7 +720,7 @@ describe('Meter', () => { const histogram = meter.createHistogram( 'name' ) as HistogramMetric; - const boundHistogram = histogram.bind(labels); + const boundHistogram = histogram.bind(attributes); await Promise.all( nonNumberValues.map(async val => { @@ -749,11 +749,11 @@ describe('Meter', () => { const histogram = meter.createHistogram( 'name' ) as HistogramMetric; - const boundHistogram = histogram.bind(labels); + const boundHistogram = histogram.bind(attributes); assert.strictEqual(histogram['_instruments'].size, 1); - histogram.unbind(labels); + histogram.unbind(attributes); assert.strictEqual(histogram['_instruments'].size, 0); - const boundHistogram2 = histogram.bind(labels); + const boundHistogram2 = histogram.bind(attributes); assert.strictEqual(histogram['_instruments'].size, 1); assert.notStrictEqual(boundHistogram, boundHistogram2); }); @@ -767,7 +767,7 @@ describe('Meter', () => { const histogram = meter.createHistogram( 'name' ) as HistogramMetric; - histogram.bind(labels); + histogram.bind(attributes); assert.strictEqual(histogram['_instruments'].size, 1); histogram.clear(); assert.strictEqual(histogram['_instruments'].size, 0); @@ -834,7 +834,7 @@ describe('Meter', () => { let point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, -1); assert.strictEqual( - hashLabels(metricRecords[0].labels), + hashAttributes(metricRecords[0].attributes), '|#core:1,pid:123' ); @@ -975,10 +975,10 @@ describe('Meter', () => { const metric2 = metricRecords[1]; const metric3 = metricRecords[2]; const metric4 = metricRecords[3]; - 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'); - assert.strictEqual(hashLabels(metric4.labels), '|#core:4,pid:123'); + assert.strictEqual(hashAttributes(metric1.attributes), '|#core:1,pid:123'); + assert.strictEqual(hashAttributes(metric2.attributes), '|#core:2,pid:123'); + assert.strictEqual(hashAttributes(metric3.attributes), '|#core:3,pid:123'); + assert.strictEqual(hashAttributes(metric4.attributes), '|#core:4,pid:123'); ensureMetric(metric1); ensureMetric(metric2); @@ -1058,7 +1058,7 @@ describe('Meter', () => { let point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, 3); assert.strictEqual( - hashLabels(metricRecords[0].labels), + hashAttributes(metricRecords[0].attributes), '|#core:1,pid:123' ); @@ -1149,8 +1149,8 @@ describe('Meter', () => { const counter = meter.createCounter('counter', { description: 'test', }) as CounterMetric; - const labels = { [key]: 'counter-value' }; - const boundCounter = counter.bind(labels); + const attributes = { [key]: 'counter-value' }; + const boundCounter = counter.bind(attributes); boundCounter.add(10.45); await meter.collect(); @@ -1164,7 +1164,7 @@ describe('Meter', () => { unit: '1', valueType: api.ValueType.DOUBLE, }); - assert.strictEqual(record[0].labels, labels); + assert.strictEqual(record[0].attributes, attributes); const value = record[0].aggregator.toPoint().value as Sum; assert.strictEqual(value, 10.45); }); @@ -1175,8 +1175,8 @@ describe('Meter', () => { description: 'test', valueType: api.ValueType.INT, }) as CounterMetric; - const labels = { [key]: 'counter-value' }; - const boundCounter = counter.bind(labels); + const attributes = { [key]: 'counter-value' }; + const boundCounter = counter.bind(attributes); boundCounter.add(10.45); await meter.collect(); @@ -1190,7 +1190,7 @@ describe('Meter', () => { unit: '1', valueType: api.ValueType.INT, }); - assert.strictEqual(record[0].labels, labels); + assert.strictEqual(record[0].attributes, attributes); const value = record[0].aggregator.toPoint().value as Sum; assert.strictEqual(value, 10); }); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/test/Processor.test.ts b/experimental/packages/opentelemetry-sdk-metrics-base/test/Processor.test.ts index cb1a459b031..72af5f7bb66 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/test/Processor.test.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/test/Processor.test.ts @@ -40,7 +40,7 @@ describe('Processor', () => { const checkPointSet = meter.getProcessor().checkPointSet(); assert.strictEqual(checkPointSet.length, 2); for (const record of checkPointSet) { - switch (record.labels.key) { + switch (record.attributes.key) { case 'foo': assert.strictEqual(record.aggregator.toPoint().value, 1); break; @@ -48,7 +48,7 @@ describe('Processor', () => { assert.strictEqual(record.aggregator.toPoint().value, 3); break; default: - throw new Error('Unknown labelset'); + throw new Error('Unknown attributeset'); } } }); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/test/export/ConsoleMetricExporter.test.ts b/experimental/packages/opentelemetry-sdk-metrics-base/test/export/ConsoleMetricExporter.test.ts index 4935c498d8b..10168b01746 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/test/export/ConsoleMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/test/export/ConsoleMetricExporter.test.ts @@ -45,15 +45,15 @@ describe('ConsoleMetricExporter', () => { description: 'a test description', }) as CounterMetric; const boundCounter = counter.bind({ - key1: 'labelValue1', - key2: 'labelValue2', + key1: 'attributeValue1', + key2: 'attributeValue2', }); boundCounter.add(10); await meter.collect(); consoleExporter.export(meter.getProcessor().checkPointSet(), () => {}); assert.strictEqual(spyConsole.args.length, 3); - const [descriptor, labels, value] = spyConsole.args; + const [descriptor, attributes, value] = spyConsole.args; assert.deepStrictEqual(descriptor, [ { description: 'a test description', @@ -63,10 +63,10 @@ describe('ConsoleMetricExporter', () => { valueType: ValueType.DOUBLE, }, ]); - assert.deepStrictEqual(labels, [ + assert.deepStrictEqual(attributes, [ { - key1: 'labelValue1', - key2: 'labelValue2', + key1: 'attributeValue1', + key2: 'attributeValue2', }, ]); assert.deepStrictEqual(value[0], 'value: 10'); From 70004c4947d348f9aaad57a456682f25457fca54 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 8 Nov 2021 15:14:10 +0100 Subject: [PATCH 10/13] chore(deps): update dependency sinon to v12 (#2603) --- .../opentelemetry-exporter-metrics-otlp-grpc/package.json | 2 +- .../opentelemetry-exporter-metrics-otlp-http/package.json | 2 +- .../opentelemetry-exporter-metrics-otlp-proto/package.json | 2 +- .../packages/opentelemetry-exporter-prometheus/package.json | 2 +- .../opentelemetry-exporter-trace-otlp-grpc/package.json | 2 +- .../opentelemetry-exporter-trace-otlp-http/package.json | 2 +- .../opentelemetry-exporter-trace-otlp-proto/package.json | 2 +- .../packages/opentelemetry-instrumentation-fetch/package.json | 2 +- .../packages/opentelemetry-instrumentation-grpc/package.json | 2 +- .../packages/opentelemetry-instrumentation-http/package.json | 2 +- .../opentelemetry-instrumentation-xml-http-request/package.json | 2 +- .../packages/opentelemetry-instrumentation/package.json | 2 +- .../packages/opentelemetry-sdk-metrics-base/package.json | 2 +- experimental/packages/opentelemetry-sdk-node/package.json | 2 +- packages/opentelemetry-context-zone-peer-dep/package.json | 2 +- packages/opentelemetry-context-zone/package.json | 2 +- packages/opentelemetry-core/package.json | 2 +- packages/opentelemetry-exporter-jaeger/package.json | 2 +- packages/opentelemetry-exporter-zipkin/package.json | 2 +- packages/opentelemetry-propagator-jaeger/package.json | 2 +- packages/opentelemetry-resources/package.json | 2 +- packages/opentelemetry-sdk-trace-base/package.json | 2 +- packages/opentelemetry-sdk-trace-node/package.json | 2 +- packages/opentelemetry-sdk-trace-web/package.json | 2 +- packages/opentelemetry-semantic-conventions/package.json | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json index becd3e6ee1d..53bbf31bb7b 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json @@ -58,7 +58,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5" diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json index 027c72b2e48..6e72458872c 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json @@ -74,7 +74,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json index 80465ea0ec5..ff27c37db1d 100644 --- a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json @@ -58,7 +58,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5" diff --git a/experimental/packages/opentelemetry-exporter-prometheus/package.json b/experimental/packages/opentelemetry-exporter-prometheus/package.json index 777666c3db7..0ddfd28e683 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/package.json +++ b/experimental/packages/opentelemetry-exporter-prometheus/package.json @@ -49,7 +49,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" }, diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json index e583a02f455..b7e23ce3a38 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json @@ -57,7 +57,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5" diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json index ccbd298c676..99af715a2e0 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json @@ -74,7 +74,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json index 9d5e4c06f65..dd7476f8e16 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json @@ -57,7 +57,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5" diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/package.json b/experimental/packages/opentelemetry-instrumentation-fetch/package.json index 91a15f2e6ef..cda817c7b2c 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/package.json +++ b/experimental/packages/opentelemetry-instrumentation-fetch/package.json @@ -69,7 +69,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/package.json b/experimental/packages/opentelemetry-instrumentation-grpc/package.json index 282c77b035d..f5fb3fab669 100644 --- a/experimental/packages/opentelemetry-instrumentation-grpc/package.json +++ b/experimental/packages/opentelemetry-instrumentation-grpc/package.json @@ -61,7 +61,7 @@ "nyc": "15.1.0", "rimraf": "3.0.2", "semver": "7.3.5", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" }, diff --git a/experimental/packages/opentelemetry-instrumentation-http/package.json b/experimental/packages/opentelemetry-instrumentation-http/package.json index 3bfda8c880e..a71d1b4c6bf 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/package.json +++ b/experimental/packages/opentelemetry-instrumentation-http/package.json @@ -63,7 +63,7 @@ "request": "2.88.2", "request-promise-native": "1.0.9", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "superagent": "6.1.0", "ts-mocha": "8.0.0", "typescript": "4.3.5" diff --git a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json index 66a8d6ac66f..3e0a602215f 100644 --- a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json +++ b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json @@ -69,7 +69,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/experimental/packages/opentelemetry-instrumentation/package.json b/experimental/packages/opentelemetry-instrumentation/package.json index 7163baebec9..270172cfb4a 100644 --- a/experimental/packages/opentelemetry-instrumentation/package.json +++ b/experimental/packages/opentelemetry-instrumentation/package.json @@ -91,7 +91,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/package.json b/experimental/packages/opentelemetry-sdk-metrics-base/package.json index a6c490d1e62..0673fedef52 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/package.json +++ b/experimental/packages/opentelemetry-sdk-metrics-base/package.json @@ -55,7 +55,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" }, diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json index 2cec14bdf11..5a6965a3cbf 100644 --- a/experimental/packages/opentelemetry-sdk-node/package.json +++ b/experimental/packages/opentelemetry-sdk-node/package.json @@ -69,7 +69,7 @@ "nock": "12.0.3", "nyc": "15.1.0", "semver": "7.3.5", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5" diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json index 555b34790f9..df2a0f8cd03 100644 --- a/packages/opentelemetry-context-zone-peer-dep/package.json +++ b/packages/opentelemetry-context-zone-peer-dep/package.json @@ -66,7 +66,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json index e97763680b3..06e85ed9721 100644 --- a/packages/opentelemetry-context-zone/package.json +++ b/packages/opentelemetry-context-zone/package.json @@ -59,7 +59,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json index e7431e4f83a..098eeee1a8f 100644 --- a/packages/opentelemetry-core/package.json +++ b/packages/opentelemetry-core/package.json @@ -74,7 +74,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json index c3ec50f6093..23a3859aff7 100644 --- a/packages/opentelemetry-exporter-jaeger/package.json +++ b/packages/opentelemetry-exporter-jaeger/package.json @@ -52,7 +52,7 @@ "nock": "12.0.3", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" }, diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 0742a343870..73dc9126d16 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -72,7 +72,7 @@ "nock": "12.0.3", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-propagator-jaeger/package.json b/packages/opentelemetry-propagator-jaeger/package.json index 3a781b7c1d8..47eff749cc1 100644 --- a/packages/opentelemetry-propagator-jaeger/package.json +++ b/packages/opentelemetry-propagator-jaeger/package.json @@ -65,7 +65,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index 4ae97c1be43..ed85855f3df 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -59,7 +59,7 @@ "nock": "12.0.3", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" }, diff --git a/packages/opentelemetry-sdk-trace-base/package.json b/packages/opentelemetry-sdk-trace-base/package.json index 03a7c2426fe..e1b483c3816 100644 --- a/packages/opentelemetry-sdk-trace-base/package.json +++ b/packages/opentelemetry-sdk-trace-base/package.json @@ -71,7 +71,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-sdk-trace-node/package.json b/packages/opentelemetry-sdk-trace-node/package.json index 336ac2c0d42..029b2bf63ea 100644 --- a/packages/opentelemetry-sdk-trace-node/package.json +++ b/packages/opentelemetry-sdk-trace-node/package.json @@ -54,7 +54,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" }, diff --git a/packages/opentelemetry-sdk-trace-web/package.json b/packages/opentelemetry-sdk-trace-web/package.json index 45ed1a12591..d05298d1369 100644 --- a/packages/opentelemetry-sdk-trace-web/package.json +++ b/packages/opentelemetry-sdk-trace-web/package.json @@ -70,7 +70,7 @@ "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-loader": "8.3.0", "ts-mocha": "8.0.0", "typescript": "4.3.5", diff --git a/packages/opentelemetry-semantic-conventions/package.json b/packages/opentelemetry-semantic-conventions/package.json index 54114b923c7..9e38eec3ff6 100644 --- a/packages/opentelemetry-semantic-conventions/package.json +++ b/packages/opentelemetry-semantic-conventions/package.json @@ -53,7 +53,7 @@ "nock": "12.0.3", "nyc": "15.1.0", "rimraf": "3.0.2", - "sinon": "11.1.2", + "sinon": "12.0.1", "ts-mocha": "8.0.0", "typescript": "4.3.5" } From 8227258b4ae814c4d561ff634d3b3faf771f07d3 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Mon, 8 Nov 2021 19:05:04 +0100 Subject: [PATCH 11/13] chore(deps): update commitlint monorepo to v14 (major) (#2602) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index eba827332a4..0e476e5ca64 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,8 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "devDependencies": { - "@commitlint/cli": "13.1.0", - "@commitlint/config-conventional": "13.1.0", + "@commitlint/cli": "14.1.0", + "@commitlint/config-conventional": "14.1.0", "@typescript-eslint/eslint-plugin": "5.0.0", "@typescript-eslint/parser": "5.0.0", "beautify-benchmark": "0.2.4", From e8d65f22d2aefcf576023ecb5130e1562799986e Mon Sep 17 00:00:00 2001 From: Bartlomiej Obecny Date: Mon, 8 Nov 2021 23:05:38 +0100 Subject: [PATCH 12/13] chore: adding selenium tests with browserstack (#2570) Co-authored-by: Valentin Marchaud --- .github/workflows/peer-api.yaml | 5 +- .github/workflows/unit-test.yml | 4 +- lerna.json | 3 +- selenium-tests/.gitignore | 2 + selenium-tests/README.md | 54 ++++ selenium-tests/babel.config.js | 33 +++ selenium-tests/example.env | 2 + selenium-tests/nightwatch.conf.js | 287 ++++++++++++++++++++++ selenium-tests/package.json | 70 ++++++ selenium-tests/pages/fetch/index.html | 20 ++ selenium-tests/pages/fetch/index.js | 51 ++++ selenium-tests/pages/helper.js | 46 ++++ selenium-tests/pages/tracing.js | 32 +++ selenium-tests/pages/xhr/index.html | 20 ++ selenium-tests/pages/xhr/index.js | 56 +++++ selenium-tests/scripts/local.runner.js | 38 +++ selenium-tests/tests-helpers/constants.js | 5 + selenium-tests/tests/fetch/fetch.js | 27 ++ selenium-tests/tests/xhr/xhr.js | 26 ++ selenium-tests/webpack.common.js | 38 +++ selenium-tests/webpack.config.js | 57 +++++ selenium-tests/webpack.dev.js | 11 + selenium-tests/webpack.production.js | 17 ++ 23 files changed, 899 insertions(+), 5 deletions(-) create mode 100644 selenium-tests/.gitignore create mode 100644 selenium-tests/README.md create mode 100644 selenium-tests/babel.config.js create mode 100644 selenium-tests/example.env create mode 100644 selenium-tests/nightwatch.conf.js create mode 100644 selenium-tests/package.json create mode 100644 selenium-tests/pages/fetch/index.html create mode 100644 selenium-tests/pages/fetch/index.js create mode 100644 selenium-tests/pages/helper.js create mode 100644 selenium-tests/pages/tracing.js create mode 100644 selenium-tests/pages/xhr/index.html create mode 100644 selenium-tests/pages/xhr/index.js create mode 100755 selenium-tests/scripts/local.runner.js create mode 100644 selenium-tests/tests-helpers/constants.js create mode 100644 selenium-tests/tests/fetch/fetch.js create mode 100644 selenium-tests/tests/xhr/xhr.js create mode 100644 selenium-tests/webpack.common.js create mode 100644 selenium-tests/webpack.config.js create mode 100644 selenium-tests/webpack.dev.js create mode 100644 selenium-tests/webpack.production.js diff --git a/.github/workflows/peer-api.yaml b/.github/workflows/peer-api.yaml index ce642134d09..f4f1731ea9f 100644 --- a/.github/workflows/peer-api.yaml +++ b/.github/workflows/peer-api.yaml @@ -22,8 +22,9 @@ jobs: run: npm install semver - name: Check API dependency semantics (stable) - run: lerna exec --ignore propagation-validation-server "node ../../scripts/peer-api-check.js" + working-directory: packages + run: lerna exec --ignore propagation-validation-server --ignore propagation-validation-server --ignore @opentelemetry/selenium-tests "node ../../scripts/peer-api-check.js" - name: Check API dependency semantics (experimental) working-directory: experimental - run: lerna exec --ignore propagation-validation-server "node ../../../scripts/peer-api-check.js" + run: lerna exec --ignore propagation-validation-server --ignore @opentelemetry/selenium-tests "node ../../../scripts/peer-api-check.js" diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 6352235f8bf..4cc9daca63e 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -35,7 +35,7 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' + npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' --ignore @opentelemetry/selenium-tests - name: Build 🔧 run: | @@ -111,7 +111,7 @@ jobs: working-directory: experimental run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' + npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' --ignore @opentelemetry/selenium-tests - name: Build 🔧 working-directory: experimental diff --git a/lerna.json b/lerna.json index b530144ffcd..2c0b8bd6648 100644 --- a/lerna.json +++ b/lerna.json @@ -5,6 +5,7 @@ "packages": [ "benchmark/*", "packages/*", - "integration-tests/*" + "integration-tests/*", + "selenium-tests" ] } diff --git a/selenium-tests/.gitignore b/selenium-tests/.gitignore new file mode 100644 index 00000000000..53b77116eaa --- /dev/null +++ b/selenium-tests/.gitignore @@ -0,0 +1,2 @@ +tests_output +tmp diff --git a/selenium-tests/README.md b/selenium-tests/README.md new file mode 100644 index 00000000000..eda21150fce --- /dev/null +++ b/selenium-tests/README.md @@ -0,0 +1,54 @@ +## Selenium Tests + +Selenium tests are to help verify the working of opentelemetry in different browsers. For that the nightwatch is used. +This can be run either locally or in github actions with usage of browserstack. +Browser stack also gives possibility of running tests in browserstack on different browsers using our local environment. +This helps to test and debug things locally using any browser we want. + +## Running tests locally using local browser - this is also useful when adding new test + +1. run server + +```shell +npm run server +``` + +1. run local test for example for xhr + +```shell +npm run local:xhr +``` + +Please wait a bit it should run selenium tests using our local version of chrome + +## Running tests locally using browser stack account - for that you need to have a browser stack account + +If you have it please create a file ".env" based on "example.env" + +1. run server + +```shell +npm run server +``` + +1. Run local test for example for xhr + +```shell +npm run local:bs:xhr +``` + +## Architecture + +1. Folder pages contains all the pages that can be entered after running `npn run server` at . +These are fully functioning pages and can be run without running tests. + +2. To be able to test it automatically instead of manually we have to create a test. Tests are kept in folder "tests". +For each page there is a corresponding folder with exactly the same name. There are additional 2 files + +- helper.js - this file keeps some helpers functions that are included in page automatically and they are available in tests only in section "execute". +This is because this section is being sent to the browser and executed automatically. This is the only way of "sending" and "reading" data back to test +When data is being sent between browser and selenium it needs to be stringified that's why we have one more helper for that called "JSONSafeStringify" +The last helper is the one that helps to verify test has finished successfully "OTELSeleniumDone". + +- tracing.js - this file contains the skeleton for tracing and export function "loadOtel" this is a helper function that accepts instrumentations as param. +This way it is easy to add different tests that has different lists of instrumentations. diff --git a/selenium-tests/babel.config.js b/selenium-tests/babel.config.js new file mode 100644 index 00000000000..26b15edca0b --- /dev/null +++ b/selenium-tests/babel.config.js @@ -0,0 +1,33 @@ +module.exports = function (api) { + api.cache(true); + const presets = [ + [ + '@babel/preset-env', + { + corejs: { + version: '3', + proposals: true, + }, + useBuiltIns: 'entry', + targets: { + // 'edge': 16, + // 'safari': 9, + // 'firefox': 57, + 'ie': 11, + // 'ios': 9, + // 'chrome': 49, + }, + }, + ], + ]; + const plugins = [ + ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], + ['@babel/plugin-proposal-class-properties', { 'loose': true }], + ["@babel/plugin-proposal-private-methods", { "loose": true }], + ["@babel/plugin-proposal-private-property-in-object", { "loose": true }], + ]; + return { + presets, + plugins, + }; +}; \ No newline at end of file diff --git a/selenium-tests/example.env b/selenium-tests/example.env new file mode 100644 index 00000000000..28fc9739b03 --- /dev/null +++ b/selenium-tests/example.env @@ -0,0 +1,2 @@ +BROWSERSTACK_USER="YOUR USER" +BROWSERSTACK_KEY="YOUR BROWSER STACK KEY" \ No newline at end of file diff --git a/selenium-tests/nightwatch.conf.js b/selenium-tests/nightwatch.conf.js new file mode 100644 index 00000000000..8547bc24223 --- /dev/null +++ b/selenium-tests/nightwatch.conf.js @@ -0,0 +1,287 @@ +// Autogenerated by Nightwatch +// Refer to the online docs for more details: https://nightwatchjs.org/gettingstarted/configuration/ +const Services = {}; loadServices(); + +module.exports = { + // An array of folders (excluding subfolders) where your tests are located; + // if this is not specified, the test source must be passed as the second argument to the test runner. + src_folders: [], + + // See https://nightwatchjs.org/guide/working-with-page-objects/ + page_objects_path: '', + + // See https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands + custom_commands_path: '', + + // See https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-assertions + custom_assertions_path: '', + + // See https://nightwatchjs.org/guide/#external-globals + globals_path : '', + + webdriver: {}, + + test_settings: { + default: { + disable_error_log: false, + launch_url: 'https://nightwatchjs.org', + + screenshots: { + enabled: false, + path: 'screens', + on_failure: true + }, + + desiredCapabilities: { + browserName : 'firefox' + }, + + webdriver: { + start_process: true, + server_path: (Services.geckodriver ? Services.geckodriver.path : '') + } + }, + + safari: { + desiredCapabilities : { + browserName : 'safari', + alwaysMatch: { + acceptInsecureCerts: false + } + }, + webdriver: { + port: 4445, + start_process: true, + server_path: '/usr/bin/safaridriver' + } + }, + + firefox: { + desiredCapabilities : { + browserName : 'firefox', + alwaysMatch: { + acceptInsecureCerts: true, + 'moz:firefoxOptions': { + args: [ + // '-headless', + // '-verbose' + ] + } + } + + }, + webdriver: { + start_process: true, + port: 4444, + server_path: (Services.geckodriver ? Services.geckodriver.path : ''), + cli_args: [ + // very verbose geckodriver logs + // '-vv' + ] + } + }, + + chrome: { + desiredCapabilities : { + browserName : 'chrome', + 'goog:chromeOptions' : { + // More info on Chromedriver: https://sites.google.com/a/chromium.org/chromedriver/ + // + // This tells Chromedriver to run using the legacy JSONWire protocol (not required in Chrome 78) + w3c: false, + args: [ + //'--no-sandbox', + //'--ignore-certificate-errors', + //'--allow-insecure-localhost', + //'--headless' + ] + } + }, + + webdriver: { + start_process: true, + port: 9515, + server_path: (Services.chromedriver ? Services.chromedriver.path : ''), + cli_args: [ + // --verbose + ] + } + }, + + edge: { + desiredCapabilities : { + browserName : 'MicrosoftEdge', + 'ms:edgeOptions' : { + w3c: false, + // More info on EdgeDriver: https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/capabilities-edge-options + args: [ + //'--headless' + ] + } + }, + + webdriver: { + start_process: true, + // Download msedgedriver from https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/ + // and set the location below: + server_path: '', + cli_args: [ + // --verbose + ] + } + }, + + ////////////////////////////////////////////////////////////////////////////////// + // Configuration for when using the browserstack.com cloud service | + // | + // Please set the username and access key by setting the environment variables: | + // - BROWSERSTACK_USER | + // - BROWSERSTACK_KEY | + // .env files are supported | + ////////////////////////////////////////////////////////////////////////////////// + browserstack: { + selenium: { + host: 'hub-cloud.browserstack.com', + port: 443 + }, + // More info on configuring capabilities can be found on: + // https://www.browserstack.com/automate/capabilities?tag=selenium-4 + desiredCapabilities: { + 'bstack:options' : { + userName: '${BROWSERSTACK_USER}', + accessKey: '${BROWSERSTACK_KEY}', + } + }, + + disable_error_log: true, + webdriver: { + timeout_options: { + timeout: 15000, + retry_attempts: 3 + }, + keep_alive: true, + start_process: false + } + }, + + 'browserstack.local': { + extends: 'browserstack', + desiredCapabilities: { + 'browserstack.local': true, + 'browserstack.console': 'errors' + } + }, + + 'browserstack.chrome': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'chrome', + chromeOptions : { + w3c: false + } + } + }, + + 'browserstack.firefox': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'firefox' + } + }, + + 'browserstack.ie': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'internet explorer', + browserVersion: '11.0' + } + }, + + 'browserstack.safari': { + extends: 'browserstack', + desiredCapabilities: { + browserName: 'safari' + } + }, + + 'browserstack.local_chrome': { + extends: 'browserstack.local', + desiredCapabilities: { + browserName: 'chrome' + } + }, + + 'browserstack.local_firefox': { + extends: 'browserstack.local', + desiredCapabilities: { + browserName: 'firefox' + } + }, + 'browserstack.local_ie': { + extends: 'browserstack.local', + desiredCapabilities: { + browserName: 'internet explorer', + browserVersion: '11.0' + } + }, + 'browserstack.local_safari': { + extends: 'browserstack.local', + desiredCapabilities: { + browserName: 'safari', + } + }, + ////////////////////////////////////////////////////////////////////////////////// + // Configuration for when using the Selenium service, either locally or remote, | + // like Selenium Grid | + ////////////////////////////////////////////////////////////////////////////////// + selenium_server: { + // Selenium Server is running locally and is managed by Nightwatch + selenium: { + start_process: true, + port: 4444, + server_path: (Services.seleniumServer ? Services.seleniumServer.path : ''), + cli_args: { + 'webdriver.gecko.driver': (Services.geckodriver ? Services.geckodriver.path : ''), + 'webdriver.chrome.driver': (Services.chromedriver ? Services.chromedriver.path : '') + } + } + }, + + 'selenium.chrome': { + extends: 'selenium_server', + desiredCapabilities: { + browserName: 'chrome', + chromeOptions : { + w3c: false, + } + } + }, + + 'selenium.firefox': { + extends: 'selenium_server', + desiredCapabilities: { + browserName: 'firefox', + 'moz:firefoxOptions': { + args: [ + // '-headless', + // '-verbose' + ] + } + } + } + } +}; + +function loadServices() { + try { + Services.seleniumServer = require('selenium-server'); + } catch (err) {} + + try { + Services.chromedriver = require('chromedriver'); + } catch (err) {} + + try { + Services.geckodriver = require('geckodriver'); + } catch (err) {} +} diff --git a/selenium-tests/package.json b/selenium-tests/package.json new file mode 100644 index 00000000000..fd78e471051 --- /dev/null +++ b/selenium-tests/package.json @@ -0,0 +1,70 @@ +{ + "name": "@opentelemetry/selenium-tests", + "version": "0.0.1", + "description": "OpenTelemetry Selenium Tests", + "main": "index.js", + "repository": "open-telemetry/opentelemetry-js", + "scripts": { + "all:bs": "nightwatch ./tests --parallel --env browserstack.chrome,browserstack.safari,browserstack.firefox", + "all:local": "nightwatch ./tests --parallel --env selenium.chrome", + "local:bs:fetch": "node scripts/local.runner.js --test ./tests/fetch/fetch.js --parallel --env browserstack.local_chrome,browserstack.local_firefox,browserstack.local_safari", + "local:bs:xhr": "node scripts/local.runner.js --test ./tests/xhr/xhr.js --parallel --env browserstack.local_chrome,browserstack.local_firefox,browserstack.local_ie,browserstack.local_safari", + "local:fetch": "nightwatch ./tests/fetch/fetch.js --env selenium.chrome", + "local:xhr": "nightwatch ./tests/xhr/xhr.js --env selenium.chrome", + "server": "webpack serve --progress --port 8090 --config webpack.dev.js --hot --host 0.0.0.0" + }, + "keywords": [ + "opentelemetry", + "web", + "tracing", + "profiling", + "metrics", + "stats" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0.0" + }, + "publishConfig": { + "access": "private" + }, + "devDependencies": { + "@babel/core": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-decorators": "^7.15.8", + "@babel/plugin-transform-runtime": "^7.15.8", + "@babel/preset-env": "^7.15.0", + "@opentelemetry/api": "^1.0.3", + "babel-loader": "^8.2.3", + "babel-polyfill": "^6.26.0", + "browserstack-local": "^1.4.8", + "chromedriver": "^95.0.0", + "dotenv": "^10.0.0", + "fast-safe-stringify": "^2.1.1", + "geckodriver": "^2.0.4", + "nightwatch": "^1.7.11", + "selenium-server": "^3.141.59", + "terser-webpack-plugin": "^5.2.4", + "webpack": "^5.60.0", + "webpack-cli": "^4.9.1", + "webpack-dev-server": "^4.3.1", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.3" + }, + "dependencies": { + "@opentelemetry/context-zone-peer-dep": "^1.0.0", + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/exporter-otlp-http": "^0.26.0", + "@opentelemetry/exporter-zipkin": "^1.0.0", + "@opentelemetry/instrumentation": "^0.26.0", + "@opentelemetry/instrumentation-fetch": "^0.26.0", + "@opentelemetry/instrumentation-xml-http-request": "^0.26.0", + "@opentelemetry/sdk-metrics-base": "^0.26.0", + "@opentelemetry/sdk-trace-base": "^1.0.0", + "@opentelemetry/sdk-trace-web": "^1.0.0", + "zone.js": "^0.10.3" + } +} diff --git a/selenium-tests/pages/fetch/index.html b/selenium-tests/pages/fetch/index.html new file mode 100644 index 00000000000..a43e52d2ef1 --- /dev/null +++ b/selenium-tests/pages/fetch/index.html @@ -0,0 +1,20 @@ + + + + + + Fetch Plugin + + + + + + + Example of using Web Tracer with Fetch plugin and console exporter + +
+ + + + + diff --git a/selenium-tests/pages/fetch/index.js b/selenium-tests/pages/fetch/index.js new file mode 100644 index 00000000000..dbd2fe1166a --- /dev/null +++ b/selenium-tests/pages/fetch/index.js @@ -0,0 +1,51 @@ +'use strict'; +import '../helper'; + +import { context, trace } from '@opentelemetry/api'; + +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { loadOtel } from '../tracing'; + +const provider = loadOtel([ + new FetchInstrumentation({ + ignoreUrls: [/localhost:8090\/sockjs-node/], + propagateTraceHeaderCorsUrls: [ + 'https://cors-test.appspot.com/test', + 'https://httpbin.org/get', + ], + clearTimingResources: true, + }), +]); + +const webTracerWithZone = provider.getTracer('example-tracer-web'); + +const getData = (url) => fetch(url, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, +}); + +// example of keeping track of context between async operations +const prepareClickEvent = () => { + const url = 'https://httpbin.org/get'; + + const element = document.getElementById('button1'); + + const onClick = () => { + const singleSpan = webTracerWithZone.startSpan(`files-series-info`); + context.with(trace.setSpan(context.active(), singleSpan), () => { + getData(url).then((_data) => { + trace.getSpan(context.active()).addEvent('fetching-single-span-completed'); + singleSpan.end(); + }).finally(()=> { + otel.OTELSeleniumDone(); + console.log(otel.memoryExporter.getFinishedSpans()); + }); + }); + }; + element.addEventListener('click', onClick); +}; + +window.addEventListener('load', prepareClickEvent); diff --git a/selenium-tests/pages/helper.js b/selenium-tests/pages/helper.js new file mode 100644 index 00000000000..8f7c23bfd8b --- /dev/null +++ b/selenium-tests/pages/helper.js @@ -0,0 +1,46 @@ +/** + * These are all needed to make otel to work correctly for IE + */ +window.__Zone_enable_cross_context_check = true; +import 'babel-polyfill'; +import 'zone.js'; + +const safeStringify = require('fast-safe-stringify'); + +/** + * Function to stringify data between browser and selenium + * It works fine for circular dependency + * @param obj + * @return {*|string} + * @constructor + */ +function JSONSafeStringify(obj) { + return safeStringify( + obj, + function replacer(key, value) { + // Remove the circular structure + if (value === '[Circular]') { + return; + } + return value; + }, + 2, + ); +} + +/** + * Function helper to mark action on page as finished. This way selenium understands that test is finished + */ +function OTELSeleniumDone() { + const element = document.createElement('div'); + element.setAttribute('id', 'otelSeleniumDone'); + element.innerHTML = 'OTELSeleniumDone'; + window.setTimeout(() => { + document.body.appendChild(element); + }, 1000); +} + +window.otel = Object.assign({}, window.otel, { + JSONSafeStringify: JSONSafeStringify, + OTELSeleniumDone: OTELSeleniumDone, +}); diff --git a/selenium-tests/pages/tracing.js b/selenium-tests/pages/tracing.js new file mode 100644 index 00000000000..6dd6e5f26f2 --- /dev/null +++ b/selenium-tests/pages/tracing.js @@ -0,0 +1,32 @@ +'use strict'; + +import { ConsoleSpanExporter, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; +import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; +import { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep'; +import { registerInstrumentations } from '@opentelemetry/instrumentation'; + +/** + * Function helper to load the tracing with predefined instrumentations + * @param instrumentations + * @return {WebTracerProvider} + */ +export function loadOtel(instrumentations) { + const provider = new WebTracerProvider(); + const memoryExporter = new InMemorySpanExporter(); + provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter)); + provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); + provider.register({ + contextManager: new ZoneContextManager(), + }); + + registerInstrumentations({ + instrumentations: [ + instrumentations, + ], + }); + window.otel = Object.assign({}, window.otel, { + provider, + memoryExporter, + }); + return provider; +} \ No newline at end of file diff --git a/selenium-tests/pages/xhr/index.html b/selenium-tests/pages/xhr/index.html new file mode 100644 index 00000000000..0914215d3cd --- /dev/null +++ b/selenium-tests/pages/xhr/index.html @@ -0,0 +1,20 @@ + + + + + + XHR Plugin + + + + + + + Example of using Web Tracer with XHR plugin and console exporter + +
+ + + + + diff --git a/selenium-tests/pages/xhr/index.js b/selenium-tests/pages/xhr/index.js new file mode 100644 index 00000000000..e998c589628 --- /dev/null +++ b/selenium-tests/pages/xhr/index.js @@ -0,0 +1,56 @@ +'use strict'; +import '../helper'; + +import { context, trace } from '@opentelemetry/api'; + +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; +import { loadOtel } from '../tracing'; + +const provider = loadOtel([ + new XMLHttpRequestInstrumentation({ + ignoreUrls: [/localhost:8090\/sockjs-node/], + propagateTraceHeaderCorsUrls: [ + 'https://httpbin.org/get', + ], + clearTimingResources: true, + }), +]); + +const webTracerWithZone = provider.getTracer('example-tracer-web'); + +const getData = (url) => new Promise((resolve, reject) => { + // eslint-disable-next-line no-undef + const req = new XMLHttpRequest(); + req.open('GET', url, true); + req.setRequestHeader('Content-Type', 'application/json'); + req.setRequestHeader('Accept', 'application/json'); + req.onload = () => { + resolve(); + }; + req.onerror = () => { + reject(); + }; + req.send(); +}); + +// example of keeping track of context between async operations +const prepareClickEvent = () => { + const url = 'https://httpbin.org/get'; + + const element = document.getElementById('button1'); + + const onClick = () => { + const singleSpan = webTracerWithZone.startSpan(`files-series-info`); + context.with(trace.setSpan(context.active(), singleSpan), () => { + getData(url).then((_data) => { + trace.getSpan(context.active()).addEvent('fetching-single-span-completed'); + singleSpan.end(); + }).finally(() => { + otel.OTELSeleniumDone(); + }); + }); + }; + element.addEventListener('click', onClick); +}; + +window.addEventListener('load', prepareClickEvent); diff --git a/selenium-tests/scripts/local.runner.js b/selenium-tests/scripts/local.runner.js new file mode 100755 index 00000000000..295b4b2c615 --- /dev/null +++ b/selenium-tests/scripts/local.runner.js @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +const Nightwatch = require('nightwatch'); +const browserstack = require('browserstack-local'); +require('dotenv').config(); + +let bs_local; + +try { + require.main.filename = './node_modules/.bin/nightwatch'; + // Code to start browserstack local before start of test + console.log('Connecting local'); + Nightwatch.bs_local = bs_local = new browserstack.Local(); + bs_local.start({ key: process.env.BROWSERSTACK_KEY }, function (error) { + if (error) { + bs_local.stop(function () {}); + throw error; + } + + console.log('Connected. Now testing...'); + Nightwatch.cli(function (argv) { + Nightwatch.CliRunner(argv) + .setup() + .runTests() + .catch((err) => { + throw err; + }) + .finally(() => { + // Code to stop browserstack local after end of single test + bs_local.stop(function () {}); + }); + }); + }); +} catch (ex) { + console.log('There was an error while starting the test runner:\n\n'); + process.stderr.write(ex.stack + '\n'); + process.exit(2); +} diff --git a/selenium-tests/tests-helpers/constants.js b/selenium-tests/tests-helpers/constants.js new file mode 100644 index 00000000000..3362a3585c5 --- /dev/null +++ b/selenium-tests/tests-helpers/constants.js @@ -0,0 +1,5 @@ +const TIMEOUT_ELEMENT_MS = 5000; + +module.exports = { + TIMEOUT_ELEMENT_MS, +}; \ No newline at end of file diff --git a/selenium-tests/tests/fetch/fetch.js b/selenium-tests/tests/fetch/fetch.js new file mode 100644 index 00000000000..c60a5e1b87e --- /dev/null +++ b/selenium-tests/tests/fetch/fetch.js @@ -0,0 +1,27 @@ +const { TIMEOUT_ELEMENT_MS } = require('../../tests-helpers/constants'); + +module.exports = { + 'Fetch instrumentation': function (browser) { + browser + .url('http://localhost:8090/fetch') + .waitForElementVisible('body', TIMEOUT_ELEMENT_MS) + .waitForElementVisible('#button1', TIMEOUT_ELEMENT_MS) + .click('#button1') + .waitForElementVisible('#otelSeleniumDone', TIMEOUT_ELEMENT_MS) + .execute( + () => { + const spans = otel.memoryExporter.getFinishedSpans(); + return otel.JSONSafeStringify(spans); + }, + [], + (result) => { + const spans = JSON.parse(result.value); + browser.assert.equal(spans.length, 2, 'Should export 2 spans'); + }, + ) + + browser.end(() => { + console.log('end'); + }); + }, +}; diff --git a/selenium-tests/tests/xhr/xhr.js b/selenium-tests/tests/xhr/xhr.js new file mode 100644 index 00000000000..5204f527ff1 --- /dev/null +++ b/selenium-tests/tests/xhr/xhr.js @@ -0,0 +1,26 @@ +const { TIMEOUT_ELEMENT_MS } = require('../../tests-helpers/constants'); +module.exports = { + 'XHR instrumentation': function (browser) { + browser + .url('http://localhost:8090/xhr') + .waitForElementVisible('body', TIMEOUT_ELEMENT_MS) + .waitForElementVisible('#button1', TIMEOUT_ELEMENT_MS) + .click('#button1') + .waitForElementVisible('#otelSeleniumDone', TIMEOUT_ELEMENT_MS) + .execute( + function() { + const spans = otel.memoryExporter.getFinishedSpans(); + return otel.JSONSafeStringify(spans); + }, + [], + function(result) { + const spans = JSON.parse(result.value); + browser.assert.equal(spans.length, 2, 'Should export 2 spans'); + }, + ) + + browser.end(() => { + console.log('end'); + }); + }, +}; diff --git a/selenium-tests/webpack.common.js b/selenium-tests/webpack.common.js new file mode 100644 index 00000000000..0d00b07c608 --- /dev/null +++ b/selenium-tests/webpack.common.js @@ -0,0 +1,38 @@ +const path = require('path'); +const directory = path.resolve(__dirname); + +module.exports = { + entry: { + fetch: 'pages/fetch/index.js', + xhr: 'pages/xhr/index.js', + }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: '[name].js', + sourceMapFilename: '[file].map', + }, + target: ['web', 'es5'], + module: { + rules: [ + { + test: /\.js[x]?$/, + exclude: /(node_modules)/, + use: { + loader: 'babel-loader', + options: { + babelrc: false, + configFile: path.resolve(__dirname, 'babel.config.js'), + presets: ['@babel/preset-env'], + }, + }, + }, + ], + }, + resolve: { + modules: [ + path.resolve(directory), + 'node_modules', + ], + extensions: ['.ts', '.js', '.jsx', '.json'], + }, +}; \ No newline at end of file diff --git a/selenium-tests/webpack.config.js b/selenium-tests/webpack.config.js new file mode 100644 index 00000000000..061ab2a770d --- /dev/null +++ b/selenium-tests/webpack.config.js @@ -0,0 +1,57 @@ +const webpack = require('webpack'); +const webpackMerge = require('webpack-merge'); +const path = require('path'); + +const directory = path.resolve(__dirname); + +const common = { + mode: 'development', + entry: { + fetch: 'pages/fetch/index.js', + // xhr: 'pages/xhr/index.js', + }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: '[name].js', + sourceMapFilename: '[file].map', + }, + target: 'web', + module: { + rules: [ + { + test: /\.js[x]?$/, + exclude: /(node_modules)/, + use: { + loader: 'babel-loader', + options: { + babelrc: false, + configFile: path.resolve(__dirname, 'babel.config.js'), + presets: ['@babel/preset-env'], + }, + }, + include: [ + path.resolve(__dirname, 'pages/helper.js'), + ], + }, + ], + }, + resolve: { + modules: [ + path.resolve(directory), + 'node_modules', + ], + extensions: ['.js', '.jsx', '.json'], + }, +}; + +module.exports = webpackMerge(common, { + devtool: 'eval-source-map', + devServer: { + static: path.resolve(__dirname), + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('development'), + }), + ], +}); diff --git a/selenium-tests/webpack.dev.js b/selenium-tests/webpack.dev.js new file mode 100644 index 00000000000..abdc9f3d2b0 --- /dev/null +++ b/selenium-tests/webpack.dev.js @@ -0,0 +1,11 @@ +const { merge } = require('webpack-merge'); +const common = require('./webpack.common.js'); +const path = require('path'); + +module.exports = merge(common, { + mode: 'development', + // devtool: 'inline-source-map', + devServer: { + static: path.resolve(__dirname, 'pages'), + }, +}); \ No newline at end of file diff --git a/selenium-tests/webpack.production.js b/selenium-tests/webpack.production.js new file mode 100644 index 00000000000..d5fd171c2d5 --- /dev/null +++ b/selenium-tests/webpack.production.js @@ -0,0 +1,17 @@ +const { merge } = require('webpack-merge'); +const common = require('./webpack.common.js'); +const TerserPlugin = require('terser-webpack-plugin'); + +module.exports = merge(common, { + mode: 'production', + optimization: { + minimize: true, + minimizer: [new TerserPlugin({ + extractComments: false, + terserOptions: { + ie8: true, + safari10: true, + }, + })], + }, +}); \ No newline at end of file From 1abda1437c0c9c6067cc1b2f4f8f16174db19813 Mon Sep 17 00:00:00 2001 From: legendecas Date: Wed, 10 Nov 2021 02:18:29 +0800 Subject: [PATCH 13/13] chore: update npm badge image links (#2607) --- .../packages/opentelemetry-exporter-trace-otlp-grpc/README.md | 2 +- .../packages/opentelemetry-exporter-trace-otlp-http/README.md | 2 +- .../packages/opentelemetry-exporter-trace-otlp-proto/README.md | 2 +- experimental/packages/opentelemetry-sdk-metrics-base/README.md | 2 +- packages/opentelemetry-sdk-trace-base/README.md | 2 +- packages/opentelemetry-sdk-trace-node/README.md | 2 +- packages/opentelemetry-sdk-trace-web/README.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md index a6b10429302..f434da04ea0 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md @@ -133,7 +133,7 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-grpc&type=dev [devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-grpc&type=dev [npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-grpc -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-otlp-grpc.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-trace-otlp-grpc.svg [opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector [semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service [metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-metrics-otlp-grpc diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md b/experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md index 7614ea22def..f0f8853ef50 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md @@ -134,7 +134,7 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-http [npm-url-grpc]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-grpc [npm-url-proto]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-proto -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-otlp-http.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-trace-otlp-http.svg [opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector [opentelemetry-spec-protocol-exporter]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options [semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md index cb421a02add..fa4f09a5b9e 100644 --- a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md @@ -64,7 +64,7 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-proto&type=dev [devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-proto&type=dev [npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-proto -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-collector-otlp-proto.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-trace-otlp-proto.svg [opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector [semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service [metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-metrics-otlp-proto diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/README.md b/experimental/packages/opentelemetry-sdk-metrics-base/README.md index cf1d5bcdc2e..8aabceac79a 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/README.md +++ b/experimental/packages/opentelemetry-sdk-metrics-base/README.md @@ -207,4 +207,4 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-sdk-metrics-base&type=dev [devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-sdk-metrics-base&type=dev [npm-url]: https://www.npmjs.com/package/@opentelemetry/sdk-metrics-base -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fmetrics.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fsdk-metrics-base.svg diff --git a/packages/opentelemetry-sdk-trace-base/README.md b/packages/opentelemetry-sdk-trace-base/README.md index 8e744ed13e3..d1a988f6d4c 100644 --- a/packages/opentelemetry-sdk-trace-base/README.md +++ b/packages/opentelemetry-sdk-trace-base/README.md @@ -70,4 +70,4 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-sdk-trace-base&type=dev [devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-sdk-trace-base&type=dev [npm-url]: https://www.npmjs.com/package/@opentelemetry/sdk-trace-base -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Ftracing.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fsdk-trace-base.svg diff --git a/packages/opentelemetry-sdk-trace-node/README.md b/packages/opentelemetry-sdk-trace-node/README.md index e882cb48d49..68bafc52fb2 100644 --- a/packages/opentelemetry-sdk-trace-node/README.md +++ b/packages/opentelemetry-sdk-trace-node/README.md @@ -124,4 +124,4 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-sdk-trace-node&type=dev [devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-sdk-trace-node&type=dev [npm-url]: https://www.npmjs.com/package/@opentelemetry/sdk-trace-node -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fnode.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fsdk-trace-node.svg diff --git a/packages/opentelemetry-sdk-trace-web/README.md b/packages/opentelemetry-sdk-trace-web/README.md index cdced55ab39..aeccc6ff882 100644 --- a/packages/opentelemetry-sdk-trace-web/README.md +++ b/packages/opentelemetry-sdk-trace-web/README.md @@ -74,4 +74,4 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-sdk-trace-web&type=dev [devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-sdk-trace-web&type=dev [npm-url]: https://www.npmjs.com/package/@opentelemetry/sdk-trace-web -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fweb.svg +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fsdk-trace-web.svg