diff --git a/CHANGELOG.md b/CHANGELOG.md index 46675ded27..6c5dbd9bc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. * feat(ConsoleSpanExporter): export span links [#2917](https://github.com/open-telemetry/opentelemetry-js/pull/2917) @trentm * feat: warn when hooked module is already loaded [#2926](https://github.com/open-telemetry/opentelemetry-js/pull/2926) @nozik +* feat: implement OSDetector [#2927](https://github.com/open-telemetry/opentelemetry-js/pull/2927) @rauno56 * feat: implement HostDetector [#2921](https://github.com/open-telemetry/opentelemetry-js/pull/2921) @rauno56 ### :bug: (Bug Fix) diff --git a/packages/opentelemetry-resources/src/detectors/OSDetector.ts b/packages/opentelemetry-resources/src/detectors/OSDetector.ts new file mode 100644 index 0000000000..979b48fda0 --- /dev/null +++ b/packages/opentelemetry-resources/src/detectors/OSDetector.ts @@ -0,0 +1,50 @@ +/* + * 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 { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { Resource } from '../Resource'; +import { Detector, ResourceAttributes } from '../types'; +import { ResourceDetectionConfig } from '../config'; +import { platform, release } from 'os'; + +/** + * OSDetector detects the resources related to the operating system (OS) on + * which the process represented by this resource is running. + */ +class OSDetector implements Detector { + async detect(_config?: ResourceDetectionConfig): Promise { + const attributes: ResourceAttributes = { + [SemanticResourceAttributes.OS_TYPE]: this._normalizeType(platform()), + [SemanticResourceAttributes.OS_VERSION]: release(), + }; + return new Resource(attributes); + } + + private _normalizeType(nodePlatform: string): string { + // Maps from https://nodejs.org/api/os.html#osplatform to arch values in spec: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/os.md + switch (nodePlatform) { + case 'sunos': + return 'solaris'; + case 'win32': + return 'windows'; + default: + return nodePlatform; + } + } +} + +export const osDetector = new OSDetector(); diff --git a/packages/opentelemetry-resources/src/detectors/index.ts b/packages/opentelemetry-resources/src/detectors/index.ts index 053e79f0dd..db9296d266 100644 --- a/packages/opentelemetry-resources/src/detectors/index.ts +++ b/packages/opentelemetry-resources/src/detectors/index.ts @@ -16,5 +16,6 @@ export * from './BrowserDetector'; export * from './EnvDetector'; +export * from './OSDetector'; export * from './HostDetector'; export * from './ProcessDetector'; diff --git a/packages/opentelemetry-resources/test/detectors/node/OSDetector.test.ts b/packages/opentelemetry-resources/test/detectors/node/OSDetector.test.ts new file mode 100644 index 0000000000..dd3ec3e24b --- /dev/null +++ b/packages/opentelemetry-resources/test/detectors/node/OSDetector.test.ts @@ -0,0 +1,58 @@ +/* + * 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 * as assert from 'assert'; +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { describeNode } from '../../util'; +import { osDetector, Resource } from '../../../src'; + +describeNode('osDetector() on Node.js', () => { + afterEach(() => { + sinon.restore(); + }); + + it('should return resource information from process', async () => { + const os = require('os'); + + sinon.stub(os, 'platform').returns('win32'); + sinon.stub(os, 'release').returns('2.2.1(0.289/5/3)'); + + const resource: Resource = await osDetector.detect(); + + assert.strictEqual( + resource.attributes[SemanticResourceAttributes.OS_TYPE], + 'windows' + ); + assert.strictEqual( + resource.attributes[SemanticResourceAttributes.OS_VERSION], + '2.2.1(0.289/5/3)' + ); + }); + + it('should pass through type string if unknown', async () => { + const os = require('os'); + + sinon.stub(os, 'platform').returns('some-unknown-platform'); + + const resource: Resource = await osDetector.detect(); + + assert.strictEqual( + resource.attributes[SemanticResourceAttributes.OS_TYPE], + 'some-unknown-platform' + ); + }); +});