Skip to content

Commit

Permalink
feat: add OSDetector
Browse files Browse the repository at this point in the history
  • Loading branch information
rauno56 committed Apr 25, 2022
1 parent 4584c36 commit 056c660
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 1 deletion.
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();
3 changes: 2 additions & 1 deletion packages/opentelemetry-resources/src/detectors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* limitations under the License.
*/

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

0 comments on commit 056c660

Please sign in to comment.