From 433e024592cd5cb3cea8eafaf2ab48348bce5cde Mon Sep 17 00:00:00 2001 From: legendecas Date: Tue, 31 May 2022 00:09:42 +0800 Subject: [PATCH] fix(resources): fix browser compatibility for host and os detectors --- CHANGELOG.md | 2 ++ .../opentelemetry-resources/karma.worker.js | 24 ++++++++++++++ packages/opentelemetry-resources/package.json | 2 ++ .../src/detectors/BrowserDetector.ts | 4 +-- .../src/detectors/NoopDetector.ts | 26 +++++++++++++++ .../src/detectors/index.ts | 2 -- .../src/platform/browser/HostDetector.ts | 19 +++++++++++ .../src/platform/browser/OSDetector.ts | 19 +++++++++++ .../src/platform/browser/index.ts | 2 ++ .../node}/HostDetector.ts | 6 ++-- .../node}/OSDetector.ts | 6 ++-- .../src/platform/node/index.ts | 2 ++ .../detectors/browser/BrowserDetector.test.ts | 7 ++-- .../detectors/browser/HostDetector.test.ts | 32 +++++++++++++++++++ .../test/detectors/browser/OSDetector.test.ts | 32 +++++++++++++++++++ .../test/index-webpack.worker.ts | 25 +++++++++++++++ 16 files changed, 195 insertions(+), 15 deletions(-) create mode 100644 packages/opentelemetry-resources/karma.worker.js create mode 100644 packages/opentelemetry-resources/src/detectors/NoopDetector.ts create mode 100644 packages/opentelemetry-resources/src/platform/browser/HostDetector.ts create mode 100644 packages/opentelemetry-resources/src/platform/browser/OSDetector.ts rename packages/opentelemetry-resources/src/{detectors => platform/node}/HostDetector.ts (91%) rename packages/opentelemetry-resources/src/{detectors => platform/node}/OSDetector.ts (91%) create mode 100644 packages/opentelemetry-resources/test/detectors/browser/HostDetector.test.ts create mode 100644 packages/opentelemetry-resources/test/detectors/browser/OSDetector.test.ts create mode 100644 packages/opentelemetry-resources/test/index-webpack.worker.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index cfe79dbedb6..32b1921bdd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ All notable changes to this project will be documented in this file. ### :bug: (Bug Fix) +* fix(resources): fix browser compatibility for host and os detectors [#3004](https://github.com/open-telemetry/opentelemetry-js/pull/3004) @legendecas + ### :books: (Refine Doc) ### :house: (Internal) diff --git a/packages/opentelemetry-resources/karma.worker.js b/packages/opentelemetry-resources/karma.worker.js new file mode 100644 index 00000000000..d392e58ba60 --- /dev/null +++ b/packages/opentelemetry-resources/karma.worker.js @@ -0,0 +1,24 @@ +/*! + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const karmaWebpackConfig = require('../../karma.webpack'); +const karmaBaseConfig = require('../../karma.worker'); + +module.exports = (config) => { + config.set(Object.assign({}, karmaBaseConfig, { + webpack: karmaWebpackConfig + })) +}; diff --git a/packages/opentelemetry-resources/package.json b/packages/opentelemetry-resources/package.json index eca04be76da..faee9bdbad3 100644 --- a/packages/opentelemetry-resources/package.json +++ b/packages/opentelemetry-resources/package.json @@ -18,10 +18,12 @@ "compile": "tsc --build tsconfig.all.json", "clean": "tsc --build --clean tsconfig.all.json", "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", + "codecov:webworker": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "test:browser": "nyc karma start --single-run", + "test:webworker": "nyc karma start karma.worker.js --single-run", "tdd": "npm run test -- --watch-extensions ts --watch", "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", "version": "node ../../scripts/version-update.js", diff --git a/packages/opentelemetry-resources/src/detectors/BrowserDetector.ts b/packages/opentelemetry-resources/src/detectors/BrowserDetector.ts index a3568c29584..1f16e126e80 100644 --- a/packages/opentelemetry-resources/src/detectors/BrowserDetector.ts +++ b/packages/opentelemetry-resources/src/detectors/BrowserDetector.ts @@ -24,14 +24,14 @@ import { ResourceAttributes } from '../types'; */ class BrowserDetector implements Detector { async detect(config?: ResourceDetectionConfig): Promise { - const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'; + const isBrowser = typeof navigator !== 'undefined'; if (!isBrowser) { return Resource.empty(); } const browserResource: ResourceAttributes = { [SemanticResourceAttributes.PROCESS_RUNTIME_NAME]: 'browser', [SemanticResourceAttributes.PROCESS_RUNTIME_DESCRIPTION]: 'Web Browser', - [SemanticResourceAttributes.PROCESS_RUNTIME_VERSION]: window.navigator.userAgent + [SemanticResourceAttributes.PROCESS_RUNTIME_VERSION]: navigator.userAgent }; return this._getResourceAttributes(browserResource, config); } diff --git a/packages/opentelemetry-resources/src/detectors/NoopDetector.ts b/packages/opentelemetry-resources/src/detectors/NoopDetector.ts new file mode 100644 index 00000000000..61cf954bf7a --- /dev/null +++ b/packages/opentelemetry-resources/src/detectors/NoopDetector.ts @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Resource } from '../Resource'; +import { Detector } from '../types'; + +export class NoopDetector implements Detector { + async detect(): Promise { + return new Resource({}); + } +} + +export const noopDetector = new NoopDetector(); diff --git a/packages/opentelemetry-resources/src/detectors/index.ts b/packages/opentelemetry-resources/src/detectors/index.ts index db9296d2661..2a16563da53 100644 --- a/packages/opentelemetry-resources/src/detectors/index.ts +++ b/packages/opentelemetry-resources/src/detectors/index.ts @@ -16,6 +16,4 @@ export * from './BrowserDetector'; export * from './EnvDetector'; -export * from './OSDetector'; -export * from './HostDetector'; export * from './ProcessDetector'; diff --git a/packages/opentelemetry-resources/src/platform/browser/HostDetector.ts b/packages/opentelemetry-resources/src/platform/browser/HostDetector.ts new file mode 100644 index 00000000000..e8e4c942c65 --- /dev/null +++ b/packages/opentelemetry-resources/src/platform/browser/HostDetector.ts @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { noopDetector } from '../../detectors/NoopDetector'; + +export const hostDetector = noopDetector; diff --git a/packages/opentelemetry-resources/src/platform/browser/OSDetector.ts b/packages/opentelemetry-resources/src/platform/browser/OSDetector.ts new file mode 100644 index 00000000000..27935fe1350 --- /dev/null +++ b/packages/opentelemetry-resources/src/platform/browser/OSDetector.ts @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { noopDetector } from '../../detectors/NoopDetector'; + +export const osDetector = noopDetector; diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index 742d36add7d..6f3af40a450 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -16,3 +16,5 @@ export * from './default-service-name'; export * from './detect-resources'; +export * from './HostDetector'; +export * from './OSDetector'; diff --git a/packages/opentelemetry-resources/src/detectors/HostDetector.ts b/packages/opentelemetry-resources/src/platform/node/HostDetector.ts similarity index 91% rename from packages/opentelemetry-resources/src/detectors/HostDetector.ts rename to packages/opentelemetry-resources/src/platform/node/HostDetector.ts index a14c80c5e13..c27766bb925 100644 --- a/packages/opentelemetry-resources/src/detectors/HostDetector.ts +++ b/packages/opentelemetry-resources/src/platform/node/HostDetector.ts @@ -15,9 +15,9 @@ */ import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; -import { Resource } from '../Resource'; -import { Detector, ResourceAttributes } from '../types'; -import { ResourceDetectionConfig } from '../config'; +import { Resource } from '../../Resource'; +import { Detector, ResourceAttributes } from '../../types'; +import { ResourceDetectionConfig } from '../../config'; import { arch, hostname } from 'os'; /** diff --git a/packages/opentelemetry-resources/src/detectors/OSDetector.ts b/packages/opentelemetry-resources/src/platform/node/OSDetector.ts similarity index 91% rename from packages/opentelemetry-resources/src/detectors/OSDetector.ts rename to packages/opentelemetry-resources/src/platform/node/OSDetector.ts index 979b48fda0a..befa9fb1f63 100644 --- a/packages/opentelemetry-resources/src/detectors/OSDetector.ts +++ b/packages/opentelemetry-resources/src/platform/node/OSDetector.ts @@ -15,9 +15,9 @@ */ import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; -import { Resource } from '../Resource'; -import { Detector, ResourceAttributes } from '../types'; -import { ResourceDetectionConfig } from '../config'; +import { Resource } from '../../Resource'; +import { Detector, ResourceAttributes } from '../../types'; +import { ResourceDetectionConfig } from '../../config'; import { platform, release } from 'os'; /** diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index 742d36add7d..6f3af40a450 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -16,3 +16,5 @@ export * from './default-service-name'; export * from './detect-resources'; +export * from './HostDetector'; +export * from './OSDetector'; diff --git a/packages/opentelemetry-resources/test/detectors/browser/BrowserDetector.test.ts b/packages/opentelemetry-resources/test/detectors/browser/BrowserDetector.test.ts index 7543d294386..ee6a92cccec 100644 --- a/packages/opentelemetry-resources/test/detectors/browser/BrowserDetector.test.ts +++ b/packages/opentelemetry-resources/test/detectors/browser/BrowserDetector.test.ts @@ -22,15 +22,13 @@ import { assertEmptyResource, } from '../../util/resource-assertions'; - describeBrowser('browserDetector()', () => { - afterEach(() => { sinon.restore(); }); it('should return browser information', async () => { - sinon.stub(window, 'navigator').value({ + sinon.stub(globalThis, 'navigator').value({ userAgent: 'dddd', }); @@ -42,11 +40,10 @@ describeBrowser('browserDetector()', () => { }); }); it('should return empty resources if version is missing', async () => { - sinon.stub(window, 'navigator').value({ + sinon.stub(globalThis, 'navigator').value({ userAgent: '', }); const resource: Resource = await browserDetector.detect(); assertEmptyResource(resource); }); }); - diff --git a/packages/opentelemetry-resources/test/detectors/browser/HostDetector.test.ts b/packages/opentelemetry-resources/test/detectors/browser/HostDetector.test.ts new file mode 100644 index 00000000000..8bebadb7c4e --- /dev/null +++ b/packages/opentelemetry-resources/test/detectors/browser/HostDetector.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as sinon from 'sinon'; +import { hostDetector, Resource } from '../../../src'; +import { + assertEmptyResource, +} from '../../util/resource-assertions'; +import { describeBrowser } from '../../util'; + +describeBrowser('hostDetector() on web browser', () => { + afterEach(() => { + sinon.restore(); + }); + + it('should return empty resource', async () => { + const resource: Resource = await hostDetector.detect(); + assertEmptyResource(resource); + }); +}); diff --git a/packages/opentelemetry-resources/test/detectors/browser/OSDetector.test.ts b/packages/opentelemetry-resources/test/detectors/browser/OSDetector.test.ts new file mode 100644 index 00000000000..72f0dc6fa60 --- /dev/null +++ b/packages/opentelemetry-resources/test/detectors/browser/OSDetector.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as sinon from 'sinon'; +import { osDetector, Resource } from '../../../src'; +import { + assertEmptyResource, +} from '../../util/resource-assertions'; +import { describeBrowser } from '../../util'; + +describeBrowser('osDetector() on web browser', () => { + afterEach(() => { + sinon.restore(); + }); + + it('should return empty resource', async () => { + const resource: Resource = await osDetector.detect(); + assertEmptyResource(resource); + }); +}); diff --git a/packages/opentelemetry-resources/test/index-webpack.worker.ts b/packages/opentelemetry-resources/test/index-webpack.worker.ts new file mode 100644 index 00000000000..dd9b144e0de --- /dev/null +++ b/packages/opentelemetry-resources/test/index-webpack.worker.ts @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + const testsContext = require.context('./', false, /test$/); + testsContext.keys().forEach(testsContext); +} + +{ + const testsContext = require.context('./detectors/browser', false, /test$/); + testsContext.keys().forEach(testsContext); +}