From 8234bb82d835cc749d7439a086063a8d7c914358 Mon Sep 17 00:00:00 2001 From: Rauno Viskus Date: Fri, 22 Apr 2022 12:01:36 +0300 Subject: [PATCH 1/3] feat: implement HostDetector --- .../src/detectors/HostDetector.ts | 52 +++++++++++++++++++ .../src/detectors/index.ts | 3 +- .../test/detectors/node/HostDetector.test.ts | 45 ++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 packages/opentelemetry-resources/src/detectors/HostDetector.ts create mode 100644 packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts diff --git a/packages/opentelemetry-resources/src/detectors/HostDetector.ts b/packages/opentelemetry-resources/src/detectors/HostDetector.ts new file mode 100644 index 00000000000..a14c80c5e13 --- /dev/null +++ b/packages/opentelemetry-resources/src/detectors/HostDetector.ts @@ -0,0 +1,52 @@ +/* + * 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 { arch, hostname } from 'os'; + +/** + * HostDetector detects the resources related to the host current process is + * running on. Currently only non-cloud-based attributes are included. + */ +class HostDetector implements Detector { + async detect(_config?: ResourceDetectionConfig): Promise { + const attributes: ResourceAttributes = { + [SemanticResourceAttributes.HOST_NAME]: hostname(), + [SemanticResourceAttributes.HOST_ARCH]: this._normalizeArch(arch()), + }; + return new Resource(attributes); + } + + private _normalizeArch(nodeArchString: string): string { + // Maps from https://nodejs.org/api/os.html#osarch to arch values in spec: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/host.md + switch (nodeArchString) { + case 'arm': + return 'arm32'; + case 'ppc': + return 'ppc32'; + case 'x64': + return 'amd64'; + default: + return nodeArchString; + } + } +} + +export const hostDetector = new HostDetector(); diff --git a/packages/opentelemetry-resources/src/detectors/index.ts b/packages/opentelemetry-resources/src/detectors/index.ts index 3a69a099bcd..053e79f0ddc 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 './HostDetector'; export * from './ProcessDetector'; -export * from './BrowserDetector'; diff --git a/packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts b/packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts new file mode 100644 index 00000000000..2732eef6b54 --- /dev/null +++ b/packages/opentelemetry-resources/test/detectors/node/HostDetector.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 { hostDetector, Resource } from '../../../src'; + +describeNode('hostDetector() on Node.js', () => { + afterEach(() => { + sinon.restore(); + }); + + it('should return resource information from process', async () => { + const os = require('os'); + + sinon.stub(os, 'arch').returns('x64'); + sinon.stub(os, 'hostname').returns('opentelemetry-test'); + + const resource: Resource = await hostDetector.detect(); + + assert.strictEqual( + resource.attributes[SemanticResourceAttributes.HOST_NAME], + 'opentelemetry-test' + ); + assert.strictEqual( + resource.attributes[SemanticResourceAttributes.HOST_ARCH], + 'amd64' + ); + }); +}); From 912e046f659e82b3b76ba15747d767e1ae3962f9 Mon Sep 17 00:00:00 2001 From: Rauno Viskus Date: Fri, 22 Apr 2022 12:25:00 +0300 Subject: [PATCH 2/3] chore: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58c9a285f2e..7ef6db4ca40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ All notable changes to this project will be documented in this file. ### :rocket: (Enhancement) +* feat: implement HostDetector [#2921](https://github.com/open-telemetry/opentelemetry-js/pull/2921) @rauno56 + ### :bug: (Bug Fix) * fix: sanitize attributes inputs [#2881](https://github.com/open-telemetry/opentelemetry-js/pull/2881) @legendecas From 0bb9f9a627ea488df015b002c7dada51f8565ec4 Mon Sep 17 00:00:00 2001 From: Rauno Viskus Date: Fri, 22 Apr 2022 12:34:13 +0300 Subject: [PATCH 3/3] test: add a test for passing through a unknown arch string --- .../test/detectors/node/HostDetector.test.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts b/packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts index 2732eef6b54..3c809d500d1 100644 --- a/packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts +++ b/packages/opentelemetry-resources/test/detectors/node/HostDetector.test.ts @@ -25,7 +25,7 @@ describeNode('hostDetector() on Node.js', () => { sinon.restore(); }); - it('should return resource information from process', async () => { + it('should return resource information about the host', async () => { const os = require('os'); sinon.stub(os, 'arch').returns('x64'); @@ -42,4 +42,17 @@ describeNode('hostDetector() on Node.js', () => { 'amd64' ); }); + + it('should pass through arch string if unknown', async () => { + const os = require('os'); + + sinon.stub(os, 'arch').returns('some-unknown-arch'); + + const resource: Resource = await hostDetector.detect(); + + assert.strictEqual( + resource.attributes[SemanticResourceAttributes.HOST_ARCH], + 'some-unknown-arch' + ); + }); });