diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1d576cc70db..554b4ebfee5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,8 +15,29 @@ Before creating a pull request, please make sure: ## Which problem is this PR solving? -- +Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. + +Fixes # (issue) ## Short description of the changes -- +## Type of change + +Please delete options that are not relevant. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] This change requires a documentation update + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration + +- [ ] Test A + +## Checklist: + +- [ ] Followed the style guidelines of this project +- [ ] Unit tests have been added +- [ ] Documentation has been updated diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index e4a4a6d90ee..6352235f8bf 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -103,7 +103,7 @@ jobs: with: path: | experimental/node_modules - experimental/packages/*/node_modules + experimental/*/*/node_modules key: node-tests-experimental-${{ runner.os }}-${{ matrix.node_version }}-${{ hashFiles('experimental/**/package.json') }} - name: Bootstrap @@ -143,7 +143,7 @@ jobs: with: path: | experimental/node_modules - experimental/packages/*/node_modules + experimental/*/*/node_modules key: browser-tests-experimental-${{ runner.os }}-${{ matrix.node_version }}-${{ hashFiles('**/package.json') }} - name: Bootstrap diff --git a/.github/workflows/w3c-integration-test.yml b/.github/workflows/w3c-integration-test.yml index 4b514356134..f00cacf0c1e 100644 --- a/.github/workflows/w3c-integration-test.yml +++ b/.github/workflows/w3c-integration-test.yml @@ -22,7 +22,6 @@ jobs: package-lock.json packages/*/package-lock.json benchmark/*/package-lock.json - backwards-compatability/*/package-lock.json metapackages/*/package-lock.json packages/*/package-lock.json integration-tests/*/package-lock.json diff --git a/.gitmodules b/.gitmodules index f66e08a1b88..ac506a776f9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ -[submodule "packages/opentelemetry-exporter-otlp-grpc/protos"] - path = packages/opentelemetry-exporter-otlp-grpc/protos +[submodule "experimental/packages/opentelemetry-exporter-otlp-proto/protos"] + path = experimental/packages/opentelemetry-exporter-otlp-proto/protos url = https://github.com/open-telemetry/opentelemetry-proto.git -[submodule "packages/opentelemetry-exporter-otlp-proto/protos"] - path = packages/opentelemetry-exporter-otlp-proto/protos +[submodule "experimental/packages/opentelemetry-exporter-otlp-grpc/protos"] + path = experimental/packages/opentelemetry-exporter-otlp-grpc/protos url = https://github.com/open-telemetry/opentelemetry-proto.git diff --git a/CHANGELOG.md b/CHANGELOG.md index b361fd135b6..48c1bb849f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,96 @@ All notable changes to this project will be documented in this file. ## Unreleased +## 1.0.0 + +No changes + +## 0.26.0 + +### :boom: Breaking Change + +* `opentelemetry-exporter-collector-grpc`, `opentelemetry-exporter-otlp-grpc`, `opentelemetry-exporter-otlp-http`, `opentelemetry-exporter-otlp-proto` + * [#2476](https://github.com/open-telemetry/opentelemetry-js/pull/2476) chore!: rename collector exporters ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-core`, `opentelemetry-instrumentation-grpc`, `opentelemetry-sdk-trace-base`, `opentelemetry-shim-opentracing` + * [#2429](https://github.com/open-telemetry/opentelemetry-js/pull/2429) fix!: remove 'Http' from W3C propagator names ([@aabmass](https://github.com/aabmass)) + +### :rocket: (Enhancement) + +* `opentelemetry-core`, `opentelemetry-sdk-trace-base` + * [#2430](https://github.com/open-telemetry/opentelemetry-js/pull/2430) feat(opentelemetry-sdk-trace-base): implemented general limits of attributes ([@banothurameshnaik](https://github.com/banothurameshnaik)) + * [#2418](https://github.com/open-telemetry/opentelemetry-js/pull/2418) feat(opentelemetry-sdk-trace-base): implemented option to limit length of values of attributes ([@banothurameshnaik](https://github.com/banothurameshnaik)) +* `opentelemetry-instrumentation` + * [#2450](https://github.com/open-telemetry/opentelemetry-js/pull/2450) fix: handle missing package.json file when checking for version ([@nozik](https://github.com/nozik)) +* `opentelemetry-semantic-conventions` + * [#2456](https://github.com/open-telemetry/opentelemetry-js/pull/2456) feat: upgrade semantic conventions to the latest 1.6.1 version ([@weyert](https://github.com/weyert)) +* `opentelemetry-exporter-collector-proto`, `opentelemetry-exporter-collector` + * [#2438](https://github.com/open-telemetry/opentelemetry-js/pull/2438) feat: OTEL_EXPORTER_OTLP_ENDPOINT append version and signal ([@longility](https://github.com/longility)) + +### :bug: (Bug Fix) + +* Other + * [#2494](https://github.com/open-telemetry/opentelemetry-js/pull/2494) fix: remove setting http.route in http span attributes ([@mustafain117](https://github.com/mustafain117)) +* `opentelemetry-instrumentation-fetch` + * [#2426](https://github.com/open-telemetry/opentelemetry-js/pull/2426) fix(opentelemetry-instrumentation-fetch): fixed override of headers ([@philipszalla](https://github.com/philipszalla)) +* `opentelemetry-sdk-trace-base` + * [#2434](https://github.com/open-telemetry/opentelemetry-js/pull/2434) fix: ReferenceError when OTEL_TRACES_SAMPLER used without OTEL_TRACES_SAMPLER_ARG ([@hermanbanken](https://github.com/hermanbanken)) + +### :books: (Refine Doc) + +* [#2478](https://github.com/open-telemetry/opentelemetry-js/pull/2478) Update links to packages moved to experimental ([@jessitron](https://github.com/jessitron)) +* [#2463](https://github.com/open-telemetry/opentelemetry-js/pull/2463) docs(README): Fix links in README.md ([@JamesJHPark](https://github.com/JamesJHPark)) +* [#2437](https://github.com/open-telemetry/opentelemetry-js/pull/2437) docs(examples): updated examples readme links ([@banothurameshnaik](https://github.com/banothurameshnaik)) +* [#2421](https://github.com/open-telemetry/opentelemetry-js/pull/2421) docs(website): support GH page links to canonical src ([@chalin](https://github.com/chalin)) +* [#2408](https://github.com/open-telemetry/opentelemetry-js/pull/2408) docs: make link to exporters filter only exporters ([@Rauno56](https://github.com/Rauno56)) +* [#2297](https://github.com/open-telemetry/opentelemetry-js/pull/2297) eslint configuration for getting-started examples ([@alisabzevari](https://github.com/alisabzevari)) + +### :house: (Internal) + +* `opentelemetry-exporter-otlp-http` + * [#2490](https://github.com/open-telemetry/opentelemetry-js/pull/2490) chore: mark otlp exporters experimental ([@dyladan](https://github.com/dyladan)) + * [#2491](https://github.com/open-telemetry/opentelemetry-js/pull/2491) fix: remove usage of serviceName property in tests for otel collector ([@mustafain117](https://github.com/mustafain117)) +* `opentelemetry-sdk-node` + * [#2473](https://github.com/open-telemetry/opentelemetry-js/pull/2473) chore: move sdk-node to experimental ([@dyladan](https://github.com/dyladan)) + * [#2453](https://github.com/open-telemetry/opentelemetry-js/pull/2453) chore(sdk-node): fix lint warnings ([@alisabzevari](https://github.com/alisabzevari)) +* Other + * [#2469](https://github.com/open-telemetry/opentelemetry-js/pull/2469) Drop website_docs folder ([@chalin](https://github.com/chalin)) + * [#2474](https://github.com/open-telemetry/opentelemetry-js/pull/2474) chore: move missed test file to its package ([@dyladan](https://github.com/dyladan)) + * [#2435](https://github.com/open-telemetry/opentelemetry-js/pull/2435) chore: simplify unit test cache ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-context-zone`, `opentelemetry-core`, `opentelemetry-exporter-collector-grpc`, `opentelemetry-exporter-collector-proto`, `opentelemetry-exporter-collector`, `opentelemetry-exporter-prometheus`, `opentelemetry-exporter-zipkin`, `opentelemetry-instrumentation-fetch`, `opentelemetry-instrumentation-grpc`, `opentelemetry-instrumentation-http`, `opentelemetry-instrumentation-xml-http-request`, `opentelemetry-propagator-b3`, `opentelemetry-propagator-jaeger`, `opentelemetry-resources`, `opentelemetry-sdk-metrics-base`, `opentelemetry-sdk-node`, `opentelemetry-sdk-trace-base`, `opentelemetry-sdk-trace-web` + * [#2462](https://github.com/open-telemetry/opentelemetry-js/pull/2462) chore: split stable and experimental packages into groups using directories ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-instrumentation-http` + * [#2126](https://github.com/open-telemetry/opentelemetry-js/pull/2126) feat(instrumentation-http): add diag debug on http request events ([@Asafb26](https://github.com/Asafb26)) + * [#2455](https://github.com/open-telemetry/opentelemetry-js/pull/2455) chore(instrumentation-http): fix lint warnings ([@alisabzevari](https://github.com/alisabzevari)) +* `opentelemetry-instrumentation-fetch` + * [#2454](https://github.com/open-telemetry/opentelemetry-js/pull/2454) chore(instrumentation-fetch): fix lint warnings ([@alisabzevari](https://github.com/alisabzevari)) +* `opentelemetry-exporter-collector` + * [#2452](https://github.com/open-telemetry/opentelemetry-js/pull/2452) chore(exporter-collector): fix lint warnings ([@alisabzevari](https://github.com/alisabzevari)) +* `opentelemetry-sdk-trace-base`, `opentelemetry-sdk-trace-node` + * [#2446](https://github.com/open-telemetry/opentelemetry-js/pull/2446) chore(sdk-trace): fix lint warnings ([@alisabzevari](https://github.com/alisabzevari)) +* `opentelemetry-exporter-prometheus`, `opentelemetry-exporter-zipkin`, `opentelemetry-shim-opentracing` + * [#2447](https://github.com/open-telemetry/opentelemetry-js/pull/2447) chore(exporter): fix lint warnings ([@alisabzevari](https://github.com/alisabzevari)) + +### Committers: 18 + +* Aaron Abbott ([@aabmass](https://github.com/aabmass)) +* Ali Sabzevari ([@alisabzevari](https://github.com/alisabzevari)) +* Asaf Ben Aharon ([@Asafb26](https://github.com/Asafb26)) +* Banothu Ramesh Naik ([@banothurameshnaik](https://github.com/banothurameshnaik)) +* Daniel Dyla ([@dyladan](https://github.com/dyladan)) +* Gerhard Stöbich ([@Flarna](https://github.com/Flarna)) +* Herman ([@hermanbanken](https://github.com/hermanbanken)) +* James ([@JamesJHPark](https://github.com/JamesJHPark)) +* Jessica Kerr ([@jessitron](https://github.com/jessitron)) +* Long Mai ([@longility](https://github.com/longility)) +* Mustafain Ali Khan ([@mustafain117](https://github.com/mustafain117)) +* Patrice Chalin ([@chalin](https://github.com/chalin)) +* Philip Szalla ([@philipszalla](https://github.com/philipszalla)) +* Ran Nozik ([@nozik](https://github.com/nozik)) +* Rauno Viskus ([@Rauno56](https://github.com/Rauno56)) +* Siim Kallas ([@seemk](https://github.com/seemk)) +* Weyert de Boer ([@weyert](https://github.com/weyert)) +* legendecas ([@legendecas](https://github.com/legendecas)) + ## 0.25.0 ### :boom: Breaking Change @@ -20,6 +110,8 @@ All notable changes to this project will be documented in this file. ### :bug: (Bug Fix) +* `opentelemetry-instrumentation-grpc`, `opentelemetry-instrumentation-http`, `opentelemetry-instrumentation-jaeger`, `opentelemetry-exporter-zipkin`, `opentelemetry-sdk-trace-base` + * [#2499](https://github.com/open-telemetry/opentelemetry-js/pull/2499) fix: 2389- replaced logger unformatted strings with template literals ([@PaurushGarg](https://github.com/PaurushGarg)) * `opentelemetry-instrumentation-fetch` * [#2411](https://github.com/open-telemetry/opentelemetry-js/pull/2411) fix(instrumentation-fetch): `fetch(string, Request)` silently drops request body ([@t2t2](https://github.com/t2t2)) * `opentelemetry-sdk-trace-base` diff --git a/README.md b/README.md index d0e06cc564e..45e83be795a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ---

- Getting Started + Getting Started   •   API Reference   •   @@ -47,23 +47,25 @@ This is the JavaScript version of [OpenTelemetry](https://opentelemetry.io/), a ## Compatibility Matrix -| API Version | Core version | Contrib Version | -| ----------- |--------------|-------------------------| -| 1.0.x | 0.25.x | ------ | -| 1.0.x | 0.24.x | 0.24.x | -| 1.0.x | 0.23.x | 0.23.x | -| 1.0.x | 0.22.x | 0.22.x | -| 0.21.x | 0.21.x | 0.21.x | -| 0.20.x | 0.20.x | 0.20.x | -| v1.0.0-rc.3 | 0.19.x | 0.16.x | -| 0.18.x | 0.18.x | 0.14.x | -| | 0.17.x | ------ | -| | 0.16.x | ------ | -| | 0.15.x | 0.13.x | -| | 0.14.x | 0.12.x | -| | 0.13.x | ------ | -| | 0.12.x | 0.11.x | -| | 0.11.x | 0.10.x | +| API Version | Core version | Experimental Packages | Contrib Version | +| ----------- |--------------| --------------------- |-------------------------| +| 1.0.x | 1.x | 0.26.x | ------ | +| 1.0.x | 0.26.x | ----- | ------ | +| 1.0.x | 0.25.x | ----- | ------ | +| 1.0.x | 0.24.x | ----- | 0.24.x | +| 1.0.x | 0.23.x | ----- | 0.23.x | +| 1.0.x | 0.22.x | ----- | 0.22.x | +| 0.21.x | 0.21.x | ----- | 0.21.x | +| 0.20.x | 0.20.x | ----- | 0.20.x | +| v1.0.0-rc.3 | 0.19.x | ----- | 0.16.x | +| 0.18.x | 0.18.x | ----- | 0.14.x | +| | 0.17.x | ----- | ------ | +| | 0.16.x | ----- | ------ | +| | 0.15.x | ----- | 0.13.x | +| | 0.14.x | ----- | 0.12.x | +| | 0.13.x | ----- | ------ | +| | 0.12.x | ----- | 0.11.x | +| | 0.11.x | ----- | 0.10.x | ## Versioning @@ -129,7 +131,7 @@ process.on('SIGTERM', () => { node -r ./tracing.js app.js ``` -The above example will emit auto-instrumented telemetry about your Node.js application to the console. For a more in-depth example, see the [Getting Started Guide](https://github.com/open-telemetry/opentelemetry-js/blob/main/getting-started/README.md). For more information about automatic instrumentation see [@opentelemetry/sdk-trace-node][otel-node], which provides auto-instrumentation for Node.js applications. If the automatic instrumentation does not suit your needs, or you would like to create manual traces, see [@opentelemetry/sdk-trace-base][otel-tracing] +The above example will emit auto-instrumented telemetry about your Node.js application to the console. For a more in-depth example, see the [Getting Started Guide](https://opentelemetry.io/docs/js/getting_started/). For more information about automatic instrumentation see [@opentelemetry/sdk-trace-node][otel-node], which provides auto-instrumentation for Node.js applications. If the automatic instrumentation does not suit your needs, or you would like to create manual traces, see [@opentelemetry/sdk-trace-base][otel-tracing] ### Library Author @@ -284,6 +286,29 @@ To request automatic tracing support for a module not on this list, please [file ## Upgrade guidelines +### 0.26.x to 0.27.x + +Metric types are renamed: + +- `@openetelemetry/api-metrics` + - `Meter` + - `createValueRecorder` => `createHistogram` + - `createValueObserver` => `createObservableGauge` + - `createSumObserver` => `createObservableCounter` + - `createUpDownSumObserver` => `createObservableUpDownCounter` + - `ValueRecorder` => `Histogram` + - `ValueObserver` => `ObservableGauge` + - `SumObserver` => `ObservableCounter` + - `UpDownSumObserver` => `ObservableUpDownCounter` + - `ObserverResult` => `ObservableResult` + - `Observation.observer` => `Observation.observable` +- `@opentelemetry/sdk-metrics-base` + - `MetricKind` + - `VALUE_RECORDER` => `HISTOGRAM` + - `SUM_OBSERVER` => `OBSERVABLE_COUNTER` + - `UP_DOWN_SUM_OBSERVER` => `OBSERVABLE_UP_DOWN_COUNTER` + - `VALUE_OBSERVER` => `OBSERVABLE_GAUGE` + ### 0.25.x to 1.x.y Collector exporter packages and types are renamed: diff --git a/doc/processor-api.md b/doc/processor-api.md index b3abbcdecc5..944834b038e 100644 --- a/doc/processor-api.md +++ b/doc/processor-api.md @@ -138,7 +138,7 @@ const meter = new MeterProvider({ interval: 1000, }).getMeter('example-custom-processor'); -const requestsLatency = meter.createValueRecorder('requests', { +const requestsLatency = meter.createHistogram('requests', { monotonic: true, description: 'Average latency' }); diff --git a/examples/metrics/metrics/observer.js b/examples/metrics/metrics/observer.js index def56d872b7..a31345f2a50 100644 --- a/examples/metrics/metrics/observer.js +++ b/examples/metrics/metrics/observer.js @@ -21,29 +21,29 @@ const exporter = new PrometheusExporter( const meter = new MeterProvider({ exporter, interval: 2000, -}).getMeter('example-observer'); +}).getMeter('example-meter'); -meter.createValueObserver('cpu_core_usage', { - description: 'Example of a sync value observer with callback', -}, async (observerResult) => { // this callback is called once per each interval +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); }); - observerResult.observe(getRandomValue(), { core: '1' }); - observerResult.observe(getRandomValue(), { core: '2' }); + observableResult.observe(getRandomValue(), { core: '1' }); + observableResult.observe(getRandomValue(), { core: '2' }); }); // no callback as they will be updated in batch observer -const tempMetric = meter.createValueObserver('cpu_temp_per_app', { - description: 'Example of sync value observer used with async 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.createValueObserver('cpu_usage_per_app', { - description: 'Example of sync value observer used with async batch observer', +const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { + description: 'Example of sync observable gauge used with async batch observer', }); -meter.createBatchObserver((observerBatchResult) => { +meter.createBatchObserver((batchObserverResult) => { Promise.all([ someAsyncMetrics(), // simulate waiting @@ -52,11 +52,11 @@ meter.createBatchObserver((observerBatchResult) => { }), ]).then(([apps, waiting]) => { apps.forEach(app => { - observerBatchResult.observe({ app: app.name, core: '1' }, [ + batchObserverResult.observe({ app: app.name, core: '1' }, [ tempMetric.observation(app.core1.temp), cpuUsageMetric.observation(app.core1.usage), ]); - observerBatchResult.observe({ app: app.name, core: '2' }, [ + batchObserverResult.observe({ app: app.name, core: '2' }, [ tempMetric.observation(app.core2.temp), cpuUsageMetric.observation(app.core2.usage), ]); diff --git a/examples/otlp-exporter-node/README.md b/examples/otlp-exporter-node/README.md index abfa241965c..21fea5422f0 100644 --- a/examples/otlp-exporter-node/README.md +++ b/examples/otlp-exporter-node/README.md @@ -1,8 +1,8 @@ # Overview -This example shows how to use [@opentelemetry/exporter-otlp-http](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-otlp-http) to instrument a simple Node.js application. +This example shows how to use [@opentelemetry/exporter-otlp-http](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-otlp-http) to instrument a simple Node.js application. -This example will export spans data simultaneously using [Exporter Collector](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-otlp-http) and grpc. It will use [proto format](https://github.com/open-telemetry/opentelemetry-proto). +This example will export spans data simultaneously using [Exporter Collector](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-otlp-http) and grpc. It will use [proto format](https://github.com/open-telemetry/opentelemetry-proto). ## Installation diff --git a/examples/otlp-exporter-node/metrics.js b/examples/otlp-exporter-node/metrics.js index e0065aa6972..3a2294f43f0 100644 --- a/examples/otlp-exporter-node/metrics.js +++ b/examples/otlp-exporter-node/metrics.js @@ -31,8 +31,8 @@ const upDownCounter = meter.createUpDownCounter('test_up_down_counter', { description: 'Example of a UpDownCounter', }); -const recorder = meter.createValueRecorder('test_value_recorder', { - description: 'Example of a ValueRecorder', +const histogram = meter.createHistogram('test_histogram', { + description: 'Example of a Histogram', }); const labels = { pid: process.pid, environment: 'staging' }; @@ -40,5 +40,5 @@ const labels = { pid: process.pid, environment: 'staging' }; setInterval(() => { requestCounter.bind(labels).add(1); upDownCounter.bind(labels).add(Math.random() > 0.5 ? 1 : -1); - recorder.bind(labels).record(Math.random()); + histogram.bind(labels).record(Math.random()); }, 1000); diff --git a/backwards-compatability/node10/index.ts b/experimental/backwards-compatability/node10/index.ts similarity index 100% rename from backwards-compatability/node10/index.ts rename to experimental/backwards-compatability/node10/index.ts diff --git a/backwards-compatability/node10/package.json b/experimental/backwards-compatability/node10/package.json similarity index 64% rename from backwards-compatability/node10/package.json rename to experimental/backwards-compatability/node10/package.json index 44969816b7a..6f1fbd01829 100644 --- a/backwards-compatability/node10/package.json +++ b/experimental/backwards-compatability/node10/package.json @@ -1,15 +1,15 @@ { "name": "backcompat-node10", - "version": "0.25.0", + "version": "0.26.0", "private": true, "description": "Backwards compatability app for node8 types and the OpenTelemetry Node.js SDK", "main": "index.js", "scripts": { - "test:backcompat": "tsc --noEmit index.ts" + "test:backcompat": "tsc --noEmit index.ts && tsc --noEmit --esModuleInterop index.ts" }, "dependencies": { - "@opentelemetry/sdk-node": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" + "@opentelemetry/sdk-node": "0.26.0", + "@opentelemetry/sdk-trace-base": "1.0.0" }, "devDependencies": { "@types/node": "10.17.60", diff --git a/backwards-compatability/node8/tsconfig.json b/experimental/backwards-compatability/node10/tsconfig.json similarity index 58% rename from backwards-compatability/node8/tsconfig.json rename to experimental/backwards-compatability/node10/tsconfig.json index 557ca620428..049617e92fe 100644 --- a/backwards-compatability/node8/tsconfig.json +++ b/experimental/backwards-compatability/node10/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.es5.json", + "extends": "../../../tsconfig.es5.json", "compilerOptions": { "rootDir": ".", "outDir": "build" @@ -9,7 +9,7 @@ ], "references": [ { - "path": "../../packages/opentelemetry-sdk-trace-base" + "path": "../../packages/opentelemetry-sdk-node" } ] } diff --git a/backwards-compatability/node12/index.ts b/experimental/backwards-compatability/node12/index.ts similarity index 100% rename from backwards-compatability/node12/index.ts rename to experimental/backwards-compatability/node12/index.ts diff --git a/backwards-compatability/node12/package.json b/experimental/backwards-compatability/node12/package.json similarity index 64% rename from backwards-compatability/node12/package.json rename to experimental/backwards-compatability/node12/package.json index afbf0d8b4a2..ca9bc34ae72 100644 --- a/backwards-compatability/node12/package.json +++ b/experimental/backwards-compatability/node12/package.json @@ -1,15 +1,15 @@ { "name": "backcompat-node12", - "version": "0.25.0", + "version": "0.26.0", "private": true, "description": "Backwards compatability app for node8 types and the OpenTelemetry Node.js SDK", "main": "index.js", "scripts": { - "test:backcompat": "tsc --noEmit index.ts" + "test:backcompat": "tsc --noEmit index.ts && tsc --noEmit --esModuleInterop index.ts" }, "dependencies": { - "@opentelemetry/sdk-node": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" + "@opentelemetry/sdk-node": "0.26.0", + "@opentelemetry/sdk-trace-base": "1.0.0" }, "devDependencies": { "@types/node": "12.20.20", diff --git a/backwards-compatability/node10/tsconfig.json b/experimental/backwards-compatability/node12/tsconfig.json similarity index 58% rename from backwards-compatability/node10/tsconfig.json rename to experimental/backwards-compatability/node12/tsconfig.json index 557ca620428..049617e92fe 100644 --- a/backwards-compatability/node10/tsconfig.json +++ b/experimental/backwards-compatability/node12/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.es5.json", + "extends": "../../../tsconfig.es5.json", "compilerOptions": { "rootDir": ".", "outDir": "build" @@ -9,7 +9,7 @@ ], "references": [ { - "path": "../../packages/opentelemetry-sdk-trace-base" + "path": "../../packages/opentelemetry-sdk-node" } ] } diff --git a/backwards-compatability/node8/index.ts b/experimental/backwards-compatability/node8/index.ts similarity index 100% rename from backwards-compatability/node8/index.ts rename to experimental/backwards-compatability/node8/index.ts diff --git a/backwards-compatability/node8/package.json b/experimental/backwards-compatability/node8/package.json similarity index 64% rename from backwards-compatability/node8/package.json rename to experimental/backwards-compatability/node8/package.json index 37a66f6652a..e5607fcf77d 100644 --- a/backwards-compatability/node8/package.json +++ b/experimental/backwards-compatability/node8/package.json @@ -1,15 +1,15 @@ { "name": "backcompat-node8", - "version": "0.25.0", + "version": "0.26.0", "private": true, "description": "Backwards compatability app for node8 types and the OpenTelemetry Node.js SDK", "main": "index.js", "scripts": { - "test:backcompat": "tsc --noEmit index.ts" + "test:backcompat": "tsc --noEmit index.ts && tsc --noEmit --esModuleInterop index.ts" }, "dependencies": { - "@opentelemetry/sdk-node": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" + "@opentelemetry/sdk-node": "0.26.0", + "@opentelemetry/sdk-trace-base": "1.0.0" }, "devDependencies": { "@types/node": "8.10.66", diff --git a/backwards-compatability/node12/tsconfig.json b/experimental/backwards-compatability/node8/tsconfig.json similarity index 58% rename from backwards-compatability/node12/tsconfig.json rename to experimental/backwards-compatability/node8/tsconfig.json index 557ca620428..049617e92fe 100644 --- a/backwards-compatability/node12/tsconfig.json +++ b/experimental/backwards-compatability/node8/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.es5.json", + "extends": "../../../tsconfig.es5.json", "compilerOptions": { "rootDir": ".", "outDir": "build" @@ -9,7 +9,7 @@ ], "references": [ { - "path": "../../packages/opentelemetry-sdk-trace-base" + "path": "../../packages/opentelemetry-sdk-node" } ] } diff --git a/experimental/lerna.json b/experimental/lerna.json index 99276cc155d..dd8377ce722 100644 --- a/experimental/lerna.json +++ b/experimental/lerna.json @@ -1,8 +1,9 @@ { "lerna": "3.13.4", - "version": "0.25.0", + "version": "0.26.0", "npmClient": "npm", "packages": [ - "packages/*" + "packages/*", + "backwards-compatability/*" ] } diff --git a/experimental/packages/opentelemetry-api-metrics/package.json b/experimental/packages/opentelemetry-api-metrics/package.json index 83950b2687b..5cb9e1503b4 100644 --- a/experimental/packages/opentelemetry-api-metrics/package.json +++ b/experimental/packages/opentelemetry-api-metrics/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/api-metrics", - "version": "0.25.0", + "version": "0.26.0", "description": "Public metrics API for OpenTelemetry", "main": "build/src/index.js", "module": "build/esm/index.js", diff --git a/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts b/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts index 6e0fd5bd207..775ad78f008 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/NoopMeter.ts @@ -21,18 +21,19 @@ import { UnboundMetric, Labels, Counter, - ValueRecorder, - ValueObserver, + Histogram, + ObservableGauge, UpDownCounter, - BaseObserver, - UpDownSumObserver, + ObservableBase, + ObservableCounter, + ObservableUpDownCounter, } from './types/Metric'; import { - BoundValueRecorder, + BoundHistogram, BoundCounter, - BoundBaseObserver, + BoundObservableBase, } from './types/BoundInstrument'; -import { ObserverResult } from './types/ObserverResult'; +import { ObservableResult } from './types/ObservableResult'; import { Observation } from './types/Observation'; /** @@ -43,12 +44,12 @@ export class NoopMeter implements Meter { constructor() {} /** - * Returns constant noop value recorder. + * Returns a constant noop histogram. * @param name the name of the metric. * @param [options] the metric options. */ - createValueRecorder(_name: string, _options?: MetricOptions): ValueRecorder { - return NOOP_VALUE_RECORDER_METRIC; + createHistogram(_name: string, _options?: MetricOptions): Histogram { + return NOOP_HISTOGRAM_METRIC; } /** @@ -70,45 +71,45 @@ export class NoopMeter implements Meter { } /** - * Returns constant noop value observer. + * Returns a constant noop observable gauge. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the value observer callback + * @param [callback] the observable gauge callback */ - createValueObserver( + createObservableGauge( _name: string, _options?: MetricOptions, - _callback?: (observerResult: ObserverResult) => void - ): ValueObserver { - return NOOP_VALUE_OBSERVER_METRIC; + _callback?: (observableResult: ObservableResult) => void + ): ObservableGauge { + return NOOP_OBSERVABLE_GAUGE_METRIC; } /** - * Returns constant noop sum observer. + * Returns a constant noop observable counter. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the sum observer callback + * @param [callback] the observable counter callback */ - createSumObserver( + createObservableCounter( _name: string, _options?: MetricOptions, - _callback?: (observerResult: ObserverResult) => void - ): ValueObserver { - return NOOP_SUM_OBSERVER_METRIC; + _callback?: (observableResult: ObservableResult) => void + ): ObservableCounter { + return NOOP_OBSERVABLE_COUNTER_METRIC; } /** - * Returns constant noop up down sum observer. + * Returns a constant noop up down observable counter. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the up down sum observer callback + * @param [callback] the up down observable counter callback */ - createUpDownSumObserver( + createObservableUpDownCounter( _name: string, _options?: MetricOptions, - _callback?: (observerResult: ObserverResult) => void - ): UpDownSumObserver { - return NOOP_UP_DOWN_SUM_OBSERVER_METRIC; + _callback?: (observableResult: ObservableResult) => void + ): ObservableUpDownCounter { + return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC; } /** @@ -165,20 +166,20 @@ export class NoopCounterMetric } } -export class NoopValueRecorderMetric - extends NoopMetric - implements ValueRecorder { +export class NoopHistogramMetric + extends NoopMetric + implements Histogram { record(value: number, labels: Labels): void { this.bind(labels).record(value); } } -export class NoopBaseObserverMetric - extends NoopMetric - implements BaseObserver { +export class NoopObservableBaseMetric + extends NoopMetric + implements ObservableBase { observation(): Observation { return { - observer: this as BaseObserver, + observable: this as ObservableBase, value: 0, }; } @@ -192,13 +193,13 @@ export class NoopBoundCounter implements BoundCounter { } } -export class NoopBoundValueRecorder implements BoundValueRecorder { +export class NoopBoundHistogram implements BoundHistogram { record(_value: number, _baggage?: unknown, _spanContext?: unknown): void { return; } } -export class NoopBoundBaseObserver implements BoundBaseObserver { +export class NoopBoundObservableBase implements BoundObservableBase { update(_value: number): void {} } @@ -206,22 +207,22 @@ export const NOOP_METER = new NoopMeter(); export const NOOP_BOUND_COUNTER = new NoopBoundCounter(); export const NOOP_COUNTER_METRIC = new NoopCounterMetric(NOOP_BOUND_COUNTER); -export const NOOP_BOUND_VALUE_RECORDER = new NoopBoundValueRecorder(); -export const NOOP_VALUE_RECORDER_METRIC = new NoopValueRecorderMetric( - NOOP_BOUND_VALUE_RECORDER +export const NOOP_BOUND_HISTOGRAM = new NoopBoundHistogram(); +export const NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric( + NOOP_BOUND_HISTOGRAM ); -export const NOOP_BOUND_BASE_OBSERVER = new NoopBoundBaseObserver(); -export const NOOP_VALUE_OBSERVER_METRIC = new NoopBaseObserverMetric( - NOOP_BOUND_BASE_OBSERVER +export const NOOP_BOUND_OBSERVABLE_BASE = new NoopBoundObservableBase(); +export const NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableBaseMetric( + NOOP_BOUND_OBSERVABLE_BASE ); -export const NOOP_UP_DOWN_SUM_OBSERVER_METRIC = new NoopBaseObserverMetric( - NOOP_BOUND_BASE_OBSERVER +export const NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC = new NoopObservableBaseMetric( + NOOP_BOUND_OBSERVABLE_BASE ); -export const NOOP_SUM_OBSERVER_METRIC = new NoopBaseObserverMetric( - NOOP_BOUND_BASE_OBSERVER +export const NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableBaseMetric( + NOOP_BOUND_OBSERVABLE_BASE ); export const NOOP_BATCH_OBSERVER = new NoopBatchObserver(); diff --git a/experimental/packages/opentelemetry-api-metrics/src/api/global-utils.ts b/experimental/packages/opentelemetry-api-metrics/src/api/global-utils.ts index a23f76396d7..e371d5165d7 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/api/global-utils.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/api/global-utils.ts @@ -52,4 +52,4 @@ export function makeGetter( * version. If the global API is not compatible with the API package * attempting to get it, a NOOP API implementation will be returned. */ -export const API_BACKWARDS_COMPATIBILITY_VERSION = 3; +export const API_BACKWARDS_COMPATIBILITY_VERSION = 4; diff --git a/experimental/packages/opentelemetry-api-metrics/src/index.ts b/experimental/packages/opentelemetry-api-metrics/src/index.ts index de39eb08215..2a7a0dd2551 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/index.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/index.ts @@ -22,7 +22,7 @@ export * from './types/Meter'; export * from './types/MeterProvider'; export * from './types/Metric'; export * from './types/Observation'; -export * from './types/ObserverResult'; +export * from './types/ObservableResult'; import { MetricsAPI } from './api/metrics'; /** Entrypoint for metrics API */ diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts b/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts index bae99eb8664..971156a774c 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/BatchObserverResult.ts @@ -18,8 +18,7 @@ import { Labels } from './Metric'; import { Observation } from './Observation'; /** - * Interface that is being used in callback function for Observer Metric - * for batch + * Interface that is being used in callback function for BatchObserver */ export interface BatchObserverResult { /** diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/BoundInstrument.ts b/experimental/packages/opentelemetry-api-metrics/src/types/BoundInstrument.ts index 0d5554771e6..378c9349884 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/BoundInstrument.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/BoundInstrument.ts @@ -23,16 +23,16 @@ export interface BoundCounter { add(value: number): void; } -/** ValueRecorder to report instantaneous measurement of a value. */ -export interface BoundValueRecorder { +/** Histogram to report instantaneous measurement of a value. */ +export interface BoundHistogram { /** - * Records the given value to this value recorder. + * Records the given value to this histogram. * @param value to record. */ record(value: number): void; } -/** An Instrument for Base Observer */ -export interface BoundBaseObserver { +/** An Instrument for Base Observable */ +export interface BoundObservableBase { update(value: number): void; } diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts index 27428f2554d..a522840ec50 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Meter.ts @@ -18,29 +18,29 @@ import { BatchObserverResult } from './BatchObserverResult'; import { MetricOptions, Counter, - ValueRecorder, - ValueObserver, + Histogram, + ObservableGauge, BatchObserverOptions, UpDownCounter, - SumObserver, - UpDownSumObserver, + ObservableCounter, + ObservableUpDownCounter, } from './Metric'; -import { ObserverResult } from './ObserverResult'; +import { ObservableResult } from './ObservableResult'; /** * An interface to allow the recording metrics. * * {@link Metric}s are used for recording pre-defined aggregation (`Counter`), - * or raw values (`ValueRecorder`) in which the aggregation and labels + * or raw values (`Histogram`) in which the aggregation and labels * for the exported metric are deferred. */ export interface Meter { /** - * Creates and returns a new `ValueRecorder`. + * Creates and returns a new `Histogram`. * @param name the name of the metric. * @param [options] the metric options. */ - createValueRecorder(name: string, options?: MetricOptions): ValueRecorder; + createHistogram(name: string, options?: MetricOptions): Histogram; /** * Creates a new `Counter` metric. Generally, this kind of metric when the @@ -71,40 +71,40 @@ export interface Meter { createUpDownCounter(name: string, options?: MetricOptions): UpDownCounter; /** - * Creates a new `ValueObserver` metric. + * Creates a new `ObservableGauge` metric. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the observer callback + * @param [callback] the observable callback */ - createValueObserver( + createObservableGauge( name: string, options?: MetricOptions, - callback?: (observerResult: ObserverResult) => void - ): ValueObserver; + callback?: (observableResult: ObservableResult) => void + ): ObservableGauge; /** - * Creates a new `SumObserver` metric. + * Creates a new `ObservableCounter` metric. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the observer callback + * @param [callback] the observable callback */ - createSumObserver( + createObservableCounter( name: string, options?: MetricOptions, - callback?: (observerResult: ObserverResult) => void - ): SumObserver; + callback?: (observableResult: ObservableResult) => void + ): ObservableCounter; /** - * Creates a new `UpDownSumObserver` metric. + * Creates a new `ObservableUpDownCounter` metric. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the observer callback + * @param [callback] the observable callback */ - createUpDownSumObserver( + createObservableUpDownCounter( name: string, options?: MetricOptions, - callback?: (observerResult: ObserverResult) => void - ): UpDownSumObserver; + callback?: (observableResult: ObservableResult) => void + ): ObservableUpDownCounter; /** * Creates a new `BatchObserver`, can be used to update many metrics diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts index aebbc462460..55b51218f85 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Metric.ts @@ -15,10 +15,13 @@ */ import { - BoundBaseObserver, + BoundObservableBase, BoundCounter, - BoundValueRecorder, + BoundHistogram, } from './BoundInstrument'; +import { + Observation, +} from './Observation'; /** * Options needed for metric creation @@ -146,31 +149,28 @@ export interface UpDownCounter extends UnboundMetric { add(value: number, labels?: Labels): void; } -export interface ValueRecorder extends UnboundMetric { +export interface Histogram extends UnboundMetric { /** - * Records the given value to this value recorder. + * Records the given value to this histogram. */ record(value: number, labels?: Labels): void; } -/** Base interface for the Observer metrics. */ -export interface BaseObserver extends UnboundMetric { +/** Base interface for the Observable metrics. */ +export interface ObservableBase extends UnboundMetric { observation: ( value: number - ) => { - value: number; - observer: BaseObserver; - }; + ) => Observation; } -/** Base interface for the ValueObserver metrics. */ -export type ValueObserver = BaseObserver; +/** Base interface for the ObservableGauge metrics. */ +export type ObservableGauge = ObservableBase; -/** Base interface for the UpDownSumObserver metrics. */ -export type UpDownSumObserver = BaseObserver; +/** Base interface for the ObservableUpDownCounter metrics. */ +export type ObservableUpDownCounter = ObservableBase; -/** Base interface for the SumObserver metrics. */ -export type SumObserver = BaseObserver; +/** Base interface for the ObservableCounter metrics. */ +export type ObservableCounter = ObservableBase; /** * key-value pairs passed by the user. diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/ObserverResult.ts b/experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts similarity index 86% rename from experimental/packages/opentelemetry-api-metrics/src/types/ObserverResult.ts rename to experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts index 7792483ad1a..c909833ab9c 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/ObserverResult.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/ObservableResult.ts @@ -17,8 +17,8 @@ import { Labels } from './Metric'; /** - * Interface that is being used in callback function for Observer Metric + * Interface that is being used in callback function for Observable Metric */ -export interface ObserverResult { +export interface ObservableResult { observe(value: number, labels: Labels): void; } diff --git a/experimental/packages/opentelemetry-api-metrics/src/types/Observation.ts b/experimental/packages/opentelemetry-api-metrics/src/types/Observation.ts index d36f48fb717..1e805f3689f 100644 --- a/experimental/packages/opentelemetry-api-metrics/src/types/Observation.ts +++ b/experimental/packages/opentelemetry-api-metrics/src/types/Observation.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import { BaseObserver } from './Metric'; +import { ObservableBase } from './Metric'; /** - * Interface for updating value of certain value observer + * Interface for updating value of certain observable */ export interface Observation { - observer: BaseObserver; + observable: ObservableBase; value: number; } 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 cbfe044a9f7..07b2e7b4020 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 @@ -18,9 +18,9 @@ import * as assert from 'assert'; import { NoopMeterProvider, NOOP_BOUND_COUNTER, - NOOP_BOUND_VALUE_RECORDER, + NOOP_BOUND_HISTOGRAM, NOOP_COUNTER_METRIC, - NOOP_VALUE_RECORDER_METRIC, + NOOP_HISTOGRAM_METRIC, } from '../../src'; describe('NoopMeter', () => { @@ -38,23 +38,23 @@ describe('NoopMeter', () => { assert.strictEqual(counter.bind(labels), NOOP_BOUND_COUNTER); counter.clear(); - const valueRecorder = meter.createValueRecorder('some-name'); - valueRecorder.bind(labels).record(1); + const histogram = meter.createHistogram('some-name'); + histogram.bind(labels).record(1); // ensure the correct noop const is returned - assert.strictEqual(valueRecorder, NOOP_VALUE_RECORDER_METRIC); - assert.strictEqual(valueRecorder.bind(labels), NOOP_BOUND_VALUE_RECORDER); + assert.strictEqual(histogram, NOOP_HISTOGRAM_METRIC); + assert.strictEqual(histogram.bind(labels), NOOP_BOUND_HISTOGRAM); const options = { component: 'tests', description: 'the testing package', }; - const valueRecorderWithOptions = meter.createValueRecorder( + const histogramWithOptions = meter.createHistogram( 'some-name', options ); - assert.strictEqual(valueRecorderWithOptions, NOOP_VALUE_RECORDER_METRIC); + assert.strictEqual(histogramWithOptions, NOOP_HISTOGRAM_METRIC); const counterWithOptions = meter.createCounter('some-name', options); assert.strictEqual(counterWithOptions, NOOP_COUNTER_METRIC); }); diff --git a/packages/opentelemetry-exporter-otlp-grpc/.eslintignore b/experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintignore similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/.eslintignore rename to experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintignore diff --git a/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js b/experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js similarity index 71% rename from packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js rename to experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js index fc4d0381204..3ed0fbeba38 100644 --- a/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js +++ b/experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js @@ -4,5 +4,5 @@ module.exports = { "commonjs": true, "node": true, }, - ...require('../../eslint.config.js') + ...require('../../../eslint.config.js') } diff --git a/packages/opentelemetry-exporter-otlp-grpc/.npmignore b/experimental/packages/opentelemetry-exporter-otlp-grpc/.npmignore similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/.npmignore rename to experimental/packages/opentelemetry-exporter-otlp-grpc/.npmignore diff --git a/packages/opentelemetry-exporter-otlp-grpc/LICENSE b/experimental/packages/opentelemetry-exporter-otlp-grpc/LICENSE similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/LICENSE rename to experimental/packages/opentelemetry-exporter-otlp-grpc/LICENSE diff --git a/packages/opentelemetry-exporter-otlp-grpc/README.md b/experimental/packages/opentelemetry-exporter-otlp-grpc/README.md similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/README.md rename to experimental/packages/opentelemetry-exporter-otlp-grpc/README.md diff --git a/packages/opentelemetry-exporter-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-otlp-grpc/package.json similarity index 85% rename from packages/opentelemetry-exporter-otlp-grpc/package.json rename to experimental/packages/opentelemetry-exporter-otlp-grpc/package.json index e4a7e9411b6..0e169d818b4 100644 --- a/packages/opentelemetry-exporter-otlp-grpc/package.json +++ b/experimental/packages/opentelemetry-exporter-otlp-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-otlp-grpc", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -15,7 +15,7 @@ "submodule": "git submodule sync --recursive && git submodule update --init --recursive", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", - "version": "node ../../scripts/version-update.js", + "version": "node ../../../scripts/version-update.js", "watch": "npm run protos:copy && tsc -w", "precompile": "lerna run version --scope $(npm pkg get name) --include-filtered-dependencies", "prewatch": "npm run precompile" @@ -49,7 +49,7 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/api-metrics": "0.26.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -69,10 +69,10 @@ "dependencies": { "@grpc/grpc-js": "^1.3.7", "@grpc/proto-loader": "^0.6.4", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/exporter-otlp-http": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/exporter-otlp-http": "0.26.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/sdk-metrics-base": "0.26.0", + "@opentelemetry/sdk-trace-base": "1.0.0" } } diff --git a/packages/opentelemetry-exporter-otlp-grpc/protos b/experimental/packages/opentelemetry-exporter-otlp-grpc/protos similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/protos rename to experimental/packages/opentelemetry-exporter-otlp-grpc/protos diff --git a/packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/src/index.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/src/index.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/src/index.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/src/index.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/src/types.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/src/types.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/src/types.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/src/types.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/src/util.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/src/util.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/src/util.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/src/util.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/submodule.md b/experimental/packages/opentelemetry-exporter-otlp-grpc/submodule.md similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/submodule.md rename to experimental/packages/opentelemetry-exporter-otlp-grpc/submodule.md diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts similarity index 90% rename from packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts index 86b8e1cef33..83d8723d4f9 100644 --- a/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts @@ -17,8 +17,8 @@ import * as protoLoader from '@grpc/proto-loader'; import { Counter, - ValueObserver, - ValueRecorder, + ObservableGauge, + Histogram, } from '@opentelemetry/api-metrics'; import { diag } from '@opentelemetry/api'; import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; @@ -31,13 +31,13 @@ import * as sinon from 'sinon'; import { OTLPMetricExporter } from '../src'; import { ensureExportedCounterIsCorrect, - ensureExportedObserverIsCorrect, - ensureExportedValueRecorderIsCorrect, + ensureExportedObservableGaugeIsCorrect, + ensureExportedHistogramIsCorrect, ensureMetadataIsCorrect, ensureResourceIsCorrect, mockCounter, - mockObserver, - mockValueRecorder, + mockObservableGauge, + mockHistogram, } from './helper'; const metricsServiceProtoPath = @@ -140,21 +140,21 @@ const testOTLPMetricExporter = (params: TestParams) => metrics = []; const counter: metrics.Metric & Counter = mockCounter(); - const observer: metrics.Metric & - ValueObserver = mockObserver(observerResult => { - observerResult.observe(3, {}); - observerResult.observe(6, {}); + const observableGauge: metrics.Metric & + ObservableGauge = mockObservableGauge(observableResult => { + observableResult.observe(3, {}); + observableResult.observe(6, {}); }); - const recorder: metrics.Metric & - ValueRecorder = mockValueRecorder(); + const histogram: metrics.Metric & + Histogram = mockHistogram(); counter.add(1); - recorder.record(7); - recorder.record(14); + histogram.record(7); + histogram.record(14); metrics.push((await counter.getMetricRecord())[0]); - metrics.push((await observer.getMetricRecord())[0]); - metrics.push((await recorder.getMetricRecord())[0]); + metrics.push((await observableGauge.getMetricRecord())[0]); + metrics.push((await histogram.getMetricRecord())[0]); }); afterEach(() => { @@ -203,21 +203,21 @@ const testOTLPMetricExporter = (params: TestParams) => resource = exportedData[0].resource; const counter = exportedData[0].instrumentationLibraryMetrics[0].metrics[0]; - const observer = + const observableGauge = exportedData[0].instrumentationLibraryMetrics[0].metrics[1]; - const recorder = + const histogram = exportedData[0].instrumentationLibraryMetrics[0].metrics[2]; ensureExportedCounterIsCorrect( counter, counter.intSum?.dataPoints[0].timeUnixNano ); - ensureExportedObserverIsCorrect( - observer, - observer.doubleGauge?.dataPoints[0].timeUnixNano + ensureExportedObservableGaugeIsCorrect( + observableGauge, + observableGauge.doubleGauge?.dataPoints[0].timeUnixNano ); - ensureExportedValueRecorderIsCorrect( - recorder, - recorder.intHistogram?.dataPoints[0].timeUnixNano, + ensureExportedHistogramIsCorrect( + histogram, + histogram.intHistogram?.dataPoints[0].timeUnixNano, [0, 100], ['0', '2', '0'] ); diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.crt rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.crt diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.key rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.key diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/client.crt rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.crt diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.csr similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/client.csr rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.csr diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.key b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/client.key rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.key diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/regenerate.sh similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/regenerate.sh rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/regenerate.sh diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/server.crt rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.crt diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.csr similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/server.csr rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.csr diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.key b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/certs/server.key rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.key diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts similarity index 92% rename from packages/opentelemetry-exporter-otlp-grpc/test/helper.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts index e77f0f1742e..48325a12d4f 100644 --- a/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts @@ -17,9 +17,9 @@ import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; import { Counter, - ObserverResult, - ValueObserver, - ValueRecorder, + ObservableResult, + ObservableGauge, + Histogram, ValueType, } from '@opentelemetry/api-metrics'; import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; @@ -75,16 +75,16 @@ export function mockCounter(): metrics.Metric & Counter { return metric; } -export function mockObserver( - callback: (observerResult: ObserverResult) => void -): metrics.Metric & ValueObserver { - const name = 'double-observer'; +export function mockObservableGauge( + callback: (observableResult: ObservableResult) => void +): metrics.Metric & ObservableGauge { + const name = 'double-observable-gauge'; const metric = meter['_metrics'].get(name) || - meter.createValueObserver( + meter.createObservableGauge( name, { - description: 'sample observer description', + description: 'sample observable gauge description', valueType: ValueType.DOUBLE, }, callback @@ -94,13 +94,13 @@ export function mockObserver( return metric; } -export function mockValueRecorder(): metrics.Metric & - ValueRecorder { - const name = 'int-recorder'; +export function mockHistogram(): metrics.Metric & + Histogram { + const name = 'int-histogram'; const metric = meter['_metrics'].get(name) || - meter.createValueRecorder(name, { - description: 'sample recorder description', + meter.createHistogram(name, { + description: 'sample histogram description', valueType: ValueType.INT, boundaries: [0, 100], }); @@ -352,13 +352,13 @@ export function ensureExportedCounterIsCorrect( }); } -export function ensureExportedObserverIsCorrect( +export function ensureExportedObservableGaugeIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time?: number ) { assert.deepStrictEqual(metric, { - name: 'double-observer', - description: 'sample observer description', + name: 'double-observable-gauge', + description: 'sample observable gauge description', unit: '1', data: 'doubleGauge', doubleGauge: { @@ -375,15 +375,15 @@ export function ensureExportedObserverIsCorrect( }); } -export function ensureExportedValueRecorderIsCorrect( +export function ensureExportedHistogramIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time?: number, explicitBounds: number[] = [Infinity], bucketCounts: string[] = ['2', '0'] ) { assert.deepStrictEqual(metric, { - name: 'int-recorder', - description: 'sample recorder description', + name: 'int-histogram', + description: 'sample histogram description', unit: '1', data: 'intHistogram', intHistogram: { diff --git a/packages/opentelemetry-exporter-otlp-grpc/test/util.test.ts b/experimental/packages/opentelemetry-exporter-otlp-grpc/test/util.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-grpc/test/util.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-grpc/test/util.test.ts diff --git a/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json b/experimental/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json similarity index 57% rename from packages/opentelemetry-exporter-otlp-grpc/tsconfig.json rename to experimental/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json index cfc7b73a484..caced6b4e8b 100644 --- a/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "rootDir": ".", "outDir": "build" @@ -10,16 +10,13 @@ ], "references": [ { - "path": "../opentelemetry-core" + "path": "../opentelemetry-api-metrics" }, { "path": "../opentelemetry-exporter-otlp-http" }, { - "path": "../opentelemetry-resources" - }, - { - "path": "../opentelemetry-sdk-trace-base" + "path": "../opentelemetry-sdk-metrics-base" } ] } diff --git a/packages/opentelemetry-exporter-otlp-http/.eslintignore b/experimental/packages/opentelemetry-exporter-otlp-http/.eslintignore similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/.eslintignore rename to experimental/packages/opentelemetry-exporter-otlp-http/.eslintignore diff --git a/packages/opentelemetry-exporter-otlp-http/.eslintrc.js b/experimental/packages/opentelemetry-exporter-otlp-http/.eslintrc.js similarity index 75% rename from packages/opentelemetry-exporter-otlp-http/.eslintrc.js rename to experimental/packages/opentelemetry-exporter-otlp-http/.eslintrc.js index 9dfe62f9b8c..e41d9a9299b 100644 --- a/packages/opentelemetry-exporter-otlp-http/.eslintrc.js +++ b/experimental/packages/opentelemetry-exporter-otlp-http/.eslintrc.js @@ -5,5 +5,5 @@ module.exports = { "node": true, "browser": true }, - ...require('../../eslint.config.js') + ...require('../../../eslint.config.js') } diff --git a/packages/opentelemetry-exporter-otlp-http/.npmignore b/experimental/packages/opentelemetry-exporter-otlp-http/.npmignore similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/.npmignore rename to experimental/packages/opentelemetry-exporter-otlp-http/.npmignore diff --git a/packages/opentelemetry-exporter-otlp-http/LICENSE b/experimental/packages/opentelemetry-exporter-otlp-http/LICENSE similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/LICENSE rename to experimental/packages/opentelemetry-exporter-otlp-http/LICENSE diff --git a/packages/opentelemetry-exporter-otlp-http/README.md b/experimental/packages/opentelemetry-exporter-otlp-http/README.md similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/README.md rename to experimental/packages/opentelemetry-exporter-otlp-http/README.md diff --git a/packages/opentelemetry-exporter-otlp-http/karma.conf.js b/experimental/packages/opentelemetry-exporter-otlp-http/karma.conf.js similarity index 87% rename from packages/opentelemetry-exporter-otlp-http/karma.conf.js rename to experimental/packages/opentelemetry-exporter-otlp-http/karma.conf.js index 455b1437c87..4c60b54edba 100644 --- a/packages/opentelemetry-exporter-otlp-http/karma.conf.js +++ b/experimental/packages/opentelemetry-exporter-otlp-http/karma.conf.js @@ -14,8 +14,8 @@ * limitations under the License. */ -const karmaWebpackConfig = require('../../karma.webpack'); -const karmaBaseConfig = require('../../karma.base'); +const karmaWebpackConfig = require('../../../karma.webpack'); +const karmaBaseConfig = require('../../../karma.base'); module.exports = (config) => { config.set(Object.assign({}, karmaBaseConfig, { diff --git a/packages/opentelemetry-exporter-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-otlp-http/package.json similarity index 90% rename from packages/opentelemetry-exporter-otlp-http/package.json rename to experimental/packages/opentelemetry-exporter-otlp-http/package.json index 3a03727c437..91399c51a8d 100644 --- a/packages/opentelemetry-exporter-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-otlp-http/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-otlp-http", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -21,7 +21,7 @@ "tdd:browser": "karma start", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts' --exclude 'test/browser/**/*.ts'", "test:browser": "nyc karma start --single-run", - "version": "node ../../scripts/version-update.js", + "version": "node ../../../scripts/version-update.js", "watch": "tsc --build --watch tsconfig.json tsconfig.esm.json", "precompile": "lerna run version --scope $(npm pkg get name) --include-filtered-dependencies", "prewatch": "npm run precompile" @@ -86,10 +86,10 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0" + "@opentelemetry/api-metrics": "0.26.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/sdk-metrics-base": "0.26.0", + "@opentelemetry/sdk-trace-base": "1.0.0" } } diff --git a/packages/opentelemetry-exporter-otlp-http/src/OTLPExporterBase.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/OTLPExporterBase.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/OTLPExporterBase.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/OTLPExporterBase.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/index.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/index.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/index.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/index.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPTraceExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPTraceExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/browser/util.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/util.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/browser/util.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/util.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/index.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/index.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/index.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/index.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPExporterNodeBase.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPExporterNodeBase.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPExporterNodeBase.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPExporterNodeBase.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPTraceExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPTraceExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/node/types.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/types.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/node/types.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/types.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/platform/node/util.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/util.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/platform/node/util.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/util.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/transform.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/transform.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/transform.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/transform.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts similarity index 96% rename from packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts index cc0f580883c..97a0e1ec3e4 100644 --- a/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts @@ -47,7 +47,7 @@ export function toCollectorLabels( export function toAggregationTemporality( metric: MetricRecord ): opentelemetryProto.metrics.v1.AggregationTemporality { - if (metric.descriptor.metricKind === MetricKind.VALUE_OBSERVER) { + if (metric.descriptor.metricKind === MetricKind.OBSERVABLE_GAUGE) { return opentelemetryProto.metrics.v1.AggregationTemporality .AGGREGATION_TEMPORALITY_UNSPECIFIED; } @@ -115,14 +115,14 @@ export function toCollectorMetric( if ( metric.aggregator.kind === AggregatorKind.SUM || - metric.descriptor.metricKind === MetricKind.SUM_OBSERVER || - metric.descriptor.metricKind === MetricKind.UP_DOWN_SUM_OBSERVER + metric.descriptor.metricKind === MetricKind.OBSERVABLE_COUNTER || + metric.descriptor.metricKind === MetricKind.OBSERVABLE_UP_DOWN_COUNTER ) { const result = { dataPoints: [toDataPoint(metric, startTime)], isMonotonic: metric.descriptor.metricKind === MetricKind.COUNTER || - metric.descriptor.metricKind === MetricKind.SUM_OBSERVER, + metric.descriptor.metricKind === MetricKind.OBSERVABLE_COUNTER, aggregationTemporality: toAggregationTemporality(metric), }; if (metric.descriptor.valueType === ValueType.INT) { diff --git a/packages/opentelemetry-exporter-otlp-http/src/types.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/types.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/types.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/types.ts diff --git a/packages/opentelemetry-exporter-otlp-http/src/util.ts b/experimental/packages/opentelemetry-exporter-otlp-http/src/util.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/src/util.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/src/util.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts similarity index 93% rename from packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts index 34463695c86..a2d289a7fe9 100644 --- a/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts @@ -17,14 +17,14 @@ import { diag } from '@opentelemetry/api'; import { Counter, - ValueObserver, - ValueRecorder, + ObservableGauge, + Histogram, } from '@opentelemetry/api-metrics'; import { ExportResultCode, hrTimeToNanoseconds } from '@opentelemetry/core'; import { BoundCounter, - BoundObserver, - BoundValueRecorder, + BoundObservable, + BoundHistogram, Metric, MetricRecord, } from '@opentelemetry/sdk-metrics-base'; @@ -37,12 +37,12 @@ import { ensureCounterIsCorrect, ensureExportMetricsServiceRequestIsSet, ensureHeadersContain, - ensureObserverIsCorrect, - ensureValueRecorderIsCorrect, + ensureObservableGaugeIsCorrect, + ensureHistogramIsCorrect, ensureWebResourceIsCorrect, mockCounter, - mockObserver, - mockValueRecorder, + mockObservableGauge, + mockHistogram, } from '../helper'; describe('OTLPMetricExporter - web', () => { @@ -57,22 +57,22 @@ describe('OTLPMetricExporter - web', () => { stubBeacon = sinon.stub(navigator, 'sendBeacon'); metrics = []; const counter: Metric & Counter = mockCounter(); - const observer: Metric & ValueObserver = mockObserver( - observerResult => { - observerResult.observe(3, {}); - observerResult.observe(6, {}); + const observableGauge: Metric & ObservableGauge = mockObservableGauge( + observableResult => { + observableResult.observe(3, {}); + observableResult.observe(6, {}); }, - 'double-observer2' + 'double-observable-gauge2' ); - const recorder: Metric & - ValueRecorder = mockValueRecorder(); + const histogram: Metric & + Histogram = mockHistogram(); counter.add(1); - recorder.record(7); - recorder.record(14); + histogram.record(7); + histogram.record(14); metrics.push((await counter.getMetricRecord())[0]); - metrics.push((await observer.getMetricRecord())[0]); - metrics.push((await recorder.getMetricRecord())[0]); + metrics.push((await observableGauge.getMetricRecord())[0]); + metrics.push((await histogram.getMetricRecord())[0]); }); afterEach(() => { @@ -121,11 +121,11 @@ describe('OTLPMetricExporter - web', () => { "second metric doesn't exist" ); if (metric2) { - ensureObserverIsCorrect( + ensureObservableGaugeIsCorrect( metric2, hrTimeToNanoseconds(metrics[1].aggregator.toPoint().timestamp), 6, - 'double-observer2' + 'double-observable-gauge2' ); } @@ -134,7 +134,7 @@ describe('OTLPMetricExporter - web', () => { "third metric doesn't exist" ); if (metric3) { - ensureValueRecorderIsCorrect( + ensureHistogramIsCorrect( metric3, hrTimeToNanoseconds(metrics[2].aggregator.toPoint().timestamp), [0, 100], @@ -234,11 +234,11 @@ describe('OTLPMetricExporter - web', () => { "second metric doesn't exist" ); if (metric2) { - ensureObserverIsCorrect( + ensureObservableGaugeIsCorrect( metric2, hrTimeToNanoseconds(metrics[1].aggregator.toPoint().timestamp), 6, - 'double-observer2' + 'double-observable-gauge2' ); } @@ -247,7 +247,7 @@ describe('OTLPMetricExporter - web', () => { "third metric doesn't exist" ); if (metric3) { - ensureValueRecorderIsCorrect( + ensureHistogramIsCorrect( metric3, hrTimeToNanoseconds(metrics[2].aggregator.toPoint().timestamp), [0, 100], diff --git a/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/browser/index-webpack.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/index-webpack.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/browser/index-webpack.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/browser/index-webpack.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/ca.crt rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.crt diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/ca.key rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.key diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/client.crt rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.crt diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.csr similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/client.csr rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.csr diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/client.key b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/client.key rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.key diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/regenerate.sh similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/regenerate.sh rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/regenerate.sh diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/server.crt rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.crt diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.csr similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/server.csr rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.csr diff --git a/packages/opentelemetry-exporter-otlp-http/test/certs/server.key b/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/certs/server.key rename to experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.key diff --git a/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts similarity index 92% rename from packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts index 119702c6836..7282f538c0e 100644 --- a/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { Counter, ValueObserver } from '@opentelemetry/api-metrics'; +import { Counter, ObservableGauge } from '@opentelemetry/api-metrics'; import { ExportResultCode } from '@opentelemetry/core'; import { BoundCounter, - BoundObserver, + BoundObservable, Metric, MetricRecord, } from '@opentelemetry/sdk-metrics-base'; @@ -27,7 +27,7 @@ import * as sinon from 'sinon'; import { OTLPExporterBase } from '../../src/OTLPExporterBase'; import * as otlpTypes from '../../src/types'; import { OTLPExporterConfigBase } from '../../src/types'; -import { mockCounter, mockObserver } from '../helper'; +import { mockCounter, mockObservableGauge } from '../helper'; type CollectorExporterConfig = OTLPExporterConfigBase; class OTLPMetricExporter extends OTLPExporterBase< @@ -70,17 +70,17 @@ describe('OTLPMetricExporter - common', () => { collectorExporter = new OTLPMetricExporter(collectorExporterConfig); metrics = []; const counter: Metric & Counter = mockCounter(); - const observer: Metric & ValueObserver = mockObserver( - observerResult => { - observerResult.observe(3, {}); - observerResult.observe(6, {}); + const observableGauge: Metric & ObservableGauge = mockObservableGauge( + observableResult => { + observableResult.observe(3, {}); + observableResult.observe(6, {}); }, - 'double-observer3' + 'double-observable-gauge3' ); counter.add(1); metrics.push((await counter.getMetricRecord())[0]); - metrics.push((await observer.getMetricRecord())[0]); + metrics.push((await observableGauge.getMetricRecord())[0]); }); it('should create an instance', () => { diff --git a/packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts similarity index 62% rename from packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts index e94a6cf71df..71ce5ab274e 100644 --- a/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts @@ -15,16 +15,16 @@ */ import { Counter, - SumObserver, - UpDownSumObserver, - ValueObserver, - ValueRecorder, + ObservableCounter, + ObservableUpDownCounter, + ObservableGauge, + Histogram, } from '@opentelemetry/api-metrics'; import { hrTimeToNanoseconds } from '@opentelemetry/core'; import { BoundCounter, - BoundObserver, - BoundValueRecorder, + BoundObservable, + BoundHistogram, Metric, SumAggregator, } from '@opentelemetry/sdk-metrics-base'; @@ -34,18 +34,18 @@ import * as transform from '../../src/transformMetrics'; import { ensureCounterIsCorrect, ensureDoubleCounterIsCorrect, - ensureObserverIsCorrect, - ensureSumObserverIsCorrect, - ensureUpDownSumObserverIsCorrect, - ensureValueRecorderIsCorrect, + ensureObservableGaugeIsCorrect, + ensureObservableCounterIsCorrect, + ensureObservableUpDownCounterIsCorrect, + ensureHistogramIsCorrect, mockCounter, mockDoubleCounter, mockedInstrumentationLibraries, mockedResources, - mockObserver, - mockSumObserver, - mockUpDownSumObserver, - mockValueRecorder, + mockObservableGauge, + mockObservableCounter, + mockObservableUpDownCounter, + mockHistogram, multiInstrumentationLibraryMetricsGet, multiResourceMetricsGet, } from '../helper'; @@ -54,10 +54,10 @@ describe('transformMetrics', () => { describe('toCollectorMetric', async () => { let counter: Metric & Counter; let doubleCounter: Metric & Counter; - let observer: Metric & ValueObserver; - let sumObserver: Metric & SumObserver; - let upDownSumObserver: Metric & UpDownSumObserver; - let recorder: Metric & ValueRecorder; + let observableGauge: Metric & ObservableGauge; + let observableCounter: Metric & ObservableCounter; + let observableUpDownCounter: Metric & ObservableUpDownCounter; + let histogram: Metric & Histogram; beforeEach(() => { counter = mockCounter(); doubleCounter = mockDoubleCounter(); @@ -72,22 +72,22 @@ describe('transformMetrics', () => { return -1; } - observer = mockObserver(observerResult => { + observableGauge = mockObservableGauge(observableResult => { count1++; - observerResult.observe(getValue(count1), {}); + observableResult.observe(getValue(count1), {}); }); - sumObserver = mockSumObserver(observerResult => { + observableCounter = mockObservableCounter(observableResult => { count2++; - observerResult.observe(getValue(count2), {}); + observableResult.observe(getValue(count2), {}); }); - upDownSumObserver = mockUpDownSumObserver(observerResult => { + observableUpDownCounter = mockObservableUpDownCounter(observableResult => { count3++; - observerResult.observe(getValue(count3), {}); + observableResult.observe(getValue(count3), {}); }); - recorder = mockValueRecorder(); + histogram = mockHistogram(); // Counter counter.add(1); @@ -95,9 +95,9 @@ describe('transformMetrics', () => { // Double Counter doubleCounter.add(8); - // ValueRecorder - recorder.record(7); - recorder.record(14); + // Histogram + histogram.record(7); + histogram.record(14); }); it('should convert metric', async () => { @@ -113,46 +113,46 @@ describe('transformMetrics', () => { hrTimeToNanoseconds(doubleCounterMetric.aggregator.toPoint().timestamp) ); - await observer.getMetricRecord(); - await observer.getMetricRecord(); - const observerMetric = (await observer.getMetricRecord())[0]; - ensureObserverIsCorrect( - transform.toCollectorMetric(observerMetric, 1592602232694000000), - hrTimeToNanoseconds(observerMetric.aggregator.toPoint().timestamp), + await observableGauge.getMetricRecord(); + await observableGauge.getMetricRecord(); + const observableGaugeMetric = (await observableGauge.getMetricRecord())[0]; + ensureObservableGaugeIsCorrect( + transform.toCollectorMetric(observableGaugeMetric, 1592602232694000000), + hrTimeToNanoseconds(observableGaugeMetric.aggregator.toPoint().timestamp), -1 ); // collect 3 times - await sumObserver.getMetricRecord(); - await sumObserver.getMetricRecord(); - const sumObserverMetric = (await sumObserver.getMetricRecord())[0]; - ensureSumObserverIsCorrect( - transform.toCollectorMetric(sumObserverMetric, 1592602232694000000), - hrTimeToNanoseconds(sumObserverMetric.aggregator.toPoint().timestamp), + await observableCounter.getMetricRecord(); + await observableCounter.getMetricRecord(); + const observableCounterMetric = (await observableCounter.getMetricRecord())[0]; + ensureObservableCounterIsCorrect( + transform.toCollectorMetric(observableCounterMetric, 1592602232694000000), + hrTimeToNanoseconds(observableCounterMetric.aggregator.toPoint().timestamp), 3 ); // collect 3 times - await upDownSumObserver.getMetricRecord(); - await upDownSumObserver.getMetricRecord(); - const upDownSumObserverMetric = ( - await upDownSumObserver.getMetricRecord() + await observableUpDownCounter.getMetricRecord(); + await observableUpDownCounter.getMetricRecord(); + const observableUpDownCounterMetric = ( + await observableUpDownCounter.getMetricRecord() )[0]; - ensureUpDownSumObserverIsCorrect( + ensureObservableUpDownCounterIsCorrect( transform.toCollectorMetric( - upDownSumObserverMetric, + observableUpDownCounterMetric, 1592602232694000000 ), hrTimeToNanoseconds( - upDownSumObserverMetric.aggregator.toPoint().timestamp + observableUpDownCounterMetric.aggregator.toPoint().timestamp ), -1 ); - const recorderMetric = (await recorder.getMetricRecord())[0]; - ensureValueRecorderIsCorrect( - transform.toCollectorMetric(recorderMetric, 1592602232694000000), - hrTimeToNanoseconds(recorderMetric.aggregator.toPoint().timestamp), + const histogramMetric = (await histogram.getMetricRecord())[0]; + ensureHistogramIsCorrect( + transform.toCollectorMetric(histogramMetric, 1592602232694000000), + hrTimeToNanoseconds(histogramMetric.aggregator.toPoint().timestamp), [0, 100], [0, 2, 0] ); @@ -186,8 +186,8 @@ describe('transformMetrics', () => { const [resource1, resource2] = mockedResources; const [library] = mockedInstrumentationLibraries; const [metric1, metric2, metric3] = multiResourceMetricsGet( - observerResult => { - observerResult.observe(1, {}); + observableResult => { + observableResult.observe(1, {}); } ); @@ -197,8 +197,8 @@ describe('transformMetrics', () => { ]); const result = transform.groupMetricsByResourceAndLibrary( - multiResourceMetricsGet(observerResult => { - observerResult.observe(1, {}); + multiResourceMetricsGet(observableResult => { + observableResult.observe(1, {}); }) ); @@ -212,7 +212,7 @@ describe('transformMetrics', () => { metric1, metric2, metric3, - ] = multiInstrumentationLibraryMetricsGet(observerResult => {}); + ] = multiInstrumentationLibraryMetricsGet(observableResult => {}); const expected = new Map([ [ resource, @@ -224,7 +224,7 @@ describe('transformMetrics', () => { ]); const result = transform.groupMetricsByResourceAndLibrary( - multiInstrumentationLibraryMetricsGet(observerResult => {}) + multiInstrumentationLibraryMetricsGet(observableResult => {}) ); assert.deepStrictEqual(result, expected); diff --git a/packages/opentelemetry-exporter-otlp-http/test/common/utils.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/common/utils.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/common/utils.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/common/utils.test.ts diff --git a/packages/opentelemetry-exporter-otlp-http/test/helper.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/helper.ts similarity index 90% rename from packages/opentelemetry-exporter-otlp-http/test/helper.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/helper.ts index 87839060349..5befa3515f7 100644 --- a/packages/opentelemetry-exporter-otlp-http/test/helper.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/test/helper.ts @@ -17,11 +17,11 @@ import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; import { Counter, - ObserverResult, - SumObserver, - UpDownSumObserver, - ValueObserver, - ValueRecorder, + ObservableResult, + ObservableCounter, + ObservableUpDownCounter, + ObservableGauge, + Histogram, ValueType, } from '@opentelemetry/api-metrics'; import { hexToBase64, InstrumentationLibrary, VERSION } from '@opentelemetry/core'; @@ -78,16 +78,16 @@ export function mockDoubleCounter(): metrics.Metric & return metric; } -export function mockObserver( - callback: (observerResult: ObserverResult) => unknown, - name = 'double-observer' -): metrics.Metric & ValueObserver { +export function mockObservableGauge( + callback: (observableResult: ObservableResult) => unknown, + name = 'double-observable-gauge' +): metrics.Metric & ObservableGauge { const metric = meter['_metrics'].get(name) || - meter.createValueObserver( + meter.createObservableGauge( name, { - description: 'sample observer description', + description: 'sample observable gauge description', valueType: ValueType.DOUBLE, }, callback @@ -97,16 +97,16 @@ export function mockObserver( return metric; } -export function mockSumObserver( - callback: (observerResult: ObserverResult) => unknown, - name = 'double-sum-observer' -): metrics.Metric & SumObserver { +export function mockObservableCounter( + callback: (observableResult: ObservableResult) => unknown, + name = 'double-observable-counter' +): metrics.Metric & ObservableCounter { const metric = meter['_metrics'].get(name) || - meter.createSumObserver( + meter.createObservableCounter( name, { - description: 'sample sum observer description', + description: 'sample observable counter description', valueType: ValueType.DOUBLE, }, callback @@ -116,16 +116,16 @@ export function mockSumObserver( return metric; } -export function mockUpDownSumObserver( - callback: (observerResult: ObserverResult) => unknown, - name = 'double-up-down-sum-observer' -): metrics.Metric & UpDownSumObserver { +export function mockObservableUpDownCounter( + callback: (observableResult: ObservableResult) => unknown, + name = 'double-up-down-observable-counter' +): metrics.Metric & ObservableUpDownCounter { const metric = meter['_metrics'].get(name) || - meter.createUpDownSumObserver( + meter.createObservableUpDownCounter( name, { - description: 'sample up down sum observer description', + description: 'sample observable up down counter description', valueType: ValueType.DOUBLE, }, callback @@ -135,13 +135,13 @@ export function mockUpDownSumObserver( return metric; } -export function mockValueRecorder(): metrics.Metric & - ValueRecorder { - const name = 'int-recorder'; +export function mockHistogram(): metrics.Metric & + Histogram { + const name = 'int-histogram'; const metric = meter['_metrics'].get(name) || - meter.createValueRecorder(name, { - description: 'sample recorder description', + meter.createHistogram(name, { + description: 'sample histogram description', valueType: ValueType.INT, boundaries: [0, 100], }); @@ -313,7 +313,7 @@ export const multiResourceTrace: ReadableSpan[] = [ ]; export const multiResourceMetricsGet = function ( - callback: (observerResult: ObserverResult) => unknown + callback: (observableResult: ObservableResult) => unknown ): any[] { return [ { @@ -322,7 +322,7 @@ export const multiResourceMetricsGet = function ( instrumentationLibrary: mockedInstrumentationLibraries[0], }, { - ...mockObserver(callback), + ...mockObservableGauge(callback), resource: mockedResources[1], instrumentationLibrary: mockedInstrumentationLibraries[0], }, @@ -335,7 +335,7 @@ export const multiResourceMetricsGet = function ( }; export const multiInstrumentationLibraryMetricsGet = function ( - callback: (observerResult: ObserverResult) => unknown + callback: (observableResult: ObservableResult) => unknown ): any[] { return [ { @@ -344,7 +344,7 @@ export const multiInstrumentationLibraryMetricsGet = function ( instrumentationLibrary: mockedInstrumentationLibraries[0], }, { - ...mockObserver(callback), + ...mockObservableGauge(callback), resource: mockedResources[0], instrumentationLibrary: mockedInstrumentationLibraries[1], }, @@ -601,15 +601,15 @@ export function ensureDoubleCounterIsCorrect( }); } -export function ensureObserverIsCorrect( +export function ensureObservableGaugeIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time: number, value: number, - name = 'double-observer' + name = 'double-observable-gauge' ) { assert.deepStrictEqual(metric, { name, - description: 'sample observer description', + description: 'sample observable gauge description', unit: '1', doubleGauge: { dataPoints: [ @@ -624,15 +624,15 @@ export function ensureObserverIsCorrect( }); } -export function ensureSumObserverIsCorrect( +export function ensureObservableCounterIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time: number, value: number, - name = 'double-sum-observer' + name = 'double-observable-counter' ) { assert.deepStrictEqual(metric, { name, - description: 'sample sum observer description', + description: 'sample observable counter description', unit: '1', doubleSum: { isMonotonic: true, @@ -651,15 +651,15 @@ export function ensureSumObserverIsCorrect( }); } -export function ensureUpDownSumObserverIsCorrect( +export function ensureObservableUpDownCounterIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time: number, value: number, - name = 'double-up-down-sum-observer' + name = 'double-up-down-observable-counter' ) { assert.deepStrictEqual(metric, { name, - description: 'sample up down sum observer description', + description: 'sample observable up down counter description', unit: '1', doubleSum: { isMonotonic: false, @@ -678,15 +678,15 @@ export function ensureUpDownSumObserverIsCorrect( }); } -export function ensureValueRecorderIsCorrect( +export function ensureHistogramIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time: number, explicitBounds: (number | null)[] = [Infinity], bucketCounts: number[] = [2, 0] ) { assert.deepStrictEqual(metric, { - name: 'int-recorder', - description: 'sample recorder description', + name: 'int-histogram', + description: 'sample histogram description', unit: '1', intHistogram: { dataPoints: [ diff --git a/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts similarity index 92% rename from packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts index 2fd9e04a360..11308aeef2d 100644 --- a/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts @@ -17,14 +17,14 @@ import { diag } from '@opentelemetry/api'; import { Counter, - ValueObserver, - ValueRecorder, + ObservableGauge, + Histogram, } from '@opentelemetry/api-metrics'; import * as core from '@opentelemetry/core'; import { BoundCounter, - BoundObserver, - BoundValueRecorder, + BoundObservable, + BoundHistogram, Metric, MetricRecord, } from '@opentelemetry/sdk-metrics-base'; @@ -39,11 +39,11 @@ import * as otlpTypes from '../../src/types'; import { ensureCounterIsCorrect, ensureExportMetricsServiceRequestIsSet, - ensureObserverIsCorrect, - ensureValueRecorderIsCorrect, + ensureObservableGaugeIsCorrect, + ensureHistogramIsCorrect, mockCounter, - mockObserver, - mockValueRecorder, + mockObservableGauge, + mockHistogram, } from '../helper'; import { MockedResponse } from './nodeHelpers'; @@ -72,7 +72,6 @@ describe('OTLPMetricExporter - node with json over http', () => { // Need to stub/spy on the underlying logger as the "diag" instance is global const spyLoggerWarn = sinon.stub(diag, 'warn'); collectorExporter = new OTLPMetricExporter({ - serviceName: 'basic-service', url: address, metadata, } as any); @@ -150,21 +149,21 @@ describe('OTLPMetricExporter - node with json over http', () => { }); metrics = []; const counter: Metric & Counter = mockCounter(); - const observer: Metric & ValueObserver = mockObserver( - observerResult => { - observerResult.observe(6, {}); + const observableGauge: Metric & ObservableGauge = mockObservableGauge( + observableResult => { + observableResult.observe(6, {}); }, - 'double-observer2' + 'double-observable-gauge2' ); - const recorder: Metric & - ValueRecorder = mockValueRecorder(); + const histogram: Metric & + Histogram = mockHistogram(); counter.add(1); - recorder.record(7); - recorder.record(14); + histogram.record(7); + histogram.record(14); metrics.push((await counter.getMetricRecord())[0]); - metrics.push((await observer.getMetricRecord())[0]); - metrics.push((await recorder.getMetricRecord())[0]); + metrics.push((await observableGauge.getMetricRecord())[0]); + metrics.push((await histogram.getMetricRecord())[0]); }); it('should open the connection', done => { @@ -225,15 +224,15 @@ describe('OTLPMetricExporter - node with json over http', () => { metric1, core.hrTimeToNanoseconds(metrics[0].aggregator.toPoint().timestamp) ); - assert.ok(typeof metric2 !== 'undefined', "observer doesn't exist"); - ensureObserverIsCorrect( + assert.ok(typeof metric2 !== 'undefined', "observable gauge doesn't exist"); + ensureObservableGaugeIsCorrect( metric2, core.hrTimeToNanoseconds(metrics[1].aggregator.toPoint().timestamp), 6, - 'double-observer2' + 'double-observable-gauge2' ); assert.ok(typeof metric3 !== 'undefined', "histogram doesn't exist"); - ensureValueRecorderIsCorrect( + ensureHistogramIsCorrect( metric3, core.hrTimeToNanoseconds(metrics[2].aggregator.toPoint().timestamp), [0, 100], diff --git a/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts similarity index 99% rename from packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts index 7ccf6a97f13..8988572b67c 100644 --- a/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts @@ -58,7 +58,6 @@ describe('OTLPTraceExporter - node with json over http', () => { // Need to stub/spy on the underlying logger as the "diag" instance is global const spyLoggerWarn = sinon.stub(diag, 'warn'); collectorExporter = new OTLPTraceExporter({ - serviceName: 'basic-service', metadata, url: address, } as any); diff --git a/packages/opentelemetry-exporter-otlp-http/test/node/nodeHelpers.ts b/experimental/packages/opentelemetry-exporter-otlp-http/test/node/nodeHelpers.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-http/test/node/nodeHelpers.ts rename to experimental/packages/opentelemetry-exporter-otlp-http/test/node/nodeHelpers.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json b/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json new file mode 100644 index 00000000000..7b09613481b --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.esm.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build/esm", + "tsBuildInfoFile": "build/esm/tsconfig.esm.tsbuildinfo" + }, + "include": [ + "src/**/*.ts" + ], + "references": [ + { + "path": "../opentelemetry-api-metrics/tsconfig.esm.json" + }, + { + "path": "../opentelemetry-sdk-metrics-base/tsconfig.esm.json" + } + ] +} diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.json b/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.json new file mode 100644 index 00000000000..3c062d3feb2 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "references": [ + { + "path": "../opentelemetry-api-metrics" + }, + { + "path": "../opentelemetry-sdk-metrics-base" + } + ] +} diff --git a/packages/opentelemetry-exporter-otlp-proto/.eslintignore b/experimental/packages/opentelemetry-exporter-otlp-proto/.eslintignore similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/.eslintignore rename to experimental/packages/opentelemetry-exporter-otlp-proto/.eslintignore diff --git a/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js b/experimental/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js similarity index 71% rename from packages/opentelemetry-exporter-otlp-proto/.eslintrc.js rename to experimental/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js index fc4d0381204..3ed0fbeba38 100644 --- a/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js +++ b/experimental/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js @@ -4,5 +4,5 @@ module.exports = { "commonjs": true, "node": true, }, - ...require('../../eslint.config.js') + ...require('../../../eslint.config.js') } diff --git a/packages/opentelemetry-exporter-otlp-proto/.npmignore b/experimental/packages/opentelemetry-exporter-otlp-proto/.npmignore similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/.npmignore rename to experimental/packages/opentelemetry-exporter-otlp-proto/.npmignore diff --git a/packages/opentelemetry-exporter-otlp-proto/LICENSE b/experimental/packages/opentelemetry-exporter-otlp-proto/LICENSE similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/LICENSE rename to experimental/packages/opentelemetry-exporter-otlp-proto/LICENSE diff --git a/packages/opentelemetry-exporter-otlp-proto/README.md b/experimental/packages/opentelemetry-exporter-otlp-proto/README.md similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/README.md rename to experimental/packages/opentelemetry-exporter-otlp-proto/README.md diff --git a/packages/opentelemetry-exporter-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-otlp-proto/package.json similarity index 85% rename from packages/opentelemetry-exporter-otlp-proto/package.json rename to experimental/packages/opentelemetry-exporter-otlp-proto/package.json index b890fd32d9b..a8f7ff5afa7 100644 --- a/packages/opentelemetry-exporter-otlp-proto/package.json +++ b/experimental/packages/opentelemetry-exporter-otlp-proto/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-otlp-proto", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector using protobuf over HTTP", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -15,7 +15,7 @@ "submodule": "git submodule sync --recursive && git submodule update --init --recursive", "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", - "version": "node ../../scripts/version-update.js", + "version": "node ../../../scripts/version-update.js", "watch": "npm run protos:copy && tsc -w", "precompile": "lerna run version --scope $(npm pkg get name) --include-filtered-dependencies", "prewatch": "npm run precompile" @@ -49,7 +49,7 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/api-metrics": "0.26.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -68,11 +68,11 @@ }, "dependencies": { "@grpc/proto-loader": "^0.6.4", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/exporter-otlp-http": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/exporter-otlp-http": "0.26.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/sdk-metrics-base": "0.26.0", + "@opentelemetry/sdk-trace-base": "1.0.0", "protobufjs": "^6.9.0" } } diff --git a/packages/opentelemetry-exporter-otlp-proto/protos b/experimental/packages/opentelemetry-exporter-otlp-proto/protos similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/protos rename to experimental/packages/opentelemetry-exporter-otlp-proto/protos diff --git a/packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/src/index.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/src/index.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/src/index.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/src/index.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/src/types.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/src/types.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/src/types.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/src/types.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/src/util.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/src/util.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/src/util.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/src/util.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/submodule.md b/experimental/packages/opentelemetry-exporter-otlp-proto/submodule.md similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/submodule.md rename to experimental/packages/opentelemetry-exporter-otlp-proto/submodule.md diff --git a/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts similarity index 90% rename from packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts index 17716f0887f..b623d2d8191 100644 --- a/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts @@ -17,8 +17,8 @@ import { diag } from '@opentelemetry/api'; import { Counter, - ValueObserver, - ValueRecorder, + ObservableGauge, + Histogram, } from '@opentelemetry/api-metrics'; import { ExportResultCode } from '@opentelemetry/core'; import { @@ -33,13 +33,13 @@ import { OTLPMetricExporter } from '../src'; import { getExportRequestProto } from '../src/util'; import { ensureExportedCounterIsCorrect, - ensureExportedObserverIsCorrect, - ensureExportedValueRecorderIsCorrect, + ensureExportedObservableGaugeIsCorrect, + ensureExportedHistogramIsCorrect, ensureExportMetricsServiceRequestIsSet, mockCounter, MockedResponse, - mockObserver, - mockValueRecorder, + mockObservableGauge, + mockHistogram, } from './helper'; const fakeRequest = { @@ -121,21 +121,21 @@ describe('OTLPMetricExporter - node with proto over http', () => { metrics = []; const counter: metrics.Metric & Counter = mockCounter(); - const observer: metrics.Metric & - ValueObserver = mockObserver(observerResult => { - observerResult.observe(3, {}); - observerResult.observe(6, {}); + const observableGauge: metrics.Metric & + ObservableGauge = mockObservableGauge(observableResult => { + observableResult.observe(3, {}); + observableResult.observe(6, {}); }); - const recorder: metrics.Metric & - ValueRecorder = mockValueRecorder(); + const histogram: metrics.Metric & + Histogram = mockHistogram(); counter.add(1); - recorder.record(7); - recorder.record(14); + histogram.record(7); + histogram.record(14); metrics.push((await counter.getMetricRecord())[0]); - metrics.push((await observer.getMetricRecord())[0]); - metrics.push((await recorder.getMetricRecord())[0]); + metrics.push((await observableGauge.getMetricRecord())[0]); + metrics.push((await histogram.getMetricRecord())[0]); }); afterEach(() => { sinon.restore(); @@ -197,8 +197,8 @@ describe('OTLPMetricExporter - node with proto over http', () => { metric1, metric1.intSum?.dataPoints[0].timeUnixNano ); - assert.ok(typeof metric2 !== 'undefined', "observer doesn't exist"); - ensureExportedObserverIsCorrect( + assert.ok(typeof metric2 !== 'undefined', "observable gauge doesn't exist"); + ensureExportedObservableGaugeIsCorrect( metric2, metric2.doubleGauge?.dataPoints[0].timeUnixNano ); @@ -206,7 +206,7 @@ describe('OTLPMetricExporter - node with proto over http', () => { typeof metric3 !== 'undefined', "value recorder doesn't exist" ); - ensureExportedValueRecorderIsCorrect( + ensureExportedHistogramIsCorrect( metric3, metric3.intHistogram?.dataPoints[0].timeUnixNano, [0, 100], diff --git a/packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/ca.crt rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.crt diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/ca.key rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.key diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/client.crt rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.crt diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.csr similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/client.csr rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.csr diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/client.key b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/client.key rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.key diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/regenerate.sh similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/regenerate.sh rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/regenerate.sh diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.crt similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/server.crt rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.crt diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.csr similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/server.csr rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.csr diff --git a/packages/opentelemetry-exporter-otlp-proto/test/certs/server.key b/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.key similarity index 100% rename from packages/opentelemetry-exporter-otlp-proto/test/certs/server.key rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.key diff --git a/packages/opentelemetry-exporter-otlp-proto/test/helper.ts b/experimental/packages/opentelemetry-exporter-otlp-proto/test/helper.ts similarity index 92% rename from packages/opentelemetry-exporter-otlp-proto/test/helper.ts rename to experimental/packages/opentelemetry-exporter-otlp-proto/test/helper.ts index f8b90b9feff..f76b8619b07 100644 --- a/packages/opentelemetry-exporter-otlp-proto/test/helper.ts +++ b/experimental/packages/opentelemetry-exporter-otlp-proto/test/helper.ts @@ -17,9 +17,9 @@ import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; import { Counter, - ObserverResult, - ValueObserver, - ValueRecorder, + ObservableResult, + ObservableGauge, + Histogram, ValueType, } from '@opentelemetry/api-metrics'; import { hexToBase64 } from '@opentelemetry/core'; @@ -54,16 +54,16 @@ export function mockCounter(): metrics.Metric & Counter { return metric; } -export function mockObserver( - callback: (observerResult: ObserverResult) => void -): metrics.Metric & ValueObserver { - const name = 'double-observer'; +export function mockObservableGauge( + callback: (observableResult: ObservableResult) => void +): metrics.Metric & ObservableGauge { + const name = 'double-observable-gauge'; const metric = meter['_metrics'].get(name) || - meter.createValueObserver( + meter.createObservableGauge( name, { - description: 'sample observer description', + description: 'sample observable gauge description', valueType: ValueType.DOUBLE, }, callback @@ -73,13 +73,13 @@ export function mockObserver( return metric; } -export function mockValueRecorder(): metrics.Metric & - ValueRecorder { - const name = 'int-recorder'; +export function mockHistogram(): metrics.Metric & + Histogram { + const name = 'int-histogram'; const metric = meter['_metrics'].get(name) || - meter.createValueRecorder(name, { - description: 'sample recorder description', + meter.createHistogram(name, { + description: 'sample histogram description', valueType: ValueType.INT, boundaries: [0, 100], }); @@ -316,13 +316,13 @@ export function ensureExportedCounterIsCorrect( }); } -export function ensureExportedObserverIsCorrect( +export function ensureExportedObservableGaugeIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time?: number ) { assert.deepStrictEqual(metric, { - name: 'double-observer', - description: 'sample observer description', + name: 'double-observable-gauge', + description: 'sample observable gauge description', unit: '1', doubleGauge: { dataPoints: [ @@ -336,15 +336,15 @@ export function ensureExportedObserverIsCorrect( }); } -export function ensureExportedValueRecorderIsCorrect( +export function ensureExportedHistogramIsCorrect( metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, time?: number, explicitBounds: number[] = [Infinity], bucketCounts: string[] = ['2', '0'] ) { assert.deepStrictEqual(metric, { - name: 'int-recorder', - description: 'sample recorder description', + name: 'int-histogram', + description: 'sample histogram description', unit: '1', intHistogram: { dataPoints: [ diff --git a/packages/opentelemetry-exporter-otlp-proto/tsconfig.json b/experimental/packages/opentelemetry-exporter-otlp-proto/tsconfig.json similarity index 57% rename from packages/opentelemetry-exporter-otlp-proto/tsconfig.json rename to experimental/packages/opentelemetry-exporter-otlp-proto/tsconfig.json index cfc7b73a484..caced6b4e8b 100644 --- a/packages/opentelemetry-exporter-otlp-proto/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-otlp-proto/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "rootDir": ".", "outDir": "build" @@ -10,16 +10,13 @@ ], "references": [ { - "path": "../opentelemetry-core" + "path": "../opentelemetry-api-metrics" }, { "path": "../opentelemetry-exporter-otlp-http" }, { - "path": "../opentelemetry-resources" - }, - { - "path": "../opentelemetry-sdk-trace-base" + "path": "../opentelemetry-sdk-metrics-base" } ] } diff --git a/experimental/packages/opentelemetry-exporter-prometheus/package.json b/experimental/packages/opentelemetry-exporter-prometheus/package.json index ec6fbb75711..a8af029d50e 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/package.json +++ b/experimental/packages/opentelemetry-exporter-prometheus/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-prometheus", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry Exporter Prometheus provides a metrics endpoint for Prometheus", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -57,8 +57,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0" + "@opentelemetry/api-metrics": "0.26.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/sdk-metrics-base": "0.26.0" } } diff --git a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts index e62ba0478ac..35473b14a3d 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts @@ -106,11 +106,11 @@ function toPrometheusType( case AggregatorKind.SUM: if ( metricKind === MetricKind.COUNTER || - metricKind === MetricKind.SUM_OBSERVER + metricKind === MetricKind.OBSERVABLE_COUNTER ) { return 'counter'; } - /** MetricKind.UP_DOWN_COUNTER and MetricKind.UP_DOWN_SUM_OBSERVER */ + /** MetricKind.UP_DOWN_COUNTER and MetricKind.OBSERVABLE_UP_DOWN_COUNTER */ return 'gauge'; case AggregatorKind.LAST_VALUE: return 'gauge'; diff --git a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts index 11d0090861e..3b5f044be3c 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusExporter.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ObserverResult } from '@opentelemetry/api-metrics'; +import { ObservableResult } from '@opentelemetry/api-metrics'; import { CounterMetric, SumAggregator, @@ -270,18 +270,18 @@ describe('PrometheusExporter', () => { }); }); - it('should export an observer aggregation', done => { + it('should export an observable gauge aggregation', done => { function getCpuUsage() { return 0.999; } - meter.createValueObserver( - 'metric_observer', + meter.createObservableGauge( + 'metric_observable_gauge', { description: 'a test description', }, - (observerResult: ObserverResult) => { - observerResult.observe(getCpuUsage(), { + (observableResult: ObservableResult) => { + observableResult.observe(getCpuUsage(), { pid: String(123), core: '1', }); @@ -298,9 +298,9 @@ describe('PrometheusExporter', () => { const lines = body.split('\n'); assert.deepStrictEqual(lines, [ - '# HELP metric_observer a test description', - '# TYPE metric_observer gauge', - `metric_observer{pid="123",core="1"} 0.999 ${mockedHrTimeMs}`, + '# HELP metric_observable_gauge a test description', + '# TYPE metric_observable_gauge gauge', + `metric_observable_gauge{pid="123",core="1"} 0.999 ${mockedHrTimeMs}`, '', ]); done(); @@ -472,18 +472,18 @@ describe('PrometheusExporter', () => { }); }); - it('should export a SumObserver as a counter', done => { + it('should export an ObservableCounter as a counter', done => { function getValue() { return 20; } - meter.createSumObserver( - 'sum_observer', + meter.createObservableCounter( + 'metric_observable_counter', { description: 'a test description', }, - (observerResult: ObserverResult) => { - observerResult.observe(getValue(), { + (observableResult: ObservableResult) => { + observableResult.observe(getValue(), { key1: 'labelValue1', }); } @@ -498,9 +498,9 @@ describe('PrometheusExporter', () => { const lines = body.split('\n'); assert.deepStrictEqual(lines, [ - '# HELP sum_observer a test description', - '# TYPE sum_observer gauge', - `sum_observer{key1="labelValue1"} 20 ${mockedHrTimeMs}`, + '# HELP metric_observable_counter a test description', + '# TYPE metric_observable_counter gauge', + `metric_observable_counter{key1="labelValue1"} 20 ${mockedHrTimeMs}`, '', ]); }); @@ -512,18 +512,18 @@ describe('PrometheusExporter', () => { }); }); - it('should export a UpDownSumObserver as a gauge', done => { + it('should export an ObservableUpDownCounter as a gauge', done => { function getValue() { return 20; } - meter.createUpDownSumObserver( - 'updown_observer', + meter.createObservableUpDownCounter( + 'metric_observable_up_down_counter', { description: 'a test description', }, - (observerResult: ObserverResult) => { - observerResult.observe(getValue(), { + (observableResult: ObservableResult) => { + observableResult.observe(getValue(), { key1: 'labelValue1', }); } @@ -538,9 +538,9 @@ describe('PrometheusExporter', () => { const lines = body.split('\n'); assert.deepStrictEqual(lines, [ - '# HELP updown_observer a test description', - '# TYPE updown_observer gauge', - `updown_observer{key1="labelValue1"} 20 ${mockedHrTimeMs}`, + '# 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}`, '', ]); }); @@ -552,12 +552,12 @@ describe('PrometheusExporter', () => { }); }); - it('should export a ValueRecorder as a summary', done => { - const valueRecorder = meter.createValueRecorder('value_recorder', { + it('should export a Histogram as a summary', done => { + const histogram = meter.createHistogram('test_histogram', { description: 'a test description', }); - valueRecorder.bind({ key1: 'labelValue1' }).record(20); + histogram.bind({ key1: 'labelValue1' }).record(20); meter.collect().then(() => { exporter.export(meter.getProcessor().checkPointSet(), () => { @@ -568,11 +568,11 @@ describe('PrometheusExporter', () => { const lines = body.split('\n'); assert.deepStrictEqual(lines, [ - '# HELP value_recorder a test description', - '# TYPE value_recorder histogram', - `value_recorder_count{key1="labelValue1"} 1 ${mockedHrTimeMs}`, - `value_recorder_sum{key1="labelValue1"} 20 ${mockedHrTimeMs}`, - `value_recorder_bucket{key1="labelValue1",le="+Inf"} 1 ${mockedHrTimeMs}`, + '# 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}`, '', ]); diff --git a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts index 4934ebb7889..7c3582f07bd 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts +++ b/experimental/packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts @@ -19,9 +19,9 @@ import { LastValueAggregator, MeterProvider, CounterMetric, - ValueRecorderMetric, + HistogramMetric, UpDownCounterMetric, - ValueObserverMetric, + ObservableGaugeMetric, } from '@opentelemetry/sdk-metrics-base'; import { diag, DiagLogLevel } from '@opentelemetry/api'; import * as assert from 'assert'; @@ -99,15 +99,15 @@ describe('PrometheusSerializer', () => { const meter = new MeterProvider({ processor: new ExactProcessor(LastValueAggregator), }).getMeter('test'); - const observer = meter.createValueObserver( + const observableGauge = meter.createObservableGauge( 'test', {}, - observerResult => { - observerResult.observe(1, labels); + observableResult => { + observableResult.observe(1, labels); } - ) as ValueObserverMetric; + ) as ObservableGaugeMetric; await meter.collect(); - const records = await observer.getMetricRecord(); + const records = await observableGauge.getMetricRecord(); const record = records[0]; const result = serializer.serializeRecord( @@ -126,15 +126,15 @@ describe('PrometheusSerializer', () => { const meter = new MeterProvider({ processor: new ExactProcessor(LastValueAggregator), }).getMeter('test'); - const observer = meter.createValueObserver( + const observableGauge = meter.createObservableGauge( 'test', {}, - observerResult => { - observerResult.observe(1, labels); + observableResult => { + observableResult.observe(1, labels); } - ) as ValueObserverMetric; + ) as ObservableGaugeMetric; await meter.collect(); - const records = await observer.getMetricRecord(); + const records = await observableGauge.getMetricRecord(); const record = records[0]; const result = serializer.serializeRecord( @@ -153,13 +153,13 @@ describe('PrometheusSerializer', () => { const processor = new ExactProcessor(HistogramAggregator, [1, 10, 100]); const meter = new MeterProvider({ processor }).getMeter('test'); - const recorder = meter.createValueRecorder('test', { + const histogram = meter.createHistogram('test', { description: 'foobar', - }) as ValueRecorderMetric; + }) as HistogramMetric; - recorder.bind(labels).record(5); + histogram.bind(labels).record(5); - const records = await recorder.getMetricRecord(); + const records = await histogram.getMetricRecord(); const record = records[0]; const result = serializer.serializeRecord( @@ -181,13 +181,13 @@ describe('PrometheusSerializer', () => { const serializer = new PrometheusSerializer(); const meter = new MeterProvider().getMeter('test'); - const recorder = meter.createValueRecorder('test', { + const histogram = meter.createHistogram('test', { description: 'foobar', boundaries: [1, 10, 100], - }) as ValueRecorderMetric; - recorder.bind(labels).record(5); + }) as HistogramMetric; + histogram.bind(labels).record(5); - const records = await recorder.getMetricRecord(); + const records = await histogram.getMetricRecord(); const record = records[0]; const result = serializer.serializeRecord( @@ -210,12 +210,12 @@ describe('PrometheusSerializer', () => { const processor = new ExactProcessor(HistogramAggregator, [1, 10, 100]); const meter = new MeterProvider({ processor }).getMeter('test'); - const recorder = meter.createValueRecorder('test', { + const histogram = meter.createHistogram('test', { description: 'foobar', - }) as ValueRecorderMetric; - recorder.bind(labels).record(5); + }) as HistogramMetric; + histogram.bind(labels).record(5); - const records = await recorder.getMetricRecord(); + const records = await histogram.getMetricRecord(); const record = records[0]; const result = serializer.serializeRecord( @@ -304,17 +304,17 @@ describe('PrometheusSerializer', () => { processor: new ExactProcessor(LastValueAggregator), }).getMeter('test'); const processor = new PrometheusLabelsBatcher(); - const observer = meter.createValueObserver( + const observableGauge = meter.createObservableGauge( 'test', { description: 'foobar', }, - observerResult => { - observerResult.observe(1, labels); + observableResult => { + observableResult.observe(1, labels); } - ) as ValueObserverMetric; + ) as ObservableGaugeMetric; await meter.collect(); - const records = await observer.getMetricRecord(); + const records = await observableGauge.getMetricRecord(); records.forEach(it => processor.process(it)); const checkPointSet = processor.checkPointSet(); @@ -336,16 +336,16 @@ describe('PrometheusSerializer', () => { const processor = new ExactProcessor(HistogramAggregator, [1, 10, 100]); const meter = new MeterProvider({ processor }).getMeter('test'); - const recorder = meter.createValueRecorder('test', { + const histogram = meter.createHistogram('test', { description: 'foobar', - }) as ValueRecorderMetric; - recorder.bind({ val: '1' }).record(5); - recorder.bind({ val: '1' }).record(50); - recorder.bind({ val: '1' }).record(120); + }) as HistogramMetric; + histogram.bind({ val: '1' }).record(5); + histogram.bind({ val: '1' }).record(50); + histogram.bind({ val: '1' }).record(120); - recorder.bind({ val: '2' }).record(5); + histogram.bind({ val: '2' }).record(5); - const records = await recorder.getMetricRecord(); + const records = await histogram.getMetricRecord(); const labelBatcher = new PrometheusLabelsBatcher(); records.forEach(it => labelBatcher.process(it)); const checkPointSet = labelBatcher.checkPointSet(); diff --git a/experimental/packages/opentelemetry-exporter-prometheus/tsconfig.json b/experimental/packages/opentelemetry-exporter-prometheus/tsconfig.json index 948abef3ceb..3c062d3feb2 100644 --- a/experimental/packages/opentelemetry-exporter-prometheus/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-prometheus/tsconfig.json @@ -11,6 +11,9 @@ "references": [ { "path": "../opentelemetry-api-metrics" + }, + { + "path": "../opentelemetry-sdk-metrics-base" } ] } diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/package.json b/experimental/packages/opentelemetry-instrumentation-fetch/package.json index 97a2f00eade..40b652afb5d 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/package.json +++ b/experimental/packages/opentelemetry-instrumentation-fetch/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-fetch", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry fetch automatic instrumentation package.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -50,9 +50,9 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.25.0", - "@opentelemetry/propagator-b3": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/context-zone": "1.0.0", + "@opentelemetry/propagator-b3": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -81,9 +81,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", - "@opentelemetry/sdk-trace-web": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/instrumentation": "0.26.0", + "@opentelemetry/sdk-trace-web": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts b/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts index 29d52b09430..a564b76f5a4 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts +++ b/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts @@ -331,6 +331,7 @@ export class FetchInstrumentation extends InstrumentationBase< ): void { try { const resClone = response.clone(); + const resClone4Hook = response.clone(); const body = resClone.body; if (body) { const reader = body.getReader(); @@ -338,7 +339,7 @@ export class FetchInstrumentation extends InstrumentationBase< reader.read().then( ({ done }) => { if (done) { - endSpanOnSuccess(span, response); + endSpanOnSuccess(span, resClone4Hook); } else { read(); } diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts b/experimental/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts index 1de5b795d0a..a38dbd8b67f 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts +++ b/experimental/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts @@ -683,6 +683,22 @@ describe('fetch', () => { prepare(url, applyCustomAttributes); }); + + it('get response body from callback arguments response', done => { + const applyCustomAttributes: FetchCustomAttributeFunction = async ( + span, + request, + response + ) => { + if(response instanceof Response ){ + const rsp = await response.json(); + assert.deepStrictEqual(rsp.args, {}); + done(); + } + }; + + prepare(url, applyCustomAttributes); + }); }); describe('when url is ignored', () => { diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/package.json b/experimental/packages/opentelemetry-instrumentation-grpc/package.json index f415b0db58b..158588b7fbc 100644 --- a/experimental/packages/opentelemetry-instrumentation-grpc/package.json +++ b/experimental/packages/opentelemetry-instrumentation-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-grpc", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry grpc automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -46,10 +46,10 @@ "@grpc/grpc-js": "1.3.7", "@grpc/proto-loader": "0.6.4", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/context-async-hooks": "1.0.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", + "@opentelemetry/sdk-trace-node": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/semver": "7.3.8", @@ -69,8 +69,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/api-metrics": "0.26.0", + "@opentelemetry/instrumentation": "0.26.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc-js/index.ts b/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc-js/index.ts index 0cf2114891e..ba4f46e3516 100644 --- a/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc-js/index.ts +++ b/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc-js/index.ts @@ -185,7 +185,7 @@ export class GrpcJsInstrumentation extends InstrumentationBase { kind: SpanKind.SERVER, }; - instrumentation._diag.debug('patch func: %s', JSON.stringify(spanOptions)); + instrumentation._diag.debug(`patch func: ${JSON.stringify(spanOptions)}`); context.with( propagation.extract(ROOT_CONTEXT, call.metadata, { diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc/index.ts b/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc/index.ts index 87486ef157f..18b649b95ca 100644 --- a/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc/index.ts +++ b/experimental/packages/opentelemetry-instrumentation-grpc/src/grpc/index.ts @@ -190,7 +190,7 @@ export class GrpcNativeInstrumentation extends InstrumentationBase< kind: SpanKind.SERVER, }; - instrumentation._diag.debug('patch func: %s', JSON.stringify(spanOptions)); + instrumentation._diag.debug(`patch func: ${JSON.stringify(spanOptions)}`); context.with( propagation.extract(context.active(), call.metadata, { diff --git a/experimental/packages/opentelemetry-instrumentation-grpc/test/helper.ts b/experimental/packages/opentelemetry-instrumentation-grpc/test/helper.ts index 559b9acf062..5a39f3fd68c 100644 --- a/experimental/packages/opentelemetry-instrumentation-grpc/test/helper.ts +++ b/experimental/packages/opentelemetry-instrumentation-grpc/test/helper.ts @@ -19,7 +19,7 @@ import { SpanKind, propagation, trace, } from '@opentelemetry/api'; -import { HttpTraceContextPropagator } from '@opentelemetry/core'; +import { W3CTraceContextPropagator } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; import { ContextManager } from '@opentelemetry/api'; @@ -386,7 +386,7 @@ export const runTests = ( let contextManager: ContextManager; before(() => { - propagation.setGlobalPropagator(new HttpTraceContextPropagator()); + propagation.setGlobalPropagator(new W3CTraceContextPropagator()); }); beforeEach(() => { diff --git a/experimental/packages/opentelemetry-instrumentation-http/README.md b/experimental/packages/opentelemetry-instrumentation-http/README.md index 139014304f3..6d5fb9a073b 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/README.md +++ b/experimental/packages/opentelemetry-instrumentation-http/README.md @@ -57,6 +57,7 @@ Http instrumentation has few options available to choose from. You can set the f | [`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` | ## Useful links diff --git a/experimental/packages/opentelemetry-instrumentation-http/package.json b/experimental/packages/opentelemetry-instrumentation-http/package.json index 4b2e4280671..41abcbab84b 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/package.json +++ b/experimental/packages/opentelemetry-instrumentation-http/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-http", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry http/https automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -44,9 +44,9 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/context-async-hooks": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", + "@opentelemetry/sdk-trace-node": "1.0.0", "@types/got": "9.6.12", "@types/mocha": "8.2.3", "@types/node": "14.17.11", @@ -72,9 +72,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/instrumentation": "0.26.0", + "@opentelemetry/semantic-conventions": "1.0.0", "semver": "^7.3.5" } } diff --git a/experimental/packages/opentelemetry-instrumentation-http/src/http.ts b/experimental/packages/opentelemetry-instrumentation-http/src/http.ts index 2229ae92c7e..6c889b40664 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/src/http.ts +++ b/experimental/packages/opentelemetry-instrumentation-http/src/http.ts @@ -58,6 +58,7 @@ export class HttpInstrumentation extends InstrumentationBase { /** keep track on spans not ended */ private readonly _spanNotEnded: WeakSet = new WeakSet(); private readonly _version = process.versions.node; + private _headerCapture; constructor(config: HttpInstrumentationConfig & InstrumentationConfig = {}) { super( @@ -65,6 +66,8 @@ export class HttpInstrumentation extends InstrumentationBase { VERSION, Object.assign({}, config) ); + + this._headerCapture = this._createHeaderCapture(); } private _getConfig(): HttpInstrumentationConfig { @@ -73,6 +76,7 @@ export class HttpInstrumentation extends InstrumentationBase { override setConfig(config: HttpInstrumentationConfig & InstrumentationConfig = {}): void { this._config = Object.assign({}, config); + this._headerCapture = this._createHeaderCapture(); } init(): [InstrumentationNodeModuleDefinition, InstrumentationNodeModuleDefinition] { @@ -296,6 +300,9 @@ export class HttpInstrumentation extends InstrumentationBase { this._callResponseHook(span, response); } + this._headerCapture.client.captureRequestHeaders(span, header => request.getHeader(header)); + this._headerCapture.client.captureResponseHeaders(span, header => response.headers[header]); + context.bind(context.active(), response); this._diag.debug('outgoingRequest on response()'); response.on('end', () => { @@ -370,7 +377,7 @@ export class HttpInstrumentation extends InstrumentationBase { : '/'; const method = request.method || 'GET'; - instrumentation._diag.debug('%s instrumentation incomingRequest', component); + instrumentation._diag.debug(`${component} instrumentation incomingRequest`); if ( utils.isIgnored( @@ -424,6 +431,8 @@ export class HttpInstrumentation extends InstrumentationBase { instrumentation._callResponseHook(span, response); } + instrumentation._headerCapture.server.captureRequestHeaders(span, header => request.headers[header]); + // Wraps end (inspired by: // https://github.com/GoogleCloudPlatform/cloud-trace-nodejs/blob/master/src/instrumentations/instrumentation-connect.ts#L75) const originalEnd = response.end; @@ -449,6 +458,8 @@ export class HttpInstrumentation extends InstrumentationBase { response ); + instrumentation._headerCapture.server.captureResponseHeaders(span, header => response.getHeader(header)); + span .setAttributes(attributes) .setStatus(utils.parseResponseStatus(response.statusCode)); @@ -580,7 +591,7 @@ export class HttpInstrumentation extends InstrumentationBase { } ); - instrumentation._diag.debug('%s instrumentation outgoingRequest', component); + instrumentation._diag.debug(`${component} instrumentation outgoingRequest`); context.bind(parentContext, request); return instrumentation._traceClientRequest( request, @@ -662,4 +673,19 @@ export class HttpInstrumentation extends InstrumentationBase { ); } } + + private _createHeaderCapture() { + const config = this._getConfig(); + + return { + client: { + captureRequestHeaders: utils.headerCapture('request', config.headersToSpanAttributes?.client?.requestHeaders ?? []), + captureResponseHeaders: utils.headerCapture('response', config.headersToSpanAttributes?.client?.responseHeaders ?? []) + }, + server: { + captureRequestHeaders: utils.headerCapture('request', config.headersToSpanAttributes?.server?.requestHeaders ?? []), + captureResponseHeaders: utils.headerCapture('response', config.headersToSpanAttributes?.server?.responseHeaders ?? []), + } + } + } } diff --git a/experimental/packages/opentelemetry-instrumentation-http/src/types.ts b/experimental/packages/opentelemetry-instrumentation-http/src/types.ts index 7be9999d8b6..79f4e844cd2 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/src/types.ts +++ b/experimental/packages/opentelemetry-instrumentation-http/src/types.ts @@ -103,6 +103,11 @@ export interface HttpInstrumentationConfig extends InstrumentationConfig { requireParentforOutgoingSpans?: boolean; /** Require parent to create span for incoming requests */ requireParentforIncomingSpans?: boolean; + /** Map the following HTTP headers to span attributes. */ + headersToSpanAttributes?: { + client?: { requestHeaders?: string[]; responseHeaders?: string[]; }, + server?: { requestHeaders?: string[]; responseHeaders?: string[]; }, + } } export interface Err extends Error { diff --git a/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts b/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts index a24ff6f12a9..4f8a03c7af8 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts +++ b/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts @@ -453,7 +453,6 @@ export const getIncomingRequestAttributes = ( } if (requestUrl) { - attributes[SemanticAttributes.HTTP_ROUTE] = requestUrl.pathname || '/'; attributes[SemanticAttributes.HTTP_TARGET] = requestUrl.pathname || '/'; } @@ -495,3 +494,27 @@ export const getIncomingRequestAttributesOnResponse = ( } return attributes; }; + +export function headerCapture(type: 'request' | 'response', headers: string[]) { + const normalizedHeaders = new Map(headers.map(header => [header.toLowerCase(), header.toLowerCase().replace(/-/g, '_')])); + + return (span: Span, getHeader: (key: string) => undefined | string | string[] | number) => { + for (const [capturedHeader, normalizedHeader] of normalizedHeaders) { + const value = getHeader(capturedHeader); + + if (value === undefined) { + continue; + } + + const key = `http.${type}.header.${normalizedHeader}`; + + if (typeof value === 'string') { + span.setAttribute(key, [value]); + } else if (Array.isArray(value)) { + span.setAttribute(key, value); + } else { + span.setAttribute(key, [value]); + } + } + }; +} diff --git a/experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts b/experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts index 9f62d807b1c..7658bfa65b9 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts +++ b/experimental/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts @@ -908,4 +908,87 @@ describe('HttpInstrumentation', () => { }); }); }); + + describe('capturing headers as span attributes', () => { + beforeEach(() => { + memoryExporter.reset(); + }); + + before(() => { + instrumentation.setConfig({ + headersToSpanAttributes: { + client: { requestHeaders: ['X-Client-Header1'], responseHeaders: ['X-Server-Header1'] }, + server: { requestHeaders: ['X-Client-Header2'], responseHeaders: ['X-Server-Header2'] }, + } + }); + instrumentation.enable(); + server = http.createServer((request, response) => { + response.setHeader('X-ServeR-header1', 'server123'); + response.setHeader('X-Server-header2', '123server'); + response.end('Test Server Response'); + }); + + server.listen(serverPort); + }); + + after(() => { + server.close(); + instrumentation.disable(); + }); + + it('should convert headers to span attributes', async () => { + await httpRequest.get( + `${protocol}://${hostname}:${serverPort}${pathname}`, + { + headers: { + 'X-client-header1': 'client123', + 'X-CLIENT-HEADER2': '123client', + } + } + ); + const spans = memoryExporter.getFinishedSpans(); + const [incomingSpan, outgoingSpan] = spans; + + assert.strictEqual(spans.length, 2); + + assert.deepStrictEqual( + incomingSpan.attributes['http.request.header.x_client_header2'], + ['123client'] + ); + + assert.deepStrictEqual( + incomingSpan.attributes['http.response.header.x_server_header2'], + ['123server'] + ); + + assert.strictEqual( + incomingSpan.attributes['http.request.header.x_client_header1'], + undefined + ); + + assert.strictEqual( + incomingSpan.attributes['http.response.header.x_server_header1'], + undefined + ); + + assert.deepStrictEqual( + outgoingSpan.attributes['http.request.header.x_client_header1'], + ['client123'] + ); + assert.deepStrictEqual( + outgoingSpan.attributes['http.response.header.x_server_header1'], + ['server123'] + ); + + assert.strictEqual( + outgoingSpan.attributes['http.request.header.x_client_header2'], + undefined + ); + + assert.strictEqual( + outgoingSpan.attributes['http.response.header.x_server_header2'], + undefined + ); + }); + }); }); diff --git a/experimental/packages/opentelemetry-instrumentation-http/test/functionals/utils.test.ts b/experimental/packages/opentelemetry-instrumentation-http/test/functionals/utils.test.ts index d530fac61ca..7b8a2e8d1ef 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/test/functionals/utils.test.ts +++ b/experimental/packages/opentelemetry-instrumentation-http/test/functionals/utils.test.ts @@ -465,4 +465,80 @@ describe('Utility', () => { verifyValueInAttributes(attributes, undefined, 1200); }); }); + + describe('getIncomingRequestAttributes()', () => { + it('should not set http.route in http span attributes', () => { + const request = { + url: 'http://hostname/user/:id', + method: 'GET' + } as IncomingMessage; + request.headers = { + 'user-agent': 'chrome', + 'x-forwarded-for': ', , ' + } + const attributes = utils.getIncomingRequestAttributes(request, { component: 'http'}) + assert.strictEqual(attributes[SemanticAttributes.HTTP_ROUTE], undefined) + }); + }); + + describe('headers to span attributes capture', () => { + let span: Span; + + beforeEach(() => { + span = new Span( + new BasicTracerProvider().getTracer('default'), + ROOT_CONTEXT, + 'test', + { spanId: '', traceId: '', traceFlags: TraceFlags.SAMPLED }, + SpanKind.INTERNAL + ); + }); + + it('should set attributes for request and response keys', () => { + utils.headerCapture('request', ['Origin'])(span, () => 'localhost'); + utils.headerCapture('response', ['Cookie'])(span, () => 'token=123'); + assert.deepStrictEqual(span.attributes['http.request.header.origin'], ['localhost']); + assert.deepStrictEqual(span.attributes['http.response.header.cookie'], ['token=123']); + }); + + it('should set attributes for multiple values', () => { + utils.headerCapture('request', ['Origin'])(span, () => ['localhost', 'www.example.com']); + assert.deepStrictEqual(span.attributes['http.request.header.origin'], ['localhost', 'www.example.com']); + }); + + it('sets attributes for multiple headers', () => { + utils.headerCapture('request', ['Origin', 'Foo'])(span, header => { + if (header === 'origin') { + return 'localhost'; + } + + if (header === 'foo') { + return 42; + } + + return undefined; + }); + + assert.deepStrictEqual(span.attributes['http.request.header.origin'], ['localhost']); + assert.deepStrictEqual(span.attributes['http.request.header.foo'], [42]); + }); + + it('should normalize header names', () => { + utils.headerCapture('request', ['X-Forwarded-For'])(span, () => 'foo'); + assert.deepStrictEqual(span.attributes['http.request.header.x_forwarded_for'], ['foo']); + }); + + it('ignores non-existent headers', () => { + utils.headerCapture('request', ['Origin', 'Accept'])(span, header => { + if (header === 'origin') { + return 'localhost'; + } + + return undefined; + }); + + assert.deepStrictEqual(span.attributes['http.request.header.origin'], ['localhost']); + assert.deepStrictEqual(span.attributes['http.request.header.accept'], undefined); + }) + }); }); diff --git a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json index 29fdfbb9f63..66d3c85f331 100644 --- a/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json +++ b/experimental/packages/opentelemetry-instrumentation-xml-http-request/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-xml-http-request", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry XMLHttpRequest automatic instrumentation package.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -50,9 +50,9 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.25.0", - "@opentelemetry/propagator-b3": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/context-zone": "1.0.0", + "@opentelemetry/propagator-b3": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -81,9 +81,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", - "@opentelemetry/sdk-trace-web": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/instrumentation": "0.26.0", + "@opentelemetry/sdk-trace-web": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/experimental/packages/opentelemetry-instrumentation/package.json b/experimental/packages/opentelemetry-instrumentation/package.json index a4b21cc46f1..7204d0e3911 100644 --- a/experimental/packages/opentelemetry-instrumentation/package.json +++ b/experimental/packages/opentelemetry-instrumentation/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation", - "version": "0.25.0", + "version": "0.26.0", "description": "Base class for node which OpenTelemetry instrumentation modules extend", "author": "OpenTelemetry Authors", "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", @@ -61,7 +61,7 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/api-metrics": "0.26.0", "require-in-the-middle": "^5.0.3", "semver": "^7.3.2", "shimmer": "^1.2.1" diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/README.md b/experimental/packages/opentelemetry-sdk-metrics-base/README.md index 1761164b0f5..b760ecc3369 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/README.md +++ b/experimental/packages/opentelemetry-sdk-metrics-base/README.md @@ -73,7 +73,7 @@ boundCounter.add(Math.random() > 0.5 ? 1 : -1); ``` -### Value Observer +### Observable Gauge Choose this kind of metric when only last value is important without worry about aggregation. The callback can be sync or async. @@ -85,11 +85,11 @@ const meter = new MeterProvider().getMeter('your-meter-name'); // async callback - for operation that needs to wait for value -meter.createValueObserver('your_metric_name', { - description: 'Example of an async observer with callback', -}, async (observerResult) => { +meter.createObservableGauge('your_metric_name', { + description: 'Example of an async observable gauge with callback', +}, async (observableResult) => { const value = await getAsyncValue(); - observerResult.observe(value, { label: '1' }); + observableResult.observe(value, { label: '1' }); }); function getAsyncValue() { @@ -101,11 +101,11 @@ function getAsyncValue() { } // sync callback in case you don't need to wait for value -meter.createValueObserver('your_metric_name', { - description: 'Example of a sync observer with callback', -}, (observerResult) => { - observerResult.observe(getRandomValue(), { label: '1' }); - observerResult.observe(getRandomValue(), { label: '2' }); +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' }); }); function getRandomValue() { @@ -113,7 +113,7 @@ function getRandomValue() { } ``` -### UpDownSumObserver +### ObservableUpDownCounter Choose this kind of metric when sum is important and you want to capture any value that starts at zero and rises or falls throughout the process lifetime. The callback can be sync or async. @@ -124,11 +124,11 @@ const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); const meter = new MeterProvider().getMeter('your-meter-name'); // async callback - for operation that needs to wait for value -meter.createUpDownSumObserver('your_metric_name', { - description: 'Example of an async observer with callback', -}, async (observerResult) => { +meter.createObservableUpDownCounter('your_metric_name', { + description: 'Example of an async observable up down counter with callback', +}, async (observableResult) => { const value = await getAsyncValue(); - observerResult.observe(value, { label: '1' }); + observableResult.observe(value, { label: '1' }); }); function getAsyncValue() { @@ -140,10 +140,10 @@ function getAsyncValue() { } // sync callback in case you don't need to wait for value -meter.createUpDownSumObserver('your_metric_name', { - description: 'Example of a sync observer with callback', -}, (observerResult) => { - observerResult.observe(getRandomValue(), { label: '1' }); +meter.createObservableUpDownCounter('your_metric_name', { + description: 'Example of a sync observable up down counter with callback', +}, (observableResult) => { + observableResult.observe(getRandomValue(), { label: '1' }); }); function getRandomValue() { @@ -152,7 +152,7 @@ function getRandomValue() { ``` -### Sum Observer +### Observable Counter Choose this kind of metric when collecting a sum that never decreases. The callback can be sync or async. @@ -163,11 +163,11 @@ const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); const meter = new MeterProvider().getMeter('your-meter-name'); // async callback in case you need to wait for values -meter.createSumObserver('example_metric', { - description: 'Example of an async sum observer with callback', -}, async (observerResult) => { +meter.createObservableCounter('example_metric', { + description: 'Example of an async observable counter with callback', +}, async (observableResult) => { const value = await getAsyncValue(); - observerResult.observe(value, { label: '1' }); + observableResult.observe(value, { label: '1' }); }); function getAsyncValue() { @@ -179,11 +179,11 @@ function getAsyncValue() { } // sync callback in case you don't need to wait for values -meter.createSumObserver('example_metric', { - description: 'Example of a sync sum observer with callback', -}, (observerResult) => { +meter.createObservableCounter('example_metric', { + description: 'Example of a sync observable counter with callback', +}, (observableResult) => { const value = getRandomValue(); - observerResult.observe(value, { label: '1' }); + observableResult.observe(value, { label: '1' }); }); function getRandomValue() { @@ -193,7 +193,7 @@ function getRandomValue() { ### Batch Observer -Choose this kind of metric when you need to update multiple observers with the results of a single async calculation. +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'); @@ -213,17 +213,17 @@ const meter = new MeterProvider({ interval: 3000, }).getMeter('example-observer'); -const cpuUsageMetric = meter.createValueObserver('cpu_usage_per_app', { +const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { description: 'CPU', }); -const MemUsageMetric = meter.createValueObserver('mem_usage_per_app', { +const MemUsageMetric = meter.createObservableGauge('mem_usage_per_app', { description: 'Memory', }); -meter.createBatchObserver((observerBatchResult) => { +meter.createBatchObserver((batchObserverResult) => { getSomeAsyncMetrics().then(metrics => { - observerBatchResult.observe({ app: 'myApp' }, [ + batchObserverResult.observe({ app: 'myApp' }, [ cpuUsageMetric.observation(metrics.value1), MemUsageMetric.observation(metrics.value2) ]); @@ -245,11 +245,11 @@ function getSomeAsyncMetrics() { See [examples/prometheus](https://github.com/open-telemetry/opentelemetry-js/tree/main/examples/prometheus) for a short example. -### Value Recorder +### Histogram -`ValueRecorder` is a non-additive synchronous instrument useful for recording any non-additive number, positive or negative. -Values captured by `ValueRecorder.record(value)` are treated as individual events belonging to a distribution that is being summarized. -`ValueRecorder` should be chosen either when capturing measurements that do not contribute meaningfully to a sum, or when capturing numbers that are additive in nature, but where the distribution of individual increments is considered interesting. +`Histogram` is a non-additive synchronous instrument useful for recording any non-additive number, positive or negative. +Values captured by `Histogram.record(value)` are treated as individual events belonging to a distribution that is being summarized. +`Histogram` should be chosen either when capturing measurements that do not contribute meaningfully to a sum, or when capturing numbers that are additive in nature, but where the distribution of individual increments is considered interesting. ## Useful links diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/package.json b/experimental/packages/opentelemetry-sdk-metrics-base/package.json index 773ff1e9f3c..862e167d1d7 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/package.json +++ b/experimental/packages/opentelemetry-sdk-metrics-base/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-metrics-base", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry metrics SDK", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -63,9 +63,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", + "@opentelemetry/api-metrics": "0.26.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/resources": "1.0.0", "lodash.merge": "^4.6.2" } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts index 90c53844658..576102cb46c 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserver.ts @@ -23,12 +23,12 @@ const MAX_TIMEOUT_UPDATE_MS = 500; /** This is a SDK implementation of Batch Observer. */ export class BatchObserver { - private _callback: (observerResult: api.BatchObserverResult) => void; + private _callback: (observableResult: api.BatchObserverResult) => void; private _maxTimeoutUpdateMS: number; constructor( options: api.BatchObserverOptions, - callback?: (observerResult: api.BatchObserverResult) => void + callback?: (observableResult: api.BatchObserverResult) => void ) { this._maxTimeoutUpdateMS = options.maxTimeoutUpdateMS ?? MAX_TIMEOUT_UPDATE_MS; @@ -38,27 +38,27 @@ export class BatchObserver { collect(): Promise { diag.debug('getMetricRecord - start'); return new Promise(resolve => { - const observerResult = new BatchObserverResult(); + const batchObserverResult = new BatchObserverResult(); // cancels after MAX_TIMEOUT_MS - no more waiting for results const timer = setTimeout(() => { - observerResult.cancelled = true; + batchObserverResult.cancelled = true; // remove callback to prevent user from updating the values later if - // for any reason the observerBatchResult will be referenced - observerResult.onObserveCalled(); + // for any reason the batchObserverResult will be referenced + batchObserverResult.onObserveCalled(); resolve(); diag.debug('getMetricRecord - timeout'); }, this._maxTimeoutUpdateMS); // sets callback for each "observe" method - observerResult.onObserveCalled(() => { + batchObserverResult.onObserveCalled(() => { clearTimeout(timer); resolve(); diag.debug('getMetricRecord - end'); }); // calls the BatchObserverResult callback - this._callback(observerResult); + 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 index 4e2c0c8b281..f882774ad0b 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts @@ -44,14 +44,14 @@ export class BatchObserverResult implements api.BatchObserverResult { return; } observations.forEach(observation => { - observation.observer.bind(labels).update(observation.value); + observation.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 observerBatchResult will be referenced and then try to use + // the batchObserverResult will be referenced and then try to use this._callback = undefined; } }); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts index 296bf72909e..67a66b204c9 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/BoundInstrument.ts @@ -117,9 +117,9 @@ export class BoundUpDownCounter /** * BoundMeasure is an implementation of the {@link BoundMeasure} interface. */ -export class BoundValueRecorder +export class BoundHistogram extends BaseBoundInstrument - implements api.BoundValueRecorder { + implements api.BoundHistogram { constructor( labels: api.Labels, disabled: boolean, @@ -135,11 +135,11 @@ export class BoundValueRecorder } /** - * BoundObserver is an implementation of the {@link BoundObserver} interface. + * BoundObservable is an implementation of the {@link BoundObservable} interface. */ -export class BoundObserver +export class BoundObservable extends BaseBoundInstrument - implements api.BoundBaseObserver { + implements api.BoundObservableBase { constructor( labels: api.Labels, disabled: boolean, diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts similarity index 79% rename from experimental/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts rename to experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts index 28e9d7e1b2c..20a7ade3a77 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/HistogramMetric.ts @@ -17,15 +17,15 @@ import * as api from '@opentelemetry/api-metrics'; import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { BoundValueRecorder } from './BoundInstrument'; +import { BoundHistogram } from './BoundInstrument'; import { Processor } from './export/Processor'; import { MetricKind } from './export/types'; import { Metric } from './Metric'; -/** This is a SDK implementation of Value Recorder Metric. */ -export class ValueRecorderMetric - extends Metric - implements api.ValueRecorder { +/** This is a SDK implementation of Histogram Metric. */ +export class HistogramMetric + extends Metric + implements api.Histogram { constructor( name: string, options: api.MetricOptions, @@ -36,14 +36,14 @@ export class ValueRecorderMetric super( name, options, - MetricKind.VALUE_RECORDER, + MetricKind.HISTOGRAM, resource, instrumentationLibrary ); } - protected _makeInstrument(labels: api.Labels): BoundValueRecorder { - return new BoundValueRecorder( + protected _makeInstrument(labels: api.Labels): BoundHistogram { + return new BoundHistogram( labels, this._disabled, this._valueType, diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts index 32f295694c6..143d50692a1 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/Meter.ts @@ -25,14 +25,16 @@ import { PushController } from './export/Controller'; import { NoopExporter } from './export/NoopExporter'; import { Processor, UngroupedProcessor } from './export/Processor'; import { Metric } from './Metric'; -import { SumObserverMetric } from './SumObserverMetric'; +import { ObservableCounterMetric } from './ObservableCounterMetric'; import { DEFAULT_CONFIG, DEFAULT_METRIC_OPTIONS, MeterConfig } from './types'; import { UpDownCounterMetric } from './UpDownCounterMetric'; -import { UpDownSumObserverMetric } from './UpDownSumObserverMetric'; -import { ValueObserverMetric } from './ValueObserverMetric'; -import { ValueRecorderMetric } from './ValueRecorderMetric'; +import { ObservableUpDownCounterMetric } from './ObservableUpDownCounterMetric'; +import { ObservableGaugeMetric } from './ObservableGaugeMetric'; +import { HistogramMetric } from './HistogramMetric'; // eslint-disable-next-line @typescript-eslint/no-var-requires const merge = require('lodash.merge'); +// @TODO - replace once the core is released +// import { merge } from '@opentelemetry/core'; /** * Meter is an implementation of the {@link Meter} interface. @@ -66,34 +68,34 @@ export class Meter implements api.Meter { } /** - * Creates and returns a new {@link ValueRecorder}. + * Creates and returns a new {@link Histogram}. * @param name the name of the metric. * @param [options] the metric options. */ - createValueRecorder( + createHistogram( name: string, options?: api.MetricOptions - ): api.ValueRecorder { + ): api.Histogram { if (!this._isValidName(name)) { diag.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return api.NOOP_VALUE_RECORDER_METRIC; + return api.NOOP_HISTOGRAM_METRIC; } const opt: api.MetricOptions = { ...DEFAULT_METRIC_OPTIONS, ...options, }; - const valueRecorder = new ValueRecorderMetric( + const histogram = new HistogramMetric( name, opt, this._processor, this._resource, this._instrumentationLibrary ); - this._registerMetric(name, valueRecorder); - return valueRecorder; + this._registerMetric(name, histogram); + return histogram; } /** @@ -161,27 +163,27 @@ export class Meter implements api.Meter { } /** - * Creates a new `ValueObserver` metric. + * Creates a new `ObservableGauge` metric. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the value observer callback + * @param [callback] the observable gauge callback */ - createValueObserver( + createObservableGauge( name: string, options: api.MetricOptions = {}, - callback?: (observerResult: api.ObserverResult) => unknown - ): api.ValueObserver { + callback?: (observableResult: api.ObservableResult) => unknown + ): api.ObservableGauge { if (!this._isValidName(name)) { diag.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return api.NOOP_VALUE_OBSERVER_METRIC; + return api.NOOP_OBSERVABLE_GAUGE_METRIC; } const opt: api.MetricOptions = { ...DEFAULT_METRIC_OPTIONS, ...options, }; - const valueObserver = new ValueObserverMetric( + const observableGauge = new ObservableGaugeMetric( name, opt, this._processor, @@ -189,26 +191,26 @@ export class Meter implements api.Meter { this._instrumentationLibrary, callback ); - this._registerMetric(name, valueObserver); - return valueObserver; + this._registerMetric(name, observableGauge); + return observableGauge; } - createSumObserver( + createObservableCounter( name: string, options: api.MetricOptions = {}, - callback?: (observerResult: api.ObserverResult) => unknown - ): api.SumObserver { + callback?: (observableResult: api.ObservableResult) => unknown + ): api.ObservableCounter { if (!this._isValidName(name)) { diag.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return api.NOOP_SUM_OBSERVER_METRIC; + return api.NOOP_OBSERVABLE_COUNTER_METRIC; } const opt: api.MetricOptions = { ...DEFAULT_METRIC_OPTIONS, ...options, }; - const sumObserver = new SumObserverMetric( + const observableCounter = new ObservableCounterMetric( name, opt, this._processor, @@ -216,32 +218,32 @@ export class Meter implements api.Meter { this._instrumentationLibrary, callback ); - this._registerMetric(name, sumObserver); - return sumObserver; + this._registerMetric(name, observableCounter); + return observableCounter; } /** - * Creates a new `UpDownSumObserver` metric. + * Creates a new `ObservableUpDownCounter` metric. * @param name the name of the metric. * @param [options] the metric options. - * @param [callback] the value observer callback + * @param [callback] the observable gauge callback */ - createUpDownSumObserver( + createObservableUpDownCounter( name: string, options: api.MetricOptions = {}, - callback?: (observerResult: api.ObserverResult) => unknown - ): api.UpDownSumObserver { + callback?: (observableResult: api.ObservableResult) => unknown + ): api.ObservableUpDownCounter { if (!this._isValidName(name)) { diag.warn( `Invalid metric name ${name}. Defaulting to noop metric implementation.` ); - return api.NOOP_UP_DOWN_SUM_OBSERVER_METRIC; + return api.NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC; } const opt: api.MetricOptions = { ...DEFAULT_METRIC_OPTIONS, ...options, }; - const upDownSumObserver = new UpDownSumObserverMetric( + const observableUpDownCounter = new ObservableUpDownCounterMetric( name, opt, this._processor, @@ -249,8 +251,8 @@ export class Meter implements api.Meter { this._instrumentationLibrary, callback ); - this._registerMetric(name, upDownSumObserver); - return upDownSumObserver; + this._registerMetric(name, observableUpDownCounter); + return observableUpDownCounter; } /** @@ -259,7 +261,7 @@ export class Meter implements api.Meter { * @param [options] the batch options. */ createBatchObserver( - callback: (observerResult: api.BatchObserverResult) => void, + callback: (observableResult: api.BatchObserverResult) => void, options: api.BatchObserverOptions = {} ): BatchObserver { const opt: api.BatchObserverOptions = { @@ -350,6 +352,6 @@ export class Meter implements api.Meter { * @param name Name of metric to be created */ private _isValidName(name: string): boolean { - return Boolean(name.match(/^[a-z][a-z0-9_.-]*$/i)); + return Boolean(name.match(/^[a-z][a-z0-9_.-]{0,62}$/i)); } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts index 226ff63aa64..c7edefd0d7f 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts @@ -20,6 +20,9 @@ import { Meter } from '.'; import { DEFAULT_CONFIG, MeterConfig } from './types'; // eslint-disable-next-line @typescript-eslint/no-var-requires const merge = require('lodash.merge'); +// @TODO - replace once the core is released +// import { merge } from '@opentelemetry/core'; + /** * This class represents a meter provider which platform libraries can extend diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts similarity index 68% rename from experimental/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts rename to experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts index 6f48df49bf0..60626680a57 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableBaseMetric.ts @@ -17,22 +17,22 @@ import * as api from '@opentelemetry/api-metrics'; import { Observation } from '@opentelemetry/api-metrics'; import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { BoundObserver } from './BoundInstrument'; +import { BoundObservable } from './BoundInstrument'; import { Processor } from './export/Processor'; import { MetricKind, MetricRecord } from './export/types'; import { Metric } from './Metric'; -import { ObserverResult } from './ObserverResult'; +import { ObservableResult } from './ObservableResult'; const NOOP_CALLBACK = () => {}; /** * This is a SDK implementation of Base Observer Metric. - * All observers should extend this class + * All observables should extend this class */ -export abstract class BaseObserverMetric - extends Metric - implements api.BaseObserver { - protected _callback: (observerResult: api.ObserverResult) => unknown; +export abstract class ObservableBaseMetric + extends Metric + implements api.ObservableBase { + protected _callback: (observableResult: api.ObservableResult) => unknown; constructor( name: string, @@ -41,14 +41,14 @@ export abstract class BaseObserverMetric resource: Resource, metricKind: MetricKind, instrumentationLibrary: InstrumentationLibrary, - callback?: (observerResult: api.ObserverResult) => unknown + callback?: (observableResult: api.ObservableResult) => unknown ) { super(name, options, metricKind, resource, instrumentationLibrary); this._callback = callback || NOOP_CALLBACK; } - protected _makeInstrument(labels: api.Labels): BoundObserver { - return new BoundObserver( + protected _makeInstrument(labels: api.Labels): BoundObservable { + return new BoundObservable( labels, this._disabled, this._valueType, @@ -57,16 +57,16 @@ export abstract class BaseObserverMetric } override async getMetricRecord(): Promise { - const observerResult = new ObserverResult(); - await this._callback(observerResult); + const observableResult = new ObservableResult(); + await this._callback(observableResult); - this._processResults(observerResult); + this._processResults(observableResult); return super.getMetricRecord(); } - protected _processResults(observerResult: ObserverResult): void { - observerResult.values.forEach((value, labels) => { + protected _processResults(observableResult: ObservableResult): void { + observableResult.values.forEach((value, labels) => { const instrument = this.bind(labels); instrument.update(value); }); @@ -75,7 +75,7 @@ export abstract class BaseObserverMetric observation(value: number): Observation { return { value, - observer: this as BaseObserverMetric, + observable: this as ObservableBaseMetric, }; } } diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts similarity index 72% rename from experimental/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts rename to experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts index 8f58727cebd..5465f14eff8 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableCounterMetric.ts @@ -17,38 +17,38 @@ import * as api from '@opentelemetry/api-metrics'; import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { BaseObserverMetric } from './BaseObserverMetric'; +import { ObservableBaseMetric } from './ObservableBaseMetric'; import { Processor } from './export/Processor'; import { LastValue, MetricKind } from './export/types'; -import { ObserverResult } from './ObserverResult'; +import { ObservableResult } from './ObservableResult'; -/** This is a SDK implementation of SumObserver Metric. */ -export class SumObserverMetric - extends BaseObserverMetric - implements api.SumObserver { +/** This is a SDK implementation of ObservableCounter Metric. */ +export class ObservableCounterMetric + extends ObservableBaseMetric + implements api.ObservableCounter { constructor( name: string, options: api.MetricOptions, processor: Processor, resource: Resource, instrumentationLibrary: InstrumentationLibrary, - callback?: (observerResult: api.ObserverResult) => unknown + callback?: (observableResult: api.ObservableResult) => unknown ) { super( name, options, processor, resource, - MetricKind.SUM_OBSERVER, + MetricKind.OBSERVABLE_COUNTER, instrumentationLibrary, callback ); } - protected override _processResults(observerResult: ObserverResult): void { - observerResult.values.forEach((value, labels) => { + protected override _processResults(observableResult: ObservableResult): void { + observableResult.values.forEach((value, labels) => { const instrument = this.bind(labels); - // SumObserver is monotonic which means it should only accept values + // ObservableCounter is monotonic which means it should only accept values // greater or equal then previous value const previous = instrument.getAggregator().toPoint(); let previousValue = -Infinity; diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/ValueObserverMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableGaugeMetric.ts similarity index 78% rename from experimental/packages/opentelemetry-sdk-metrics-base/src/ValueObserverMetric.ts rename to experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableGaugeMetric.ts index a7ac5c5ff59..2d59e78f952 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/ValueObserverMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableGaugeMetric.ts @@ -16,28 +16,28 @@ import * as api from '@opentelemetry/api-metrics'; import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { BaseObserverMetric } from './BaseObserverMetric'; +import { ObservableBaseMetric } from './ObservableBaseMetric'; import { Processor } from './export/Processor'; import { MetricKind } from './export/types'; -/** This is a SDK implementation of Value Observer Metric. */ -export class ValueObserverMetric - extends BaseObserverMetric - implements api.ValueObserver { +/** This is a SDK implementation of ObservableGauge Metric. */ +export class ObservableGaugeMetric + extends ObservableBaseMetric + implements api.ObservableGauge { constructor( name: string, options: api.MetricOptions, processor: Processor, resource: Resource, instrumentationLibrary: InstrumentationLibrary, - callback?: (observerResult: api.ObserverResult) => unknown + callback?: (observableResult: api.ObservableResult) => unknown ) { super( name, options, processor, resource, - MetricKind.VALUE_OBSERVER, + MetricKind.OBSERVABLE_GAUGE, instrumentationLibrary, callback ); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObserverResult.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts similarity index 83% rename from experimental/packages/opentelemetry-sdk-metrics-base/src/ObserverResult.ts rename to experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts index 60dcc044493..51fc07899ec 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/ObserverResult.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableResult.ts @@ -15,14 +15,14 @@ */ import { - ObserverResult as TypeObserverResult, + ObservableResult as TypeObservableResult, Labels, } from '@opentelemetry/api-metrics'; /** - * Implementation of {@link TypeObserverResult} + * Implementation of {@link TypeObservableResult} */ -export class ObserverResult implements TypeObserverResult { +export class ObservableResult implements TypeObservableResult { values: Map = new Map(); observe(value: number, labels: Labels): void { diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownSumObserverMetric.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableUpDownCounterMetric.ts similarity index 76% rename from experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownSumObserverMetric.ts rename to experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableUpDownCounterMetric.ts index 31cec8af7a5..d9a767044ab 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/UpDownSumObserverMetric.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/ObservableUpDownCounterMetric.ts @@ -17,28 +17,28 @@ import * as api from '@opentelemetry/api-metrics'; import { InstrumentationLibrary } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; -import { BaseObserverMetric } from './BaseObserverMetric'; +import { ObservableBaseMetric } from './ObservableBaseMetric'; import { Processor } from './export/Processor'; import { MetricKind } from './export/types'; -/** This is a SDK implementation of UpDownSumObserver Metric. */ -export class UpDownSumObserverMetric - extends BaseObserverMetric - implements api.UpDownSumObserver { +/** This is a SDK implementation of ObservableUpDownCounter Metric. */ +export class ObservableUpDownCounterMetric + extends ObservableBaseMetric + implements api.ObservableUpDownCounter { constructor( name: string, options: api.MetricOptions, processor: Processor, resource: Resource, instrumentationLibrary: InstrumentationLibrary, - callback?: (observerResult: api.ObserverResult) => unknown + callback?: (observableResult: api.ObservableResult) => unknown ) { super( name, options, processor, resource, - MetricKind.UP_DOWN_SUM_OBSERVER, + MetricKind.OBSERVABLE_UP_DOWN_COUNTER, instrumentationLibrary, callback ); 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 03d2cbcf52d..3cc23c70f00 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/Processor.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/Processor.ts @@ -54,12 +54,12 @@ export class UngroupedProcessor extends Processor { case MetricKind.UP_DOWN_COUNTER: return new aggregators.SumAggregator(); - case MetricKind.SUM_OBSERVER: - case MetricKind.UP_DOWN_SUM_OBSERVER: - case MetricKind.VALUE_OBSERVER: + case MetricKind.OBSERVABLE_COUNTER: + case MetricKind.OBSERVABLE_UP_DOWN_COUNTER: + case MetricKind.OBSERVABLE_GAUGE: return new aggregators.LastValueAggregator(); - case MetricKind.VALUE_RECORDER: + case MetricKind.HISTOGRAM: return new aggregators.HistogramAggregator( metricDescriptor.boundaries || [Infinity] ); 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 889e96598d7..61b22f45132 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/export/types.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/export/types.ts @@ -27,11 +27,10 @@ import { Resource } from '@opentelemetry/resources'; export enum MetricKind { COUNTER, UP_DOWN_COUNTER, - VALUE_RECORDER, - SUM_OBSERVER, - UP_DOWN_SUM_OBSERVER, - VALUE_OBSERVER, - BATCH_OBSERVER, + HISTOGRAM, + OBSERVABLE_COUNTER, + OBSERVABLE_UP_DOWN_COUNTER, + OBSERVABLE_GAUGE, } export const MetricKindValues = Object.values(MetricKind); diff --git a/experimental/packages/opentelemetry-sdk-metrics-base/src/index.ts b/experimental/packages/opentelemetry-sdk-metrics-base/src/index.ts index afcdeea5b13..a3d74d5352c 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/src/index.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/src/index.ts @@ -16,11 +16,11 @@ export * from './BoundInstrument'; export * from './CounterMetric'; -export * from './ValueRecorderMetric'; +export * from './HistogramMetric'; export * from './Meter'; export * from './MeterProvider'; export * from './Metric'; -export * from './ValueObserverMetric'; +export * from './ObservableGaugeMetric'; export * from './export/aggregators'; export * from './export/ConsoleMetricExporter'; export * from './export/Processor'; 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 b1e6389b5d3..e89545f7adf 100644 --- a/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts +++ b/experimental/packages/opentelemetry-sdk-metrics-base/test/Meter.test.ts @@ -34,15 +34,15 @@ import { MetricRecord, Sum, UpDownCounterMetric, - ValueObserverMetric, - ValueRecorderMetric, + ObservableGaugeMetric, + HistogramMetric, } from '../src'; import { BatchObserver } from '../src/BatchObserver'; import { BatchObserverResult } from '../src/BatchObserverResult'; import { SumAggregator } from '../src/export/aggregators'; import { Processor } from '../src/export/Processor'; -import { SumObserverMetric } from '../src/SumObserverMetric'; -import { UpDownSumObserverMetric } from '../src/UpDownSumObserverMetric'; +import { ObservableCounterMetric } from '../src/ObservableCounterMetric'; +import { ObservableUpDownCounterMetric } from '../src/ObservableUpDownCounterMetric'; import { hashLabels } from '../src/Utils'; const nonNumberValues = [ @@ -295,6 +295,13 @@ describe('Meter', () => { const counter = meter.createCounter('name with invalid characters^&*('); assert.ok(counter instanceof api.NoopMetric); }); + + it('should return no op metric if name exceeded length of 63', () => { + const counter = meter.createCounter('a'.repeat(63)); + assert.ok(counter instanceof CounterMetric); + const counter2 = meter.createCounter('a'.repeat(64)); + assert.ok(counter2 instanceof api.NoopMetric); + }); }); }); @@ -543,33 +550,33 @@ describe('Meter', () => { }); }); - describe('#ValueRecorder', () => { - it('should create a valueRecorder', () => { - const valueRecorder = meter.createValueRecorder('name'); - assert.ok(valueRecorder instanceof Metric); + describe('#Histogram', () => { + it('should create a histogram', () => { + const histogram = meter.createHistogram('name'); + assert.ok(histogram instanceof Metric); }); - it('should create a valueRecorder with options', () => { - const valueRecorder = meter.createValueRecorder('name', { + it('should create a histogram with options', () => { + const histogram = meter.createHistogram('name', { description: 'desc', unit: '1', disabled: false, }); - assert.ok(valueRecorder instanceof Metric); + assert.ok(histogram instanceof Metric); }); - it('should set histogram boundaries for value recorder', async () => { - const valueRecorder = meter.createValueRecorder('name', { + it('should set histogram boundaries for histogram', async () => { + const histogram = meter.createHistogram('name', { description: 'desc', unit: '1', disabled: false, boundaries: [10, 20, 30, 100], - }) as ValueRecorderMetric; + }) as HistogramMetric; - valueRecorder.record(10); - valueRecorder.record(30); - valueRecorder.record(50); - valueRecorder.record(200); + histogram.record(10); + histogram.record(30); + histogram.record(50); + histogram.record(200); await meter.collect(); const [record] = meter.getProcessor().checkPointSet(); @@ -582,30 +589,30 @@ describe('Meter', () => { sum: 290, }); - assert.ok(valueRecorder instanceof Metric); + assert.ok(histogram instanceof Metric); }); it('should pipe through resource', async () => { - const valueRecorder = meter.createValueRecorder( + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - assert.ok(valueRecorder.resource instanceof Resource); + ) as HistogramMetric; + assert.ok(histogram.resource instanceof Resource); - valueRecorder.record(1, { foo: 'bar' }); + histogram.record(1, { foo: 'bar' }); - const [record] = await valueRecorder.getMetricRecord(); + const [record] = await histogram.getMetricRecord(); assert.ok(record.resource instanceof Resource); }); it('should pipe through instrumentation library', async () => { - const valueRecorder = meter.createValueRecorder( + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - assert.ok(valueRecorder.instrumentationLibrary); + ) as HistogramMetric; + assert.ok(histogram.instrumentationLibrary); - valueRecorder.record(1, { foo: 'bar' }); + histogram.record(1, { foo: 'bar' }); - const [record] = await valueRecorder.getMetricRecord(); + const [record] = await histogram.getMetricRecord(); const { name, version } = record.instrumentationLibrary; assert.strictEqual(name, 'test-meter'); assert.strictEqual(version, undefined); @@ -613,42 +620,42 @@ describe('Meter', () => { describe('names', () => { it('should return no op metric if name is an empty string', () => { - const valueRecorder = meter.createValueRecorder(''); - assert.ok(valueRecorder instanceof api.NoopMetric); + const histogram = meter.createHistogram(''); + assert.ok(histogram instanceof api.NoopMetric); }); it('should return no op metric if name does not start with a letter', () => { - const valueRecorder1 = meter.createValueRecorder('1name'); - const valueRecorder_ = meter.createValueRecorder('_name'); - assert.ok(valueRecorder1 instanceof api.NoopMetric); - assert.ok(valueRecorder_ instanceof api.NoopMetric); + const histogram1 = meter.createHistogram('1name'); + const histogram_ = meter.createHistogram('_name'); + assert.ok(histogram1 instanceof api.NoopMetric); + assert.ok(histogram_ instanceof api.NoopMetric); }); it('should return no op metric if name is an empty string contain only letters, numbers, ".", "_", and "-"', () => { - const valueRecorder = meter.createValueRecorder( + const histogram = meter.createHistogram( 'name with invalid characters^&*(' ); - assert.ok(valueRecorder instanceof api.NoopMetric); + assert.ok(histogram instanceof api.NoopMetric); }); }); describe('.bind()', () => { const performanceTimeOrigin = hrTime(); - it('should create a valueRecorder instrument', () => { - const valueRecorder = meter.createValueRecorder( + it('should create a histogram instrument', () => { + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - const boundValueRecorder = valueRecorder.bind(labels); - assert.doesNotThrow(() => boundValueRecorder.record(10)); + ) as HistogramMetric; + const boundHistogram = histogram.bind(labels); + assert.doesNotThrow(() => boundHistogram.record(10)); }); it('should not set the instrument data when disabled', async () => { - const valueRecorder = meter.createValueRecorder('name', { + const histogram = meter.createHistogram('name', { disabled: true, - }) as ValueRecorderMetric; - const boundValueRecorder = valueRecorder.bind(labels); - boundValueRecorder.record(10); + }) as HistogramMetric; + const boundHistogram = histogram.bind(labels); + boundHistogram.record(10); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -666,10 +673,10 @@ describe('Meter', () => { }); it('should accept negative (and positive) values', async () => { - const valueRecorder = meter.createValueRecorder('name'); - const boundValueRecorder = valueRecorder.bind(labels); - boundValueRecorder.record(-10); - boundValueRecorder.record(50); + const histogram = meter.createHistogram('name'); + const boundHistogram = histogram.bind(labels); + boundHistogram.record(-10); + boundHistogram.record(50); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); @@ -691,13 +698,13 @@ describe('Meter', () => { }); it('should return same instrument on same label values', async () => { - const valueRecorder = meter.createValueRecorder( + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - const boundValueRecorder1 = valueRecorder.bind(labels); - boundValueRecorder1.record(10); - const boundValueRecorder2 = valueRecorder.bind(labels); - boundValueRecorder2.record(100); + ) as HistogramMetric; + const boundHistogram1 = histogram.bind(labels); + boundHistogram1.record(10); + const boundHistogram2 = histogram.bind(labels); + boundHistogram2.record(100); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); assert.deepStrictEqual( @@ -711,19 +718,19 @@ describe('Meter', () => { sum: 110, } ); - assert.strictEqual(boundValueRecorder1, boundValueRecorder2); + assert.strictEqual(boundHistogram1, boundHistogram2); }); it('should ignore non-number values', async () => { - const valueRecorder = meter.createValueRecorder( + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - const boundValueRecorder = valueRecorder.bind(labels); + ) as HistogramMetric; + const boundHistogram = histogram.bind(labels); await Promise.all( nonNumberValues.map(async val => { // @ts-expect-error verify non number types - boundValueRecorder.record(val); + boundHistogram.record(val); await meter.collect(); const [record1] = meter.getProcessor().checkPointSet(); assert.deepStrictEqual( @@ -743,47 +750,47 @@ describe('Meter', () => { }); describe('.unbind()', () => { - it('should remove the valueRecorder instrument', () => { - const valueRecorder = meter.createValueRecorder( + it('should remove the histogram instrument', () => { + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - const boundValueRecorder = valueRecorder.bind(labels); - assert.strictEqual(valueRecorder['_instruments'].size, 1); - valueRecorder.unbind(labels); - assert.strictEqual(valueRecorder['_instruments'].size, 0); - const boundValueRecorder2 = valueRecorder.bind(labels); - assert.strictEqual(valueRecorder['_instruments'].size, 1); - assert.notStrictEqual(boundValueRecorder, boundValueRecorder2); + ) as HistogramMetric; + const boundHistogram = histogram.bind(labels); + assert.strictEqual(histogram['_instruments'].size, 1); + histogram.unbind(labels); + assert.strictEqual(histogram['_instruments'].size, 0); + const boundHistogram2 = histogram.bind(labels); + assert.strictEqual(histogram['_instruments'].size, 1); + assert.notStrictEqual(boundHistogram, boundHistogram2); }); it('should not fail when removing non existing instrument', () => { - const valueRecorder = meter.createValueRecorder('name'); - valueRecorder.unbind({}); + const histogram = meter.createHistogram('name'); + histogram.unbind({}); }); it('should clear all instruments', () => { - const valueRecorder = meter.createValueRecorder( + const histogram = meter.createHistogram( 'name' - ) as ValueRecorderMetric; - valueRecorder.bind(labels); - assert.strictEqual(valueRecorder['_instruments'].size, 1); - valueRecorder.clear(); - assert.strictEqual(valueRecorder['_instruments'].size, 0); + ) as HistogramMetric; + histogram.bind(labels); + assert.strictEqual(histogram['_instruments'].size, 1); + histogram.clear(); + assert.strictEqual(histogram['_instruments'].size, 0); }); }); }); - describe('#SumObserverMetric', () => { - it('should create an Sum observer', () => { - const sumObserver = meter.createSumObserver('name') as SumObserverMetric; - assert.ok(sumObserver instanceof Metric); + describe('#ObservableCounterMetric', () => { + it('should create an ObservableCounter', () => { + const observableCounter = meter.createObservableCounter('name') as ObservableCounterMetric; + assert.ok(observableCounter instanceof Metric); }); - it('should return noop observer when name is invalid', () => { + it('should return noop observable counter when name is invalid', () => { // Need to stub/spy on the underlying logger as the "diag" instance is global const spy = sinon.stub(diag, 'warn'); - const sumObserver = meter.createSumObserver('na me'); - assert.ok(sumObserver === api.NOOP_SUM_OBSERVER_METRIC); + const observableCounter = meter.createObservableCounter('na me'); + assert.ok(observableCounter === api.NOOP_OBSERVABLE_COUNTER_METRIC); const args = spy.args[0]; assert.ok( args[0], @@ -791,13 +798,13 @@ describe('Meter', () => { ); }); - it('should create observer with options', () => { - const sumObserver = meter.createSumObserver('name', { + it('should create observable counter with options', () => { + const observableCounter = meter.createObservableCounter('name', { description: 'desc', unit: '1', disabled: false, - }) as SumObserverMetric; - assert.ok(sumObserver instanceof Metric); + }) as ObservableCounterMetric; + assert.ok(observableCounter instanceof Metric); }); it('should set callback and observe value ', async () => { @@ -811,23 +818,23 @@ describe('Meter', () => { return -1; } - const sumObserver = meter.createSumObserver( + const observableCounter = meter.createObservableCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { + (observableResult: api.ObservableResult) => { // simulate async return new Promise(resolve => { setTimeout(() => { - observerResult.observe(getValue(), { pid: '123', core: '1' }); + observableResult.observe(getValue(), { pid: '123', core: '1' }); resolve(); }, 1); }); } - ) as SumObserverMetric; + ) as ObservableCounterMetric; - let metricRecords = await sumObserver.getMetricRecord(); + let metricRecords = await observableCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); let point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, -1); @@ -836,29 +843,29 @@ describe('Meter', () => { '|#core:1,pid:123' ); - metricRecords = await sumObserver.getMetricRecord(); + metricRecords = await observableCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, 3); - metricRecords = await sumObserver.getMetricRecord(); + metricRecords = await observableCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, 3); }); it('should set callback and observe value when callback returns nothing', async () => { - const sumObserver = meter.createSumObserver( + const observableCounter = meter.createObservableCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { - observerResult.observe(1, { pid: '123', core: '1' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(1, { pid: '123', core: '1' }); } - ) as SumObserverMetric; + ) as ObservableCounterMetric; - const metricRecords = await sumObserver.getMetricRecord(); + const metricRecords = await observableCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); }); @@ -866,34 +873,34 @@ describe('Meter', () => { 'should set callback and observe value when callback returns anything' + ' but Promise', async () => { - const sumObserver = meter.createSumObserver( + const observableCounter = meter.createObservableCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { - observerResult.observe(1, { pid: '123', core: '1' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(1, { pid: '123', core: '1' }); return '1'; } - ) as SumObserverMetric; + ) as ObservableCounterMetric; - const metricRecords = await sumObserver.getMetricRecord(); + const metricRecords = await observableCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); } ); it('should reject getMetricRecord when callback throws an error', async () => { - const sumObserver = meter.createSumObserver( + const observableCounter = meter.createObservableCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { - observerResult.observe(1, { pid: '123', core: '1' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(1, { pid: '123', core: '1' }); throw new Error('Boom'); } - ) as SumObserverMetric; - await sumObserver + ) as ObservableCounterMetric; + await observableCounter .getMetricRecord() .then() .catch(e => { @@ -902,30 +909,30 @@ describe('Meter', () => { }); it('should pipe through resource', async () => { - const sumObserver = meter.createSumObserver('name', {}, result => { + const observableCounter = meter.createObservableCounter('name', {}, result => { result.observe(42, { foo: 'bar' }); return Promise.resolve(); - }) as SumObserverMetric; - assert.ok(sumObserver.resource instanceof Resource); + }) as ObservableCounterMetric; + assert.ok(observableCounter.resource instanceof Resource); - const [record] = await sumObserver.getMetricRecord(); + const [record] = await observableCounter.getMetricRecord(); assert.ok(record.resource instanceof Resource); }); }); - describe('#ValueObserver', () => { - it('should create a value observer', () => { - const valueObserver = meter.createValueObserver( + describe('#ObservableGauge', () => { + it('should create an observable gauge', () => { + const observableGauge = meter.createObservableGauge( 'name' - ) as ValueObserverMetric; - assert.ok(valueObserver instanceof Metric); + ) as ObservableGaugeMetric; + assert.ok(observableGauge instanceof Metric); }); - it('should return noop observer when name is invalid', () => { + it('should return noop observable gauge when name is invalid', () => { // Need to stub/spy on the underlying logger as the "diag" instance is global const spy = sinon.stub(diag, 'warn'); - const valueObserver = meter.createValueObserver('na me'); - assert.ok(valueObserver === api.NOOP_VALUE_OBSERVER_METRIC); + const observableGauge = meter.createObservableGauge('na me'); + assert.ok(observableGauge === api.NOOP_OBSERVABLE_GAUGE_METRIC); const args = spy.args[0]; assert.ok( args[0], @@ -933,40 +940,40 @@ describe('Meter', () => { ); }); - it('should create observer with options', () => { - const valueObserver = meter.createValueObserver('name', { + it('should create observable gauge with options', () => { + const observableGauge = meter.createObservableGauge('name', { description: 'desc', unit: '1', disabled: false, - }) as ValueObserverMetric; - assert.ok(valueObserver instanceof Metric); + }) as ObservableGaugeMetric; + assert.ok(observableGauge instanceof Metric); }); it('should set callback and observe value ', async () => { - const valueObserver = meter.createValueObserver( + const observableGauge = meter.createObservableGauge( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { + (observableResult: api.ObservableResult) => { // simulate async return new Promise(resolve => { setTimeout(() => { - observerResult.observe(getCpuUsage(), { pid: '123', core: '1' }); - observerResult.observe(getCpuUsage(), { pid: '123', core: '2' }); - observerResult.observe(getCpuUsage(), { pid: '123', core: '3' }); - observerResult.observe(getCpuUsage(), { pid: '123', core: '4' }); + observableResult.observe(getCpuUsage(), { pid: '123', core: '1' }); + observableResult.observe(getCpuUsage(), { pid: '123', core: '2' }); + observableResult.observe(getCpuUsage(), { pid: '123', core: '3' }); + observableResult.observe(getCpuUsage(), { pid: '123', core: '4' }); resolve(); }, 1); }); } - ) as ValueObserverMetric; + ) as ObservableGaugeMetric; function getCpuUsage() { return Math.random(); } - const metricRecords: MetricRecord[] = await valueObserver.getMetricRecord(); + const metricRecords: MetricRecord[] = await observableGauge.getMetricRecord(); assert.strictEqual(metricRecords.length, 4); const metric1 = metricRecords[0]; @@ -985,29 +992,29 @@ describe('Meter', () => { }); it('should pipe through resource', async () => { - const valueObserver = meter.createValueObserver('name', {}, result => { + const observableGauge = meter.createObservableGauge('name', {}, result => { result.observe(42, { foo: 'bar' }); - }) as ValueObserverMetric; - assert.ok(valueObserver.resource instanceof Resource); + }) as ObservableGaugeMetric; + assert.ok(observableGauge.resource instanceof Resource); - const [record] = await valueObserver.getMetricRecord(); + const [record] = await observableGauge.getMetricRecord(); assert.ok(record.resource instanceof Resource); }); }); - describe('#UpDownSumObserverMetric', () => { - it('should create an UpDownSum observer', () => { - const upDownSumObserver = meter.createUpDownSumObserver( + describe('#ObservableUpDownCounterMetric', () => { + it('should create an ObservableUpDownCounter', () => { + const observableUpDownCounter = meter.createObservableUpDownCounter( 'name' - ) as UpDownSumObserverMetric; - assert.ok(upDownSumObserver instanceof Metric); + ) as ObservableUpDownCounterMetric; + assert.ok(observableUpDownCounter instanceof Metric); }); - it('should return noop observer when name is invalid', () => { + it('should return noop observable up down counter when name is invalid', () => { // Need to stub/spy on the underlying logger as the "diag" instance is global const spy = sinon.stub(diag, 'warn'); - const upDownSumObserver = meter.createUpDownSumObserver('na me'); - assert.ok(upDownSumObserver === api.NOOP_UP_DOWN_SUM_OBSERVER_METRIC); + const observableUpDownCounter = meter.createObservableUpDownCounter('na me'); + assert.ok(observableUpDownCounter === api.NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC); const args = spy.args[0]; assert.ok( args[0], @@ -1015,13 +1022,13 @@ describe('Meter', () => { ); }); - it('should create observer with options', () => { - const upDownSumObserver = meter.createUpDownSumObserver('name', { + it('should create observable up down counter with options', () => { + const observableUpDownCounter = meter.createObservableUpDownCounter('name', { description: 'desc', unit: '1', disabled: false, - }) as UpDownSumObserverMetric; - assert.ok(upDownSumObserver instanceof Metric); + }) as ObservableUpDownCounterMetric; + assert.ok(observableUpDownCounter instanceof Metric); }); it('should set callback and observe value ', async () => { @@ -1035,23 +1042,23 @@ describe('Meter', () => { return 3; } - const upDownSumObserver = meter.createUpDownSumObserver( + const observableUpDownCounter = meter.createObservableUpDownCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { + (observableResult: api.ObservableResult) => { // simulate async return new Promise(resolve => { setTimeout(() => { - observerResult.observe(getValue(), { pid: '123', core: '1' }); + observableResult.observe(getValue(), { pid: '123', core: '1' }); resolve(); }, 1); }); } - ) as UpDownSumObserverMetric; + ) as ObservableUpDownCounterMetric; - let metricRecords = await upDownSumObserver.getMetricRecord(); + let metricRecords = await observableUpDownCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); let point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, 3); @@ -1060,29 +1067,29 @@ describe('Meter', () => { '|#core:1,pid:123' ); - metricRecords = await upDownSumObserver.getMetricRecord(); + metricRecords = await observableUpDownCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, 2); - metricRecords = await upDownSumObserver.getMetricRecord(); + metricRecords = await observableUpDownCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); point = metricRecords[0].aggregator.toPoint(); assert.strictEqual(point.value, 3); }); it('should set callback and observe value when callback returns nothing', async () => { - const upDownSumObserver = meter.createUpDownSumObserver( + const observableUpDownCounter = meter.createObservableUpDownCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { - observerResult.observe(1, { pid: '123', core: '1' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(1, { pid: '123', core: '1' }); } - ) as UpDownSumObserverMetric; + ) as ObservableUpDownCounterMetric; - const metricRecords = await upDownSumObserver.getMetricRecord(); + const metricRecords = await observableUpDownCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); }); @@ -1090,34 +1097,34 @@ describe('Meter', () => { 'should set callback and observe value when callback returns anything' + ' but Promise', async () => { - const upDownSumObserver = meter.createUpDownSumObserver( + const observableUpDownCounter = meter.createObservableUpDownCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { - observerResult.observe(1, { pid: '123', core: '1' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(1, { pid: '123', core: '1' }); return '1'; } - ) as UpDownSumObserverMetric; + ) as ObservableUpDownCounterMetric; - const metricRecords = await upDownSumObserver.getMetricRecord(); + const metricRecords = await observableUpDownCounter.getMetricRecord(); assert.strictEqual(metricRecords.length, 1); } ); it('should reject getMetricRecord when callback throws an error', async () => { - const upDownSumObserver = meter.createUpDownSumObserver( + const observableUpDownCounter = meter.createObservableUpDownCounter( 'name', { description: 'desc', }, - (observerResult: api.ObserverResult) => { - observerResult.observe(1, { pid: '123', core: '1' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(1, { pid: '123', core: '1' }); throw new Error('Boom'); } - ) as UpDownSumObserverMetric; - await upDownSumObserver + ) as ObservableUpDownCounterMetric; + await observableUpDownCounter .getMetricRecord() .then() .catch(e => { @@ -1126,17 +1133,17 @@ describe('Meter', () => { }); it('should pipe through resource', async () => { - const upDownSumObserver = meter.createUpDownSumObserver( + const observableUpDownCounter = meter.createObservableUpDownCounter( 'name', {}, result => { result.observe(42, { foo: 'bar' }); return Promise.resolve(); } - ) as UpDownSumObserverMetric; - assert.ok(upDownSumObserver.resource instanceof Resource); + ) as ObservableUpDownCounterMetric; + assert.ok(observableUpDownCounter.resource instanceof Resource); - const [record] = await upDownSumObserver.getMetricRecord(); + const [record] = await observableUpDownCounter.getMetricRecord(); assert.ok(record.resource instanceof Resource); }); }); @@ -1155,15 +1162,15 @@ describe('Meter', () => { }); it('should use callback to observe values ', async () => { - const tempMetric = meter.createValueObserver('cpu_temp_per_app', { + const tempMetric = meter.createObservableGauge('cpu_temp_per_app', { description: 'desc', - }) as ValueObserverMetric; + }) as ObservableGaugeMetric; - const cpuUsageMetric = meter.createValueObserver('cpu_usage_per_app', { + const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { description: 'desc', - }) as ValueObserverMetric; + }) as ObservableGaugeMetric; - meter.createBatchObserver(observerBatchResult => { + meter.createBatchObserver(batchObserverResult => { interface StatItem { usage: number; temp: number; @@ -1202,11 +1209,11 @@ describe('Meter', () => { ]).then((stats: unknown[]) => { const apps = (stats[0] as unknown) as Stat[]; apps.forEach(app => { - observerBatchResult.observe({ app: app.name, core: '1' }, [ + batchObserverResult.observe({ app: app.name, core: '1' }, [ tempMetric.observation(app.core1.temp), cpuUsageMetric.observation(app.core1.usage), ]); - observerBatchResult.observe({ app: app.name, core: '2' }, [ + batchObserverResult.observe({ app: app.name, core: '2' }, [ tempMetric.observation(app.core2.temp), cpuUsageMetric.observation(app.core2.usage), ]); @@ -1248,12 +1255,12 @@ describe('Meter', () => { }); it('should not observe values when timeout', done => { - const cpuUsageMetric = meter.createValueObserver('cpu_usage_per_app', { + const cpuUsageMetric = meter.createObservableGauge('cpu_usage_per_app', { description: 'desc', - }) as ValueObserverMetric; + }) as ObservableGaugeMetric; meter.createBatchObserver( - observerBatchResult => { + batchObserverResult => { Promise.all([ // simulate waiting 11ms new Promise((resolve, reject) => { @@ -1261,8 +1268,8 @@ describe('Meter', () => { }), ]).then(async () => { // try to hack to be able to update - (observerBatchResult as BatchObserverResult).cancelled = false; - observerBatchResult.observe({ foo: 'bar' }, [ + (batchObserverResult as BatchObserverResult).cancelled = false; + batchObserverResult.observe({ foo: 'bar' }, [ cpuUsageMetric.observation(123), ]); @@ -1289,16 +1296,16 @@ describe('Meter', () => { }); it('should pipe through instrumentation library', async () => { - const observer = meter.createValueObserver( + const observableGauge = meter.createObservableGauge( 'name', {}, - (observerResult: api.ObserverResult) => { - observerResult.observe(42, { foo: 'bar' }); + (observableResult: api.ObservableResult) => { + observableResult.observe(42, { foo: 'bar' }); } - ) as ValueObserverMetric; - assert.ok(observer.instrumentationLibrary); + ) as ObservableGaugeMetric; + assert.ok(observableGauge.instrumentationLibrary); - const [record] = await observer.getMetricRecord(); + const [record] = await observableGauge.getMetricRecord(); const { name, version } = record.instrumentationLibrary; assert.strictEqual(name, 'test-meter'); assert.strictEqual(version, undefined); @@ -1363,8 +1370,8 @@ describe('Meter', () => { processor: new CustomProcessor(), }); assert.throws(() => { - const valueRecorder = customMeter.createValueRecorder('myValueRecorder'); - valueRecorder.bind({}).record(1); + const histogram = customMeter.createHistogram('myHistogram'); + histogram.bind({}).record(1); }, /aggregatorFor method not implemented/); }); }); @@ -1389,6 +1396,6 @@ function ensureMetric(metric: MetricRecord, name?: string, value?: LastValue) { assert.strictEqual(descriptor.name, name || 'name'); assert.strictEqual(descriptor.description, 'desc'); assert.strictEqual(descriptor.unit, '1'); - assert.strictEqual(descriptor.metricKind, MetricKind.VALUE_OBSERVER); + assert.strictEqual(descriptor.metricKind, MetricKind.OBSERVABLE_GAUGE); assert.strictEqual(descriptor.valueType, api.ValueType.DOUBLE); } diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json index c4a18e84ac2..dddf6d0845f 100644 --- a/experimental/packages/opentelemetry-sdk-node/package.json +++ b/experimental/packages/opentelemetry-sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-node", - "version": "0.25.0", + "version": "0.26.0", "description": "OpenTelemetry SDK for Node.js", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -42,22 +42,22 @@ "access": "public" }, "dependencies": { - "@opentelemetry/api-metrics": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", + "@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-gcp": "0.24.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "@opentelemetry/sdk-trace-node": "0.25.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.2" }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.25.0", + "@opentelemetry/context-async-hooks": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/semver": "7.3.8", diff --git a/experimental/tsconfig.esm.json b/experimental/tsconfig.esm.json index cd3052ad278..a233a3b76d1 100644 --- a/experimental/tsconfig.esm.json +++ b/experimental/tsconfig.esm.json @@ -5,6 +5,18 @@ { "path": "packages/opentelemetry-api-metrics/tsconfig.esm.json" }, + { + "path": "packages/opentelemetry-exporter-otlp-grpc" + }, + { + "path": "packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json" + }, + { + "path": "packages/opentelemetry-exporter-otlp-proto" + }, + { + "path": "packages/opentelemetry-exporter-prometheus" + }, { "path": "packages/opentelemetry-instrumentation-fetch/tsconfig.esm.json" }, @@ -25,6 +37,15 @@ }, { "path": "packages/opentelemetry-sdk-node" + }, + { + "path": "backwards-compatability/node10" + }, + { + "path": "backwards-compatability/node12" + }, + { + "path": "backwards-compatability/node8" } ] } diff --git a/experimental/tsconfig.json b/experimental/tsconfig.json index a4220672a87..3ae14512e28 100644 --- a/experimental/tsconfig.json +++ b/experimental/tsconfig.json @@ -5,6 +5,18 @@ { "path": "packages/opentelemetry-api-metrics" }, + { + "path": "packages/opentelemetry-exporter-otlp-grpc" + }, + { + "path": "packages/opentelemetry-exporter-otlp-http" + }, + { + "path": "packages/opentelemetry-exporter-otlp-proto" + }, + { + "path": "packages/opentelemetry-exporter-prometheus" + }, { "path": "packages/opentelemetry-instrumentation-fetch" }, @@ -25,6 +37,15 @@ }, { "path": "packages/opentelemetry-sdk-node" + }, + { + "path": "backwards-compatability/node10" + }, + { + "path": "backwards-compatability/node12" + }, + { + "path": "backwards-compatability/node8" } ] } diff --git a/getting-started/.eslintrc.js b/getting-started/.eslintrc.js deleted file mode 100644 index 8580fbfb045..00000000000 --- a/getting-started/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -/* eslint-disable global-require */ -/* eslint-disable strict */ - -module.exports = { - ...require('../examples/.eslintrc.json'), -}; diff --git a/getting-started/README.md b/getting-started/README.md deleted file mode 100644 index 132bd340aec..00000000000 --- a/getting-started/README.md +++ /dev/null @@ -1,398 +0,0 @@ -# Getting started with OpenTelemetry JS - -This guide walks you through the setup and configuration process for a tracing backend (in this case [Zipkin](https://zipkin.io), but [Jaeger](https://www.jaegertracing.io) is simple to use as well), a metrics backend like [Prometheus](https://prometheus.io), and auto-instrumentation of NodeJS. [You can find the guide for TypeScript here](ts-example/README.md#getting-started-with-opentelemetry-js-typescript). - -- [Getting started with OpenTelemetry JS](#getting-started-with-opentelemetry-js) - - [Trace your application with OpenTelemetry](#trace-your-application-with-opentelemetry) - - [Set up a tracing backend](#set-up-a-tracing-backend) - - [Trace your NodeJS application](#trace-your-nodejs-application) - - [Install the required OpenTelemetry libraries](#install-the-required-opentelemetry-libraries) - - [Initialize a global tracer](#initialize-a-global-tracer) - - [Initialize and register a trace exporter](#initialize-and-register-a-trace-exporter) - - [Collect metrics using OpenTelemetry](#collect-metrics-using-opentelemetry) - - [Set up a metrics backend](#set-up-a-metrics-backend) - - [Monitor your NodeJS application](#monitor-your-nodejs-application) - - [Install the required OpenTelemetry metrics libraries](#install-the-required-opentelemetry-metrics-libraries) - - [Initialize a meter and collect metrics](#initialize-a-meter-and-collect-metrics) - - [Initialize and register a metrics exporter](#initialize-and-register-a-metrics-exporter) - -## Trace your application with OpenTelemetry - -([link to TypeScript version](ts-example/README.md#trace-your-application-with-opentelemetry)) - -This guide assumes you're using Zipkin as your tracing backend, but modifying it for Jaeger should be straightforward. - -You can find an example application to use with this guide in the [example directory](example). See what it looks like with tracing enabled in the [traced-example directory](traced-example). - -### Set up a tracing backend - -([link to TypeScript version](ts-example/README.md#set-up-a-tracing-backend)) - -The first thing you need before you can start collecting traces is a tracing backend like Zipkin that you can export traces to. If you already have a supported tracing backend (Zipkin or Jaeger), you can skip this step. If not, you need to run one. - -To set up Zipkin as quickly as possible, run the latest [Docker Zipkin](https://github.com/openzipkin/docker-zipkin) container, exposing port `9411`. If you can’t run Docker containers, you need to download and run Zipkin by following the Zipkin [quickstart guide](https://zipkin.io/pages/quickstart.html). - -```sh -docker run --rm -d -p 9411:9411 --name zipkin openzipkin/zipkin -``` - -Browse to to make sure you can see the Zipkin UI. - -

- -### Trace your NodeJS application - -([link to TypeScript version](ts-example/README.md#trace-your-nodejs-application)) - -This guide uses the example application provided in the [example directory](example), but the steps to instrument your own application should be broadly the same. Here's an overview of what you'll be doing: - -1. Install the required OpenTelemetry libraries -2. Initialize a global tracer -3. Initialize and register a trace exporter - -#### Install the required OpenTelemetry libraries - -([link to TypeScript version](ts-example/README.md#install-the-required-opentelemetry-libraries)) - -To create traces on NodeJS, you need `@opentelemetry/sdk-trace-node`, `@opentelemetry/core`, and any instrumentation required by your application such as gRPC or HTTP. If you're using the example application, you need to install `@opentelemetry/instrumentation-http` and `@opentelemetry/instrumentation-express`. - -```sh -$ npm install \ - @opentelemetry/api \ - @opentelemetry/sdk-trace-node \ - @opentelemetry/instrumentation-http \ - @opentelemetry/instrumentation-express \ - @opentelemetry/instrumentation-grpc -``` - -#### Initialize a global tracer - -([link to TypeScript version](ts-example/README.md#initialize-a-global-tracer)) - -All tracing initialization should happen before your application code runs. The easiest way to do this is to initialize tracing in a separate file that is required using the `node` `-r` option before your application code runs. - -Create a file named `tracing.js` and add the following code: - -```javascript -'use strict'; - -const { diag, DiagConsoleLogger, DiagLogLevel } = require("@opentelemetry/api"); -const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); -const { registerInstrumentations } = require("@opentelemetry/instrumentation"); -const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http"); -const { GrpcInstrumentation } = require("@opentelemetry/instrumentation-grpc"); - -const provider = new NodeTracerProvider(); - -diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ALL); - -provider.register(); - -registerInstrumentations({ - instrumentations: [ - new HttpInstrumentation(), - new GrpcInstrumentation(), - ], -}); - -``` - -Now, if you run your application with `node -r ./tracing.js app.js`, your application will create and propagate traces over HTTP. If an already instrumented service that supports [Trace Context](https://www.w3.org/TR/trace-context/) headers calls your application using HTTP, and you call another application using HTTP, the Trace Context headers will be correctly propagated. - -However, if you want to see a completed trace, you need to register an exporter to send traces to a tracing backend. - -#### Initialize and register a trace exporter - -([link to TypeScript version](ts-example/README.md#initialize-and-register-a-trace-exporter)) - -This guide uses the Zipkin tracing backend. However, if you're using another backend like [Jaeger](https://www.jaegertracing.io), make your change there. - -To export traces, you need a few more dependencies. Install them with the following command: - -```sh -$ npm install \ - @opentelemetry/sdk-trace-base \ - @opentelemetry/exporter-zipkin - -$ # for jaeger you would run this command: -$ # npm install @opentelemetry/exporter-jaeger -``` - -After you install these dependencies, initialize and register them. Modify `tracing.js` so it matches the following code snippet. Optionally replace the service name `"getting-started"` with your own service name: - -```javascript -'use strict'; - -const { diag, DiagConsoleLogger, DiagLogLevel } = require("@opentelemetry/api"); -const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); -const { Resource } = require('@opentelemetry/resources'); -const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions'); -const { SimpleSpanProcessor } = require("@opentelemetry/sdk-trace-base"); -const { ZipkinExporter } = require("@opentelemetry/exporter-zipkin"); -const { registerInstrumentations } = require("@opentelemetry/instrumentation"); -const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http"); -const { GrpcInstrumentation } = require("@opentelemetry/instrumentation-grpc"); - -const provider = new NodeTracerProvider({ - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: "getting-started", - }) -}); - -diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ALL); - -provider.addSpanProcessor( - new SimpleSpanProcessor( - new ZipkinExporter({ - // If you are running your tracing backend on another host, - // you can point to it using the `url` parameter of the - // exporter config. - }) - ) -); - -provider.register(); - -registerInstrumentations({ - instrumentations: [ - new HttpInstrumentation(), - new GrpcInstrumentation(), - ], -}); - -console.log("tracing initialized"); -``` - -Now if you run your application with the `tracing.js` file loaded, and you send requests to your application over HTTP (in the sample application just browse to ), you'll see traces exported to your tracing backend that look like this: - -```sh -node -r ./tracing.js app.js -``` - -

- -**Note:** Some spans appear to be duplicated, but they're not. This is because the sample application is both the client and the server for these requests. You see one span which is the client-side request timing, and one span which is the server side request timing. Anywhere they don’t overlap is network time. - -## Collect metrics using OpenTelemetry - -([link to TypeScript version](ts-example/README.md#collect-metrics-using-opentelemetry)) - -This guide assumes you're using Prometheus as your metrics backend. It's currently the only metrics backend supported by OpenTelemetry JS. - -**Note**: This section is a work in progress. - -### Set up a metrics backend - -([link to TypeScript version](ts-example/README.md#set-up-a-metrics-backend)) - -Now that you have end-to-end traces, you can collect and export some basic metrics. - -Currently, the only supported metrics backend is [Prometheus](https://prometheus.io). Go to the [Prometheus download page](https://prometheus.io/download/) and download the latest release of Prometheus for your operating system. - -Open a command line and `cd` into the directory where you downloaded the Prometheus tarball. Untar it into the newly created directory. - -```sh -$ cd Downloads - -$ # Replace the file name below with your downloaded tarball -$ tar xvfz prometheus-2.20.1.darwin-amd64.tar - -$ # Replace the dir below with your created directory -$ cd prometheus-2.20.1.darwin-amd64 - -$ ls -LICENSE console_libraries data prometheus.yml tsdb -NOTICE consoles prometheus promtool -``` - -The created directory should have a file named `prometheus.yml`. This is the file used to configure Prometheus. For now, just make sure Prometheus starts by running the `./prometheus` binary in the folder and browse to . - -```sh -$ ./prometheus -# some output elided for brevity -msg="Starting Prometheus" version="(version=2.14.0, branch=HEAD, revision=edeb7a44cbf745f1d8be4ea6f215e79e651bfe19)" -# some output elided for brevity -level=info ts=2019-11-21T20:39:40.262Z caller=web.go:496 component=web msg="Start listening for connections" address=0.0.0.0:9090 -# some output elided for brevity -level=info ts=2019-11-21T20:39:40.383Z caller=main.go:626 msg="Server is ready to receive web requests." -``` - -

- -Once you confirm that Prometheus starts, replace the contents of `prometheus.yml` with the following: - -```yaml -# my global config -global: - scrape_interval: 15s # Set the scrape interval to every 15 seconds. - -scrape_configs: - - job_name: 'opentelemetry' - # metrics_path defaults to '/metrics' - # scheme defaults to 'http'. - static_configs: - - targets: ['localhost:9464'] -``` - -### Monitor your NodeJS application - -([link to TypeScript version](ts-example/README.md#monitor-your-nodejs-application)) - -You can find an example application to use with this guide in the [example directory](example). See what it looks like with metric monitoring enabled in the [monitored-example directory](monitored-example). - -Here's an overview of what you'll be doing: - -1. Install the required OpenTelemetry metrics libraries -2. Initialize a meter and collect metrics -3. Initialize and register a metrics exporter - -#### Install the required OpenTelemetry metrics libraries - -([link to TypeScript version](ts-example/README.md#install-the-required-opentelemetry-sdk-metrics-base-libraries)) - -To create metrics on NodeJS, you need `@opentelemetry/sdk-metrics-base`. - -```sh -$ npm install \ - @opentelemetry/sdk-metrics-base -``` - -#### Initialize a meter and collect metrics - -([link to TypeScript version](ts-example/README.md#initialize-a-meter-and-collect-metrics)) - -You need a `Meter` to create and monitor metrics. A `Meter` in OpenTelemetry is the mechanism used to create and manage metrics, labels, and metric exporters. - -Create a file named `monitoring.js` and add the following code: - -```javascript -'use strict'; - -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); - -const meter = new MeterProvider().getMeter('your-meter-name'); -``` - -Now you can require this file from your application code and use the `Meter` to create and manage metrics. The simplest of these metrics is a counter. Create and export from your `monitoring.js` file a middleware function that express can use to count all requests by route. Modify the `monitoring.js` file so it looks like this: - -```javascript -'use strict'; - -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); - -const meter = new MeterProvider().getMeter('your-meter-name'); - -const requestCount = meter.createCounter("requests", { - description: "Count all incoming requests" -}); - -const boundInstruments = new Map(); - -module.exports.countAllRequests = () => { - return (req, res, next) => { - if (!boundInstruments.has(req.path)) { - const labels = { route: req.path }; - const boundCounter = requestCount.bind(labels); - boundInstruments.set(req.path, boundCounter); - } - - boundInstruments.get(req.path).add(1); - next(); - }; -}; -``` - -Now import and use this middleware in your application code: - -```javascript -const { countAllRequests } = require("./monitoring"); -const app = express(); -app.use(countAllRequests()); -``` - -Now when you make requests to your service, your meter will count all requests. - -**Note**: Creating a new `labelSet` and `binding` on every request is not ideal because creating the `labelSet` can often be an expensive operation. Therefore, the instruments are created and stored in a `Map` according to the route key. - -#### Initialize and register a metrics exporter - -([link to TypeScript version](ts-example/README.md#initialize-and-register-a-metrics-exporter)) - -Counting metrics is only useful if you can export them somewhere where you can see them. For this, w'ere going to use Prometheus. Creating and registering a metrics exporter is much like the tracing exporter above. First you need to install the Prometheus exporter by running the following command: - -```sh -npm install @opentelemetry/exporter-prometheus -``` - -Next, modify your `monitoring.js` file to look like this: - -```javascript -"use strict"; - -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); -const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); - -const prometheusPort = PrometheusExporter.DEFAULT_OPTIONS.port -const prometheusEndpoint = PrometheusExporter.DEFAULT_OPTIONS.endpoint - -const exporter = new PrometheusExporter( - { - startServer: true, - }, - () => { - console.log( - `prometheus scrape endpoint: http://localhost:${prometheusPort}${prometheusEndpoint}`, - ); - }, -); - -const meter = new MeterProvider({ - exporter, - interval: 1000, -}).getMeter('your-meter-name'); - -const requestCount = meter.createCounter("requests", { - description: "Count all incoming requests" -}); - -const boundInstruments = new Map(); - -module.exports.countAllRequests = () => { - return (req, res, next) => { - if (!boundInstruments.has(req.path)) { - const labels = { route: req.path }; - const boundCounter = requestCount.bind(labels); - boundInstruments.set(req.path, boundCounter); - } - - boundInstruments.get(req.path).add(1); - next(); - }; -}; -``` - -Ensure Prometheus is running by running the `prometheus` binary from earlier and start your application. - -```sh -$ npm start - -> @opentelemetry/getting-started@1.0.0 start /App/opentelemetry-js/getting-started/monitored-example -> node app.js - -prometheus scrape endpoint: http://localhost:9464/metrics -Listening for requests on http://localhost:8080 -``` - -Now each time you browse to you should see "Hello from the backend" in your browser and your metrics in Prometheus should update. You can verify the current metrics by browsing to , which should look like this: - -```sh -# HELP requests Count all incoming requests -# TYPE requests counter -requests{route="/"} 1 -requests{route="/middle-tier"} 2 -requests{route="/backend"} 4 -``` - -You should also be able to see gathered metrics in your Prometheus web UI. - -

diff --git a/getting-started/example/app.js b/getting-started/example/app.js deleted file mode 100644 index 287ab78cb3c..00000000000 --- a/getting-started/example/app.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const PORT = process.env.PORT || '8080'; - -const express = require('express'); -const axios = require('axios'); - -const app = express(); - -app.get('/', (req, res) => { - axios - .get(`http://localhost:${PORT}/middle-tier`) - .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/middle-tier', (req, res) => { - axios - .get(`http://localhost:${PORT}/backend`) - .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/backend', (req, res) => { - res.send('Hello from the backend'); -}); - -app.listen(parseInt(PORT, 10), () => { - console.log(`Listening for requests on http://localhost:${PORT}`); -}); diff --git a/getting-started/example/package.json b/getting-started/example/package.json deleted file mode 100644 index 4c4e2894343..00000000000 --- a/getting-started/example/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@opentelemetry/getting-started-example", - "version": "0.25.0", - "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", - "main": "app.js", - "scripts": { - "start": "node app.js" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "dependencies": { - "axios": "^0.21.0", - "express": "^4.17.1" - } -} diff --git a/getting-started/images/prometheus-graph.png b/getting-started/images/prometheus-graph.png deleted file mode 100644 index c4e174ffd34..00000000000 Binary files a/getting-started/images/prometheus-graph.png and /dev/null differ diff --git a/getting-started/images/prometheus.png b/getting-started/images/prometheus.png deleted file mode 100644 index ef94a1faf04..00000000000 Binary files a/getting-started/images/prometheus.png and /dev/null differ diff --git a/getting-started/images/zipkin-trace.png b/getting-started/images/zipkin-trace.png deleted file mode 100644 index c00c86865df..00000000000 Binary files a/getting-started/images/zipkin-trace.png and /dev/null differ diff --git a/getting-started/images/zipkin.png b/getting-started/images/zipkin.png deleted file mode 100644 index 77e23745b49..00000000000 Binary files a/getting-started/images/zipkin.png and /dev/null differ diff --git a/getting-started/monitored-example/app.js b/getting-started/monitored-example/app.js deleted file mode 100644 index af61cef67e5..00000000000 --- a/getting-started/monitored-example/app.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -const PORT = process.env.PORT || '8080'; - -const express = require('express'); -const axios = require('axios'); - -const { countAllRequests } = require('./monitoring'); - -const app = express(); -app.use(countAllRequests()); - -app.get('/', (req, res) => { - axios - .get(`http://localhost:${PORT}/middle-tier`) - .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/middle-tier', (req, res) => { - axios - .get(`http://localhost:${PORT}/backend`) - .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/backend', (req, res) => { - res.send('Hello from the backend'); -}); - -app.listen(parseInt(PORT, 10), () => { - console.log(`Listening for requests on http://localhost:${PORT}`); -}); diff --git a/getting-started/monitored-example/monitoring.js b/getting-started/monitored-example/monitoring.js deleted file mode 100644 index ca20e8d2fdd..00000000000 --- a/getting-started/monitored-example/monitoring.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); -const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); - -const prometheusPort = PrometheusExporter.DEFAULT_OPTIONS.port; -const prometheusEndpoint = PrometheusExporter.DEFAULT_OPTIONS.endpoint; - -const exporter = new PrometheusExporter( - { - startServer: true, - }, - () => { - console.log( - `prometheus scrape endpoint: http://localhost:${prometheusPort}${prometheusEndpoint}`, - ); - }, -); - -const meter = new MeterProvider({ - exporter, - interval: 1000, -}).getMeter('your-meter-name'); - -const requestCount = meter.createCounter('requests', { - description: 'Count all incoming requests', -}); - -const boundInstruments = new Map(); - -module.exports.countAllRequests = () => (req, res, next) => { - if (!boundInstruments.has(req.path)) { - const labels = { route: req.path }; - const boundCounter = requestCount.bind(labels); - boundInstruments.set(req.path, boundCounter); - } - - boundInstruments.get(req.path).add(1); - next(); -}; diff --git a/getting-started/monitored-example/package.json b/getting-started/monitored-example/package.json deleted file mode 100644 index a8b6c3a66c4..00000000000 --- a/getting-started/monitored-example/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@opentelemetry/getting-started-monitored-example", - "version": "0.25.0", - "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", - "main": "app.js", - "scripts": { - "start": "node app.js" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/exporter-prometheus": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "axios": "^0.21.0", - "express": "^4.17.1" - } -} diff --git a/getting-started/traced-example/app.js b/getting-started/traced-example/app.js deleted file mode 100644 index 287ab78cb3c..00000000000 --- a/getting-started/traced-example/app.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const PORT = process.env.PORT || '8080'; - -const express = require('express'); -const axios = require('axios'); - -const app = express(); - -app.get('/', (req, res) => { - axios - .get(`http://localhost:${PORT}/middle-tier`) - .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/middle-tier', (req, res) => { - axios - .get(`http://localhost:${PORT}/backend`) - .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/backend', (req, res) => { - res.send('Hello from the backend'); -}); - -app.listen(parseInt(PORT, 10), () => { - console.log(`Listening for requests on http://localhost:${PORT}`); -}); diff --git a/getting-started/traced-example/package.json b/getting-started/traced-example/package.json deleted file mode 100644 index b51de03f72c..00000000000 --- a/getting-started/traced-example/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@opentelemetry/getting-started-traced-example", - "version": "0.25.0", - "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", - "main": "app.js", - "scripts": { - "start": "node -r ./tracing.js app.js" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/exporter-zipkin": "0.25.0", - "@opentelemetry/instrumentation-express": "^0.24.0", - "@opentelemetry/instrumentation-http": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", - "@opentelemetry/sdk-trace-node": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "axios": "^0.21.0", - "express": "^4.17.1" - } -} diff --git a/getting-started/traced-example/tracing.js b/getting-started/traced-example/tracing.js deleted file mode 100644 index ae6b88b015d..00000000000 --- a/getting-started/traced-example/tracing.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node'); -const { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base'); -const { Resource } = require('@opentelemetry/resources'); -const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions'); -const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin'); -const { registerInstrumentations } = require('@opentelemetry/instrumentation'); -const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express'); -const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); - -const provider = new NodeTracerProvider({ - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'getting-started', - }), -}); - -provider.addSpanProcessor( - new SimpleSpanProcessor( - new ZipkinExporter({ - // If you are running your tracing backend on another host, - // you can point to it using the `url` parameter of the - // exporter config. - }), - ), -); - -provider.register(); - -// load old default plugins -registerInstrumentations({ - instrumentations: [ - new ExpressInstrumentation(), - new HttpInstrumentation(), - ], -}); - -console.log('tracing initialized'); diff --git a/getting-started/ts-example/.eslintrc b/getting-started/ts-example/.eslintrc deleted file mode 100644 index 6564779085e..00000000000 --- a/getting-started/ts-example/.eslintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "plugins": ["@typescript-eslint", "node"], - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], - "parser": "@typescript-eslint/parser", - "rules": { - "@typescript-eslint/no-var-requires": 0, - "import/prefer-default-export": "off", - "import/extensions": [ - "error", - "ignorePackages", - { - "": "never" - } - ] - } -} diff --git a/getting-started/ts-example/README.md b/getting-started/ts-example/README.md deleted file mode 100644 index 49da9bc4a51..00000000000 --- a/getting-started/ts-example/README.md +++ /dev/null @@ -1,389 +0,0 @@ -# Getting Started with OpenTelemetry JS (TypeScript) - -This TypeScript guide will walk you through the setup and configuration process for a tracing backend (in this case [Zipkin](https://zipkin.io), but [Jaeger](https://www.jaegertracing.io) would be simple to use as well), a metrics backend like [Prometheus](https://prometheus.io), and auto-instrumentation of NodeJS. [You can find the guide for JavaScript here](../README.md#getting-started-with-opentelemetry-js). - -- [Getting Started with OpenTelemetry JS (TypeScript)](#getting-started-with-opentelemetry-js-typescript) - - [Tracing Your Application with OpenTelemetry](#tracing-your-application-with-opentelemetry) - - [Setting up a Tracing Backend](#setting-up-a-tracing-backend) - - [Trace Your NodeJS Application](#trace-your-nodejs-application) - - [Install the required OpenTelemetry libraries](#install-the-required-opentelemetry-libraries) - - [Initialize a global tracer](#initialize-a-global-tracer) - - [Initialize and Register a Trace Exporter](#initialize-and-register-a-trace-exporter) - - [Collect Metrics Using OpenTelemetry](#collect-metrics-using-opentelemetry) - - [Set up a Metrics Backend](#set-up-a-metrics-backend) - - [Monitor Your NodeJS Application](#monitor-your-nodejs-application) - - [Install the required OpenTelemetry metrics libraries](#install-the-required-opentelemetry-sdk-metrics-base-libraries) - - [Initialize a meter and collect metrics](#initialize-a-meter-and-collect-metrics) - - [Initialize and register a metrics exporter](#initialize-and-register-a-metrics-exporter) - -## Tracing Your Application with OpenTelemetry - -([link to JavaScript version](../README.md#tracing-your-application-with-opentelemetry)) - -This guide assumes you are going to be using Zipkin as your tracing backend, but modifying it for Jaeger should be straightforward. - -An example application which can be used with this guide can be found in the [example directory](example). You can see what it looks like with tracing enabled in the [traced-example directory](traced-example). - -### Setting up a Tracing Backend - -([link to JavaScript version](../README.md#setting-up-a-tracing-backend)) - -The first thing we will need before we can start collecting traces is a tracing backend like Zipkin that we can export traces to. If you already have a supported tracing backend (Zipkin or Jaeger), you can skip this step. If not, you will need to run one. - -In order to set up Zipkin as quickly as possible, run the latest [Docker Zipkin](https://github.com/openzipkin/docker-zipkin) container, exposing port `9411`. If you can’t run Docker containers, you will need to download and run Zipkin by following the Zipkin [quickstart guide](https://zipkin.io/pages/quickstart.html). - -```sh -docker run --rm -d -p 9411:9411 --name zipkin openzipkin/zipkin -``` - -Browse to to ensure that you can see the Zipkin UI. - -

- -### Trace Your NodeJS Application - -([link to JavaScript version](../README.md#trace-your-nodejs-application)) - -This guide uses the example application provided in the [example directory](example) but the steps to instrument your own application should be broadly the same. Here is an overview of what we will be doing. - -1. Install the required OpenTelemetry libraries -2. Initialize a global tracer -3. Initialize and register a trace exporter - -#### Install the required OpenTelemetry libraries - -([link to JavaScript version](../README.md#install-the-required-opentelemetry-libraries)) - -To create traces on NodeJS, you will need `@opentelemetry/sdk-trace-node`, `@opentelemetry/core`, and any plugins required by your application such as gRPC, or HTTP. If you are using the example application, you will need to install `@opentelemetry/plugin-http`. - -```sh -$ npm install \ - @opentelemetry/core \ - @opentelemetry/sdk-trace-node \ - @opentelemetry/instrumentation \ - @opentelemetry/instrumentation-http \ - @opentelemetry/instrumentation-express -``` - -#### Initialize a global tracer - -([link to JavaScript version](../README.md#initialize-a-global-tracer)) - -All tracing initialization should happen before your application’s code runs. The easiest way to do this is to initialize tracing in a separate file that is required using node’s `-r` option before application code runs. - -Create a file named `tracing.ts` and add the following code: - -```typescript -import { LogLevel } from '@opentelemetry/core'; -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; -import { registerInstrumentations } from '@opentelemetry/instrumentation'; -import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; -import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; - - -const provider: NodeTracerProvider = new NodeTracerProvider({ - logLevel: LogLevel.ERROR, -}); - -provider.register(); - -registerInstrumentations({ - instrumentations: [ - new ExpressInstrumentation(), - new HttpInstrumentation(), - ], -}); - -``` - -If you run your application now with `ts-node -r ./tracing.ts app.ts`, your application will create and propagate traces over HTTP. If an already instrumented service that supports [Trace Context](https://www.w3.org/TR/trace-context/) headers calls your application using HTTP, and you call another application using HTTP, the Trace Context headers will be correctly propagated. - -If you wish to see a completed trace, however, there is one more step. You must register an exporter to send traces to a tracing backend. - -#### Initialize and Register a Trace Exporter - -([link to JavaScript version](../README.md#initialize-and-register-a-trace-exporter)) - -This guide uses the Zipkin tracing backend, but if you are using another backend like [Jaeger](https://www.jaegertracing.io), this is where you would make your change. - -To export traces, we will need a few more dependencies. Install them with the following command: - -```sh -$ npm install \ - @opentelemetry/sdk-trace-base \ - @opentelemetry/exporter-zipkin - -$ # for jaeger you would run this command: -$ # npm install @opentelemetry/exporter-jaeger -``` - -After these dependencies are installed, we will need to initialize and register them. Modify `tracing.ts` so that it matches the following code snippet, replacing the service name `"getting-started"` with your own service name if you wish. - -```typescript -import { LogLevel } from '@opentelemetry/core'; -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; - -import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; -import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; -// For Jaeger, use the following line instead: -// import { JaegerExporter } from '@opentelemetry/exporter-jaeger'; - -import { registerInstrumentations } from '@opentelemetry/instrumentation'; -import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; -import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; - -const provider: NodeTracerProvider = new NodeTracerProvider({ - logLevel: LogLevel.ERROR, - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'getting-started', - }), -}); - -provider.addSpanProcessor( - new SimpleSpanProcessor( - new ZipkinExporter({ - // For Jaeger, use the following line instead: - // new JaegerExporter({ - // If you are running your tracing backend on another host, - // you can point to it using the `url` parameter of the - // exporter config. - }), - ), -); - -provider.register(); - -registerInstrumentations({ - instrumentations: [ - new ExpressInstrumentation(), - new HttpInstrumentation(), - ], -}); - - -console.log('tracing initialized'); -``` - -Now if you run your application with the `tracing.ts` file loaded, and you send requests to your application over HTTP (in the sample application just browse to you will see traces exported to your tracing backend that look like this: - -```sh -ts-node -r ./tracing.ts app.ts -``` - -

- -**Note:** Some spans appear to be duplicated, but they are not. This is because the sample application is both the client and the server for these requests. You see one span that is the client side request timing, and one span that is the server side request timing. Anywhere they don’t overlap is network time. - -## Collect Metrics Using OpenTelemetry - -([link to JavaScript version](../README.md#collect-metrics-using-opentelemetry)) - -This guide assumes you are going to be using Prometheus as your metrics backend. It is currently the only metrics backend supported by OpenTelemetry JS. - -**Note**: This section is a work in progress - -### Set up a Metrics Backend - -([link to JavaScript version](../README.md#set-up-a-metrics-backend)) - -Now that we have end-to-end traces, we will collect and export some basic metrics. - -Currently, the only supported metrics backend is [Prometheus](https://prometheus.io). Head to the [Prometheus download page](https://prometheus.io/download/) and download the latest release of Prometheus for your operating system. - -Open a command line and `cd` into the directory where you downloaded the Prometheus tarball. Untar it and change into the newly created directory. - -```sh -$ cd Downloads - -$ # Replace the file name below with your downloaded tarball -$ tar xvfz prometheus-2.20.1.darwin-amd64.tar - -$ # Replace the dir below with your created directory -$ cd prometheus-2.20.1.darwin-amd64 - -$ ls -LICENSE console_libraries data prometheus.yml tsdb -NOTICE consoles prometheus promtool -``` - -The created directory should have a file named `prometheus.yml`. This is the file used to configure Prometheus. For now, just make sure Prometheus starts by running the `./prometheus` binary in the folder and browse to . - -```sh -$ ./prometheus -# some output elided for brevity -msg="Starting Prometheus" version="(version=2.14.0, branch=HEAD, revision=edeb7a44cbf745f1d8be4ea6f215e79e651bfe19)" -# some output elided for brevity -level=info ts=2019-11-21T20:39:40.262Z caller=web.go:496 component=web msg="Start listening for connections" address=0.0.0.0:9090 -# some output elided for brevity -level=info ts=2019-11-21T20:39:40.383Z caller=main.go:626 msg="Server is ready to receive web requests." -``` - -

- -Once we know prometheus starts, replace the contents of `prometheus.yml` with the following: - -```yaml -# my global config -global: - scrape_interval: 15s # Set the scrape interval to every 15 seconds. - -scrape_configs: - - job_name: 'opentelemetry' - # metrics_path defaults to '/metrics' - # scheme defaults to 'http'. - static_configs: - - targets: ['localhost:9464'] -``` - -### Monitor Your NodeJS Application - -([link to JavaScript version](../README.md#monitor-your-nodejs-application)) - -An example application which can be used with this guide can be found at in the [example directory](example). You can see what it looks like with metric monitoring enabled in the [monitored-example directory](monitored-example). - -1. Install the required OpenTelemetry metrics libraries -2. Initialize a meter and collect metrics -3. Initialize and register a metrics exporter - -#### Install the required OpenTelemetry metrics libraries - -([link to JavaScript version](../README.md#install-the-required-opentelemetry-sdk-metrics-base-libraries)) - -To create metrics on NodeJS, you will need `@opentelemetry/sdk-metrics-base`. - -```sh -npm install @opentelemetry/sdk-metrics-base -``` - -#### Initialize a meter and collect metrics - -([link to JavaScript version](../README.md#initialize-a-meter-and-collect-metrics)) - -In order to create and monitor metrics, we will need a `Meter`. In OpenTelemetry, a `Meter` is the mechanism used to create and manage metrics, labels, and metric exporters. - -Create a file named `monitoring.ts` and add the following code: - -```typescript -import { MeterProvider } from '@opentelemetry/sdk-metrics-base'; - -const meter = new MeterProvider().getMeter('your-meter-name'); -``` - -Now, you can require this file from your application code and use the `Meter` to create and manage metrics. The simplest of these metrics is a counter. Let's create and export from our `monitoring.ts` file a middleware function that express can use to count all requests by route. Modify the `monitoring.ts` file so that it looks like this: - -```typescript -import { MeterProvider } from '@opentelemetry/sdk-metrics-base'; -import { Request, Response, NextFunction } from 'express'; - -const meter = new MeterProvider().getMeter('your-meter-name'); - -const requestCount = meter.createCounter('requests', { - description: 'Count all incoming requests', -}); - -const handles = new Map(); - -export const countAllRequests = () => { - return (req: Request, _res: Response, next: NextFunction) => { - if (!handles.has(req.path)) { - const labels = { route: req.path }; - const handle = requestCount.bind(labels); - handles.set(req.path, handle); - } - - handles.get(req.path).add(1); - next(); - }; -}; -``` - -Now let's import and use this middleware in our application code: - -```typescript -import { countAllRequests } from './monitoring'; -const app = express(); -app.use(countAllRequests()); -``` - -Now, when we make requests to our service our meter will count all requests. - -**Note**: Creating a new `labelSet` and `handle` on every request is not ideal as creating the `labelSet` can often be an expensive operation. This is why handles are created and stored in a `Map` according to the route key. - -#### Initialize and register a metrics exporter - -([link to JavaScript version](../README.md#initialize-and-register-a-metrics-exporter)) - -Counting metrics is only useful if we can export them somewhere that we can see them. For this, we're going to use prometheus. Creating and registering a metrics exporter is much like the tracing exporter above. First we will need to install the prometheus exporter. - -```sh -npm install @opentelemetry/exporter-prometheus -``` - -Next, modify your `monitoring.ts` file to look like this: - -```typescript -import { Request, Response, NextFunction } from 'express'; -import { MeterProvider } from '@opentelemetry/sdk-metrics-base'; -import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; - -const prometheusPort = PrometheusExporter.DEFAULT_OPTIONS.port; -const prometheusEndpoint = PrometheusExporter.DEFAULT_OPTIONS.endpoint; - -const exporter = new PrometheusExporter( - { - startServer: true, - }, - () => { - console.log( - `prometheus scrape endpoint: http://localhost:${prometheusPort}${prometheusEndpoint}`, - ); - }, -); - -const meter = new MeterProvider({ - exporter, - interval: 1000, -}).getMeter('your-meter-name'); - -const requestCount = meter.createCounter('requests', { - description: 'Count all incoming requests', -}); - -const handles = new Map(); - -export const countAllRequests = () => { - return (req: Request, _res: Response, next: NextFunction) => { - if (!handles.has(req.path)) { - const labels = { route: req.path }; - const handle = requestCount.bind(labels); - handles.set(req.path, handle); - } - - handles.get(req.path).add(1); - next(); - }; -}; -``` - -Ensure prometheus is running by running the `prometheus` binary from earlier and start your application. - -```sh -$ ts-node app.ts -prometheus scrape endpoint: http://localhost:9464/metrics -Listening for requests on http://localhost:8080 -``` - -Now, each time you browse to you should see "Hello from the backend" in your browser and your metrics in prometheus should update. You can verify the current metrics by browsing to , which should look like this: - -```sh -# HELP requests Count all incoming requests -# TYPE requests counter -requests{route="/"} 1 -requests{route="/middle-tier"} 2 -requests{route="/backend"} 4 -``` - -You should also be able to see gathered metrics in your prometheus web UI. - -

diff --git a/getting-started/ts-example/example/app.ts b/getting-started/ts-example/example/app.ts deleted file mode 100644 index a252668ebef..00000000000 --- a/getting-started/ts-example/example/app.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as express from 'express'; -import axios from 'axios'; - -const PORT: string = process.env.PORT || '8080'; - -const app = express(); - -app.get('/', (req, res) => { - axios - .get(`http://localhost:${PORT}/middle-tier`) - .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then((response) => { - res.send(response.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/middle-tier', (req, res) => { - axios - .get(`http://localhost:${PORT}/backend`) - .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then((response) => { - res.send(response.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/backend', (req, res) => { - res.send('Hello from the backend'); -}); - -app.listen(parseInt(PORT, 10), () => { - console.log(`Listening for requests on http://localhost:${PORT}`); -}); diff --git a/getting-started/ts-example/example/package.json b/getting-started/ts-example/example/package.json deleted file mode 100644 index 08ab0b4634b..00000000000 --- a/getting-started/ts-example/example/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@opentelemetry/getting-started-ts-example", - "version": "0.25.0", - "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", - "main": "app.ts", - "scripts": { - "start": "ts-node app.ts" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "devDependencies": { - "@types/express": "4.17.13", - "@types/node": "14.17.11", - "ts-node": "10.2.1" - }, - "dependencies": { - "axios": "^0.21.0", - "express": "^4.17.1" - } -} diff --git a/getting-started/ts-example/monitored-example/app.ts b/getting-started/ts-example/monitored-example/app.ts deleted file mode 100644 index 9307eba1ac2..00000000000 --- a/getting-started/ts-example/monitored-example/app.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as express from 'express'; -import axios from 'axios'; - -import { countAllRequests } from './monitoring'; - -const PORT: string = process.env.PORT || '8080'; -const app = express(); -app.use(countAllRequests()); - -app.get('/', (req, res) => { - axios - .get(`http://localhost:${PORT}/middle-tier`) - .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/middle-tier', (req, res) => { - axios - .get(`http://localhost:${PORT}/backend`) - .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/backend', (req, res) => { - res.send('Hello from the backend'); -}); - -app.listen(parseInt(PORT, 10), () => { - console.log(`Listening for requests on http://localhost:${PORT}`); -}); diff --git a/getting-started/ts-example/monitored-example/monitoring.ts b/getting-started/ts-example/monitored-example/monitoring.ts deleted file mode 100644 index 5e933e4a937..00000000000 --- a/getting-started/ts-example/monitored-example/monitoring.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import { MeterProvider } from '@opentelemetry/sdk-metrics-base'; -import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; - -const prometheusPort = PrometheusExporter.DEFAULT_OPTIONS.port; -const prometheusEndpoint = PrometheusExporter.DEFAULT_OPTIONS.endpoint; - -const exporter = new PrometheusExporter( - { - startServer: true, - }, - () => { - console.log( - `prometheus scrape endpoint: http://localhost:${prometheusPort}${prometheusEndpoint}`, - ); - }, -); - -const meter = new MeterProvider({ - exporter, - interval: 1000, -}).getMeter('your-meter-name'); - -const requestCount = meter.createCounter('requests', { - description: 'Count all incoming requests', -}); - -const handles = new Map(); - -export const countAllRequests = () => (req: Request, _res: Response, next: NextFunction): void => { - if (!handles.has(req.path)) { - const labels = { route: req.path }; - const handle = requestCount.bind(labels); - handles.set(req.path, handle); - } - - handles.get(req.path).add(1); - next(); -}; diff --git a/getting-started/ts-example/monitored-example/package.json b/getting-started/ts-example/monitored-example/package.json deleted file mode 100644 index 3e4138059ea..00000000000 --- a/getting-started/ts-example/monitored-example/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@opentelemetry/getting-started-monitored-ts-example", - "version": "0.25.0", - "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", - "main": "app.ts", - "scripts": { - "start": "ts-node app.ts" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "devDependencies": { - "@types/express": "4.17.13", - "@types/node": "14.17.11", - "ts-node": "10.2.1" - }, - "dependencies": { - "@opentelemetry/exporter-prometheus": "0.25.0", - "@opentelemetry/sdk-metrics-base": "0.25.0", - "axios": "^0.21.0", - "express": "^4.17.1" - } -} diff --git a/getting-started/ts-example/traced-example/app.ts b/getting-started/ts-example/traced-example/app.ts deleted file mode 100644 index 58fb8ab5890..00000000000 --- a/getting-started/ts-example/traced-example/app.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as express from 'express'; -import axios from 'axios'; - -const PORT: string = process.env.PORT || '8080'; - -const app = express(); - -app.get('/', (req, res) => { - axios - .get(`http://localhost:${PORT}/middle-tier`) - .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/middle-tier', (req, res) => { - axios - .get(`http://localhost:${PORT}/backend`) - .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then((result) => { - res.send(result.data); - }) - .catch((err) => { - console.error(err); - res.status(500).send(); - }); -}); - -app.get('/backend', (req, res) => { - res.send('Hello from the backend'); -}); - -app.listen(parseInt(PORT, 10), () => { - console.log(`Listening for requests on http://localhost:${PORT}`); -}); diff --git a/getting-started/ts-example/traced-example/package.json b/getting-started/ts-example/traced-example/package.json deleted file mode 100644 index 3739e79b062..00000000000 --- a/getting-started/ts-example/traced-example/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@opentelemetry/getting-started-traced-ts-example", - "version": "0.25.0", - "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", - "main": "app.ts", - "scripts": { - "start": "ts-node app.ts" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "devDependencies": { - "@types/express": "4.17.13", - "@types/node": "14.17.11", - "ts-node": "10.2.1" - }, - "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/exporter-zipkin": "0.25.0", - "@opentelemetry/instrumentation": "0.25.0", - "@opentelemetry/instrumentation-express": "^0.24.0", - "@opentelemetry/sdk-trace-node": "0.25.0", - "@opentelemetry/instrumentation-http": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "axios": "^0.21.0", - "express": "^4.17.1" - } -} diff --git a/getting-started/ts-example/traced-example/tracing.ts b/getting-started/ts-example/traced-example/tracing.ts deleted file mode 100644 index 4426da25f98..00000000000 --- a/getting-started/ts-example/traced-example/tracing.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; - -import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; -import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; - -const { Resource } = require('@opentelemetry/resources'); -const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions'); -// For Jaeger, use the following line instead: -// import { JaegerExporter } from '@opentelemetry/exporter-jaeger'; - -const { registerInstrumentations } = require('@opentelemetry/instrumentation'); -const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express'); -const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); - -const provider: NodeTracerProvider = new NodeTracerProvider({ - resource: new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'getting-started', - }), -}); -provider.addSpanProcessor( - new SimpleSpanProcessor( - new ZipkinExporter({ - // For Jaeger, use the following line instead: - // new JaegerExporter({ - // If you are running your tracing backend on another host, - // you can point to it using the `url` parameter of the - // exporter config. - }), - ), -); -provider.register(); - -registerInstrumentations({ - instrumentations: [ - new ExpressInstrumentation(), - new HttpInstrumentation(), - ], -}); - -console.log('tracing initialized'); diff --git a/integration-tests/propagation-validation-server/package.json b/integration-tests/propagation-validation-server/package.json index 47e540e6c5e..7c11eb10b11 100644 --- a/integration-tests/propagation-validation-server/package.json +++ b/integration-tests/propagation-validation-server/package.json @@ -1,6 +1,6 @@ { "name": "propagation-validation-server", - "version": "0.25.0", + "version": "1.0.0", "description": "server for w3c tests", "main": "validation_server.js", "private": true, @@ -12,9 +12,9 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/context-async-hooks": "1.0.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", "axios": "0.21.1", "body-parser": "1.19.0", "express": "4.17.1" diff --git a/lerna.json b/lerna.json index 5f3df4e8bd0..b530144ffcd 100644 --- a/lerna.json +++ b/lerna.json @@ -1,10 +1,9 @@ { "lerna": "3.13.4", - "version": "0.25.0", + "version": "1.0.0", "npmClient": "npm", "packages": [ "benchmark/*", - "backwards-compatability/*", "packages/*", "integration-tests/*" ] diff --git a/package.json b/package.json index 56a145db98c..702e0cde245 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,6 @@ "lint:fix:changed": "lerna run --concurrency 1 --stream lint:fix --since HEAD --exclude-dependents", "lint:examples": "eslint --no-error-on-unmatched-pattern ./examples/**/*.js", "lint:examples:fix": "eslint --no-error-on-unmatched-pattern ./examples/**/*.js --fix", - "lint:getting-started": "eslint --no-error-on-unmatched-pattern ./getting-started/**/*.{js,ts}", - "lint:getting-started:fix": "eslint --no-error-on-unmatched-pattern ./getting-started/**/*.{js,ts} --fix", "lint:markdown": "./node_modules/.bin/markdownlint $(git ls-files '*.md') -i ./CHANGELOG.md", "lint:markdown:fix": "./node_modules/.bin/markdownlint $(git ls-files '*.md') -i ./CHANGELOG.md --fix", "reset": "lerna clean -y && rm -rf node_modules && npm i && npm run compile && npm run lint:fix", @@ -52,8 +50,8 @@ "devDependencies": { "@commitlint/cli": "13.1.0", "@commitlint/config-conventional": "13.1.0", - "@typescript-eslint/eslint-plugin": "4.29.3", - "@typescript-eslint/parser": "4.29.3", + "@typescript-eslint/eslint-plugin": "5.0.0", + "@typescript-eslint/parser": "5.0.0", "beautify-benchmark": "0.2.4", "benchmark": "2.1.4", "eslint": "7.32.0", diff --git a/packages/opentelemetry-context-async-hooks/package.json b/packages/opentelemetry-context-async-hooks/package.json index f276c6dd191..67b4751d957 100644 --- a/packages/opentelemetry-context-async-hooks/package.json +++ b/packages/opentelemetry-context-async-hooks/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-async-hooks", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry AsyncHooks-based Context Manager", "main": "build/src/index.js", "types": "build/src/index.d.ts", diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json index 49b8f5be455..94c21e2a089 100644 --- a/packages/opentelemetry-context-zone-peer-dep/package.json +++ b/packages/opentelemetry-context-zone-peer-dep/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-zone-peer-dep", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Context Zone with peer dependency for zone.js", "main": "build/src/index.js", "module": "build/esm/index.js", diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json index d1521bc420f..f844a972d53 100644 --- a/packages/opentelemetry-context-zone/package.json +++ b/packages/opentelemetry-context-zone/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-zone", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Context Zone", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -68,7 +68,7 @@ "webpack-merge": "5.8.0" }, "dependencies": { - "@opentelemetry/context-zone-peer-dep": "0.25.0", + "@opentelemetry/context-zone-peer-dep": "1.0.0", "zone.js": "^0.11.0" }, "sideEffects": true diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json index 38b843ddd12..573ea927be4 100644 --- a/packages/opentelemetry-core/package.json +++ b/packages/opentelemetry-core/package.json @@ -1,7 +1,7 @@ { "name": "@opentelemetry/core", - "version": "0.25.0", - "description": "OpenTelemetry Core provides default and no-op implementations of the OpenTelemetry types for trace and metrics", + "version": "1.0.0", + "description": "OpenTelemetry Core provides constants and utilities shared by all OpenTelemetry SDK packages.", "main": "build/src/index.js", "module": "build/esm/index.js", "browser": { @@ -60,7 +60,6 @@ "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", "@types/node": "14.17.11", - "@types/semver": "7.3.8", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "codecov": "3.8.3", @@ -71,6 +70,7 @@ "karma-mocha": "2.0.1", "karma-spec-reporter": "0.0.32", "karma-webpack": "4.0.2", + "lerna": "3.22.1", "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", @@ -84,7 +84,6 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/semantic-conventions": "0.25.0", - "semver": "^7.3.5" + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/packages/opentelemetry-core/src/index.ts b/packages/opentelemetry-core/src/index.ts index 44c95f2fe96..ea9e2d2a379 100644 --- a/packages/opentelemetry-core/src/index.ts +++ b/packages/opentelemetry-core/src/index.ts @@ -35,6 +35,7 @@ export * from './trace/sampler/TraceIdRatioBasedSampler'; export * from './trace/suppress-tracing'; export * from './trace/TraceState'; export * from './utils/environment'; +export * from './utils/merge'; export * from './utils/sampling'; export * from './utils/url'; export * from './utils/wrap'; diff --git a/packages/opentelemetry-core/src/utils/lodash.merge.ts b/packages/opentelemetry-core/src/utils/lodash.merge.ts new file mode 100644 index 00000000000..0c55c7aa479 --- /dev/null +++ b/packages/opentelemetry-core/src/utils/lodash.merge.ts @@ -0,0 +1,174 @@ +/* + * 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. + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/** + * based on lodash in order to support esm builds without esModuleInterop. + * lodash is using MIT License. + **/ + +const objectTag = '[object Object]'; +const nullTag = '[object Null]'; +const undefinedTag = '[object Undefined]'; +const funcProto = Function.prototype; +const funcToString = funcProto.toString; +const objectCtorString = funcToString.call(Object); +const getPrototype = overArg(Object.getPrototypeOf, Object); +const objectProto = Object.prototype; +const hasOwnProperty = objectProto.hasOwnProperty; +const symToStringTag = Symbol ? Symbol.toStringTag : undefined; +const nativeObjectToString = objectProto.toString; + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func: Function, transform: any): any { + return function(arg: any) { + return func(transform(arg)); + }; +} + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +export function isPlainObject(value: any) { + if (!isObjectLike(value) || baseGetTag(value) !== objectTag) { + return false; + } + const proto = getPrototype(value); + if (proto === null) { + return true; + } + const Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) === objectCtorString; +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value: any) { + return value != null && typeof value == 'object'; +} + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value: any) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); +} + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value: any) { + const isOwn = hasOwnProperty.call(value, symToStringTag as any), + tag = value[symToStringTag as any]; + let unmasked = false; + + try { + value[symToStringTag as any] = undefined; + unmasked = true; + } catch (e) { + // silence + } + + const result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag as any] = tag; + } else { + delete value[symToStringTag as any]; + } + } + return result; +} + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value: any) { + return nativeObjectToString.call(value); +} diff --git a/packages/opentelemetry-core/src/utils/merge.ts b/packages/opentelemetry-core/src/utils/merge.ts new file mode 100644 index 00000000000..ae01a953a82 --- /dev/null +++ b/packages/opentelemetry-core/src/utils/merge.ts @@ -0,0 +1,189 @@ +/* + * 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. + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { isPlainObject } from './lodash.merge'; + +const MAX_LEVEL = 20; + +interface ObjectInto { + obj: any; + key: string; +} + +/** + * Merges objects together + * @param args - objects / values to be merged + */ +export function merge(...args: any[]): any { + let result: any = args.shift(); + const objects: WeakMap | undefined = new WeakMap(); + while (args.length > 0) { + result = mergeTwoObjects(result, args.shift(), 0, objects); + } + + return result; +} + +function takeValue(value: any): any { + if (isArray(value)) { + return value.slice(); + } + return value; +} + +/** + * Merges two objects + * @param one - first object + * @param two - second object + * @param level - current deep level + * @param objects - objects holder that has been already referenced - to prevent + * cyclic dependency + */ +function mergeTwoObjects( + one: any, + two: any, + level = 0, + objects: WeakMap, +): any { + let result: any; + if (level > MAX_LEVEL) { + return undefined; + } + level++; + if (isPrimitive(one) || isPrimitive(two) || isFunction(two)) { + result = takeValue(two); + } else if (isArray(one)) { + result = one.slice(); + if (isArray(two)) { + for (let i = 0, j = two.length; i < j; i++) { + result.push(takeValue(two[i])); + } + } else if (isObject(two)) { + const keys = Object.keys(two); + for (let i = 0, j = keys.length; i < j; i++) { + const key = keys[i]; + result[key] = takeValue(two[key]); + } + } + } else if (isObject(one)) { + if (isObject(two)) { + if (!shouldMerge(one, two)) { + return two; + } + result = Object.assign({}, one); + const keys = Object.keys(two); + + for (let i = 0, j = keys.length; i < j; i++) { + const key = keys[i]; + const twoValue = two[key]; + + if (isPrimitive(twoValue)) { + if (typeof twoValue === 'undefined') { + delete result[key]; + } else { + // result[key] = takeValue(twoValue); + result[key] = twoValue; + } + } else { + const obj1 = result[key]; + const obj2 = twoValue; + + if ( + wasObjectReferenced(one, key, objects) || + wasObjectReferenced(two, key, objects) + ) { + delete result[key]; + } else { + + if (isObject(obj1) && isObject(obj2)) { + const arr1 = objects.get(obj1) || []; + const arr2 = objects.get(obj2) || []; + arr1.push({ obj: one, key }); + arr2.push({ obj: two, key }); + objects.set(obj1, arr1); + objects.set(obj2, arr2); + } + + result[key] = mergeTwoObjects( + result[key], + twoValue, + level, + objects + ); + } + } + } + } else { + result = two; + } + } + + return result; +} + +/** + * Function to check if object has been already reference + * @param obj + * @param key + * @param objects + */ +function wasObjectReferenced( + obj: any, + key: string, + objects: WeakMap, +): boolean { + const arr = objects.get(obj[key]) || []; + for (let i = 0, j = arr.length; i < j; i++) { + const info = arr[i]; + if (info.key === key && info.obj === obj) { + return true; + } + } + return false; +} + +function isArray(value: any): boolean { + return Array.isArray(value); +} + +function isFunction(value: any): boolean { + return typeof value === 'function'; +} + +function isObject(value: any): boolean { + return !isPrimitive(value) && !isArray(value) && !isFunction(value) && typeof value === 'object'; +} + +function isPrimitive(value: any): boolean { + return typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' || + typeof value === 'undefined' || + value instanceof Date || + value instanceof RegExp || + value === null; +} + +function shouldMerge(one: any, two: any): boolean { + if (!isPlainObject(one) || !isPlainObject(two)) { + return false; + } + + return true; +} + diff --git a/packages/opentelemetry-core/test/utils/merge.test.ts b/packages/opentelemetry-core/test/utils/merge.test.ts new file mode 100644 index 00000000000..d008ce2b218 --- /dev/null +++ b/packages/opentelemetry-core/test/utils/merge.test.ts @@ -0,0 +1,387 @@ +/* + * 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 assert from 'assert'; +import { merge } from '../../src/utils/merge'; + +const tests: TestResult[] = []; + +tests.push({ + inputs: ['1', '2'], + result: '2', + desc: 'two strings' +}); +tests.push({ + inputs: [1, 2], + result: 2, + desc: 'two numbers' +}); +tests.push({ + inputs: [true, false], + result: false, + desc: 'two booleans' +}); +tests.push({ + inputs: [false, true], + result: true, + desc: 'two booleans case 2' +}); +tests.push({ + inputs: [undefined, undefined], + result: undefined, + desc: 'two undefined' +}); +tests.push({ + inputs: [null, null], + result: null, + desc: 'two nulls' +}); +tests.push({ + inputs: ['1', 1], + result: 1, + desc: 'string & number' +}); +tests.push({ + inputs: ['1', false], + result: false, + desc: 'string & boolean' +}); +tests.push({ + inputs: ['1', undefined], + result: undefined, + desc: 'string & undefined' +}); +tests.push({ + inputs: ['1', null], + result: null, + desc: 'string & null' +}); +tests.push({ + inputs: [3, '1'], + result: '1', + desc: 'number & string' +}); +tests.push({ + inputs: [3, false], + result: false, + desc: 'number & boolean' +}); +tests.push({ + inputs: [3, undefined], + result: undefined, + desc: 'number & undefined' +}); +tests.push({ + inputs: [3, null], + result: null, + desc: 'number & null' +}); +tests.push({ + inputs: [false, '3'], + result: '3', + desc: 'boolean & string' +}); +tests.push({ + inputs: [false, 3], + result: 3, + desc: 'boolean & number' +}); +tests.push({ + inputs: [false, undefined], + result: undefined, + desc: 'boolean & undefined' +}); +tests.push({ + inputs: [false, null], + result: null, + desc: 'boolean & null' +}); +tests.push({ + inputs: [undefined, '1'], + result: '1', + desc: 'undefined & string' +}); +tests.push({ + inputs: [undefined, 1], + result: 1, + desc: 'undefined & number' +}); +tests.push({ + inputs: [undefined, false], + result: false, + desc: 'undefined & boolean' +}); +tests.push({ + inputs: [undefined, null], + result: null, + desc: 'undefined & null' +}); +tests.push({ + inputs: [null, '1'], + result: '1', + desc: 'null & string' +}); +tests.push({ + inputs: [null, 1], + result: 1, + desc: 'null & number' +}); +tests.push({ + inputs: [null, false], + result: false, + desc: 'null & boolean' +}); +tests.push({ + inputs: [null, undefined], + result: undefined, + desc: 'null & undefined' +}); + +const date1 = new Date(327164400000); +const date2 = new Date(358700400000); +tests.push({ + inputs: [date1, date2], + result: date2, + desc: 'two dates' +}); + +tests.push({ + inputs: [/.+/g, /.a+/g], + result: /.a+/g, + desc: 'two regexp' +}); + +tests.push({ + inputs: [1, { a: 1 }], + result: { a: 1 }, + desc: 'primitive with object' +}); + +tests.push({ + inputs: [{ a: 1 }, 1], + result: 1, + desc: 'object with primitive' +}); + +const arrResult1: any = [1, 2, 3]; +arrResult1['foo'] = 1; +tests.push({ + inputs: [[1, 2, 3], { foo: 1 }], + result: arrResult1, + desc: 'array with object' +}); + +tests.push({ + inputs: [{ foo: 1 }, [1, 2, 3]], + result: [1, 2, 3], + desc: 'object with array' +}); + +tests.push({ + inputs: [{ a: 1, c: 1 }, { a: 2, b: 3 }], + result: { a: 2, b: 3, c: 1 }, + desc: 'two objects' +}); + +tests.push({ + inputs: [{ a: 1, c: 1 }, { a: 2, b: 3, c: { foo: 1 } }], + result: { a: 2, b: 3, c: { foo: 1 } }, + desc: 'two objects 2nd with nested' +}); + +tests.push({ + inputs: [ + { a: 1, c: { bar: 1, d: { bla: 2 } } }, + { a: 2, b: 3, c: { foo: 1 } } + ], + result: { a: 2, b: 3, c: { bar: 1, d: { bla: 2 }, foo: 1 } }, + desc: 'two objects with nested objects' +}); + +tests.push({ + inputs: [[1, 2, 3], [4, 5]], + result: [1, 2, 3, 4, 5], + desc: 'two arrays with numbers' +}); + +tests.push({ + inputs: [[1, 2, 3, { foo: 1 }], [4, 5, { foo: 2 }]], + result: [1, 2, 3, { foo: 1 }, 4, 5, { foo: 2 }], + desc: 'two arrays, with number and objects' +}); + +tests.push({ + inputs: [{ a: 1, c: 1 }, { a: 2, b: 3 }, { a: 3, c: 2, d: 1 }], + result: { a: 3, b: 3, c: 2, d: 1 }, + desc: 'three objects' +}); + +tests.push({ + inputs: [ + { a: 1, c: 1, foo: { bar1: 1 } }, + { a: 2, b: 3, foo: { bar1: 2 } }, + { a: 3, c: 2, d: 1, foo: { bar2: 1 } } + ], + result: { a: 3, b: 3, c: 2, d: 1, foo: { bar1: 2, bar2: 1 } }, + desc: 'three nested objects' +}); + +tests.push({ + inputs: [ + { a: 1, c: { bar: 1, d: { bla: 2 } } }, + { a: 2, b: 3, c: { foo: 1, bar: undefined } } + ], + result: { a: 2, b: 3, c: { d: { bla: 2 }, foo: 1 } }, + desc: 'two objects with nested objects and undefined' +}); + +class A { + constructor(private _name: string = 'foo') { + } + + getName() { + return this._name; + } +} + +class B extends A { + constructor(name = 'foo', private _ver = 1) { + super(name); + } + getVer(){ + return this._ver; + } +} + +const a = new A('foo'); +const b = new B('bar'); + +tests.push({ + inputs: [ + { a: 1, c: 1, foo: a, foo2: { a: 1 } }, + { a: 2, b: 3, foo: b, foo2: { b: 1, a: a } }, + ], + result: { a: 2, b: 3, c: 1, foo: b, foo2: {a: a, b: 1} }, + desc: 'two objects with nested objects and objects created from classes' +}); + +describe('merge', () => { + tests.forEach((test, index) => { + it(`should merge ${ test.desc }`, () => { + const result = merge(...test.inputs); + + assert.deepStrictEqual( + result, + test.result, + `test ${ index + 1 } '${ test.desc }' failed` + ); + }); + }); + + it('should create a shallow copy when merging plain objects', () => { + const a = { a: 1, c: 1, foo: { bar1: 1 } }; + const b = { b: 1, c: 2, foo: { bar2: 2 }, arr: [1, 2, 3] }; + + const result = merge(a, b); + a.a = 5; + b.b = 9; + b.arr.push(5); + + assert.deepStrictEqual( + result, + { a: 1, c: 2, foo: { bar1: 1, bar2: 2 }, b: 1, arr: [1, 2, 3] } + ); + }); + + it('should ignore cyclic reference', () => { + const a: any = { a: 1, c: 1, foo: { bar1: 1 } }; + a.f = a; + const b: any = { b: 1, c: 2, foo: { bar2: 2 }, arr: [1, 2, 3] }; + b.f = b; + + const result = merge(a, b); + assert.deepStrictEqual( + result, + { + a: 1, + c: 2, + foo: { bar1: 1, bar2: 2 }, + f: { a: 1, c: 2, b: 1, arr: [1, 2, 3] }, + b: 1, + arr: [1, 2, 3] + } + ); + }); + + it('should not fail for 1 argument', () => { + const result = merge(1); + assert.deepStrictEqual(result, 1); + }); + + it('should not fail for 0 arguments', () => { + const result = merge(); + assert.deepStrictEqual(result, undefined); + }); + + it('should merge function', () => { + const a = { + a: 1, b: 2 + }; + const b = { + a: 2, + c: function() { + return 'foo'; + }, + }; + const result = merge(a, b); + assert.deepStrictEqual(result, { + a: 2, b: 2, c: b.c + }); + }); + + it('should allow maximum of 20 levels deep', () => { + const a = {}; + const b = {}; + + function add(obj: any, added: any) { + obj.foo = added; + return obj.foo; + } + + let x = a; + let y = b; + for (let i = 0, j = 25; i < j; i++) { + const foo = { c: i + 1 }; + x = add(x, foo); + y = add(y, foo); + } + + const result = merge(a, b); + let check = result.foo; + let count = 0; + while (check.foo) { + count++; + check = check.foo; + } + assert.deepStrictEqual(count, 19); + }); + +}); + +interface TestResult { + desc: string; + inputs: any[]; + result: any; +} diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json index dd36ce26922..e2988c1869a 100644 --- a/packages/opentelemetry-exporter-jaeger/package.json +++ b/packages/opentelemetry-exporter-jaeger/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-jaeger", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Exporter Jaeger allows user to send collected traces to Jaeger", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -43,7 +43,7 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/resources": "0.25.0", + "@opentelemetry/resources": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -60,9 +60,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0", "jaeger-client": "^3.15.0" } } diff --git a/packages/opentelemetry-exporter-jaeger/src/jaeger.ts b/packages/opentelemetry-exporter-jaeger/src/jaeger.ts index 614871d0198..319d99ce377 100644 --- a/packages/opentelemetry-exporter-jaeger/src/jaeger.ts +++ b/packages/opentelemetry-exporter-jaeger/src/jaeger.ts @@ -124,7 +124,7 @@ export class JaegerExporter implements SpanExporter { if (done) return done({ code: ExportResultCode.FAILED, error }); } } - diag.debug('successful append for : %s', thriftSpan.length); + diag.debug(`successful append for : ${thriftSpan.length}`); // Flush all spans on each export. No-op if span buffer is empty await this._flush(); @@ -177,7 +177,7 @@ export class JaegerExporter implements SpanExporter { if (err) { return reject(new Error(err)); } - diag.debug('successful flush for %s spans', _count); + diag.debug(`successful flush for ${_count} spans`); resolve(); }); }); diff --git a/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json b/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json deleted file mode 100644 index 7a9bb54ea7d..00000000000 --- a/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../tsconfig.base.esm.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "build/esm", - "tsBuildInfoFile": "build/esm/tsconfig.esm.tsbuildinfo" - }, - "include": [ - "src/**/*.ts" - ], - "references": [ - { - "path": "../opentelemetry-core/tsconfig.esm.json" - }, - { - "path": "../opentelemetry-resources/tsconfig.esm.json" - }, - { - "path": "../opentelemetry-sdk-trace-base/tsconfig.esm.json" - } - ] -} diff --git a/packages/opentelemetry-exporter-otlp-http/tsconfig.json b/packages/opentelemetry-exporter-otlp-http/tsconfig.json deleted file mode 100644 index 1d7ba827ac5..00000000000 --- a/packages/opentelemetry-exporter-otlp-http/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "build" - }, - "include": [ - "src/**/*.ts", - "test/**/*.ts" - ], - "references": [ - { - "path": "../opentelemetry-core" - }, - { - "path": "../opentelemetry-resources" - }, - { - "path": "../opentelemetry-sdk-trace-base" - } - ] -} diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 12342223f55..653dc8a3215 100644 --- a/packages/opentelemetry-exporter-zipkin/package.json +++ b/packages/opentelemetry-exporter-zipkin/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-zipkin", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Zipkin Exporter allows the user to send collected traces to Zipkin.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -84,9 +84,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/packages/opentelemetry-exporter-zipkin/src/platform/browser/util.ts b/packages/opentelemetry-exporter-zipkin/src/platform/browser/util.ts index 2b0ef76b2e7..222f138d070 100644 --- a/packages/opentelemetry-exporter-zipkin/src/platform/browser/util.ts +++ b/packages/opentelemetry-exporter-zipkin/src/platform/browser/util.ts @@ -103,7 +103,7 @@ function sendWithXhr( xhr.onreadystatechange = () => { if (xhr.readyState === XMLHttpRequest.DONE) { const statusCode = xhr.status || 0; - diag.debug('Zipkin response status code: %d, body: %s', statusCode, data); + diag.debug(`Zipkin response status code: ${statusCode}, body: ${data}`); if (xhr.status >= 200 && xhr.status < 400) { return done({ code: ExportResultCode.SUCCESS }); @@ -124,6 +124,6 @@ function sendWithXhr( }; // Issue request to remote service - diag.debug('Zipkin request payload: %s', data); + diag.debug(`Zipkin request payload: ${data}`); xhr.send(data); } diff --git a/packages/opentelemetry-exporter-zipkin/src/platform/node/util.ts b/packages/opentelemetry-exporter-zipkin/src/platform/node/util.ts index 1d19b8dd3d5..ca0af75886c 100644 --- a/packages/opentelemetry-exporter-zipkin/src/platform/node/util.ts +++ b/packages/opentelemetry-exporter-zipkin/src/platform/node/util.ts @@ -61,11 +61,7 @@ export function prepareSend(urlStr: string, headers?: Record): z }); res.on('end', () => { const statusCode = res.statusCode || 0; - diag.debug( - 'Zipkin response status code: %d, body: %s', - statusCode, - rawData - ); + diag.debug(`Zipkin response status code: ${statusCode}, body: ${rawData}`); // Consider 2xx and 3xx as success. if (statusCode < 400) { @@ -91,7 +87,7 @@ export function prepareSend(urlStr: string, headers?: Record): z // Issue request to remote service const payload = JSON.stringify(zipkinSpans); - diag.debug('Zipkin request payload: %s', payload); + diag.debug(`Zipkin request payload: ${payload}`); req.write(payload, 'utf8'); req.end(); }; diff --git a/packages/opentelemetry-exporter-zipkin/src/transform.ts b/packages/opentelemetry-exporter-zipkin/src/transform.ts index 64e4b48bbf6..9ffd48ecce7 100644 --- a/packages/opentelemetry-exporter-zipkin/src/transform.ts +++ b/packages/opentelemetry-exporter-zipkin/src/transform.ts @@ -29,8 +29,8 @@ const ZIPKIN_SPAN_KIND_MAPPING = { [api.SpanKind.INTERNAL]: undefined, }; -export const defaultStatusCodeTagName = 'ot.status_code'; -export const defaultStatusDescriptionTagName = 'ot.status_description'; +export const defaultStatusCodeTagName = 'otel.status_code'; +export const defaultStatusErrorTagName = 'error'; /** * Translate OpenTelemetry ReadableSpan to ZipkinSpan format @@ -40,7 +40,7 @@ export function toZipkinSpan( span: ReadableSpan, serviceName: string, statusCodeTagName: string, - statusDescriptionTagName: string + statusErrorTagName: string ): zipkinTypes.Span { const zipkinSpan: zipkinTypes.Span = { traceId: span.spanContext().traceId, @@ -55,7 +55,7 @@ export function toZipkinSpan( span.attributes, span.status, statusCodeTagName, - statusDescriptionTagName, + statusErrorTagName, span.resource ), annotations: span.events.length @@ -71,16 +71,18 @@ export function _toZipkinTags( attributes: api.SpanAttributes, status: api.SpanStatus, statusCodeTagName: string, - statusDescriptionTagName: string, + statusErrorTagName: string, resource: Resource ): zipkinTypes.Tags { const tags: { [key: string]: string } = {}; for (const key of Object.keys(attributes)) { tags[key] = String(attributes[key]); } - tags[statusCodeTagName] = String(api.SpanStatusCode[status.code]); - if (status.message) { - tags[statusDescriptionTagName] = status.message; + if (status.code !== api.SpanStatusCode.UNSET) { + tags[statusCodeTagName] = String(api.SpanStatusCode[status.code]); + } + if (status.code === api.SpanStatusCode.ERROR && status.message) { + tags[statusErrorTagName] = status.message; } Object.keys(resource.attributes).forEach( diff --git a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts index ef43cff0f89..614d728cb5b 100644 --- a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts +++ b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts @@ -22,7 +22,7 @@ import * as zipkinTypes from './types'; import { toZipkinSpan, defaultStatusCodeTagName, - defaultStatusDescriptionTagName, + defaultStatusErrorTagName, } from './transform'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; import { prepareGetHeaders } from './utils'; @@ -47,7 +47,7 @@ export class ZipkinExporter implements SpanExporter { this._serviceName = config.serviceName; this._statusCodeTagName = config.statusCodeTagName || defaultStatusCodeTagName; this._statusDescriptionTagName = - config.statusDescriptionTagName || defaultStatusDescriptionTagName; + config.statusDescriptionTagName || defaultStatusErrorTagName; this._isShutdown = false; if (typeof config.getExportRequestHeaders === 'function') { this._getHeaders = prepareGetHeaders(config.getExportRequestHeaders); diff --git a/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts index ca8d37aa752..3c7b5a5ddb2 100644 --- a/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts @@ -26,7 +26,7 @@ import * as assert from 'assert'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; import { defaultStatusCodeTagName, - defaultStatusDescriptionTagName, + defaultStatusErrorTagName, toZipkinSpan, _toZipkinAnnotations, _toZipkinTags, @@ -79,7 +79,7 @@ describe('transform', () => { span, 'my-service', defaultStatusCodeTagName, - defaultStatusDescriptionTagName + defaultStatusErrorTagName ); assert.deepStrictEqual(zipkinSpan, { kind: 'SERVER', @@ -101,7 +101,6 @@ describe('transform', () => { tags: { key1: 'value1', key2: 'value2', - [defaultStatusCodeTagName]: 'UNSET', [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', @@ -125,7 +124,7 @@ describe('transform', () => { span, 'my-service', defaultStatusCodeTagName, - defaultStatusDescriptionTagName + defaultStatusErrorTagName ); assert.deepStrictEqual(zipkinSpan, { kind: 'SERVER', @@ -140,7 +139,6 @@ describe('transform', () => { name: span.name, parentId: undefined, tags: { - [defaultStatusCodeTagName]: 'UNSET', [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', @@ -174,7 +172,7 @@ describe('transform', () => { span, 'my-service', defaultStatusCodeTagName, - defaultStatusDescriptionTagName + defaultStatusErrorTagName ); assert.deepStrictEqual(zipkinSpan, { kind: item.zipkin, @@ -189,7 +187,6 @@ describe('transform', () => { name: span.name, parentId: undefined, tags: { - [defaultStatusCodeTagName]: 'UNSET', [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', @@ -220,14 +217,13 @@ describe('transform', () => { span.attributes, span.status, defaultStatusCodeTagName, - defaultStatusDescriptionTagName, + defaultStatusErrorTagName, DUMMY_RESOURCE ); assert.deepStrictEqual(tags, { key1: 'value1', key2: 'value2', - [defaultStatusCodeTagName]: 'UNSET', cost: '112.12', service: 'ui', version: '1', @@ -255,7 +251,7 @@ describe('transform', () => { span.attributes, span.status, defaultStatusCodeTagName, - defaultStatusDescriptionTagName, + defaultStatusErrorTagName, Resource.empty().merge( new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', @@ -292,7 +288,7 @@ describe('transform', () => { span.attributes, span.status, defaultStatusCodeTagName, - defaultStatusDescriptionTagName, + defaultStatusErrorTagName, Resource.empty().merge( new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', @@ -304,7 +300,7 @@ describe('transform', () => { key1: 'value1', key2: 'value2', [defaultStatusCodeTagName]: 'ERROR', - [defaultStatusDescriptionTagName]: status.message, + [defaultStatusErrorTagName]: status.message, [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', }); }); diff --git a/packages/opentelemetry-exporter-zipkin/test/helper.ts b/packages/opentelemetry-exporter-zipkin/test/helper.ts index b6896313296..c2e13dcdd8d 100644 --- a/packages/opentelemetry-exporter-zipkin/test/helper.ts +++ b/packages/opentelemetry-exporter-zipkin/test/helper.ts @@ -71,7 +71,7 @@ export function ensureSpanIsCorrect(span: Span) { localEndpoint: { serviceName: 'OpenTelemetry Service' }, tags: { component: 'foo', - 'ot.status_code': 'OK', + 'otel.status_code': 'OK', service: 'ui', version: '1', cost: '112.12', diff --git a/packages/opentelemetry-exporter-zipkin/test/node/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/node/zipkin.test.ts index 8749917fe91..d78b46159c7 100644 --- a/packages/opentelemetry-exporter-zipkin/test/node/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/node/zipkin.test.ts @@ -215,7 +215,7 @@ describe('Zipkin Exporter - node', () => { tags: { key1: 'value1', key2: 'value2', - 'ot.status_code': 'OK', + 'otel.status_code': 'OK', }, timestamp: startTime * MICROS_PER_SECS, traceId: span1.spanContext().traceId, @@ -230,7 +230,7 @@ describe('Zipkin Exporter - node', () => { }, name: span2.name, tags: { - 'ot.status_code': 'OK', + 'otel.status_code': 'OK', }, timestamp: hrTimeToMicroseconds([startTime, 0]), traceId: span2.spanContext().traceId, diff --git a/packages/opentelemetry-propagator-b3/package.json b/packages/opentelemetry-propagator-b3/package.json index 24fe03b7d75..5015c0a74bb 100644 --- a/packages/opentelemetry-propagator-b3/package.json +++ b/packages/opentelemetry-propagator-b3/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/propagator-b3", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry B3 propagator provides context propagation for systems that are using the B3 header format", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -45,7 +45,7 @@ "access": "public" }, "dependencies": { - "@opentelemetry/core": "0.25.0" + "@opentelemetry/core": "1.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" diff --git a/packages/opentelemetry-propagator-jaeger/package.json b/packages/opentelemetry-propagator-jaeger/package.json index 0d793bc93e1..16fe0436903 100644 --- a/packages/opentelemetry-propagator-jaeger/package.json +++ b/packages/opentelemetry-propagator-jaeger/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/propagator-jaeger", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Jaeger propagator provides HTTP header propagation for systems that are using Jaeger HTTP header format.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -75,6 +75,6 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0" + "@opentelemetry/core": "1.0.0" } } diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index 4e71f7f23a5..2eb290aa59e 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/resources", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry SDK resources", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -67,7 +67,7 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/packages/opentelemetry-sdk-trace-base/package.json b/packages/opentelemetry-sdk-trace-base/package.json index 2d7a0102bd1..9f52b0efa04 100644 --- a/packages/opentelemetry-sdk-trace-base/package.json +++ b/packages/opentelemetry-sdk-trace-base/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-trace-base", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Tracing", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -56,7 +56,6 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@types/lodash.merge": "4.6.6", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -82,9 +81,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", - "lodash.merge": "^4.6.2" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/packages/opentelemetry-sdk-trace-base/src/BasicTracerProvider.ts b/packages/opentelemetry-sdk-trace-base/src/BasicTracerProvider.ts index 4c028448b41..ac6b3445ee5 100644 --- a/packages/opentelemetry-sdk-trace-base/src/BasicTracerProvider.ts +++ b/packages/opentelemetry-sdk-trace-base/src/BasicTracerProvider.ts @@ -27,6 +27,7 @@ import { W3CBaggagePropagator, W3CTraceContextPropagator, getEnv, + merge, } from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { SpanProcessor, Tracer } from '.'; @@ -34,8 +35,6 @@ import { DEFAULT_CONFIG } from './config'; import { MultiSpanProcessor } from './MultiSpanProcessor'; import { NoopSpanProcessor } from './export/NoopSpanProcessor'; import { SDKRegistrationConfig, TracerConfig } from './types'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const merge = require('lodash.merge'); import { SpanExporter } from './export/SpanExporter'; import { BatchSpanProcessor } from './platform'; diff --git a/packages/opentelemetry-sdk-trace-base/src/Span.ts b/packages/opentelemetry-sdk-trace-base/src/Span.ts index 429bf06e8d5..c4bd66b20cd 100644 --- a/packages/opentelemetry-sdk-trace-base/src/Span.ts +++ b/packages/opentelemetry-sdk-trace-base/src/Span.ts @@ -229,11 +229,7 @@ export class Span implements api.Span, ReadableSpan { private _isSpanEnded(): boolean { if (this._ended) { - api.diag.warn( - 'Can not execute the operation on ended Span {traceId: %s, spanId: %s}', - this._spanContext.traceId, - this._spanContext.spanId - ); + api.diag.warn(`Can not execute the operation on ended Span {traceId: ${this._spanContext.traceId}, spanId: ${this._spanContext.spanId}}`); } return this._ended; } diff --git a/packages/opentelemetry-sdk-trace-node/package.json b/packages/opentelemetry-sdk-trace-node/package.json index b8ecc09d730..69d5195d6d1 100644 --- a/packages/opentelemetry-sdk-trace-node/package.json +++ b/packages/opentelemetry-sdk-trace-node/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-trace-node", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Node SDK provides automatic telemetry (tracing, metrics, etc) for Node.js applications", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -44,8 +44,8 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/resources": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/semver": "7.3.8", @@ -62,11 +62,11 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/context-async-hooks": "0.25.0", - "@opentelemetry/core": "0.25.0", - "@opentelemetry/propagator-b3": "0.25.0", - "@opentelemetry/propagator-jaeger": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/context-async-hooks": "1.0.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/propagator-b3": "1.0.0", + "@opentelemetry/propagator-jaeger": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", "semver": "^7.3.5" } } diff --git a/packages/opentelemetry-sdk-trace-web/package.json b/packages/opentelemetry-sdk-trace-web/package.json index 8e6c82616d9..ca9cb926434 100644 --- a/packages/opentelemetry-sdk-trace-web/package.json +++ b/packages/opentelemetry-sdk-trace-web/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-trace-web", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry Web Tracer", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -49,9 +49,9 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.25.0", - "@opentelemetry/propagator-b3": "0.25.0", - "@opentelemetry/resources": "0.25.0", + "@opentelemetry/context-zone": "1.0.0", + "@opentelemetry/propagator-b3": "1.0.0", + "@opentelemetry/resources": "1.0.0", "@types/jquery": "3.5.6", "@types/mocha": "8.2.3", "@types/node": "14.17.11", @@ -82,8 +82,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0" + "@opentelemetry/core": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0" } } diff --git a/packages/opentelemetry-semantic-conventions/package.json b/packages/opentelemetry-semantic-conventions/package.json index fda3f4f4147..54114b923c7 100644 --- a/packages/opentelemetry-semantic-conventions/package.json +++ b/packages/opentelemetry-semantic-conventions/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/semantic-conventions", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTelemetry semantic conventions", "main": "build/src/index.js", "module": "build/esm/index.js", diff --git a/packages/opentelemetry-semantic-conventions/src/resource/SemanticResourceAttributes.ts b/packages/opentelemetry-semantic-conventions/src/resource/SemanticResourceAttributes.ts index 382e315a24a..9e3a9d02aee 100644 --- a/packages/opentelemetry-semantic-conventions/src/resource/SemanticResourceAttributes.ts +++ b/packages/opentelemetry-semantic-conventions/src/resource/SemanticResourceAttributes.ts @@ -476,141 +476,145 @@ As an alternative, consider setting `faas.id` as a span attribute instead. WEBENGINE_DESCRIPTION: 'webengine.description', } -// Enum definitions - -export enum CloudProviderValues { +export const CloudProviderValues = { /** Alibaba Cloud. */ - ALIBABA_CLOUD = 'alibaba_cloud', + ALIBABA_CLOUD: 'alibaba_cloud', /** Amazon Web Services. */ - AWS = 'aws', + AWS: 'aws', /** Microsoft Azure. */ - AZURE = 'azure', + AZURE: 'azure', /** Google Cloud Platform. */ - GCP = 'gcp', -} + GCP: 'gcp', +} as const +export type CloudProviderValues = typeof CloudProviderValues[keyof typeof CloudProviderValues] -export enum CloudPlatformValues { +export const CloudPlatformValues = { /** Alibaba Cloud Elastic Compute Service. */ - ALIBABA_CLOUD_ECS = 'alibaba_cloud_ecs', + ALIBABA_CLOUD_ECS: 'alibaba_cloud_ecs', /** Alibaba Cloud Function Compute. */ - ALIBABA_CLOUD_FC = 'alibaba_cloud_fc', + ALIBABA_CLOUD_FC: 'alibaba_cloud_fc', /** AWS Elastic Compute Cloud. */ - AWS_EC2 = 'aws_ec2', + AWS_EC2: 'aws_ec2', /** AWS Elastic Container Service. */ - AWS_ECS = 'aws_ecs', + AWS_ECS: 'aws_ecs', /** AWS Elastic Kubernetes Service. */ - AWS_EKS = 'aws_eks', + AWS_EKS: 'aws_eks', /** AWS Lambda. */ - AWS_LAMBDA = 'aws_lambda', + AWS_LAMBDA: 'aws_lambda', /** AWS Elastic Beanstalk. */ - AWS_ELASTIC_BEANSTALK = 'aws_elastic_beanstalk', + AWS_ELASTIC_BEANSTALK: 'aws_elastic_beanstalk', /** Azure Virtual Machines. */ - AZURE_VM = 'azure_vm', + AZURE_VM: 'azure_vm', /** Azure Container Instances. */ - AZURE_CONTAINER_INSTANCES = 'azure_container_instances', + AZURE_CONTAINER_INSTANCES: 'azure_container_instances', /** Azure Kubernetes Service. */ - AZURE_AKS = 'azure_aks', + AZURE_AKS: 'azure_aks', /** Azure Functions. */ - AZURE_FUNCTIONS = 'azure_functions', + AZURE_FUNCTIONS: 'azure_functions', /** Azure App Service. */ - AZURE_APP_SERVICE = 'azure_app_service', + AZURE_APP_SERVICE: 'azure_app_service', /** Google Cloud Compute Engine (GCE). */ - GCP_COMPUTE_ENGINE = 'gcp_compute_engine', + GCP_COMPUTE_ENGINE: 'gcp_compute_engine', /** Google Cloud Run. */ - GCP_CLOUD_RUN = 'gcp_cloud_run', + GCP_CLOUD_RUN: 'gcp_cloud_run', /** Google Cloud Kubernetes Engine (GKE). */ - GCP_KUBERNETES_ENGINE = 'gcp_kubernetes_engine', + GCP_KUBERNETES_ENGINE: 'gcp_kubernetes_engine', /** Google Cloud Functions (GCF). */ - GCP_CLOUD_FUNCTIONS = 'gcp_cloud_functions', + GCP_CLOUD_FUNCTIONS: 'gcp_cloud_functions', /** Google Cloud App Engine (GAE). */ - GCP_APP_ENGINE = 'gcp_app_engine', -} + GCP_APP_ENGINE: 'gcp_app_engine', +} as const +export type CloudPlatformValues = typeof CloudPlatformValues[keyof typeof CloudPlatformValues] -export enum AwsEcsLaunchtypeValues { +export const AwsEcsLaunchtypeValues = { /** ec2. */ - EC2 = 'ec2', + EC2: 'ec2', /** fargate. */ - FARGATE = 'fargate', -} + FARGATE: 'fargate', +} as const +export type AwsEcsLaunchtypeValues = typeof AwsEcsLaunchtypeValues[keyof typeof AwsEcsLaunchtypeValues] -export enum HostArchValues { +export const HostArchValues = { /** AMD64. */ - AMD64 = 'amd64', + AMD64: 'amd64', /** ARM32. */ - ARM32 = 'arm32', + ARM32: 'arm32', /** ARM64. */ - ARM64 = 'arm64', + ARM64: 'arm64', /** Itanium. */ - IA64 = 'ia64', + IA64: 'ia64', /** 32-bit PowerPC. */ - PPC32 = 'ppc32', + PPC32: 'ppc32', /** 64-bit PowerPC. */ - PPC64 = 'ppc64', + PPC64: 'ppc64', /** 32-bit x86. */ - X86 = 'x86', -} + X86: 'x86', +} as const +export type HostArchValues = typeof HostArchValues[keyof typeof HostArchValues] -export enum OsTypeValues { +export const OsTypeValues = { /** Microsoft Windows. */ - WINDOWS = 'windows', + WINDOWS: 'windows', /** Linux. */ - LINUX = 'linux', + LINUX: 'linux', /** Apple Darwin. */ - DARWIN = 'darwin', + DARWIN: 'darwin', /** FreeBSD. */ - FREEBSD = 'freebsd', + FREEBSD: 'freebsd', /** NetBSD. */ - NETBSD = 'netbsd', + NETBSD: 'netbsd', /** OpenBSD. */ - OPENBSD = 'openbsd', + OPENBSD: 'openbsd', /** DragonFly BSD. */ - DRAGONFLYBSD = 'dragonflybsd', + DRAGONFLYBSD: 'dragonflybsd', /** HP-UX (Hewlett Packard Unix). */ - HPUX = 'hpux', + HPUX: 'hpux', /** AIX (Advanced Interactive eXecutive). */ - AIX = 'aix', + AIX: 'aix', /** Oracle Solaris. */ - SOLARIS = 'solaris', + SOLARIS: 'solaris', /** IBM z/OS. */ - Z_OS = 'z_os', -} + Z_OS: 'z_os', +} as const +export type OsTypeValues = typeof OsTypeValues[keyof typeof OsTypeValues] -export enum TelemetrySdkLanguageValues { +export const TelemetrySdkLanguageValues = { /** cpp. */ - CPP = 'cpp', + CPP: 'cpp', /** dotnet. */ - DOTNET = 'dotnet', + DOTNET: 'dotnet', /** erlang. */ - ERLANG = 'erlang', + ERLANG: 'erlang', /** go. */ - GO = 'go', + GO: 'go', /** java. */ - JAVA = 'java', + JAVA: 'java', /** nodejs. */ - NODEJS = 'nodejs', + NODEJS: 'nodejs', /** php. */ - PHP = 'php', + PHP: 'php', /** python. */ - PYTHON = 'python', + PYTHON: 'python', /** ruby. */ - RUBY = 'ruby', + RUBY: 'ruby', /** webjs. */ - WEBJS = 'webjs', -} + WEBJS: 'webjs', +} as const +export type TelemetrySdkLanguageValues = typeof TelemetrySdkLanguageValues[keyof typeof TelemetrySdkLanguageValues] diff --git a/packages/opentelemetry-semantic-conventions/src/trace/SemanticAttributes.ts b/packages/opentelemetry-semantic-conventions/src/trace/SemanticAttributes.ts index eb7260c0738..052d36e4c08 100644 --- a/packages/opentelemetry-semantic-conventions/src/trace/SemanticAttributes.ts +++ b/packages/opentelemetry-semantic-conventions/src/trace/SemanticAttributes.ts @@ -372,7 +372,9 @@ clear whether the exception will escape. HTTP_TARGET: 'http.target', /** - * The value of the [HTTP host header](https://tools.ietf.org/html/rfc7230#section-5.4). When the header is empty or not present, this attribute should be the same. + * The value of the [HTTP host header](https://tools.ietf.org/html/rfc7230#section-5.4). An empty Host header should also be reported, see note. + * + * Note: When the header is present but empty the attribute SHOULD be set to the empty string. Note that this is a valid situation that is expected in certain cases, according the aforementioned [section of RFC 7230](https://tools.ietf.org/html/rfc7230#section-5.4). When the header is not set the attribute MUST NOT be set. */ HTTP_HOST: 'http.host', @@ -433,7 +435,17 @@ clear whether the exception will escape. /** * The IP address of the original client behind all proxies, if known (e.g. from [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For)). * - * Note: This is not necessarily the same as `net.peer.ip`, which would identify the network-level peer, which may be a proxy. + * Note: This is not necessarily the same as `net.peer.ip`, which would +identify the network-level peer, which may be a proxy. + +This attribute should be set when a source of information different +from the one used for `net.peer.ip`, is available even if that other +source just confirms the same value as `net.peer.ip`. +Rationale: For `net.peer.ip`, one typically does not know if it +comes from a proxy, reverse proxy, or the actual client. Setting +`http.client_ip` when it's the same as `net.peer.ip` means that +one is at least somewhat confident that the address is not that of +the closest proxy. */ HTTP_CLIENT_IP: 'http.client_ip', @@ -607,6 +619,11 @@ clear whether the exception will escape. */ MESSAGING_OPERATION: 'messaging.operation', + /** + * The identifier for the consumer receiving a message. For Kafka, set it to `{messaging.kafka.consumer_group} - {messaging.kafka.client_id}`, if both are present, or only `messaging.kafka.consumer_group`. For brokers, such as RabbitMQ and Artemis, set it to the `client_id` of the client consuming the message. + */ + MESSAGING_CONSUMER_ID: 'messaging.consumer_id', + /** * RabbitMQ message routing key. */ @@ -682,335 +699,378 @@ clear whether the exception will escape. * `error.message` property of response if it is an error response. */ RPC_JSONRPC_ERROR_MESSAGE: 'rpc.jsonrpc.error_message', -} -// Enum definitions + /** + * Whether this is a received or sent message. + */ + MESSAGE_TYPE: 'message.type', + + /** + * MUST be calculated as two different counters starting from `1` one for sent messages and one for received message. + * + * Note: This way we guarantee that the values will be consistent between different implementations. + */ + MESSAGE_ID: 'message.id', + + /** + * Compressed size of the message in bytes. + */ + MESSAGE_COMPRESSED_SIZE: 'message.compressed_size', + + /** + * Uncompressed size of the message in bytes. + */ + MESSAGE_UNCOMPRESSED_SIZE: 'message.uncompressed_size', +} -export enum DbSystemValues { +export const DbSystemValues = { /** Some other SQL database. Fallback only. See notes. */ - OTHER_SQL = 'other_sql', + OTHER_SQL: 'other_sql', /** Microsoft SQL Server. */ - MSSQL = 'mssql', + MSSQL: 'mssql', /** MySQL. */ - MYSQL = 'mysql', + MYSQL: 'mysql', /** Oracle Database. */ - ORACLE = 'oracle', + ORACLE: 'oracle', /** IBM Db2. */ - DB2 = 'db2', + DB2: 'db2', /** PostgreSQL. */ - POSTGRESQL = 'postgresql', + POSTGRESQL: 'postgresql', /** Amazon Redshift. */ - REDSHIFT = 'redshift', + REDSHIFT: 'redshift', /** Apache Hive. */ - HIVE = 'hive', + HIVE: 'hive', /** Cloudscape. */ - CLOUDSCAPE = 'cloudscape', + CLOUDSCAPE: 'cloudscape', /** HyperSQL DataBase. */ - HSQLDB = 'hsqldb', + HSQLDB: 'hsqldb', /** Progress Database. */ - PROGRESS = 'progress', + PROGRESS: 'progress', /** SAP MaxDB. */ - MAXDB = 'maxdb', + MAXDB: 'maxdb', /** SAP HANA. */ - HANADB = 'hanadb', + HANADB: 'hanadb', /** Ingres. */ - INGRES = 'ingres', + INGRES: 'ingres', /** FirstSQL. */ - FIRSTSQL = 'firstsql', + FIRSTSQL: 'firstsql', /** EnterpriseDB. */ - EDB = 'edb', + EDB: 'edb', /** InterSystems Caché. */ - CACHE = 'cache', + CACHE: 'cache', /** Adabas (Adaptable Database System). */ - ADABAS = 'adabas', + ADABAS: 'adabas', /** Firebird. */ - FIREBIRD = 'firebird', + FIREBIRD: 'firebird', /** Apache Derby. */ - DERBY = 'derby', + DERBY: 'derby', /** FileMaker. */ - FILEMAKER = 'filemaker', + FILEMAKER: 'filemaker', /** Informix. */ - INFORMIX = 'informix', + INFORMIX: 'informix', /** InstantDB. */ - INSTANTDB = 'instantdb', + INSTANTDB: 'instantdb', /** InterBase. */ - INTERBASE = 'interbase', + INTERBASE: 'interbase', /** MariaDB. */ - MARIADB = 'mariadb', + MARIADB: 'mariadb', /** Netezza. */ - NETEZZA = 'netezza', + NETEZZA: 'netezza', /** Pervasive PSQL. */ - PERVASIVE = 'pervasive', + PERVASIVE: 'pervasive', /** PointBase. */ - POINTBASE = 'pointbase', + POINTBASE: 'pointbase', /** SQLite. */ - SQLITE = 'sqlite', + SQLITE: 'sqlite', /** Sybase. */ - SYBASE = 'sybase', + SYBASE: 'sybase', /** Teradata. */ - TERADATA = 'teradata', + TERADATA: 'teradata', /** Vertica. */ - VERTICA = 'vertica', + VERTICA: 'vertica', /** H2. */ - H2 = 'h2', + H2: 'h2', /** ColdFusion IMQ. */ - COLDFUSION = 'coldfusion', + COLDFUSION: 'coldfusion', /** Apache Cassandra. */ - CASSANDRA = 'cassandra', + CASSANDRA: 'cassandra', /** Apache HBase. */ - HBASE = 'hbase', + HBASE: 'hbase', /** MongoDB. */ - MONGODB = 'mongodb', + MONGODB: 'mongodb', /** Redis. */ - REDIS = 'redis', + REDIS: 'redis', /** Couchbase. */ - COUCHBASE = 'couchbase', + COUCHBASE: 'couchbase', /** CouchDB. */ - COUCHDB = 'couchdb', + COUCHDB: 'couchdb', /** Microsoft Azure Cosmos DB. */ - COSMOSDB = 'cosmosdb', + COSMOSDB: 'cosmosdb', /** Amazon DynamoDB. */ - DYNAMODB = 'dynamodb', + DYNAMODB: 'dynamodb', /** Neo4j. */ - NEO4J = 'neo4j', + NEO4J: 'neo4j', /** Apache Geode. */ - GEODE = 'geode', + GEODE: 'geode', /** Elasticsearch. */ - ELASTICSEARCH = 'elasticsearch', + ELASTICSEARCH: 'elasticsearch', /** Memcached. */ - MEMCACHED = 'memcached', + MEMCACHED: 'memcached', /** CockroachDB. */ - COCKROACHDB = 'cockroachdb', -} + COCKROACHDB: 'cockroachdb', +} as const +export type DbSystemValues = typeof DbSystemValues[keyof typeof DbSystemValues] -export enum DbCassandraConsistencyLevelValues { +export const DbCassandraConsistencyLevelValues = { /** all. */ - ALL = 'all', + ALL: 'all', /** each_quorum. */ - EACH_QUORUM = 'each_quorum', + EACH_QUORUM: 'each_quorum', /** quorum. */ - QUORUM = 'quorum', + QUORUM: 'quorum', /** local_quorum. */ - LOCAL_QUORUM = 'local_quorum', + LOCAL_QUORUM: 'local_quorum', /** one. */ - ONE = 'one', + ONE: 'one', /** two. */ - TWO = 'two', + TWO: 'two', /** three. */ - THREE = 'three', + THREE: 'three', /** local_one. */ - LOCAL_ONE = 'local_one', + LOCAL_ONE: 'local_one', /** any. */ - ANY = 'any', + ANY: 'any', /** serial. */ - SERIAL = 'serial', + SERIAL: 'serial', /** local_serial. */ - LOCAL_SERIAL = 'local_serial', -} + LOCAL_SERIAL: 'local_serial', +} as const +export type DbCassandraConsistencyLevelValues = typeof DbCassandraConsistencyLevelValues[keyof typeof DbCassandraConsistencyLevelValues] -export enum FaasTriggerValues { +export const FaasTriggerValues = { /** A response to some data source operation such as a database or filesystem read/write. */ - DATASOURCE = 'datasource', + DATASOURCE: 'datasource', /** To provide an answer to an inbound HTTP request. */ - HTTP = 'http', + HTTP: 'http', /** A function is set to be executed when messages are sent to a messaging system. */ - PUBSUB = 'pubsub', + PUBSUB: 'pubsub', /** A function is scheduled to be executed regularly. */ - TIMER = 'timer', + TIMER: 'timer', /** If none of the others apply. */ - OTHER = 'other', -} + OTHER: 'other', +} as const +export type FaasTriggerValues = typeof FaasTriggerValues[keyof typeof FaasTriggerValues] -export enum FaasDocumentOperationValues { +export const FaasDocumentOperationValues = { /** When a new object is created. */ - INSERT = 'insert', + INSERT: 'insert', /** When an object is modified. */ - EDIT = 'edit', + EDIT: 'edit', /** When an object is deleted. */ - DELETE = 'delete', -} + DELETE: 'delete', +} as const +export type FaasDocumentOperationValues = typeof FaasDocumentOperationValues[keyof typeof FaasDocumentOperationValues] -export enum FaasInvokedProviderValues { +export const FaasInvokedProviderValues = { /** Alibaba Cloud. */ - ALIBABA_CLOUD = 'alibaba_cloud', + ALIBABA_CLOUD: 'alibaba_cloud', /** Amazon Web Services. */ - AWS = 'aws', + AWS: 'aws', /** Microsoft Azure. */ - AZURE = 'azure', + AZURE: 'azure', /** Google Cloud Platform. */ - GCP = 'gcp', -} + GCP: 'gcp', +} as const +export type FaasInvokedProviderValues = typeof FaasInvokedProviderValues[keyof typeof FaasInvokedProviderValues] -export enum NetTransportValues { +export const NetTransportValues = { /** ip_tcp. */ - IP_TCP = 'ip_tcp', + IP_TCP: 'ip_tcp', /** ip_udp. */ - IP_UDP = 'ip_udp', + IP_UDP: 'ip_udp', /** Another IP-based protocol. */ - IP = 'ip', + IP: 'ip', /** Unix Domain socket. See below. */ - UNIX = 'unix', + UNIX: 'unix', /** Named or anonymous pipe. See note below. */ - PIPE = 'pipe', + PIPE: 'pipe', /** In-process communication. */ - INPROC = 'inproc', + INPROC: 'inproc', /** Something else (non IP-based). */ - OTHER = 'other', -} + OTHER: 'other', +} as const +export type NetTransportValues = typeof NetTransportValues[keyof typeof NetTransportValues] -export enum NetHostConnectionTypeValues { +export const NetHostConnectionTypeValues = { /** wifi. */ - WIFI = 'wifi', + WIFI: 'wifi', /** wired. */ - WIRED = 'wired', + WIRED: 'wired', /** cell. */ - CELL = 'cell', + CELL: 'cell', /** unavailable. */ - UNAVAILABLE = 'unavailable', + UNAVAILABLE: 'unavailable', /** unknown. */ - UNKNOWN = 'unknown', -} + UNKNOWN: 'unknown', +} as const +export type NetHostConnectionTypeValues = typeof NetHostConnectionTypeValues[keyof typeof NetHostConnectionTypeValues] -export enum NetHostConnectionSubtypeValues { +export const NetHostConnectionSubtypeValues = { /** GPRS. */ - GPRS = 'gprs', + GPRS: 'gprs', /** EDGE. */ - EDGE = 'edge', + EDGE: 'edge', /** UMTS. */ - UMTS = 'umts', + UMTS: 'umts', /** CDMA. */ - CDMA = 'cdma', + CDMA: 'cdma', /** EVDO Rel. 0. */ - EVDO_0 = 'evdo_0', + EVDO_0: 'evdo_0', /** EVDO Rev. A. */ - EVDO_A = 'evdo_a', + EVDO_A: 'evdo_a', /** CDMA2000 1XRTT. */ - CDMA2000_1XRTT = 'cdma2000_1xrtt', + CDMA2000_1XRTT: 'cdma2000_1xrtt', /** HSDPA. */ - HSDPA = 'hsdpa', + HSDPA: 'hsdpa', /** HSUPA. */ - HSUPA = 'hsupa', + HSUPA: 'hsupa', /** HSPA. */ - HSPA = 'hspa', + HSPA: 'hspa', /** IDEN. */ - IDEN = 'iden', + IDEN: 'iden', /** EVDO Rev. B. */ - EVDO_B = 'evdo_b', + EVDO_B: 'evdo_b', /** LTE. */ - LTE = 'lte', + LTE: 'lte', /** EHRPD. */ - EHRPD = 'ehrpd', + EHRPD: 'ehrpd', /** HSPAP. */ - HSPAP = 'hspap', + HSPAP: 'hspap', /** GSM. */ - GSM = 'gsm', + GSM: 'gsm', /** TD-SCDMA. */ - TD_SCDMA = 'td_scdma', + TD_SCDMA: 'td_scdma', /** IWLAN. */ - IWLAN = 'iwlan', + IWLAN: 'iwlan', /** 5G NR (New Radio). */ - NR = 'nr', + NR: 'nr', /** 5G NRNSA (New Radio Non-Standalone). */ - NRNSA = 'nrnsa', + NRNSA: 'nrnsa', /** LTE CA. */ - LTE_CA = 'lte_ca', -} + LTE_CA: 'lte_ca', +} as const +export type NetHostConnectionSubtypeValues = typeof NetHostConnectionSubtypeValues[keyof typeof NetHostConnectionSubtypeValues] -export enum HttpFlavorValues { +export const HttpFlavorValues = { /** HTTP 1.0. */ - HTTP_1_0 = '1.0', + HTTP_1_0: '1.0', /** HTTP 1.1. */ - HTTP_1_1 = '1.1', + HTTP_1_1: '1.1', /** HTTP 2. */ - HTTP_2_0 = '2.0', + HTTP_2_0: '2.0', /** SPDY protocol. */ - SPDY = 'SPDY', + SPDY: 'SPDY', /** QUIC protocol. */ - QUIC = 'QUIC', -} + QUIC: 'QUIC', +} as const +export type HttpFlavorValues = typeof HttpFlavorValues[keyof typeof HttpFlavorValues] -export enum MessagingDestinationKindValues { +export const MessagingDestinationKindValues = { /** A message sent to a queue. */ - QUEUE = 'queue', + QUEUE: 'queue', /** A message sent to a topic. */ - TOPIC = 'topic', -} + TOPIC: 'topic', +} as const +export type MessagingDestinationKindValues = typeof MessagingDestinationKindValues[keyof typeof MessagingDestinationKindValues] -export enum MessagingOperationValues { +export const MessagingOperationValues = { /** receive. */ - RECEIVE = 'receive', + RECEIVE: 'receive', /** process. */ - PROCESS = 'process', -} + PROCESS: 'process', +} as const +export type MessagingOperationValues = typeof MessagingOperationValues[keyof typeof MessagingOperationValues] -export enum RpcGrpcStatusCodeValues { +export const RpcGrpcStatusCodeValues = { /** OK. */ - OK = 0, + OK: 0, /** CANCELLED. */ - CANCELLED = 1, + CANCELLED: 1, /** UNKNOWN. */ - UNKNOWN = 2, + UNKNOWN: 2, /** INVALID_ARGUMENT. */ - INVALID_ARGUMENT = 3, + INVALID_ARGUMENT: 3, /** DEADLINE_EXCEEDED. */ - DEADLINE_EXCEEDED = 4, + DEADLINE_EXCEEDED: 4, /** NOT_FOUND. */ - NOT_FOUND = 5, + NOT_FOUND: 5, /** ALREADY_EXISTS. */ - ALREADY_EXISTS = 6, + ALREADY_EXISTS: 6, /** PERMISSION_DENIED. */ - PERMISSION_DENIED = 7, + PERMISSION_DENIED: 7, /** RESOURCE_EXHAUSTED. */ - RESOURCE_EXHAUSTED = 8, + RESOURCE_EXHAUSTED: 8, /** FAILED_PRECONDITION. */ - FAILED_PRECONDITION = 9, + FAILED_PRECONDITION: 9, /** ABORTED. */ - ABORTED = 10, + ABORTED: 10, /** OUT_OF_RANGE. */ - OUT_OF_RANGE = 11, + OUT_OF_RANGE: 11, /** UNIMPLEMENTED. */ - UNIMPLEMENTED = 12, + UNIMPLEMENTED: 12, /** INTERNAL. */ - INTERNAL = 13, + INTERNAL: 13, /** UNAVAILABLE. */ - UNAVAILABLE = 14, + UNAVAILABLE: 14, /** DATA_LOSS. */ - DATA_LOSS = 15, + DATA_LOSS: 15, /** UNAUTHENTICATED. */ - UNAUTHENTICATED = 16, -} + UNAUTHENTICATED: 16, +} as const +export type RpcGrpcStatusCodeValues = typeof RpcGrpcStatusCodeValues[keyof typeof RpcGrpcStatusCodeValues] + + + + +export const MessageTypeValues = { + /** sent. */ + SENT: 'SENT', + /** received. */ + RECEIVED: 'RECEIVED', +} as const +export type MessageTypeValues = typeof MessageTypeValues[keyof typeof MessageTypeValues] diff --git a/packages/opentelemetry-shim-opentracing/package.json b/packages/opentelemetry-shim-opentracing/package.json index 6c1348d80c1..496657c20ab 100644 --- a/packages/opentelemetry-shim-opentracing/package.json +++ b/packages/opentelemetry-shim-opentracing/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/shim-opentracing", - "version": "0.25.0", + "version": "1.0.0", "description": "OpenTracing to OpenTelemetry shim", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,9 +41,9 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/propagator-b3": "0.25.0", - "@opentelemetry/propagator-jaeger": "0.25.0", - "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/propagator-b3": "1.0.0", + "@opentelemetry/propagator-jaeger": "1.0.0", + "@opentelemetry/sdk-trace-base": "1.0.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "codecov": "3.8.3", @@ -57,8 +57,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.25.0", - "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/semantic-conventions": "1.0.0", "opentracing": "^0.14.4" } } diff --git a/packages/template/package.json b/packages/template/package.json index dea1646f165..861fb6c69d0 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/template", - "version": "0.25.0", + "version": "1.0.0", "private": true, "publishConfig": { "access": "restricted" diff --git a/scripts/semconv/generate.sh b/scripts/semconv/generate.sh index 89718f52e1b..dbd99464eac 100755 --- a/scripts/semconv/generate.sh +++ b/scripts/semconv/generate.sh @@ -4,8 +4,8 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR="${SCRIPT_DIR}/../../" # freeze the spec version to make SpanAttributess generation reproducible -SPEC_VERSION=v1.6.1 -GENERATOR_VERSION=0.5.0 +SPEC_VERSION=v1.7.0 +GENERATOR_VERSION=0.7.0 cd ${SCRIPT_DIR} diff --git a/scripts/semconv/templates/SemanticAttributes.ts.j2 b/scripts/semconv/templates/SemanticAttributes.ts.j2 index 18004561d98..eb144b93b26 100644 --- a/scripts/semconv/templates/SemanticAttributes.ts.j2 +++ b/scripts/semconv/templates/SemanticAttributes.ts.j2 @@ -44,19 +44,19 @@ export const {{class}} = { {%- endfor %} } -// Enum definitions {%- for attribute in attributes if attribute.is_local and not attribute.ref %} {%- if attribute.is_enum %} {%- set class_name = attribute.fqn | to_camelcase(True) ~ "Values" %} {%- set type = attribute.attr_type.enum_type %} {% if attribute.attr_type.members is defined and attribute.attr_type.members|length > 0 %} -export enum {{class_name}} { +export const {{class_name}} = { {%- for member in attribute.attr_type.members if attribute.is_local and not attribute.ref %} /** {% filter escape %}{{member.brief | to_doc_brief}}.{% endfilter %} */ - {{ member.member_id | to_const_name }} = {{ print_value(type, member.value) }}, + {{ member.member_id | to_const_name }}: {{ print_value(type, member.value) }}, {%- endfor %} -} +} as const +export type {{class_name}} = typeof {{class_name}}[keyof typeof {{class_name}}] {% endif %} {% endif %} diff --git a/tsconfig.base.json b/tsconfig.base.json index b2d1a3bd96f..2d628cad8de 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -6,19 +6,20 @@ "declaration": true, "declarationMap": true, "forceConsistentCasingInFileNames": true, + "incremental": true, + "inlineSources": true, "module": "commonjs", + "newLine": "LF", "noEmitOnError": true, "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, "noImplicitReturns": true, "noUnusedLocals": true, - "noImplicitOverride": true, "pretty": true, "sourceMap": true, "strict": true, "strictNullChecks": true, - "target": "es2017", - "incremental": true, - "newLine": "LF" + "target": "es2017" }, "exclude": [ "node_modules" diff --git a/tsconfig.esm.json b/tsconfig.esm.json index 57f33c032a0..4bbf108bfcf 100644 --- a/tsconfig.esm.json +++ b/tsconfig.esm.json @@ -2,15 +2,6 @@ "extends": "./tsconfig.base.esm.json", "files": [], "references": [ - { - "path": "backwards-compatability/node10" - }, - { - "path": "backwards-compatability/node12" - }, - { - "path": "backwards-compatability/node8" - }, { "path": "packages/opentelemetry-context-async-hooks" }, @@ -26,15 +17,6 @@ { "path": "packages/opentelemetry-exporter-jaeger" }, - { - "path": "packages/opentelemetry-exporter-otlp-grpc" - }, - { - "path": "packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json" - }, - { - "path": "packages/opentelemetry-exporter-otlp-proto" - }, { "path": "packages/opentelemetry-exporter-zipkin/tsconfig.esm.json" }, diff --git a/tsconfig.json b/tsconfig.json index 8c9f7c196ae..17cfa102617 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,9 @@ "typedocOptions": { "packages": [ "experimental/packages/opentelemetry-api-metrics", + "experimental/packages/opentelemetry-exporter-otlp-grpc", + "experimental/packages/opentelemetry-exporter-otlp-http", + "experimental/packages/opentelemetry-exporter-otlp-proto", "experimental/packages/opentelemetry-exporter-prometheus", "experimental/packages/opentelemetry-instrumentation-fetch", "experimental/packages/opentelemetry-instrumentation-grpc", @@ -16,9 +19,6 @@ "packages/opentelemetry-context-zone", "packages/opentelemetry-core", "packages/opentelemetry-exporter-jaeger", - "packages/opentelemetry-exporter-otlp-grpc", - "packages/opentelemetry-exporter-otlp-http", - "packages/opentelemetry-exporter-otlp-proto", "packages/opentelemetry-exporter-zipkin", "packages/opentelemetry-propagator-b3", "packages/opentelemetry-propagator-jaeger", @@ -41,15 +41,6 @@ "excludePrivate": true }, "references": [ - { - "path": "backwards-compatability/node10" - }, - { - "path": "backwards-compatability/node12" - }, - { - "path": "backwards-compatability/node8" - }, { "path": "packages/opentelemetry-context-async-hooks" }, @@ -65,15 +56,6 @@ { "path": "packages/opentelemetry-exporter-jaeger" }, - { - "path": "packages/opentelemetry-exporter-otlp-grpc" - }, - { - "path": "packages/opentelemetry-exporter-otlp-http" - }, - { - "path": "packages/opentelemetry-exporter-otlp-proto" - }, { "path": "packages/opentelemetry-exporter-zipkin" },