From e272cc65be142eab16a131bc701f24417d92fcca Mon Sep 17 00:00:00 2001 From: Rauno Viskus Date: Fri, 22 Apr 2022 13:04:59 +0300 Subject: [PATCH] feat: add OSDetector --- .../src/detectors/OSDetector.ts | 50 +++++++++++++++++++ .../src/detectors/index.ts | 3 +- .../test/detectors/node/OSDetector.test.ts | 45 +++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 packages/opentelemetry-resources/src/detectors/OSDetector.ts create mode 100644 packages/opentelemetry-resources/test/detectors/node/OSDetector.test.ts diff --git a/packages/opentelemetry-resources/src/detectors/OSDetector.ts b/packages/opentelemetry-resources/src/detectors/OSDetector.ts new file mode 100644 index 00000000000..979b48fda0a --- /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 3a69a099bcd..90aff60128b 100644 --- a/packages/opentelemetry-resources/src/detectors/index.ts +++ b/packages/opentelemetry-resources/src/detectors/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +export * from './BrowserDetector'; export * from './EnvDetector'; +export * from './OSDetector'; export * from './ProcessDetector'; -export * from './BrowserDetector'; 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 00000000000..9fd83f09854 --- /dev/null +++ b/packages/opentelemetry-resources/test/detectors/node/OSDetector.test.ts @@ -0,0 +1,45 @@ +/* + * 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)' + ); + }); +});