diff --git a/.circleci/config.yml b/.circleci/config.yml index e1dc9feb5b..36e18dfe3e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -124,13 +124,13 @@ jobs: - checkout - run: name: Install minimal doc and lint modules globally - command: npm i -g tslint lerna typedoc linkinator typescript tslint-consistent-codestyle tslint-microsoft-contrib + command: npm i -g eslint@^6.8.0 eslint-plugin-node @typescript-eslint/eslint-plugin@^2.23.0 @typescript-eslint/parser@^2.23.0 eslint-plugin-header@^3.0.0 eslint-plugin-import@^2.19.1 eslint-plugin-prettier prettier lerna typedoc linkinator typescript@^3.7.2 - run: - name: Install gts version 1.1.0 globally - command: npm i -g gts@1.1.0 + name: Install gts version 2.0.0 globally + command: npm i -g gts@2.0.0 - run: name: Symlink global modules into all lerna packages - command: lerna exec 'npm link tslint lerna typedoc linkinator typescript gts tslint-consistent-codestyle tslint-microsoft-contrib' + command: lerna exec 'npm link eslint gts eslint-plugin-node @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-header eslint-plugin-import eslint-plugin-prettier prettier lerna typedoc linkinator typescript' - run: name: Check code style and linting command: npm run lint @@ -140,35 +140,12 @@ jobs: - run: name: Docs tests command: npm run docs-test - - persist_to_workspace: - root: packages/opentelemetry-api/docs - paths: - - out - run: name: Install minimal modules to lint examples command: npm i --no-save eslint eslint-plugin-import eslint-config-airbnb-base - run: name: Lint examples command: npm run lint:examples - docs-deploy: - docker: - - image: node:12 - steps: - - checkout - - attach_workspace: - at: packages/opentelemetry-api/docs - - run: - name: Install and configure dependencies - command: | - npm install --silent --no-save gh-pages - git config user.email noreply@opentelemetry.io - git config user.name "ci-build" - - add_ssh_keys: - fingerprints: - - "1d:a3:60:b5:b4:8d:e7:8a:96:ce:6a:0a:e9:58:4c:54" - - run: - name: Deploy docs to gh-pages branch - command: gh-pages --dist packages/opentelemetry-api/docs/out node8: docker: - image: node:8 @@ -207,14 +184,6 @@ workflows: filters: branches: only: /.*/ - - docs-deploy: - requires: - - lint_&_docs - filters: - tags: - only: /^v\d+\.\d+\.\d$/ - branches: - ignore: /.*/ - node8 - node10 - node12 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 033bb9f068..0111f645e4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,4 +12,4 @@ # https://help.github.com/en/articles/about-code-owners # -* @dyladan @mayurkale22 @rochdev @bg451 @OlivierAlbertini @vmarchaud @markwolff @obecny +* @dyladan @mayurkale22 @rochdev @bg451 @OlivierAlbertini @vmarchaud @markwolff @obecny @mwear diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000000..c7c67816fd --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,25 @@ +name: Deploy docs on a new release + +on: + release: + types: [published] + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2 + + - name: Install and Build 🔧 + run: | + npm install --ignore-scripts + npx lerna bootstrap --scope @opentelemetry/api --include-filtered-dependencies + npm run docs + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@releases/v3 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages # The branch the action should deploy to. + FOLDER: packages/opentelemetry-api/docs/out # The folder the action should deploy. \ No newline at end of file diff --git a/.nycrc b/.nycrc index f8e60152fa..47b8c170df 100644 --- a/.nycrc +++ b/.nycrc @@ -4,11 +4,14 @@ ], "exclude": [ "**/*.d.ts", - "build/**/**/*.js", + "build/**/*.*", "src/index.ts", - "karma.conf.js", + "src/platform/**/index.ts", "src/platform/browser/*.ts", - "test/index-webpack.ts", + "src/version.ts", + "test/**/*.*", + ".eslintrc.js", + "karma.conf.js", "webpack/*.js" ], "all": true diff --git a/CHANGELOG.md b/CHANGELOG.md index d4efa616c7..41de6d9ba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,125 @@ All notable changes to this project will be documented in this file. ## Unreleased +## 0.8.2 + +#### :rocket: (Enhancement) +* `opentelemetry-exporter-collector` + * [#1063](https://github.com/open-telemetry/opentelemetry-js/pull/1063) feat: exporter collector TLS option ([@mzahor](https://github.com/mzahor)) +* `opentelemetry-core` + * [#838](https://github.com/open-telemetry/opentelemetry-js/pull/838) feat: implement W3C Correlation Context propagator ([@rubenvp8510](https://github.com/rubenvp8510)) + +#### :bug: (Bug Fix) +* `opentelemetry-api` + * [#1067](https://github.com/open-telemetry/opentelemetry-js/pull/1067) fix: missing `global` in browser environments ([@legendecas](https://github.com/legendecas)) + +#### :books: (Refine Doc) +* Other + * [#1057](https://github.com/open-telemetry/opentelemetry-js/pull/1057) chore: add examples README.md ([@mayurkale22](https://github.com/mayurkale22)) +* `opentelemetry-core` + * [#1080](https://github.com/open-telemetry/opentelemetry-js/pull/1080) docs: document CorrelationContext propagator under Built-in Implement… ([@rubenvp8510](https://github.com/rubenvp8510)) + +#### Committers: 5 +- Marian Zagoruiko ([@mzahor](https://github.com/mzahor)) +- Mayur Kale ([@mayurkale22](https://github.com/mayurkale22)) +- Olivier Albertini ([@OlivierAlbertini](https://github.com/OlivierAlbertini)) +- Ruben Vargas Palma ([@rubenvp8510](https://github.com/rubenvp8510)) +- legendecas ([@legendecas](https://github.com/legendecas)) + +## 0.8.1 + +#### :rocket: (Enhancement) +* Other + * [#1050](https://github.com/open-telemetry/opentelemetry-js/pull/1050) feat: add plugin metapackages ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-resources` + * [#1055](https://github.com/open-telemetry/opentelemetry-js/pull/1055) chore(opentelemetry-resources): add instance type and az to aws detector ([@justinwalz](https://github.com/justinwalz)) +* `opentelemetry-plugin-http` + * [#963](https://github.com/open-telemetry/opentelemetry-js/pull/963) feat(plugin-http): add plugin hooks before processing req and res ([@BlumAmir](https://github.com/BlumAmir)) +* `opentelemetry-metrics` + * [#1049](https://github.com/open-telemetry/opentelemetry-js/pull/1049) chore: pipe resource through to MetricRecord ([@mwear](https://github.com/mwear)) +* `opentelemetry-api`, `opentelemetry-metrics` + * [#1032](https://github.com/open-telemetry/opentelemetry-js/pull/1032) Make Labels Optional for CounterMetric::add ([@astorm](https://github.com/astorm)) + + +#### :bug: (Bug Fix) +* `opentelemetry-plugin-http` + * [#1060](https://github.com/open-telemetry/opentelemetry-js/pull/1060) fix(http-plugin): don't modify user's headers object in plugin ([@BlumAmir](https://github.com/BlumAmir)) +* `opentelemetry-exporter-collector` + * [#1053](https://github.com/open-telemetry/opentelemetry-js/pull/1053) fix: include proto files in deployment package ([@dyladan](https://github.com/dyladan)) + +#### :books: (Refine Doc) +* Other + * [#1065](https://github.com/open-telemetry/opentelemetry-js/pull/1065) style: format README ([@naseemkullah](https://github.com/naseemkullah)) + * [#1064](https://github.com/open-telemetry/opentelemetry-js/pull/1064) chore: update README ([@mayurkale22](https://github.com/mayurkale22)) + * [#1051](https://github.com/open-telemetry/opentelemetry-js/pull/1051) chore: deploy docs using github action ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-exporter-prometheus` + * [#1056](https://github.com/open-telemetry/opentelemetry-js/pull/1056) fix readme: setting labelKeys when creating the counter ([@luebken](https://github.com/luebken)) + +#### Committers: 9 +- Alan Storm ([@astorm](https://github.com/astorm)) +- Amir Blum ([@BlumAmir](https://github.com/BlumAmir)) +- Daniel Dyla ([@dyladan](https://github.com/dyladan)) +- Justin Walz ([@justinwalz](https://github.com/justinwalz)) +- Matthew Wear ([@mwear](https://github.com/mwear)) +- Matthias Lübken ([@luebken](https://github.com/luebken)) +- Mayur Kale ([@mayurkale22](https://github.com/mayurkale22)) +- Naseem ([@naseemkullah](https://github.com/naseemkullah)) +- [@shivkanya9146](https://github.com/shivkanya9146) + +## 0.8.0 + +Released 2020-05-12 + +#### :boom: Breaking Change +* `opentelemetry-api`, `opentelemetry-metrics` + * [#1001](https://github.com/open-telemetry/opentelemetry-js/pull/1001) fix: observers should not expose bind/unbind method ([@legendecas](https://github.com/legendecas)) + +#### :bug: (Bug Fix) +* `opentelemetry-plugin-http` + * [#984](https://github.com/open-telemetry/opentelemetry-js/pull/984) fix(http-plugin): strip otel custom http header #983 ([@vmarchaud](https://github.com/vmarchaud)) +* `opentelemetry-core` + * [#1021](https://github.com/open-telemetry/opentelemetry-js/pull/1021) fix: left pad short b3 trace identifiers ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-plugin-xml-http-reques` + * [#1002](https://github.com/open-telemetry/opentelemetry-js/pull/1002) fix(opentelemetry-plugin-xml-http-request): define span kind as CLIENT for xmlhttprequests ([@ivansenic](https://github.com/ivansenic)) +* `opentelemetry-plugin-grpc` + * [#1005](https://github.com/open-telemetry/opentelemetry-js/pull/1005) fix: add missing error status handler ([@markwolff](https://github.com/markwolff)) +* `opentelemetry-exporter-collector` + * [#1008](https://github.com/open-telemetry/opentelemetry-js/pull/1008) fix: permission denied error when cloning submodules ([@sleighzy](https://github.com/sleighzy)) + +#### :rocket: (Enhancement) +* `opentelemetry-exporter-zipkin`, `opentelemetry-plugin-http`, `opentelemetry-tracing` + * [#1037](https://github.com/open-telemetry/opentelemetry-js/pull/1037) fix(tracing): span processor should receive a readable span as parameters ([@legendecas](https://github.com/legendecas)) +* `opentelemetry-tracing` + * [#1024](https://github.com/open-telemetry/opentelemetry-js/pull/1024) fix: multi span processor should flush child span processors ([@legendecas](https://github.com/legendecas)) +* `opentelemetry-metrics`, `opentelemetry-tracing` + * [#1015](https://github.com/open-telemetry/opentelemetry-js/pull/1015) fix: prevent duplicated resource creation ([@legendecas](https://github.com/legendecas)) +* `opentelemetry-metrics` + * [#1014](https://github.com/open-telemetry/opentelemetry-js/pull/1014) feat(metrics): use MetricDescriptor to determine aggregator #989 ([@vmarchaud](https://github.com/vmarchaud)) +* `opentelemetry-plugin-http` + * [#948](https://github.com/open-telemetry/opentelemetry-js/pull/948) feat(http-plugin): add options to disable new spans if no parent ([@vmarchaud](https://github.com/vmarchaud)) +* `opentelemetry-api`, `opentelemetry-node`, `opentelemetry-plugin-grpc`, `opentelemetry-plugin-http`, `opentelemetry-plugin-https`, `opentelemetry-plugin-xml-http-request`, `opentelemetry-tracing`, `opentelemetry-web` + * [#943](https://github.com/open-telemetry/opentelemetry-js/pull/943) Use global API instances ([@dyladan](https://github.com/dyladan)) +* `opentelemetry-api` + * [#1016](https://github.com/open-telemetry/opentelemetry-js/pull/1016) refactor: normalize namespace import name for @opentelemetry/api ([@legendecas](https://github.com/legendecas)) +* `opentelemetry-core`, `opentelemetry-base` + * [#991](https://github.com/open-telemetry/opentelemetry-js/pull/991) refactor: merge opentelemetry-base to opentelemetry-core ([@legendecas](https://github.com/legendecas)) +* `opentelemetry-core` + * [#981](https://github.com/open-telemetry/opentelemetry-js/pull/981) chore: splitting BasePlugin into browser and node ([@obecny](https://github.com/obecny)) + +#### :books: (Refine Doc) +* Other + * [#1003](https://github.com/open-telemetry/opentelemetry-js/pull/1003) chore: test on node 14 ([@dyladan](https://github.com/dyladan)) + * [#990](https://github.com/open-telemetry/opentelemetry-js/pull/990) fix(opentracing-shim): update opentracing shim example ([@sleighzy](https://github.com/sleighzy)) + +#### Committers: 7 +- legendecas ([@legendecas](https://github.com/legendecas)) +- Valentin Marchaud ([@vmarchaud](https://github.com/vmarchaud)) +- Daniel Dyla ([@dyladan](https://github.com/dyladan)) +- Ivan Senic ([@ivansenic](https://github.com/ivansenic)) +- Mark Wolff ([@markwolff](https://github.com/markwolff)) +- Simon Leigh ([@sleighzy](https://github.com/sleighzy)) +- Bartlomiej Obecny ([@obecny](https://github.com/obecny)) + ## 0.7.0 Released 2020-04-23 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58a2ac14c6..2d4d8925bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,6 +63,31 @@ The `opentelemetry-js` project is written in TypeScript. - `npm test` tests code the same way that our CI will test it. - `npm run lint:fix` lint (and maybe fix) any changes. +### Guidelines for Pull Requests + +- Typically we try to turn around reviews within one to two business days. +- It is generally expected that a maintainer ([@open-telemetry/javascript-maintainers](https://github.com/orgs/open-telemetry/teams/javascript-maintainers)) should review and merge every PR. + - If a change has met the requirements listed below, an approver may also merge the pull request. +- Most PRs should be merged in one to two weeks. +- If a PR is taking longer than 30 days, please ping the approvers ([@open-telemetry/javascript-approvers](https://github.com/orgs/open-telemetry/teams/javascript-approvers)) as it may have been lost +- Dependency upgrades and Security fixes: This PR is small and/or low-risk and can be merged with only maintainer reviews. +- If your patch is not getting reviewed or you need a specific person to review it, you can @username or @open-telemetry/javascript-approvers a reviewer asking for a review in the pull request, or you can ask for a review on Gitter channel. +- API changes, breaking changes, or large changes will be subject to more scrutiny and may require more reviewers. These PRs should only be merged by maintainers. +- Changes to existing plugins and exporters will typically require the approval of the original plugin/exporter author. + +### General Merge Requirements + +- All requirements are at the discretion of the maintainers. + - Maintainers may merge pull requests which have not strictly met these requirements. + - Maintainers may close, block, or put on hold pull requests even if they have strictly met these requirements. +- No “changes requested” reviews. +- No unresolved conversations. +- 4 approvals, including the approvals of both maintainers + - A pull request opened by an approver may be merged with only 3 reviews. + - Small (simple typo, URL, update docs, or grammatical fix) or high-priority changes may be merged more quickly or with fewer reviewers at the discretion of the maintainers. This is typically indicated with the express label. +- For plugins, exporters, and propagators approval of the original code module author is preferred but not required. +- New or changed functionality is tested by unit tests. +- New or changed functionality is documented. ### Generating API documentation - `npm run docs` to generate API documentation. Generates the documentation in `packages/opentelemetry-api/docs/out` diff --git a/README.md b/README.md index 46ba523ad7..c19f11402a 100644 --- a/README.md +++ b/README.md @@ -56,21 +56,23 @@ If you are a library author looking to build OpenTelemetry into your library, pl ## Supported Runtimes -Platform Version | Supported ----------------- | --------- -Node.JS `v14` | ✅ -Node.JS `v13` | ✅ -Node.JS `v12` | ✅ -Node.JS `v10` | ✅ -Node.JS `v8` | See [Node Support](#node-support) below -Web Browsers | ✅ See [Browser Support](#browser-support) below +| Platform Version | Supported | +|------------------|-------------------------------------------------| +| Node.JS `v14` | ✅ | +| Node.JS `v13` | ✅ | +| Node.JS `v12` | ✅ | +| Node.JS `v10` | ✅ | +| Node.JS `v8` | See [Node Support](#node-support) below | +| Web Browsers | ✅ See [Browser Support](#browser-support) below | ### Node Support + Automated tests are run using the latest release of each currently active version of Node.JS. While Node.JS v8 is no longer supported by the Node.JS team, the latest version of Node.JS v8 is still included in our testing suite. Please note that versions of Node.JS v8 prior to `v8.5.0` will NOT work, because OpenTelemetry Node depends on the `perf_hooks` module introduced in `v8.5.0` ### Browser Support + Automated browser tests are run in the latest version of Headless Chrome. There is currently no list of officially supported browsers, but OpenTelemetry is developed using standard web technologies with wide support and should work in currently supported versions of major browsers. @@ -80,28 +82,28 @@ OpenTelemetry JS is under active development. This release isn't guaranteed to conform to a specific version of the specification, and future releases will not attempt to maintain backwards compatibility with the alpha release. -| Component | Initial Version | Release Date | -| --------------------------- | --------------- | ---------------- | -| Tracing API | Alpha v0.1.0 | October 14 2019 | -| Tracing SDK (Node and Web) | Alpha v0.1.0 | October 14 2019 | -| Jaeger Trace Exporter | Alpha v0.1.0 | October 14 2019 | -| Trace Context Propagation | Alpha v0.1.0 | October 14 2019 | -| Zipkin Trace Exporter | Alpha v0.1.0 | October 14 2019 | -| OpenTracing Bridge | Alpha v0.1.0 | October 14 2019 | -| Metrics API | Alpha v0.2.0 | November 04 2019 | -| Metrics SDK | Alpha v0.2.0 | November 04 2019 | -| Prometheus Metric Exporter | Alpha v0.3.0 | December 13 2019 | -| Resources | Beta v0.5.0 | March 16 2020 | -| Metrics SDK (Complete) | Beta v0.5.0 | March 16 2020 | -| OpenCensus Bridge | Unknown | Unknown | -| Support for Tags/Baggage | Unknown | Unknown | +| Component | Initial Version | Release Date | +|----------------------------|-----------------|------------------| +| Tracing API | Alpha v0.1.0 | October 14 2019 | +| Tracing SDK (Node and Web) | Alpha v0.1.0 | October 14 2019 | +| Jaeger Trace Exporter | Alpha v0.1.0 | October 14 2019 | +| Trace Context Propagation | Alpha v0.1.0 | October 14 2019 | +| Zipkin Trace Exporter | Alpha v0.1.0 | October 14 2019 | +| OpenTracing Bridge | Alpha v0.1.0 | October 14 2019 | +| Metrics API | Alpha v0.2.0 | November 04 2019 | +| Metrics SDK | Alpha v0.2.0 | November 04 2019 | +| Prometheus Metric Exporter | Alpha v0.3.0 | December 13 2019 | +| Resources | Beta v0.5.0 | March 16 2020 | +| Metrics SDK (Complete) | Beta v0.5.0 | March 16 2020 | +| OpenCensus Bridge | Unknown | Unknown | +| Support for Tags/Baggage | Unknown | Unknown | ## Feature Status Last updated March 2020 | Feature | API Status | Specification Target | SDK Status | -| ------------------- | ---------- | -------------------- | ----------- | +|---------------------|------------|----------------------|-------------| | Tracing | Beta | v0.3 | Beta | | Metrics | Beta | v0.3 | Beta | | Context | Beta | v0.3 | Beta | @@ -116,6 +118,7 @@ for details on upcoming releases. The dates and features described here are estimates, and subject to change. ## Contributing + We'd love your help!. Use tags [up-for-grabs][up-for-grabs-issues] and [good first issue][good-first-issues] to get started with the project. Follow [CONTRIBUTING](CONTRIBUTING.md) guide to report issues or submit a proposal. @@ -130,6 +133,7 @@ Approvers ([@open-telemetry/js-approvers](https://github.com/orgs/open-telemetry - [Valentin Marchaud](https://github.com/vmarchaud), Open Source Contributor - [Mark Wolff](https://github.com/markwolff), Microsoft - [Bartlomiej Obecny](https://github.com/obecny), LightStep +- [Matthew Wear](https://github.com/mwear), LightStep *Find more about the approver role in [community repository](https://github.com/open-telemetry/community/blob/master/community-membership.md#approver).* @@ -141,6 +145,7 @@ Maintainers ([@open-telemetry/js-maintainers](https://github.com/orgs/open-telem *Find more about the maintainer role in [community repository](https://github.com/open-telemetry/community/blob/master/community-membership.md#maintainer).* ### Thanks to all the people who already contributed! + @@ -149,19 +154,19 @@ Maintainers ([@open-telemetry/js-maintainers](https://github.com/orgs/open-telem ### API -| Package | Description | -| ----------------------- | -----------------| -| [@opentelemetry/api][otel-api] | This package provides TypeScript interfaces, enums and no-op implementations for the OpenTelemetry core trace and metrics model. It is intended for use both on the server and in the browser. | -| [@opentelemetry/core][otel-core] | This package provides default and no-op implementations of the OpenTelemetry api for trace and metrics. It's intended for use both on the server and in the browser. | +| Package | Description | +|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [@opentelemetry/api][otel-api] | This package provides TypeScript interfaces, enums and no-op implementations for the OpenTelemetry core trace and metrics model. It is intended for use both on the server and in the browser. | +| [@opentelemetry/core][otel-core] | This package provides default and no-op implementations of the OpenTelemetry api for trace and metrics. It's intended for use both on the server and in the browser. | ### Implementation / SDKs -| Package | Description | -| ----------------------- | -----------------| +| Package | Description | +|----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [@opentelemetry/tracing][otel-tracing] | This module provides a full control over instrumentation and span creation. It doesn't load [`async_hooks`](https://nodejs.org/api/async_hooks.html) or any instrumentation plugin by default. It is intended for use both on the server and in the browser. | -| [@opentelemetry/metrics][otel-metrics] | This module provides instruments and meters for reporting of time series data. | -| [@opentelemetry/node][otel-node] | This module provides automatic tracing for Node.js applications. It is intended for use on the server only. | -| [@opentelemetry/web][otel-web] | This module provides automated instrumentation and tracing for Web applications. It is intended for use in the browser only. | +| [@opentelemetry/metrics][otel-metrics] | This module provides instruments and meters for reporting of time series data. | +| [@opentelemetry/node][otel-node] | This module provides automatic tracing for Node.js applications. It is intended for use on the server only. | +| [@opentelemetry/web][otel-web] | This module provides automated instrumentation and tracing for Web applications. It is intended for use in the browser only. | ### Compatible Exporters @@ -174,26 +179,36 @@ See the [OpenTelemetry registry](https://opentelemetry.io/registry/?s=node.js) f OpenTelemetry can collect tracing data automatically using plugins. Vendors/Users can also create and use their own. Currently, OpenTelemetry supports automatic tracing for: #### Node Plugins + ##### Core + - [@opentelemetry/plugin-grpc][otel-plugin-grpc] - [@opentelemetry/plugin-http][otel-plugin-http] - [@opentelemetry/plugin-https][otel-plugin-https] + ##### Contrib + These plugins are hosted at https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node + - [@opentelemetry/plugin-mongodb][otel-contrib-plugin-mongodb] - [@opentelemetry/plugin-mysql][otel-contrib-plugin-mysql] - [@opentelemetry/plugin-pg][otel-contrib-plugin-pg] - [@opentelemetry/plugin-pg-pool][otel-contrib-plugin-pg-pool] - [@opentelemetry/plugin-redis][otel-contrib-plugin-redis] - [@opentelemetry/plugin-ioredis][otel-contrib-plugin-ioredis] +- [@opentelemetry/plugin-express][otel-contrib-plugin-express] - [@opentelemetry/plugin-dns][otel-contrib-plugin-dns] - By default, this plugin is not loaded [#612](https://github.com/open-telemetry/opentelemetry-js/issues/612) -- [@opentelemetry/plugin-express][otel-contrib-plugin-express] - By default, this plugin is not loaded #### Web Plugins + ##### Core + - [@opentelemetry/plugin-xml-http-request][otel-plugin-xml-http-request] + ##### Contrib + These plugins are hosted at https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/web + - [@opentelemetry/plugin-document-load][otel-contrib-plugin-document-load] - [@opentelemetry/plugin-user-interaction][otel-contrib-plugin-user-interaction] @@ -201,12 +216,12 @@ To request automatic tracing support for a module not on this list, please [file ### Shims -| Package | Description | -| ----------------------- | -----------------| +| Package | Description | +|----------------------------------------------------------|-----------------------------------------------------------------------------------------| | [@opentelemetry/shim-opentracing][otel-shim-opentracing] | OpenTracing shim allows existing OpenTracing instrumentation to report to OpenTelemetry | - ## Useful links + - For more information on OpenTelemetry, visit: - For help or feedback on this project, join us on [gitter][node-gitter-url] @@ -246,3 +261,4 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [otel-contrib-plugin-express]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/node/opentelemetry-plugin-express [otel-contrib-plugin-user-interaction]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/web/opentelemetry-plugin-user-interaction [otel-contrib-plugin-document-load]: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/master/plugins/web/opentelemetry-plugin-document-load + diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000..5a83bea117 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,49 @@ +module.exports = { + plugins: [ + "@typescript-eslint", + "header" + ], + extends: [ + "./node_modules/gts", + ], + parser: "@typescript-eslint/parser", + parserOptions: { + "project": "./tsconfig.json" + }, + rules: { + "@typescript-eslint/no-this-alias": "off", + "eqeqeq": "off", + "prefer-rest-params": "off", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "memberLike", + "modifiers": ["private", "protected"], + "format": ["camelCase"], + "leadingUnderscore": "require" + } + ], + "@typescript-eslint/no-inferrable-types": ["error", { ignoreProperties: true }], + "arrow-parens": ["error", "as-needed"], + "prettier/prettier": ["error", { "singleQuote": true, "arrowParens": "avoid" }], + "node/no-deprecated-api": ["warn"], + "header/header": [2, "block", [{ + pattern: / \* Copyright \d{4}, OpenTelemetry Authors[\r\n]+ \*[\r\n]+ \* Licensed under the Apache License, Version 2\.0 \(the \"License\"\);[\r\n]+ \* you may not use this file except in compliance with the License\.[\r\n]+ \* You may obtain a copy of the License at[\r\n]+ \*[\r\n]+ \* https:\/\/www\.apache\.org\/licenses\/LICENSE-2\.0[\r\n]+ \*[\r\n]+ \* Unless required by applicable law or agreed to in writing, software[\r\n]+ \* distributed under the License is distributed on an \"AS IS\" BASIS,[\r\n]+ \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.[\r\n]+ \* See the License for the specific language governing permissions and[\r\n]+ \* limitations under the License\./gm, + template: + `\n * Copyright ${new Date().getFullYear()}, OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ` + }]] + }, + overrides: [ + { + "files": ["test/**/*.ts"], + "rules": { + "no-empty": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-var-requires": "off" + } + } + ] +}; diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000000..9c7a2f94e7 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,29 @@ +# OpenTelemetry JavaScript Examples + +This directory contains a number of examples of how to run real applications +with OpenTelemetry JavaScript. + +### Maintained Examples + +Maintained Examples are expected to be updated with every OpenTelemetry JavaScript release, to +use the latest and greatest features, and best practices. + +|Name | Description | Complexity Level | +------------- | ------------- | ------------ | +|[basic-tracer-node](basic-tracer-node/) | Basic use of Tracing in Node.js application | Beginner | +|[tracer-node](tracer-node/) | Basic use of Tracing in Web application | Beginner | +|[prometheus](prometheus/) | Basic Metric use with Prometheus (`@opentelemetry/exporter-prometheus`) Exporter | Beginner | +|[http](http/) | HTTP Instrumentation to automatically collect trace data and export them to the backend of choice | Intermediate | +|[https](https/) | HTTPS Instrumentation to automatically collect trace data and export them to the backend of choice | Intermediate | +|[grpc](grpc/) | gRPC Instrumentation to automatically collect trace data and export them to the backend of choice | Intermediate | +|[express](express/) | Express Instrumentation to automatically collect trace data and export them to the backend of choice | Intermediate | +|[collector-exporter-node](collector-exporter-node/) | This example shows how to use `@opentelemetry/exporter-collector` to instrument a simple Node.js application | Intermediate | +|[opentracing-shim](opentracing-shim/) | This is a simple example that demonstrates how existing OpenTracing instrumentation can be integrated with OpenTelemetry | Intermediate | + +### Contributing + +Please see [CONTRIBUTING.md](https://github.com/open-telemetry/opentelemetry-js/blob/master/CONTRIBUTING.md) for instructions on how to contribute. + +## LICENSE + +Apache License 2.0 diff --git a/examples/basic-tracer-node/index.js b/examples/basic-tracer-node/index.js index 5db3fd1ffc..45888437c2 100644 --- a/examples/basic-tracer-node/index.js +++ b/examples/basic-tracer-node/index.js @@ -18,7 +18,7 @@ provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); * tracer provider. This means when you call API methods like * `opentelemetry.trace.getTracer`, they will use this tracer provider. If you * do not register a global tracer provider, instrumentation which calls these - * methods will recieve no-op implementations. + * methods will receive no-op implementations. */ provider.register(); const tracer = opentelemetry.trace.getTracer('example-basic-tracer-node'); diff --git a/examples/basic-tracer-node/package.json b/examples/basic-tracer-node/package.json index cb7aadba81..614c5cec9c 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.7.0", + "version": "0.8.2", "description": "Example of using @opentelemetry/tracing in Node.js", "main": "index.js", "scripts": { @@ -24,9 +24,9 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/exporter-jaeger": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/exporter-jaeger": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2" }, "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 e69c72ea59..34dc191acb 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.7.0", + "version": "0.8.2", "description": "Example of using @opentelemetry/collector-exporter in Node.js", "main": "index.js", "scripts": { @@ -26,9 +26,9 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/exporter-collector": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/exporter-collector": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/grpc/package.json b/examples/grpc/package.json index 7855d31dc1..a2018dc018 100644 --- a/examples/grpc/package.json +++ b/examples/grpc/package.json @@ -1,7 +1,7 @@ { "name": "grpc-example", "private": true, - "version": "0.7.0", + "version": "0.8.2", "description": "Example of gRPC integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -28,12 +28,12 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/exporter-jaeger": "^0.7.0", - "@opentelemetry/exporter-zipkin": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/plugin-grpc": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/exporter-jaeger": "^0.8.2", + "@opentelemetry/exporter-zipkin": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/plugin-grpc": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "google-protobuf": "^3.9.2", "grpc": "^1.23.3", "node-pre-gyp": "0.12.0" diff --git a/examples/http/package.json b/examples/http/package.json index c47fd562fa..883e79cfea 100644 --- a/examples/http/package.json +++ b/examples/http/package.json @@ -1,7 +1,7 @@ { "name": "http-example", "private": true, - "version": "0.7.0", + "version": "0.8.2", "description": "Example of HTTP integration with OpenTelemetry", "main": "index.js", "scripts": { @@ -28,12 +28,12 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/exporter-jaeger": "^0.7.0", - "@opentelemetry/exporter-zipkin": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/plugin-http": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/exporter-jaeger": "^0.8.2", + "@opentelemetry/exporter-zipkin": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/plugin-http": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { diff --git a/examples/https/package.json b/examples/https/package.json index 33570c1853..f65360d862 100644 --- a/examples/https/package.json +++ b/examples/https/package.json @@ -1,7 +1,7 @@ { "name": "https-example", "private": true, - "version": "0.7.0", + "version": "0.8.2", "description": "Example of HTTPs integration with OpenTelemetry", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -29,12 +29,12 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/exporter-jaeger": "^0.7.0", - "@opentelemetry/exporter-zipkin": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/plugin-https": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/exporter-jaeger": "^0.8.2", + "@opentelemetry/exporter-zipkin": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/plugin-https": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", "devDependencies": { diff --git a/examples/metrics/package.json b/examples/metrics/package.json index b5a5db81bd..75c71a498c 100644 --- a/examples/metrics/package.json +++ b/examples/metrics/package.json @@ -1,7 +1,7 @@ { "name": "example-metrics", "private": true, - "version": "0.7.0", + "version": "0.8.2", "description": "Example of using @opentelemetry/metrics", "main": "index.js", "scripts": { @@ -26,8 +26,8 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/exporter-prometheus": "^0.7.0", - "@opentelemetry/metrics": "^0.7.0" + "@opentelemetry/exporter-prometheus": "^0.8.2", + "@opentelemetry/metrics": "^0.8.2" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/examples/opentracing-shim/package.json b/examples/opentracing-shim/package.json index ceb3d297e9..8df9a822cd 100644 --- a/examples/opentracing-shim/package.json +++ b/examples/opentracing-shim/package.json @@ -1,7 +1,7 @@ { "name": "opentracing-shim", "private": true, - "version": "0.7.0", + "version": "0.8.2", "description": "Example of using @opentelemetry/shim-opentracing in Node.js", "main": "index.js", "scripts": { @@ -29,11 +29,11 @@ "url": "https://github.com/open-telemetry/opentelemetry-js/issues" }, "dependencies": { - "@opentelemetry/exporter-jaeger": "^0.7.0", - "@opentelemetry/exporter-zipkin": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/shim-opentracing": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/exporter-jaeger": "^0.8.2", + "@opentelemetry/exporter-zipkin": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/shim-opentracing": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "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 9d0baa9446..62b1b260d9 100644 --- a/examples/prometheus/package.json +++ b/examples/prometheus/package.json @@ -1,6 +1,6 @@ { "name": "prometheus-example", - "version": "0.7.0", + "version": "0.8.2", "description": "Example of using @opentelemetry/metrics and @opentelemetry/exporter-prometheus", "main": "index.js", "scripts": { @@ -9,7 +9,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/exporter-prometheus": "^0.7.0", - "@opentelemetry/metrics": "^0.7.0" + "@opentelemetry/exporter-prometheus": "^0.8.2", + "@opentelemetry/metrics": "^0.8.2" } } diff --git a/examples/tracer-web/package.json b/examples/tracer-web/package.json index 598a9ee7cd..2f1e601e14 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.7.0", + "version": "0.8.2", "description": "Example of using @opentelemetry/web in browser", "main": "index.js", "scripts": { @@ -34,14 +34,14 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/context-zone": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/exporter-collector": "^0.7.0", + "@opentelemetry/context-zone": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/exporter-collector": "^0.8.2", "@opentelemetry/plugin-document-load": "^0.6.1", "@opentelemetry/plugin-user-interaction": "^0.6.1", - "@opentelemetry/plugin-xml-http-request": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", - "@opentelemetry/web": "^0.7.0" + "@opentelemetry/plugin-xml-http-request": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", + "@opentelemetry/web": "^0.8.2" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme" } diff --git a/getting-started/monitored-example/package.json b/getting-started/monitored-example/package.json index b4b6a7ff0e..daec19d5a9 100644 --- a/getting-started/monitored-example/package.json +++ b/getting-started/monitored-example/package.json @@ -9,7 +9,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/metrics": "^0.7.0", + "@opentelemetry/metrics": "^0.8.2", "axios": "^0.19.0", "express": "^4.17.1" } diff --git a/getting-started/traced-example/package.json b/getting-started/traced-example/package.json index 9675f7d105..e1f5f6da58 100644 --- a/getting-started/traced-example/package.json +++ b/getting-started/traced-example/package.json @@ -9,11 +9,13 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/exporter-zipkin": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/plugin-http": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/exporter-zipkin": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/plugin-express": "^0.7.0", + "@opentelemetry/plugin-http": "^0.8.2", + "@opentelemetry/plugin-https": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "axios": "^0.19.0", "express": "^4.17.1" } diff --git a/getting-started/ts-example/package.json b/getting-started/ts-example/package.json index 16eff7a16f..a41e904abf 100644 --- a/getting-started/ts-example/package.json +++ b/getting-started/ts-example/package.json @@ -13,14 +13,14 @@ "ts-node": "^8.6.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/exporter-prometheus": "^0.7.0", - "@opentelemetry/exporter-zipkin": "^0.7.0", - "@opentelemetry/metrics": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/plugin-http": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/exporter-prometheus": "^0.8.2", + "@opentelemetry/exporter-zipkin": "^0.8.2", + "@opentelemetry/metrics": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/plugin-http": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "axios": "^0.19.1", "express": "^4.17.1" } diff --git a/lerna.json b/lerna.json index 07bd971258..b903831656 100644 --- a/lerna.json +++ b/lerna.json @@ -3,9 +3,10 @@ "npmClient": "npm", "packages": [ "benchmark/*", + "metapackages/*", "packages/*" ], - "version": "0.7.0", + "version": "0.8.2", "changelog": { "repo": "open-telemetry/opentelemetry-js", "labels": { diff --git a/metapackages/plugins-node-core/README.md b/metapackages/plugins-node-core/README.md new file mode 100644 index 0000000000..8d4d103936 --- /dev/null +++ b/metapackages/plugins-node-core/README.md @@ -0,0 +1,35 @@ +# OpenTelemetry Plugins Node Core +[![Gitter chat][gitter-image]][gitter-url] +[![NPM Published Version][npm-img]][npm-url] +[![dependencies][dependencies-image]][dependencies-url] +[![Apache License][license-image]][license-image] + +This package depends on all core node plugins maintained by OpenTelemetry authors. Installing it installs all core plugins + +## Plugins + +- [@opentelemetry/plugin-grpc][otel-plugin-grpc] +- [@opentelemetry/plugin-http][otel-plugin-http] +- [@opentelemetry/plugin-https][otel-plugin-https] + +## Useful links +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us on [gitter][gitter-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[gitter-image]: https://badges.gitter.im/open-telemetry/opentelemetry-js.svg +[gitter-url]: https://gitter.im/open-telemetry/opentelemetry-node?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/master/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[dependencies-image]: https://david-dm.org/open-telemetry/opentelemetry-js/status.svg?path=metapackages/plugins-node-core +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetryplugins-node-core +[npm-url]: https://www.npmjs.com/package/@opentelemetry/plugins-node-core +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fplugins-node-core.svg + +[otel-plugin-grpc]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-plugin-grpc +[otel-plugin-http]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-plugin-http +[otel-plugin-https]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-plugin-https diff --git a/metapackages/plugins-node-core/package.json b/metapackages/plugins-node-core/package.json new file mode 100644 index 0000000000..9175c87567 --- /dev/null +++ b/metapackages/plugins-node-core/package.json @@ -0,0 +1,23 @@ +{ + "name": "@opentelemetry/plugins-node-core", + "version": "0.8.2", + "description": "Metapackage which bundles all opentelemetry node core plugins", + "author": "OpenTelemetry Authors", + "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/open-telemetry/opentelemetry-js.git" + }, + "bugs": { + "url": "https://github.com/open-telemetry/opentelemetry-js/issues" + }, + "dependencies": { + "@opentelemetry/plugin-grpc": "^0.8.2", + "@opentelemetry/plugin-http": "^0.8.2", + "@opentelemetry/plugin-https": "^0.8.2" + } +} diff --git a/metapackages/plugins-web-core/README.md b/metapackages/plugins-web-core/README.md new file mode 100644 index 0000000000..97e9f39250 --- /dev/null +++ b/metapackages/plugins-web-core/README.md @@ -0,0 +1,31 @@ +# OpenTelemetry Plugins Web Core +[![Gitter chat][gitter-image]][gitter-url] +[![NPM Published Version][npm-img]][npm-url] +[![dependencies][dependencies-image]][dependencies-url] +[![Apache License][license-image]][license-image] + +This package depends on all core web plugins maintained by OpenTelemetry authors. Installing it installs all core plugins + +## Plugins + +- [@opentelemetry/plugin-xml-http-request][otel-plugin-xml-http-request] + +## Useful links +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us on [gitter][gitter-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[gitter-image]: https://badges.gitter.im/open-telemetry/opentelemetry-js.svg +[gitter-url]: https://gitter.im/open-telemetry/opentelemetry-node?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/master/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[dependencies-image]: https://david-dm.org/open-telemetry/opentelemetry-js/status.svg?path=metapackages/plugins-web-core +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetryplugins-web-core +[npm-url]: https://www.npmjs.com/package/@opentelemetry/plugins-web-core +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fplugins-web-core.svg + +[otel-plugin-xml-http-request]: https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-plugin-xml-http-request \ No newline at end of file diff --git a/metapackages/plugins-web-core/package.json b/metapackages/plugins-web-core/package.json new file mode 100644 index 0000000000..9476ea3531 --- /dev/null +++ b/metapackages/plugins-web-core/package.json @@ -0,0 +1,21 @@ +{ + "name": "@opentelemetry/plugins-web-core", + "version": "0.8.2", + "description": "Metapackage which bundles all opentelemetry web core plugins", + "author": "OpenTelemetry Authors", + "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/open-telemetry/opentelemetry-js.git" + }, + "bugs": { + "url": "https://github.com/open-telemetry/opentelemetry-js/issues" + }, + "dependencies": { + "@opentelemetry/plugin-xml-http-request": "^0.8.2" + } +} diff --git a/package.json b/package.json index 329e6c16fa..273db8acf3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opentelemetry-base", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry is a distributed tracing and stats collection framework.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -45,12 +45,14 @@ "eslint": "^6.8.0", "eslint-config-airbnb-base": "^14.0.0", "eslint-plugin-import": "^2.19.1", + "eslint-plugin-header": "^3.0.0", + "@typescript-eslint/eslint-plugin": "^2.23.0", + "@typescript-eslint/parser": "^2.23.0", "gh-pages": "^2.1.1", - "gts": "^1.1.0", + "gts": "^2.0.0", "husky": "^3.0.9", "lerna": "^3.17.0", "lerna-changelog": "^1.0.0", - "tslint": "^5.0.0", "typescript": "^3.7.2" }, "husky": { diff --git a/packages/opentelemetry-api/.eslintignore b/packages/opentelemetry-api/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-api/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-api/.eslintrc.js b/packages/opentelemetry-api/.eslintrc.js new file mode 100644 index 0000000000..e20344660f --- /dev/null +++ b/packages/opentelemetry-api/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "shared-node-browser": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-api/package.json b/packages/opentelemetry-api/package.json index 68eca898e6..f15ca22678 100644 --- a/packages/opentelemetry-api/package.json +++ b/packages/opentelemetry-api/package.json @@ -1,9 +1,13 @@ { "name": "@opentelemetry/api", - "version": "0.7.0", + "version": "0.8.2", "description": "Public API for OpenTelemetry", "main": "build/src/index.js", "types": "build/src/index.d.ts", + "browser": { + "./src/platform/index.ts": "./src/platform/browser/index.ts", + "./build/src/platform/index.js": "./build/src/platform/browser/index.js" + }, "repository": "open-telemetry/opentelemetry-js", "scripts": { "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts", @@ -11,8 +15,8 @@ "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "build": "npm run compile", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -47,28 +51,26 @@ "access": "public" }, "dependencies": { - "@opentelemetry/context-base": "^0.7.0" + "@opentelemetry/context-base": "^0.8.2" }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/webpack-env": "1.13.9", "codecov": "^3.6.1", - "gts": "^1.1.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-mocha": "^1.3.0", + "karma-coverage-istanbul-reporter": "^3.0.2", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", "linkinator": "^2.0.3", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", + "ts-mocha": "^7.0.0", "typedoc": "^0.15.0", "typescript": "3.7.2", "webpack": "^4.35.2" diff --git a/packages/opentelemetry-api/src/api/global-utils.ts b/packages/opentelemetry-api/src/api/global-utils.ts index 3114d1b6d0..00b73f8ce8 100644 --- a/packages/opentelemetry-api/src/api/global-utils.ts +++ b/packages/opentelemetry-api/src/api/global-utils.ts @@ -18,6 +18,7 @@ import { ContextManager } from '@opentelemetry/context-base'; import { HttpTextPropagator } from '../context/propagation/HttpTextPropagator'; import { MeterProvider } from '../metrics/MeterProvider'; import { TracerProvider } from '../trace/tracer_provider'; +import { _globalThis } from '../platform'; export const GLOBAL_CONTEXT_MANAGER_API_KEY = Symbol.for( 'io.opentelemetry.js.api.context' @@ -31,14 +32,14 @@ export const GLOBAL_PROPAGATION_API_KEY = Symbol.for( export const GLOBAL_TRACE_API_KEY = Symbol.for('io.opentelemetry.js.api.trace'); type Get = (version: number) => T; -type MyGlobals = Partial<{ +type OtelGlobal = Partial<{ [GLOBAL_CONTEXT_MANAGER_API_KEY]: Get; [GLOBAL_METRICS_API_KEY]: Get; [GLOBAL_PROPAGATION_API_KEY]: Get; [GLOBAL_TRACE_API_KEY]: Get; }>; -export const _global = global as typeof global & MyGlobals; +export const _global = _globalThis as OtelGlobal; /** * Make a function which accepts a version integer and returns the instance of an API if the version diff --git a/packages/opentelemetry-api/src/metrics/Metric.ts b/packages/opentelemetry-api/src/metrics/Metric.ts index 4b02812723..3c44696cc8 100644 --- a/packages/opentelemetry-api/src/metrics/Metric.ts +++ b/packages/opentelemetry-api/src/metrics/Metric.ts @@ -108,16 +108,16 @@ export interface UnboundMetric extends Metric { export interface Counter extends UnboundMetric { /** - * Adds the given value to the current value. Values cannot be negative. + * Adds the given value to the current value. Values cannot be negative. */ - add(value: number, labels: Labels): void; + add(value: number, labels?: Labels): void; } export interface Measure extends UnboundMetric { /** - * Records the given value to this measure. + * Records the given value to this measure. */ - record(value: number, labels: Labels): void; + record(value: number, labels?: Labels): void; record( value: number, diff --git a/packages/opentelemetry-api/src/platform/browser/globalThis.ts b/packages/opentelemetry-api/src/platform/browser/globalThis.ts new file mode 100644 index 0000000000..df2b5b247f --- /dev/null +++ b/packages/opentelemetry-api/src/platform/browser/globalThis.ts @@ -0,0 +1,19 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** only globals that common to node and browsers are allowed */ +// eslint-disable-next-line node/no-unsupported-features/es-builtins, no-undef +export const _globalThis = typeof globalThis === 'object' ? globalThis : window; diff --git a/packages/opentelemetry-api/src/platform/browser/index.ts b/packages/opentelemetry-api/src/platform/browser/index.ts new file mode 100644 index 0000000000..c3608dbed7 --- /dev/null +++ b/packages/opentelemetry-api/src/platform/browser/index.ts @@ -0,0 +1,17 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './globalThis'; diff --git a/packages/opentelemetry-api/src/platform/index.ts b/packages/opentelemetry-api/src/platform/index.ts new file mode 100644 index 0000000000..e4361f1724 --- /dev/null +++ b/packages/opentelemetry-api/src/platform/index.ts @@ -0,0 +1,17 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './node'; diff --git a/packages/opentelemetry-api/src/platform/node/globalThis.ts b/packages/opentelemetry-api/src/platform/node/globalThis.ts new file mode 100644 index 0000000000..8e24cf207e --- /dev/null +++ b/packages/opentelemetry-api/src/platform/node/globalThis.ts @@ -0,0 +1,19 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** only globals that common to node and browsers are allowed */ +// eslint-disable-next-line node/no-unsupported-features/es-builtins +export const _globalThis = typeof globalThis === 'object' ? globalThis : global; diff --git a/packages/opentelemetry-api/src/platform/node/index.ts b/packages/opentelemetry-api/src/platform/node/index.ts new file mode 100644 index 0000000000..c3608dbed7 --- /dev/null +++ b/packages/opentelemetry-api/src/platform/node/index.ts @@ -0,0 +1,17 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './globalThis'; diff --git a/packages/opentelemetry-api/src/trace/instrumentation/Plugin.ts b/packages/opentelemetry-api/src/trace/instrumentation/Plugin.ts index c255fbe857..2206d4b0e0 100644 --- a/packages/opentelemetry-api/src/trace/instrumentation/Plugin.ts +++ b/packages/opentelemetry-api/src/trace/instrumentation/Plugin.ts @@ -18,7 +18,6 @@ import { Logger } from '../../common/Logger'; import { TracerProvider } from '../tracer_provider'; /** Interface Plugin to apply patch. */ -// tslint:disable-next-line:no-any export interface Plugin { /** * Contains all supported versions. diff --git a/packages/opentelemetry-api/src/version.ts b/packages/opentelemetry-api/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-api/src/version.ts +++ b/packages/opentelemetry-api/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-api/tslint.json b/packages/opentelemetry-api/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-api/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-context-async-hooks/.eslintignore b/packages/opentelemetry-context-async-hooks/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-context-async-hooks/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-context-async-hooks/.eslintrc.js b/packages/opentelemetry-context-async-hooks/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-context-async-hooks/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-context-async-hooks/package.json b/packages/opentelemetry-context-async-hooks/package.json index 2efdf98732..e52dbb759e 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.7.0", + "version": "0.8.2", "description": "OpenTelemetry AsyncHooks-based Context Manager", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -28,7 +28,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": ">=8.1.0" }, "files": [ "build/src/**/*.js", @@ -42,20 +42,18 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/shimmer": "^1.0.1", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.1.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/context-base": "^0.7.0" + "@opentelemetry/context-base": "^0.8.2" } } diff --git a/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts b/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts index 4ea8fe78d4..f970ab397d 100644 --- a/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts +++ b/packages/opentelemetry-context-async-hooks/src/AsyncHooksContextManager.ts @@ -83,8 +83,6 @@ export class AsyncHooksContextManager implements ContextManager { } try { return fn(); - } catch (err) { - throw err; } finally { if (oldContext === undefined) { this._destroy(uid); @@ -110,8 +108,6 @@ export class AsyncHooksContextManager implements ContextManager { } try { return await fn(); - } catch (err) { - throw err; } finally { if (oldContext === undefined) { this._destroy(uid); @@ -147,7 +143,7 @@ export class AsyncHooksContextManager implements ContextManager { private _bindFunction(target: T, context: Context): T { const manager = this; - const contextWrapper = function(this: {}, ...args: unknown[]) { + const contextWrapper = function (this: {}, ...args: unknown[]) { return manager.with(context, () => target.apply(this, args)); }; Object.defineProperty(contextWrapper, 'length', { @@ -160,7 +156,6 @@ export class AsyncHooksContextManager implements ContextManager { * It isn't possible to tell Typescript that contextWrapper is the same as T * so we forced to cast as any here. */ - // tslint:disable-next-line:no-any return contextWrapper as any; } @@ -208,7 +203,7 @@ export class AsyncHooksContextManager implements ContextManager { * @param original reference to the patched method */ private _patchRemoveListener(ee: PatchedEventEmitter, original: Function) { - return function(this: {}, event: string, listener: Func) { + return function (this: {}, event: string, listener: Func) { if ( ee.__ot_listeners === undefined || ee.__ot_listeners[event] === undefined @@ -231,7 +226,7 @@ export class AsyncHooksContextManager implements ContextManager { ee: PatchedEventEmitter, original: Function ) { - return function(this: {}, event: string) { + return function (this: {}, event: string) { if ( ee.__ot_listeners === undefined || ee.__ot_listeners[event] === undefined @@ -256,7 +251,7 @@ export class AsyncHooksContextManager implements ContextManager { context: Context ) { const contextManager = this; - return function(this: {}, event: string, listener: Func) { + return function (this: {}, event: string, listener: Func) { if (ee.__ot_listeners === undefined) ee.__ot_listeners = {}; let listeners = ee.__ot_listeners[event]; if (listeners === undefined) { diff --git a/packages/opentelemetry-context-async-hooks/src/index.ts b/packages/opentelemetry-context-async-hooks/src/index.ts index e0dd94f9ea..8a45a59477 100644 --- a/packages/opentelemetry-context-async-hooks/src/index.ts +++ b/packages/opentelemetry-context-async-hooks/src/index.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-context-async-hooks/src/version.ts b/packages/opentelemetry-context-async-hooks/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-context-async-hooks/src/version.ts +++ b/packages/opentelemetry-context-async-hooks/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts b/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts index 8c6c648a88..1c2429694e 100644 --- a/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts +++ b/packages/opentelemetry-context-async-hooks/test/AsyncHooksContextManager.test.ts @@ -202,7 +202,7 @@ describe('AsyncHooksContextManager', () => { it('not awaited withAsync() inside with() should not restore context', done => { const scope1 = '1' as any; const scope2 = '2' as any; - let _done: boolean = false; + let _done = false; contextManager.with(scope1, () => { assert.strictEqual(contextManager.active(), scope1); diff --git a/packages/opentelemetry-context-async-hooks/tslint.json b/packages/opentelemetry-context-async-hooks/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-context-async-hooks/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-context-base/.eslintignore b/packages/opentelemetry-context-base/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-context-base/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-context-base/.eslintrc.js b/packages/opentelemetry-context-base/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-context-base/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-context-base/package.json b/packages/opentelemetry-context-base/package.json index 58700ecf84..09d6b82ea6 100644 --- a/packages/opentelemetry-context-base/package.json +++ b/packages/opentelemetry-context-base/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/context-base", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry Base Context Manager", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -44,16 +44,14 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.1.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" } } diff --git a/packages/opentelemetry-context-base/src/index.ts b/packages/opentelemetry-context-base/src/index.ts index 25bf328c13..edbc18c622 100644 --- a/packages/opentelemetry-context-base/src/index.ts +++ b/packages/opentelemetry-context-base/src/index.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-context-base/src/version.ts b/packages/opentelemetry-context-base/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-context-base/src/version.ts +++ b/packages/opentelemetry-context-base/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-context-base/tslint.json b/packages/opentelemetry-context-base/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-context-base/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-context-zone-peer-dep/.eslintignore b/packages/opentelemetry-context-zone-peer-dep/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-context-zone-peer-dep/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-context-zone-peer-dep/.eslintrc.js b/packages/opentelemetry-context-zone-peer-dep/.eslintrc.js new file mode 100644 index 0000000000..f21c674001 --- /dev/null +++ b/packages/opentelemetry-context-zone-peer-dep/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + "env": { + "mocha": true, + "browser": true, + "commonjs": true + }, + "globals": { + "Zone": "readonly" + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-context-zone-peer-dep/package.json b/packages/opentelemetry-context-zone-peer-dep/package.json index 328422eaf0..0b6e768f34 100644 --- a/packages/opentelemetry-context-zone-peer-dep/package.json +++ b/packages/opentelemetry-context-zone-peer-dep/package.json @@ -1,13 +1,13 @@ { "name": "@opentelemetry/context-zone-peer-dep", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry Context Zone with peer dependency for zone.js", "main": "build/src/index.js", "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf build/*", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "version:update": "node ../../scripts/version-update.js", @@ -43,36 +43,34 @@ "devDependencies": { "@babel/core": "^7.6.0", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "@types/zone.js": "^0.5.12", "babel-loader": "^8.0.6", "codecov": "^3.6.1", - "gts": "^1.1.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-mocha": "^1.3.0", + "karma-coverage-istanbul-reporter": "^3.0.2", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "^3.6.3", "webpack": "^4.35.2", "webpack-cli": "^3.3.9", "zone.js": "^0.10.2" }, "dependencies": { - "@opentelemetry/context-base": "^0.7.0" + "@opentelemetry/context-base": "^0.8.2" }, "peerDependencies": { "zone.js": "^0.10.2" diff --git a/packages/opentelemetry-context-zone-peer-dep/src/ZoneContextManager.ts b/packages/opentelemetry-context-zone-peer-dep/src/ZoneContextManager.ts index cd388f94b8..c985738ff4 100644 --- a/packages/opentelemetry-context-zone-peer-dep/src/ZoneContextManager.ts +++ b/packages/opentelemetry-context-zone-peer-dep/src/ZoneContextManager.ts @@ -57,7 +57,7 @@ export class ZoneContextManager implements ContextManager { */ private _bindFunction(target: T, context: Context): T { const manager = this; - const contextWrapper = function(this: any, ...args: unknown[]) { + const contextWrapper = function (this: any, ...args: unknown[]) { return manager.with(context, () => target.apply(this, args)); }; Object.defineProperty(contextWrapper, 'length', { @@ -141,7 +141,12 @@ export class ZoneContextManager implements ContextManager { ) { const contextManager = this; - return function(this: {}, event: string, listener: Func, opts?: any) { + return function ( + this: {}, + event: string, + listener: Func, + opts?: any + ) { if (target.__ot_listeners === undefined) { target.__ot_listeners = {}; } @@ -166,7 +171,7 @@ export class ZoneContextManager implements ContextManager { target: TargetWithEvents, original: Function ) { - return function(this: {}, event: string, listener: Func) { + return function (this: {}, event: string, listener: Func) { if ( target.__ot_listeners === undefined || target.__ot_listeners[event] === undefined diff --git a/packages/opentelemetry-context-zone-peer-dep/src/index.ts b/packages/opentelemetry-context-zone-peer-dep/src/index.ts index cee3639760..2c37135209 100644 --- a/packages/opentelemetry-context-zone-peer-dep/src/index.ts +++ b/packages/opentelemetry-context-zone-peer-dep/src/index.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-context-zone-peer-dep/src/version.ts b/packages/opentelemetry-context-zone-peer-dep/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-context-zone-peer-dep/src/version.ts +++ b/packages/opentelemetry-context-zone-peer-dep/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-context-zone-peer-dep/test/utils.test.ts b/packages/opentelemetry-context-zone-peer-dep/test/utils.test.ts index b0b7fab844..66e649e26d 100644 --- a/packages/opentelemetry-context-zone-peer-dep/test/utils.test.ts +++ b/packages/opentelemetry-context-zone-peer-dep/test/utils.test.ts @@ -22,8 +22,8 @@ describe('ZoneContextManager utils', () => { describe('when object contains "addEventListener" and "removeEventListener"', () => { it('should return true', () => { const obj = { - addEventListener: function() {}, - removeEventListener: function() {}, + addEventListener: function () {}, + removeEventListener: function () {}, }; assert.strictEqual(utils.isListenerObject(obj), true); }); @@ -37,7 +37,7 @@ describe('ZoneContextManager utils', () => { describe('when object contains "addEventListener" only', () => { it('should return false', () => { const obj = { - addEventListener: function() {}, + addEventListener: function () {}, }; assert.strictEqual(utils.isListenerObject(obj), false); }); @@ -45,7 +45,7 @@ describe('ZoneContextManager utils', () => { describe('when object contains "removeEventListener" only', () => { it('should return false', () => { const obj = { - removeEventListener: function() {}, + removeEventListener: function () {}, }; assert.strictEqual(utils.isListenerObject(obj), false); }); diff --git a/packages/opentelemetry-context-zone-peer-dep/tslint.json b/packages/opentelemetry-context-zone-peer-dep/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-context-zone-peer-dep/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-context-zone/.eslintignore b/packages/opentelemetry-context-zone/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-context-zone/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-context-zone/.eslintrc.js b/packages/opentelemetry-context-zone/.eslintrc.js new file mode 100644 index 0000000000..c21aa0e358 --- /dev/null +++ b/packages/opentelemetry-context-zone/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "browser": true, + "commonjs": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-context-zone/package.json b/packages/opentelemetry-context-zone/package.json index 7b128655ce..777e8dd2cd 100644 --- a/packages/opentelemetry-context-zone/package.json +++ b/packages/opentelemetry-context-zone/package.json @@ -1,13 +1,13 @@ { "name": "@opentelemetry/context-zone", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry Context Zone", "main": "build/src/index.js", "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf build/*", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -40,33 +40,31 @@ "devDependencies": { "@babel/core": "^7.6.0", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "babel-loader": "^8.0.6", "codecov": "^3.6.1", - "gts": "^1.1.0", - "karma": "^4.1.0", + "gts": "^2.0.0", + "karma": "^5.0.5", "karma-chrome-launcher": "^2.2.0", - "karma-mocha": "^1.3.0", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "^3.6.3", "webpack": "^4.35.2", "webpack-cli": "^3.3.9", "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/context-zone-peer-dep": "^0.7.0", + "@opentelemetry/context-zone-peer-dep": "^0.8.2", "zone.js": "^0.10.2" }, "sideEffects": true diff --git a/packages/opentelemetry-context-zone/src/index.ts b/packages/opentelemetry-context-zone/src/index.ts index cd86de18ab..df2ea15056 100644 --- a/packages/opentelemetry-context-zone/src/index.ts +++ b/packages/opentelemetry-context-zone/src/index.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-context-zone/src/version.ts b/packages/opentelemetry-context-zone/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-context-zone/src/version.ts +++ b/packages/opentelemetry-context-zone/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-context-zone/tslint.json b/packages/opentelemetry-context-zone/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-context-zone/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-core/.eslintignore b/packages/opentelemetry-core/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-core/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-core/.eslintrc.js b/packages/opentelemetry-core/.eslintrc.js new file mode 100644 index 0000000000..9dfe62f9b8 --- /dev/null +++ b/packages/opentelemetry-core/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + "browser": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-core/README.md b/packages/opentelemetry-core/README.md index 491c1041f8..8aa5f23148 100644 --- a/packages/opentelemetry-core/README.md +++ b/packages/opentelemetry-core/README.md @@ -13,6 +13,7 @@ This package provides default implementations of the OpenTelemetry API for trace * [HttpTraceContext Propagator](#httptracecontext-propagator) * [B3 Propagator](#b3-propagator) * [Composite Propagator](#composite-propagator) + * [Correlation Context Propagator](#correlation-context-propagator) - [Built-in Sampler](#built-in-sampler) * [Always Sampler](#always-sampler) * [Never Sampler](#never-sampler) @@ -55,6 +56,17 @@ const { CompositePropagator } = require("@opentelemetry/core"); api.propagation.setGlobalPropagator(new CompositePropagator()); ``` +#### Correlation Context Propagator +Provides a text-based approach to propagate [correlation context](https://w3c.github.io/correlation-context/) to remote services using the [OpenTelemetry CorrelationContext Propagation](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/correlationcontext/api.md#header-name) HTTP headers. + +```js +const api = require("@opentelemetry/api"); +const { HttpCorrelationContext } = require("@opentelemetry/core"); + +/* Set Global Propagator */ +api.propagation.setGlobalPropagator(new HttpCorrelationContext()); +``` + ### Built-in Sampler Sampler is used to make decisions on `Span` sampling. diff --git a/packages/opentelemetry-core/karma.conf.js b/packages/opentelemetry-core/karma.conf.js index 7183aab033..7b8c9678db 100644 --- a/packages/opentelemetry-core/karma.conf.js +++ b/packages/opentelemetry-core/karma.conf.js @@ -1,5 +1,5 @@ /*! - * Copyright 2019, OpenTelemetry Authors + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,6 @@ const karmaBaseConfig = require('../../karma.base'); module.exports = (config) => { config.set(Object.assign({}, karmaBaseConfig, { - webpack: karmaWebpackConfig + webpack: karmaWebpackConfig, })) }; diff --git a/packages/opentelemetry-core/package.json b/packages/opentelemetry-core/package.json index 149e6f2824..138ccdb527 100644 --- a/packages/opentelemetry-core/package.json +++ b/packages/opentelemetry-core/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/core", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry Core provides default and no-op implementations of the OpenTelemetry types for trace and metrics", "main": "build/src/index.js", "browser": { @@ -10,7 +10,7 @@ "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts", + "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts --exclude 'test/platform/browser/**/*.ts'", "test:browser": "nyc karma start --single-run", "tdd": "npm run tdd:node", "tdd:node": "npm run test -- --watch-extensions ts --watch", @@ -18,8 +18,8 @@ "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "compile": "npm run version:update && tsc -p .", "prepare": "npm run compile", @@ -38,7 +38,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": ">=8.5.0" }, "files": [ "build/src/**/*.js", @@ -52,34 +52,32 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/semver": "^6.2.0", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "codecov": "^3.6.1", - "gts": "^1.1.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-mocha": "^1.3.0", + "karma-coverage-istanbul-reporter": "^3.0.2", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2", "webpack": "^4.35.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/context-base": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/context-base": "^0.8.2", "semver": "^7.1.3" } } diff --git a/packages/opentelemetry-core/src/ExportResult.ts b/packages/opentelemetry-core/src/ExportResult.ts index 1306c98b04..75eddbace3 100644 --- a/packages/opentelemetry-core/src/ExportResult.ts +++ b/packages/opentelemetry-core/src/ExportResult.ts @@ -1,4 +1,4 @@ -/*! +/* * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/packages/opentelemetry-core/src/correlation-context/correlation-context.ts b/packages/opentelemetry-core/src/correlation-context/correlation-context.ts new file mode 100644 index 0000000000..08df15bc0a --- /dev/null +++ b/packages/opentelemetry-core/src/correlation-context/correlation-context.ts @@ -0,0 +1,45 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CorrelationContext } from '@opentelemetry/api'; +import { Context } from '@opentelemetry/context-base'; + +const CORRELATION_CONTEXT = Context.createKey( + 'OpenTelemetry Distributed Contexts Key' +); + +/** + * @param {Context} Context that manage all context values + * @returns {CorrelationContext} Extracted correlation context from the context + */ +export function getCorrelationContext( + context: Context +): CorrelationContext | undefined { + return ( + (context.getValue(CORRELATION_CONTEXT) as CorrelationContext) || undefined + ); +} + +/** + * @param {Context} Context that manage all context values + * @param {CorrelationContext} correlation context that will be set in the actual context + */ +export function setCorrelationContext( + context: Context, + correlationContext: CorrelationContext +): Context { + return context.setValue(CORRELATION_CONTEXT, correlationContext); +} diff --git a/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts b/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts new file mode 100644 index 0000000000..0415b7a4bf --- /dev/null +++ b/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts @@ -0,0 +1,119 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Context, + CorrelationContext, + GetterFunction, + HttpTextPropagator, + SetterFunction, +} from '@opentelemetry/api'; +import { + getCorrelationContext, + setCorrelationContext, +} from '../correlation-context'; + +const KEY_PAIR_SEPARATOR = '='; +const PROPERTIES_SEPARATOR = ';'; +const ITEMS_SEPARATOR = ','; + +// Name of the http header used to propagate the correlation context +export const CORRELATION_CONTEXT_HEADER = 'otcorrelations'; +// Maximum number of name-value pairs allowed by w3c spec +export const MAX_NAME_VALUE_PAIRS = 180; +// Maximum number of bytes per a single name-value pair allowed by w3c spec +export const MAX_PER_NAME_VALUE_PAIRS = 4096; +// Maximum total length of all name-value pairs allowed by w3c spec +export const MAX_TOTAL_LENGTH = 8192; +type KeyPair = { + key: string; + value: string; +}; + +/** + * Propagates {@link CorrelationContext} through Context format propagation. + * + * Based on the Correlation Context specification: + * https://w3c.github.io/correlation-context/ + */ +export class HttpCorrelationContext implements HttpTextPropagator { + inject(context: Context, carrier: unknown, setter: SetterFunction) { + const correlationContext = getCorrelationContext(context); + if (!correlationContext) return; + const keyPairs = this._getKeyPairs(correlationContext) + .filter((pair: string) => { + return pair.length <= MAX_PER_NAME_VALUE_PAIRS; + }) + .slice(0, MAX_NAME_VALUE_PAIRS); + const headerValue = this._serializeKeyPairs(keyPairs); + if (headerValue.length > 0) { + setter(carrier, CORRELATION_CONTEXT_HEADER, headerValue); + } + } + + private _serializeKeyPairs(keyPairs: string[]) { + return keyPairs.reduce((hValue: string, current: string) => { + const value = `${hValue}${hValue != '' ? ITEMS_SEPARATOR : ''}${current}`; + return value.length > MAX_TOTAL_LENGTH ? hValue : value; + }, ''); + } + + private _getKeyPairs(correlationContext: CorrelationContext): string[] { + return Object.keys(correlationContext).map( + (key: string) => + `${encodeURIComponent(key)}=${encodeURIComponent( + correlationContext[key].value + )}` + ); + } + + extract(context: Context, carrier: unknown, getter: GetterFunction): Context { + const headerValue: string = getter( + carrier, + CORRELATION_CONTEXT_HEADER + ) as string; + if (!headerValue) return context; + const correlationContext: CorrelationContext = {}; + if (headerValue.length == 0) { + return context; + } + const pairs = headerValue.split(ITEMS_SEPARATOR); + if (pairs.length == 1) return context; + pairs.forEach(entry => { + const keyPair = this._parsePairKeyValue(entry); + if (keyPair) { + correlationContext[keyPair.key] = { value: keyPair.value }; + } + }); + return setCorrelationContext(context, correlationContext); + } + + private _parsePairKeyValue(entry: string): KeyPair | undefined { + const valueProps = entry.split(PROPERTIES_SEPARATOR); + if (valueProps.length <= 0) return; + const keyPairPart = valueProps.shift(); + if (!keyPairPart) return; + const keyPair = keyPairPart.split(KEY_PAIR_SEPARATOR); + if (keyPair.length <= 1) return; + const key = decodeURIComponent(keyPair[0].trim()); + let value = decodeURIComponent(keyPair[1].trim()); + if (valueProps.length > 0) { + value = + value + PROPERTIES_SEPARATOR + valueProps.join(PROPERTIES_SEPARATOR); + } + return { key, value }; + } +} diff --git a/packages/opentelemetry-core/src/index.ts b/packages/opentelemetry-core/src/index.ts index 46f1baf8be..f9266cd2ce 100644 --- a/packages/opentelemetry-core/src/index.ts +++ b/packages/opentelemetry-core/src/index.ts @@ -25,8 +25,9 @@ export * from './context/propagation/B3Propagator'; export * from './context/propagation/composite'; export * from './context/propagation/HttpTraceContext'; export * from './context/propagation/types'; +export * from './correlation-context/correlation-context'; +export * from './correlation-context/propagation/HttpCorrelationContext'; export * from './platform'; -export * from './trace/instrumentation/BasePlugin'; export * from './trace/NoRecordingSpan'; export * from './trace/sampler/ProbabilitySampler'; export * from './trace/spancontext-utils'; diff --git a/packages/opentelemetry-core/src/platform/BaseAbstractPlugin.ts b/packages/opentelemetry-core/src/platform/BaseAbstractPlugin.ts new file mode 100644 index 0000000000..57ec582d2d --- /dev/null +++ b/packages/opentelemetry-core/src/platform/BaseAbstractPlugin.ts @@ -0,0 +1,58 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Tracer, + Plugin, + Logger, + PluginConfig, + TracerProvider, + PluginInternalFiles, +} from '@opentelemetry/api'; + +/** This class represent the base to patch plugin. */ +export abstract class BaseAbstractPlugin implements Plugin { + abstract readonly moduleName: string; // required for internalFilesExports + supportedVersions?: string[]; + readonly version?: string; // required for internalFilesExports + + protected readonly _basedir?: string; // required for internalFilesExports + protected _config!: PluginConfig; + protected _internalFilesExports!: { [module: string]: unknown }; // output for internalFilesExports + protected readonly _internalFilesList?: PluginInternalFiles; // required for internalFilesExports + protected _logger!: Logger; + protected _moduleExports!: T; + protected _tracer!: Tracer; + + constructor( + protected readonly _tracerName: string, + protected readonly _tracerVersion?: string + ) {} + + disable(): void { + this.unpatch(); + } + + abstract enable( + moduleExports: T, + tracerProvider: TracerProvider, + logger: Logger, + config?: PluginConfig + ): T; + + protected abstract patch(): T; + protected abstract unpatch(): void; +} diff --git a/packages/opentelemetry-core/src/platform/browser/BasePlugin.ts b/packages/opentelemetry-core/src/platform/browser/BasePlugin.ts new file mode 100644 index 0000000000..f9b99d05cb --- /dev/null +++ b/packages/opentelemetry-core/src/platform/browser/BasePlugin.ts @@ -0,0 +1,43 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Logger, + Plugin, + PluginConfig, + TracerProvider, +} from '@opentelemetry/api'; +import { BaseAbstractPlugin } from '../BaseAbstractPlugin'; + +/** This class represent the base to patch plugin. */ +export abstract class BasePlugin extends BaseAbstractPlugin + implements Plugin { + enable( + moduleExports: T, + tracerProvider: TracerProvider, + logger: Logger, + config?: PluginConfig + ): T { + this._moduleExports = moduleExports; + this._tracer = tracerProvider.getTracer( + this._tracerName, + this._tracerVersion + ); + this._logger = logger; + if (config) this._config = config; + return this.patch(); + } +} diff --git a/packages/opentelemetry-core/src/platform/browser/index.ts b/packages/opentelemetry-core/src/platform/browser/index.ts index 36164efce5..15f8e3412d 100644 --- a/packages/opentelemetry-core/src/platform/browser/index.ts +++ b/packages/opentelemetry-core/src/platform/browser/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export * from './BasePlugin'; export * from './hex-to-base64'; export * from './id'; export * from './performance'; diff --git a/packages/opentelemetry-core/src/trace/instrumentation/BasePlugin.ts b/packages/opentelemetry-core/src/platform/node/BasePlugin.ts similarity index 83% rename from packages/opentelemetry-core/src/trace/instrumentation/BasePlugin.ts rename to packages/opentelemetry-core/src/platform/node/BasePlugin.ts index 601939df36..df79686802 100644 --- a/packages/opentelemetry-core/src/trace/instrumentation/BasePlugin.ts +++ b/packages/opentelemetry-core/src/platform/node/BasePlugin.ts @@ -15,7 +15,6 @@ */ import { - Tracer, Plugin, Logger, PluginConfig, @@ -25,26 +24,11 @@ import { } from '@opentelemetry/api'; import * as semver from 'semver'; import * as path from 'path'; +import { BaseAbstractPlugin } from '../BaseAbstractPlugin'; /** This class represent the base to patch plugin. */ -export abstract class BasePlugin implements Plugin { - supportedVersions?: string[]; - abstract readonly moduleName: string; // required for internalFilesExports - readonly version?: string; // required for internalFilesExports - protected readonly _basedir?: string; // required for internalFilesExports - - protected _moduleExports!: T; - protected _tracer!: Tracer; - protected _logger!: Logger; - protected _internalFilesExports!: { [module: string]: unknown }; // output for internalFilesExports - protected readonly _internalFilesList?: PluginInternalFiles; // required for internalFilesExports - protected _config!: PluginConfig; - - constructor( - protected readonly _tracerName: string, - protected readonly _tracerVersion?: string - ) {} - +export abstract class BasePlugin extends BaseAbstractPlugin + implements Plugin { enable( moduleExports: T, tracerProvider: TracerProvider, @@ -85,7 +69,7 @@ export abstract class BasePlugin implements Plugin { ); return {}; } - let extraModules: PluginInternalFiles = {}; + const extraModules: PluginInternalFiles = {}; this._logger.debug('loadInternalFiles %o', this._internalFilesList); Object.keys(this._internalFilesList).forEach(versionRange => { this._loadInternalModule(versionRange, extraModules); @@ -147,5 +131,6 @@ export abstract class BasePlugin implements Plugin { } protected abstract patch(): T; + protected abstract unpatch(): void; } diff --git a/packages/opentelemetry-core/src/platform/node/index.ts b/packages/opentelemetry-core/src/platform/node/index.ts index 47a879b04d..71f289fdf5 100644 --- a/packages/opentelemetry-core/src/platform/node/index.ts +++ b/packages/opentelemetry-core/src/platform/node/index.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -export * from './sdk-info'; +export * from './BasePlugin'; export * from './id'; export * from './performance'; +export * from './sdk-info'; export * from './timer-util'; export * from './hex-to-base64'; diff --git a/packages/opentelemetry-core/src/version.ts b/packages/opentelemetry-core/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-core/src/version.ts +++ b/packages/opentelemetry-core/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts b/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts new file mode 100644 index 0000000000..da903819ac --- /dev/null +++ b/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts @@ -0,0 +1,170 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + defaultGetter, + defaultSetter, + CorrelationContext, +} from '@opentelemetry/api'; +import { Context } from '@opentelemetry/context-base'; +import * as assert from 'assert'; +import { + getCorrelationContext, + setCorrelationContext, +} from '../../src/correlation-context/correlation-context'; +import { + HttpCorrelationContext, + CORRELATION_CONTEXT_HEADER, + MAX_PER_NAME_VALUE_PAIRS, +} from '../../src/correlation-context/propagation/HttpCorrelationContext'; + +describe('HttpCorrelationContext', () => { + const httpTraceContext = new HttpCorrelationContext(); + + let carrier: { [key: string]: unknown }; + + beforeEach(() => { + carrier = {}; + }); + + describe('.inject()', () => { + it('should set correlation context header', () => { + const correlationContext: CorrelationContext = { + key1: { value: 'd4cda95b652f4a1592b449d5929fda1b' }, + key3: { value: 'c88815a7-0fa9-4d95-a1f1-cdccce3c5c2a' }, + 'with/slash': { value: 'with spaces' }, + }; + + httpTraceContext.inject( + setCorrelationContext(Context.ROOT_CONTEXT, correlationContext), + carrier, + defaultSetter + ); + assert.deepStrictEqual( + carrier[CORRELATION_CONTEXT_HEADER], + 'key1=d4cda95b652f4a1592b449d5929fda1b,key3=c88815a7-0fa9-4d95-a1f1-cdccce3c5c2a,with%2Fslash=with%20spaces' + ); + }); + + it('should skip long key-value pairs', () => { + const correlationContext: CorrelationContext = { + key1: { value: 'd4cda95b' }, + key3: { value: 'c88815a7' }, + }; + + // Generate long value 2*MAX_PER_NAME_VALUE_PAIRS + const value = '1a'.repeat(MAX_PER_NAME_VALUE_PAIRS); + correlationContext['longPair'] = { value }; + + httpTraceContext.inject( + setCorrelationContext(Context.ROOT_CONTEXT, correlationContext), + carrier, + defaultSetter + ); + assert.deepStrictEqual( + carrier[CORRELATION_CONTEXT_HEADER], + 'key1=d4cda95b,key3=c88815a7' + ); + }); + + it('should skip all keys that surpassed the max limit of the header', () => { + const correlationContext: CorrelationContext = {}; + + const zeroPad = (num: number, places: number) => + String(num).padStart(places, '0'); + + // key=value with same size , 1024 => 8 keys + for (let i = 0; i < 9; ++i) { + const index = zeroPad(i, 510); + correlationContext[`k${index}`] = { value: `${index}` }; + } + + // Build expected + let expected = ''; + for (let i = 0; i < 8; ++i) { + const index = zeroPad(i, 510); + expected += `k${index}=${index},`; + } + expected = expected.slice(0, -1); + + httpTraceContext.inject( + setCorrelationContext(Context.ROOT_CONTEXT, correlationContext), + carrier, + defaultSetter + ); + assert.deepStrictEqual(carrier[CORRELATION_CONTEXT_HEADER], expected); + }); + }); + + describe('.extract()', () => { + it('should extract context of a sampled span from carrier', () => { + carrier[CORRELATION_CONTEXT_HEADER] = + 'key1=d4cda95b,key3=c88815a7, keyn = valn, keym =valm'; + const extractedCorrelationContext = getCorrelationContext( + httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ); + + const expected: CorrelationContext = { + key1: { value: 'd4cda95b' }, + key3: { value: 'c88815a7' }, + keyn: { value: 'valn' }, + keym: { value: 'valm' }, + }; + assert.deepStrictEqual(extractedCorrelationContext, expected); + }); + }); + + it('returns undefined if header is missing', () => { + assert.deepStrictEqual( + getCorrelationContext( + httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ), + undefined + ); + }); + + it('returns keys with their properties', () => { + carrier[CORRELATION_CONTEXT_HEADER] = + 'key1=d4cda95b,key3=c88815a7;prop1=value1'; + const expected: CorrelationContext = { + key1: { value: 'd4cda95b' }, + key3: { value: 'c88815a7;prop1=value1' }, + }; + assert.deepStrictEqual( + getCorrelationContext( + httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ), + expected + ); + }); + + it('should gracefully handle an invalid header', () => { + const testCases: Record = { + invalidNoKeyValuePair: '289371298nekjh2939299283jbk2b', + invalidDoubleEqual: 'key1==value;key2=value2', + invalidWrongKeyValueFormat: 'key1:value;key2=value2', + invalidDoubleSemicolon: 'key1:value;;key2=value2', + }; + Object.getOwnPropertyNames(testCases).forEach(testCase => { + carrier[CORRELATION_CONTEXT_HEADER] = testCases[testCase]; + + const extractedSpanContext = getCorrelationContext( + httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) + ); + assert.deepStrictEqual(extractedSpanContext, undefined, testCase); + }); + }); +}); diff --git a/packages/opentelemetry-core/test/index-webpack.ts b/packages/opentelemetry-core/test/index-webpack.ts index 7731f09091..503a7b71dd 100644 --- a/packages/opentelemetry-core/test/index-webpack.ts +++ b/packages/opentelemetry-core/test/index-webpack.ts @@ -1,5 +1,5 @@ /*! - * Copyright 2019, OpenTelemetry Authors + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,13 @@ // This file is the webpack entry point for the browser Karma tests. It requires // all modules ending in "test" from the current folder and all its subfolders. -const testsContext = require.context('.', true, /test$/); -testsContext.keys().forEach(testsContext); +const testsContextCommon = require.context('.', true, /test$/); +testsContextCommon.keys().forEach(key => { + if (key.indexOf('./platform/BasePlugin.test') >= 0) { + return function () {}; + } + return testsContextCommon(key); +}); const srcContext = require.context('.', true, /src$/); srcContext.keys().forEach(srcContext); diff --git a/packages/opentelemetry-core/test/trace/BasePlugin.test.ts b/packages/opentelemetry-core/test/platform/BasePlugin.test.ts similarity index 91% rename from packages/opentelemetry-core/test/trace/BasePlugin.test.ts rename to packages/opentelemetry-core/test/platform/BasePlugin.test.ts index 643b7562dd..115c07627c 100644 --- a/packages/opentelemetry-core/test/trace/BasePlugin.test.ts +++ b/packages/opentelemetry-core/test/platform/BasePlugin.test.ts @@ -18,15 +18,14 @@ import { NoopTracerProvider } from '@opentelemetry/api'; import * as assert from 'assert'; import * as path from 'path'; import { BasePlugin, NoopLogger } from '../../src'; -import * as types from './fixtures/test-package/foo/bar/internal'; +import * as types from '../trace/fixtures/test-package/foo/bar/internal'; const provider = new NoopTracerProvider(); const logger = new NoopLogger(); - describe('BasePlugin', () => { describe('internalFilesLoader', () => { it('should load internally exported files', () => { - const testPackage = require('./fixtures/test-package'); + const testPackage = require('../trace/fixtures/test-package'); const plugin = new TestPlugin(); assert.doesNotThrow(() => { plugin.enable(testPackage, provider, logger); @@ -81,4 +80,4 @@ class TestPlugin extends BasePlugin<{ [key: string]: Function }> { protected unpatch(): void {} } -const basedir = path.dirname(require.resolve('./fixtures/test-package')); +const basedir = path.dirname(require.resolve('../trace/fixtures/test-package')); diff --git a/packages/opentelemetry-core/test/platform/browser/BasePlugin.test.ts b/packages/opentelemetry-core/test/platform/browser/BasePlugin.test.ts new file mode 100644 index 0000000000..f9e08413ee --- /dev/null +++ b/packages/opentelemetry-core/test/platform/browser/BasePlugin.test.ts @@ -0,0 +1,48 @@ +/** + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NOOP_TRACER, NoopTracerProvider } from '@opentelemetry/api'; +import * as assert from 'assert'; +import { BasePlugin, NoopLogger } from '../../../src'; + +const provider = new NoopTracerProvider(); +const logger = new NoopLogger(); +describe('BasePlugin', () => { + describe('enable', () => { + it('should enable plugin', () => { + const moduleExports = { foo: function () {} }; + const plugin = new TestPlugin('foo', '1'); + const patch = plugin.enable(moduleExports, provider, logger); + + assert.strictEqual(plugin['_tracer'], NOOP_TRACER); + assert.strictEqual(plugin['_tracerName'], 'foo'); + assert.strictEqual(plugin['_tracerVersion'], '1'); + assert.strictEqual(plugin['_logger'], logger); + assert.strictEqual(patch, moduleExports); + }); + }); +}); + +class TestPlugin extends BasePlugin<{ [key: string]: Function }> { + readonly moduleName = 'test-package'; + readonly version = '0.1.0'; + + patch(): { [key: string]: Function } { + return this._moduleExports; + } + + protected unpatch(): void {} +} diff --git a/packages/opentelemetry-core/test/trace/fixtures/test-package/foo/bar/internal.d.ts b/packages/opentelemetry-core/test/trace/fixtures/test-package/foo/bar/internal.d.ts index 2a1f45f2a7..b2944765fa 100644 --- a/packages/opentelemetry-core/test/trace/fixtures/test-package/foo/bar/internal.d.ts +++ b/packages/opentelemetry-core/test/trace/fixtures/test-package/foo/bar/internal.d.ts @@ -1 +1,16 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ export declare function internallyExportedFunction(): boolean; diff --git a/packages/opentelemetry-core/test/utils/wrap.test.ts b/packages/opentelemetry-core/test/utils/wrap.test.ts index 741edc96b2..eb92e0e799 100644 --- a/packages/opentelemetry-core/test/utils/wrap.test.ts +++ b/packages/opentelemetry-core/test/utils/wrap.test.ts @@ -23,7 +23,7 @@ function makeWrapped( unwrap: any, original: any ): ShimWrapped { - const wrapper = function() {}; + const wrapper = function () {}; defineProperty(wrapper, '__wrapped', wrapped); defineProperty(wrapper, '__unwrap', unwrap); defineProperty(wrapper, '__original', original); @@ -31,7 +31,8 @@ function makeWrapped( } function defineProperty(obj: any, name: string, value: unknown) { - var enumerable = !!obj[name] && obj.propertyIsEnumerable(name); + // eslint-disable-next-line no-prototype-builtins + const enumerable = !!obj[name] && obj.propertyIsEnumerable(name); Object.defineProperty(obj, name, { configurable: true, enumerable: enumerable, @@ -44,16 +45,16 @@ const notWrappedFunctions: any[] = []; notWrappedFunctions.push( makeWrapped( false, - function() {}, - function() {} + () => {}, + () => {} ) ); -notWrappedFunctions.push(makeWrapped(false, 'foo', function() {})); -notWrappedFunctions.push(makeWrapped(false, function() {}, 'foo')); +notWrappedFunctions.push(makeWrapped(false, 'foo', () => {})); +notWrappedFunctions.push(makeWrapped(false, () => {}, 'foo')); notWrappedFunctions.push({ __wrapped: true, - __unwrap: function() {}, - __original: function() {}, + __unwrap: function () {}, + __original: function () {}, }); describe('utils-wrap', () => { @@ -61,8 +62,8 @@ describe('utils-wrap', () => { it('should return true when function was wrapped', () => { const wrapped: ShimWrapped = makeWrapped( true, - function() {}, - function() {} + () => {}, + () => {} ); assert.strictEqual(isWrapped(wrapped), true, 'function is not wrapped'); }); diff --git a/packages/opentelemetry-core/tslint.json b/packages/opentelemetry-core/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-core/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-exporter-collector/.eslintignore b/packages/opentelemetry-exporter-collector/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-exporter-collector/.eslintrc.js b/packages/opentelemetry-exporter-collector/.eslintrc.js new file mode 100644 index 0000000000..9dfe62f9b8 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + "browser": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-exporter-collector/README.md b/packages/opentelemetry-exporter-collector/README.md index 6d27c508c1..30ed47caa4 100644 --- a/packages/opentelemetry-exporter-collector/README.md +++ b/packages/opentelemetry-exporter-collector/README.md @@ -49,6 +49,34 @@ provider.register(); ``` +By default, plaintext connection is used. In order to use TLS in Node.js, provide `credentials` option like so: +```js +const fs = require('fs'); +const grpc = require('grpc'); +const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/tracing'); +const { CollectorExporter } = require('@opentelemetry/exporter-collector'); + +const collectorOptions = { + serviceName: 'basic-service', + url: '', // url is optional and can be omitted - default is http://localhost:55678/v1/trace + credentials: grpc.credentials.createSsl( + fs.readFileSync('./ca.crt'), + fs.readFileSync('./client.key'), + fs.readFileSync('./client.crt') + ) +}; + +const provider = new BasicTracerProvider(); +const exporter = new CollectorExporter(collectorOptions); +provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); + +provider.register(); +``` + +To see how to generate credentials, you can refer to the script used to generate certificates for tests [here](./test/certs/regenerate.sh) + +Note, that this will only work if TLS is also configured on the server. + ## Running opentelemetry-collector locally to see the traces 1. Go to examples/basic-tracer-node 2. run `npm run collector:docker:ot` diff --git a/packages/opentelemetry-exporter-collector/package.json b/packages/opentelemetry-exporter-collector/package.json index 27a209fa1a..07cbe3eb42 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.7.0", + "version": "0.8.2", "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", @@ -10,8 +10,8 @@ "./build/src/platform/index.js": "./build/src/platform/browser/index.js" }, "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf build/*", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", @@ -44,6 +44,7 @@ "files": [ "build/src/**/*.js", "build/src/**/*.d.ts", + "build/src/**/*.proto", "doc", "LICENSE", "README.md" @@ -54,29 +55,27 @@ "devDependencies": { "@babel/core": "^7.6.0", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "babel-loader": "^8.0.6", "codecov": "^3.1.0", "cpx": "^1.5.0", - "gts": "^1.0.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-mocha": "^1.3.0", + "karma-coverage-istanbul-reporter": "^3.0.2", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2", "webpack": "^4.35.2", "webpack-cli": "^3.3.9", @@ -84,10 +83,10 @@ }, "dependencies": { "@grpc/proto-loader": "^0.5.3", - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/resources": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/resources": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "google-protobuf": "^3.11.4", "grpc": "^1.24.2" } diff --git a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts b/packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts similarity index 78% rename from packages/opentelemetry-exporter-collector/src/CollectorExporter.ts rename to packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts index 070042b121..1d93318aa4 100644 --- a/packages/opentelemetry-exporter-collector/src/CollectorExporter.ts +++ b/packages/opentelemetry-exporter-collector/src/CollectorExporterBase.ts @@ -1,4 +1,4 @@ -/*! +/* * Copyright 2019, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,16 +14,15 @@ * limitations under the License. */ +import { Attributes, Logger } from '@opentelemetry/api'; import { ExportResult, NoopLogger } from '@opentelemetry/core'; import { ReadableSpan, SpanExporter } from '@opentelemetry/tracing'; -import { Attributes, Logger } from '@opentelemetry/api'; -import { onInit, onShutdown, sendSpans } from './platform/index'; -import { opentelemetryProto } from './types'; +import { opentelemetryProto, CollectorExporterError } from './types'; /** - * Collector Exporter Config + * Collector Exporter base config */ -export interface CollectorExporterConfig { +export interface CollectorExporterConfigBase { hostName?: string; logger?: Logger; serviceName?: string; @@ -35,20 +34,22 @@ const DEFAULT_SERVICE_NAME = 'collector-exporter'; const DEFAULT_COLLECTOR_URL = 'http://localhost:55678/v1/trace'; /** - * Collector Exporter + * Collector Exporter abstract base class */ -export class CollectorExporter implements SpanExporter { - readonly serviceName: string; - readonly url: string; - readonly logger: Logger; - readonly hostName: string | undefined; - readonly attributes?: Attributes; +export abstract class CollectorExporterBase< + T extends CollectorExporterConfigBase +> implements SpanExporter { + public readonly serviceName: string; + public readonly url: string; + public readonly logger: Logger; + public readonly hostName: string | undefined; + public readonly attributes?: Attributes; private _isShutdown: boolean = false; /** * @param config */ - constructor(config: CollectorExporterConfig = {}) { + constructor(config: T = {} as T) { this.serviceName = config.serviceName || DEFAULT_SERVICE_NAME; this.url = config.url || DEFAULT_COLLECTOR_URL; if (typeof config.hostName === 'string') { @@ -62,7 +63,7 @@ export class CollectorExporter implements SpanExporter { this.shutdown = this.shutdown.bind(this); // platform dependent - onInit(this); + this.onInit(config); } /** @@ -105,7 +106,7 @@ export class CollectorExporter implements SpanExporter { this.logger.debug('spans to be sent', spans); // Send spans to [opentelemetry collector]{@link https://github.com/open-telemetry/opentelemetry-collector} // it will use the appropriate transport layer automatically depends on platform - sendSpans(spans, resolve, reject, this); + this.sendSpans(spans, resolve, reject); } catch (e) { reject(e); } @@ -124,6 +125,14 @@ export class CollectorExporter implements SpanExporter { this.logger.debug('shutdown started'); // platform dependent - onShutdown(this); + this.onShutdown(); } + + abstract onShutdown(): void; + abstract onInit(config: T): void; + abstract sendSpans( + spans: ReadableSpan[], + onSuccess: () => void, + onError: (error: CollectorExporterError) => void + ): void; } diff --git a/packages/opentelemetry-exporter-collector/src/index.ts b/packages/opentelemetry-exporter-collector/src/index.ts index df00fee615..1107c4d288 100644 --- a/packages/opentelemetry-exporter-collector/src/index.ts +++ b/packages/opentelemetry-exporter-collector/src/index.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,4 +14,4 @@ * limitations under the License. */ -export * from './CollectorExporter'; +export * from './platform'; diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporter.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporter.ts new file mode 100644 index 0000000000..28cabeb5f0 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/CollectorExporter.ts @@ -0,0 +1,115 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + CollectorExporterBase, + CollectorExporterConfigBase, +} from '../../CollectorExporterBase'; +import { ReadableSpan } from '@opentelemetry/tracing'; +import { toCollectorExportTraceServiceRequest } from '../../transform'; +import * as collectorTypes from '../../types'; + +export type CollectorExporterConfig = CollectorExporterConfigBase; + +/** + * Collector Exporter for Web + */ +export class CollectorExporter extends CollectorExporterBase< + CollectorExporterConfig +> { + onInit(): void { + window.addEventListener('unload', this.shutdown); + } + + onShutdown(): void { + window.removeEventListener('unload', this.shutdown); + } + + sendSpans( + spans: ReadableSpan[], + onSuccess: () => void, + onError: (error: collectorTypes.CollectorExporterError) => void + ) { + const exportTraceServiceRequest = toCollectorExportTraceServiceRequest( + spans, + this + ); + + const body = JSON.stringify(exportTraceServiceRequest); + + if (typeof navigator.sendBeacon === 'function') { + this._sendSpansWithBeacon(body, onSuccess, onError); + } else { + this._sendSpansWithXhr(body, onSuccess, onError); + } + } + + /** + * send spans using browser navigator.sendBeacon + * @param body + * @param onSuccess + * @param onError + */ + private _sendSpansWithBeacon( + body: string, + onSuccess: () => void, + onError: (error: collectorTypes.CollectorExporterError) => void + ) { + if (navigator.sendBeacon(this.url, body)) { + this.logger.debug('sendBeacon - can send', body); + onSuccess(); + } else { + this.logger.error('sendBeacon - cannot send', body); + onError({}); + } + } + + /** + * function to send spans using browser XMLHttpRequest + * used when navigator.sendBeacon is not available + * @param body + * @param onSuccess + * @param onError + */ + private _sendSpansWithXhr( + body: string, + onSuccess: () => void, + onError: (error: collectorTypes.CollectorExporterError) => void + ) { + const xhr = new XMLHttpRequest(); + xhr.open('POST', this.url); + xhr.setRequestHeader(collectorTypes.OT_REQUEST_HEADER, '1'); + xhr.setRequestHeader('Accept', 'application/json'); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.send(body); + + xhr.onreadystatechange = () => { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (xhr.status >= 200 && xhr.status <= 299) { + this.logger.debug('xhr success', body); + onSuccess(); + } else { + this.logger.error('body', body); + this.logger.error('xhr error', xhr); + onError({ + code: xhr.status, + message: xhr.responseText, + }); + } + } + }; + } +} diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/index.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/index.ts index e2ba0ac5a4..df00fee615 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/index.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/browser/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export * from './sendSpans'; +export * from './CollectorExporter'; diff --git a/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts deleted file mode 100644 index a718cf17d4..0000000000 --- a/packages/opentelemetry-exporter-collector/src/platform/browser/sendSpans.ts +++ /dev/null @@ -1,141 +0,0 @@ -/*! - * Copyright 2020, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Logger } from '@opentelemetry/api'; -import { ReadableSpan } from '@opentelemetry/tracing'; -import { CollectorExporter } from '../../CollectorExporter'; -import { toCollectorExportTraceServiceRequest } from '../../transform'; -import * as collectorTypes from '../../types'; - -/** - * function that is called once when {@link ExporterCollector} is initialised - * @param collectorExporter CollectorExporter {@link ExporterCollector} - */ -export function onInit(collectorExporter: CollectorExporter) { - window.addEventListener('unload', collectorExporter.shutdown); -} - -/** - * function to be called once when {@link ExporterCollector} is shutdown - * @param collectorExporter CollectorExporter {@link ExporterCollector} - */ -export function onShutdown(collectorExporter: CollectorExporter) { - window.removeEventListener('unload', collectorExporter.shutdown); -} - -/** - * function to send spans to the [opentelemetry collector]{@link https://github.com/open-telemetry/opentelemetry-collector} - * using the standard http/https node module - * @param spans - * @param onSuccess - * @param onError - * @param collectorExporter - */ -export function sendSpans( - spans: ReadableSpan[], - onSuccess: () => void, - onError: (error: collectorTypes.CollectorExporterError) => void, - collectorExporter: CollectorExporter -) { - const exportTraceServiceRequest = toCollectorExportTraceServiceRequest( - spans, - collectorExporter - ); - - const body = JSON.stringify(exportTraceServiceRequest); - - if (typeof navigator.sendBeacon === 'function') { - sendSpansWithBeacon( - body, - onSuccess, - onError, - collectorExporter.logger, - collectorExporter.url - ); - } else { - sendSpansWithXhr( - body, - onSuccess, - onError, - collectorExporter.logger, - collectorExporter.url - ); - } -} - -/** - * function to send spans using browser navigator.sendBeacon - * @param body - * @param onSuccess - * @param onError - * @param logger - * @param collectorUrl - */ -function sendSpansWithBeacon( - body: string, - onSuccess: () => void, - onError: (error: collectorTypes.CollectorExporterError) => void, - logger: Logger, - collectorUrl: string -) { - if (navigator.sendBeacon(collectorUrl, body)) { - logger.debug('sendBeacon - can send', body); - onSuccess(); - } else { - logger.error('sendBeacon - cannot send', body); - onError({}); - } -} - -/** - * function to send spans using browser XMLHttpRequest - * used when navigator.sendBeacon is not available - * @param body - * @param onSuccess - * @param onError - * @param logger - * @param collectorUrl - */ -function sendSpansWithXhr( - body: string, - onSuccess: () => void, - onError: (error: collectorTypes.CollectorExporterError) => void, - logger: Logger, - collectorUrl: string -) { - const xhr = new XMLHttpRequest(); - xhr.open('POST', collectorUrl); - xhr.setRequestHeader(collectorTypes.OT_REQUEST_HEADER, '1'); - xhr.setRequestHeader('Accept', 'application/json'); - xhr.setRequestHeader('Content-Type', 'application/json'); - xhr.send(body); - - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - if (xhr.status >= 200 && xhr.status <= 299) { - logger.debug('xhr success', body); - onSuccess(); - } else { - logger.error('body', body); - logger.error('xhr error', xhr); - onError({ - code: xhr.status, - message: xhr.responseText, - }); - } - } - }; -} diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporter.ts b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporter.ts new file mode 100644 index 0000000000..639d373685 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/src/platform/node/CollectorExporter.ts @@ -0,0 +1,138 @@ +/*! + * Copyright 2019, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as protoLoader from '@grpc/proto-loader'; +import * as grpc from 'grpc'; +import * as path from 'path'; +import * as collectorTypes from '../../types'; + +import { ReadableSpan } from '@opentelemetry/tracing'; +import { + CollectorExporterBase, + CollectorExporterConfigBase, +} from '../../CollectorExporterBase'; +import { CollectorExporterError } from '../../types'; +import { toCollectorExportTraceServiceRequest } from '../../transform'; +import { GRPCQueueItem, TraceServiceClient } from './types'; +import { removeProtocol } from './util'; + +/** + * Collector Exporter Config for Node + */ +export interface CollectorExporterConfig extends CollectorExporterConfigBase { + credentials?: grpc.ChannelCredentials; +} + +/** + * Collector Exporter for Node + */ +export class CollectorExporter extends CollectorExporterBase< + CollectorExporterConfig +> { + isShutDown: boolean = false; + traceServiceClient?: TraceServiceClient = undefined; + grpcSpansQueue: GRPCQueueItem[] = []; + + /** + * @param config + */ + constructor(config: CollectorExporterConfig = {}) { + super(config); + } + + onShutdown(): void { + this.isShutDown = true; + if (this.traceServiceClient) { + this.traceServiceClient.close(); + } + } + + onInit(config: CollectorExporterConfig): void { + this.isShutDown = false; + this.grpcSpansQueue = []; + const serverAddress = removeProtocol(this.url); + const credentials: grpc.ChannelCredentials = + config.credentials || grpc.credentials.createInsecure(); + + const traceServiceProtoPath = + 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; + const includeDirs = [path.resolve(__dirname, 'protos')]; + + protoLoader + .load(traceServiceProtoPath, { + keepCase: false, + longs: String, + enums: String, + defaults: true, + oneofs: true, + includeDirs, + }) + .then(packageDefinition => { + const packageObject: any = grpc.loadPackageDefinition( + packageDefinition + ); + this.traceServiceClient = new packageObject.opentelemetry.proto.collector.trace.v1.TraceService( + serverAddress, + credentials + ); + if (this.grpcSpansQueue.length > 0) { + const queue = this.grpcSpansQueue.splice(0); + queue.forEach((item: GRPCQueueItem) => { + this.sendSpans(item.spans, item.onSuccess, item.onError); + }); + } + }); + } + + sendSpans( + spans: ReadableSpan[], + onSuccess: () => void, + onError: (error: CollectorExporterError) => void + ): void { + if (this.isShutDown) { + return; + } + if (this.traceServiceClient) { + const exportTraceServiceRequest = toCollectorExportTraceServiceRequest( + spans, + this + ); + + this.traceServiceClient.export( + exportTraceServiceRequest, + ( + err: collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceError + ) => { + if (err) { + this.logger.error( + 'exportTraceServiceRequest', + exportTraceServiceRequest + ); + onError(err); + } else { + onSuccess(); + } + } + ); + } else { + this.grpcSpansQueue.push({ + spans, + onSuccess, + onError, + }); + } + } +} diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/index.ts b/packages/opentelemetry-exporter-collector/src/platform/node/index.ts index e2ba0ac5a4..df00fee615 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/index.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export * from './sendSpans'; +export * from './CollectorExporter'; diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts b/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts deleted file mode 100644 index 5b7c9035b7..0000000000 --- a/packages/opentelemetry-exporter-collector/src/platform/node/sendSpans.ts +++ /dev/null @@ -1,145 +0,0 @@ -/*! - * Copyright 2019, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as protoLoader from '@grpc/proto-loader'; -import { ReadableSpan } from '@opentelemetry/tracing'; -import * as grpc from 'grpc'; -import * as path from 'path'; - -import { CollectorExporter } from '../../CollectorExporter'; -import * as collectorTypes from '../../types'; -import { toCollectorExportTraceServiceRequest } from '../../transform'; -import { CollectorData, GRPCQueueItem } from './types'; -import { removeProtocol } from './util'; - -const traceServiceClients: WeakMap< - CollectorExporter, - CollectorData -> = new WeakMap(); - -/** - * function that is called once when {@link ExporterCollector} is initialised - * @param collectorExporter CollectorExporter {@link ExporterCollector} - */ -export function onInit(collectorExporter: CollectorExporter) { - traceServiceClients.set(collectorExporter, { - isShutDown: false, - grpcSpansQueue: [], - }); - const serverAddress = removeProtocol(collectorExporter.url); - const credentials: grpc.ChannelCredentials = grpc.credentials.createInsecure(); - - const traceServiceProtoPath = - 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; - const includeDirs = [path.resolve(__dirname, 'protos')]; - - protoLoader - .load(traceServiceProtoPath, { - keepCase: false, - longs: String, - enums: String, - defaults: true, - oneofs: true, - includeDirs, - }) - .then(packageDefinition => { - const packageObject: any = grpc.loadPackageDefinition(packageDefinition); - const exporter = traceServiceClients.get(collectorExporter); - if (!exporter) { - return; - } - exporter.traceServiceClient = new packageObject.opentelemetry.proto.collector.trace.v1.TraceService( - serverAddress, - credentials - ); - if (exporter.grpcSpansQueue.length > 0) { - const queue = exporter.grpcSpansQueue.splice(0); - queue.forEach((item: GRPCQueueItem) => { - sendSpans( - item.spans, - item.onSuccess, - item.onError, - collectorExporter - ); - }); - } - }); -} - -/** - * function to be called once when {@link ExporterCollector} is shutdown - * @param collectorExporter CollectorExporter {@link ExporterCollector} - */ -export function onShutdown(collectorExporter: CollectorExporter) { - const exporter = traceServiceClients.get(collectorExporter); - if (!exporter) { - return; - } - exporter.isShutDown = true; - - if (exporter.traceServiceClient) { - exporter.traceServiceClient.close(); - } -} - -/** - * function to send spans to the [opentelemetry collector]{@link https://github.com/open-telemetry/opentelemetry-collector} - * using the standard http/https node module - * @param spans - * @param onSuccess - * @param onError - * @param collectorExporter - */ -export function sendSpans( - spans: ReadableSpan[], - onSuccess: () => void, - onError: (error: collectorTypes.CollectorExporterError) => void, - collectorExporter: CollectorExporter -) { - const exporter = traceServiceClients.get(collectorExporter); - if (!exporter || exporter.isShutDown) { - return; - } - if (exporter.traceServiceClient) { - const exportTraceServiceRequest = toCollectorExportTraceServiceRequest( - spans, - collectorExporter - ); - - exporter.traceServiceClient.export( - exportTraceServiceRequest, - ( - err: collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceError - ) => { - if (err) { - collectorExporter.logger.error( - 'exportTraceServiceRequest', - exportTraceServiceRequest - ); - onError(err); - } else { - onSuccess(); - } - } - ); - } else { - exporter.grpcSpansQueue.push({ - spans, - onSuccess, - onError, - }); - } -} diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/types.ts b/packages/opentelemetry-exporter-collector/src/platform/node/types.ts index 8a7786038a..b36b9a65ad 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/types.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/types.ts @@ -34,12 +34,3 @@ export interface GRPCQueueItem { export interface TraceServiceClient extends grpc.Client { export: (request: any, callback: Function) => {}; } - -/** - * Interface to store helper information - */ -export interface CollectorData { - traceServiceClient?: TraceServiceClient; - isShutDown: boolean; - grpcSpansQueue: GRPCQueueItem[]; -} diff --git a/packages/opentelemetry-exporter-collector/src/platform/node/util.ts b/packages/opentelemetry-exporter-collector/src/platform/node/util.ts index ccc4fb8205..0aef79ba1c 100644 --- a/packages/opentelemetry-exporter-collector/src/platform/node/util.ts +++ b/packages/opentelemetry-exporter-collector/src/platform/node/util.ts @@ -20,5 +20,5 @@ * @param url */ export function removeProtocol(url: string): string { - return url.replace(/^https?\:\/\//, ''); + return url.replace(/^https?:\/\//, ''); } diff --git a/packages/opentelemetry-exporter-collector/src/transform.ts b/packages/opentelemetry-exporter-collector/src/transform.ts index 3f67635ce6..0d945fe979 100644 --- a/packages/opentelemetry-exporter-collector/src/transform.ts +++ b/packages/opentelemetry-exporter-collector/src/transform.ts @@ -1,4 +1,4 @@ -/*! +/* * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,10 @@ import { import * as core from '@opentelemetry/core'; import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from '@opentelemetry/tracing'; -import { CollectorExporter } from './CollectorExporter'; +import { + CollectorExporterBase, + CollectorExporterConfigBase, +} from './CollectorExporterBase'; import { COLLETOR_SPAN_KIND_MAPPING, opentelemetryProto } from './types'; import ValueType = opentelemetryProto.common.v1.ValueType; @@ -189,13 +192,15 @@ export function toCollectorTraceState( /** * Prepares trace service request to be sent to collector * @param spans spans - * @param collectorExporter + * @param collectorExporterBase * @param [name] Instrumentation Library Name */ -export function toCollectorExportTraceServiceRequest( +export function toCollectorExportTraceServiceRequest< + T extends CollectorExporterConfigBase +>( spans: ReadableSpan[], - collectorExporter: CollectorExporter, - name: string = '' + collectorExporterBase: CollectorExporterBase, + name = '' ): opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest { const spansToBeSent: opentelemetryProto.trace.v1.Span[] = spans.map(span => toCollectorSpan(span) @@ -205,9 +210,9 @@ export function toCollectorExportTraceServiceRequest( const additionalAttributes = Object.assign( {}, - collectorExporter.attributes || {}, + collectorExporterBase.attributes || {}, { - 'service.name': collectorExporter.serviceName, + 'service.name': collectorExporterBase.serviceName, } ); const protoResource: opentelemetryProto.resource.v1.Resource = toCollectorResource( diff --git a/packages/opentelemetry-exporter-collector/src/types.ts b/packages/opentelemetry-exporter-collector/src/types.ts index 99eacdd0cf..81a6b908ea 100644 --- a/packages/opentelemetry-exporter-collector/src/types.ts +++ b/packages/opentelemetry-exporter-collector/src/types.ts @@ -20,6 +20,7 @@ import * as api from '@opentelemetry/api'; // header to prevent instrumentation on request export const OT_REQUEST_HEADER = 'x-opentelemetry-outgoing-request'; +/* eslint-disable @typescript-eslint/no-namespace */ export namespace opentelemetryProto { export namespace collector { export namespace trace.v1 { @@ -31,8 +32,6 @@ export namespace opentelemetryProto { resourceSpans: opentelemetryProto.trace.v1.ResourceSpans[]; } - export interface ExportTraceServiceResponse {} - export interface ExportTraceServiceError { code: number; details: string; @@ -125,7 +124,7 @@ export namespace opentelemetryProto { status?: Status; } - export interface Status extends api.Status {} + export type Status = api.Status; export interface TraceConfig { constantSampler?: ConstantSampler | null; diff --git a/packages/opentelemetry-exporter-collector/src/version.ts b/packages/opentelemetry-exporter-collector/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-exporter-collector/src/version.ts +++ b/packages/opentelemetry-exporter-collector/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-exporter-collector/test/browser/CollectorExporter.test.ts b/packages/opentelemetry-exporter-collector/test/browser/CollectorExporter.test.ts index d17551c866..539997b8f2 100644 --- a/packages/opentelemetry-exporter-collector/test/browser/CollectorExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/browser/CollectorExporter.test.ts @@ -21,7 +21,7 @@ import * as sinon from 'sinon'; import { CollectorExporter, CollectorExporterConfig, -} from '../../src/CollectorExporter'; +} from '../../src/platform/browser/index'; import * as collectorTypes from '../../src/types'; import { @@ -66,7 +66,7 @@ describe('CollectorExporter - web', () => { describe('export', () => { describe('when "sendBeacon" is available', () => { it('should successfully send the spans using sendBeacon', done => { - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const args = spyBeacon.args[0]; @@ -106,7 +106,7 @@ describe('CollectorExporter - web', () => { spyBeacon.restore(); spyBeacon = sinon.stub(window.navigator, 'sendBeacon').returns(true); - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const response: any = spyLoggerDebug.args[1][0]; @@ -123,7 +123,7 @@ describe('CollectorExporter - web', () => { spyBeacon.restore(); spyBeacon = sinon.stub(window.navigator, 'sendBeacon').returns(false); - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const response: any = spyLoggerError.args[0][0]; @@ -138,8 +138,7 @@ describe('CollectorExporter - web', () => { describe('when "sendBeacon" is NOT available', () => { let server: any; beforeEach(() => { - // @ts-ignore - window.navigator.sendBeacon = false; + (window.navigator as any).sendBeacon = false; server = sinon.fakeServer.create(); }); afterEach(() => { @@ -147,7 +146,7 @@ describe('CollectorExporter - web', () => { }); it('should successfully send the spans using XMLHttpRequest', done => { - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const request = server.requests[0]; @@ -184,7 +183,7 @@ describe('CollectorExporter - web', () => { const spyLoggerDebug = sinon.stub(collectorExporter.logger, 'debug'); const spyLoggerError = sinon.stub(collectorExporter.logger, 'error'); - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const request = server.requests[0]; @@ -202,7 +201,7 @@ describe('CollectorExporter - web', () => { it('should log the error message', done => { const spyLoggerError = sinon.stub(collectorExporter.logger, 'error'); - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const request = server.requests[0]; diff --git a/packages/opentelemetry-exporter-collector/test/certs/ca.crt b/packages/opentelemetry-exporter-collector/test/certs/ca.crt new file mode 100644 index 0000000000..455c498aa2 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/ca.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPjCCAyYCCQDSzsM0Ou9GwDANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJD +TDELMAkGA1UECAwCUk0xGjAYBgNVBAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYD +VQQKDARSb290MQ0wCwYDVQQLDARUZXN0MQswCQYDVQQDDAJjYTAeFw0yMDA1MTUx +NTQ0MzVaFw0yMTA1MTUxNTQ0MzVaMGExCzAJBgNVBAYTAkNMMQswCQYDVQQIDAJS +TTEaMBgGA1UEBwwRT3BlblRlbGVtZXRyeVRlc3QxDTALBgNVBAoMBFJvb3QxDTAL +BgNVBAsMBFRlc3QxCzAJBgNVBAMMAmNhMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAs1AVbpZ642HATrkqW0WpzsOAne677zDftkvIhWcto3x+nwP6kSOE +vHtPR7xem9Yl5LUy1aDpd0WnBSke1JIYdJCAmmlitFVShrpolGRb9MqYJPXp5FfH +OFltziG00/MSKwNv7GiwN3ehyvzfS9L46mCcUWnQLJkjkThvlV0JRCfaTBRF3m8M +fKYvQ71G/9ZwbRvRqPCk8CZmzhqKLvRFBmzM2FGj0CY5fFqPcBRM08MWNkxAR/4B +IGKTaz5qzaFEvxHgQMQaXOQZYeNwiCFBoGygOId96x8GX9AT1PwW2ltMU3rNtVCf +9xu3JUREHjkIReNqM9h1qq5YIfrEQYeM1Q5Kyr3+Bpj6EhZqGmfc37z/nootxG3z +VmYZ4+z0zx24s117J7CfD2OLL2OaLyWheXXYqB0gOgoTwwwTsB5DYOv15fjsqs3F +kuYR/hbxs1GQO9RcOmlvynIleiVkm1x+UmOuIltfMjolBPc7ZKKxjlAxbC4oY7Za +3th3UkDIVFJmWsJhj+z87qLq0EW4m5UYV3uIUDN4P6Pko3iTqKG2qUtnnhrlbvhd +/YfSCWJRMSlgCfKFuhGkiVDEpJhza5LxNeM2EYD/PIydotyASw2Btp+VowC6yDJV +yR2cTVEGeYxQXpOI0wqJT8DrhWsdAqioLtaFxNJkdTKWAbfC8MP5wp8CAwEAATAN +BgkqhkiG9w0BAQsFAAOCAgEAP7u8IlEOTBrL3OISH9vUqFbiRdTzPfpFJ2ZVxM3H +C4iLdndKVmJLRJyMeGhD/kEnTMmHrt/mZTw6tI87+PE1ZMqSe4+q2NlHz0BouiQa +ukGj+OzZ4gw+IlDfyiXtsggCb1dRZldGoddiP8ldP0ohvR7nErG0RrRuBp860yPD +qBzItTzpC4dNVBbOBf+m9T914dsznFKlyU+QSVA2TXpJnmfEKCwlyk2gVH9olQlG +ND4cBdnOnarV5eflIj+LXjZh2wt/F0qLpTmUmxEyCc1M1il+hC6hnbarzin+8Cxu +VqjKzG7KcLxlWx9wj6ruBA1kPL0Jx31c8wDJ8b7HtsDzehcwrKKnZwA3qs3r417c +n7Dddbix9Gxxi2MTY83Q3MKbVj+oKxz0wZxa29fvlf3Gv98wzSMcS2cK+bjQwwuJ +WQxH9KksKU6g1Dv3fVz2E5CP9gwHaQBVBNSKxlqQsB2nhNglpigmglCKrfX07c7x +ryzoDE1E7tYguyWa4W+LFJ85EirUkGIBL7IoGCsol/elF6noGiuaNMO3KsWmp/C6 +YsXQJPWrnep93CCZdZ7bY6L6BTPdz1RaXMh8Rc65MlIlTzxPnhFTYrXz/FlK2uv7 +lPvT0+cGOvuiN26vqfKnrid1I2theKhKDWSdv3Rshg0ZJatNWS0u8gTE4f+qCjHP +9CI= +-----END CERTIFICATE----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/ca.key b/packages/opentelemetry-exporter-collector/test/certs/ca.key new file mode 100644 index 0000000000..e8b01e04ea --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/ca.key @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,C088BF4BACFE1D5E + +TKzb0xd1SS8So+VGtAOqj7XhYJNaTSl7HrF5UXoL835lzU6qIdgJWp8REOATdYTP +wqL5x3OlRy/X9GUtXApQx4OoCy1hOMXB10/T1nD+EuxBf4ChEtRow1synEfOVlX8 +JZvRHuvN1AGnOzn8YpCnZ19ufw9ASX1cOFjefJKiR8vi32/LEO5No2jqODTWK3V2 +ijiV01hDkbiWvIoxcLQRXm+F2TAZ7MYz/DEjtbAr+4vCDMobJicWHim6yHpor/B0 +7bBVEsR0/R7kb+fLtv9cBDUqu40m7LfuMFtJDD5deRce2hSs+rm9nO01qvo5KvR5 +XA9WdKdFjk3WKjE0uAhRCzXXvRO1S9i6Ym0E3zoW6zcXItQUo30BhBgn4DALMMw/ +aLAsq0trmXqTiJCq8QDYgQOj59jwVxMuAsvinhqBI8koy92hBiXAhZd0r2+2jm/b +yqELuX+0b+FW0hSRL/BsXaTXrzW9cSpSM+EsCtoZloNecGGKNUIhVF6+LmALQ5xD +5dwIIooQTpNzLpc55rK6C01VWQLRWClJdbASdYD5hmY/0KNq/LB7F4TY9DjnJnWx +Lrkalyl8lv1oZHjPUqA8NAY+Rf+Ps6BxxP2ShAfVwybVFh0ACh5stWpAbmWId86p +vnf4gW2y5g4p9HNK/+XuFJ4PQj4/SJNRrc7HvwlCnAg1lXRYtt2C2awbKPzBU7bw +4sqOKlIOSeox6x3APcO+nTuYZf2XJ9s/jtlPqPgGBaaWB6IANiMBwi2LnVCjxaL5 +tjiBQlwcYSla7YPz7AAuRYcv2zPJVSk8pZqObBZO+1JN/BJf0LUqW4fOKSwud8gG +rDHp5YS/+MOnygvuyooqdFoFwS6/fKzdLKz5Ug0ZsIPEVdd0gQUrNReATptmRuxJ +/dA58RLpsosCz2iMkYxEJ75acmPsZU6DZCHrI/WwDR6xOVN+3YttpEoGXa16D7Hk +Pa+tmObX3aK+iAQBoSsiztxaBYRNc+QbpKl1/qU86+2m8yXnsbKDXk3WnFVMBCw2 +VbdgD7Rx72sYhzn2VPGmoRkOn/yOkhful7R/tNTK040FuBQaFWer5yDsUlWIoYgd +wnTdSdXisib4rfq/t50xfCGS67eyaH/CMbAni/x+eikDFAA3/OLMM+46hZaoZHqP +sOcbcD+JUIwo00xW2Xv2gF8NT4mcdVphRs9u1pcoyZCQm4OuE4qfJhYH2k48imCC +yfQVgr/fitMm9/oNcEkCuGI5iNm0f88dIKZSuAaxBQ9AXxRjgGVxjdasTcFwkMMo +ahgasfOXq53HoPgX7UOB9V4DdtzwwUg2cS3G0aC8Z2botQ7JlA87QvHddLPrFE3r +ybHIgxOOhabCNpO0ER0xaaS6dKhq/oEuh4owPm7fnfx6lYVmxELJoyuGvGJjlDjk +Zks4Du6Ew6KuZRbGJQOod+FAT1uCIOt83Vslp+3rURe9NmUmU6xHSOnb3La3pLco +upb7x8ufsE8y143uyiqDAyF7MluCl/Cc0rO7BPOu/QsXUcm+oE/b+WLCfDkWETHp +6UK6bW9gi3iohm1S5ViLLSQGcXF62rkP0PQMZpxemQdsKJaynjUmtY13h65L8GRh +4Btxb3/fZgsBDT8us5SP1qSNFsygJwKuRGLaGqrbx+o/deA7kSwX/UFrAemAkysE +1WuFvGlrhTUXcYmjKGbP+78IyPuhcG+lxp1QZXpdIv9Bos2m475we1gSAi2qOF02 +2op60zNo8ZsBRSI/QKtojfG+0SlCNO7owzu+j6PH+7rHpSL1DaPK9C1xwxQCsRaO +MIU+ELIWboJK3lNChQ11mnyMjoIMsfR9fP7Cmr4FuvCHYQbCFERLOzJ6FU7974+b +ul6VAsbvsutLRziQ3LN+QdQRsrrvq9YU0CgB8jLUHf137x4Goegb3cxlDjwzpGkt +R3HM1KAbxcbyziQz2NuSZK5Jfg/OO+C6o5HN2j3IfhQyM1PZ7MsO6sEaRWBxgC99 +xjXYUyDRt2Ho1mFmRtdXjmeGExz3QBQ7X66swHwMcBov6uL9x060VXfzFB6Gbn6O +2UabP4eriWuGUSk/fVBg3jqe+iMMM4z++mScmCqWUnp6lzUSzhsCyZ6a/11zsyvF +Lq8GDu+4rCFzj8/jgE3rqPHGPM7cgn8kv7IC1cOMDMWmELPZW38bxbPYPbNiNgtv +Cq0OjCCSyB307gC2VjwbXyN7AAT0mul7BhQOxU/qIqRoGKUGuQLWIp42Fe0TAe8x +Im1baX8SV35KagGLvcBlw1uwA6olzo4WyxH2SyVEfYxBqek7DmZ8LUwH7s+Xs2+M +svr++dv3drLOdz75Wj7N6KiK0KDxv5EHLiP3YD8/UqP3GzMDv+yj3lpVOcE40kEo +HWhlv7X7fZWUCV9iiRSKWzYBhps0LWjJ4ryB/5wU5X/iSTLyP9cYPKiQIFyaWDK6 +POcYrgNN62e32PScENlwy+YuL4xuaa3KnOTS4e4emjzdH576y213D+n7bpFVOvi0 +JEm8qJJ7PgrwnuGcnNjIfIJNDrLqXDYJWn0K59Pjfd0i3VRhOiNFzcIRnNePR//h +lwBlhy0+XpUvxNEt9Ju+xaaSxg16cyKlz6lz8P+4TGuw8cgXdSXcZw6w+RDdmiv/ +NkVUPEwtMh3+H6L4Lfy9h0HA0bnpnOdgbfeTbHHv5/ViJd7cAjF4Z7PTEpC8nT++ +RTqp4q1upJjb5vk2IkrvhPAO/ZjK01ijSx/sieYoSxp2+vme/4yYloD3IjoUR3SB +0DOv5ATQUNABKAOkZkkpeA0IRuPdbLqpd4FQLYi08oJbOEiVkCUzmBwxbvCAkN83 +KCey8TP/OXVg9+lsh5UgaVPNZmNWGabHIsAnp4TszQZWsxAywOvBSWAb+Z8GOCTP +8T24RYphijZALkXzssYeCZ6qOl/V6YKa7dkIrWAyVRsZKQYH73HzJr7qR0N84eXu +4yyi8rb31d/6Gl+ZyvvDMeQBOFlKtHRx01VG/jLlq2qBuv4lY+UFFDpV2l7F4rVV +IwAuU/pYcuJ97bocLvrdCZJIdszlNgGHpKcBn4MWT+lcod/iBsloXy6J6kluaXBu +q8Ub9zwiF/aKM29CcBRnIHMIVSZ5FY9/Zbu8EhnZjTe7NUNNWi9uV0Arht5S/3RS +-----END RSA PRIVATE KEY----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/client.crt b/packages/opentelemetry-exporter-collector/test/certs/client.crt new file mode 100644 index 0000000000..9534695d80 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/client.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjAwNTE1MTU0NDM3WhcN +MjEwNTE1MTU0NDM3WjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZD +bGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMm4t0aiZqouBsW/VilH/McgrMECz6RYMnAxAZVG0AwvlzZPMc46 +Vpbggpsn5j/N/teragpiqIwIIN+1apGXGmAg4IDgyrswq37Oj4JrvmzXWK1PGGFs +YpWISmNR1DKkEL8ts41KDEZejsItFYctnvIctRYPoYB+6No2iddj5gioHyq/yDLN +zD0c0C3r9tXm+Ed9BO4pgu6Rl6zuPf3sttE5eNa/O6qV1dD3nxnpPS3fIbXqKviD ++xhgXrfLM43X0QBQt6sPFuunpcvhWDsgtWMQ6EShQUhb0DXr6PgGXj/1Vl3nVsxP +4gnCOE5x13jzw/tqijbKin2+dpEGdi+c0QeVfDWoMZA9mlitZiLsenKdB8sYaoCw +QZHu3zzfXruMqA6x6DyLPa6PEFzw4v5PAvsd4Re0cLTBDsw1Fdx/eGzBg7k1KCFZ +HA3RdzNqCMvxcumH7hUg1n0cEtHX/bVSdpndK7iWVPbDYv98bFNOq8fZzsoqZgOk +Jl4TJyil/oPDkzowc8F8+p4vWdgHevjkqk5rtyMLBb6KnUmJgYPef7FuZ97oSi+r +TrAUs595+RZefDRdu5MGV/2NMbpN992Yewg7LTiP+gwNuYBDQmEYyQf0sxMNcwXc +ZVrWw+RdI8udSFowmOd/g0NNz3CaAXX8n6BLMJBBxRx0zet/88VFtLNrAgMBAAEw +DQYJKoZIhvcNAQEFBQADggIBADfQTBf/n+r+E6/GH3kyiI4jg0vIlkOlABsypKvY +iPXGTrtTlFB4s18/f0I416ez1U129OYyE2mUHKDKAUHu/Qf3Cl5N983DCx7czVJZ +Maxafe7DS5rAwF1wpfxR6u4Ti0gK0HO29bsCDah5C5+s4Vzv5t6AFmyg+ESQG6cM +vbkIs5nbcU1ydMdfvSb3vmjvPLh41lWnRVkkbjgzTS312EnHmqV3wIx12UAb16J4 +zXOjI+7JU9TZRnTEf3xOyByA5h8pCYha3nOlETR+vRN1byUYesCWsgj0wFU1u6K6 +AqSMU4sqtNIIlwN50CPLvYjB3FBPh8DpB5iQ4GxM636X06dQqQF7n4cWMOMHRlT1 +DgafEpVdxSeJMzuBQHJzF0UbyaAwKkDKGuAZWfihlNEUMdVm4EvKpE82cevM/2Mo +VEuPlcmf+D0ERu6bK5RAjXkH+cxYWXJGRtx823IEEgXOk0F4AMCaMiuNHI7buBi7 +AnBvIUv67b6FRS6Hw8sMDNvVTpavsnUKwSJJUATPU+rRIgD3Dl7SJ9XqmFdgPO+E +eRxvCCZvzEL77SLslv6CkKLseNQQ7MrOgTotYOrHA/AwF1GtFSDoYTRifKGynRPO +Vg3CscBOkIz9Plmy6dq8CEIygdmcN2Bb8BwA97q1epU4vzmx7fhqLLyMq+YztPRp +6SLz +-----END CERTIFICATE----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/client.csr b/packages/opentelemetry-exporter-collector/test/certs/client.csr new file mode 100644 index 0000000000..2c7d0f9c04 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/client.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGQ2xp +ZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDJuLdGomaqLgbFv1YpR/zHIKzBAs+kWDJwMQGVRtAML5c2TzHOOlaW +4IKbJ+Y/zf7Xq2oKYqiMCCDftWqRlxpgIOCA4Mq7MKt+zo+Ca75s11itTxhhbGKV +iEpjUdQypBC/LbONSgxGXo7CLRWHLZ7yHLUWD6GAfujaNonXY+YIqB8qv8gyzcw9 +HNAt6/bV5vhHfQTuKYLukZes7j397LbROXjWvzuqldXQ958Z6T0t3yG16ir4g/sY +YF63yzON19EAULerDxbrp6XL4Vg7ILVjEOhEoUFIW9A16+j4Bl4/9VZd51bMT+IJ +wjhOcdd488P7aoo2yop9vnaRBnYvnNEHlXw1qDGQPZpYrWYi7HpynQfLGGqAsEGR +7t883167jKgOseg8iz2ujxBc8OL+TwL7HeEXtHC0wQ7MNRXcf3hswYO5NSghWRwN +0XczagjL8XLph+4VINZ9HBLR1/21UnaZ3Su4llT2w2L/fGxTTqvH2c7KKmYDpCZe +Eycopf6Dw5M6MHPBfPqeL1nYB3r45KpOa7cjCwW+ip1JiYGD3n+xbmfe6Eovq06w +FLOfefkWXnw0XbuTBlf9jTG6TffdmHsIOy04j/oMDbmAQ0JhGMkH9LMTDXMF3GVa +1sPkXSPLnUhaMJjnf4NDTc9wmgF1/J+gSzCQQcUcdM3rf/PFRbSzawIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAFjedQr52vLv7YxeLxIvyHrMhbx7Iz4ztj3NlnOJ +EMGm7pcum/rGol1z8m7Y3mFbfJJp8IY/jn1w92x+M9pc6zsRo9MsKdqEAKhAjwVh +jYNBWHekrcwGIy6YUSFvZeUZ82IxFcf6N70CH4sLUJLbZXcd5Nui8mZJCPC4SLoC +E51P0vUClnS/l4O+Dz/IfBy9cSvGg3YvF8GGmW7IZdTD4bWg9O8lQi0zcnDGR0Er +N1Tegoe38Mrx49IHpWMEQzJhI6R22CQ0wtk6e8oBuz2No8hnY0yrAvBGI9v8GUE3 +FJAQxHzyUXCA50IcHFruevsgEzixmYb8OfDd1LC3nZJHfq2r5j0jOU6XXxukH8R3 +UyGIf8UpJQqBKHe0Ld0tOWSyByiWHvw4/Nir/DhANezIEsq4A0Y9hq6y2GTtFUnx +HdsYqTmVlrghBiqZF2H9f7YWaRBnsbu6Kkpyc55r8pBZMT2Myu2Gjq/8GAWtEy1J +BYmQfIZUnYksFaZiXvSiyfNaX5M7nvddxkBCyhtwtCzVutL+ZoqwXD2PPaUCuBbu +lu4M7iSjKiibiCqQEVyRPn2o8V4R5r0NmqS+B9CYJECeAnLPO49Z3l4wdJUEww9i +U14lM75e2tfFzaa/ZqOCQFuu84NKacTJUALpdg1aHcPtTG51F2U8EwsoZEBxUBb+ +WR7X +-----END CERTIFICATE REQUEST----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/client.key b/packages/opentelemetry-exporter-collector/test/certs/client.key new file mode 100644 index 0000000000..e0fea66664 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/client.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIJKQIBAAKCAgEAybi3RqJmqi4Gxb9WKUf8xyCswQLPpFgycDEBlUbQDC+XNk8x +zjpWluCCmyfmP83+16tqCmKojAgg37VqkZcaYCDggODKuzCrfs6Pgmu+bNdYrU8Y +YWxilYhKY1HUMqQQvy2zjUoMRl6Owi0Vhy2e8hy1Fg+hgH7o2jaJ12PmCKgfKr/I +Ms3MPRzQLev21eb4R30E7imC7pGXrO49/ey20Tl41r87qpXV0PefGek9Ld8hteoq ++IP7GGBet8szjdfRAFC3qw8W66ely+FYOyC1YxDoRKFBSFvQNevo+AZeP/VWXedW +zE/iCcI4TnHXePPD+2qKNsqKfb52kQZ2L5zRB5V8NagxkD2aWK1mIux6cp0Hyxhq +gLBBke7fPN9eu4yoDrHoPIs9ro8QXPDi/k8C+x3hF7RwtMEOzDUV3H94bMGDuTUo +IVkcDdF3M2oIy/Fy6YfuFSDWfRwS0df9tVJ2md0ruJZU9sNi/3xsU06rx9nOyipm +A6QmXhMnKKX+g8OTOjBzwXz6ni9Z2Ad6+OSqTmu3IwsFvoqdSYmBg95/sW5n3uhK +L6tOsBSzn3n5Fl58NF27kwZX/Y0xuk333Zh7CDstOI/6DA25gENCYRjJB/SzEw1z +BdxlWtbD5F0jy51IWjCY53+DQ03PcJoBdfyfoEswkEHFHHTN63/zxUW0s2sCAwEA +AQKCAgEAjZvNlZl2RuuOt41teAdgLY4DmG9XwwBjUB0nBlsyvAtAtNB9n0+W783m +AfPNkGcVCuP7yhSeS8d9BG6/xDr2Oht6Xx7vUt+E1L0/Q4hNouy+BNQswl+rCVwn +FHgiZfaFByCXFo2v9kp1H1006rOdDEwY18bbUnBFGMMGmx03JEaZspH1gay1PwWW +I1at7lV5X/4k0uhzUPUGLFEHVdWyNUiKSv7ubP9InaznlPIGj8g/Swx7ZACK6f7l +H1NX+rBRuU3w0fYC2iXTnz+vh7qbe1MoKt2lDZ3emavl3Q/jZDTfj4ZSiZVekgk1 +K+SBJhjCMSIGqxYeiM2HQKHvn9cPaWtEH+B3zPSauURngPxhayLsVywrqAIqh2gI +iQXnqajwn/g6KF+eEYfdJyPUv0DZgS9e8I8jeGf6Dax4SYWEtl835+r7FsejXLXZ +ehYhIdjyG16+NpLcc5d7/xaSbu9cB7I64raQCnmVbSo/iixd3TwVgFsufRqSgL++ +xa33Y0n4Tq3HgIFg2vlX+6T0RGtWRw73gmk4SXc55wG2v5a2emhQEijfoLPHEQZw +6Xd7qHHJtzxAP+Ifp3IlQ6vW0S27SIiLmQoSZBd3So5r0iF5ufIWe6215EmCdQdt +y6t000Lc8wk/0p50nlaF3Gq4dVUwkXfse/Spb+cbu4t2hSGuC4kCggEBAOuZc3MP +8OZ7vuiCgkRsE+9vfouOxmUbeP0pQzDhG/havRG6J6PG5zltmZFqJh/JvFibnRhD +UZebL9+ugYbVqSPaijuW4MpP1RSZJprxKcwiXkvIXOmB4rDbrBT8OinN7KOXDG9D +6HpeLcRG38ayMfCPMCrNjHW1J/qwJHxycuLme76d7fevxGhojJE6tICasE9SVoF7 +lc+GK/tQKbjztF1QJHXgELSDRP+uHZx7G231HiOqomMIdI0F4fXJHWk2sYBJ33zn +1/c0hPhMks1eXQiod5jXfDtwoaaArkV7S7uahDpJmi2I0HNesWoMrUKeGEEJf9mR +qHSyHozsqqmyPwUCggEBANswSrFUc1oJfA39VTFwLW54VMhb7JuKM+2h6lrZTenK +m1IwZ3sNBub6mjDtPVBG/pvIYwAAfx1liOZgyKyDj0ticWF1sAfFnWKKN7OJTW7v +45Y8oFg10CHNKOWaJd0eAEhoFHW1kPMqrM6d6uYHf60ayQTkyloKkEakBiq7YkhK +ilExk1jyqiJFU/WFEvb6kL5yg1bn1NswaOebpvXSI0z8IzUoVfRXjXB0okOrgiEI +Cn3jOO2b1hF9PHVCYbiIJnoNIhP+DdEoTpCyQy8FwWXGvtgEdwfGm8PH0iH17ehY +D8ODb3NV3HyLzoORLnqHN6G7XF2N3Y2yL2jnLBpJU68CggEBAMp514lkgtFiOiDS +wKeTBtL4zBWeP4z3PlS8GH2yiPo46VKJ3LVZJLDrK1aYlmktVAwGuMz4Ve/oNA2V +iMXbbABfOfuaYFgeoe6Q7GeuqRBB3S5d5NPdh3gdYleqqUXyLtQs5UfeYbaAp+6O +RpUZ4edu96NhgbxLUy+UH9c/+NJd6K1aRwBd83sTlvLdM/Fuf+W7ypJ/JrHyCmxy +aVkFQNYNITiYt2Kbijn+Zn5sIpeuWBeo9uQLiTcFfjtge0FH+uZZFpPfIHDYlwpZ +rLSIy4W8WwRk9OSUmKhi4OLf4qc5VThOtw05DoSINgsBGAovmoKSamkOUGryBWVx +o/4xLQ0CggEAabWtoD5hb3/5g2m1R6WZU5jXEtY6k30gtC+Nrgj1aZacOBQ+I/tR +Y95itMwF8Qx8SLdo/5w9sfjBAJKW1ZSRbELq+Zzfq6/jyp1sZbsHTESHl3JfxosV +eOfQHIOuVSjd7A2+KFLLuGrRcsh4fD4Llnm/jwukh65mjJsYmk1LBiBk+umU7aYC +5YpYBqYKUnDfk+n4a9ZdMuTzAxhvekjBW6SSelWctr3u6dhmVYqGtNWC8dm/H+Ez +abXjjY3ZQTzwiZaB4/B3y3LMCT7f5fK5phMnAVmN6oMfplldf6Fy/sZRu/JMsuwq +7SokDBHdv5ws+WQ6FKiRvH++G7K582d/4wKCAQBb6GKm0GXD0Cj0S7jGCUtOzSKx +k35cWe3YUByFQ5cN5O1kRr4xBgQin7X0Xn2WY1xCMRocslpScfVgE2WJcbVaoiqI +V7dq4N1ZhkL9dWy25Q4vmnHZU6NEZMrIC6Upd9X7uhamLJWMEqUeitI43CtjB+hF +bnD66o3ne+5QjENKOcRtssv92gUnbAtRzuy9clq5aTk37cV9e1iHTPvnILeX6hzK +szMF6wpmfbn0uzwD6HMKdGFoocc3h/0iXtk1zFTIQt7BB/aCA0VYKToCb5flgFb2 +BoswTm+ui/s2fQYlMb864gIceJBOI4+zgNeKMSrKLfp42QD3DhMtWbfpvygY +-----END RSA PRIVATE KEY----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/regenerate.sh b/packages/opentelemetry-exporter-collector/test/certs/regenerate.sh new file mode 100755 index 0000000000..bb6ec4a9b5 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/regenerate.sh @@ -0,0 +1,19 @@ +#! /bin/sh +# +# Usage: regenerate.sh +# +# regenerate.sh regenerates certificates that are used to test gRPC with TLS +# Make sure you run it in test/certs directory. +# It also serves as a documentation on how existing certificates were generated. + +rm ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key +openssl genrsa -passout pass:1111 -des3 -out ca.key 4096 +openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Root/OU=Test/CN=ca" +openssl genrsa -passout pass:1111 -des3 -out server.key 4096 +openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Server/CN=localhost" +openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt +openssl rsa -passin pass:1111 -in server.key -out server.key +openssl genrsa -passout pass:1111 -des3 -out client.key 4096 +openssl req -passin pass:1111 -new -key client.key -out client.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Client/CN=localhost" +openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt +openssl rsa -passin pass:1111 -in client.key -out client.key diff --git a/packages/opentelemetry-exporter-collector/test/certs/server.crt b/packages/opentelemetry-exporter-collector/test/certs/server.crt new file mode 100644 index 0000000000..62f91722a9 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/server.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjAwNTE1MTU0NDM2WhcN +MjEwNTE1MTU0NDM2WjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZT +ZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANQwHRfyj/d8Hh0qgDlxdtSxloRs8ZvBIwt6Accd1hUqs8dC0c9V +5XXOcfmusb3Fo8NKXn6IIPCEy1spFCe4EBW4obSgkJEVdPwsMsXUPLek/6K5S6uE +FhnGLUJJ57gAjh9LGdMTDp5szLO7dTYrHzdGZYhmTAyiA9JDN6iYlpWkK4p2IBcN +diu26KWp9+sJKw8Ly/7o5QD4wyc6hGok0v0nwimXZo78EJYBu6BDGuLyAgvq8zLV +sgXi4aYROsmVrg2IJbe8+PtPBNwkoAuR4QC3hRTV3bXyZdbIC0KbOekegAHTeXYz +Ap0HVkCsb/vOLiGuju/mKZFZKp5/PKf8Jdv/zDTIm8TwBvvtQKT4qmAYUkKTXRrO +OWK1pCakVLV7FGREDi+/bxhcQJt5yopLGT5NSoUF3RR+17KZ/5lSPEh5OMSprVyR +789KvY1z79JWt3zB6fIfQ936PyNh++SKxFmlnLuGK5wf58jefwSjGEkY2YAE66Y6 +8Kqg3/W8JsjTFBntBtD3xY1t0c4Hh2f3epQPrzwHx9pywgh+H2TIwnnUyEPLqdYp +SEsbnvdbLB8FZm2fwPZ1MZOZOGrKcnCMkMPE1DOIkxeFDx8xbeHRepSRJSbemY1l +tt+afAnM18mJf36gO8NnM56Me//FSTWbWaQlmUBAwSDlHxYfD9TgCjbBAgMBAAEw +DQYJKoZIhvcNAQEFBQADggIBAEt57zbZpIaQiw0BvZenLWhWvBA0j1cFk7eVG+Nl +Zo7+UniFH+1Io/gXJaJmJZ09d3ku4ZB+V44ka1N9J7qnnqXYOxRGT2H6owaWeOLl +FQ8tR1NQQA7p2uNWJclBsuPghzRCSFZw2auu8OKRtM/0VgbskNIN+H0EVhEeYjtd +ZzojPoa7AmH7P4SC1KMvY6qNmab9F8TBD19DPfoA/EpYboMQiK7DwPPuvrAdHcJB +KPLxyzabqFEqouwStqKUmKqbASOR+qJNac/RQTbN6yP4Lu9wTUm1OYaR4ot87dOR +ZhCznzlaJ2DsvFuoOKN/7Bezq+rXhIyCrH9VH0PjWwbO9FIfeZlHgmAmJnJCXb6F +bW6m+ha/63kiPU1NlTJRPukcR0vW/P0XSOcRvvje/07uJOOG5ypnQf6k7neR5e81 +1ZHPKCHba7bh08vKW5LbXwU4Ng7vRc42h6+iN0mogjj+B2oYt432L3howc8np2vF +eLCRxq/9pRut2QkfivT/GHkV/J+RxoEFDrZrTd15q1mLQnPCJOT+QmAMPfZydyZM +FsQUd6kzEWgZ4dHKqEikC0IBG+2xrrvHgKiB5Y1o0K/hEFfQOFCct6c9thXqMYhA +w/2HXXjfWLVBbGjJ4VemU1YFKyMZ+mxM1sJmPc/KkG/NjKf9wFFwFRpT3OIlF+BK +u8P4 +-----END CERTIFICATE----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/server.csr b/packages/opentelemetry-exporter-collector/test/certs/server.csr new file mode 100644 index 0000000000..967316e171 --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/server.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGU2Vy +dmVyMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDUMB0X8o/3fB4dKoA5cXbUsZaEbPGbwSMLegHHHdYVKrPHQtHPVeV1 +znH5rrG9xaPDSl5+iCDwhMtbKRQnuBAVuKG0oJCRFXT8LDLF1Dy3pP+iuUurhBYZ +xi1CSee4AI4fSxnTEw6ebMyzu3U2Kx83RmWIZkwMogPSQzeomJaVpCuKdiAXDXYr +tuilqffrCSsPC8v+6OUA+MMnOoRqJNL9J8Ipl2aO/BCWAbugQxri8gIL6vMy1bIF +4uGmETrJla4NiCW3vPj7TwTcJKALkeEAt4UU1d218mXWyAtCmznpHoAB03l2MwKd +B1ZArG/7zi4hro7v5imRWSqefzyn/CXb/8w0yJvE8Ab77UCk+KpgGFJCk10azjli +taQmpFS1exRkRA4vv28YXECbecqKSxk+TUqFBd0Ufteymf+ZUjxIeTjEqa1cke/P +Sr2Nc+/SVrd8wenyH0Pd+j8jYfvkisRZpZy7hiucH+fI3n8EoxhJGNmABOumOvCq +oN/1vCbI0xQZ7QbQ98WNbdHOB4dn93qUD688B8facsIIfh9kyMJ51MhDy6nWKUhL +G573WywfBWZtn8D2dTGTmThqynJwjJDDxNQziJMXhQ8fMW3h0XqUkSUm3pmNZbbf +mnwJzNfJiX9+oDvDZzOejHv/xUk1m1mkJZlAQMEg5R8WHw/U4Ao2wQIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAIBAt/12a6kkCFaRe256Umrj3/2DPA+gVqaVwlsi +xEGuO3GpBv7D6+lrlwNhLLSFOEkqoB4t/hjfGyabENXrCgyjMEoq/YKfwJvO4FPv +UkjaEWsCxmuwTS0qm8gXQy9PAwSI8EF2jOoRtvpCXl7bDQRJRIgKwZFI+jCEZvgj +Sk8fZGOH9yPEjx0KpvEw3jl/kbdSJu+CFTr981yLKjeG0lMknc/sQwH87tco4icj +t2Deaow6UOc0VaTmsWMLwIWrG/5TQPj+tL/600mBs5iQCOVio+hbzOHmDb48Ztao +CD4z8w8PAHxO79Vx0Wjt26cl6pKL58uke3G41Aq8//YLpSUUvIx0bYOwobDd4Ev5 +Emklvmcf3hAAzVQ7g8kDD82RDPRKtDl6e26+q2MQT31HuGbKB+5xpi113dSoB2CO +NSAgn3heoj5OM7heKwh6p6j0r1gT8WjXDMXQdKgekTGaUxeOSmccvMk4U0LN3JpK +JqaH178OucI9aRxGVjQFErW7xbKOViHP+NxNKj1pnerd7PX0wF/g107v2eSb6l/5 +K0UsM/l7MsINkx/1p+Qqu26t3i3Azw/MxKJqOVAlcb2LrACBj80BXBcJLW/My3kY +0XzK1siVSL17lL4KYBLO7kVR3F1+m+aQPrYJsLEKCAGxsfiFRBhXa6pfvp+fd5Hs +/xFM +-----END CERTIFICATE REQUEST----- diff --git a/packages/opentelemetry-exporter-collector/test/certs/server.key b/packages/opentelemetry-exporter-collector/test/certs/server.key new file mode 100644 index 0000000000..4831771d2b --- /dev/null +++ b/packages/opentelemetry-exporter-collector/test/certs/server.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIJKgIBAAKCAgEA1DAdF/KP93weHSqAOXF21LGWhGzxm8EjC3oBxx3WFSqzx0LR +z1Xldc5x+a6xvcWjw0pefogg8ITLWykUJ7gQFbihtKCQkRV0/CwyxdQ8t6T/orlL +q4QWGcYtQknnuACOH0sZ0xMOnmzMs7t1NisfN0ZliGZMDKID0kM3qJiWlaQrinYg +Fw12K7bopan36wkrDwvL/ujlAPjDJzqEaiTS/SfCKZdmjvwQlgG7oEMa4vICC+rz +MtWyBeLhphE6yZWuDYglt7z4+08E3CSgC5HhALeFFNXdtfJl1sgLQps56R6AAdN5 +djMCnQdWQKxv+84uIa6O7+YpkVkqnn88p/wl2//MNMibxPAG++1ApPiqYBhSQpNd +Gs45YrWkJqRUtXsUZEQOL79vGFxAm3nKiksZPk1KhQXdFH7Xspn/mVI8SHk4xKmt +XJHvz0q9jXPv0la3fMHp8h9D3fo/I2H75IrEWaWcu4YrnB/nyN5/BKMYSRjZgATr +pjrwqqDf9bwmyNMUGe0G0PfFjW3RzgeHZ/d6lA+vPAfH2nLCCH4fZMjCedTIQ8up +1ilISxue91ssHwVmbZ/A9nUxk5k4aspycIyQw8TUM4iTF4UPHzFt4dF6lJElJt6Z +jWW235p8CczXyYl/fqA7w2cznox7/8VJNZtZpCWZQEDBIOUfFh8P1OAKNsECAwEA +AQKCAgBaxLY9X0sMwHCVY2/0osAFnm5X+c6lJUqbhzapee7xoRHExKXB/umoqoaB +G6T3HEvAp9iiYhNNMFFZjsoLb6aZ1CCAh0swdTBVC4cwr2jF2nRspL1lApz9q5QC +zmCsirhBVLwYWgef58TtgdxTLsEswRV/8trHcKsX0B9IJPYNz2u80GlL0ztg2d7N +t1bRmVttFUvPoMsNzlyVNGgei+Ah4VciuZxqwBNMSDN+DBa9TG9pr7kXXujHsdV7 +V9WBFGGfckVIQzNzNctLbPN135KT3u20CwTL54R/C5YdiQ+N1LlHjrJfyNRuXgwc +oGdLHVkImYaVwyy2+6DKqn1FEw0SNrHQxbYHqHZf22F4tQYw8jE1Me1o89cG6n8t +RDZxm/7JcHg1Pq2WZMO61Xn+m2kTt6dVrPfl4n70CSZxaelV5UesBqbrZOHOiE4d +WQRGfhw7Sg+YFrNvevN/8p9Z99ubbRNflRgz5juZstk1j6ZESEO9fs1omgXGOeoN +BzAYp1odSAeeMlkfIaNo2QpLcBMnc6nQSYNld2QIg4k+1VhQUbkxRLGh4C3gs35I +ujRLRujCOye9ybv2MiDTqahK/mKCmldLWmXInUdMGTdMdUlYpBvtq1G8RBQHCwBl +2F3BTlITzKcVz3nvUiqqZzjm3eR4WEdTPMX4jr2iDR/kh61nfQKCAQEA9rgYScAp +KS3C8Fa6WX8vRPFTMOJGpo1GET38K7iRVO4SxWQqWzoH16ZE2bN01lyzjvfqPoRR +eOBdpyaJU6onjE+XLK9qoNgrW7HaInuNF4zWTndo4UwTXnE9l2qm3rMgjngXla6l +PuC6QVsPu2eGhmyWMtVKAmlMFYT2p7P+cSEwNZnCVmeMdviqO8aGMOuHNBEJ408O +oI41+rvffjogvNPnvDN1DQntl134CLxa+jlpAcr9KgVfMZpOqR+wvcV4JZSkPflp +HRFWlcOk2dWnqrIAkNcmVs+P6tB/d7sdj8hGHw0xJ9o+UYBmdJnj9N49dc9TggJo +asVIQ2CFKQVPgwKCAQEA3Ct7yVXwZwgxHBg4ouLaCXZ4/oouBjuwEtx+SPujs79S +IbM8v03YuxR3SWEqnB+P6g/Sx3EijYhz95nbzhN1gR482n+aHgtrMKGF8V4ROwOq +F3xXhx15qfn53G9SQvo1jOBsKQgxCH+MDrfa2rUGaesMVSIw3rMImiCqT329mDEX +oMpCfPUNPTXNIBJnMRcFkENK9XBN2tO7puvgi57EzseUP0jhnBYIZigjuYDDnys3 +xax5r7+o7ialJvUuuvlrHiYc+km8Qg9lDWloayZPOTGY1lEAwqdAyuVhXKF92hJe +o9Y4aD33FLaKrbHm/zfj4+L8Yuh+c0NXuhTkiLIpawKCAQEAhSgo260dyf7LxoFY +hDMTpQcGWkzVytBWr7mfn003CvqPIQAFqETytJ4lbMXhWkygEJqXT3SEsFOP2EYB +OimMvLq8Ib7vMq5ZAF1GGPRL2xkFFUZ3UZmInqFJl65VL77H5HzGZd/jicMqY1mt +bPzb6zMyAW+CSTjhen/PzAVmX1KFPXimHZI3ioJ9BlQIWuDTkPNdPdSOVXNLiO7b +GbpvrtpDqRywoP/pvpdV5gkapRBVL0WKS6KolRHuQHM9Jb8tMENAPb6dz7Vq4Nu9 +3l/k5Ui663FjXNkbmKU9FrbjppV12w54qESu+7fsFCR2ltNXonzqWjHIf0/Ix6yR +Uelu1wKCAQEAxUq17zHybfFaSImv3s6XgZlHTRi3q2A7JHuvMmlERWMxDv/VdLwm +dWYeioPmseZaiOzK/Wt1Agz/liWqYRzw09Yrw8RKb5fd4sMrCqI3oIFlHwyORoZ0 +KovVieG7fkdGS0ojwhUUE0BwWhQIqqlC6RD2iSdNUZJvJ+YTl43eoo2DVdNJBz50 +MaCPgqjbDZNKqf6TIiMTsP7BDhAatCJ+y6juQFNnz/2yYxCfCrDHG0+X96vZk1KU +52t73NAiouu0QFz45JPEfhHbhMwrBLFclqzJ/2qw2r0Tg31O5LnV099YLUpeW5MD +YO0+ke10SMlljiUt8tfR0CnNZ/Mm4xN7pwKCAQEAplZEytHOTmb5eaFYc8uiTAp+ +p1qCriIlw5T5akw1ESSKbEQTXmKqqwHP9pvFtg9Vd1M2ccmZT4Lk4+AL4sgHcs6p +asX3xz4/A9mqJKLruFd4lGhY14HV9JA1n0xVFnV5KK/7y+9Y1ZLvcGv/jzd/EXcL +T2OZ8wCTRdT6oi4+HsWaitHfNiJ1zvBgwWY9wEHofdPHIJwp8gNh6RD+M2WjHl4v +0GCGQaoEaIAePCn0R8WISviLhAymu9sIIov/WMBQQbsc03JlKSRsd/s5FYObUBfX +iBzCgMvuGWuFeBTB7LYgzina0IFwJqxy6Z7ySgZJKigPkhhrG/iD/QxuT2MvxQ== +-----END RSA PRIVATE KEY----- diff --git a/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts b/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts index 749de6b217..60d482129b 100644 --- a/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/common/CollectorExporter.test.ts @@ -19,21 +19,28 @@ import { ReadableSpan } from '@opentelemetry/tracing'; import * as assert from 'assert'; import * as sinon from 'sinon'; import { - CollectorExporter, - CollectorExporterConfig, -} from '../../src/CollectorExporter'; -import * as platform from '../../src/platform/index'; + CollectorExporterBase, + CollectorExporterConfigBase, +} from '../../src/CollectorExporterBase'; import { mockedReadableSpan } from '../helper'; +type CollectorExporterConfig = CollectorExporterConfigBase; +class CollectorExporter extends CollectorExporterBase { + onInit() {} + onShutdown() {} + sendSpans() {} +} + describe('CollectorExporter - common', () => { let collectorExporter: CollectorExporter; let collectorExporterConfig: CollectorExporterConfig; describe('constructor', () => { let onInitSpy: any; + beforeEach(() => { - onInitSpy = sinon.stub(platform, 'onInit'); + onInitSpy = sinon.stub(CollectorExporter.prototype, 'onInit'); collectorExporterConfig = { hostName: 'foo', logger: new NoopLogger(), @@ -43,6 +50,7 @@ describe('CollectorExporter - common', () => { }; collectorExporter = new CollectorExporter(collectorExporterConfig); }); + afterEach(() => { onInitSpy.restore(); }); @@ -53,7 +61,6 @@ describe('CollectorExporter - common', () => { it('should call onInit', () => { assert.strictEqual(onInitSpy.callCount, 1); - assert.ok(onInitSpy.args[0][0] === collectorExporter); }); describe('when config contains certain params', () => { @@ -92,7 +99,7 @@ describe('CollectorExporter - common', () => { describe('export', () => { let spySend: any; beforeEach(() => { - spySend = sinon.stub(platform, 'sendSpans'); + spySend = sinon.stub(CollectorExporter.prototype, 'sendSpans'); collectorExporter = new CollectorExporter(collectorExporterConfig); }); afterEach(() => { @@ -103,7 +110,7 @@ describe('CollectorExporter - common', () => { const spans: ReadableSpan[] = []; spans.push(Object.assign({}, mockedReadableSpan)); - collectorExporter.export(spans, function() {}); + collectorExporter.export(spans, () => {}); setTimeout(() => { const span1 = spySend.args[0][0][0] as ReadableSpan; assert.deepStrictEqual(spans[0], span1); @@ -136,7 +143,7 @@ describe('CollectorExporter - common', () => { describe('shutdown', () => { let onShutdownSpy: any; beforeEach(() => { - onShutdownSpy = sinon.stub(platform, 'onShutdown'); + onShutdownSpy = sinon.stub(CollectorExporter.prototype, 'onShutdown'); collectorExporterConfig = { hostName: 'foo', logger: new NoopLogger(), @@ -153,7 +160,7 @@ describe('CollectorExporter - common', () => { it('should call onShutdown', done => { collectorExporter.shutdown(); setTimeout(() => { - assert.ok(onShutdownSpy.args[0][0] === collectorExporter); + assert.equal(onShutdownSpy.callCount, 1); done(); }); }); diff --git a/packages/opentelemetry-exporter-collector/test/helper.ts b/packages/opentelemetry-exporter-collector/test/helper.ts index 29302aa6ad..aed78dfb95 100644 --- a/packages/opentelemetry-exporter-collector/test/helper.ts +++ b/packages/opentelemetry-exporter-collector/test/helper.ts @@ -22,9 +22,8 @@ import { opentelemetryProto } from '../src/types'; import * as collectorTypes from '../src/types'; if (typeof Buffer === 'undefined') { - // @ts-ignore - window.Buffer = { - from: function(arr: []) { + (window as any).Buffer = { + from: function (arr: []) { return new Uint8Array(arr); }, }; diff --git a/packages/opentelemetry-exporter-collector/test/node/CollectorExporter.test.ts b/packages/opentelemetry-exporter-collector/test/node/CollectorExporter.test.ts index 027b3d7af0..a76e35ea1f 100644 --- a/packages/opentelemetry-exporter-collector/test/node/CollectorExporter.test.ts +++ b/packages/opentelemetry-exporter-collector/test/node/CollectorExporter.test.ts @@ -17,6 +17,7 @@ import * as protoLoader from '@grpc/proto-loader'; import * as grpc from 'grpc'; import * as path from 'path'; +import * as fs from 'fs'; import { BasicTracerProvider, SimpleSpanProcessor, @@ -24,7 +25,7 @@ import { import * as assert from 'assert'; import * as sinon from 'sinon'; -import { CollectorExporter } from '../../src/CollectorExporter'; +import { CollectorExporter } from '../../src/platform/node'; import * as collectorTypes from '../../src/types'; import { @@ -37,94 +38,126 @@ const traceServiceProtoPath = 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; const includeDirs = [path.resolve(__dirname, '../../src/platform/node/protos')]; -const address = '127.0.0.1:1501'; +const address = 'localhost:1501'; -describe('CollectorExporter - node', () => { - let collectorExporter: CollectorExporter; - let server: grpc.Server; - let exportedData: - | collectorTypes.opentelemetryProto.trace.v1.ResourceSpans - | undefined; +type TestParams = { + useTLS: boolean; +}; - before(done => { - server = new grpc.Server(); - protoLoader - .load(traceServiceProtoPath, { - keepCase: false, - longs: String, - enums: String, - defaults: true, - oneofs: true, - includeDirs, - }) - .then((packageDefinition: protoLoader.PackageDefinition) => { - const packageObject: any = grpc.loadPackageDefinition( - packageDefinition - ); - server.addService( - packageObject.opentelemetry.proto.collector.trace.v1.TraceService - .service, - { - Export: (data: { - request: collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest; - }) => { - try { - exportedData = data.request.resourceSpans[0]; - } catch (e) { - exportedData = undefined; - } - }, - } - ); - server.bind(address, grpc.ServerCredentials.createInsecure()); - server.start(); - done(); - }); - }); +const testCollectorExporter = (params: TestParams) => + describe(`CollectorExporter - node ${ + params.useTLS ? 'with TLS' : '' + }`, () => { + let collectorExporter: CollectorExporter; + let server: grpc.Server; + let exportedData: + | collectorTypes.opentelemetryProto.trace.v1.ResourceSpans + | undefined; - after(() => { - server.forceShutdown(); - }); + before(done => { + server = new grpc.Server(); + protoLoader + .load(traceServiceProtoPath, { + keepCase: false, + longs: String, + enums: String, + defaults: true, + oneofs: true, + includeDirs, + }) + .then((packageDefinition: protoLoader.PackageDefinition) => { + const packageObject: any = grpc.loadPackageDefinition( + packageDefinition + ); + server.addService( + packageObject.opentelemetry.proto.collector.trace.v1.TraceService + .service, + { + Export: (data: { + request: collectorTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest; + }) => { + try { + exportedData = data.request.resourceSpans[0]; + } catch (e) { + exportedData = undefined; + } + }, + } + ); + const credentials = params.useTLS + ? grpc.ServerCredentials.createSsl( + fs.readFileSync('./test/certs/ca.crt'), + [ + { + cert_chain: fs.readFileSync('./test/certs/server.crt'), + private_key: fs.readFileSync('./test/certs/server.key'), + }, + ] + ) + : grpc.ServerCredentials.createInsecure(); + server.bind(address, credentials); + server.start(); + done(); + }); + }); - beforeEach(done => { - collectorExporter = new CollectorExporter({ - serviceName: 'basic-service', - url: address, + after(() => { + server.forceShutdown(); }); - const provider = new BasicTracerProvider(); - provider.addSpanProcessor(new SimpleSpanProcessor(collectorExporter)); - done(); - }); + beforeEach(done => { + const credentials = params.useTLS + ? grpc.credentials.createSsl( + fs.readFileSync('./test/certs/ca.crt'), + fs.readFileSync('./test/certs/client.key'), + fs.readFileSync('./test/certs/client.crt') + ) + : undefined; + collectorExporter = new CollectorExporter({ + serviceName: 'basic-service', + url: address, + credentials, + }); - afterEach(() => { - exportedData = undefined; - }); + const provider = new BasicTracerProvider(); + provider.addSpanProcessor(new SimpleSpanProcessor(collectorExporter)); + done(); + }); + + afterEach(() => { + exportedData = undefined; + }); - describe('export', () => { - it('should export spans', done => { - const responseSpy = sinon.spy(); - const spans = [Object.assign({}, mockedReadableSpan)]; - collectorExporter.export(spans, responseSpy); - setTimeout(() => { - assert.ok( - typeof exportedData !== 'undefined', - 'resource' + " doesn't exist" - ); - let spans; - let resource; - if (exportedData) { - spans = exportedData.instrumentationLibrarySpans[0].spans; - resource = exportedData.resource; - ensureExportedSpanIsCorrect(spans[0]); + describe('export', () => { + it('should export spans', done => { + const responseSpy = sinon.spy(); + const spans = [Object.assign({}, mockedReadableSpan)]; + collectorExporter.export(spans, responseSpy); + setTimeout(() => { + assert.ok( + typeof exportedData !== 'undefined', + 'resource' + " doesn't exist" + ); + let spans; + let resource; + if (exportedData) { + spans = exportedData.instrumentationLibrarySpans[0].spans; + resource = exportedData.resource; + ensureExportedSpanIsCorrect(spans[0]); - assert.ok(typeof resource !== 'undefined', "resource doesn't exist"); - if (resource) { - ensureResourceIsCorrect(resource); + assert.ok( + typeof resource !== 'undefined', + "resource doesn't exist" + ); + if (resource) { + ensureResourceIsCorrect(resource); + } } - } - done(); - }, 200); + done(); + }, 200); + }); }); }); -}); + +testCollectorExporter({ useTLS: true }); +testCollectorExporter({ useTLS: false }); diff --git a/packages/opentelemetry-exporter-collector/tslint.json b/packages/opentelemetry-exporter-collector/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-exporter-collector/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-exporter-jaeger/.eslintignore b/packages/opentelemetry-exporter-jaeger/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-exporter-jaeger/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-exporter-jaeger/.eslintrc.js b/packages/opentelemetry-exporter-jaeger/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-exporter-jaeger/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-exporter-jaeger/package.json b/packages/opentelemetry-exporter-jaeger/package.json index f02c158c0c..e87194d7fe 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.7.0", + "version": "0.8.2", "description": "OpenTelemetry Exporter Jaeger allows user to send collected traces to Jaeger", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -41,25 +41,23 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/resources": "^0.7.0", + "@opentelemetry/resources": "^0.8.2", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", + "@types/node": "12.12.35", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.2.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "nock": "^12.0.3", "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "jaeger-client": "^3.15.0" } } diff --git a/packages/opentelemetry-exporter-jaeger/src/types.ts b/packages/opentelemetry-exporter-jaeger/src/types.ts index b99ef12e41..b882848e4c 100644 --- a/packages/opentelemetry-exporter-jaeger/src/types.ts +++ b/packages/opentelemetry-exporter-jaeger/src/types.ts @@ -40,12 +40,9 @@ export interface ExporterConfig { // Below require is needed as jaeger-client types does not expose the thrift, // udp_sender, util etc. modules. -// tslint:disable-next-line:variable-name export const UDPSender = require('jaeger-client/dist/src/reporters/udp_sender') .default; -// tslint:disable-next-line:variable-name export const Utils = require('jaeger-client/dist/src/util').default; -// tslint:disable-next-line:variable-name export const ThriftUtils = require('jaeger-client/dist/src/thrift').default; export const HTTPSender = require('jaeger-client/dist/src/reporters/http_sender') diff --git a/packages/opentelemetry-exporter-jaeger/src/version.ts b/packages/opentelemetry-exporter-jaeger/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-exporter-jaeger/src/version.ts +++ b/packages/opentelemetry-exporter-jaeger/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-exporter-jaeger/tslint.json b/packages/opentelemetry-exporter-jaeger/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-exporter-jaeger/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-exporter-prometheus/.eslintignore b/packages/opentelemetry-exporter-prometheus/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-exporter-prometheus/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-exporter-prometheus/.eslintrc.js b/packages/opentelemetry-exporter-prometheus/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-exporter-prometheus/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-exporter-prometheus/README.md b/packages/opentelemetry-exporter-prometheus/README.md index 69ab91e5ff..dee3d8e227 100644 --- a/packages/opentelemetry-exporter-prometheus/README.md +++ b/packages/opentelemetry-exporter-prometheus/README.md @@ -35,12 +35,15 @@ const meter = new MeterProvider({ }).getMeter('example-prometheus'); // Now, start recording data -const counter = meter.createCounter('metric_name'); -counter.add(10, { [key]: 'value' }); +const counter = meter.createCounter('metric_name', { + labelKeys: ['pid'], + description: 'Example of a counter' +}); +counter.add(10, { pid: process.pid }); // Record data using Instrument: It is recommended to keep a reference to the Bound Instrument instead of // always calling `bind()` method for every operations. -const boundCounter = counter.bind({ [key]: 'value' }); +const boundCounter = counter.bind({ pid: process.pid }); boundCounter.add(10); // .. some other work diff --git a/packages/opentelemetry-exporter-prometheus/package.json b/packages/opentelemetry-exporter-prometheus/package.json index d8c759f1be..9a15cf9241 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.7.0", + "version": "0.8.2", "description": "OpenTelemetry Exporter Prometheus provides a metrics endpoint for Prometheus", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -41,22 +41,20 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", + "@types/node": "12.12.35", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.2.2", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/metrics": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/metrics": "^0.8.2", "prom-client": "^11.5.3" } } diff --git a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts index 9e745f6266..84c2fed821 100644 --- a/packages/opentelemetry-exporter-prometheus/src/prometheus.ts +++ b/packages/opentelemetry-exporter-prometheus/src/prometheus.ts @@ -252,14 +252,14 @@ export class PrometheusExporter implements MetricExporter { stopServer(callback?: () => void) { if (!this._server) { this._logger.debug( - `Prometheus stopServer() was called but server was never started.` + 'Prometheus stopServer() was called but server was never started.' ); if (callback) { callback(); } } else { this._server.close(() => { - this._logger.debug(`Prometheus exporter was stopped`); + this._logger.debug('Prometheus exporter was stopped'); if (callback) { callback(); } diff --git a/packages/opentelemetry-exporter-prometheus/src/version.ts b/packages/opentelemetry-exporter-prometheus/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-exporter-prometheus/src/version.ts +++ b/packages/opentelemetry-exporter-prometheus/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts index 6475d69cfb..dd1294ca3a 100644 --- a/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts +++ b/packages/opentelemetry-exporter-prometheus/test/prometheus.test.ts @@ -34,7 +34,7 @@ describe('PrometheusExporter', () => { let toPoint: () => Point; before(() => { toPoint = CounterSumAggregator.prototype.toPoint; - CounterSumAggregator.prototype.toPoint = function(): Point { + CounterSumAggregator.prototype.toPoint = function (): Point { const point = toPoint.apply(this); point.timestamp = mockedHrTime; return point; @@ -59,7 +59,7 @@ describe('PrometheusExporter', () => { }, () => { const url = `http://localhost:${port}${endpoint}`; - http.get(url, function(res: any) { + http.get(url, (res: any) => { assert.strictEqual(res.statusCode, 200); exporter.shutdown(() => { return done(); @@ -94,7 +94,7 @@ describe('PrometheusExporter', () => { exporter.startServer(() => { const url = `http://localhost:${port}${endpoint}`; - http.get(url, function(res: any) { + http.get(url, (res: any) => { assert.strictEqual(res.statusCode, 200); exporter.shutdown(() => { return done(); @@ -114,7 +114,7 @@ describe('PrometheusExporter', () => { exporter.startServer(() => { const url = `http://localhost:${port}${endpoint}`; - http.get(url, function(res: any) { + http.get(url, (res: any) => { assert.strictEqual(res.statusCode, 200); exporter.shutdown(() => { return done(); @@ -134,7 +134,7 @@ describe('PrometheusExporter', () => { exporter.startServer(() => { const url = `http://localhost:${port}/metric`; - http.get(url, function(res: any) { + http.get(url, (res: any) => { assert.strictEqual(res.statusCode, 200); exporter.shutdown(() => { const exporter2 = new PrometheusExporter({ @@ -144,7 +144,7 @@ describe('PrometheusExporter', () => { exporter2.startServer(() => { const url = `http://localhost:${port}/metric`; - http.get(url, function(res: any) { + http.get(url, (res: any) => { assert.strictEqual(res.statusCode, 200); exporter2.stopServer(() => { return done(); @@ -166,7 +166,7 @@ describe('PrometheusExporter', () => { exporter.startServer(() => { const url = `http://localhost:${port}/invalid`; - http.get(url, function(res: any) { + http.get(url, (res: any) => { assert.strictEqual(res.statusCode, 404); exporter.shutdown(() => { return done(); diff --git a/packages/opentelemetry-exporter-prometheus/tslint.json b/packages/opentelemetry-exporter-prometheus/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-exporter-prometheus/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-exporter-zipkin/.eslintignore b/packages/opentelemetry-exporter-zipkin/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-exporter-zipkin/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-exporter-zipkin/.eslintrc.js b/packages/opentelemetry-exporter-zipkin/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-exporter-zipkin/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-exporter-zipkin/package.json b/packages/opentelemetry-exporter-zipkin/package.json index 5dea64a4fb..a587ca1471 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.7.0", + "version": "0.8.2", "description": "OpenTelemetry Zipkin Exporter allows the user to send collected traces to Zipkin.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -9,8 +9,8 @@ "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "tdd": "npm run test -- --watch-extensions ts --watch", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", @@ -40,23 +40,21 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", + "@types/node": "12.12.35", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.2.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nock": "^11.0.0", "nyc": "^15.0.0", "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/resources": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/resources": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2" } } diff --git a/packages/opentelemetry-exporter-zipkin/src/version.ts b/packages/opentelemetry-exporter-zipkin/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-exporter-zipkin/src/version.ts +++ b/packages/opentelemetry-exporter-zipkin/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts index 2adbca51e5..35ff329c61 100644 --- a/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/zipkin.test.ts @@ -253,7 +253,7 @@ describe('ZipkinExporter', () => { it(`should send '${OT_REQUEST_HEADER}' header`, () => { const scope = nock('https://localhost:9411') .post('/api/v2/spans') - .reply(function(uri, requestBody, cb) { + .reply(function (uri, requestBody, cb) { assert.ok(this.req.headers[OT_REQUEST_HEADER]); cb(null, [200, 'Ok']); }); diff --git a/packages/opentelemetry-exporter-zipkin/tslint.json b/packages/opentelemetry-exporter-zipkin/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-exporter-zipkin/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-metrics/.eslintignore b/packages/opentelemetry-metrics/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-metrics/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-metrics/.eslintrc.js b/packages/opentelemetry-metrics/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-metrics/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-metrics/package.json b/packages/opentelemetry-metrics/package.json index 9ea621828e..fcddbfc616 100644 --- a/packages/opentelemetry-metrics/package.json +++ b/packages/opentelemetry-metrics/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/metrics", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry metrics SDK", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -42,23 +42,21 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.2.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/resources": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/resources": "^0.8.2" } } diff --git a/packages/opentelemetry-metrics/src/Meter.ts b/packages/opentelemetry-metrics/src/Meter.ts index ee2d5a5427..a13679aeb6 100644 --- a/packages/opentelemetry-metrics/src/Meter.ts +++ b/packages/opentelemetry-metrics/src/Meter.ts @@ -182,6 +182,6 @@ export class Meter implements api.Meter { * @param name Name of metric to be created */ private _isValidName(name: string): boolean { - return Boolean(name.match(/^[a-z][a-z0-9_.\-]*$/i)); + return Boolean(name.match(/^[a-z][a-z0-9_.-]*$/i)); } } diff --git a/packages/opentelemetry-metrics/src/Metric.ts b/packages/opentelemetry-metrics/src/Metric.ts index ce9d89df52..9547d210e3 100644 --- a/packages/opentelemetry-metrics/src/Metric.ts +++ b/packages/opentelemetry-metrics/src/Metric.ts @@ -87,6 +87,7 @@ export abstract class Metric descriptor: this._descriptor, labels: instrument.getLabels(), aggregator: instrument.getAggregator(), + resource: this.resource, })); } @@ -130,10 +131,10 @@ export class CounterMetric extends Metric implements api.Counter { /** * Adds the given value to the current value. Values cannot be negative. * @param value the value to add. - * @param labels key-values pairs that are associated with a specific metric + * @param [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 = {}) { this.bind(labels).add(value); } } @@ -163,7 +164,7 @@ export class MeasureMetric extends Metric implements api.Measure { ); } - record(value: number, labels: api.Labels) { + record(value: number, labels: api.Labels = {}) { this.bind(labels).record(value); } } diff --git a/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts b/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts index beae9090b9..52755804c9 100644 --- a/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts +++ b/packages/opentelemetry-metrics/src/export/aggregators/histogram.ts @@ -30,7 +30,7 @@ export class HistogramAggregator implements Aggregator { constructor(boundaries: number[]) { if (boundaries === undefined || boundaries.length === 0) { - throw new Error(`HistogramAggregator should be created with boundaries.`); + throw new Error('HistogramAggregator should be created with boundaries.'); } // we need to an ordered set to be able to correctly compute count for each // boundary since we'll iterate on each in order. diff --git a/packages/opentelemetry-metrics/src/export/types.ts b/packages/opentelemetry-metrics/src/export/types.ts index cffe91bc47..0fe741905e 100644 --- a/packages/opentelemetry-metrics/src/export/types.ts +++ b/packages/opentelemetry-metrics/src/export/types.ts @@ -16,6 +16,7 @@ import { ValueType, HrTime, Labels } from '@opentelemetry/api'; import { ExportResult } from '@opentelemetry/core'; +import { Resource } from '@opentelemetry/resources'; /** The kind of metric. */ export enum MetricKind { @@ -68,6 +69,7 @@ export interface MetricRecord { readonly descriptor: MetricDescriptor; readonly labels: Labels; readonly aggregator: Aggregator; + readonly resource: Resource; } export interface MetricDescriptor { diff --git a/packages/opentelemetry-metrics/src/version.ts b/packages/opentelemetry-metrics/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-metrics/src/version.ts +++ b/packages/opentelemetry-metrics/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-metrics/test/Meter.test.ts b/packages/opentelemetry-metrics/test/Meter.test.ts index ffa85fe634..5826f09a90 100644 --- a/packages/opentelemetry-metrics/test/Meter.test.ts +++ b/packages/opentelemetry-metrics/test/Meter.test.ts @@ -92,9 +92,27 @@ describe('Meter', () => { ); }); - it('should return counter with resource', () => { + it('should be able to call add with no labels', () => { + const counter = meter.createCounter('name', { + description: 'desc', + unit: '1', + disabled: false, + monotonic: true, + }); + counter.add(1); + meter.collect(); + const [record1] = meter.getBatcher().checkPointSet(); + assert.strictEqual(record1.aggregator.toPoint().value, 1); + }); + + it('should pipe through resource', () => { const counter = meter.createCounter('name') as CounterMetric; assert.ok(counter.resource instanceof Resource); + + counter.add(1, { foo: 'bar' }); + + const [record] = counter.getMetricRecord(); + assert.ok(record.resource instanceof Resource); }); describe('.bind()', () => { @@ -284,9 +302,14 @@ describe('Meter', () => { assert.strictEqual((measure as MeasureMetric)['_absolute'], false); }); - it('should return a measure with resource', () => { + it('should pipe through resource', () => { const measure = meter.createMeasure('name') as MeasureMetric; assert.ok(measure.resource instanceof Resource); + + measure.record(1, { foo: 'bar' }); + + const [record] = measure.getMetricRecord(); + assert.ok(record.resource instanceof Resource); }); describe('names', () => { @@ -487,9 +510,16 @@ describe('Meter', () => { ensureMetric(metric5); }); - it('should return an observer with resource', () => { + it('should pipe through resource', () => { const observer = meter.createObserver('name') as ObserverMetric; assert.ok(observer.resource instanceof Resource); + + observer.setCallback(result => { + result.observe(() => 42, { foo: 'bar' }); + }); + + const [record] = observer.getMetricRecord(); + assert.ok(record.resource instanceof Resource); }); }); diff --git a/packages/opentelemetry-metrics/tslint.json b/packages/opentelemetry-metrics/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-metrics/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-node/.eslintignore b/packages/opentelemetry-node/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-node/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-node/.eslintrc.js b/packages/opentelemetry-node/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-node/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-node/package.json b/packages/opentelemetry-node/package.json index e2eb356c3d..05a194c83b 100644 --- a/packages/opentelemetry-node/package.json +++ b/packages/opentelemetry-node/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/node", - "version": "0.7.0", + "version": "0.8.2", "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", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -41,29 +41,27 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-base": "^0.7.0", - "@opentelemetry/resources": "^0.7.0", + "@opentelemetry/context-base": "^0.8.2", + "@opentelemetry/resources": "^0.8.2", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/semver": "^6.0.1", "@types/shimmer": "^1.0.1", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.1.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "shimmer": "^1.2.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/context-async-hooks": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/context-async-hooks": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "require-in-the-middle": "^5.0.0", "semver": "^7.1.3" } diff --git a/packages/opentelemetry-node/src/instrumentation/ext-types.d.ts b/packages/opentelemetry-node/src/instrumentation/ext-types.d.ts index bb3be401e0..fca4da1a3b 100644 --- a/packages/opentelemetry-node/src/instrumentation/ext-types.d.ts +++ b/packages/opentelemetry-node/src/instrumentation/ext-types.d.ts @@ -15,14 +15,18 @@ */ declare module 'require-in-the-middle' { - namespace hook { - type Options = { - internals?: boolean; - }; - type OnRequireFn = (exports: T, name: string, basedir?: string) => T; - } - function hook(modules: string[]|null, options: hook.Options|null, onRequire: hook.OnRequireFn): void; - function hook(modules: string[]|null, onRequire: hook.OnRequireFn): void; - function hook(onRequire: hook.OnRequireFn): void; - export = hook; + namespace hook { + type Options = { + internals?: boolean; + }; + type OnRequireFn = (exports: T, name: string, basedir?: string) => T; } + function hook( + modules: string[] | null, + options: hook.Options | null, + onRequire: hook.OnRequireFn + ): void; + function hook(modules: string[] | null, onRequire: hook.OnRequireFn): void; + function hook(onRequire: hook.OnRequireFn): void; + export = hook; +} diff --git a/packages/opentelemetry-node/src/version.ts b/packages/opentelemetry-node/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-node/src/version.ts +++ b/packages/opentelemetry-node/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-node/test/instrumentation/PluginLoader.test.ts b/packages/opentelemetry-node/test/instrumentation/PluginLoader.test.ts index 5093d448f0..ff977d4ad8 100644 --- a/packages/opentelemetry-node/test/instrumentation/PluginLoader.test.ts +++ b/packages/opentelemetry-node/test/instrumentation/PluginLoader.test.ts @@ -26,7 +26,7 @@ import { } from '../../src/instrumentation/PluginLoader'; const INSTALLED_PLUGINS_PATH = path.join(__dirname, 'node_modules'); - +/* eslint-disable node/no-extraneous-require */ const simplePlugins: Plugins = { 'simple-module': { enabled: true, @@ -227,14 +227,14 @@ describe('PluginLoader', () => { pluginLoader.unload(); }); - it(`doesn't patch modules for which plugins aren't specified`, () => { + it("doesn't patch modules for which plugins aren't specified", () => { const pluginLoader = new PluginLoader(provider, logger); pluginLoader.load({}); assert.strictEqual(require('simple-module').value(), 0); pluginLoader.unload(); }); - it(`should warn when module was already loaded`, callback => { + it('should warn when module was already loaded', callback => { const verifyWarnLogger = { error: logger.error, info: logger.info, @@ -255,8 +255,7 @@ describe('PluginLoader', () => { const pluginLoader = new PluginLoader(provider, logger); assert.strictEqual(pluginLoader['_plugins'].length, 0); pluginLoader.load(differentNamePlugins); - // @ts-ignore only to trigger the loading of the plugin - const randomModule = require('random-module'); + require('random-module'); assert.strictEqual(pluginLoader['_plugins'].length, 0); pluginLoader.unload(); }); diff --git a/packages/opentelemetry-node/test/instrumentation/utils.test.ts b/packages/opentelemetry-node/test/instrumentation/utils.test.ts index de0f035694..6d76572b76 100644 --- a/packages/opentelemetry-node/test/instrumentation/utils.test.ts +++ b/packages/opentelemetry-node/test/instrumentation/utils.test.ts @@ -88,8 +88,7 @@ describe('Instrumentation#utils', () => { } ); - it(`should return false when version is equal to null and supportedVersions is equal to '*'`, () => { - // tslint:disable-next-line:no-any + it("should return false when version is equal to null and supportedVersions is equal to '*'", () => { assert.strictEqual(utils.isSupportedVersion(null as any, ['*']), false); }); }); diff --git a/packages/opentelemetry-node/tslint.json b/packages/opentelemetry-node/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-node/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-plugin-grpc/.eslintignore b/packages/opentelemetry-plugin-grpc/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-plugin-grpc/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-plugin-grpc/.eslintrc.js b/packages/opentelemetry-plugin-grpc/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-plugin-grpc/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-plugin-grpc/package.json b/packages/opentelemetry-plugin-grpc/package.json index 65e48d832e..bdddc970fc 100644 --- a/packages/opentelemetry-plugin-grpc/package.json +++ b/packages/opentelemetry-plugin-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-grpc", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry grpc automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -9,8 +9,8 @@ "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts", "tdd": "npm run test -- --watch-extensions ts --watch", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", @@ -41,32 +41,31 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-async-hooks": "^0.7.0", - "@opentelemetry/context-base": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/context-async-hooks": "^0.8.2", + "@opentelemetry/context-base": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", - "@types/semver": "^6.2.0", + "@types/node": "12.12.35", + "@types/semver": "^7.1.0", "@types/shimmer": "^1.0.1", "@types/sinon": "^7.0.13", "codecov": "^3.6.1", "grpc": "^1.23.3", - "gts": "^1.1.0", - "mocha": "^6.2.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "node-pre-gyp": "^0.12.0", "nyc": "^15.0.0", "rimraf": "^3.0.0", + "semver": "7.3.2", "sinon": "^7.5.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", "shimmer": "^1.2.1" } } diff --git a/packages/opentelemetry-plugin-grpc/src/grpc.ts b/packages/opentelemetry-plugin-grpc/src/grpc.ts index 44efeb2a93..0b7de00518 100644 --- a/packages/opentelemetry-plugin-grpc/src/grpc.ts +++ b/packages/opentelemetry-plugin-grpc/src/grpc.ts @@ -78,7 +78,6 @@ export class GrpcPlugin extends BasePlugin { shimmer.wrap( this._moduleExports.Server.prototype, 'register', - // tslint:disable-next-line:no-any this._patchServer() as any ); } @@ -135,7 +134,6 @@ export class GrpcPlugin extends BasePlugin { plugin._logger.debug('patched gRPC server'); return function register( - // tslint:disable-next-line:no-any this: grpcTypes.Server & { handlers: any }, name: string, handler: grpcTypes.handleCall, @@ -143,7 +141,6 @@ export class GrpcPlugin extends BasePlugin { deserialize: grpcTypes.deserialize, type: string ) { - // tslint:disable-next-line:no-any const originalResult = originalRegister.apply(this, arguments as any); const handlerSet = this.handlers[name]; @@ -228,7 +225,6 @@ export class GrpcPlugin extends BasePlugin { ) { function patchedCallback( err: grpcTypes.ServiceError, - // tslint:disable-next-line:no-any value: any, trailer: grpcTypes.Metadata, flags: grpcTypes.writeFlags @@ -309,7 +305,6 @@ export class GrpcPlugin extends BasePlugin { endSpan(); }); - // tslint:disable-next-line:no-any return (original as any).call(self, call); } @@ -323,12 +318,10 @@ export class GrpcPlugin extends BasePlugin { serviceName: string, options: grpcTypes.GenericClientOptions ) { - // tslint:disable-next-line:no-any const client = original.apply(this, arguments as any); shimmer.massWrap( client.prototype as never, plugin._getMethodsToWrap(client, methods) as never[], - // tslint:disable-next-line:no-any plugin._getPatchedClientMethods() as any ); return client; @@ -346,6 +339,7 @@ export class GrpcPlugin extends BasePlugin { .map(methodName => methods[methodName].originalName) .filter( originalName => + // eslint-disable-next-line no-prototype-builtins !!originalName && client.prototype.hasOwnProperty(originalName) ) as string[]), ]; @@ -376,7 +370,6 @@ export class GrpcPlugin extends BasePlugin { */ private _makeGrpcClientRemoteCall( original: GrpcClientFunc, - // tslint:disable-next-line:no-any args: any[], self: grpcTypes.Client, plugin: GrpcPlugin @@ -390,7 +383,6 @@ export class GrpcPlugin extends BasePlugin { callback: SendUnaryDataCallback, metadata: grpcTypes.Metadata ) { - // tslint:disable-next-line:no-any const wrappedFn = (err: grpcTypes.ServiceError, res: any) => { if (err) { if (err.code) { @@ -492,7 +484,6 @@ export class GrpcPlugin extends BasePlugin { private _getMetadata( original: GrpcClientFunc, - // tslint:disable-next-line:no-any args: any[] ): grpcTypes.Metadata { let metadata: grpcTypes.Metadata; @@ -501,7 +492,6 @@ export class GrpcPlugin extends BasePlugin { // A possible issue that could occur is if the 'options' parameter from // the user contains an '_internal_repr' as well as a 'getMap' function, // but this is an extremely rare case. - // tslint:disable-next-line:no-any let metadataIndex = findIndex(args, (arg: any) => { return ( arg && diff --git a/packages/opentelemetry-plugin-grpc/src/types.ts b/packages/opentelemetry-plugin-grpc/src/types.ts index 15f1f3d119..f6198295fd 100644 --- a/packages/opentelemetry-plugin-grpc/src/types.ts +++ b/packages/opentelemetry-plugin-grpc/src/types.ts @@ -21,12 +21,12 @@ export type grpc = typeof grpcModule; export type SendUnaryDataCallback = ( error: grpcModule.ServiceError | null, - // tslint:disable-next-line:no-any value?: any, trailer?: grpcModule.Metadata, flags?: grpcModule.writeFlags ) => void; +// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface GrpcPluginOptions {} interface GrpcStatus { diff --git a/packages/opentelemetry-plugin-grpc/src/version.ts b/packages/opentelemetry-plugin-grpc/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-plugin-grpc/src/version.ts +++ b/packages/opentelemetry-plugin-grpc/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-plugin-grpc/test/grpc.test.ts b/packages/opentelemetry-plugin-grpc/test/grpc.test.ts index a54410a280..12dd723c89 100644 --- a/packages/opentelemetry-plugin-grpc/test/grpc.test.ts +++ b/packages/opentelemetry-plugin-grpc/test/grpc.test.ts @@ -47,20 +47,14 @@ interface TestRequestResponse { } type TestGrpcClient = grpc.Client & { - // tslint:disable-next-line:no-any unaryMethod: any; - // tslint:disable-next-line:no-any UnaryMethod: any; - // tslint:disable-next-line:no-any clientStreamMethod: any; - // tslint:disable-next-line:no-any serverStreamMethod: any; - // tslint:disable-next-line:no-any bidiStreamMethod: any; }; // Compare two arrays using an equal function f -// tslint:disable-next-line:no-any const arrayIsEqual = (f: any) => ([x, ...xs]: any) => ([y, ...ys]: any): any => x === undefined && y === undefined ? true @@ -75,8 +69,7 @@ const checkEqual = (x: TestRequestResponse | TestRequestResponse[]) => ( y: TestRequestResponse | TestRequestResponse[] ) => x instanceof Array && y instanceof Array - ? // tslint:disable-next-line:no-any - arrayIsEqual(requestEqual)(x as any)(y as any) + ? arrayIsEqual(requestEqual)(x as any)(y as any) : !(x instanceof Array) && !(y instanceof Array) ? requestEqual(x)(y) : false; @@ -201,7 +194,6 @@ const replicate = (request: TestRequestResponse) => { return result; }; -// tslint:disable-next-line:no-any function startServer(grpc: GrpcModule, proto: any) { const server = new grpc.Server(); @@ -220,7 +212,6 @@ function startServer(grpc: GrpcModule, proto: any) { // This method returns the request unaryMethod( - // tslint:disable-next-line:no-any call: grpc.ServerUnaryCall, callback: SendUnaryDataCallback ) { @@ -231,7 +222,6 @@ function startServer(grpc: GrpcModule, proto: any) { // This method sum the requests clientStreamMethod( - // tslint:disable-next-line:no-any call: grpc.ServerReadableStream, callback: SendUnaryDataCallback ) { @@ -254,7 +244,6 @@ function startServer(grpc: GrpcModule, proto: any) { // This method returns an array that replicates the request, request.num of // times - // tslint:disable-next-line:no-any serverStreamMethod: (call: grpc.ServerWriteableStream) => { const result = replicate(call.request); @@ -272,7 +261,6 @@ function startServer(grpc: GrpcModule, proto: any) { }, // This method returns the request - // tslint:disable-next-line:no-any bidiStreamMethod: (call: grpc.ServerDuplexStream) => { call.on('data', (data: TestRequestResponse) => { if (data.num <= MAX_ERROR_STATUS) { @@ -291,7 +279,6 @@ function startServer(grpc: GrpcModule, proto: any) { return server; } -// tslint:disable-next-line:no-any function createClient(grpc: GrpcModule, proto: any) { return new proto.GrpcTester( 'localhost:' + grpcPort, @@ -399,7 +386,6 @@ describe('GrpcPlugin', () => { method.description }`, async () => { const args = [client, method.request]; - // tslint:disable-next-line:no-any await (method.method as any) .apply({}, args) .then((result: TestRequestResponse | TestRequestResponse[]) => { @@ -441,7 +427,6 @@ describe('GrpcPlugin', () => { assert.deepStrictEqual(rootSpan, span); const args = [client, method.request]; - // tslint:disable-next-line:no-any await (method.method as any) .apply({}, args) .then(() => { @@ -498,7 +483,6 @@ describe('GrpcPlugin', () => { : method.request; const args = [client, insertError(errRequest)(errorCode)]; - // tslint:disable-next-line:no-any await (method.method as any) .apply({}, args) .then(() => { @@ -540,7 +524,6 @@ describe('GrpcPlugin', () => { : method.request; const args = [client, insertError(errRequest)(errorCode)]; - // tslint:disable-next-line:no-any await (method.method as any) .apply({}, args) .then(() => { @@ -608,7 +591,6 @@ describe('GrpcPlugin', () => { methodList.forEach(method => { describe(`Test error raising for grpc remote ${method.description}`, () => { Object.keys(grpc.status).forEach((statusKey: string) => { - // tslint:disable-next-line:no-any const errorCode = Number(grpc.status[statusKey as any]); if (errorCode > grpc.status.OK) { runErrorTest(method, statusKey, errorCode, provider); diff --git a/packages/opentelemetry-plugin-grpc/tslint.json b/packages/opentelemetry-plugin-grpc/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-plugin-grpc/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-plugin-http/.eslintignore b/packages/opentelemetry-plugin-http/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-plugin-http/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-plugin-http/.eslintrc.js b/packages/opentelemetry-plugin-http/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-plugin-http/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-plugin-http/README.md b/packages/opentelemetry-plugin-http/README.md index bcdc59e230..247b50996a 100644 --- a/packages/opentelemetry-plugin-http/README.md +++ b/packages/opentelemetry-plugin-http/README.md @@ -52,6 +52,8 @@ Http plugin has few options available to choose from. You can set the following: | Options | Type | Description | | ------- | ---- | ----------- | | [`applyCustomAttributesOnSpan`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L52) | `HttpCustomAttributeFunction` | Function for adding custom attributes | +| [`requestHook`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L60) | `HttpRequestCustomAttributeFunction` | Function for adding custom attributes before request is handled | +| [`responseHook`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L67) | `HttpResponseCustomAttributeFunction` | Function for adding custom attributes before response is handled | | [`ignoreIncomingPaths`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L28) | `IgnoreMatcher[]` | Http plugin will not trace all incoming requests that match paths | | [`ignoreOutgoingUrls`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L28) | `IgnoreMatcher[]` | Http plugin will not trace all outgoing requests that match urls | | [`serverName`](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-plugin-http/src/types.ts#L28) | `string` | The primary server name of the matched virtual host. | diff --git a/packages/opentelemetry-plugin-http/package.json b/packages/opentelemetry-plugin-http/package.json index 9e43384dd5..deecba25c2 100644 --- a/packages/opentelemetry-plugin-http/package.json +++ b/packages/opentelemetry-plugin-http/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-http", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry http automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -9,8 +9,8 @@ "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts", "tdd": "npm run test -- --watch-extensions ts --watch", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", @@ -41,13 +41,13 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-async-hooks": "^0.7.0", - "@opentelemetry/context-base": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/context-async-hooks": "^0.8.2", + "@opentelemetry/context-base": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "@types/got": "^9.6.7", "@types/mocha": "^7.0.0", - "@types/node": "^12.12.9", + "@types/node": "12.12.35", "@types/request-promise-native": "^1.0.17", "@types/semver": "^6.0.2", "@types/shimmer": "^1.0.1", @@ -55,9 +55,10 @@ "@types/superagent": "^4.1.3", "axios": "^0.19.0", "codecov": "^3.6.1", + "eslint": "^6.8.0", "got": "^9.6.0", - "gts": "^1.1.0", - "mocha": "^6.2.1", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nock": "^11.3.5", "nyc": "^15.0.0", "request": "^2.88.0", @@ -65,15 +66,13 @@ "rimraf": "^3.0.0", "sinon": "^7.5.0", "superagent": "5.1.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", "semver": "^7.1.3", "shimmer": "^1.2.1" } diff --git a/packages/opentelemetry-plugin-http/src/enums/AttributeNames.ts b/packages/opentelemetry-plugin-http/src/enums/AttributeNames.ts index dcc0ada818..6ea8eb8983 100644 --- a/packages/opentelemetry-plugin-http/src/enums/AttributeNames.ts +++ b/packages/opentelemetry-plugin-http/src/enums/AttributeNames.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-plugin-http/src/http.ts b/packages/opentelemetry-plugin-http/src/http.ts index c6c9aaa933..9db4f207ab 100644 --- a/packages/opentelemetry-plugin-http/src/http.ts +++ b/packages/opentelemetry-plugin-http/src/http.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { CanonicalCode, context, @@ -196,13 +195,16 @@ export class HttpPlugin extends BasePlugin { ): ClientRequest { const hostname = options.hostname || - options.host?.replace(/^(.*)(\:[0-9]{1,5})/, '$1') || + options.host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost'; const attributes = utils.getOutgoingRequestAttributes(options, { component: this.component, hostname, }); span.setAttributes(attributes); + if (this._config.requestHook) { + this._callRequestHook(span, request); + } request.on( 'response', @@ -212,6 +214,9 @@ export class HttpPlugin extends BasePlugin { { hostname } ); span.setAttributes(attributes); + if (this._config.responseHook) { + this._callResponseHook(span, response); + } this._tracer.bind(response); this._logger.debug('outgoingRequest on response()'); @@ -316,19 +321,24 @@ export class HttpPlugin extends BasePlugin { context.bind(request); context.bind(response); + if (plugin._config.requestHook) { + plugin._callRequestHook(span, request); + } + if (plugin._config.responseHook) { + plugin._callResponseHook(span, response); + } + // Wraps end (inspired by: // https://github.com/GoogleCloudPlatform/cloud-trace-nodejs/blob/master/src/plugins/plugin-connect.ts#L75) const originalEnd = response.end; - response.end = function( + response.end = function ( this: ServerResponse, ...args: ResponseEndArgs ) { response.end = originalEnd; // Cannot pass args of type ResponseEndArgs, - // tslint complains "Expected 1-2 arguments, but got 1 or more.", it does not make sense to me const returned = plugin._safeExecute( span, - // tslint:disable-next-line:no-any () => response.end.apply(this, arguments as any), true ); @@ -392,6 +402,13 @@ export class HttpPlugin extends BasePlugin { extraOptions ); + if (utils.isOpenTelemetryRequest(optionsParsed)) { + // clone the headers so delete will not modify the user's object + optionsParsed.headers = Object.assign({}, optionsParsed.headers); + delete optionsParsed.headers[utils.OT_REQUEST_HEADER]; + return original.apply(this, [optionsParsed, ...args]); + } + if ( utils.isOpenTelemetryRequest(optionsParsed) || utils.isIgnored( @@ -461,6 +478,28 @@ export class HttpPlugin extends BasePlugin { this._spanNotEnded.delete(span); } + private _callResponseHook( + span: Span, + response: IncomingMessage | ServerResponse + ) { + this._safeExecute( + span, + () => this._config.responseHook!(span, response), + false + ); + } + + private _callRequestHook( + span: Span, + request: ClientRequest | IncomingMessage + ) { + this._safeExecute( + span, + () => this._config.requestHook!(span, request), + false + ); + } + private _safeExecute< T extends (...args: unknown[]) => ReturnType, K extends boolean diff --git a/packages/opentelemetry-plugin-http/src/index.ts b/packages/opentelemetry-plugin-http/src/index.ts index 6d56e7a712..4d678a5f65 100644 --- a/packages/opentelemetry-plugin-http/src/index.ts +++ b/packages/opentelemetry-plugin-http/src/index.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-plugin-http/src/types.ts b/packages/opentelemetry-plugin-http/src/types.ts index b7e230d37a..4be2114657 100644 --- a/packages/opentelemetry-plugin-http/src/types.ts +++ b/packages/opentelemetry-plugin-http/src/types.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,17 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { Span, PluginConfig } from '@opentelemetry/api'; -import * as url from 'url'; +import { PluginConfig, Span } from '@opentelemetry/api'; +import * as http from 'http'; import { ClientRequest, + get, IncomingMessage, - ServerResponse, request, - get, + ServerResponse, } from 'http'; -import * as http from 'http'; +import * as url from 'url'; export type IgnoreMatcher = string | RegExp | ((url: string) => boolean); export type HttpCallback = (res: IncomingMessage) => void; @@ -57,6 +56,14 @@ export interface HttpCustomAttributeFunction { ): void; } +export interface HttpRequestCustomAttributeFunction { + (span: Span, request: ClientRequest | IncomingMessage): void; +} + +export interface HttpResponseCustomAttributeFunction { + (span: Span, response: IncomingMessage | ServerResponse): void; +} + /** * Options available for the HTTP Plugin (see [documentation](https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-plugin-http#http-plugin-options)) */ @@ -65,8 +72,12 @@ export interface HttpPluginConfig extends PluginConfig { ignoreIncomingPaths?: IgnoreMatcher[]; /** Not trace all outgoing requests that match urls */ ignoreOutgoingUrls?: IgnoreMatcher[]; - /** Function for adding custom attributes */ + /** Function for adding custom attributes after response is handled */ applyCustomAttributesOnSpan?: HttpCustomAttributeFunction; + /** Function for adding custom attributes before request is handled */ + requestHook?: HttpRequestCustomAttributeFunction; + /** Function for adding custom attributes before response is handled */ + responseHook?: HttpResponseCustomAttributeFunction; /** The primary server name of the matched virtual host. */ serverName?: string; /** Require parent to create span for outgoing requests */ diff --git a/packages/opentelemetry-plugin-http/src/utils.ts b/packages/opentelemetry-plugin-http/src/utils.ts index e97e421c46..baa7adf90a 100644 --- a/packages/opentelemetry-plugin-http/src/utils.ts +++ b/packages/opentelemetry-plugin-http/src/utils.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,26 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { Status, CanonicalCode, Span, Attributes } from '@opentelemetry/api'; +import { Attributes, CanonicalCode, Span, Status } from '@opentelemetry/api'; import { - RequestOptions, - IncomingMessage, ClientRequest, IncomingHttpHeaders, + IncomingMessage, OutgoingHttpHeaders, + RequestOptions, ServerResponse, } from 'http'; +import { Socket } from 'net'; +import * as url from 'url'; +import { AttributeNames } from './enums/AttributeNames'; import { - IgnoreMatcher, Err, + IgnoreMatcher, ParsedRequestOptions, SpecialHttpStatusCodeMapping, } from './types'; -import { AttributeNames } from './enums/AttributeNames'; -import * as url from 'url'; -import { Socket } from 'net'; +/** + * Specific header used by exporters to "mark" outgoing request to avoid creating + * spans for request that export them which would create a infinite loop. + */ export const OT_REQUEST_HEADER = 'x-opentelemetry-outgoing-request'; export const HTTP_STATUS_SPECIAL_CASES: SpecialHttpStatusCodeMapping = { @@ -262,8 +265,9 @@ export const getRequestInfo = ( if (!pathname && optionsParsed.path) { pathname = url.parse(optionsParsed.path).pathname || '/'; } - origin = `${optionsParsed.protocol || 'http:'}//${optionsParsed.host || - `${optionsParsed.hostname}:${optionsParsed.port}`}`; + origin = `${optionsParsed.protocol || 'http:'}//${ + optionsParsed.host || `${optionsParsed.hostname}:${optionsParsed.port}` + }`; } if (hasExpectHeader(optionsParsed)) { @@ -298,9 +302,16 @@ export const isValidOptionsType = (options: unknown): boolean => { * Use case: Typically, exporter `SpanExporter` can use http module to send spans. * This will also generate spans (from the http-plugin) that will be sended through the exporter * and here we have loop. + * + * TODO: Refactor this logic when a solution is found in + * https://github.com/open-telemetry/opentelemetry-specification/issues/530 + * + * * @param {RequestOptions} options */ -export const isOpenTelemetryRequest = (options: RequestOptions) => { +export const isOpenTelemetryRequest = ( + options: RequestOptions +): options is { headers: {} } & RequestOptions => { return !!(options && options.headers && options.headers[OT_REQUEST_HEADER]); }; @@ -316,13 +327,12 @@ export const getOutgoingRequestAttributes = ( const host = requestOptions.host; const hostname = requestOptions.hostname || - host?.replace(/^(.*)(\:[0-9]{1,5})/, '$1') || + host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost'; const requestMethod = requestOptions.method; const method = requestMethod ? requestMethod.toUpperCase() : 'GET'; const headers = requestOptions.headers || {}; const userAgent = headers['user-agent']; - const attributes: Attributes = { [AttributeNames.HTTP_URL]: getAbsoluteUrl( requestOptions, @@ -403,7 +413,7 @@ export const getIncomingRequestAttributes = ( const host = requestUrl?.host || headers.host; const hostname = requestUrl?.hostname || - host?.replace(/^(.*)(\:[0-9]{1,5})/, '$1') || + host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost'; const serverName = options.serverName; const attributes: Attributes = { @@ -426,8 +436,8 @@ export const getIncomingRequestAttributes = ( } if (requestUrl) { - attributes[AttributeNames.HTTP_TARGET] = requestUrl.path || '/'; attributes[AttributeNames.HTTP_ROUTE] = requestUrl.pathname || '/'; + attributes[AttributeNames.HTTP_TARGET] = requestUrl.pathname || '/'; } if (userAgent !== undefined) { @@ -443,7 +453,7 @@ export const getIncomingRequestAttributes = ( * @param {(ServerResponse & { socket: Socket; })} response the response object */ export const getIncomingRequestAttributesOnResponse = ( - request: IncomingMessage, + request: IncomingMessage & { __ot_middlewares?: string[] }, response: ServerResponse & { socket: Socket } ): Attributes => { const { statusCode, statusMessage, socket } = response; diff --git a/packages/opentelemetry-plugin-http/src/version.ts b/packages/opentelemetry-plugin-http/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-plugin-http/src/version.ts +++ b/packages/opentelemetry-plugin-http/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts index 996992a61d..5a5d0407c7 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { NoopTracerProvider, NOOP_TRACER } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import * as assert from 'assert'; diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts index 7197a7410d..1c32b3156f 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { CanonicalCode, + context, + propagation, Span as ISpan, SpanKind, - propagation, - context, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/node'; @@ -40,6 +39,7 @@ import { DummyPropagation } from '../utils/DummyPropagation'; import { httpRequest } from '../utils/httpRequest'; import { ContextManager } from '@opentelemetry/context-base'; import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; +import { ClientRequest, IncomingMessage, ServerResponse } from 'http'; const applyCustomAttributesOnSpanErrorMessage = 'bad applyCustomAttributesOnSpan function'; @@ -76,6 +76,20 @@ export const customAttributeFunction = (span: ISpan): void => { span.setAttribute('span kind', SpanKind.CLIENT); }; +export const requestHookFunction = ( + span: ISpan, + request: ClientRequest | IncomingMessage +): void => { + span.setAttribute('custom request hook attribute', 'request'); +}; + +export const responseHookFunction = ( + span: ISpan, + response: IncomingMessage | ServerResponse +): void => { + span.setAttribute('custom response hook attribute', 'response'); +}; + describe('HttpPlugin', () => { let contextManager: ContextManager; @@ -180,9 +194,14 @@ describe('HttpPlugin', () => { }; const result = await httpRequest.get(options); + assert( + result.reqHeaders[OT_REQUEST_HEADER] === undefined, + 'custom header should be stripped' + ); const spans = memoryExporter.getFinishedSpans(); assert.strictEqual(result.data, 'Ok'); assert.strictEqual(spans.length, 0); + assert.strictEqual(options.headers[OT_REQUEST_HEADER], 1); }); }); describe('with good plugin options', () => { @@ -193,16 +212,18 @@ describe('HttpPlugin', () => { before(() => { const config: HttpPluginConfig = { ignoreIncomingPaths: [ - `/ignored/string`, + '/ignored/string', /\/ignored\/regexp$/i, - (url: string) => url.endsWith(`/ignored/function`), + (url: string) => url.endsWith('/ignored/function'), ], ignoreOutgoingUrls: [ `${protocol}://${hostname}:${serverPort}/ignored/string`, /\/ignored\/regexp$/i, - (url: string) => url.endsWith(`/ignored/function`), + (url: string) => url.endsWith('/ignored/function'), ], applyCustomAttributesOnSpan: customAttributeFunction, + requestHook: requestHookFunction, + responseHook: responseHookFunction, serverName, }; plugin.enable(http, provider, provider.logger, config); @@ -293,6 +314,10 @@ describe('HttpPlugin', () => { }; const result = await httpRequest.get(options); + assert( + result.reqHeaders[OT_REQUEST_HEADER] === undefined, + 'custom header should be stripped' + ); const spans = memoryExporter.getFinishedSpans(); assert.strictEqual(result.data, 'Ok'); assert.strictEqual(spans.length, 0); @@ -486,8 +511,7 @@ describe('HttpPlugin', () => { arg )}`, async () => { try { - // @ts-ignore - await httpRequest.get(arg); + await httpRequest.get(arg as any); } catch (error) { // request has been made // nock throw @@ -674,9 +698,7 @@ describe('HttpPlugin', () => { it("should have 1 ended span when response is listened by using req.on('response')", done => { const host = `${protocol}://${hostname}`; - nock(host) - .get('/') - .reply(404); + nock(host).get('/').reply(404); const req = http.request(`${host}/`); req.on('response', response => { response.on('data', () => {}); @@ -695,6 +717,40 @@ describe('HttpPlugin', () => { }); req.end(); }); + + it('custom attributes should show up on client and server spans', async () => { + await httpRequest.get( + `${protocol}://${hostname}:${serverPort}${pathname}` + ); + const spans = memoryExporter.getFinishedSpans(); + const [incomingSpan, outgoingSpan] = spans; + + assert.strictEqual( + incomingSpan.attributes['custom request hook attribute'], + 'request' + ); + assert.strictEqual( + incomingSpan.attributes['custom response hook attribute'], + 'response' + ); + assert.strictEqual( + incomingSpan.attributes['span kind'], + SpanKind.CLIENT + ); + + assert.strictEqual( + outgoingSpan.attributes['custom request hook attribute'], + 'request' + ); + assert.strictEqual( + outgoingSpan.attributes['custom response hook attribute'], + 'response' + ); + assert.strictEqual( + outgoingSpan.attributes['span kind'], + SpanKind.CLIENT + ); + }); }); describe('with require parent span', () => { @@ -712,14 +768,14 @@ describe('HttpPlugin', () => { plugin.disable(); }); - it(`should not trace without parent with options enabled (both client & server)`, async () => { + it('should not trace without parent with options enabled (both client & server)', async () => { plugin.disable(); const config: HttpPluginConfig = { requireParentforIncomingSpans: true, requireParentforOutgoingSpans: true, }; plugin.enable(http, provider, provider.logger, config); - const testPath = `/test/test`; + const testPath = '/test/test'; await httpRequest.get( `${protocol}://${hostname}:${serverPort}${testPath}` ); @@ -727,13 +783,13 @@ describe('HttpPlugin', () => { assert.strictEqual(spans.length, 0); }); - it(`should not trace without parent with options enabled (client only)`, async () => { + it('should not trace without parent with options enabled (client only)', async () => { plugin.disable(); const config: HttpPluginConfig = { requireParentforOutgoingSpans: true, }; plugin.enable(http, provider, provider.logger, config); - const testPath = `/test/test`; + const testPath = '/test/test'; const result = await httpRequest.get( `${protocol}://${hostname}:${serverPort}${testPath}` ); @@ -751,13 +807,13 @@ describe('HttpPlugin', () => { ); }); - it(`should not trace without parent with options enabled (server only)`, async () => { + it('should not trace without parent with options enabled (server only)', async () => { plugin.disable(); const config: HttpPluginConfig = { requireParentforIncomingSpans: true, }; plugin.enable(http, provider, provider.logger, config); - const testPath = `/test/test`; + const testPath = '/test/test'; const result = await httpRequest.get( `${protocol}://${hostname}:${serverPort}${testPath}` ); @@ -775,14 +831,14 @@ describe('HttpPlugin', () => { ); }); - it(`should trace with parent with both requireParent options enabled`, done => { + it('should trace with parent with both requireParent options enabled', done => { plugin.disable(); const config: HttpPluginConfig = { requireParentforIncomingSpans: true, requireParentforOutgoingSpans: true, }; plugin.enable(http, provider, provider.logger, config); - const testPath = `/test/test`; + const testPath = '/test/test'; const tracer = provider.getTracer('default'); const span = tracer.startSpan('parentSpan', { kind: SpanKind.INTERNAL, diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts index 9b69793d28..57cbe57427 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-package.test.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts b/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts index d79588e287..af89fa51ed 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/utils.test.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { CanonicalCode, SpanKind, TraceFlags } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { BasicTracerProvider, Span } from '@opentelemetry/tracing'; import * as assert from 'assert'; import * as http from 'http'; +import { IncomingMessage, ServerResponse } from 'http'; +import { Socket } from 'net'; import * as sinon from 'sinon'; import * as url from 'url'; import { AttributeNames } from '../../src'; @@ -179,7 +180,7 @@ describe('Utility', () => { utils.isIgnored( '/test/1', [ - url => { + () => { throw new Error('test'); }, ], @@ -196,7 +197,7 @@ describe('Utility', () => { utils.isIgnored( '/test/1', [ - url => { + () => { throw new Error('test'); }, ], @@ -319,21 +320,19 @@ describe('Utility', () => { it('should correctly parse the middleware stack if present', () => { const request = { __ot_middlewares: ['/test', '/toto', '/'], - }; - // @ts-ignore ignore error about invalid request types since we only want to - // check the parsing of the `__ot_middlewares` property + } as IncomingMessage & { __ot_middlewares?: string[] }; + const attributes = utils.getIncomingRequestAttributesOnResponse(request, { socket: {}, - }); + } as ServerResponse & { socket: Socket }); assert.deepEqual(attributes[AttributeNames.HTTP_ROUTE], '/test/toto'); }); + it('should succesfully process without middleware stack', () => { - const request = {}; - // @ts-ignore ignore error about invalid request types since we only want to - // check the parsing of the `__ot_middlewares` property + const request = {} as IncomingMessage; const attributes = utils.getIncomingRequestAttributesOnResponse(request, { socket: {}, - }); + } as ServerResponse & { socket: Socket }); assert.deepEqual(attributes[AttributeNames.HTTP_ROUTE], undefined); }); }); diff --git a/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts index 8b08378576..264eec94a8 100644 --- a/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/integrations/http-enable.test.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ import { NoopLogger } from '@opentelemetry/core'; import { SpanKind, Span, context } from '@opentelemetry/api'; import * as assert from 'assert'; import * as http from 'http'; +import * as url from 'url'; import { plugin } from '../../src/http'; import { assertSpan } from '../utils/assertSpan'; import { DummyPropagation } from '../utils/DummyPropagation'; import { httpRequest } from '../utils/httpRequest'; -import * as url from 'url'; import * as utils from '../utils/utils'; import { NodeTracerProvider } from '@opentelemetry/node'; import { @@ -51,7 +51,7 @@ describe('HttpPlugin Integration tests', () => { context.disable(); }); describe('enable()', () => { - before(function(done) { + before(function (done) { // mandatory if (process.env.CI) { done(); @@ -80,7 +80,7 @@ describe('HttpPlugin Integration tests', () => { const ignoreConfig = [ `${protocol}://${hostname}:${serverPort}/ignored/string`, /\/ignored\/regexp$/i, - (url: string) => url.endsWith(`/ignored/function`), + (url: string) => url.endsWith('/ignored/function'), ]; const config: HttpPluginConfig = { ignoreIncomingPaths: ignoreConfig, @@ -155,7 +155,9 @@ describe('HttpPlugin Integration tests', () => { const result = await httpRequest.get( new url.URL(`${protocol}://google.fr/?query=test`), - { headers: { 'x-foo': 'foo' } } + { + headers: { 'x-foo': 'foo' }, + } ); spans = memoryExporter.getFinishedSpans(); diff --git a/packages/opentelemetry-plugin-http/test/utils/DummyPropagation.ts b/packages/opentelemetry-plugin-http/test/utils/DummyPropagation.ts index 02c85aa92e..f8ef3ed337 100644 --- a/packages/opentelemetry-plugin-http/test/utils/DummyPropagation.ts +++ b/packages/opentelemetry-plugin-http/test/utils/DummyPropagation.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,8 @@ */ import { Context, HttpTextPropagator, TraceFlags } from '@opentelemetry/api'; import { - setExtractedSpanContext, getParentSpanContext, + setExtractedSpanContext, } from '@opentelemetry/core'; import * as http from 'http'; diff --git a/packages/opentelemetry-plugin-http/test/utils/assertSpan.ts b/packages/opentelemetry-plugin-http/test/utils/assertSpan.ts index cc70a654b9..aaf1f7aedb 100644 --- a/packages/opentelemetry-plugin-http/test/utils/assertSpan.ts +++ b/packages/opentelemetry-plugin-http/test/utils/assertSpan.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { SpanKind, Status } from '@opentelemetry/api'; import { hrTimeToNanoseconds } from '@opentelemetry/core'; +import { ReadableSpan } from '@opentelemetry/tracing'; import * as assert from 'assert'; import * as http from 'http'; import { AttributeNames } from '../../src/enums/AttributeNames'; import * as utils from '../../src/utils'; import { DummyPropagation } from './DummyPropagation'; -import { ReadableSpan } from '@opentelemetry/tracing'; export const assertSpan = ( span: ReadableSpan, diff --git a/packages/opentelemetry-plugin-http/test/utils/httpRequest.ts b/packages/opentelemetry-plugin-http/test/utils/httpRequest.ts index 077896bab8..bf97c3bf91 100644 --- a/packages/opentelemetry-plugin-http/test/utils/httpRequest.ts +++ b/packages/opentelemetry-plugin-http/test/utils/httpRequest.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import * as http from 'http'; import { URL } from 'url'; @@ -29,6 +28,7 @@ function get(input: string | URL, options?: http.RequestOptions): GetResult; function get(input: http.RequestOptions): GetResult; function get(input: any, options?: any): GetResult { return new Promise((resolve, reject) => { + // eslint-disable-next-line prefer-const let req: http.ClientRequest; function onGetResponseCb(resp: http.IncomingMessage): void { diff --git a/packages/opentelemetry-plugin-http/test/utils/utils.ts b/packages/opentelemetry-plugin-http/test/utils/utils.ts index 57a75516a1..256afbfdc5 100644 --- a/packages/opentelemetry-plugin-http/test/utils/utils.ts +++ b/packages/opentelemetry-plugin-http/test/utils/utils.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import * as dns from 'dns'; export const checkInternet = (cb: (isConnected: boolean) => void) => { diff --git a/packages/opentelemetry-plugin-http/tslint.json b/packages/opentelemetry-plugin-http/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-plugin-http/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-plugin-https/.eslintignore b/packages/opentelemetry-plugin-https/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-plugin-https/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-plugin-https/.eslintrc.js b/packages/opentelemetry-plugin-https/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-plugin-https/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-plugin-https/package.json b/packages/opentelemetry-plugin-https/package.json index c79f068a7e..09c29c1efd 100644 --- a/packages/opentelemetry-plugin-https/package.json +++ b/packages/opentelemetry-plugin-https/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/plugin-https", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry https automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -9,8 +9,8 @@ "test": "nyc ts-mocha -p tsconfig.json test/**/*.test.ts", "tdd": "npm run test -- --watch-extensions ts --watch", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", @@ -41,13 +41,13 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/context-async-hooks": "^0.7.0", - "@opentelemetry/context-base": "^0.7.0", - "@opentelemetry/node": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/context-async-hooks": "^0.8.2", + "@opentelemetry/context-base": "^0.8.2", + "@opentelemetry/node": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "@types/got": "^9.6.7", "@types/mocha": "^7.0.0", - "@types/node": "^12.12.9", + "@types/node": "12.12.35", "@types/request-promise-native": "^1.0.17", "@types/semver": "^6.0.2", "@types/shimmer": "^1.0.1", @@ -56,8 +56,8 @@ "axios": "^0.19.0", "codecov": "^3.6.1", "got": "^9.6.0", - "gts": "^1.1.0", - "mocha": "^6.2.1", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nock": "^11.3.5", "nyc": "^15.0.0", "request": "^2.88.0", @@ -65,16 +65,14 @@ "rimraf": "^3.0.0", "sinon": "^7.5.0", "superagent": "5.1.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/plugin-http": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/plugin-http": "^0.8.2", "semver": "^7.1.3", "shimmer": "^1.2.1" } diff --git a/packages/opentelemetry-plugin-https/src/version.ts b/packages/opentelemetry-plugin-https/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-plugin-https/src/version.ts +++ b/packages/opentelemetry-plugin-https/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts index 5648223fe0..21d43c39bd 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts @@ -208,14 +208,14 @@ describe('HttpsPlugin', () => { before(() => { const config: HttpPluginConfig = { ignoreIncomingPaths: [ - `/ignored/string`, + '/ignored/string', /\/ignored\/regexp$/i, - (url: string) => url.endsWith(`/ignored/function`), + (url: string) => url.endsWith('/ignored/function'), ], ignoreOutgoingUrls: [ `${protocol}://${hostname}:${serverPort}/ignored/string`, /\/ignored\/regexp$/i, - (url: string) => url.endsWith(`/ignored/function`), + (url: string) => url.endsWith('/ignored/function'), ], applyCustomAttributesOnSpan: customAttributeFunction, serverName, @@ -503,8 +503,7 @@ describe('HttpsPlugin', () => { arg )}`, async () => { try { - // @ts-ignore - await httpsRequest.get(arg); + await httpsRequest.get(arg as any); } catch (error) { // request has been made // nock throw @@ -677,9 +676,7 @@ describe('HttpsPlugin', () => { it("should have 1 ended span when response is listened by using req.on('response')", done => { const host = `${protocol}://${hostname}`; - nock(host) - .get('/') - .reply(404); + nock(host).get('/').reply(404); const req = https.request(`${host}/`); req.on('response', response => { response.on('data', () => {}); diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts index 0b6935fe36..e22ec5c246 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-package.test.ts @@ -101,7 +101,7 @@ describe('Packages', () => { // https://github.com/sindresorhus/got/commit/bf1aa5492ae2bc78cbbec6b7d764906fb156e6c2#diff-707a4781d57c42085155dcb27edb9ccbR258 // TODO: check if this is still the case when new version 'https://www.google.com' - : `https://www.google.com/search?q=axios&oq=axios&aqs=chrome.0.69i59l2j0l3j69i60.811j0j7&sourceid=chrome&ie=UTF-8` + : 'https://www.google.com/search?q=axios&oq=axios&aqs=chrome.0.69i59l2j0l3j69i60.811j0j7&sourceid=chrome&ie=UTF-8' ); const result = await httpPackage.get(urlparsed.href!); if (!resHeaders) { diff --git a/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts b/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts index d66ee4ae90..9da20e1b07 100644 --- a/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts +++ b/packages/opentelemetry-plugin-https/test/integrations/https-enable.test.ts @@ -57,7 +57,7 @@ describe('HttpsPlugin Integration tests', () => { }); describe('enable()', () => { - before(function(done) { + before(function (done) { // mandatory if (process.env.CI) { done(); @@ -85,7 +85,7 @@ describe('HttpsPlugin Integration tests', () => { const ignoreConfig = [ `${protocol}://${hostname}:${serverPort}/ignored/string`, /\/ignored\/regexp$/i, - (url: string) => url.endsWith(`/ignored/function`), + (url: string) => url.endsWith('/ignored/function'), ]; const config: HttpPluginConfig = { ignoreIncomingPaths: ignoreConfig, diff --git a/packages/opentelemetry-plugin-https/test/utils/httpsRequest.ts b/packages/opentelemetry-plugin-https/test/utils/httpsRequest.ts index e96a12fce5..956c1da2e2 100644 --- a/packages/opentelemetry-plugin-https/test/utils/httpsRequest.ts +++ b/packages/opentelemetry-plugin-https/test/utils/httpsRequest.ts @@ -32,6 +32,7 @@ function get(input: string | URL, options?: https.RequestOptions): GetResult; function get(input: https.RequestOptions): GetResult; function get(input: any, options?: any): GetResult { return new Promise((resolve, reject) => { + // eslint-disable-next-line prefer-const let req: http.ClientRequest; function onGetResponseCb(resp: http.IncomingMessage): void { diff --git a/packages/opentelemetry-plugin-https/tslint.json b/packages/opentelemetry-plugin-https/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-plugin-https/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-plugin-xml-http-request/.eslintignore b/packages/opentelemetry-plugin-xml-http-request/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-plugin-xml-http-request/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-plugin-xml-http-request/.eslintrc.js b/packages/opentelemetry-plugin-xml-http-request/.eslintrc.js new file mode 100644 index 0000000000..01b8d09740 --- /dev/null +++ b/packages/opentelemetry-plugin-xml-http-request/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "browser": true, + "jquery": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-plugin-xml-http-request/package.json b/packages/opentelemetry-plugin-xml-http-request/package.json index b12a130ed7..3166e09cc1 100644 --- a/packages/opentelemetry-plugin-xml-http-request/package.json +++ b/packages/opentelemetry-plugin-xml-http-request/package.json @@ -1,13 +1,13 @@ { "name": "@opentelemetry/plugin-xml-http-request", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry XMLHttpRequest automatic instrumentation package.", "main": "build/src/index.js", "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf build/*", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", @@ -44,41 +44,39 @@ }, "devDependencies": { "@babel/core": "^7.6.0", - "@opentelemetry/context-zone": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/context-zone": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/shimmer": "^1.0.1", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "babel-loader": "^8.0.6", "codecov": "^3.1.0", - "gts": "^1.0.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-mocha": "^1.3.0", + "karma-coverage-istanbul-reporter": "^3.0.2", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.6.4", "webpack": "^4.35.2", "webpack-cli": "^3.3.9", "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/web": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/web": "^0.8.2", "shimmer": "^1.2.1" } } diff --git a/packages/opentelemetry-plugin-xml-http-request/src/version.ts b/packages/opentelemetry-plugin-xml-http-request/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-plugin-xml-http-request/src/version.ts +++ b/packages/opentelemetry-plugin-xml-http-request/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts b/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts index 88eec64ae6..73e57b4812 100644 --- a/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts +++ b/packages/opentelemetry-plugin-xml-http-request/src/xhr.ts @@ -357,7 +357,7 @@ export class XMLHttpRequestPlugin extends BasePlugin { return function patchOpen(this: XMLHttpRequest, ...args): void { const method: string = args[0]; const url: string = args[1]; - const async: boolean = !!args[2]; + const async = !!args[2]; if (async) { plugin._createSpan(this, url, method); } else { diff --git a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts index 08b0b209ee..5248fd8b6f 100644 --- a/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-plugin-xml-http-request/test/xhr.test.ts @@ -41,19 +41,20 @@ class DummySpanExporter implements tracing.SpanExporter { } const getData = (url: string, callbackAfterSend: Function) => { + // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { const req = new XMLHttpRequest(); req.open('GET', url, true); req.send(); - req.onload = function() { + req.onload = function () { resolve(); }; - req.onerror = function() { + req.onerror = function () { resolve(); }; - req.ontimeout = function() { + req.ontimeout = function () { resolve(); }; @@ -135,7 +136,7 @@ describe('xhr', () => { ) => { sandbox = sinon.createSandbox(); const fakeXhr = sandbox.useFakeXMLHttpRequest(); - fakeXhr.onCreate = function(xhr: any) { + fakeXhr.onCreate = function (xhr: any) { requests.push(xhr); }; sandbox.useFakeTimers(); @@ -428,7 +429,7 @@ describe('xhr', () => { beforeEach(done => { sandbox = sinon.createSandbox(); const fakeXhr = sandbox.useFakeXMLHttpRequest(); - fakeXhr.onCreate = function(xhr: any) { + fakeXhr.onCreate = function (xhr: any) { requests.push(xhr); }; diff --git a/packages/opentelemetry-plugin-xml-http-request/tslint.json b/packages/opentelemetry-plugin-xml-http-request/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-plugin-xml-http-request/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-resources/.eslintignore b/packages/opentelemetry-resources/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-resources/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-resources/.eslintrc.js b/packages/opentelemetry-resources/.eslintrc.js new file mode 100644 index 0000000000..9dfe62f9b8 --- /dev/null +++ b/packages/opentelemetry-resources/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + "browser": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index 21b3d4cfed..ac9267eca8 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/resources", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry SDK resources", "main": "build/src/index.js", "browser": { @@ -10,8 +10,8 @@ "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", @@ -45,24 +45,22 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.2.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nock": "^12.0.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", "gcp-metadata": "^3.5.0" } } diff --git a/packages/opentelemetry-resources/src/platform/node/detectors/AwsEc2Detector.ts b/packages/opentelemetry-resources/src/platform/node/detectors/AwsEc2Detector.ts index d3317b9c09..7e68016925 100644 --- a/packages/opentelemetry-resources/src/platform/node/detectors/AwsEc2Detector.ts +++ b/packages/opentelemetry-resources/src/platform/node/detectors/AwsEc2Detector.ts @@ -44,13 +44,17 @@ class AwsEc2Detector implements Detector { const { accountId, instanceId, + instanceType, region, + availabilityZone, } = await this._awsMetadataAccessor(); return new Resource({ [CLOUD_RESOURCE.PROVIDER]: 'aws', [CLOUD_RESOURCE.ACCOUNT_ID]: accountId, [CLOUD_RESOURCE.REGION]: region, + [CLOUD_RESOURCE.ZONE]: availabilityZone, [HOST_RESOURCE.ID]: instanceId, + [HOST_RESOURCE.TYPE]: instanceType, }); } catch { return Resource.empty(); diff --git a/packages/opentelemetry-resources/src/platform/node/detectors/EnvDetector.ts b/packages/opentelemetry-resources/src/platform/node/detectors/EnvDetector.ts index 52dd160778..a6e4cf31b1 100644 --- a/packages/opentelemetry-resources/src/platform/node/detectors/EnvDetector.ts +++ b/packages/opentelemetry-resources/src/platform/node/detectors/EnvDetector.ts @@ -87,10 +87,7 @@ class EnvDetector implements Detector { let [key, value] = keyValuePair; // Leading and trailing whitespaces are trimmed. key = key.trim(); - value = value - .trim() - .split('^"|"$') - .join(''); + value = value.trim().split('^"|"$').join(''); if (!this._isValidAndNotEmpty(key)) { throw new Error(`Label key ${this._ERROR_MESSAGE_INVALID_CHARS}`); } diff --git a/packages/opentelemetry-resources/src/version.ts b/packages/opentelemetry-resources/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-resources/src/version.ts +++ b/packages/opentelemetry-resources/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-resources/test/detect-resources.test.ts b/packages/opentelemetry-resources/test/detect-resources.test.ts index 24efdf7638..4bf5a0d7cc 100644 --- a/packages/opentelemetry-resources/test/detect-resources.test.ts +++ b/packages/opentelemetry-resources/test/detect-resources.test.ts @@ -48,8 +48,10 @@ const { origin: AWS_HOST, pathname: AWS_PATH } = new URL( const mockedAwsResponse = { instanceId: 'my-instance-id', + instanceType: 'my-instance-type', accountId: 'my-account-id', region: 'my-region', + availabilityZone: 'my-zone', }; describe('detectResources', async () => { @@ -110,11 +112,9 @@ describe('detectResources', async () => { describe('in AWS environment', () => { it('returns a merged resource', async () => { - const gcpScope = nock(HOST_ADDRESS) - .get(INSTANCE_PATH) - .replyWithError({ - code: 'ENOTFOUND', - }); + const gcpScope = nock(HOST_ADDRESS).get(INSTANCE_PATH).replyWithError({ + code: 'ENOTFOUND', + }); const gcpSecondaryScope = nock(SECONDARY_HOST_ADDRESS) .get(INSTANCE_PATH) .replyWithError({ @@ -132,8 +132,12 @@ describe('detectResources', async () => { provider: 'aws', accountId: 'my-account-id', region: 'my-region', + zone: 'my-zone', + }); + assertHostResource(resource, { + id: 'my-instance-id', + hostType: 'my-instance-type', }); - assertHostResource(resource, { id: 'my-instance-id' }); assertServiceResource(resource, { instanceId: '627cc493', name: 'my-service', diff --git a/packages/opentelemetry-resources/test/detectors/AwsEc2Detector.test.ts b/packages/opentelemetry-resources/test/detectors/AwsEc2Detector.test.ts index 6777d472fe..4c04897916 100644 --- a/packages/opentelemetry-resources/test/detectors/AwsEc2Detector.test.ts +++ b/packages/opentelemetry-resources/test/detectors/AwsEc2Detector.test.ts @@ -31,8 +31,10 @@ const { origin: AWS_HOST, pathname: AWS_PATH } = new URL( const mockedAwsResponse = { instanceId: 'my-instance-id', + instanceType: 'my-instance-type', accountId: 'my-account-id', region: 'my-region', + availabilityZone: 'my-zone', }; describe('awsEc2Detector', () => { @@ -58,20 +60,20 @@ describe('awsEc2Detector', () => { provider: 'aws', accountId: 'my-account-id', region: 'my-region', + zone: 'my-zone', }); assertHostResource(resource, { id: 'my-instance-id', + hostType: 'my-instance-type', }); }); }); describe('with failing request', () => { it('should return empty resource', async () => { - const scope = nock(AWS_HOST) - .get(AWS_PATH) - .replyWithError({ - code: 'ENOTFOUND', - }); + const scope = nock(AWS_HOST).get(AWS_PATH).replyWithError({ + code: 'ENOTFOUND', + }); const resource: Resource = await awsEc2Detector.detect(); scope.done(); diff --git a/packages/opentelemetry-resources/test/util/resource-assertions.ts b/packages/opentelemetry-resources/test/util/resource-assertions.ts index db33bd7632..01ae1f17c0 100644 --- a/packages/opentelemetry-resources/test/util/resource-assertions.ts +++ b/packages/opentelemetry-resources/test/util/resource-assertions.ts @@ -265,6 +265,7 @@ const assertHasOneLabel = ( resource: Resource ): void => { const hasOne = Object.values(constants).reduce( + // eslint-disable-next-line no-prototype-builtins (found, key) => found || resource.labels.hasOwnProperty(key), false ); diff --git a/packages/opentelemetry-resources/tslint.json b/packages/opentelemetry-resources/tslint.json deleted file mode 100644 index 69d07efd8b..0000000000 --- a/packages/opentelemetry-resources/tslint.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": [ - "../../tslint.base.js", - "./node_modules/tslint-consistent-codestyle" - ] -} diff --git a/packages/opentelemetry-shim-opentracing/.eslintignore b/packages/opentelemetry-shim-opentracing/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-shim-opentracing/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-shim-opentracing/.eslintrc.js b/packages/opentelemetry-shim-opentracing/.eslintrc.js new file mode 100644 index 0000000000..f726f3becb --- /dev/null +++ b/packages/opentelemetry-shim-opentracing/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + "env": { + "mocha": true, + "node": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-shim-opentracing/package.json b/packages/opentelemetry-shim-opentracing/package.json index 1f9bdb58da..40b00235e0 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.7.0", + "version": "0.8.2", "description": "OpenTracing to OpenTelemetry shim", "main": "build/src/index.js", "types": "build/src/index.d.ts", @@ -10,8 +10,8 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "clean": "rimraf build/*", - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", @@ -26,7 +26,7 @@ "author": "OpenTelemetry Authors", "license": "Apache-2.0", "engines": { - "node": ">=8.0.0" + "node": ">=8.5.0" }, "files": [ "build/src/**/*.js", @@ -39,23 +39,23 @@ "access": "public" }, "devDependencies": { - "@opentelemetry/tracing": "^0.7.0", + "@opentelemetry/tracing": "^0.8.2", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.9", + "@types/node": "12.12.35", "codecov": "^3.6.1", - "gts": "^1.1.0", - "mocha": "^6.2.0", + "gts": "^2.0.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", "tslint-consistent-codestyle": "^1.16.0", "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/core": "^0.8.2", "opentracing": "^0.14.4" } } diff --git a/packages/opentelemetry-shim-opentracing/src/shim.ts b/packages/opentelemetry-shim-opentracing/src/shim.ts index ecc4adf995..0fc561bacb 100644 --- a/packages/opentelemetry-shim-opentracing/src/shim.ts +++ b/packages/opentelemetry-shim-opentracing/src/shim.ts @@ -140,9 +140,8 @@ export class TracerShim extends opentracing.Tracer { const opentelemSpanContext: api.SpanContext = (spanContext as SpanContextShim).getSpanContext(); if (!carrier || typeof carrier !== 'object') return; switch (format) { - // tslint:disable-next-line:no-switch-case-fall-through case opentracing.FORMAT_HTTP_HEADERS: - case opentracing.FORMAT_TEXT_MAP: + case opentracing.FORMAT_TEXT_MAP: { api.propagation.inject( carrier, defaultSetter, @@ -152,21 +151,22 @@ export class TracerShim extends opentracing.Tracer { ) ); return; - case opentracing.FORMAT_BINARY: + } + case opentracing.FORMAT_BINARY: { this._logger.warn( 'OpentracingShim.inject() does not support FORMAT_BINARY' ); // @todo: Implement binary format return; + } default: } } _extract(format: string, carrier: unknown): opentracing.SpanContext | null { switch (format) { - // tslint:disable-next-line:no-switch-case-fall-through case opentracing.FORMAT_HTTP_HEADERS: - case opentracing.FORMAT_TEXT_MAP: + case opentracing.FORMAT_TEXT_MAP: { const context = getExtractedSpanContext( api.propagation.extract(carrier) ); @@ -174,12 +174,14 @@ export class TracerShim extends opentracing.Tracer { return null; } return new SpanContextShim(context); - case opentracing.FORMAT_BINARY: + } + case opentracing.FORMAT_BINARY: { // @todo: Implement binary format this._logger.warn( 'OpentracingShim.extract() does not support FORMAT_BINARY' ); return null; + } default: } return null; diff --git a/packages/opentelemetry-shim-opentracing/src/version.ts b/packages/opentelemetry-shim-opentracing/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-shim-opentracing/src/version.ts +++ b/packages/opentelemetry-shim-opentracing/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-shim-opentracing/tslint.json b/packages/opentelemetry-shim-opentracing/tslint.json deleted file mode 100644 index 0b1a202be7..0000000000 --- a/packages/opentelemetry-shim-opentracing/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-test-utils/package.json b/packages/opentelemetry-test-utils/package.json deleted file mode 100644 index 9ba91bec73..0000000000 --- a/packages/opentelemetry-test-utils/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@opentelemetry/test-utils", - "private": true, - "version": "0.7.0", - "description": "Test utilities.", - "main": "build/testUtils.js", - "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", - "compile": "tsc -p .", - "precompile": "tsc --version", - "prepare": "npm run compile" - }, - "repository": "open-telemetry/opentelemetry-js", - "keywords": [ - "opentelemetry", - "test-utils" - ], - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/open-telemetry/opentelemetry-js/issues" - }, - "homepage": "https://github.com/open-telemetry/opentelemetry-js#readme", - "devDependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0", - "gts": "^1.1.2", - "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", - "typescript": "3.7.4" - } -} diff --git a/packages/opentelemetry-test-utils/testUtils.ts b/packages/opentelemetry-test-utils/testUtils.ts deleted file mode 100644 index 21478e3f9e..0000000000 --- a/packages/opentelemetry-test-utils/testUtils.ts +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * Copyright 2019, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as childProcess from 'child_process'; -import { SpanKind, Attributes, Event, Span, Status } from '@opentelemetry/api'; -import * as assert from 'assert'; -import { ReadableSpan } from '@opentelemetry/tracing'; -import { - hrTimeToMilliseconds, - hrTimeToMicroseconds, -} from '@opentelemetry/core'; - -export function startDocker(db: 'redis' | 'mysql' | 'postgres') { - let dockerRunCmd; - switch (db) { - case 'redis': - dockerRunCmd = `docker run -d -p 63790:6379 --name ot${db} ${db}:alpine`; - break; - - case 'mysql': - dockerRunCmd = `docker run --rm -d -e MYSQL_ROOT_PASSWORD=rootpw -e MYSQL_DATABASE=test_db -e MYSQL_USER=otel -e MYSQL_PASSWORD=secret -p 33306:3306 --name ot${db} circleci/${db}:5.7`; - break; - - case 'postgres': - dockerRunCmd = `docker run -d -p 54320:5432 --name ot${db} ${db}:alpine`; - break; - } - - const tasks = [run(dockerRunCmd)]; - - for (let i = 0; i < tasks.length; i++) { - const task = tasks[i]; - if (task && task.code !== 0) { - console.error('Failed to start container!'); - console.error(task.output); - return false; - } - } - return true; -} - -export function cleanUpDocker(db: 'redis' | 'mysql' | 'postgres') { - run(`docker stop ot${db}`); - run(`docker rm ot${db}`); -} - -function run(cmd: string) { - try { - const proc = childProcess.spawnSync(cmd, { - shell: true, - }); - return { - code: proc.status, - output: proc.output - .map(v => String.fromCharCode.apply(null, v as any)) - .join(''), - }; - } catch (e) { - console.log(e); - return; - } -} - -export const assertSpan = ( - span: ReadableSpan, - kind: SpanKind, - attributes: Attributes, - events: Event[], - status: Status -) => { - assert.strictEqual(span.spanContext.traceId.length, 32); - assert.strictEqual(span.spanContext.spanId.length, 16); - assert.strictEqual(span.kind, kind); - - assert.ok(span.endTime); - assert.strictEqual(span.links.length, 0); - - assert.ok( - hrTimeToMicroseconds(span.startTime) < hrTimeToMicroseconds(span.endTime) - ); - assert.ok(hrTimeToMilliseconds(span.endTime) > 0); - - // attributes - assert.deepStrictEqual(span.attributes, attributes); - - // events - assert.deepStrictEqual(span.events, events); - - assert.strictEqual(span.status.code, status.code); - if (status.message) { - assert.strictEqual(span.status.message, status.message); - } -}; - -// Check if childSpan was propagated from parentSpan -export const assertPropagation = ( - childSpan: ReadableSpan, - parentSpan: Span -) => { - const targetSpanContext = childSpan.spanContext; - const sourceSpanContext = parentSpan.context(); - assert.strictEqual(targetSpanContext.traceId, sourceSpanContext.traceId); - assert.strictEqual(childSpan.parentSpanId, sourceSpanContext.spanId); - assert.strictEqual( - targetSpanContext.traceFlags, - sourceSpanContext.traceFlags - ); - assert.notStrictEqual(targetSpanContext.spanId, sourceSpanContext.spanId); -}; diff --git a/packages/opentelemetry-test-utils/tsconfig.json b/packages/opentelemetry-test-utils/tsconfig.json deleted file mode 100644 index eba808d7cd..0000000000 --- a/packages/opentelemetry-test-utils/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../tsconfig.base", - "compilerOptions": { - "rootDir": ".", - "outDir": "build" - }, - "include": [ - "*.ts" - ] -} diff --git a/packages/opentelemetry-test-utils/tslint.json b/packages/opentelemetry-test-utils/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-test-utils/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-tracing/.eslintignore b/packages/opentelemetry-tracing/.eslintignore new file mode 100644 index 0000000000..9ef96044fa --- /dev/null +++ b/packages/opentelemetry-tracing/.eslintignore @@ -0,0 +1,2 @@ +build + diff --git a/packages/opentelemetry-tracing/.eslintrc.js b/packages/opentelemetry-tracing/.eslintrc.js new file mode 100644 index 0000000000..9dfe62f9b8 --- /dev/null +++ b/packages/opentelemetry-tracing/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + "browser": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-tracing/package.json b/packages/opentelemetry-tracing/package.json index 967241ecb8..cc2533224d 100644 --- a/packages/opentelemetry-tracing/package.json +++ b/packages/opentelemetry-tracing/package.json @@ -1,6 +1,6 @@ { "name": "@opentelemetry/tracing", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry Tracing", "main": "build/src/index.js", "browser": { @@ -10,17 +10,19 @@ "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts' --exclude 'test/index-webpack.ts'", + "test:browser": "nyc karma start --single-run", + "tdd": "npm run tdd:node", + "tdd:node": "npm run test -- --watch-extensions ts --watch", + "tdd:browser": "karma start", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf build/*", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", "version:update": "node ../../scripts/version-update.js", "compile": "npm run version:update && tsc -p .", "prepare": "npm run compile", - "tdd": "npm run test -- --watch-extensions ts --watch", - "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts' --exclude 'test/index-webpack.ts'", - "test:browser": "nyc karma start --single-run", "watch": "tsc -w" }, "keywords": [ @@ -48,34 +50,32 @@ }, "devDependencies": { "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "codecov": "^3.6.1", - "gts": "^1.1.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", - "karma-mocha": "^1.3.0", + "karma-coverage-istanbul-reporter": "^3.0.2", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2", "webpack": "^4.35.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/context-base": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/resources": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/context-base": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/resources": "^0.8.2" } } diff --git a/packages/opentelemetry-tracing/src/version.ts b/packages/opentelemetry-tracing/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-tracing/src/version.ts +++ b/packages/opentelemetry-tracing/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-tracing/test/export/ConsoleSpanExporter.test.ts b/packages/opentelemetry-tracing/test/export/ConsoleSpanExporter.test.ts index dde733b5a9..6377874195 100644 --- a/packages/opentelemetry-tracing/test/export/ConsoleSpanExporter.test.ts +++ b/packages/opentelemetry-tracing/test/export/ConsoleSpanExporter.test.ts @@ -58,9 +58,7 @@ describe('ConsoleSpanExporter', () => { const firstEvent = firstSpan.events[0]; const consoleArgs = spyConsole.args[0]; const consoleSpan = consoleArgs[0]; - const keys = Object.keys(consoleSpan) - .sort() - .join(','); + const keys = Object.keys(consoleSpan).sort().join(','); const expectedKeys = [ 'attributes', diff --git a/packages/opentelemetry-tracing/tslint.json b/packages/opentelemetry-tracing/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-tracing/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/packages/opentelemetry-web/.eslintignore b/packages/opentelemetry-web/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/packages/opentelemetry-web/.eslintignore @@ -0,0 +1 @@ +build diff --git a/packages/opentelemetry-web/.eslintrc.js b/packages/opentelemetry-web/.eslintrc.js new file mode 100644 index 0000000000..01b8d09740 --- /dev/null +++ b/packages/opentelemetry-web/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "browser": true, + "jquery": true + }, + ...require('../../eslint.config.js') +} diff --git a/packages/opentelemetry-web/package.json b/packages/opentelemetry-web/package.json index b8ce2dff7d..3e1c8e1843 100644 --- a/packages/opentelemetry-web/package.json +++ b/packages/opentelemetry-web/package.json @@ -1,13 +1,13 @@ { "name": "@opentelemetry/web", - "version": "0.7.0", + "version": "0.8.2", "description": "OpenTelemetry Web Tracer", "main": "build/src/index.js", "types": "build/src/index.d.ts", "repository": "open-telemetry/opentelemetry-js", "scripts": { - "lint": "gts check", - "lint:fix": "gts fix", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf build/*", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "precompile": "tsc --version", @@ -43,42 +43,40 @@ }, "devDependencies": { "@babel/core": "^7.6.0", - "@opentelemetry/context-zone": "^0.7.0", - "@opentelemetry/resources": "^0.7.0", + "@opentelemetry/context-zone": "^0.8.2", + "@opentelemetry/resources": "^0.8.2", "@types/jquery": "^3.3.31", "@types/mocha": "^7.0.0", - "@types/node": "^12.6.8", + "@types/node": "12.12.35", "@types/sinon": "^7.0.13", "@types/webpack-env": "1.13.9", "babel-loader": "^8.0.6", "codecov": "^3.6.1", - "gts": "^1.1.0", + "gts": "^2.0.0", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^4.4.1", + "karma": "^5.0.5", "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "^2.1.0", + "karma-coverage-istanbul-reporter": "^3.0.2", "karma-jquery": "^0.2.4", - "karma-mocha": "^1.3.0", + "karma-mocha": "^2.0.1", "karma-spec-reporter": "^0.0.32", "karma-webpack": "^4.0.2", - "mocha": "^6.1.0", + "mocha": "^7.1.2", "nyc": "^15.0.0", "rimraf": "^3.0.0", "sinon": "^7.5.0", "ts-loader": "^6.0.4", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "ts-node": "^8.6.2", - "tslint-consistent-codestyle": "^1.16.0", - "tslint-microsoft-contrib": "^6.2.0", "typescript": "3.7.2", "webpack": "^4.35.2", "webpack-cli": "^3.3.9", "webpack-merge": "^4.2.2" }, "dependencies": { - "@opentelemetry/api": "^0.7.0", - "@opentelemetry/context-base": "^0.7.0", - "@opentelemetry/core": "^0.7.0", - "@opentelemetry/tracing": "^0.7.0" + "@opentelemetry/api": "^0.8.2", + "@opentelemetry/context-base": "^0.8.2", + "@opentelemetry/core": "^0.8.2", + "@opentelemetry/tracing": "^0.8.2" } } diff --git a/packages/opentelemetry-web/src/StackContextManager.ts b/packages/opentelemetry-web/src/StackContextManager.ts index b1ec44b284..e91755fdeb 100644 --- a/packages/opentelemetry-web/src/StackContextManager.ts +++ b/packages/opentelemetry-web/src/StackContextManager.ts @@ -42,7 +42,7 @@ export class StackContextManager implements ContextManager { context = Context.ROOT_CONTEXT ): T { const manager = this; - const contextWrapper = function(this: any, ...args: any[]) { + const contextWrapper = function (this: any, ...args: any[]) { return manager.with(context, () => target.apply(this, args)); }; Object.defineProperty(contextWrapper, 'length', { @@ -113,8 +113,6 @@ export class StackContextManager implements ContextManager { try { return fn(); - } catch (err) { - throw err; } finally { this._currentContext = previousContext; } diff --git a/packages/opentelemetry-web/src/WebTracerProvider.ts b/packages/opentelemetry-web/src/WebTracerProvider.ts index 0dd8c1eb18..41200c455d 100644 --- a/packages/opentelemetry-web/src/WebTracerProvider.ts +++ b/packages/opentelemetry-web/src/WebTracerProvider.ts @@ -51,8 +51,10 @@ export class WebTracerProvider extends BasicTracerProvider { } if ((config as SDKRegistrationConfig).contextManager) { - throw 'contextManager should be defined in register method not in' + - ' constructor'; + throw ( + 'contextManager should be defined in register method not in' + + ' constructor' + ); } if ((config as SDKRegistrationConfig).propagator) { throw 'propagator should be defined in register method not in constructor'; diff --git a/packages/opentelemetry-web/src/version.ts b/packages/opentelemetry-web/src/version.ts index 103553581c..d34e2cff6d 100644 --- a/packages/opentelemetry-web/src/version.ts +++ b/packages/opentelemetry-web/src/version.ts @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ */ // this is autogenerated file, see scripts/version-update.js -export const VERSION = '0.7.0'; +export const VERSION = '0.8.2'; diff --git a/packages/opentelemetry-web/test/WebTracerProvider.test.ts b/packages/opentelemetry-web/test/WebTracerProvider.test.ts index 60007a4479..92f40ccdf0 100644 --- a/packages/opentelemetry-web/test/WebTracerProvider.test.ts +++ b/packages/opentelemetry-web/test/WebTracerProvider.test.ts @@ -59,7 +59,6 @@ describe('WebTracerProvider', () => { }); it('should enable all plugins', () => { - let options: WebTracerConfig; const dummyPlugin1 = new DummyPlugin(); const dummyPlugin2 = new DummyPlugin(); const spyEnable1 = sinon.spy(dummyPlugin1, 'enable'); @@ -67,7 +66,7 @@ describe('WebTracerProvider', () => { const plugins = [dummyPlugin1, dummyPlugin2]; - options = { plugins }; + const options = { plugins }; new WebTracerProvider(options); assert.ok(spyEnable1.calledOnce === true); diff --git a/packages/opentelemetry-web/tslint.json b/packages/opentelemetry-web/tslint.json deleted file mode 100644 index 0710b135d0..0000000000 --- a/packages/opentelemetry-web/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rulesDirectory": ["node_modules/tslint-microsoft-contrib"], - "extends": ["../../tslint.base.js", "./node_modules/tslint-consistent-codestyle"] -} diff --git a/scripts/version-update.js b/scripts/version-update.js index 0038e06397..720456fdef 100644 --- a/scripts/version-update.js +++ b/scripts/version-update.js @@ -1,5 +1,5 @@ -/*! - * Copyright 2019, OpenTelemetry Authors +/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,8 @@ const appRoot = process.cwd(); const packageJsonUrl = path.resolve(`${appRoot}/package.json`); const pjson = require(packageJsonUrl); -const content = `/*! - * Copyright 2019, OpenTelemetry Authors +const content = `/* + * Copyright 2020, OpenTelemetry Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tslint.base.js b/tslint.base.js deleted file mode 100644 index 32bfefc220..0000000000 --- a/tslint.base.js +++ /dev/null @@ -1,62 +0,0 @@ -/* ! - * Copyright 2019, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Note the `file-header` TS lint rule implicitly adds comments around this, and -// makes the first comment line begin with /*! -// See: -// https://github.com/palantir/tslint/blob/b2972495e05710fa55600c233bf46a8a5c02e3cd/src/rules/fileHeaderRule.ts#L224 -const fileHeaderTemplate = `Copyright YEAR_PLACEHOLDER, 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.`; - -const fileHeaderRegexStr = - fileHeaderTemplate - .replace(/[\\\/^$.*+?()[\]{}|]/g, '\\$&') // Escape regex - .replace(/\n/g, '\n \\* ?') // Per line space+asterisk, optional space - .replace('YEAR_PLACEHOLDER', '2\\d{3}'); - -const fileHeaderDefault = - fileHeaderTemplate.replace('YEAR_PLACEHOLDER', new Date().getFullYear()); - -const rules = { - 'file-header': [ - true, - { - 'allow-single-line-comments': false, - 'match': fileHeaderRegexStr, - 'default': fileHeaderDefault, - }, - ], - 'naming-convention': [true, - { 'type': 'property', 'modifiers': 'protected', 'leadingUnderscore': 'require' }, - { 'type': 'member', 'modifiers': 'private', 'leadingUnderscore': 'require' }, - { 'type': 'enumMember', 'format': 'UPPER_CASE' }, - ] -}; - -module.exports = { - rules, -};