diff --git a/CHANGELOG.md b/CHANGELOG.md index 523099cf3c..46675ded27 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 HostDetector [#2921](https://github.com/open-telemetry/opentelemetry-js/pull/2921) @rauno56 ### :bug: (Bug Fix) diff --git a/packages/opentelemetry-resources/src/detectors/HostDetector.ts b/packages/opentelemetry-resources/src/detectors/HostDetector.ts new file mode 100644 index 0000000000..a14c80c5e1 --- /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 3a69a099bc..053e79f0dd 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 0000000000..3c809d500d --- /dev/null +++ b/packages/opentelemetry-resources/test/detectors/node/HostDetector.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 { hostDetector, Resource } from '../../../src'; + +describeNode('hostDetector() on Node.js', () => { + afterEach(() => { + sinon.restore(); + }); + + it('should return resource information about the host', 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' + ); + }); + + 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' + ); + }); +});