From 18a5731a409551103bd8c9ed7bd02f2f59fe5536 Mon Sep 17 00:00:00 2001 From: David Luna Date: Wed, 7 Aug 2024 15:57:08 +0200 Subject: [PATCH] feat(detector-container)!: change implementation to DetectorSync interface (#2334) --- .../package.json | 2 +- .../src/detectors/ContainerDetector.ts | 27 ++++++++++++++----- .../test/ContainerDetector.test.ts | 23 ++++++++++------ package-lock.json | 4 +-- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/detectors/node/opentelemetry-resource-detector-container/package.json b/detectors/node/opentelemetry-resource-detector-container/package.json index 06fb2824bb..dd7c0a9295 100644 --- a/detectors/node/opentelemetry-resource-detector-container/package.json +++ b/detectors/node/opentelemetry-resource-detector-container/package.json @@ -51,7 +51,7 @@ "@opentelemetry/api": "^1.0.0" }, "dependencies": { - "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.22.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/detectors/node/opentelemetry-resource-detector-container#readme" diff --git a/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts b/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts index ff204d8087..8d92feda6c 100644 --- a/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts @@ -14,8 +14,10 @@ * limitations under the License. */ import { - Detector, + DetectorSync, + IResource, Resource, + ResourceAttributes, ResourceDetectionConfig, } from '@opentelemetry/resources'; @@ -26,7 +28,7 @@ import * as util from 'util'; import { diag } from '@opentelemetry/api'; import { extractContainerIdFromLine } from './utils'; -export class ContainerDetector implements Detector { +export class ContainerDetector implements DetectorSync { readonly CONTAINER_ID_LENGTH = 64; readonly DEFAULT_CGROUP_V1_PATH = '/proc/self/cgroup'; readonly DEFAULT_CGROUP_V2_PATH = '/proc/self/mountinfo'; @@ -40,20 +42,31 @@ export class ContainerDetector implements Detector { private static readFileAsync = util.promisify(fs.readFile); - async detect(_config?: ResourceDetectionConfig): Promise { + detect(_config?: ResourceDetectionConfig): IResource { + return new Resource({}, this._getAttributes()); + } + + /** + * Attempts to obtain the container ID from the file system. If the + * file read is successful it returns a promise containing a {@link ResourceAttributes} + * object with the container ID. Returns a promise containing an + * empty {@link ResourceAttributes} if the paths do not exist or fail + * to read. + */ + async _getAttributes(): Promise { try { const containerId = await this._getContainerId(); return !containerId - ? Resource.empty() - : new Resource({ + ? {} + : { [SEMRESATTRS_CONTAINER_ID]: containerId, - }); + }; } catch (e) { diag.info( 'Container Detector did not identify running inside a supported container, no container attributes will be added to resource: ', e ); - return Resource.empty(); + return {}; } } diff --git a/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts index e39748f994..51b3c41120 100644 --- a/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts @@ -16,7 +16,7 @@ import * as sinon from 'sinon'; import * as assert from 'assert'; -import { Resource } from '@opentelemetry/resources'; + import { containerDetector } from '../src'; import { assertContainerResource, @@ -46,7 +46,8 @@ describe('ContainerDetector', () => { .stub(ContainerDetector, 'readFileAsync' as any) .resolves(undefined); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); assert.deepStrictEqual(resource.attributes, {}); assert.ok(resource); @@ -57,7 +58,8 @@ describe('ContainerDetector', () => { .stub(ContainerDetector, 'readFileAsync' as any) .resolves(correctCgroupV1Data); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); sinon.assert.calledOnce(readStub); @@ -73,7 +75,8 @@ describe('ContainerDetector', () => { readStub.onFirstCall().resolves(''); readStub.onSecondCall().resolves(correctCgroupV2Data); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); sinon.assert.calledTwice(readStub); assert.ok(resource); @@ -88,7 +91,8 @@ describe('ContainerDetector', () => { readStub.onFirstCall().resolves(''); readStub.onSecondCall().resolves(wrongCgroupV2Data); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); sinon.assert.calledTwice(readStub); assert.ok(resource); @@ -109,7 +113,8 @@ describe('ContainerDetector', () => { .stub(ContainerDetector, 'readFileAsync' as any) .resolves(''); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); assert.deepStrictEqual(resource.attributes, {}); sinon.assert.calledTwice(readStub); @@ -125,7 +130,8 @@ describe('ContainerDetector', () => { .stub(ContainerDetector, 'readFileAsync' as any) .rejects(errorMsg.fileNotFoundError); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); sinon.assert.calledOnce(readStub); assertEmptyResource(resource); @@ -142,7 +148,8 @@ describe('ContainerDetector', () => { .stub(ContainerDetector, 'readFileAsync' as any) .rejects(errorMsg.fileNotFoundError); - const resource: Resource = await containerDetector.detect(); + const resource = containerDetector.detect(); + await resource.waitForAsyncAttributes?.(); sinon.assert.calledOnce(readStub); assertEmptyResource(resource); }); diff --git a/package-lock.json b/package-lock.json index c950b263c2..776dffa5eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -148,7 +148,7 @@ "version": "0.3.11", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.22.0" }, "devDependencies": { @@ -55544,7 +55544,7 @@ "requires": { "@opentelemetry/api": "^1.0.0", "@opentelemetry/contrib-test-utils": "^0.40.0", - "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.22.0", "@types/mocha": "8.2.3", "@types/node": "18.6.5",