Skip to content

Commit

Permalink
feat: implement OSDetector (#2927)
Browse files Browse the repository at this point in the history
Co-authored-by: Valentin Marchaud <[email protected]>
  • Loading branch information
rauno56 and vmarchaud authored Apr 30, 2022
1 parent df77c62 commit ddb0775
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
50 changes: 50 additions & 0 deletions packages/opentelemetry-resources/src/detectors/OSDetector.ts
Original file line number Diff line number Diff line change
@@ -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<Resource> {
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();
1 change: 1 addition & 0 deletions packages/opentelemetry-resources/src/detectors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@

export * from './BrowserDetector';
export * from './EnvDetector';
export * from './OSDetector';
export * from './HostDetector';
export * from './ProcessDetector';
Original file line number Diff line number Diff line change
@@ -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'
);
});
});

0 comments on commit ddb0775

Please sign in to comment.