diff --git a/.github/workflows/canary.yaml b/.github/workflows/canary.yaml index 2591f0295a..e905410ef6 100644 --- a/.github/workflows/canary.yaml +++ b/.github/workflows/canary.yaml @@ -42,14 +42,14 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci + npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' npm run compile - name: Install and Build (cache hit) 🔧 if: steps.cache.outputs.cache-hit == 'true' run: | npm ci --ignore-scripts - npx lerna bootstrap + npx lerna bootstrap --hoist --nohoist='zone.js' npm run compile - name: Publish diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index f07727a110..79041af47e 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -33,14 +33,14 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci + npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' npm run compile - name: Install and Build (cache hit) 🔧 if: steps.cache.outputs.cache-hit == 'true' run: | npm ci --ignore-scripts - npx lerna bootstrap + npx lerna bootstrap --hoist --nohoist='zone.js' npm run compile - name: Build Docs diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6514f81e81..537010ec85 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -49,14 +49,14 @@ jobs: if: steps.cache.outputs.cache-hit == 'true' run: | npm ci --ignore-scripts - npx lerna bootstrap --ignore-scripts + npx lerna bootstrap --ignore-scripts --hoist --nohoist='zone.js' # On a cache miss, fall back to a regular install - name: Bootstrap (cache miss) if: steps.cache.outputs.cache-hit != 'true' run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci --ignore-scripts -- --only=dev + npx lerna bootstrap --no-ci --ignore-scripts --hoist --nohoist='zone.js' -- --only=dev - name: Lint run: | diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 3bd874bed0..51ed1b5e14 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -40,14 +40,14 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci + npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' npm run compile - name: Install and Build (cache hit) 🔧 if: steps.cache.outputs.cache-hit == 'true' run: | npm ci --ignore-scripts - npx lerna bootstrap + npx lerna bootstrap --hoist --nohoist='zone.js' npm run compile - name: Unit tests @@ -85,14 +85,14 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: | npm install --ignore-scripts - npx lerna bootstrap --no-ci + npx lerna bootstrap --no-ci --hoist --nohoist='zone.js' npm run compile - name: Install and Build (cache hit) 🔧 if: steps.cache.outputs.cache-hit == 'true' run: | npm ci --ignore-scripts - npx lerna bootstrap + npx lerna bootstrap --hoist --nohoist='zone.js' npm run compile - name: Unit tests diff --git a/CHANGELOG.md b/CHANGELOG.md index fe3302e030..b361fd135b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,67 @@ All notable changes to this project will be documented in this file. ## Unreleased +## 0.25.0 + +### :boom: Breaking Change + +* `opentelemetry-api-metrics`, `opentelemetry-context-zone-peer-dep`, `opentelemetry-context-zone`, `opentelemetry-core`, `opentelemetry-exporter-collector-grpc`, `opentelemetry-exporter-collector-proto`, `opentelemetry-exporter-collector`, `opentelemetry-exporter-jaeger`, `opentelemetry-exporter-prometheus`, `opentelemetry-exporter-zipkin`, `opentelemetry-instrumentation-fetch`, `opentelemetry-instrumentation-grpc`, `opentelemetry-instrumentation-http`, `opentelemetry-instrumentation-xml-http-request`, `opentelemetry-instrumentation`, `opentelemetry-propagator-jaeger`, `opentelemetry-sdk-metrics-base`, `opentelemetry-sdk-node`, `opentelemetry-sdk-trace-base`, `opentelemetry-sdk-trace-node`, `opentelemetry-sdk-trace-web`, `opentelemetry-shim-opentracing` + * [#2340](https://github.com/open-telemetry/opentelemetry-js/pull/2340) chore: rename sdks to better represent what they are [#2146] ([@vmarchaud](https://github.com/vmarchaud)) + +### :rocket: (Enhancement) + +* `opentelemetry-exporter-collector-grpc`, `opentelemetry-exporter-collector-proto`, `opentelemetry-exporter-collector`, `opentelemetry-exporter-zipkin` + * [#1775](https://github.com/open-telemetry/opentelemetry-js/pull/1775) fix(@opentelemetry/exporter-collector): remove fulfilled promises cor… ([@aabmass](https://github.com/aabmass)) +* `opentelemetry-exporter-collector` + * [#2336](https://github.com/open-telemetry/opentelemetry-js/pull/2336) feat: use Blob in sendBeacon to add application/json type ([@jufab](https://github.com/jufab)) + +### :bug: (Bug Fix) + +* `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` + * [#2396](https://github.com/open-telemetry/opentelemetry-js/pull/2396) fix: respect sampled flag in Span Processors, fix associated tests ([@quickgiant](https://github.com/quickgiant)) + +### :books: (Refine Doc) + +* Other + * [#2412](https://github.com/open-telemetry/opentelemetry-js/pull/2412) docs: fix examples in website_docs/instrumentation.md ([@svrnm](https://github.com/svrnm)) + * [#2400](https://github.com/open-telemetry/opentelemetry-js/pull/2400) Website docs update 0821 ([@svrnm](https://github.com/svrnm)) +* `opentelemetry-resources`, `opentelemetry-semantic-conventions` + * [#2399](https://github.com/open-telemetry/opentelemetry-js/pull/2399) chore: update doc identifier names in readme ([@lonewolf3739](https://github.com/lonewolf3739)) + +### :house: (Internal) + +* `opentelemetry-core`, `opentelemetry-exporter-collector-grpc`, `opentelemetry-exporter-collector-proto`, `opentelemetry-instrumentation-http`, `opentelemetry-sdk-trace-node` + * [#2416](https://github.com/open-telemetry/opentelemetry-js/pull/2416) chore: hoist dependencies to speed up ci ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-propagator-b3`, `opentelemetry-propagator-jaeger`, `opentelemetry-resources`, `opentelemetry-sdk-metrics-base` + * [#2406](https://github.com/open-telemetry/opentelemetry-js/pull/2406) chore: Fix lint warnings in propagator-jaeger, propagator-b3, resources, and sdk-metrics-base packages ([@alisabzevari](https://github.com/alisabzevari)) +* `opentelemetry-core` + * [#2405](https://github.com/open-telemetry/opentelemetry-js/pull/2405) chore: Fix lint warnings in core package ([@alisabzevari](https://github.com/alisabzevari)) +* `opentelemetry-resource-detector-aws`, `opentelemetry-resource-detector-gcp`, `opentelemetry-sdk-node` + * [#2392](https://github.com/open-telemetry/opentelemetry-js/pull/2392) refactor: move detectors to opentelemetry-js-contrib repo ([@legendecas](https://github.com/legendecas)) +* `opentelemetry-exporter-collector-grpc`, `opentelemetry-exporter-collector-proto`, `opentelemetry-exporter-collector`, `opentelemetry-exporter-jaeger`, `opentelemetry-exporter-zipkin`, `opentelemetry-instrumentation-fetch`, `opentelemetry-instrumentation-grpc`, `opentelemetry-instrumentation-http`, `opentelemetry-instrumentation-xml-http-request`, `opentelemetry-sdk-node`, `opentelemetry-sdk-trace-node`, `opentelemetry-sdk-trace-web`, `opentelemetry-shim-opentracing` + * [#2402](https://github.com/open-telemetry/opentelemetry-js/pull/2402) chore: sort entries in tsconfig ([@Flarna](https://github.com/Flarna)) +* `opentelemetry-api-metrics`, `opentelemetry-context-zone-peer-dep` + * [#2390](https://github.com/open-telemetry/opentelemetry-js/pull/2390) chore: fix Lint warnings in api-metrics and context-zone-peer-dep ([@alisabzevari](https://github.com/alisabzevari)) +* Other + * [#2397](https://github.com/open-telemetry/opentelemetry-js/pull/2397) chore: change codeowners to point to team ([@dyladan](https://github.com/dyladan)) + * [#2385](https://github.com/open-telemetry/opentelemetry-js/pull/2385) chore: move api into dependencies in integration tests ([@Flarna](https://github.com/Flarna)) + +### Committers: 11 + +* Aaron Abbott ([@aabmass](https://github.com/aabmass)) +* Ali Sabzevari ([@alisabzevari](https://github.com/alisabzevari)) +* Clark Jacobsohn ([@quickgiant](https://github.com/quickgiant)) +* Daniel Dyla ([@dyladan](https://github.com/dyladan)) +* Gerhard Stöbich ([@Flarna](https://github.com/Flarna)) +* Julien Fabre ([@jufab](https://github.com/jufab)) +* Severin Neumann ([@svrnm](https://github.com/svrnm)) +* Srikanth Chekuri ([@lonewolf3739](https://github.com/lonewolf3739)) +* Valentin Marchaud ([@vmarchaud](https://github.com/vmarchaud)) +* legendecas ([@legendecas](https://github.com/legendecas)) +* t2t2 ([@t2t2](https://github.com/t2t2)) + ## 0.24.0 ### :boom: Breaking Change diff --git a/README.md b/README.md index 1ee337d791..2135c9b784 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ This is the JavaScript version of [OpenTelemetry](https://opentelemetry.io/), a | 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 | diff --git a/backwards-compatability/node10/package.json b/backwards-compatability/node10/package.json index 5982b63496..44969816b7 100644 --- a/backwards-compatability/node10/package.json +++ b/backwards-compatability/node10/package.json @@ -1,6 +1,6 @@ { "name": "backcompat-node10", - "version": "0.24.0", + "version": "0.25.0", "private": true, "description": "Backwards compatability app for node8 types and the OpenTelemetry Node.js SDK", "main": "index.js", @@ -8,8 +8,8 @@ "test:backcompat": "tsc --noEmit index.ts" }, "dependencies": { - "@opentelemetry/sdk-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/sdk-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "devDependencies": { "@types/node": "10.17.60", diff --git a/backwards-compatability/node12/package.json b/backwards-compatability/node12/package.json index e730eb0975..afbf0d8b4a 100644 --- a/backwards-compatability/node12/package.json +++ b/backwards-compatability/node12/package.json @@ -1,6 +1,6 @@ { "name": "backcompat-node12", - "version": "0.24.0", + "version": "0.25.0", "private": true, "description": "Backwards compatability app for node8 types and the OpenTelemetry Node.js SDK", "main": "index.js", @@ -8,11 +8,11 @@ "test:backcompat": "tsc --noEmit index.ts" }, "dependencies": { - "@opentelemetry/sdk-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/sdk-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "devDependencies": { - "@types/node": "12.20.19", + "@types/node": "12.20.20", "typescript": "4.3.5" }, "author": "OpenTelemetry Authors", diff --git a/backwards-compatability/node8/package.json b/backwards-compatability/node8/package.json index a013a0a1cf..37a66f6652 100644 --- a/backwards-compatability/node8/package.json +++ b/backwards-compatability/node8/package.json @@ -1,6 +1,6 @@ { "name": "backcompat-node8", - "version": "0.24.0", + "version": "0.25.0", "private": true, "description": "Backwards compatability app for node8 types and the OpenTelemetry Node.js SDK", "main": "index.js", @@ -8,8 +8,8 @@ "test:backcompat": "tsc --noEmit index.ts" }, "dependencies": { - "@opentelemetry/sdk-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/sdk-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "devDependencies": { "@types/node": "8.10.66", diff --git a/examples/.eslintrc b/examples/.eslintrc.json similarity index 100% rename from examples/.eslintrc rename to examples/.eslintrc.json diff --git a/examples/basic-tracer-node/package.json b/examples/basic-tracer-node/package.json index 990c0c4751..803b5d5d7e 100644 --- a/examples/basic-tracer-node/package.json +++ b/examples/basic-tracer-node/package.json @@ -1,7 +1,7 @@ { "name": "example-basic-tracer-node", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of using @opentelemetry/sdk-trace-base in Node.js", "main": "index.js", "scripts": { @@ -25,8 +25,10 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-jaeger": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/exporter-jaeger": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/collector-exporter-node/package.json b/examples/collector-exporter-node/package.json index 042e27b557..296b66a79c 100644 --- a/examples/collector-exporter-node/package.json +++ b/examples/collector-exporter-node/package.json @@ -1,7 +1,7 @@ { "name": "example-collector-exporter-node", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of using @opentelemetry/collector-exporter in Node.js", "main": "index.js", "scripts": { @@ -29,12 +29,14 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-collector": "0.24.0", - "@opentelemetry/exporter-collector-grpc": "0.24.0", - "@opentelemetry/exporter-collector-proto": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/exporter-collector-grpc": "0.25.0", + "@opentelemetry/exporter-collector-proto": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/grpc-js/package.json b/examples/grpc-js/package.json index d850a2b369..813035f475 100644 --- a/examples/grpc-js/package.json +++ b/examples/grpc-js/package.json @@ -1,7 +1,7 @@ { "name": "grpc-js-example", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of @grpc/grpc-js integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -28,14 +28,16 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@grpc/grpc-js": "^1.2.12", + "@grpc/grpc-js": "^1.3.7", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-jaeger": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/instrumentation-grpc": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/exporter-jaeger": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/instrumentation-grpc": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "google-protobuf": "^3.9.2" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", diff --git a/examples/grpc/package.json b/examples/grpc/package.json index 75f772161b..3d02872b2d 100644 --- a/examples/grpc/package.json +++ b/examples/grpc/package.json @@ -1,7 +1,7 @@ { "name": "grpc-example", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of gRPC integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -29,12 +29,14 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-jaeger": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/instrumentation-grpc": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/exporter-jaeger": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/instrumentation-grpc": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "google-protobuf": "^3.9.2", "grpc": "^1.23.3", "node-pre-gyp": "0.14.0" diff --git a/examples/http/package.json b/examples/http/package.json index 43cbf8b7ae..91d4191af3 100644 --- a/examples/http/package.json +++ b/examples/http/package.json @@ -1,7 +1,7 @@ { "name": "http-example", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of HTTP integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -29,12 +29,14 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-jaeger": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/instrumentation-http": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/exporter-jaeger": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/instrumentation-http": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { diff --git a/examples/https/package.json b/examples/https/package.json index 479eb53ffc..d6c3654a1a 100644 --- a/examples/https/package.json +++ b/examples/https/package.json @@ -1,7 +1,7 @@ { "name": "https-example", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of HTTPs integration with OpenTelemetry", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -30,12 +30,14 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-jaeger": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/instrumentation-http": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/exporter-jaeger": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/instrumentation-http": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { diff --git a/examples/metrics/package.json b/examples/metrics/package.json index a6ec10654c..3ead299775 100644 --- a/examples/metrics/package.json +++ b/examples/metrics/package.json @@ -1,7 +1,7 @@ { "name": "example-metrics", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of using @opentelemetry/sdk-metrics-base", "main": "index.js", "scripts": { @@ -27,9 +27,9 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-prometheus": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-prometheus": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/opentracing-shim/package.json b/examples/opentracing-shim/package.json index 21973dd2b7..b05b197648 100644 --- a/examples/opentracing-shim/package.json +++ b/examples/opentracing-shim/package.json @@ -1,7 +1,7 @@ { "name": "opentracing-shim", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of using @opentelemetry/shim-opentracing in Node.js", "main": "index.js", "scripts": { @@ -30,14 +30,14 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-jaeger": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "@opentelemetry/shim-opentracing": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/exporter-jaeger": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/sdk-trace-node": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "@opentelemetry/shim-opentracing": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "opentracing": "^0.14.4" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", diff --git a/examples/prometheus/package.json b/examples/prometheus/package.json index 7b38ef2072..d6b75714e1 100644 --- a/examples/prometheus/package.json +++ b/examples/prometheus/package.json @@ -1,6 +1,6 @@ { "name": "prometheus-example", - "version": "0.24.0", + "version": "0.25.0", "description": "Example of using @opentelemetry/sdk-metrics-base and @opentelemetry/exporter-prometheus", "main": "index.js", "scripts": { @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/exporter-prometheus": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0" + "@opentelemetry/exporter-prometheus": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0" } } diff --git a/examples/tracer-web/package.json b/examples/tracer-web/package.json index 21c31f09fb..bd85e1c9f8 100644 --- a/examples/tracer-web/package.json +++ b/examples/tracer-web/package.json @@ -1,7 +1,7 @@ { "name": "web-tracer-example", "private": true, - "version": "0.24.0", + "version": "0.25.0", "description": "Example of using @opentelemetry/sdk-trace-web in browser", "main": "index.js", "scripts": { @@ -35,17 +35,17 @@ }, "dependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-collector": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/instrumentation-fetch": "0.24.0", - "@opentelemetry/instrumentation-xml-http-request": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", - "@opentelemetry/sdk-trace-web": "0.24.0" + "@opentelemetry/context-zone": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/instrumentation-fetch": "0.25.0", + "@opentelemetry/instrumentation-xml-http-request": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/propagator-b3": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/sdk-trace-web": "0.25.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/getting-started/.eslintrc.js b/getting-started/.eslintrc.js new file mode 100644 index 0000000000..8580fbfb04 --- /dev/null +++ b/getting-started/.eslintrc.js @@ -0,0 +1,6 @@ +/* eslint-disable global-require */ +/* eslint-disable strict */ + +module.exports = { + ...require('../examples/.eslintrc.json'), +}; diff --git a/getting-started/example/app.js b/getting-started/example/app.js index 86c1a6e802..287ab78cb3 100644 --- a/getting-started/example/app.js +++ b/getting-started/example/app.js @@ -1,40 +1,40 @@ -"use strict"; +'use strict'; -const PORT = process.env.PORT || "8080"; +const PORT = process.env.PORT || '8080'; -const express = require("express"); -const axios = require("axios"); +const express = require('express'); +const axios = require('axios'); const app = express(); -app.get("/", (req, res) => { +app.get('/', (req, res) => { axios .get(`http://localhost:${PORT}/middle-tier`) .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/middle-tier", (req, res) => { +app.get('/middle-tier', (req, res) => { axios .get(`http://localhost:${PORT}/backend`) .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/backend", (req, res) => { - res.send("Hello from the backend"); +app.get('/backend', (req, res) => { + res.send('Hello from the backend'); }); app.listen(parseInt(PORT, 10), () => { diff --git a/getting-started/example/package.json b/getting-started/example/package.json index 3ba7d879d6..4c4e289434 100644 --- a/getting-started/example/package.json +++ b/getting-started/example/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/getting-started-example", - "version": "0.24.0", + "version": "0.25.0", "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", "main": "app.js", "scripts": { diff --git a/getting-started/monitored-example/app.js b/getting-started/monitored-example/app.js index 2144423d6a..af61cef67e 100644 --- a/getting-started/monitored-example/app.js +++ b/getting-started/monitored-example/app.js @@ -1,42 +1,43 @@ -"use strict"; +'use strict'; -const PORT = process.env.PORT || "8080"; +const PORT = process.env.PORT || '8080'; -const express = require("express"); -const axios = require("axios"); +const express = require('express'); +const axios = require('axios'); + +const { countAllRequests } = require('./monitoring'); -const { countAllRequests } = require("./monitoring"); const app = express(); app.use(countAllRequests()); -app.get("/", (req, res) => { +app.get('/', (req, res) => { axios .get(`http://localhost:${PORT}/middle-tier`) .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/middle-tier", (req, res) => { +app.get('/middle-tier', (req, res) => { axios .get(`http://localhost:${PORT}/backend`) .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/backend", (req, res) => { - res.send("Hello from the backend"); +app.get('/backend', (req, res) => { + res.send('Hello from the backend'); }); app.listen(parseInt(PORT, 10), () => { diff --git a/getting-started/monitored-example/monitoring.js b/getting-started/monitored-example/monitoring.js index 4d01ccf675..ca20e8d2fd 100644 --- a/getting-started/monitored-example/monitoring.js +++ b/getting-started/monitored-example/monitoring.js @@ -1,11 +1,11 @@ -"use strict"; - +'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 prometheusPort = PrometheusExporter.DEFAULT_OPTIONS.port; +const prometheusEndpoint = PrometheusExporter.DEFAULT_OPTIONS.endpoint; + const exporter = new PrometheusExporter( { startServer: true, @@ -16,28 +16,25 @@ const exporter = new PrometheusExporter( ); }, ); - + const meter = new MeterProvider({ exporter, interval: 1000, }).getMeter('your-meter-name'); - -const requestCount = meter.createCounter("requests", { - description: "Count all incoming requests" + +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(); - }; -}; +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 index e2869b627c..a8b6c3a66c 100644 --- a/getting-started/monitored-example/package.json +++ b/getting-started/monitored-example/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/getting-started-monitored-example", - "version": "0.24.0", + "version": "0.25.0", "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", "main": "app.js", "scripts": { @@ -9,8 +9,8 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/exporter-prometheus": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", + "@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 index 86c1a6e802..287ab78cb3 100644 --- a/getting-started/traced-example/app.js +++ b/getting-started/traced-example/app.js @@ -1,40 +1,40 @@ -"use strict"; +'use strict'; -const PORT = process.env.PORT || "8080"; +const PORT = process.env.PORT || '8080'; -const express = require("express"); -const axios = require("axios"); +const express = require('express'); +const axios = require('axios'); const app = express(); -app.get("/", (req, res) => { +app.get('/', (req, res) => { axios .get(`http://localhost:${PORT}/middle-tier`) .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/middle-tier", (req, res) => { +app.get('/middle-tier', (req, res) => { axios .get(`http://localhost:${PORT}/backend`) .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/backend", (req, res) => { - res.send("Hello from the backend"); +app.get('/backend', (req, res) => { + res.send('Hello from the backend'); }); app.listen(parseInt(PORT, 10), () => { diff --git a/getting-started/traced-example/package.json b/getting-started/traced-example/package.json index c70ef72f0d..b51de03f72 100644 --- a/getting-started/traced-example/package.json +++ b/getting-started/traced-example/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/getting-started-traced-example", - "version": "0.24.0", + "version": "0.25.0", "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", "main": "app.js", "scripts": { @@ -9,13 +9,13 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-zipkin": "0.25.0", "@opentelemetry/instrumentation-express": "^0.24.0", - "@opentelemetry/instrumentation-http": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "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 index 3508c1a0f2..ae6b88b015 100644 --- a/getting-started/traced-example/tracing.js +++ b/getting-started/traced-example/tracing.js @@ -1,18 +1,18 @@ -"use strict"; +'use strict'; -const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); -const { SimpleSpanProcessor } = require("@opentelemetry/sdk-trace-base"); +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 { 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", - }) + [SemanticResourceAttributes.SERVICE_NAME]: 'getting-started', + }), }); provider.addSpanProcessor( @@ -21,8 +21,8 @@ provider.addSpanProcessor( // 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(); @@ -35,4 +35,4 @@ registerInstrumentations({ ], }); -console.log("tracing initialized"); +console.log('tracing initialized'); diff --git a/getting-started/ts-example/.eslintrc b/getting-started/ts-example/.eslintrc new file mode 100644 index 0000000000..6564779085 --- /dev/null +++ b/getting-started/ts-example/.eslintrc @@ -0,0 +1,16 @@ +{ + "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/example/app.ts b/getting-started/ts-example/example/app.ts index e4267e1421..a252668ebe 100644 --- a/getting-started/ts-example/example/app.ts +++ b/getting-started/ts-example/example/app.ts @@ -1,38 +1,38 @@ -import * as express from "express"; -import axios from "axios"; +import * as express from 'express'; +import axios from 'axios'; -const PORT: string = process.env.PORT || "8080"; +const PORT: string = process.env.PORT || '8080'; const app = express(); -app.get("/", (req, res) => { +app.get('/', (req, res) => { axios .get(`http://localhost:${PORT}/middle-tier`) .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then(response => { + .then((response) => { res.send(response.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/middle-tier", (req, res) => { +app.get('/middle-tier', (req, res) => { axios .get(`http://localhost:${PORT}/backend`) .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then(response => { + .then((response) => { res.send(response.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/backend", (req, res) => { - res.send("Hello from the backend"); +app.get('/backend', (req, res) => { + res.send('Hello from the backend'); }); app.listen(parseInt(PORT, 10), () => { diff --git a/getting-started/ts-example/example/package.json b/getting-started/ts-example/example/package.json index ba41a9a5aa..08ab0b4634 100644 --- a/getting-started/ts-example/example/package.json +++ b/getting-started/ts-example/example/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/getting-started-ts-example", - "version": "0.24.0", + "version": "0.25.0", "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", "main": "app.ts", "scripts": { @@ -10,8 +10,8 @@ "license": "Apache-2.0", "devDependencies": { "@types/express": "4.17.13", - "@types/node": "14.17.9", - "ts-node": "10.1.0" + "@types/node": "14.17.11", + "ts-node": "10.2.1" }, "dependencies": { "axios": "^0.21.0", diff --git a/getting-started/ts-example/monitored-example/app.ts b/getting-started/ts-example/monitored-example/app.ts index 047c263836..9307eba1ac 100644 --- a/getting-started/ts-example/monitored-example/app.ts +++ b/getting-started/ts-example/monitored-example/app.ts @@ -1,40 +1,40 @@ -import * as express from "express"; -import axios from "axios"; - -const PORT: string = process.env.PORT || "8080"; +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) => { +app.get('/', (req, res) => { axios .get(`http://localhost:${PORT}/middle-tier`) .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/middle-tier", (req, res) => { +app.get('/middle-tier', (req, res) => { axios .get(`http://localhost:${PORT}/backend`) .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/backend", (req, res) => { - res.send("Hello from the backend"); +app.get('/backend', (req, res) => { + res.send('Hello from the backend'); }); app.listen(parseInt(PORT, 10), () => { diff --git a/getting-started/ts-example/monitored-example/monitoring.ts b/getting-started/ts-example/monitored-example/monitoring.ts index 626cc76323..5e933e4a93 100644 --- a/getting-started/ts-example/monitored-example/monitoring.ts +++ b/getting-started/ts-example/monitored-example/monitoring.ts @@ -27,15 +27,13 @@ const requestCount = meter.createCounter('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); - } +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(); - }; + 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 index cc47ce0b08..3e4138059e 100644 --- a/getting-started/ts-example/monitored-example/package.json +++ b/getting-started/ts-example/monitored-example/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/getting-started-monitored-ts-example", - "version": "0.24.0", + "version": "0.25.0", "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", "main": "app.ts", "scripts": { @@ -10,12 +10,12 @@ "license": "Apache-2.0", "devDependencies": { "@types/express": "4.17.13", - "@types/node": "14.17.9", - "ts-node": "10.1.0" + "@types/node": "14.17.11", + "ts-node": "10.2.1" }, "dependencies": { - "@opentelemetry/exporter-prometheus": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", + "@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 index 41b6a43394..58fb8ab589 100644 --- a/getting-started/ts-example/traced-example/app.ts +++ b/getting-started/ts-example/traced-example/app.ts @@ -1,38 +1,38 @@ -import * as express from "express"; -import axios from "axios"; +import * as express from 'express'; +import axios from 'axios'; -const PORT: string = process.env.PORT || "8080"; +const PORT: string = process.env.PORT || '8080'; const app = express(); -app.get("/", (req, res) => { +app.get('/', (req, res) => { axios .get(`http://localhost:${PORT}/middle-tier`) .then(() => axios.get(`http://localhost:${PORT}/middle-tier`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/middle-tier", (req, res) => { +app.get('/middle-tier', (req, res) => { axios .get(`http://localhost:${PORT}/backend`) .then(() => axios.get(`http://localhost:${PORT}/backend`)) - .then(result => { + .then((result) => { res.send(result.data); }) - .catch(err => { + .catch((err) => { console.error(err); res.status(500).send(); }); }); -app.get("/backend", (req, res) => { - res.send("Hello from the backend"); +app.get('/backend', (req, res) => { + res.send('Hello from the backend'); }); app.listen(parseInt(PORT, 10), () => { diff --git a/getting-started/ts-example/traced-example/package.json b/getting-started/ts-example/traced-example/package.json index 5969f5da1c..3739e79b06 100644 --- a/getting-started/ts-example/traced-example/package.json +++ b/getting-started/ts-example/traced-example/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/getting-started-traced-ts-example", - "version": "0.24.0", + "version": "0.25.0", "description": "This repository provides everything required to follow the OpenTelemetry Getting Started Guide", "main": "app.ts", "scripts": { @@ -10,17 +10,17 @@ "license": "Apache-2.0", "devDependencies": { "@types/express": "4.17.13", - "@types/node": "14.17.9", - "ts-node": "10.1.0" + "@types/node": "14.17.11", + "ts-node": "10.2.1" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-zipkin": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", + "@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.24.0", - "@opentelemetry/instrumentation-http": "0.24.0", - "@opentelemetry/sdk-trace-base": "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 index fe2ce7e4b2..4426da25f9 100644 --- a/getting-started/ts-example/traced-example/tracing.ts +++ b/getting-started/ts-example/traced-example/tracing.ts @@ -1,9 +1,10 @@ import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; -const { Resource } = require('@opentelemetry/resources'); -const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions'); 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'; @@ -36,5 +37,4 @@ registerInstrumentations({ ], }); - console.log('tracing initialized'); diff --git a/integration-tests/propagation-validation-server/package.json b/integration-tests/propagation-validation-server/package.json index 83efcb4c42..47e540e6c5 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.24.0", + "version": "0.25.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.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/context-async-hooks": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "axios": "0.21.1", "body-parser": "1.19.0", "express": "4.17.1" diff --git a/lerna.json b/lerna.json index ee977aed55..6b65c7eabf 100644 --- a/lerna.json +++ b/lerna.json @@ -8,7 +8,7 @@ "packages/*", "integration-tests/*" ], - "version": "0.24.0", + "version": "0.25.0", "changelog": { "repo": "open-telemetry/opentelemetry-js", "labels": { diff --git a/package.json b/package.json index 93e932bc30..1feadeb7ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opentelemetry", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry is a distributed tracing and stats collection framework.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -17,7 +17,7 @@ "test": "lerna run test", "test:browser": "lerna run test:browser", "test:backcompat": "lerna run test:backcompat", - "bootstrap": "lerna bootstrap", + "bootstrap": "lerna bootstrap --hoist --nohoist='zone.js'", "changelog": "lerna-changelog", "codecov": "lerna run codecov", "codecov:browser": "lerna run codecov:browser", @@ -30,6 +30,8 @@ "lint:fix:changed": "lerna run --concurrency 1 --stream lint:fix --since HEAD --exclude-dependents", "lint:examples": "eslint ./examples/**/*.js", "lint:examples:fix": "eslint ./examples/**/*.js --fix", + "lint:getting-started": "eslint ./getting-started/**/*.{js,ts}", + "lint:getting-started:fix": "eslint ./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" @@ -47,21 +49,21 @@ "devDependencies": { "@commitlint/cli": "13.1.0", "@commitlint/config-conventional": "13.1.0", - "@typescript-eslint/eslint-plugin": "4.29.0", - "@typescript-eslint/parser": "4.29.0", + "@typescript-eslint/eslint-plugin": "4.29.3", + "@typescript-eslint/parser": "4.29.3", "beautify-benchmark": "0.2.4", "benchmark": "2.1.4", "eslint": "7.32.0", "eslint-config-airbnb-base": "14.2.1", "eslint-plugin-header": "3.1.1", - "eslint-plugin-import": "2.23.4", + "eslint-plugin-import": "2.24.1", "eslint-plugin-node": "11.1.0", "gh-pages": "3.2.3", "husky": "4.3.8", "lerna": "3.22.1", "lerna-changelog": "1.0.1", "markdownlint-cli": "0.28.1", - "typedoc": "0.21.5", + "typedoc": "0.21.6", "typescript": "4.3.5", "update-ts-references": "2.4.0" }, diff --git a/packages/opentelemetry-api-metrics/package.json b/packages/opentelemetry-api-metrics/package.json index 25164619e0..7e3b4875c6 100644 --- a/packages/opentelemetry-api-metrics/package.json +++ b/packages/opentelemetry-api-metrics/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/api-metrics", - "version": "0.24.0", + "version": "0.25.0", "description": "Public metrics API for OpenTelemetry", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -58,7 +58,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/webpack-env": "1.16.2", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", diff --git a/packages/opentelemetry-api-metrics/src/version.ts b/packages/opentelemetry-api-metrics/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-api-metrics/src/version.ts +++ b/packages/opentelemetry-api-metrics/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-context-async-hooks/package.json b/packages/opentelemetry-context-async-hooks/package.json index bed9dce96d..0a57bcfb9a 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry AsyncHooks-based Context Manager", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -42,8 +42,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", - "@types/shimmer": "1.0.2", + "@types/node": "14.17.11", "codecov": "3.8.3", "mocha": "7.2.0", "nyc": "15.1.0", diff --git a/packages/opentelemetry-context-async-hooks/src/version.ts b/packages/opentelemetry-context-async-hooks/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-context-async-hooks/src/version.ts +++ b/packages/opentelemetry-context-async-hooks/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json index 9fd27f1046..14e460f732 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry Context Zone with peer dependency for zone.js", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -48,7 +48,7 @@ "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "@types/zone.js": "0.5.12", @@ -69,7 +69,7 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "zone.js": "0.11.4" }, "peerDependencies": { diff --git a/packages/opentelemetry-context-zone-peer-dep/src/version.ts b/packages/opentelemetry-context-zone-peer-dep/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-context-zone-peer-dep/src/version.ts +++ b/packages/opentelemetry-context-zone-peer-dep/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json index 209944054e..a9da422132 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry Context Zone", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -44,7 +44,7 @@ "devDependencies": { "@babel/core": "7.15.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", @@ -62,11 +62,11 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" }, "dependencies": { - "@opentelemetry/context-zone-peer-dep": "0.24.0", + "@opentelemetry/context-zone-peer-dep": "0.25.0", "zone.js": "^0.11.0" }, "sideEffects": true diff --git a/packages/opentelemetry-context-zone/src/version.ts b/packages/opentelemetry-context-zone/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-context-zone/src/version.ts +++ b/packages/opentelemetry-context-zone/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json index cd99ea3f0d..27766c1c29 100644 --- a/packages/opentelemetry-core/package.json +++ b/packages/opentelemetry-core/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/core", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry Core provides default and no-op implementations of the OpenTelemetry types for trace and metrics", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -57,7 +57,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/semver": "7.3.8", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", @@ -82,7 +82,7 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/semantic-conventions": "0.24.0", - "semver": "^7.1.3" + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" } } diff --git a/packages/opentelemetry-core/src/baggage/propagation/HttpBaggagePropagator.ts b/packages/opentelemetry-core/src/baggage/propagation/HttpBaggagePropagator.ts index 3cd023c719..521b4c55cd 100644 --- a/packages/opentelemetry-core/src/baggage/propagation/HttpBaggagePropagator.ts +++ b/packages/opentelemetry-core/src/baggage/propagation/HttpBaggagePropagator.ts @@ -43,7 +43,7 @@ import { * https://w3c.github.io/baggage/ */ export class HttpBaggagePropagator implements TextMapPropagator { - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { const baggage = propagation.getBaggage(context); if (!baggage || isTracingSuppressed(context)) return; const keyPairs = getKeyPairs(baggage) diff --git a/packages/opentelemetry-core/src/baggage/utils.ts b/packages/opentelemetry-core/src/baggage/utils.ts index 25935cf8f6..6292866cab 100644 --- a/packages/opentelemetry-core/src/baggage/utils.ts +++ b/packages/opentelemetry-core/src/baggage/utils.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Baggage, baggageEntryMetadataFromString } from '@opentelemetry/api'; +import { Baggage, BaggageEntryMetadata, baggageEntryMetadataFromString } from '@opentelemetry/api'; import { BAGGAGE_ITEMS_SEPARATOR, BAGGAGE_PROPERTIES_SEPARATOR, @@ -21,25 +21,26 @@ import { BAGGAGE_MAX_TOTAL_LENGTH, } from './constants'; -export const serializeKeyPairs = (keyPairs: string[]) => { +type ParsedBaggageKeyValue = { key: string, value: string, metadata: BaggageEntryMetadata | undefined }; + +export function serializeKeyPairs(keyPairs: string[]): string { return keyPairs.reduce((hValue: string, current: string) => { - const value = `${hValue}${ - hValue !== '' ? BAGGAGE_ITEMS_SEPARATOR : '' - }${current}`; + const value = `${hValue}${hValue !== '' ? BAGGAGE_ITEMS_SEPARATOR : '' + }${current}`; return value.length > BAGGAGE_MAX_TOTAL_LENGTH ? hValue : value; }, ''); -}; +} -export const getKeyPairs = (baggage: Baggage): string[] => { +export function getKeyPairs(baggage: Baggage): string[] { return baggage .getAllEntries() .map( ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}` ); -}; +} -export const parsePairKeyValue = (entry: string) => { +export function parsePairKeyValue(entry: string): ParsedBaggageKeyValue | undefined { const valueProps = entry.split(BAGGAGE_PROPERTIES_SEPARATOR); if (valueProps.length <= 0) return; const keyPairPart = valueProps.shift(); @@ -55,13 +56,13 @@ export const parsePairKeyValue = (entry: string) => { ); } return { key, value, metadata }; -}; +} /** * Parse a string serialized in the baggage HTTP Format (without metadata): * https://github.com/w3c/baggage/blob/master/baggage/HTTP_HEADER_FORMAT.md */ -export const parseKeyPairsIntoRecord = (value?: string) => { +export function parseKeyPairsIntoRecord(value?: string): Record { if (typeof value !== 'string' || value.length === 0) return {}; return value .split(BAGGAGE_ITEMS_SEPARATOR) @@ -70,7 +71,8 @@ export const parseKeyPairsIntoRecord = (value?: string) => { }) .filter(keyPair => keyPair !== undefined && keyPair.value.length > 0) .reduce>((headers, keyPair) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion headers[keyPair!.key] = keyPair!.value; return headers; }, {}); -}; +} diff --git a/packages/opentelemetry-core/src/common/attributes.ts b/packages/opentelemetry-core/src/common/attributes.ts index df6b8f7a57..34fe493d9d 100644 --- a/packages/opentelemetry-core/src/common/attributes.ts +++ b/packages/opentelemetry-core/src/common/attributes.ts @@ -22,6 +22,7 @@ export function sanitizeAttributes(attributes: unknown): SpanAttributes { return out; } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion for (const [k, v] of Object.entries(attributes!)) { if (isAttributeValue(v)) { if (Array.isArray(v)) { diff --git a/packages/opentelemetry-core/src/common/global-error-handler.ts b/packages/opentelemetry-core/src/common/global-error-handler.ts index e8461aba76..9ef103e404 100644 --- a/packages/opentelemetry-core/src/common/global-error-handler.ts +++ b/packages/opentelemetry-core/src/common/global-error-handler.ts @@ -25,7 +25,7 @@ let delegateHandler = loggingErrorHandler(); * Set the global error handler * @param {ErrorHandler} handler */ -export function setGlobalErrorHandler(handler: ErrorHandler) { +export function setGlobalErrorHandler(handler: ErrorHandler): void { delegateHandler = handler; } @@ -33,8 +33,8 @@ export function setGlobalErrorHandler(handler: ErrorHandler) { * Return the global error handler * @param {Exception} ex */ -export const globalErrorHandler = (ex: Exception) => { +export function globalErrorHandler(ex: Exception): void { try { delegateHandler(ex); } catch {} // eslint-disable-line no-empty -}; +} diff --git a/packages/opentelemetry-core/src/common/time.ts b/packages/opentelemetry-core/src/common/time.ts index ce56ab8605..bb7b2bd3d7 100644 --- a/packages/opentelemetry-core/src/common/time.ts +++ b/packages/opentelemetry-core/src/common/time.ts @@ -115,45 +115,45 @@ export function hrTimeDuration( /** * Convert hrTime to timestamp, for example "2019-05-14T17:00:00.000123456Z" - * @param hrTime + * @param time */ -export function hrTimeToTimeStamp(hrTime: api.HrTime): string { +export function hrTimeToTimeStamp(time: api.HrTime): string { const precision = NANOSECOND_DIGITS; - const tmp = `${'0'.repeat(precision)}${hrTime[1]}Z`; + const tmp = `${'0'.repeat(precision)}${time[1]}Z`; const nanoString = tmp.substr(tmp.length - precision - 1); - const date = new Date(hrTime[0] * 1000).toISOString(); + const date = new Date(time[0] * 1000).toISOString(); return date.replace('000Z', nanoString); } /** * Convert hrTime to nanoseconds. - * @param hrTime + * @param time */ -export function hrTimeToNanoseconds(hrTime: api.HrTime): number { - return hrTime[0] * SECOND_TO_NANOSECONDS + hrTime[1]; +export function hrTimeToNanoseconds(time: api.HrTime): number { + return time[0] * SECOND_TO_NANOSECONDS + time[1]; } /** * Convert hrTime to milliseconds. - * @param hrTime + * @param time */ -export function hrTimeToMilliseconds(hrTime: api.HrTime): number { - return Math.round(hrTime[0] * 1e3 + hrTime[1] / 1e6); +export function hrTimeToMilliseconds(time: api.HrTime): number { + return Math.round(time[0] * 1e3 + time[1] / 1e6); } /** * Convert hrTime to microseconds. - * @param hrTime + * @param time */ -export function hrTimeToMicroseconds(hrTime: api.HrTime): number { - return Math.round(hrTime[0] * 1e6 + hrTime[1] / 1e3); +export function hrTimeToMicroseconds(time: api.HrTime): number { + return Math.round(time[0] * 1e6 + time[1] / 1e3); } /** * check if time is HrTime * @param value */ -export function isTimeInputHrTime(value: unknown) { +export function isTimeInputHrTime(value: unknown): value is api.HrTime { return ( Array.isArray(value) && value.length === 2 && @@ -166,7 +166,7 @@ export function isTimeInputHrTime(value: unknown) { * check if input value is a correct types.TimeInput * @param value */ -export function isTimeInput(value: unknown) { +export function isTimeInput(value: unknown): value is api.HrTime | number | Date { return ( isTimeInputHrTime(value) || typeof value === 'number' || diff --git a/packages/opentelemetry-core/src/common/types.ts b/packages/opentelemetry-core/src/common/types.ts index 6d68be37dc..99ab0d08fd 100644 --- a/packages/opentelemetry-core/src/common/types.ts +++ b/packages/opentelemetry-core/src/common/types.ts @@ -31,9 +31,11 @@ export interface TimeOriginLegacy { * This interface defines the params that are be added to the wrapped function * using the "shimmer.wrap" */ -export interface ShimWrapped { +export interface ShimWrapped extends Function { __wrapped: boolean; + // eslint-disable-next-line @typescript-eslint/ban-types __unwrap: Function; + // eslint-disable-next-line @typescript-eslint/ban-types __original: Function; } diff --git a/packages/opentelemetry-core/src/propagation/composite.ts b/packages/opentelemetry-core/src/propagation/composite.ts index 3a02890bed..245507a110 100644 --- a/packages/opentelemetry-core/src/propagation/composite.ts +++ b/packages/opentelemetry-core/src/propagation/composite.ts @@ -64,7 +64,7 @@ export class CompositePropagator implements TextMapPropagator { * @param context Context to inject * @param carrier Carrier into which context will be injected */ - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { for (const propagator of this._propagators) { try { propagator.inject(context, carrier, setter); diff --git a/packages/opentelemetry-core/src/trace/HttpTraceContextPropagator.ts b/packages/opentelemetry-core/src/trace/HttpTraceContextPropagator.ts index 53d3bf11fb..b41d99fbf9 100644 --- a/packages/opentelemetry-core/src/trace/HttpTraceContextPropagator.ts +++ b/packages/opentelemetry-core/src/trace/HttpTraceContextPropagator.ts @@ -71,7 +71,7 @@ export function parseTraceParent(traceParent: string): SpanContext | null { * https://www.w3.org/TR/trace-context/ */ export class HttpTraceContextPropagator implements TextMapPropagator { - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { const spanContext = trace.getSpanContext(context); if ( !spanContext || diff --git a/packages/opentelemetry-core/src/utils/environment.ts b/packages/opentelemetry-core/src/utils/environment.ts index 78b7f1f248..b6e9dc5db4 100644 --- a/packages/opentelemetry-core/src/utils/environment.ts +++ b/packages/opentelemetry-core/src/utils/environment.ts @@ -28,6 +28,7 @@ const ENVIRONMENT_NUMBERS_KEYS = [ 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE', 'OTEL_BSP_MAX_QUEUE_SIZE', 'OTEL_BSP_SCHEDULE_DELAY', + 'OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT', 'OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT', 'OTEL_SPAN_EVENT_COUNT_LIMIT', 'OTEL_SPAN_LINK_COUNT_LIMIT', @@ -117,6 +118,7 @@ export const DEFAULT_ENVIRONMENT: Required = { OTEL_PROPAGATORS: ['tracecontext', 'baggage'], OTEL_RESOURCE_ATTRIBUTES: '', OTEL_SERVICE_NAME: '', + OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT: Infinity, OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: 128, OTEL_SPAN_EVENT_COUNT_LIMIT: 128, OTEL_SPAN_LINK_COUNT_LIMIT: 128, diff --git a/packages/opentelemetry-core/src/utils/wrap.ts b/packages/opentelemetry-core/src/utils/wrap.ts index b566a78bbf..a32da96463 100644 --- a/packages/opentelemetry-core/src/utils/wrap.ts +++ b/packages/opentelemetry-core/src/utils/wrap.ts @@ -20,7 +20,7 @@ import { ShimWrapped } from '../common/types'; * Checks if certain function has been already wrapped * @param func */ -export function isWrapped(func: any) { +export function isWrapped(func: unknown): func is ShimWrapped { return ( typeof func === 'function' && typeof (func as ShimWrapped).__original === 'function' && diff --git a/packages/opentelemetry-core/src/version.ts b/packages/opentelemetry-core/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-core/src/version.ts +++ b/packages/opentelemetry-core/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-core/test/utils/environment.test.ts b/packages/opentelemetry-core/test/utils/environment.test.ts index a993f10083..3f3a709b62 100644 --- a/packages/opentelemetry-core/test/utils/environment.test.ts +++ b/packages/opentelemetry-core/test/utils/environment.test.ts @@ -84,6 +84,7 @@ describe('environment', () => { OTEL_LOG_LEVEL: 'ERROR', OTEL_NO_PATCH_MODULES: 'a,b,c', OTEL_RESOURCE_ATTRIBUTES: '', + OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT: 100, OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: 10, OTEL_SPAN_EVENT_COUNT_LIMIT: 20, OTEL_SPAN_LINK_COUNT_LIMIT: 30, @@ -93,6 +94,7 @@ describe('environment', () => { const env = getEnv(); assert.deepStrictEqual(env.OTEL_NO_PATCH_MODULES, ['a', 'b', 'c']); assert.strictEqual(env.OTEL_LOG_LEVEL, DiagLogLevel.ERROR); + assert.strictEqual(env.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT, 100); assert.strictEqual(env.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, 10); assert.strictEqual(env.OTEL_SPAN_EVENT_COUNT_LIMIT, 20); assert.strictEqual(env.OTEL_SPAN_LINK_COUNT_LIMIT, 30); diff --git a/packages/opentelemetry-exporter-collector-grpc/package.json b/packages/opentelemetry-exporter-collector-grpc/package.json index ab80a0173d..9f6dffbfad 100644 --- a/packages/opentelemetry-exporter-collector-grpc/package.json +++ b/packages/opentelemetry-exporter-collector-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-collector-grpc", - "version": "0.24.0", + "version": "0.25.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", @@ -47,9 +47,9 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/api-metrics": "0.24.0", + "@opentelemetry/api-metrics": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "cpx": "1.5.0", @@ -65,12 +65,12 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@grpc/grpc-js": "^1.2.12", - "@grpc/proto-loader": "^0.6.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-collector": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0" } } diff --git a/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts b/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts index 1ddac9722d..da9a1b9d76 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/CollectorExporterNodeBase.ts @@ -61,25 +61,17 @@ export abstract class CollectorExporterNodeBase< onSuccess: () => void, onError: (error: collectorTypes.CollectorExporterError) => void ): void { - const promise = new Promise(resolve => { - const _onSuccess = (): void => { - onSuccess(); - _onFinish(); - }; - const _onError = (error: collectorTypes.CollectorExporterError): void => { - onError(error); - _onFinish(); - }; - const _onFinish = () => { - resolve(); - const index = this._sendingPromises.indexOf(promise); - this._sendingPromises.splice(index, 1); - }; - - this._send(this, objects, _onSuccess, _onError); - }); + const promise = new Promise((resolve, reject) => { + this._send(this, objects, resolve, reject); + }) + .then(onSuccess, onError); this._sendingPromises.push(promise); + const popPromise = () => { + const index = this._sendingPromises.indexOf(promise); + this._sendingPromises.splice(index, 1); + } + promise.then(popPromise, popPromise); } onInit(config: CollectorExporterConfigNode): void { diff --git a/packages/opentelemetry-exporter-collector-grpc/src/version.ts b/packages/opentelemetry-exporter-collector-grpc/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-exporter-collector-grpc/src/version.ts +++ b/packages/opentelemetry-exporter-collector-grpc/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-exporter-collector-grpc/test/CollectorExporterNodeBase.test.ts b/packages/opentelemetry-exporter-collector-grpc/test/CollectorExporterNodeBase.test.ts new file mode 100644 index 0000000000..84042f6ed5 --- /dev/null +++ b/packages/opentelemetry-exporter-collector-grpc/test/CollectorExporterNodeBase.test.ts @@ -0,0 +1,156 @@ +/* + * 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 { collectorTypes } from '@opentelemetry/exporter-collector'; +import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; + +import * as assert from 'assert'; +import { CollectorExporterNodeBase } from '../src/CollectorExporterNodeBase'; +import { CollectorExporterConfigNode, ServiceClientType } from '../src/types'; +import { mockedReadableSpan } from './helper'; + +class MockCollectorExporter extends CollectorExporterNodeBase< + ReadableSpan, + ReadableSpan[] +> { + /** + * Callbacks passed to _send() + */ + sendCallbacks: { + onSuccess: () => void; + onError: (error: collectorTypes.CollectorExporterError) => void; + }[] = []; + + getDefaultUrl(config: CollectorExporterConfigNode): string { + return ''; + } + + getDefaultServiceName(config: CollectorExporterConfigNode): string { + return ''; + } + + convert(spans: ReadableSpan[]): ReadableSpan[] { + return spans; + } + + getServiceClientType() { + return ServiceClientType.SPANS; + } + + getServiceProtoPath(): string { + return 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; + } +} + +// Mocked _send which just saves the callbacks for later +MockCollectorExporter.prototype['_send'] = function _sendMock( + self: MockCollectorExporter, + objects: ReadableSpan[], + onSuccess: () => void, + onError: (error: collectorTypes.CollectorExporterError) => void +): void { + self.sendCallbacks.push({ onSuccess, onError }); +}; + +describe('CollectorExporterNodeBase', () => { + let exporter: MockCollectorExporter; + const concurrencyLimit = 5; + + beforeEach(done => { + exporter = new MockCollectorExporter({ concurrencyLimit }); + done(); + }); + + describe('export', () => { + it('should export requests concurrently', async () => { + const spans = [Object.assign({}, mockedReadableSpan)]; + const numToExport = concurrencyLimit; + + for (let i = 0; i < numToExport; ++i) { + exporter.export(spans, () => {}); + } + + assert.strictEqual(exporter['_sendingPromises'].length, numToExport); + const promisesAllDone = Promise.all(exporter['_sendingPromises']); + // Mock that all requests finish sending + exporter.sendCallbacks.forEach(({ onSuccess }) => onSuccess()); + + // All finished promises should be popped off + await promisesAllDone; + assert.strictEqual(exporter['_sendingPromises'].length, 0); + }); + + it('should drop new export requests when already sending at concurrencyLimit', async () => { + const spans = [Object.assign({}, mockedReadableSpan)]; + const numToExport = concurrencyLimit + 5; + + for (let i = 0; i < numToExport; ++i) { + exporter.export(spans, () => {}); + } + + assert.strictEqual(exporter['_sendingPromises'].length, concurrencyLimit); + const promisesAllDone = Promise.all(exporter['_sendingPromises']); + // Mock that all requests finish sending + exporter.sendCallbacks.forEach(({ onSuccess }) => onSuccess()); + + // All finished promises should be popped off + await promisesAllDone; + assert.strictEqual(exporter['_sendingPromises'].length, 0); + }); + + it('should pop export request promises even if they failed', async () => { + const spans = [Object.assign({}, mockedReadableSpan)]; + + exporter.export(spans, () => {}); + assert.strictEqual(exporter['_sendingPromises'].length, 1); + const promisesAllDone = Promise.all(exporter['_sendingPromises']); + // Mock that all requests fail sending + exporter.sendCallbacks.forEach(({ onError }) => + onError(new Error('Failed to send!!')) + ); + + // All finished promises should be popped off + await promisesAllDone; + assert.strictEqual(exporter['_sendingPromises'].length, 0); + }); + + it('should pop export request promises even if success callback throws error', async () => { + const spans = [Object.assign({}, mockedReadableSpan)]; + + exporter['_sendPromise']( + spans, + () => { + throw new Error('Oops'); + }, + () => {} + ); + + assert.strictEqual(exporter['_sendingPromises'].length, 1); + const promisesAllDone = Promise.all(exporter['_sendingPromises']) + // catch expected unhandled exception + .catch(() => {}); + + // Mock that the request finishes sending + exporter.sendCallbacks.forEach(({ onSuccess }) => { + onSuccess(); + }); + + // All finished promises should be popped off + await promisesAllDone; + assert.strictEqual(exporter['_sendingPromises'].length, 0); + }); + }); +}); diff --git a/packages/opentelemetry-exporter-collector-proto/package.json b/packages/opentelemetry-exporter-collector-proto/package.json index 03490d9f94..3c75cd7217 100644 --- a/packages/opentelemetry-exporter-collector-proto/package.json +++ b/packages/opentelemetry-exporter-collector-proto/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-collector-proto", - "version": "0.24.0", + "version": "0.25.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", @@ -47,9 +47,9 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/api-metrics": "0.24.0", + "@opentelemetry/api-metrics": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "cpx": "1.5.0", @@ -65,12 +65,12 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@grpc/proto-loader": "^0.6.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/exporter-collector": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "protobufjs": "^6.9.0" } } diff --git a/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts b/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts index 3f2e4c53bc..9ff36306b7 100644 --- a/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts +++ b/packages/opentelemetry-exporter-collector-proto/src/CollectorExporterNodeBase.ts @@ -47,25 +47,17 @@ export abstract class CollectorExporterNodeBase< onSuccess: () => void, onError: (error: collectorTypes.CollectorExporterError) => void ): void { - const promise = new Promise(resolve => { - const _onSuccess = (): void => { - onSuccess(); - _onFinish(); - }; - const _onError = (error: collectorTypes.CollectorExporterError): void => { - onError(error); - _onFinish(); - }; - const _onFinish = () => { - resolve(); - const index = this._sendingPromises.indexOf(promise); - this._sendingPromises.splice(index, 1); - }; - - this._send(this, objects, this.compression, _onSuccess, _onError); - }); + const promise = new Promise((resolve, reject) => { + this._send(this, objects, this.compression, resolve, reject); + }) + .then(onSuccess, onError); this._sendingPromises.push(promise); + const popPromise = () => { + const index = this._sendingPromises.indexOf(promise); + this._sendingPromises.splice(index, 1); + } + promise.then(popPromise, popPromise); } override onInit(config: CollectorExporterNodeConfigBase): void { diff --git a/packages/opentelemetry-exporter-collector-proto/src/version.ts b/packages/opentelemetry-exporter-collector-proto/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-exporter-collector-proto/src/version.ts +++ b/packages/opentelemetry-exporter-collector-proto/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index 5279a8f641..532c5122a3 100644 --- a/packages/opentelemetry-exporter-collector/package.json +++ b/packages/opentelemetry-exporter-collector/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-collector", - "version": "0.24.0", + "version": "0.25.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", @@ -56,7 +56,7 @@ "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", @@ -77,17 +77,17 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@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" } } diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts index 8e9a089c09..bf4af404b9 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporterBrowserBase.ts @@ -76,27 +76,20 @@ export abstract class CollectorExporterBrowserBase< const serviceRequest = this.convert(items); const body = JSON.stringify(serviceRequest); - const promise = new Promise(resolve => { - const _onSuccess = (): void => { - onSuccess(); - _onFinish(); - }; - const _onError = (error: collectorTypes.CollectorExporterError): void => { - onError(error); - _onFinish(); - }; - const _onFinish = () => { - resolve(); - const index = this._sendingPromises.indexOf(promise); - this._sendingPromises.splice(index, 1); - }; - + const promise = new Promise((resolve, reject) => { if (this._useXHR) { - sendWithXhr(body, this.url, this._headers, _onSuccess, _onError); + sendWithXhr(body, this.url, this._headers, resolve, reject); } else { - sendWithBeacon(body, this.url, { type: 'application/json' }, _onSuccess, _onError); + sendWithBeacon(body, this.url, { type: 'application/json' }, resolve, reject); } - }); + }) + .then(onSuccess, onError); + this._sendingPromises.push(promise); + const popPromise = () => { + const index = this._sendingPromises.indexOf(promise); + this._sendingPromises.splice(index, 1); + } + promise.then(popPromise, popPromise); } } diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts index 10a5bdca19..a60993e84c 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporterNodeBase.ts @@ -70,30 +70,23 @@ export abstract class CollectorExporterNodeBase< } const serviceRequest = this.convert(objects); - const promise = new Promise(resolve => { - const _onSuccess = (): void => { - onSuccess(); - _onFinish(); - }; - const _onError = (error: collectorTypes.CollectorExporterError): void => { - onError(error); - _onFinish(); - }; - const _onFinish = () => { - resolve(); - const index = this._sendingPromises.indexOf(promise); - this._sendingPromises.splice(index, 1); - }; + const promise = new Promise((resolve, reject) => { sendWithHttp( this, JSON.stringify(serviceRequest), 'application/json', - _onSuccess, - _onError + resolve, + reject ); - }); + }) + .then(onSuccess, onError); this._sendingPromises.push(promise); + const popPromise = () => { + const index = this._sendingPromises.indexOf(promise); + this._sendingPromises.splice(index, 1); + } + promise.then(popPromise, popPromise); } onShutdown(): void {} diff --git a/packages/opentelemetry-exporter-collector/src/version.ts b/packages/opentelemetry-exporter-collector/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-exporter-collector/src/version.ts +++ b/packages/opentelemetry-exporter-collector/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json index 941e752758..d4eb08a7db 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry Exporter Jaeger allows user to send collected traces to Jaeger", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,9 +41,9 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/resources": "0.24.0", + "@opentelemetry/resources": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "mocha": "7.2.0", @@ -58,9 +58,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", "jaeger-client": "^3.15.0" } } diff --git a/packages/opentelemetry-exporter-jaeger/src/version.ts b/packages/opentelemetry-exporter-jaeger/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-exporter-jaeger/src/version.ts +++ b/packages/opentelemetry-exporter-jaeger/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-exporter-prometheus/package.json b/packages/opentelemetry-exporter-prometheus/package.json index 98cfd11851..e6dbfdbf83 100644 --- a/packages/opentelemetry-exporter-prometheus/package.json +++ b/packages/opentelemetry-exporter-prometheus/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/exporter-prometheus", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry Exporter Prometheus provides a metrics endpoint for Prometheus", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,7 +41,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "mocha": "7.2.0", @@ -55,8 +55,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0" + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/sdk-metrics-base": "0.25.0" } } diff --git a/packages/opentelemetry-exporter-prometheus/src/version.ts b/packages/opentelemetry-exporter-prometheus/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-exporter-prometheus/src/version.ts +++ b/packages/opentelemetry-exporter-prometheus/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 60b28be907..f217b811e7 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry Zipkin Exporter allows the user to send collected traces to Zipkin.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -54,7 +54,7 @@ "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", @@ -75,16 +75,16 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" } } diff --git a/packages/opentelemetry-exporter-zipkin/src/version.ts b/packages/opentelemetry-exporter-zipkin/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-exporter-zipkin/src/version.ts +++ b/packages/opentelemetry-exporter-zipkin/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts index 17d2eb2bf9..557c0faef3 100644 --- a/packages/opentelemetry-exporter-zipkin/src/zipkin.ts +++ b/packages/opentelemetry-exporter-zipkin/src/zipkin.ts @@ -84,11 +84,16 @@ export class ZipkinExporter implements SpanExporter { this._sendSpans(spans, serviceName, result => { resolve(); resultCallback(result); - const index = this._sendingPromises.indexOf(promise); - this._sendingPromises.splice(index, 1); }); }); + + this._sendingPromises.push(promise); + const popPromise = () => { + const index = this._sendingPromises.indexOf(promise); + this._sendingPromises.splice(index, 1); + } + promise.then(popPromise, popPromise); } /** diff --git a/packages/opentelemetry-instrumentation-fetch/package.json b/packages/opentelemetry-instrumentation-fetch/package.json index 06318ec2f4..20d2371999 100644 --- a/packages/opentelemetry-instrumentation-fetch/package.json +++ b/packages/opentelemetry-instrumentation-fetch/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-fetch", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry fetch automatic instrumentation package.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -48,12 +48,11 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/context-zone": "0.25.0", + "@opentelemetry/propagator-b3": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", - "@types/shimmer": "1.0.2", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", @@ -73,16 +72,16 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "@opentelemetry/sdk-trace-web": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/sdk-trace-web": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" } } diff --git a/packages/opentelemetry-instrumentation-fetch/src/fetch.ts b/packages/opentelemetry-instrumentation-fetch/src/fetch.ts index fe224dbb57..d82f6cdc35 100644 --- a/packages/opentelemetry-instrumentation-fetch/src/fetch.ts +++ b/packages/opentelemetry-instrumentation-fetch/src/fetch.ts @@ -284,23 +284,18 @@ export class FetchInstrumentation extends InstrumentationBase< /** * Patches the constructor of fetch */ - private _patchConstructor(): ( - original: (input: RequestInfo, init?: RequestInit) => Promise - ) => (input: RequestInfo, init?: RequestInit) => Promise { - return ( - original: (input: RequestInfo, init?: RequestInit) => Promise - ): ((input: RequestInfo, init?: RequestInit) => Promise) => { + private _patchConstructor(): (original: Window['fetch']) => Window['fetch'] { + return original => { const plugin = this; return function patchConstructor( - this: (input: RequestInfo, init?: RequestInit) => Promise, - input: RequestInfo, - init?: RequestInit + this: Window, + ...args: Parameters ): Promise { - const url = input instanceof Request ? input.url : input; - const options = input instanceof Request ? input : init || {}; + const url = args[0] instanceof Request ? args[0].url : args[0]; + const options = args[0] instanceof Request ? args[0] : args[1] || {}; const createdSpan = plugin._createSpan(url, options); if (!createdSpan) { - return original.apply(this, [url, options]); + return original.apply(this, args); } const spanData = plugin._prepareSpanData(url); @@ -380,7 +375,7 @@ export class FetchInstrumentation extends InstrumentationBase< plugin._addHeaders(options, url); plugin._tasksCount++; return original - .apply(this, [url, options]) + .apply(this, options instanceof Request ? [options] : [url, options]) .then( (onSuccess as any).bind(this, createdSpan, resolve), onError.bind(this, createdSpan, reject) diff --git a/packages/opentelemetry-instrumentation-fetch/src/version.ts b/packages/opentelemetry-instrumentation-fetch/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-instrumentation-fetch/src/version.ts +++ b/packages/opentelemetry-instrumentation-fetch/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts b/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts index d2542e0f2f..1fa0d465c7 100644 --- a/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-instrumentation-fetch/test/fetch.test.ts @@ -176,11 +176,16 @@ describe('fetch', () => { }; response.headers = Object.assign({}, init.headers); - if (init.method === 'DELETE') { + if (init instanceof Request) { + // Passing request as 2nd argument causes missing body bug (#2411) + response.status = 400; + response.statusText = 'Bad Request (Request object as 2nd argument)'; + reject(new window.Response(JSON.stringify(response), response)); + } else if (init.method === 'DELETE') { response.status = 405; response.statusText = 'OK'; resolve(new window.Response('foo', response)); - } else if (input === url) { + } else if ((input instanceof Request && input.url === url) || input === url) { response.status = 200; response.statusText = 'OK'; resolve(new window.Response(JSON.stringify(response), response)); @@ -530,6 +535,15 @@ describe('fetch', () => { assert.ok(typeof r.headers.get(X_B3_TRACE_ID) === 'string'); }); + it('should pass request object as first parameter to the original function (#2411)', () => { + const r = new Request(url); + return window.fetch(r).then(() => { + assert.ok(true); + }, (response: Response) => { + assert.fail(response.statusText); + }); + }); + it('should NOT clear the resources', () => { assert.strictEqual( clearResourceTimingsSpy.args.length, @@ -659,6 +673,14 @@ describe('fetch', () => { it('should NOT create any span', () => { assert.strictEqual(exportSpy.args.length, 0, "span shouldn't b exported"); }); + it('should pass request object as the first parameter to the original function (#2411)', () => { + const r = new Request(url); + return window.fetch(r).then(() => { + assert.ok(true); + }, (response: Response) => { + assert.fail(response.statusText); + }); + }); }); describe('when clearTimingResources is TRUE', () => { diff --git a/packages/opentelemetry-instrumentation-grpc/package.json b/packages/opentelemetry-instrumentation-grpc/package.json index a1fb4dcbea..548b8ea1be 100644 --- a/packages/opentelemetry-instrumentation-grpc/package.json +++ b/packages/opentelemetry-instrumentation-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-grpc", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry grpc automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -41,17 +41,16 @@ "access": "public" }, "devDependencies": { - "@grpc/grpc-js": "1.3.6", + "@grpc/grpc-js": "1.3.7", "@grpc/proto-loader": "0.6.4", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@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", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/semver": "7.3.8", - "@types/shimmer": "1.0.2", "@types/sinon": "10.0.2", "codecov": "3.8.3", "grpc": "1.24.11", @@ -68,8 +67,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0" + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" } } diff --git a/packages/opentelemetry-instrumentation-grpc/src/version.ts b/packages/opentelemetry-instrumentation-grpc/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-instrumentation-grpc/src/version.ts +++ b/packages/opentelemetry-instrumentation-grpc/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-instrumentation-http/package.json b/packages/opentelemetry-instrumentation-http/package.json index a83bff8dcf..5495446266 100644 --- a/packages/opentelemetry-instrumentation-http/package.json +++ b/packages/opentelemetry-instrumentation-http/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-http", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry http/https automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -42,12 +42,12 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/context-async-hooks": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/sdk-trace-node": "0.25.0", "@types/got": "9.6.12", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/request-promise-native": "1.0.18", "@types/semver": "7.3.8", "@types/sinon": "10.0.2", @@ -70,9 +70,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "semver": "^7.1.3" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", + "semver": "^7.3.5" } } diff --git a/packages/opentelemetry-instrumentation-http/src/version.ts b/packages/opentelemetry-instrumentation-http/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-instrumentation-http/src/version.ts +++ b/packages/opentelemetry-instrumentation-http/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-instrumentation-xml-http-request/package.json b/packages/opentelemetry-instrumentation-xml-http-request/package.json index 60d68a0db6..6a489f8c37 100644 --- a/packages/opentelemetry-instrumentation-xml-http-request/package.json +++ b/packages/opentelemetry-instrumentation-xml-http-request/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation-xml-http-request", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry XMLHttpRequest automatic instrumentation package.", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -48,11 +48,11 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/context-zone": "0.25.0", + "@opentelemetry/propagator-b3": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", @@ -72,16 +72,16 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "@opentelemetry/sdk-trace-web": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", + "@opentelemetry/sdk-trace-web": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" } } diff --git a/packages/opentelemetry-instrumentation-xml-http-request/src/version.ts b/packages/opentelemetry-instrumentation-xml-http-request/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-instrumentation-xml-http-request/src/version.ts +++ b/packages/opentelemetry-instrumentation-xml-http-request/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-instrumentation/package.json b/packages/opentelemetry-instrumentation/package.json index 89afe5efcc..e1f79174a8 100644 --- a/packages/opentelemetry-instrumentation/package.json +++ b/packages/opentelemetry-instrumentation/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/instrumentation", - "version": "0.24.0", + "version": "0.25.0", "description": "Base class for node which OpenTelemetry instrumentation modules extend", "author": "OpenTelemetry Authors", "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", @@ -59,7 +59,7 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api-metrics": "0.24.0", + "@opentelemetry/api-metrics": "0.25.0", "require-in-the-middle": "^5.0.3", "semver": "^7.3.2", "shimmer": "^1.2.1" @@ -71,7 +71,7 @@ "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/semver": "7.3.8", "@types/shimmer": "1.0.2", "@types/sinon": "10.0.2", @@ -94,7 +94,7 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" } } diff --git a/packages/opentelemetry-instrumentation/src/version.ts b/packages/opentelemetry-instrumentation/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-instrumentation/src/version.ts +++ b/packages/opentelemetry-instrumentation/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-propagator-b3/package.json b/packages/opentelemetry-propagator-b3/package.json index 8a1ffdb3a5..674f8a60c3 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.24.0", + "version": "0.25.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", @@ -43,7 +43,7 @@ "access": "public" }, "dependencies": { - "@opentelemetry/core": "0.24.0" + "@opentelemetry/core": "0.25.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" @@ -51,7 +51,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "codecov": "3.8.3", "istanbul-instrumenter-loader": "3.0.1", "mocha": "7.2.0", diff --git a/packages/opentelemetry-propagator-b3/src/B3MultiPropagator.ts b/packages/opentelemetry-propagator-b3/src/B3MultiPropagator.ts index 17b2a3859d..63189e1578 100644 --- a/packages/opentelemetry-propagator-b3/src/B3MultiPropagator.ts +++ b/packages/opentelemetry-propagator-b3/src/B3MultiPropagator.ts @@ -42,7 +42,7 @@ function isValidSampledValue(sampled: TraceFlags | undefined): boolean { return sampled === TraceFlags.SAMPLED || sampled === TraceFlags.NONE; } -export function parseHeader(header: unknown) { +function parseHeader(header: unknown) { return Array.isArray(header) ? header[0] : header; } @@ -93,7 +93,7 @@ function getTraceFlags( * Based on: https://github.com/openzipkin/b3-propagation */ export class B3MultiPropagator implements TextMapPropagator { - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { const spanContext = trace.getSpanContext(context); if ( !spanContext || diff --git a/packages/opentelemetry-propagator-b3/src/B3Propagator.ts b/packages/opentelemetry-propagator-b3/src/B3Propagator.ts index 760752d84b..cc975ad49e 100644 --- a/packages/opentelemetry-propagator-b3/src/B3Propagator.ts +++ b/packages/opentelemetry-propagator-b3/src/B3Propagator.ts @@ -53,7 +53,7 @@ export class B3Propagator implements TextMapPropagator { } } - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { if (isTracingSuppressed(context)) { return; } diff --git a/packages/opentelemetry-propagator-b3/src/B3SinglePropagator.ts b/packages/opentelemetry-propagator-b3/src/B3SinglePropagator.ts index 6a26a93265..eb8ac46ac0 100644 --- a/packages/opentelemetry-propagator-b3/src/B3SinglePropagator.ts +++ b/packages/opentelemetry-propagator-b3/src/B3SinglePropagator.ts @@ -49,7 +49,7 @@ function convertToTraceFlags(samplingState: string | undefined): TraceFlags { * Based on: https://github.com/openzipkin/b3-propagation */ export class B3SinglePropagator implements TextMapPropagator { - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { const spanContext = trace.getSpanContext(context); if ( !spanContext || diff --git a/packages/opentelemetry-propagator-b3/src/version.ts b/packages/opentelemetry-propagator-b3/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-propagator-b3/src/version.ts +++ b/packages/opentelemetry-propagator-b3/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-propagator-jaeger/package.json b/packages/opentelemetry-propagator-jaeger/package.json index 375e202b6c..3ebcae1908 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.24.0", + "version": "0.25.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", @@ -49,7 +49,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "codecov": "3.8.3", @@ -73,6 +73,6 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0" + "@opentelemetry/core": "0.25.0" } } diff --git a/packages/opentelemetry-propagator-jaeger/src/JaegerPropagator.ts b/packages/opentelemetry-propagator-jaeger/src/JaegerPropagator.ts index 252dc39fb5..f3a739f4b9 100644 --- a/packages/opentelemetry-propagator-jaeger/src/JaegerPropagator.ts +++ b/packages/opentelemetry-propagator-jaeger/src/JaegerPropagator.ts @@ -55,7 +55,7 @@ export class JaegerPropagator implements TextMapPropagator { this._jaegerTraceHeader = customTraceHeader || UBER_TRACE_ID_HEADER; } - inject(context: Context, carrier: unknown, setter: TextMapSetter) { + inject(context: Context, carrier: unknown, setter: TextMapSetter): void { const spanContext = trace.getSpanContext(context); const baggage = propagation.getBaggage(context); if (spanContext && isTracingSuppressed(context) === false) { diff --git a/packages/opentelemetry-propagator-jaeger/src/version.ts b/packages/opentelemetry-propagator-jaeger/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-propagator-jaeger/src/version.ts +++ b/packages/opentelemetry-propagator-jaeger/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index 70c91e080e..52ed4965da 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/resources", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry SDK resources", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -50,7 +50,7 @@ "devDependencies": { "@opentelemetry/api": "^1.0.2", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "mocha": "7.2.0", @@ -65,7 +65,7 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" } } diff --git a/packages/opentelemetry-resources/src/platform/browser/default-service-name.ts b/packages/opentelemetry-resources/src/platform/browser/default-service-name.ts index c31f3bedd9..eebfb121e7 100644 --- a/packages/opentelemetry-resources/src/platform/browser/default-service-name.ts +++ b/packages/opentelemetry-resources/src/platform/browser/default-service-name.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export function defaultServiceName() { +export function defaultServiceName(): string { return 'unknown_service'; -} \ No newline at end of file +} diff --git a/packages/opentelemetry-resources/src/platform/node/default-service-name.ts b/packages/opentelemetry-resources/src/platform/node/default-service-name.ts index 0f5b870a63..c1df6d22fb 100644 --- a/packages/opentelemetry-resources/src/platform/node/default-service-name.ts +++ b/packages/opentelemetry-resources/src/platform/node/default-service-name.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export function defaultServiceName() { +export function defaultServiceName(): string { return `unknown_service:${process.argv0}`; -} \ No newline at end of file +} diff --git a/packages/opentelemetry-resources/src/version.ts b/packages/opentelemetry-resources/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-resources/src/version.ts +++ b/packages/opentelemetry-resources/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-sdk-metrics-base/package.json b/packages/opentelemetry-sdk-metrics-base/package.json index 9a36562fb3..062d97e614 100644 --- a/packages/opentelemetry-sdk-metrics-base/package.json +++ b/packages/opentelemetry-sdk-metrics-base/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-metrics-base", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry metrics SDK", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -47,7 +47,7 @@ "@opentelemetry/api": "^1.0.2", "@types/lodash.merge": "4.6.6", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "mocha": "7.2.0", @@ -61,9 +61,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/api-metrics": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/resources": "0.24.0", + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", "lodash.merge": "^4.6.2" } } diff --git a/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts b/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts index a3098f119c..6f48df49bf 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/BaseObserverMetric.ts @@ -14,6 +14,7 @@ * limitations under the License. */ 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'; @@ -64,14 +65,14 @@ export abstract class BaseObserverMetric return super.getMetricRecord(); } - protected _processResults(observerResult: ObserverResult) { + protected _processResults(observerResult: ObserverResult): void { observerResult.values.forEach((value, labels) => { const instrument = this.bind(labels); instrument.update(value); }); } - observation(value: number) { + observation(value: number): Observation { return { value, observer: this as BaseObserverMetric, diff --git a/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts b/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts index da6d5367e0..4e2c0c8b28 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/BatchObserverResult.ts @@ -35,7 +35,7 @@ export class BatchObserverResult implements api.BatchObserverResult { * updated * @param [callback] */ - onObserveCalled(callback?: () => void) { + onObserveCalled(callback?: () => void): void { this._callback = callback; } diff --git a/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts b/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts index 36b4fb70c7..4f4fe3f04d 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/CounterMetric.ts @@ -48,7 +48,7 @@ export class CounterMetric extends Metric implements api.Counter { * @param [labels = {}] key-values pairs that are associated with a specific metric * that you want to record. */ - add(value: number, labels: api.Labels = {}) { + add(value: number, labels: api.Labels = {}): void { this.bind(labels).add(value); } } diff --git a/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts b/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts index 1d0cf1f098..226ff63aa6 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/MeterProvider.ts @@ -54,6 +54,7 @@ export class MeterProvider implements api.MeterProvider { ); } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return this._meters.get(key)!; } diff --git a/packages/opentelemetry-sdk-metrics-base/src/Metric.ts b/packages/opentelemetry-sdk-metrics-base/src/Metric.ts index b753b322ea..fc3cc06664 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/Metric.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/Metric.ts @@ -59,6 +59,7 @@ export abstract class Metric */ bind(labels: api.Labels): T { const hash = hashLabels(labels); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (this._instruments.has(hash)) return this._instruments.get(hash)!; const instrument = this._makeInstrument(labels); @@ -88,7 +89,7 @@ export abstract class Metric return this._kind; } - getAggregationTemporality() { + getAggregationTemporality(): api.AggregationTemporality { return this._aggregationTemporality; } diff --git a/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts b/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts index 7244bc88d4..8f58727ceb 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/SumObserverMetric.ts @@ -45,7 +45,7 @@ export class SumObserverMetric ); } - protected override _processResults(observerResult: ObserverResult) { + protected override _processResults(observerResult: ObserverResult): void { observerResult.values.forEach((value, labels) => { const instrument = this.bind(labels); // SumObserver is monotonic which means it should only accept values diff --git a/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts b/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts index 36650b2336..491a4647dc 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/UpDownCounterMetric.ts @@ -56,7 +56,7 @@ export class UpDownCounterMetric * @param [labels = {}] key-values pairs that are associated with a specific * metric that you want to record. */ - add(value: number, labels: api.Labels = {}) { + add(value: number, labels: api.Labels = {}): void { this.bind(labels).add(value); } } diff --git a/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts b/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts index cda854d8ed..28e9d7e1b2 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/ValueRecorderMetric.ts @@ -51,7 +51,7 @@ export class ValueRecorderMetric ); } - record(value: number, labels: api.Labels = {}) { + record(value: number, labels: api.Labels = {}): void { this.bind(labels).record(value); } } diff --git a/packages/opentelemetry-sdk-metrics-base/src/version.ts b/packages/opentelemetry-sdk-metrics-base/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-sdk-metrics-base/src/version.ts +++ b/packages/opentelemetry-sdk-metrics-base/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-sdk-node/package.json b/packages/opentelemetry-sdk-node/package.json index d9f3e48d68..ff42fa160e 100644 --- a/packages/opentelemetry-sdk-node/package.json +++ b/packages/opentelemetry-sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/sdk-node", - "version": "0.24.0", + "version": "0.25.0", "description": "OpenTelemetry SDK for Node.js", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -40,24 +40,24 @@ "access": "public" }, "dependencies": { - "@opentelemetry/api-metrics": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/instrumentation": "0.24.0", - "@opentelemetry/sdk-metrics-base": "0.24.0", - "@opentelemetry/sdk-trace-node": "0.24.0", + "@opentelemetry/api-metrics": "0.25.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/instrumentation": "0.25.0", "@opentelemetry/resource-detector-aws": "0.24.0", "@opentelemetry/resource-detector-gcp": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/sdk-trace-base": "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" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-async-hooks": "0.24.0", + "@opentelemetry/context-async-hooks": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/semver": "7.3.8", "@types/sinon": "10.0.2", "codecov": "3.8.3", diff --git a/packages/opentelemetry-sdk-node/src/version.ts b/packages/opentelemetry-sdk-node/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-sdk-node/src/version.ts +++ b/packages/opentelemetry-sdk-node/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-sdk-trace-base/package.json b/packages/opentelemetry-sdk-trace-base/package.json index e327cffe66..85fb3c6794 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry Tracing", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -56,7 +56,7 @@ "@opentelemetry/api": "^1.0.2", "@types/lodash.merge": "4.6.6", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "codecov": "3.8.3", @@ -80,9 +80,9 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", "lodash.merge": "^4.6.2" } } diff --git a/packages/opentelemetry-sdk-trace-base/src/Span.ts b/packages/opentelemetry-sdk-trace-base/src/Span.ts index 8ffad7ab0a..32226332dc 100644 --- a/packages/opentelemetry-sdk-trace-base/src/Span.ts +++ b/packages/opentelemetry-sdk-trace-base/src/Span.ts @@ -57,6 +57,7 @@ export class Span implements api.Span, ReadableSpan { private _duration: api.HrTime = [-1, -1]; private readonly _spanProcessor: SpanProcessor; private readonly _spanLimits: SpanLimits; + private readonly _attributeValueLengthLimit: number; /** Constructs a new Span instance. */ constructor( @@ -80,6 +81,7 @@ export class Span implements api.Span, ReadableSpan { this._spanLimits = parentTracer.getSpanLimits(); this._spanProcessor = parentTracer.getActiveSpanProcessor(); this._spanProcessor.onStart(this, context); + this._attributeValueLengthLimit = this._spanLimits.attributeValueLengthLimit || 0; } spanContext(): api.SpanContext { @@ -105,7 +107,7 @@ export class Span implements api.Span, ReadableSpan { ) { return this; } - this.attributes[key] = value; + this.attributes[key] = this._truncateToSize(value); return this; } @@ -235,4 +237,49 @@ export class Span implements api.Span, ReadableSpan { } return this._ended; } + + // Utility function to truncate given value within size + // for value type of string, will truncate to given limit + // for type of non-string, will return same value + private _truncateToLimitUtil(value: string, limit: number): string { + if (value.length <= limit) { + return value; + } + return value.substr(0, limit); + } + + /** + * If the given attribute value is of type string and has more characters than given {@code attributeValueLengthLimit} then + * return string with trucated to {@code attributeValueLengthLimit} characters + * + * If the given attribute value is array of strings then + * return new array of strings with each element truncated to {@code attributeValueLengthLimit} characters + * + * Otherwise return same Attribute {@code value} + * + * @param value Attribute value + * @returns truncated attribute value if required, otherwise same value + */ + private _truncateToSize(value: SpanAttributeValue): SpanAttributeValue { + const limit = this._attributeValueLengthLimit; + // Check limit + if (limit <= 0) { + // Negative values are invalid, so do not truncate + api.diag.warn(`Attribute value limit must be positive, got ${limit}`); + return value; + } + + // String + if (typeof value === 'string') { + return this._truncateToLimitUtil(value, limit); + } + + // Array of strings + if (Array.isArray(value)) { + return (value as []).map(val => typeof val === 'string' ? this._truncateToLimitUtil(val, limit) : val); + } + + // Other types, no need to apply value length limit + return value; + } } diff --git a/packages/opentelemetry-sdk-trace-base/src/config.ts b/packages/opentelemetry-sdk-trace-base/src/config.ts index 433a0161da..38c869cfa7 100644 --- a/packages/opentelemetry-sdk-trace-base/src/config.ts +++ b/packages/opentelemetry-sdk-trace-base/src/config.ts @@ -38,6 +38,7 @@ export const DEFAULT_CONFIG = { sampler: buildSamplerFromEnv(env), forceFlushTimeoutMillis: 30000, spanLimits: { + attributeValueLengthLimit: getEnv().OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT, attributeCountLimit: getEnv().OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, linkCountLimit: getEnv().OTEL_SPAN_LINK_COUNT_LIMIT, eventCountLimit: getEnv().OTEL_SPAN_EVENT_COUNT_LIMIT, diff --git a/packages/opentelemetry-sdk-trace-base/src/types.ts b/packages/opentelemetry-sdk-trace-base/src/types.ts index d8329aa567..91a330d9c9 100644 --- a/packages/opentelemetry-sdk-trace-base/src/types.ts +++ b/packages/opentelemetry-sdk-trace-base/src/types.ts @@ -63,6 +63,8 @@ export interface SDKRegistrationConfig { /** Global configuration of trace service */ export interface SpanLimits { + /** attributeValueLengthLimit is maximum allowed attribute value size */ + attributeValueLengthLimit?: number; /** attributeCountLimit is number of attributes per span */ attributeCountLimit?: number; /** linkCountLimit is number of links per span */ diff --git a/packages/opentelemetry-sdk-trace-base/src/version.ts b/packages/opentelemetry-sdk-trace-base/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-sdk-trace-base/src/version.ts +++ b/packages/opentelemetry-sdk-trace-base/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-sdk-trace-base/test/common/BasicTracerProvider.test.ts b/packages/opentelemetry-sdk-trace-base/test/common/BasicTracerProvider.test.ts index f824049a84..220b71d6cf 100644 --- a/packages/opentelemetry-sdk-trace-base/test/common/BasicTracerProvider.test.ts +++ b/packages/opentelemetry-sdk-trace-base/test/common/BasicTracerProvider.test.ts @@ -64,74 +64,97 @@ describe('BasicTracerProvider', () => { }); describe('constructor', () => { - it('should construct an instance without any options', () => { - const provider = new BasicTracerProvider(); - assert.ok(provider instanceof BasicTracerProvider); - }); + describe('when options not defined', () => { + it('should construct an instance', () => { + const tracer = new BasicTracerProvider(); + assert.ok(tracer instanceof BasicTracerProvider); + }); - it('should construct an instance with sampler', () => { - const provider = new BasicTracerProvider({ - sampler: new AlwaysOnSampler(), + it('should use noop span processor by default', () => { + const tracer = new BasicTracerProvider(); + assert.ok(tracer.activeSpanProcessor instanceof NoopSpanProcessor); }); - assert.ok(provider instanceof BasicTracerProvider); }); - it('should construct an instance with default span limits', () => { - const tracer = new BasicTracerProvider({}).getTracer('default'); - assert.deepStrictEqual(tracer.getSpanLimits(), { - attributeCountLimit: 128, - eventCountLimit: 128, - linkCountLimit: 128, + describe('when "sampler" option defined', () => { + it('should have an instance with sampler', () => { + const tracer = new BasicTracerProvider({ + sampler: new AlwaysOnSampler(), + }); + assert.ok(tracer instanceof BasicTracerProvider); }); }); - it('should construct an instance with customized attributeCountLimit span limits', () => { - const tracer = new BasicTracerProvider({ - spanLimits: { - attributeCountLimit: 100, - }, - }).getTracer('default'); - assert.deepStrictEqual(tracer.getSpanLimits(), { - attributeCountLimit: 100, - eventCountLimit: 128, - linkCountLimit: 128, + describe('spanLimits', () => { + describe('when not defined default values', () => { + it('should have tracer with default values', () => { + const tracer = new BasicTracerProvider({}).getTracer('default'); + assert.deepStrictEqual(tracer.getSpanLimits(), { + attributeValueLengthLimit: Infinity, + attributeCountLimit: 128, + eventCountLimit: 128, + linkCountLimit: 128, + }); + }); }); - }); - it('should construct an instance with customized eventCountLimit span limits', () => { - const tracer = new BasicTracerProvider({ - spanLimits: { - eventCountLimit: 300, - }, - }).getTracer('default'); - assert.deepStrictEqual(tracer.getSpanLimits(), { - attributeCountLimit: 128, - eventCountLimit: 300, - linkCountLimit: 128, + describe('when "attributeCountLimit" is defined', () => { + it('should have tracer with defined value', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + attributeCountLimit: 100, + }, + }).getTracer('default'); + const spanLimits = tracer.getSpanLimits(); + assert.strictEqual(spanLimits.attributeCountLimit, 100); + }); }); - }); - it('should construct an instance with customized linkCountLimit span limits', () => { - const tracer = new BasicTracerProvider({ - spanLimits: { - linkCountLimit: 10, - }, - }).getTracer('default'); - assert.deepStrictEqual(tracer.getSpanLimits(), { - attributeCountLimit: 128, - eventCountLimit: 128, - linkCountLimit: 10, + describe('when "attributeValueLengthLimit" is defined', () => { + it('should have tracer with defined value', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + attributeValueLengthLimit: 10, + }, + }).getTracer('default'); + const spanLimits = tracer.getSpanLimits(); + assert.strictEqual(spanLimits.attributeValueLengthLimit, 10); + }); + + it('should have tracer with negative "attributeValueLengthLimit" value', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + attributeValueLengthLimit: -10, + }, + }).getTracer('default'); + const spanLimits = tracer.getSpanLimits(); + assert.strictEqual(spanLimits.attributeValueLengthLimit, -10); + }); }); - }); - it('should construct an instance of BasicTracerProvider', () => { - const tracer = new BasicTracerProvider(); - assert.ok(tracer instanceof BasicTracerProvider); - }); + describe('when "eventCountLimit" is defined', () => { + it('should have tracer with defined value', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + eventCountLimit: 300, + }, + }).getTracer('default'); + const spanLimits = tracer.getSpanLimits(); + assert.strictEqual(spanLimits.eventCountLimit, 300); + }); + }); - it('should use noop span processor by default', () => { - const tracer = new BasicTracerProvider(); - assert.ok(tracer.activeSpanProcessor instanceof NoopSpanProcessor); + describe('when "linkCountLimit" is defined', () => { + it('should have tracer with defined value', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + linkCountLimit: 10, + }, + }).getTracer('default'); + const spanLimits = tracer.getSpanLimits(); + assert.strictEqual(spanLimits.linkCountLimit, 10); + }); + }); }); }); diff --git a/packages/opentelemetry-sdk-trace-base/test/common/Span.test.ts b/packages/opentelemetry-sdk-trace-base/test/common/Span.test.ts index bd2072bf00..21e5eb37ff 100644 --- a/packages/opentelemetry-sdk-trace-base/test/common/Span.test.ts +++ b/packages/opentelemetry-sdk-trace-base/test/common/Span.test.ts @@ -37,6 +37,7 @@ const performanceTimeOrigin = hrTime(); describe('Span', () => { const tracer = new BasicTracerProvider({ spanLimits: { + attributeValueLengthLimit: 100, attributeCountLimit: 100, eventCountLimit: 100, }, @@ -213,83 +214,186 @@ describe('Span', () => { }); }); - it('should set an attribute', () => { - const span = new Span( - tracer, - ROOT_CONTEXT, - name, - spanContext, - SpanKind.CLIENT - ); + describe('setAttribute', () => { + describe('when default options set', () => { + it('should set an attribute', () => { + const span = new Span( + tracer, + ROOT_CONTEXT, + name, + spanContext, + SpanKind.CLIENT + ); + + span.setAttribute('string', 'string'); + span.setAttribute('number', 0); + span.setAttribute('bool', true); + span.setAttribute('array', ['str1', 'str2']); + span.setAttribute('array', [1, 2]); + span.setAttribute('array', [true, false]); + + //@ts-expect-error invalid attribute type object + span.setAttribute('object', { foo: 'bar' }); + //@ts-expect-error invalid attribute inhomogenous array + span.setAttribute('non-homogeneous-array', [0, '']); + // This empty length attribute should not be set + span.setAttribute('', 'empty-key'); + + assert.deepStrictEqual(span.attributes, { + string: 'string', + number: 0, + bool: true, + 'array': ['str1', 'str2'], + 'array': [1, 2], + 'array': [true, false], + }); + }); - span.setAttribute('string', 'string'); - span.setAttribute('number', 0); - span.setAttribute('bool', true); - span.setAttribute('array', ['str1', 'str2']); - span.setAttribute('array', [1, 2]); - span.setAttribute('array', [true, false]); + it('should be able to overwrite attributes', () => { + const span = new Span( + tracer, + ROOT_CONTEXT, + name, + spanContext, + SpanKind.CLIENT + ); - //@ts-expect-error invalid attribute type object - span.setAttribute('object', { foo: 'bar' }); - //@ts-expect-error invalid attribute inhomogenous array - span.setAttribute('non-homogeneous-array', [0, '']); + span.setAttribute('overwrite', 'initial value'); + span.setAttribute('overwrite', 'overwritten value'); - assert.deepStrictEqual(span.attributes, { - string: 'string', - number: 0, - bool: true, - 'array': ['str1', 'str2'], - 'array': [1, 2], - 'array': [true, false], + assert.deepStrictEqual(span.attributes, { + overwrite: 'overwritten value', + }); + }); }); - }); - it('should overwrite attributes', () => { - const span = new Span( - tracer, - ROOT_CONTEXT, - name, - spanContext, - SpanKind.CLIENT - ); + describe('when spanLimits options set', () => { + describe('when "attributeCountLimit" option defined', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + // Setting count limit + attributeCountLimit: 100, + }, + }).getTracer('default'); - span.setAttribute('overwrite', 'initial value'); - span.setAttribute('overwrite', 'overwritten value'); + const span = new Span( + tracer, + ROOT_CONTEXT, + name, + spanContext, + SpanKind.CLIENT + ); + for (let i = 0; i < 150; i++) { + span.setAttribute('foo' + i, 'bar' + i); + } + span.end(); + + it('should remove / drop all remaining values after the number of values exceeds this limit', () => { + assert.strictEqual(Object.keys(span.attributes).length, 100); + assert.strictEqual(span.attributes['foo0'], 'bar0'); + assert.strictEqual(span.attributes['foo99'], 'bar99'); + assert.strictEqual(span.attributes['foo149'], undefined); + }); + }); - assert.deepStrictEqual(span.attributes, { - overwrite: 'overwritten value', + describe('when "attributeValueLengthLimit" option defined', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + // Setting attribute value length limit + attributeValueLengthLimit: 5, + }, + }).getTracer('default'); + + const span = new Span( + tracer, + ROOT_CONTEXT, + name, + spanContext, + SpanKind.CLIENT + ); + + it('should truncate value which length exceeds this limit', () => { + span.setAttribute('attr-with-more-length', 'abcdefgh'); + assert.strictEqual(span.attributes['attr-with-more-length'], 'abcde'); + }); + + it('should truncate value of arrays which exceeds this limit', () => { + span.setAttribute('attr-array-of-strings', ['abcdefgh', 'abc', 'abcde', '']); + span.setAttribute('attr-array-of-bool', [true, false]); + assert.deepStrictEqual(span.attributes['attr-array-of-strings'], ['abcde', 'abc', 'abcde', '']); + assert.deepStrictEqual(span.attributes['attr-array-of-bool'], [true, false]); + }); + + it('should not truncate value which length not exceeds this limit', () => { + span.setAttribute('attr-with-less-length', 'abc'); + assert.strictEqual(span.attributes['attr-with-less-length'], 'abc'); + }); + + it('should return same value for non-string values', () => { + span.setAttribute('attr-non-string', true); + assert.strictEqual(span.attributes['attr-non-string'], true); + }); + }); + + describe('when "attributeValueLengthLimit" option is invalid', () => { + const tracer = new BasicTracerProvider({ + spanLimits: { + // Setting invalid attribute value length limit + attributeValueLengthLimit: -5, + }, + }).getTracer('default'); + + const span = new Span( + tracer, + ROOT_CONTEXT, + name, + spanContext, + SpanKind.CLIENT + ); + + it('should not truncate any value', () => { + span.setAttribute('attr-not-truncate', 'abcdefgh'); + span.setAttribute('attr-array-of-strings', ['abcdefgh', 'abc', 'abcde']); + assert.deepStrictEqual(span.attributes['attr-not-truncate'], 'abcdefgh'); + assert.deepStrictEqual(span.attributes['attr-array-of-strings'], ['abcdefgh', 'abc', 'abcde']); + }); + }); }); }); - it('should set attributes', () => { - const span = new Span( - tracer, - ROOT_CONTEXT, - name, - spanContext, - SpanKind.CLIENT - ); + describe('setAttributes', () => { + it('should be able to set multiple attributes', () => { + const span = new Span( + tracer, + ROOT_CONTEXT, + name, + spanContext, + SpanKind.CLIENT + ); - span.setAttributes({ - string: 'string', - number: 0, - bool: true, - 'array': ['str1', 'str2'], - 'array': [1, 2], - 'array': [true, false], - //@ts-expect-error invalid attribute type object - object: { foo: 'bar' }, - //@ts-expect-error invalid attribute inhomogenous array - 'non-homogeneous-array': [0, ''], - }); + span.setAttributes({ + string: 'string', + number: 0, + bool: true, + 'array': ['str1', 'str2'], + 'array': [1, 2], + 'array': [true, false], + //@ts-expect-error invalid attribute type object + object: { foo: 'bar' }, + //@ts-expect-error invalid attribute inhomogenous array + 'non-homogeneous-array': [0, ''], + // This empty length attribute should not be set + '': 'empty-key', + }); - assert.deepStrictEqual(span.attributes, { - string: 'string', - number: 0, - bool: true, - 'array': ['str1', 'str2'], - 'array': [1, 2], - 'array': [true, false], + assert.deepStrictEqual(span.attributes, { + string: 'string', + number: 0, + bool: true, + 'array': ['str1', 'str2'], + 'array': [1, 2], + 'array': [true, false], + }); }); }); @@ -330,7 +434,7 @@ describe('Span', () => { span.end(); }); - it('should drop extra attributes and events', () => { + it('should drop extra events', () => { const span = new Span( tracer, ROOT_CONTEXT, @@ -339,17 +443,12 @@ describe('Span', () => { SpanKind.CLIENT ); for (let i = 0; i < 150; i++) { - span.setAttribute('foo' + i, 'bar' + i); span.addEvent('sent' + i); } span.end(); assert.strictEqual(span.events.length, 100); - assert.strictEqual(Object.keys(span.attributes).length, 100); assert.strictEqual(span.events[span.events.length - 1].name, 'sent149'); - assert.strictEqual(span.attributes['foo0'], 'bar0'); - assert.strictEqual(span.attributes['foo99'], 'bar99'); - assert.strictEqual(span.attributes['sent100'], undefined); }); it('should set an error status', () => { diff --git a/packages/opentelemetry-sdk-trace-node/package.json b/packages/opentelemetry-sdk-trace-node/package.json index 67ebd637c5..3a5c26beca 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.24.0", + "version": "0.25.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", @@ -42,18 +42,16 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/resources": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", + "@opentelemetry/resources": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/semver": "7.3.8", - "@types/shimmer": "1.0.2", "@types/sinon": "10.0.2", "codecov": "3.8.3", "mocha": "7.2.0", "nyc": "15.1.0", "rimraf": "3.0.2", - "shimmer": "1.2.1", "sinon": "11.1.2", "ts-mocha": "8.0.0", "typescript": "4.3.5" @@ -62,11 +60,11 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/context-async-hooks": "0.24.0", - "@opentelemetry/core": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/propagator-jaeger": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", - "semver": "^7.1.3" + "@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", + "semver": "^7.3.5" } } diff --git a/packages/opentelemetry-sdk-trace-node/src/version.ts b/packages/opentelemetry-sdk-trace-node/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-sdk-trace-node/src/version.ts +++ b/packages/opentelemetry-sdk-trace-node/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-sdk-trace-web/package.json b/packages/opentelemetry-sdk-trace-web/package.json index d3d8cbdd5d..b4f940a09f 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry Web Tracer", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -47,12 +47,12 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.2", - "@opentelemetry/context-zone": "0.24.0", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/resources": "0.24.0", + "@opentelemetry/context-zone": "0.25.0", + "@opentelemetry/propagator-b3": "0.25.0", + "@opentelemetry/resources": "0.25.0", "@types/jquery": "3.5.6", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "@types/webpack-env": "1.16.2", "babel-loader": "8.2.2", @@ -73,15 +73,15 @@ "ts-mocha": "8.0.0", "typescript": "4.3.5", "webpack": "4.46.0", - "webpack-cli": "4.7.2", + "webpack-cli": "4.8.0", "webpack-merge": "5.8.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0" + "@opentelemetry/core": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0" } } diff --git a/packages/opentelemetry-sdk-trace-web/src/version.ts b/packages/opentelemetry-sdk-trace-web/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-sdk-trace-web/src/version.ts +++ b/packages/opentelemetry-sdk-trace-web/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-semantic-conventions/package.json b/packages/opentelemetry-semantic-conventions/package.json index dbb77c97dc..1b28b2e009 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.24.0", + "version": "0.25.0", "description": "OpenTelemetry semantic conventions", "main": "build/src/index.js", "module": "build/esm/index.js", @@ -44,7 +44,7 @@ }, "devDependencies": { "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "@types/sinon": "10.0.2", "codecov": "3.8.3", "mocha": "7.2.0", diff --git a/packages/opentelemetry-semantic-conventions/src/version.ts b/packages/opentelemetry-semantic-conventions/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-semantic-conventions/src/version.ts +++ b/packages/opentelemetry-semantic-conventions/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/opentelemetry-shim-opentracing/package.json b/packages/opentelemetry-shim-opentracing/package.json index 6e287503c5..b927a193ca 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.24.0", + "version": "0.25.0", "description": "OpenTracing to OpenTelemetry shim", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -39,11 +39,11 @@ }, "devDependencies": { "@opentelemetry/api": "^1.0.2", - "@opentelemetry/propagator-b3": "0.24.0", - "@opentelemetry/propagator-jaeger": "0.24.0", - "@opentelemetry/sdk-trace-base": "0.24.0", + "@opentelemetry/propagator-b3": "0.25.0", + "@opentelemetry/propagator-jaeger": "0.25.0", + "@opentelemetry/sdk-trace-base": "0.25.0", "@types/mocha": "8.2.3", - "@types/node": "14.17.9", + "@types/node": "14.17.11", "codecov": "3.8.3", "mocha": "7.2.0", "nyc": "15.1.0", @@ -55,8 +55,8 @@ "@opentelemetry/api": "^1.0.2" }, "dependencies": { - "@opentelemetry/core": "0.24.0", - "@opentelemetry/semantic-conventions": "0.24.0", + "@opentelemetry/core": "0.25.0", + "@opentelemetry/semantic-conventions": "0.25.0", "opentracing": "^0.14.4" } } diff --git a/packages/opentelemetry-shim-opentracing/src/version.ts b/packages/opentelemetry-shim-opentracing/src/version.ts index 2902e7d262..2c1c3f80c6 100644 --- a/packages/opentelemetry-shim-opentracing/src/version.ts +++ b/packages/opentelemetry-shim-opentracing/src/version.ts @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.24.0'; +export const VERSION = '0.25.0'; diff --git a/packages/template/package.json b/packages/template/package.json index 024bd44c2d..3c99f09694 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/template", - "version": "0.24.0", + "version": "0.25.0", "private": true, "publishConfig": { "access": "restricted" @@ -65,7 +65,7 @@ "build/esm/**/*.d.ts" ], "devDependencies": { - "@types/node": "14.17.9", + "@types/node": "14.17.11", "typescript": "4.3.5" }, "Add these to devDependencies for testing": { diff --git a/website_docs/getting_started/nodejs.md b/website_docs/getting_started/nodejs.md index 9f681e3eaa..2054e320e4 100644 --- a/website_docs/getting_started/nodejs.md +++ b/website_docs/getting_started/nodejs.md @@ -72,9 +72,9 @@ The following dependencies are required to trace a Node.js application. These dependencies are required to configure the tracing SDK and create spans. -- `@opentelemetry/api` -- `@opentelemetry/sdk-trace-node` -- `@opentelemetry/sdk-trace-base` +```shell +npm install @opentelemetry/sdk-node @opentelemetry/api +``` #### Exporter @@ -91,6 +91,10 @@ Many common modules such as the `http` standard library module, `express`, and o You can also install all instrumentations maintained by the OpenTelemetry authors by using the `@opentelemetry/auto-instrumentations-node` module. +```shell +npm install @opentelemetry/auto-instrumentations-node +``` + ### Setup The tracing setup and configuration should be run before your application code. One tool commonly used for this task is the [`-r, --require module`](https://nodejs.org/api/cli.html#cli_r_require_module) flag. @@ -101,39 +105,19 @@ Create a file with a name like `tracing.js` which will contain your tracing setu /* tracing.js */ // Require dependencies -const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node"); -const { SimpleSpanProcessor, ConsoleSpanExporter } = require("@opentelemetry/sdk-trace-base"); -const { getNodeAutoInstrumentations } = require("@opentelemetry/auto-instrumentations-node'); -const { registerInstrumentations } = require('@opentelemetry/instrumentation'); - -// Create a tracer provider -const provider = new NodeTracerProvider(); - -// The exporter handles sending spans to your tracing backend -const exporter = new ConsoleSpanExporter(); - -// The simple span processor sends spans to the exporter as soon as they are ended. -const processor = new SimpleSpanProcessor(exporter); -provider.addSpanProcessor(processor); +const opentelemetry = require("@opentelemetry/sdk-node"); +const { getNodeAutoInstrumentations } = require("@opentelemetry/auto-instrumentations-node"); -// The provider must be registered in order to -// be used by the OpenTelemetry API and instrumentations -provider.register(); - -// This will automatically enable all instrumentations -registerInstrumentations({ - instrumentations: [getNodeAutoInstrumentations()], +const sdk = new opentelemetry.NodeSDK({ + traceExporter: new opentelemetry.tracing.ConsoleSpanExporter(), + instrumentations: [getNodeAutoInstrumentations()] }); + +sdk.start() ``` ### Run Application -First, install the dependencies as described above. Here you need to add the following: - -```shell -npm install --save @opentelemetry/sdk-trace-node @opentelemetry/auto-instrumentations-node -``` - Now you can run your application as you normally would, but you can use the `--require` flag to load the tracing code before the application code. ```shell @@ -141,7 +125,7 @@ $ node --require './tracing.js' app.js Listening for requests on http://localhost:8080 ``` -Now, when you open in your web browser, you should see the spans printed in the console by the `ConsoleSpanExporter`. +Open in your web browser and reload the page a few times, after a while you should see the spans printed in the console by the `ConsoleSpanExporter`.
View example output diff --git a/website_docs/instrumentation.md b/website_docs/instrumentation.md index 2de62ce6c5..a6376e68e2 100644 --- a/website_docs/instrumentation.md +++ b/website_docs/instrumentation.md @@ -108,9 +108,8 @@ for (let i = 0; i < 10; i += 1) { function doWork(parent) { // Start another span. In this example, the main method already started a // span, so that'll be the parent span, and this will be a child span. - const span = tracer.startSpan('doWork', { - parent, - }); + const ctx = opentelemetry.trace.setSpan(opentelemetry.context.active(), parent); + const span = tracer.startSpan('doWork', undefined, ctx); // simulate some random work. for (let i = 0; i <= Math.floor(Math.random() * 40000000); i += 1) { @@ -118,6 +117,8 @@ function doWork(parent) { } span.end(); } +// Be sure to end the span. +parentSpan.end(); ``` Invoking your application once again will give you a list of traces being exported. @@ -128,9 +129,8 @@ Attributes can be used to describe your spans. Attributes can be added to a span ```javascript function doWork(parent) { - const span = tracer.startSpan('doWork', { - parent, attributes: { attribute1 : 'value1' } - }); + const ctx = opentelemetry.trace.setSpan(opentelemetry.context.active(), parent); + const span = tracer.startSpan('doWork', { attributes: { attribute1 : 'value1' } }, ctx); for (let i = 0; i <= Math.floor(Math.random() * 40000000); i += 1) { // empty } @@ -159,9 +159,8 @@ Finally, you can update your file to include semantic attributes: ```javascript function doWork(parent) { - const span = tracer.startSpan('doWork', { - parent, attributes: { SemanticAttributes.CODE_FUNCTION : 'doWork' } - }); + const ctx = opentelemetry.trace.setSpan(opentelemetry.context.active(), parent); + const span = tracer.startSpan('doWork', { attributes: { [SemanticAttributes.CODE_FUNCTION] : 'doWork' } }, ctx); for (let i = 0; i <= Math.floor(Math.random() * 40000000); i += 1) { // empty } @@ -178,9 +177,9 @@ The status can be set at any time before the span is finished: ```javascript function doWork(parent) { - const span = tracer.startSpan('doWork', { - parent, - }); + const ctx = opentelemetry.trace.setSpan(opentelemetry.context.active(), parent); + const span = tracer.startSpan('doWork', undefined, ctx); + span.setStatus({ code: opentelemetry.SpanStatusCode.OK, message: 'Ok.'