From ad893340d96829d8bdc57a561956df01da269188 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Sat, 3 Sep 2022 22:24:21 -0400 Subject: [PATCH 01/18] added another block to test for v2 --- .../src/detectors/DockerCGroupV1Detector.ts | 26 ++- .../src/detectors/index.ts | 2 +- .../test/DockerCGroupv1Detector.test.ts | 182 +++++++++--------- 3 files changed, 112 insertions(+), 98 deletions(-) diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerCGroupV1Detector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerCGroupV1Detector.ts index 8b2ee77fa2..09dc407d62 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerCGroupV1Detector.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerCGroupV1Detector.ts @@ -25,9 +25,10 @@ import * as fs from 'fs'; import * as util from 'util'; import { diag } from '@opentelemetry/api'; -export class DockerCGroupV1Detector implements Detector { +export class DockerDetector implements Detector { readonly CONTAINER_ID_LENGTH = 64; readonly DEFAULT_CGROUP_PATH = '/proc/self/cgroup'; + readonly DEFAULT_CGROUP_V2_PATH = '/proc/self/mountinfo'; readonly UTF8_UNICODE = 'utf8'; private static readFileAsync = util.promisify(fs.readFile); @@ -42,7 +43,7 @@ export class DockerCGroupV1Detector implements Detector { }); } catch (e) { diag.info( - 'Docker CGROUP V1 Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', + 'Docker Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', e ); return Resource.empty(); @@ -51,21 +52,34 @@ export class DockerCGroupV1Detector implements Detector { private async _getContainerId(): Promise { try { - const rawData = await DockerCGroupV1Detector.readFileAsync( + let rawData = await DockerDetector.readFileAsync( this.DEFAULT_CGROUP_PATH, this.UTF8_UNICODE ); - const splitData = rawData.trim().split('\n'); + let splitData = rawData.trim().split('\n'); for (const str of splitData) { if (str.length >= this.CONTAINER_ID_LENGTH) { return str.substring(str.length - this.CONTAINER_ID_LENGTH); } } + // If this code is reached - we then check for the V2_PATH + rawData = await DockerDetector.readFileAsync( + this.DEFAULT_CGROUP_V2_PATH, + this.UTF8_UNICODE + ); + + splitData = rawData.trim().split('\n'); + for (const str of splitData) { + if (str.length >= this.CONTAINER_ID_LENGTH) { + return str.substring(str.length - this.CONTAINER_ID_LENGTH); + } + } + } catch (e) { if (e instanceof Error) { const errorMessage = e.message; diag.info( - 'Docker CGROUP V1 Detector failed to read the Container ID: ', + 'Docker Detector failed to read the Container ID: ', errorMessage ); } @@ -74,4 +88,4 @@ export class DockerCGroupV1Detector implements Detector { } } -export const dockerCGroupV1Detector = new DockerCGroupV1Detector(); +export const dockerDetector = new DockerDetector(); diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts index 25aa53ab9a..1af43c312b 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './DockerCGroupV1Detector'; +export * from './DockerDetector'; diff --git a/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts b/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts index 7911545427..717550b2ba 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts @@ -1,91 +1,91 @@ -/* - * 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 { Resource } from '@opentelemetry/resources'; -import { dockerCGroupV1Detector } from '../src'; -import { - assertContainerResource, - assertEmptyResource, -} from '@opentelemetry/contrib-test-utils'; - -import { DockerCGroupV1Detector } from '../src'; - -describe('dockerCGroupV1Detector', () => { - let readStub; - const correctCgroupData = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; - - afterEach(() => { - sinon.restore(); - }); - - describe('Supported docker - Container ID ', () => { - it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { - readStub = sinon - .stub(DockerCGroupV1Detector, 'readFileAsync' as any) - .resolves(undefined); - - const resource: Resource = await dockerCGroupV1Detector.detect(); - - assert.deepStrictEqual(resource.attributes, {}); - assert.ok(resource); - }); - - it('should return a resource with container ID with a valid container ID present', async () => { - readStub = sinon - .stub(DockerCGroupV1Detector, 'readFileAsync' as any) - .resolves(correctCgroupData); - - const resource: Resource = await dockerCGroupV1Detector.detect(); - - sinon.assert.calledOnce(readStub); - - assert.ok(resource); - assertContainerResource(resource, { - id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', - }); - }); - - it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { - readStub = sinon - .stub(DockerCGroupV1Detector, 'readFileAsync' as any) - .resolves(''); - - const resource: Resource = await dockerCGroupV1Detector.detect(); - assert.deepStrictEqual(resource.attributes, {}); - - sinon.assert.calledOnce(readStub); - assert.ok(resource); - }); - - it('should return an empty resource when containerId is not valid', async () => { - const errorMsg = { - fileNotFoundError: new Error('cannot find file in path'), - }; - - readStub = sinon - .stub(DockerCGroupV1Detector, 'readFileAsync' as any) - .rejects(errorMsg.fileNotFoundError); - - const resource: Resource = await dockerCGroupV1Detector.detect(); - - sinon.assert.calledOnce(readStub); - assertEmptyResource(resource); - }); - }); -}); +// /* +// * 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 { Resource } from '@opentelemetry/resources'; +// import { dockerCGroupV1Detector } from '../src'; +// import { +// assertContainerResource, +// assertEmptyResource, +// } from '@opentelemetry/contrib-test-utils'; + +// import { DockerCGroupV1Detector } from '../src'; + +// describe('dockerCGroupV1Detector', () => { +// let readStub; +// const correctCgroupData = +// 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; + +// afterEach(() => { +// sinon.restore(); +// }); + +// describe('Supported docker - Container ID ', () => { +// it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { +// readStub = sinon +// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) +// .resolves(undefined); + +// const resource: Resource = await dockerCGroupV1Detector.detect(); + +// assert.deepStrictEqual(resource.attributes, {}); +// assert.ok(resource); +// }); + +// it('should return a resource with container ID with a valid container ID present', async () => { +// readStub = sinon +// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) +// .resolves(correctCgroupData); + +// const resource: Resource = await dockerCGroupV1Detector.detect(); + +// sinon.assert.calledOnce(readStub); + +// assert.ok(resource); +// assertContainerResource(resource, { +// id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', +// }); +// }); + +// it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { +// readStub = sinon +// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) +// .resolves(''); + +// const resource: Resource = await dockerCGroupV1Detector.detect(); +// assert.deepStrictEqual(resource.attributes, {}); + +// sinon.assert.calledOnce(readStub); +// assert.ok(resource); +// }); + +// it('should return an empty resource when containerId is not valid', async () => { +// const errorMsg = { +// fileNotFoundError: new Error('cannot find file in path'), +// }; + +// readStub = sinon +// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) +// .rejects(errorMsg.fileNotFoundError); + +// const resource: Resource = await dockerCGroupV1Detector.detect(); + +// sinon.assert.calledOnce(readStub); +// assertEmptyResource(resource); +// }); +// }); +// }); From 37d45cb5962d75a99609b534f730f306b2b2760d Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Sun, 4 Sep 2022 00:33:08 -0400 Subject: [PATCH 02/18] feat: changing export name to reflect generic docker --- .../detectors/{DockerCGroupV1Detector.ts => DockerDetector.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename detectors/node/opentelemetry-resource-detector-docker/src/detectors/{DockerCGroupV1Detector.ts => DockerDetector.ts} (100%) diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerCGroupV1Detector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts similarity index 100% rename from detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerCGroupV1Detector.ts rename to detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts From d93395503795d816d250c53df84f79841c45d4bd Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Wed, 14 Sep 2022 22:11:07 -0400 Subject: [PATCH 03/18] feat: adding geenric naming and logic changes to support cgroup v2 --- .../src/detectors/DockerDetector.ts | 11 ++- .../test/DockerCGroupv1Detector.test.ts | 91 ------------------- 2 files changed, 6 insertions(+), 96 deletions(-) delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts index 09dc407d62..ee83138072 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts @@ -62,6 +62,7 @@ export class DockerDetector implements Detector { return str.substring(str.length - this.CONTAINER_ID_LENGTH); } } + // If this code is reached - we then check for the V2_PATH rawData = await DockerDetector.readFileAsync( this.DEFAULT_CGROUP_V2_PATH, @@ -69,12 +70,12 @@ export class DockerDetector implements Detector { ); splitData = rawData.trim().split('\n'); - for (const str of splitData) { - if (str.length >= this.CONTAINER_ID_LENGTH) { - return str.substring(str.length - this.CONTAINER_ID_LENGTH); - } + for (let str of splitData) { + str = str + .split('/') + .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0]; + return str.substring(str.length - this.CONTAINER_ID_LENGTH); } - } catch (e) { if (e instanceof Error) { const errorMessage = e.message; diff --git a/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts b/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts deleted file mode 100644 index 717550b2ba..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/test/DockerCGroupv1Detector.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -// /* -// * 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 { Resource } from '@opentelemetry/resources'; -// import { dockerCGroupV1Detector } from '../src'; -// import { -// assertContainerResource, -// assertEmptyResource, -// } from '@opentelemetry/contrib-test-utils'; - -// import { DockerCGroupV1Detector } from '../src'; - -// describe('dockerCGroupV1Detector', () => { -// let readStub; -// const correctCgroupData = -// 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; - -// afterEach(() => { -// sinon.restore(); -// }); - -// describe('Supported docker - Container ID ', () => { -// it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { -// readStub = sinon -// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) -// .resolves(undefined); - -// const resource: Resource = await dockerCGroupV1Detector.detect(); - -// assert.deepStrictEqual(resource.attributes, {}); -// assert.ok(resource); -// }); - -// it('should return a resource with container ID with a valid container ID present', async () => { -// readStub = sinon -// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) -// .resolves(correctCgroupData); - -// const resource: Resource = await dockerCGroupV1Detector.detect(); - -// sinon.assert.calledOnce(readStub); - -// assert.ok(resource); -// assertContainerResource(resource, { -// id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', -// }); -// }); - -// it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { -// readStub = sinon -// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) -// .resolves(''); - -// const resource: Resource = await dockerCGroupV1Detector.detect(); -// assert.deepStrictEqual(resource.attributes, {}); - -// sinon.assert.calledOnce(readStub); -// assert.ok(resource); -// }); - -// it('should return an empty resource when containerId is not valid', async () => { -// const errorMsg = { -// fileNotFoundError: new Error('cannot find file in path'), -// }; - -// readStub = sinon -// .stub(DockerCGroupV1Detector, 'readFileAsync' as any) -// .rejects(errorMsg.fileNotFoundError); - -// const resource: Resource = await dockerCGroupV1Detector.detect(); - -// sinon.assert.calledOnce(readStub); -// assertEmptyResource(resource); -// }); -// }); -// }); From 4ad530d66db568329128055f87f0bdd6b1b76cde Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Wed, 14 Sep 2022 22:56:46 -0400 Subject: [PATCH 04/18] test: test file renamed --- .../test/DockerDetector.test.ts | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts diff --git a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts new file mode 100644 index 0000000000..eefb398ae0 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts @@ -0,0 +1,107 @@ +/* + * 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 { Resource } from '@opentelemetry/resources'; +import { dockerDetector } from '../src'; +import { + assertContainerResource, + assertEmptyResource, +} from '@opentelemetry/contrib-test-utils'; + +import { DockerDetector } from '../src'; + +describe('dockerCGroupV1Detector', () => { + let readStub; + const correctCgroupData = + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; + + afterEach(() => { + sinon.restore(); + }); + + describe('Supported docker - Container ID ', () => { + it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { + readStub = sinon + .stub(DockerDetector, 'readFileAsync' as any) + .resolves(undefined); + + const resource: Resource = await dockerDetector.detect(); + + assert.deepStrictEqual(resource.attributes, {}); + assert.ok(resource); + }); + + it('should return a resource with container ID with a valid container ID present', async () => { + readStub = sinon + .stub(DockerDetector, 'readFileAsync' as any) + .resolves(correctCgroupData); + + const resource: Resource = await dockerDetector.detect(); + + sinon.assert.calledOnce(readStub); + + assert.ok(resource); + assertContainerResource(resource, { + id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', + }); + }); + + it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { + readStub = sinon + .stub(DockerDetector, 'readFileAsync' as any) + .resolves(''); + + const resource: Resource = await dockerDetector.detect(); + assert.deepStrictEqual(resource.attributes, {}); + + sinon.assert.calledOnce(readStub); + assert.ok(resource); + }); + + it('should return an empty resource when containerId is not valid', async () => { + const errorMsg = { + fileNotFoundError: new Error('cannot find file in path'), + }; + + readStub = sinon + .stub(DockerDetector, 'readFileAsync' as any) + .rejects(errorMsg.fileNotFoundError); + + const resource: Resource = await dockerDetector.detect(); + + sinon.assert.calledOnce(readStub); + assertEmptyResource(resource); + }); + + //cgroup v2 and containerd test + + it('should return an empty resource when containerId is not valid', async () => { + const errorMsg = { + fileNotFoundError: new Error('cannot find file in path'), + }; + + readStub = sinon + .stub(DockerDetector, 'readFileAsync' as any) + .rejects(errorMsg.fileNotFoundError); + + const resource: Resource = await dockerDetector.detect(); + sinon.assert.calledOnce(readStub); + assertEmptyResource(resource); + }); + }); +}); From 1ebd44551219afa6aa6851cfbdeb8889ba8c3139 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 16 Sep 2022 15:29:35 -0400 Subject: [PATCH 05/18] feat: adding hostname check --- .../src/detectors/DockerDetector.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts index ee83138072..e9ffa54e22 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts @@ -30,6 +30,7 @@ export class DockerDetector implements Detector { readonly DEFAULT_CGROUP_PATH = '/proc/self/cgroup'; readonly DEFAULT_CGROUP_V2_PATH = '/proc/self/mountinfo'; readonly UTF8_UNICODE = 'utf8'; + readonly HOSTNAME = "hostname"; private static readFileAsync = util.promisify(fs.readFile); @@ -71,9 +72,9 @@ export class DockerDetector implements Detector { splitData = rawData.trim().split('\n'); for (let str of splitData) { - str = str + str = str.includes(this.HOSTNAME) ? str .split('/') - .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0]; + .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0] : ""; return str.substring(str.length - this.CONTAINER_ID_LENGTH); } } catch (e) { From 5cd6324ea10c0b1f8ed68e003b75cec056c26dce Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 16 Sep 2022 15:36:05 -0400 Subject: [PATCH 06/18] feat: adding hostname check- refactor --- .../src/detectors/DockerDetector.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts index e9ffa54e22..a082f4900b 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts @@ -40,8 +40,8 @@ export class DockerDetector implements Detector { return !containerId ? Resource.empty() : new Resource({ - [SemanticResourceAttributes.CONTAINER_ID]: containerId, - }); + [SemanticResourceAttributes.CONTAINER_ID]: containerId, + }); } catch (e) { diag.info( 'Docker Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', @@ -72,10 +72,12 @@ export class DockerDetector implements Detector { splitData = rawData.trim().split('\n'); for (let str of splitData) { - str = str.includes(this.HOSTNAME) ? str - .split('/') - .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0] : ""; - return str.substring(str.length - this.CONTAINER_ID_LENGTH); + if (str.includes(this.HOSTNAME)) { + str + .split('/') + .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0]; + return str.substring(str.length - this.CONTAINER_ID_LENGTH); + } } } catch (e) { if (e instanceof Error) { From 132e06db682df076ee5bf5df14d261cf3fdd6b2a Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Sun, 18 Sep 2022 21:26:41 -0400 Subject: [PATCH 07/18] feat: fixed a test and fixed lint --- .../src/detectors/DockerDetector.ts | 8 ++++---- .../test/DockerDetector.test.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts index a082f4900b..635f7a1a26 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts @@ -30,7 +30,7 @@ export class DockerDetector implements Detector { readonly DEFAULT_CGROUP_PATH = '/proc/self/cgroup'; readonly DEFAULT_CGROUP_V2_PATH = '/proc/self/mountinfo'; readonly UTF8_UNICODE = 'utf8'; - readonly HOSTNAME = "hostname"; + readonly HOSTNAME = 'hostname'; private static readFileAsync = util.promisify(fs.readFile); @@ -40,8 +40,8 @@ export class DockerDetector implements Detector { return !containerId ? Resource.empty() : new Resource({ - [SemanticResourceAttributes.CONTAINER_ID]: containerId, - }); + [SemanticResourceAttributes.CONTAINER_ID]: containerId, + }); } catch (e) { diag.info( 'Docker Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', @@ -73,7 +73,7 @@ export class DockerDetector implements Detector { splitData = rawData.trim().split('\n'); for (let str of splitData) { if (str.includes(this.HOSTNAME)) { - str + str = str .split('/') .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0]; return str.substring(str.length - this.CONTAINER_ID_LENGTH); diff --git a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts index eefb398ae0..026c49a81a 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts @@ -69,7 +69,7 @@ describe('dockerCGroupV1Detector', () => { const resource: Resource = await dockerDetector.detect(); assert.deepStrictEqual(resource.attributes, {}); - sinon.assert.calledOnce(readStub); + sinon.assert.calledTwice(readStub); assert.ok(resource); }); From 0a61ba282e0661ace2e9d8d147caad93b85b0e22 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Sun, 18 Sep 2022 21:31:07 -0400 Subject: [PATCH 08/18] feat: added another condition to check for length --- .../src/detectors/DockerDetector.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts index 635f7a1a26..7bc8479cfc 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts @@ -76,7 +76,9 @@ export class DockerDetector implements Detector { str = str .split('/') .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0]; - return str.substring(str.length - this.CONTAINER_ID_LENGTH); + if (str.length >= this.CONTAINER_ID_LENGTH) { + return str.substring(str.length - this.CONTAINER_ID_LENGTH); + } } } } catch (e) { From 9ad9f528c451bf6f1cdb5c7fa11022ce188d2e31 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Sun, 18 Sep 2022 21:59:54 -0400 Subject: [PATCH 09/18] test: added two more tests --- .../test/DockerDetector.test.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts index 026c49a81a..a0c6ddb118 100644 --- a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts @@ -29,6 +29,11 @@ describe('dockerCGroupV1Detector', () => { let readStub; const correctCgroupData = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; + const correctCgroupV2Data = + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/hostname'; + + const wrongCgroupV2Data = + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/host'; afterEach(() => { sinon.restore(); @@ -61,6 +66,33 @@ describe('dockerCGroupV1Detector', () => { }); }); + it('should return a resource with container ID with a valid container ID present for v2', async () => { + readStub = sinon.stub(DockerDetector, 'readFileAsync' as any); + + readStub.onFirstCall().resolves(''); + readStub.onSecondCall().resolves(correctCgroupV2Data); + + const resource: Resource = await dockerDetector.detect(); + sinon.assert.calledTwice(readStub); + + assert.ok(resource); + assertContainerResource(resource, { + id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', + }); + }); + + it('should return a empty resource with failed hostname check for v2', async () => { + readStub = sinon.stub(DockerDetector, 'readFileAsync' as any); + + readStub.onFirstCall().resolves(''); + readStub.onSecondCall().resolves(wrongCgroupV2Data); + + const resource: Resource = await dockerDetector.detect(); + sinon.assert.calledTwice(readStub); + + assert.ok(resource); + }); + it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { readStub = sinon .stub(DockerDetector, 'readFileAsync' as any) From 5e626e902ae505a1898f093017174a45b0f4c89a Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Mon, 19 Sep 2022 22:41:32 -0400 Subject: [PATCH 10/18] feat: renamed docker to container and addressed pr comments --- .../.eslintignore | 1 - .../.eslintrc.js | 7 - .../.npmignore | 4 - .../CHANGELOG.md | 38 ---- .../LICENSE | 201 ------------------ .../README.md | 48 ----- .../package.json | 61 ------ .../src/detectors/DockerDetector.ts | 97 --------- .../src/detectors/index.ts | 16 -- .../src/index.ts | 16 -- .../test/DockerDetector.test.ts | 139 ------------ .../tsconfig.json | 12 -- 12 files changed, 640 deletions(-) delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/.eslintignore delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/.eslintrc.js delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/.npmignore delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/CHANGELOG.md delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/LICENSE delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/README.md delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/package.json delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/src/index.ts delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts delete mode 100644 detectors/node/opentelemetry-resource-detector-docker/tsconfig.json diff --git a/detectors/node/opentelemetry-resource-detector-docker/.eslintignore b/detectors/node/opentelemetry-resource-detector-docker/.eslintignore deleted file mode 100644 index 378eac25d3..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/detectors/node/opentelemetry-resource-detector-docker/.eslintrc.js b/detectors/node/opentelemetry-resource-detector-docker/.eslintrc.js deleted file mode 100644 index 029ade4634..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - env: { - mocha: true, - node: true, - }, - ...require("../../../eslint.config.js"), -}; diff --git a/detectors/node/opentelemetry-resource-detector-docker/.npmignore b/detectors/node/opentelemetry-resource-detector-docker/.npmignore deleted file mode 100644 index 9505ba9450..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin -/coverage -/doc -/test diff --git a/detectors/node/opentelemetry-resource-detector-docker/CHANGELOG.md b/detectors/node/opentelemetry-resource-detector-docker/CHANGELOG.md deleted file mode 100644 index f7ed2ea923..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/CHANGELOG.md +++ /dev/null @@ -1,38 +0,0 @@ -# Changelog - -### Dependencies - -* The following workspace dependencies were updated - * devDependencies - * @opentelemetry/contrib-test-utils bumped from ^0.30.0 to ^0.31.0 - -## [0.1.2](https://github.com/open-telemetry/opentelemetry-js-contrib/compare/resource-detector-docker-v0.1.1...resource-detector-docker-v0.1.2) (2022-09-02) - - -### Bug Fixes - -* mongodb types fails to compile with latest tsc v4.8 ([#1141](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1141)) ([ec9ee13](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/ec9ee131635dc2db88deea4f2efb887ff6f60577)) - - -### Dependencies - -* The following workspace dependencies were updated - * devDependencies - * @opentelemetry/contrib-test-utils bumped from ^0.31.0 to ^0.32.0 - -## 1.0.0 (2022-05-14) - - -### Features - -* add docker resource detector ([#931](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/931)) ([4e31b3c](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/4e31b3cdf0d7c39a1d9f584f1fce2e153d689a2f)) -* add supported node versions for all packages ([#973](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/973)) ([baaacbd](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/baaacbdd35ca4baab0afae64647aa8c0380ee4b7)) -* upstream mocha instrumentation testing plugin from ext-js [#621](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/621) ([#669](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/669)) ([a5170c4](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/a5170c494706a2bec3ba51e59966d0ca8a41d00e)) -* use Otel SDK 1.2/0.28 ([#984](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/984)) ([098c2ed](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/098c2ed6f9c5ab7bd865685018c0777245aab3b7)) - - -### Dependencies - -* The following workspace dependencies were updated - * devDependencies - * @opentelemetry/contrib-test-utils bumped from 0.29.0 to ^0.30.0 diff --git a/detectors/node/opentelemetry-resource-detector-docker/LICENSE b/detectors/node/opentelemetry-resource-detector-docker/LICENSE deleted file mode 100644 index a42588e10f..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [2021] 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 - - http://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. diff --git a/detectors/node/opentelemetry-resource-detector-docker/README.md b/detectors/node/opentelemetry-resource-detector-docker/README.md deleted file mode 100644 index 56a884cff2..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# OpenTelemetry Resource Detector for Docker - -[![NPM Published Version][npm-img]][npm-url] -[![dependencies][dependencies-image]][dependencies-url] -[![devDependencies][devDependencies-image]][devDependencies-url] -[![Apache License][license-image]][license-image] - -[component owners](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/.github/component_owners.yml): @abhee11 - -Resource detector for docker. - -Compatible with OpenTelemetry JS API and SDK `1.0+`. - -## Installation - -```bash -npm install --save @opentelemetry/resource-detector-docker -``` - -## Usage - -```typescript -import { detectResources } from '@opentelemetry/resources'; -import { dockerCGroupV1Detector } from '@opentelemetry/resource-detector-docker' -const resource = await detectResources({ - detectors: [dockerCGroupV1Detector], -}) - -const tracerProvider = new NodeTracerProvider({ resource }); -``` - -## Available detectors - -- `dockerCGroupV1Detector`: Populates `container.id` for processes running on docker cgroup v1 - -## Useful links - -- For more information on OpenTelemetry, visit: -- For more about OpenTelemetry JavaScript: -- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] - -## License - -Apache 2.0 - See [LICENSE][license-url] for more information. - -[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions -[license-url]: https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/LICENSE -[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat diff --git a/detectors/node/opentelemetry-resource-detector-docker/package.json b/detectors/node/opentelemetry-resource-detector-docker/package.json deleted file mode 100644 index 7dd6ea54e1..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "@opentelemetry/resource-detector-docker", - "version": "0.1.2", - "description": "Opentelemetry resource detector to get docker resource attributes", - "main": "build/src/index.js", - "types": "build/src/index.d.ts", - "repository": "open-telemetry/opentelemetry-js-contrib", - "scripts": { - "clean": "rimraf build/*", - "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../", - "compile": "npm run version:update && tsc -p .", - "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix", - "precompile": "tsc --version && lerna run version --scope @opentelemetry/resource-detector-docker --include-dependencies", - "prewatch": "npm run precompile", - "prepare": "npm run compile", - "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", - "tdd": "npm run test -- --watch-extensions ts --watch", - "version:update": "node ../../../scripts/version-update.js", - "watch": "tsc -w" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "files": [ - "build/src/**/*.js", - "build/src/**/*.js.map", - "build/src/**/*.d.ts", - "LICENSE", - "README.md" - ], - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@opentelemetry/api": "^1.0.0", - "@opentelemetry/contrib-test-utils": "^0.32.0", - "@types/mocha": "8.2.3", - "@types/node": "^17.0.14", - "@types/sinon": "10.0.2", - "eslint-plugin-header": "^3.1.1", - "gts": "^3.1.0", - "mocha": "7.2.0", - "nock": "12.0.3", - "nyc": "15.1.0", - "rimraf": "3.0.2", - "sinon": "14.0.0", - "ts-mocha": "10.0.0", - "typescript": "4.3.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "dependencies": { - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.0.0" - }, - "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/detectors/node/opentelemetry-resource-detector-docker#readme" -} diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts deleted file mode 100644 index 7bc8479cfc..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/DockerDetector.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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 { - Detector, - Resource, - ResourceDetectionConfig, -} from '@opentelemetry/resources'; - -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; - -import * as fs from 'fs'; -import * as util from 'util'; -import { diag } from '@opentelemetry/api'; - -export class DockerDetector implements Detector { - readonly CONTAINER_ID_LENGTH = 64; - readonly DEFAULT_CGROUP_PATH = '/proc/self/cgroup'; - readonly DEFAULT_CGROUP_V2_PATH = '/proc/self/mountinfo'; - readonly UTF8_UNICODE = 'utf8'; - readonly HOSTNAME = 'hostname'; - - private static readFileAsync = util.promisify(fs.readFile); - - async detect(_config?: ResourceDetectionConfig): Promise { - try { - const containerId = await this._getContainerId(); - return !containerId - ? Resource.empty() - : new Resource({ - [SemanticResourceAttributes.CONTAINER_ID]: containerId, - }); - } catch (e) { - diag.info( - 'Docker Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', - e - ); - return Resource.empty(); - } - } - - private async _getContainerId(): Promise { - try { - let rawData = await DockerDetector.readFileAsync( - this.DEFAULT_CGROUP_PATH, - this.UTF8_UNICODE - ); - let splitData = rawData.trim().split('\n'); - for (const str of splitData) { - if (str.length >= this.CONTAINER_ID_LENGTH) { - return str.substring(str.length - this.CONTAINER_ID_LENGTH); - } - } - - // If this code is reached - we then check for the V2_PATH - rawData = await DockerDetector.readFileAsync( - this.DEFAULT_CGROUP_V2_PATH, - this.UTF8_UNICODE - ); - - splitData = rawData.trim().split('\n'); - for (let str of splitData) { - if (str.includes(this.HOSTNAME)) { - str = str - .split('/') - .filter(s => s.length >= this.CONTAINER_ID_LENGTH)[0]; - if (str.length >= this.CONTAINER_ID_LENGTH) { - return str.substring(str.length - this.CONTAINER_ID_LENGTH); - } - } - } - } catch (e) { - if (e instanceof Error) { - const errorMessage = e.message; - diag.info( - 'Docker Detector failed to read the Container ID: ', - errorMessage - ); - } - } - return undefined; - } -} - -export const dockerDetector = new DockerDetector(); diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts b/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts deleted file mode 100644 index 1af43c312b..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/src/detectors/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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. - */ -export * from './DockerDetector'; diff --git a/detectors/node/opentelemetry-resource-detector-docker/src/index.ts b/detectors/node/opentelemetry-resource-detector-docker/src/index.ts deleted file mode 100644 index 9bfde8defd..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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. - */ -export * from './detectors'; diff --git a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts b/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts deleted file mode 100644 index a0c6ddb118..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/test/DockerDetector.test.ts +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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 { Resource } from '@opentelemetry/resources'; -import { dockerDetector } from '../src'; -import { - assertContainerResource, - assertEmptyResource, -} from '@opentelemetry/contrib-test-utils'; - -import { DockerDetector } from '../src'; - -describe('dockerCGroupV1Detector', () => { - let readStub; - const correctCgroupData = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; - const correctCgroupV2Data = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/hostname'; - - const wrongCgroupV2Data = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/host'; - - afterEach(() => { - sinon.restore(); - }); - - describe('Supported docker - Container ID ', () => { - it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { - readStub = sinon - .stub(DockerDetector, 'readFileAsync' as any) - .resolves(undefined); - - const resource: Resource = await dockerDetector.detect(); - - assert.deepStrictEqual(resource.attributes, {}); - assert.ok(resource); - }); - - it('should return a resource with container ID with a valid container ID present', async () => { - readStub = sinon - .stub(DockerDetector, 'readFileAsync' as any) - .resolves(correctCgroupData); - - const resource: Resource = await dockerDetector.detect(); - - sinon.assert.calledOnce(readStub); - - assert.ok(resource); - assertContainerResource(resource, { - id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', - }); - }); - - it('should return a resource with container ID with a valid container ID present for v2', async () => { - readStub = sinon.stub(DockerDetector, 'readFileAsync' as any); - - readStub.onFirstCall().resolves(''); - readStub.onSecondCall().resolves(correctCgroupV2Data); - - const resource: Resource = await dockerDetector.detect(); - sinon.assert.calledTwice(readStub); - - assert.ok(resource); - assertContainerResource(resource, { - id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', - }); - }); - - it('should return a empty resource with failed hostname check for v2', async () => { - readStub = sinon.stub(DockerDetector, 'readFileAsync' as any); - - readStub.onFirstCall().resolves(''); - readStub.onSecondCall().resolves(wrongCgroupV2Data); - - const resource: Resource = await dockerDetector.detect(); - sinon.assert.calledTwice(readStub); - - assert.ok(resource); - }); - - it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { - readStub = sinon - .stub(DockerDetector, 'readFileAsync' as any) - .resolves(''); - - const resource: Resource = await dockerDetector.detect(); - assert.deepStrictEqual(resource.attributes, {}); - - sinon.assert.calledTwice(readStub); - assert.ok(resource); - }); - - it('should return an empty resource when containerId is not valid', async () => { - const errorMsg = { - fileNotFoundError: new Error('cannot find file in path'), - }; - - readStub = sinon - .stub(DockerDetector, 'readFileAsync' as any) - .rejects(errorMsg.fileNotFoundError); - - const resource: Resource = await dockerDetector.detect(); - - sinon.assert.calledOnce(readStub); - assertEmptyResource(resource); - }); - - //cgroup v2 and containerd test - - it('should return an empty resource when containerId is not valid', async () => { - const errorMsg = { - fileNotFoundError: new Error('cannot find file in path'), - }; - - readStub = sinon - .stub(DockerDetector, 'readFileAsync' as any) - .rejects(errorMsg.fileNotFoundError); - - const resource: Resource = await dockerDetector.detect(); - sinon.assert.calledOnce(readStub); - assertEmptyResource(resource); - }); - }); -}); diff --git a/detectors/node/opentelemetry-resource-detector-docker/tsconfig.json b/detectors/node/opentelemetry-resource-detector-docker/tsconfig.json deleted file mode 100644 index 505b67a248..0000000000 --- a/detectors/node/opentelemetry-resource-detector-docker/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../../tsconfig.base", - "compilerOptions": { - "rootDir": ".", - "outDir": "build" - }, - "include": [ - "src/**/*.ts", - "test/**/*.ts" - ] - } - \ No newline at end of file From 54064664db0ed419b15fdea37e22bcda494753f3 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Mon, 19 Sep 2022 22:42:00 -0400 Subject: [PATCH 11/18] feat: renamed docker to container and addressed pr comments- 2 --- .../.eslintignore | 1 + .../.eslintrc.js | 7 + .../.npmignore | 4 + .../CHANGELOG.md | 38 ++++ .../LICENSE | 201 ++++++++++++++++++ .../README.md | 48 +++++ .../package.json | 61 ++++++ .../src/detectors/ContainerDetector.ts | 105 +++++++++ .../src/detectors/index.ts | 16 ++ .../src/index.ts | 16 ++ .../test/ContainerDetector.test.ts | 139 ++++++++++++ .../tsconfig.json | 12 ++ 12 files changed, 648 insertions(+) create mode 100644 detectors/node/opentelemetry-resource-detector-container/.eslintignore create mode 100644 detectors/node/opentelemetry-resource-detector-container/.eslintrc.js create mode 100644 detectors/node/opentelemetry-resource-detector-container/.npmignore create mode 100644 detectors/node/opentelemetry-resource-detector-container/CHANGELOG.md create mode 100644 detectors/node/opentelemetry-resource-detector-container/LICENSE create mode 100644 detectors/node/opentelemetry-resource-detector-container/README.md create mode 100644 detectors/node/opentelemetry-resource-detector-container/package.json create mode 100644 detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts create mode 100644 detectors/node/opentelemetry-resource-detector-container/src/detectors/index.ts create mode 100644 detectors/node/opentelemetry-resource-detector-container/src/index.ts create mode 100644 detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts create mode 100644 detectors/node/opentelemetry-resource-detector-container/tsconfig.json diff --git a/detectors/node/opentelemetry-resource-detector-container/.eslintignore b/detectors/node/opentelemetry-resource-detector-container/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/.eslintignore @@ -0,0 +1 @@ +build diff --git a/detectors/node/opentelemetry-resource-detector-container/.eslintrc.js b/detectors/node/opentelemetry-resource-detector-container/.eslintrc.js new file mode 100644 index 0000000000..029ade4634 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + env: { + mocha: true, + node: true, + }, + ...require("../../../eslint.config.js"), +}; diff --git a/detectors/node/opentelemetry-resource-detector-container/.npmignore b/detectors/node/opentelemetry-resource-detector-container/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/detectors/node/opentelemetry-resource-detector-container/CHANGELOG.md b/detectors/node/opentelemetry-resource-detector-container/CHANGELOG.md new file mode 100644 index 0000000000..f7ed2ea923 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/CHANGELOG.md @@ -0,0 +1,38 @@ +# Changelog + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @opentelemetry/contrib-test-utils bumped from ^0.30.0 to ^0.31.0 + +## [0.1.2](https://github.com/open-telemetry/opentelemetry-js-contrib/compare/resource-detector-docker-v0.1.1...resource-detector-docker-v0.1.2) (2022-09-02) + + +### Bug Fixes + +* mongodb types fails to compile with latest tsc v4.8 ([#1141](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1141)) ([ec9ee13](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/ec9ee131635dc2db88deea4f2efb887ff6f60577)) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @opentelemetry/contrib-test-utils bumped from ^0.31.0 to ^0.32.0 + +## 1.0.0 (2022-05-14) + + +### Features + +* add docker resource detector ([#931](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/931)) ([4e31b3c](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/4e31b3cdf0d7c39a1d9f584f1fce2e153d689a2f)) +* add supported node versions for all packages ([#973](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/973)) ([baaacbd](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/baaacbdd35ca4baab0afae64647aa8c0380ee4b7)) +* upstream mocha instrumentation testing plugin from ext-js [#621](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/621) ([#669](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/669)) ([a5170c4](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/a5170c494706a2bec3ba51e59966d0ca8a41d00e)) +* use Otel SDK 1.2/0.28 ([#984](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/984)) ([098c2ed](https://github.com/open-telemetry/opentelemetry-js-contrib/commit/098c2ed6f9c5ab7bd865685018c0777245aab3b7)) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @opentelemetry/contrib-test-utils bumped from 0.29.0 to ^0.30.0 diff --git a/detectors/node/opentelemetry-resource-detector-container/LICENSE b/detectors/node/opentelemetry-resource-detector-container/LICENSE new file mode 100644 index 0000000000..a42588e10f --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2021] 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 + + http://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. diff --git a/detectors/node/opentelemetry-resource-detector-container/README.md b/detectors/node/opentelemetry-resource-detector-container/README.md new file mode 100644 index 0000000000..5cfcb193d3 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/README.md @@ -0,0 +1,48 @@ +# OpenTelemetry Resource Detector for Docker + +[![NPM Published Version][npm-img]][npm-url] +[![dependencies][dependencies-image]][dependencies-url] +[![devDependencies][devDependencies-image]][devDependencies-url] +[![Apache License][license-image]][license-image] + +[component owners](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/.github/component_owners.yml): @abhee11 + +Resource detector for container id. + +Compatible with OpenTelemetry JS API and SDK `1.0+`. + +## Installation + +```bash +npm install --save @opentelemetry/resource-detector-container +``` + +## Usage + +```typescript +import { detectResources } from '@opentelemetry/resources'; +import { containerDetector } from '@opentelemetry/resource-detector-container' +const resource = await detectResources({ + detectors: [containerDetector], +}) + +const tracerProvider = new NodeTracerProvider({ resource }); +``` + +## Available detectors + +- `containerDetector`: Populates `container.id` for processes running on docker cgroup v1 or v2 or with containerd + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat diff --git a/detectors/node/opentelemetry-resource-detector-container/package.json b/detectors/node/opentelemetry-resource-detector-container/package.json new file mode 100644 index 0000000000..6cbfb50119 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/package.json @@ -0,0 +1,61 @@ +{ + "name": "@opentelemetry/resource-detector-container", + "version": "0.1.2", + "description": "Opentelemetry resource detector to get container resource attributes", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "open-telemetry/opentelemetry-js-contrib", + "scripts": { + "clean": "rimraf build/*", + "codecov": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../../", + "compile": "npm run version:update && tsc -p .", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "precompile": "tsc --version && lerna run version --scope @opentelemetry/resource-detector-container --include-dependencies", + "prewatch": "npm run precompile", + "prepare": "npm run compile", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", + "tdd": "npm run test -- --watch-extensions ts --watch", + "version:update": "node ../../../scripts/version-update.js", + "watch": "tsc -w" + }, + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/contrib-test-utils": "^0.32.0", + "@types/mocha": "8.2.3", + "@types/node": "^17.0.14", + "@types/sinon": "10.0.2", + "eslint-plugin-header": "^3.1.1", + "gts": "^3.1.0", + "mocha": "7.2.0", + "nock": "12.0.3", + "nyc": "15.1.0", + "rimraf": "3.0.2", + "sinon": "14.0.0", + "ts-mocha": "10.0.0", + "typescript": "4.3.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.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 new file mode 100644 index 0000000000..d9171dc4ed --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts @@ -0,0 +1,105 @@ +/* + * 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 { + Detector, + Resource, + ResourceDetectionConfig, +} from '@opentelemetry/resources'; + +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; + +import * as fs from 'fs'; +import * as util from 'util'; +import { diag } from '@opentelemetry/api'; + +export class ContainerDetector implements Detector { + readonly CONTAINER_ID_LENGTH = 64; + readonly DEFAULT_CGROUP_V1_PATH = '/proc/self/cgroup'; + readonly DEFAULT_CGROUP_V2_PATH = '/proc/self/mountinfo'; + readonly UTF8_UNICODE = 'utf8'; + readonly HOSTNAME = 'hostname'; + + private static readFileAsync = util.promisify(fs.readFile); + + async detect(_config?: ResourceDetectionConfig): Promise { + try { + const containerId = await this._getContainerId(); + return !containerId + ? Resource.empty() + : new Resource({ + [SemanticResourceAttributes.CONTAINER_ID]: containerId, + }); + } catch (e) { + diag.info( + 'Docker Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', + e + ); + return Resource.empty(); + } + } + + private async _getContainerIdV1() { + const rawData = await ContainerDetector.readFileAsync( + this.DEFAULT_CGROUP_V1_PATH, + this.UTF8_UNICODE + ); + const splitData = rawData.trim().split('\n'); + for (const str of splitData) { + if (str.length >= this.CONTAINER_ID_LENGTH) { + return str.substring(str.length - this.CONTAINER_ID_LENGTH); + } + } + return undefined; + } + + private async _getContainerIdV2() { + const rawData = await ContainerDetector.readFileAsync( + this.DEFAULT_CGROUP_V2_PATH, + this.UTF8_UNICODE + ); + const str = rawData + .trim() + .split('\n') + .find(s => s.includes(this.HOSTNAME)); + const containerIdStr = + str && str.split('/').find(s => s.length >= this.CONTAINER_ID_LENGTH); + if (containerIdStr) { + return containerIdStr.substring( + containerIdStr.length - this.CONTAINER_ID_LENGTH + ); + } + return undefined; + } + + private async _getContainerId(): Promise { + try { + return ( + (await this._getContainerIdV1()) ?? (await this._getContainerIdV2()) + ); + } catch (e) { + if (e instanceof Error) { + const errorMessage = e.message; + diag.info( + 'Container Detector failed to read the Container ID: ', + errorMessage + ); + } + } + return undefined; + } +} + +export const containerDetector = new ContainerDetector(); diff --git a/detectors/node/opentelemetry-resource-detector-container/src/detectors/index.ts b/detectors/node/opentelemetry-resource-detector-container/src/detectors/index.ts new file mode 100644 index 0000000000..edd915f6aa --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/src/detectors/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export * from './ContainerDetector'; diff --git a/detectors/node/opentelemetry-resource-detector-container/src/index.ts b/detectors/node/opentelemetry-resource-detector-container/src/index.ts new file mode 100644 index 0000000000..9bfde8defd --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/src/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export * from './detectors'; diff --git a/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts new file mode 100644 index 0000000000..c8fe84d717 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts @@ -0,0 +1,139 @@ +/* + * 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 { Resource } from '@opentelemetry/resources'; +import { containerDetector } from '../src'; +import { + assertContainerResource, + assertEmptyResource, +} from '@opentelemetry/contrib-test-utils'; + +import { ContainerDetector } from '../src'; + +describe('ContainerDetector', () => { + let readStub; + const correctCgroupData = + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; + const correctCgroupV2Data = + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/hostname'; + + const wrongCgroupV2Data = + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/host'; + + afterEach(() => { + sinon.restore(); + }); + + describe('Supported docker - Container ID ', () => { + it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { + readStub = sinon + .stub(ContainerDetector, 'readFileAsync' as any) + .resolves(undefined); + + const resource: Resource = await containerDetector.detect(); + + assert.deepStrictEqual(resource.attributes, {}); + assert.ok(resource); + }); + + it('should return a resource with container ID with a valid container ID present', async () => { + readStub = sinon + .stub(ContainerDetector, 'readFileAsync' as any) + .resolves(correctCgroupData); + + const resource: Resource = await containerDetector.detect(); + + sinon.assert.calledOnce(readStub); + + assert.ok(resource); + assertContainerResource(resource, { + id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', + }); + }); + + it('should return a resource with container ID with a valid container ID present for v2', async () => { + readStub = sinon.stub(ContainerDetector, 'readFileAsync' as any); + + readStub.onFirstCall().resolves(''); + readStub.onSecondCall().resolves(correctCgroupV2Data); + + const resource: Resource = await containerDetector.detect(); + sinon.assert.calledTwice(readStub); + + assert.ok(resource); + assertContainerResource(resource, { + id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', + }); + }); + + it('should return a empty resource with failed hostname check for v2', async () => { + readStub = sinon.stub(ContainerDetector, 'readFileAsync' as any); + + readStub.onFirstCall().resolves(''); + readStub.onSecondCall().resolves(wrongCgroupV2Data); + + const resource: Resource = await containerDetector.detect(); + sinon.assert.calledTwice(readStub); + + assert.ok(resource); + }); + + it('should return a resource without attribute container.id when cgroup file does not contain valid Container ID', async () => { + readStub = sinon + .stub(ContainerDetector, 'readFileAsync' as any) + .resolves(''); + + const resource: Resource = await containerDetector.detect(); + assert.deepStrictEqual(resource.attributes, {}); + + sinon.assert.calledTwice(readStub); + assert.ok(resource); + }); + + it('should return an empty resource when containerId is not valid', async () => { + const errorMsg = { + fileNotFoundError: new Error('cannot find file in path'), + }; + + readStub = sinon + .stub(ContainerDetector, 'readFileAsync' as any) + .rejects(errorMsg.fileNotFoundError); + + const resource: Resource = await containerDetector.detect(); + + sinon.assert.calledOnce(readStub); + assertEmptyResource(resource); + }); + + //cgroup v2 and containerd test + + it('should return an empty resource when containerId is not valid', async () => { + const errorMsg = { + fileNotFoundError: new Error('cannot find file in path'), + }; + + readStub = sinon + .stub(ContainerDetector, 'readFileAsync' as any) + .rejects(errorMsg.fileNotFoundError); + + const resource: Resource = await containerDetector.detect(); + sinon.assert.calledOnce(readStub); + assertEmptyResource(resource); + }); + }); +}); diff --git a/detectors/node/opentelemetry-resource-detector-container/tsconfig.json b/detectors/node/opentelemetry-resource-detector-container/tsconfig.json new file mode 100644 index 0000000000..505b67a248 --- /dev/null +++ b/detectors/node/opentelemetry-resource-detector-container/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../../tsconfig.base", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ] + } + \ No newline at end of file From 2c775d0b5ac900e4bebe8a1fa5048c35e692cead Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Mon, 19 Sep 2022 22:45:00 -0400 Subject: [PATCH 12/18] feat: renamed docker to container and addressed pr comments-3 --- .release-please-manifest.json | 2 +- .../src/detectors/ContainerDetector.ts | 2 +- .../test/ContainerDetector.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4696cce64d..4a1b34a646 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1 +1 @@ -{"detectors/node/opentelemetry-resource-detector-alibaba-cloud":"0.27.2","detectors/node/opentelemetry-resource-detector-aws":"1.1.2","detectors/node/opentelemetry-resource-detector-gcp":"0.27.2","detectors/node/opentelemetry-resource-detector-github":"0.27.0","metapackages/auto-instrumentations-node":"0.32.1","metapackages/auto-instrumentations-web":"0.30.0","packages/opentelemetry-host-metrics":"0.30.0","packages/opentelemetry-id-generator-aws-xray":"1.1.0","packages/opentelemetry-test-utils":"0.32.0","plugins/node/instrumentation-amqplib":"0.31.0","plugins/node/instrumentation-fs":"0.5.0","plugins/node/instrumentation-tedious":"0.4.0","plugins/node/opentelemetry-instrumentation-aws-lambda":"0.33.0","plugins/node/opentelemetry-instrumentation-aws-sdk":"0.9.1","plugins/node/opentelemetry-instrumentation-bunyan":"0.30.0","plugins/node/opentelemetry-instrumentation-cassandra":"0.30.0","plugins/node/opentelemetry-instrumentation-connect":"0.30.0","plugins/node/opentelemetry-instrumentation-dns":"0.30.0","plugins/node/opentelemetry-instrumentation-express":"0.31.1","plugins/node/opentelemetry-instrumentation-generic-pool":"0.30.0","plugins/node/opentelemetry-instrumentation-graphql":"0.31.0","plugins/node/opentelemetry-instrumentation-hapi":"0.30.0","plugins/node/opentelemetry-instrumentation-ioredis":"0.32.1","plugins/node/opentelemetry-instrumentation-knex":"0.30.0","plugins/node/opentelemetry-instrumentation-koa":"0.32.0","plugins/node/instrumentation-lru-memoizer":"0.31.0","plugins/node/opentelemetry-instrumentation-memcached":"0.30.0","plugins/node/opentelemetry-instrumentation-mongodb":"0.32.0","plugins/node/opentelemetry-instrumentation-mysql":"0.31.1","plugins/node/opentelemetry-instrumentation-mysql2":"0.32.0","plugins/node/opentelemetry-instrumentation-nestjs-core":"0.31.0","plugins/node/opentelemetry-instrumentation-net":"0.30.1","plugins/node/opentelemetry-instrumentation-pg":"0.31.1","plugins/node/opentelemetry-instrumentation-pino":"0.32.0","plugins/node/opentelemetry-instrumentation-redis":"0.33.0","plugins/node/opentelemetry-instrumentation-redis-4":"0.33.0","plugins/node/opentelemetry-instrumentation-restify":"0.30.0","plugins/node/opentelemetry-instrumentation-router":"0.30.0","plugins/node/opentelemetry-instrumentation-winston":"0.30.0","plugins/web/opentelemetry-instrumentation-document-load":"0.30.0","plugins/web/opentelemetry-instrumentation-user-interaction":"0.31.0","plugins/web/opentelemetry-plugin-react-load":"0.28.0","propagators/opentelemetry-propagator-aws-xray":"1.1.0","propagators/opentelemetry-propagator-grpc-census-binary":"0.26.0","propagators/opentelemetry-propagator-instana":"0.2.0","propagators/opentelemetry-propagator-ot-trace":"0.26.1","plugins/node/opentelemetry-instrumentation-fastify":"0.29.0","packages/opentelemetry-propagation-utils":"0.28.0","plugins/web/opentelemetry-instrumentation-long-task":"0.31.0","detectors/node/opentelemetry-resource-detector-docker":"0.1.2","detectors/node/opentelemetry-resource-detector-instana":"0.3.0"} +{"detectors/node/opentelemetry-resource-detector-alibaba-cloud":"0.27.2","detectors/node/opentelemetry-resource-detector-aws":"1.1.2","detectors/node/opentelemetry-resource-detector-gcp":"0.27.2","detectors/node/opentelemetry-resource-detector-github":"0.27.0","metapackages/auto-instrumentations-node":"0.32.1","metapackages/auto-instrumentations-web":"0.30.0","packages/opentelemetry-host-metrics":"0.30.0","packages/opentelemetry-id-generator-aws-xray":"1.1.0","packages/opentelemetry-test-utils":"0.32.0","plugins/node/instrumentation-amqplib":"0.31.0","plugins/node/instrumentation-fs":"0.5.0","plugins/node/instrumentation-tedious":"0.4.0","plugins/node/opentelemetry-instrumentation-aws-lambda":"0.33.0","plugins/node/opentelemetry-instrumentation-aws-sdk":"0.9.1","plugins/node/opentelemetry-instrumentation-bunyan":"0.30.0","plugins/node/opentelemetry-instrumentation-cassandra":"0.30.0","plugins/node/opentelemetry-instrumentation-connect":"0.30.0","plugins/node/opentelemetry-instrumentation-dns":"0.30.0","plugins/node/opentelemetry-instrumentation-express":"0.31.1","plugins/node/opentelemetry-instrumentation-generic-pool":"0.30.0","plugins/node/opentelemetry-instrumentation-graphql":"0.31.0","plugins/node/opentelemetry-instrumentation-hapi":"0.30.0","plugins/node/opentelemetry-instrumentation-ioredis":"0.32.1","plugins/node/opentelemetry-instrumentation-knex":"0.30.0","plugins/node/opentelemetry-instrumentation-koa":"0.32.0","plugins/node/instrumentation-lru-memoizer":"0.31.0","plugins/node/opentelemetry-instrumentation-memcached":"0.30.0","plugins/node/opentelemetry-instrumentation-mongodb":"0.32.0","plugins/node/opentelemetry-instrumentation-mysql":"0.31.1","plugins/node/opentelemetry-instrumentation-mysql2":"0.32.0","plugins/node/opentelemetry-instrumentation-nestjs-core":"0.31.0","plugins/node/opentelemetry-instrumentation-net":"0.30.1","plugins/node/opentelemetry-instrumentation-pg":"0.31.1","plugins/node/opentelemetry-instrumentation-pino":"0.32.0","plugins/node/opentelemetry-instrumentation-redis":"0.33.0","plugins/node/opentelemetry-instrumentation-redis-4":"0.33.0","plugins/node/opentelemetry-instrumentation-restify":"0.30.0","plugins/node/opentelemetry-instrumentation-router":"0.30.0","plugins/node/opentelemetry-instrumentation-winston":"0.30.0","plugins/web/opentelemetry-instrumentation-document-load":"0.30.0","plugins/web/opentelemetry-instrumentation-user-interaction":"0.31.0","plugins/web/opentelemetry-plugin-react-load":"0.28.0","propagators/opentelemetry-propagator-aws-xray":"1.1.0","propagators/opentelemetry-propagator-grpc-census-binary":"0.26.0","propagators/opentelemetry-propagator-instana":"0.2.0","propagators/opentelemetry-propagator-ot-trace":"0.26.1","plugins/node/opentelemetry-instrumentation-fastify":"0.29.0","packages/opentelemetry-propagation-utils":"0.28.0","plugins/web/opentelemetry-instrumentation-long-task":"0.31.0","detectors/node/opentelemetry-resource-detector-container":"0.1.2","detectors/node/opentelemetry-resource-detector-instana":"0.3.0"} 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 d9171dc4ed..67a88c6b48 100644 --- a/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts @@ -44,7 +44,7 @@ export class ContainerDetector implements Detector { }); } catch (e) { diag.info( - 'Docker Detector did not identify running inside a supported docker container, no docker attributes will be added to resource: ', + 'Container Detector did not identify running inside a supported container, no container attributes will be added to resource: ', e ); return Resource.empty(); 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 c8fe84d717..dbdeb359c2 100644 --- a/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts @@ -39,7 +39,7 @@ describe('ContainerDetector', () => { sinon.restore(); }); - describe('Supported docker - Container ID ', () => { + describe('Supported container - Container ID ', () => { it('should return a resource attributes without container id - docker cgroup v1 detector', async () => { readStub = sinon .stub(ContainerDetector, 'readFileAsync' as any) From 7813abe3e904ab63249f3e8c332a921e47f4d59d Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Wed, 21 Sep 2022 20:22:44 -0400 Subject: [PATCH 13/18] feat: addressed pr comments-2 --- .../README.md | 7 ++----- .../src/detectors/ContainerDetector.ts | 19 +++++++++++-------- .../test/ContainerDetector.test.ts | 6 +++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/detectors/node/opentelemetry-resource-detector-container/README.md b/detectors/node/opentelemetry-resource-detector-container/README.md index 5cfcb193d3..9e5709b82b 100644 --- a/detectors/node/opentelemetry-resource-detector-container/README.md +++ b/detectors/node/opentelemetry-resource-detector-container/README.md @@ -1,14 +1,11 @@ -# OpenTelemetry Resource Detector for Docker +# OpenTelemetry Resource Detector for Container [![NPM Published Version][npm-img]][npm-url] -[![dependencies][dependencies-image]][dependencies-url] -[![devDependencies][devDependencies-image]][devDependencies-url] [![Apache License][license-image]][license-image] [component owners](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/.github/component_owners.yml): @abhee11 Resource detector for container id. - Compatible with OpenTelemetry JS API and SDK `1.0+`. ## Installation @@ -31,7 +28,7 @@ const tracerProvider = new NodeTracerProvider({ resource }); ## Available detectors -- `containerDetector`: Populates `container.id` for processes running on docker cgroup v1 or v2 or with containerd +- `containerDetector`: Populates `container.id` for processes running on contianers supporting : docker( cgroup v1 or v2 ) or with containerd ## Useful links 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 67a88c6b48..c1190e6aab 100644 --- a/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts @@ -74,16 +74,19 @@ export class ContainerDetector implements Detector { .trim() .split('\n') .find(s => s.includes(this.HOSTNAME)); - const containerIdStr = - str && str.split('/').find(s => s.length >= this.CONTAINER_ID_LENGTH); - if (containerIdStr) { - return containerIdStr.substring( - containerIdStr.length - this.CONTAINER_ID_LENGTH - ); - } - return undefined; + const containerIdStr = str + ?.split('/') + .find(s => s.length >= this.CONTAINER_ID_LENGTH); + return containerIdStr?.substring( + containerIdStr.length - this.CONTAINER_ID_LENGTH + ); } + /* + cgroupv1 path would still exist in case of container running on v2 + but the cgroupv1 path would no longer have the container id and would + fallback on the cgroupv2 implementation. + */ private async _getContainerId(): Promise { try { 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 dbdeb359c2..ccce4808d4 100644 --- a/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts @@ -27,13 +27,13 @@ import { ContainerDetector } from '../src'; describe('ContainerDetector', () => { let readStub; - const correctCgroupData = + const correctCgroupV1Data = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; const correctCgroupV2Data = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/hostname'; const wrongCgroupV2Data = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/host'; + 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/wrongkeyword'; afterEach(() => { sinon.restore(); @@ -54,7 +54,7 @@ describe('ContainerDetector', () => { it('should return a resource with container ID with a valid container ID present', async () => { readStub = sinon .stub(ContainerDetector, 'readFileAsync' as any) - .resolves(correctCgroupData); + .resolves(correctCgroupV1Data); const resource: Resource = await containerDetector.detect(); From 3e3a20b4896b7e174e5ca098070baca3145ecd61 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 30 Sep 2022 09:45:54 -0400 Subject: [PATCH 14/18] feat: modified tests to take in multiple lines input --- .../test/ContainerDetector.test.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 ccce4808d4..e9c5c3aaf4 100644 --- a/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts +++ b/detectors/node/opentelemetry-resource-detector-container/test/ContainerDetector.test.ts @@ -28,12 +28,13 @@ import { ContainerDetector } from '../src'; describe('ContainerDetector', () => { let readStub; const correctCgroupV1Data = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; - const correctCgroupV2Data = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/hostname'; + 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm'; + const correctCgroupV2Data = `tmhdefghijklmnopqrstuvwxyzafgrefghiugkmnopqrstuvwxyzabcdefghijkl/hostname + fhkjdshgfhsdfjhdsfkjhfkdshkjhfd/host + sahfhfjkhjhfhjdhfjkdhfkjdhfjkhhdsjfhdfhjdhfkj/somethingelse`; const wrongCgroupV2Data = - 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/wrongkeyword'; + 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm/wrongkeyword'; afterEach(() => { sinon.restore(); @@ -77,7 +78,7 @@ describe('ContainerDetector', () => { assert.ok(resource); assertContainerResource(resource, { - id: 'bcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm', + id: 'tmhdefghijklmnopqrstuvwxyzafgrefghiugkmnopqrstuvwxyzabcdefghijkl', }); }); From fc0f31c59c4a1cc0c1ae6314dc5bedba9c75c8c1 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 30 Sep 2022 10:04:31 -0400 Subject: [PATCH 15/18] feat: merge resolution for manifest --- .release-please-manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4a1b34a646..3abc6fe75f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1 +1 @@ -{"detectors/node/opentelemetry-resource-detector-alibaba-cloud":"0.27.2","detectors/node/opentelemetry-resource-detector-aws":"1.1.2","detectors/node/opentelemetry-resource-detector-gcp":"0.27.2","detectors/node/opentelemetry-resource-detector-github":"0.27.0","metapackages/auto-instrumentations-node":"0.32.1","metapackages/auto-instrumentations-web":"0.30.0","packages/opentelemetry-host-metrics":"0.30.0","packages/opentelemetry-id-generator-aws-xray":"1.1.0","packages/opentelemetry-test-utils":"0.32.0","plugins/node/instrumentation-amqplib":"0.31.0","plugins/node/instrumentation-fs":"0.5.0","plugins/node/instrumentation-tedious":"0.4.0","plugins/node/opentelemetry-instrumentation-aws-lambda":"0.33.0","plugins/node/opentelemetry-instrumentation-aws-sdk":"0.9.1","plugins/node/opentelemetry-instrumentation-bunyan":"0.30.0","plugins/node/opentelemetry-instrumentation-cassandra":"0.30.0","plugins/node/opentelemetry-instrumentation-connect":"0.30.0","plugins/node/opentelemetry-instrumentation-dns":"0.30.0","plugins/node/opentelemetry-instrumentation-express":"0.31.1","plugins/node/opentelemetry-instrumentation-generic-pool":"0.30.0","plugins/node/opentelemetry-instrumentation-graphql":"0.31.0","plugins/node/opentelemetry-instrumentation-hapi":"0.30.0","plugins/node/opentelemetry-instrumentation-ioredis":"0.32.1","plugins/node/opentelemetry-instrumentation-knex":"0.30.0","plugins/node/opentelemetry-instrumentation-koa":"0.32.0","plugins/node/instrumentation-lru-memoizer":"0.31.0","plugins/node/opentelemetry-instrumentation-memcached":"0.30.0","plugins/node/opentelemetry-instrumentation-mongodb":"0.32.0","plugins/node/opentelemetry-instrumentation-mysql":"0.31.1","plugins/node/opentelemetry-instrumentation-mysql2":"0.32.0","plugins/node/opentelemetry-instrumentation-nestjs-core":"0.31.0","plugins/node/opentelemetry-instrumentation-net":"0.30.1","plugins/node/opentelemetry-instrumentation-pg":"0.31.1","plugins/node/opentelemetry-instrumentation-pino":"0.32.0","plugins/node/opentelemetry-instrumentation-redis":"0.33.0","plugins/node/opentelemetry-instrumentation-redis-4":"0.33.0","plugins/node/opentelemetry-instrumentation-restify":"0.30.0","plugins/node/opentelemetry-instrumentation-router":"0.30.0","plugins/node/opentelemetry-instrumentation-winston":"0.30.0","plugins/web/opentelemetry-instrumentation-document-load":"0.30.0","plugins/web/opentelemetry-instrumentation-user-interaction":"0.31.0","plugins/web/opentelemetry-plugin-react-load":"0.28.0","propagators/opentelemetry-propagator-aws-xray":"1.1.0","propagators/opentelemetry-propagator-grpc-census-binary":"0.26.0","propagators/opentelemetry-propagator-instana":"0.2.0","propagators/opentelemetry-propagator-ot-trace":"0.26.1","plugins/node/opentelemetry-instrumentation-fastify":"0.29.0","packages/opentelemetry-propagation-utils":"0.28.0","plugins/web/opentelemetry-instrumentation-long-task":"0.31.0","detectors/node/opentelemetry-resource-detector-container":"0.1.2","detectors/node/opentelemetry-resource-detector-instana":"0.3.0"} +{"detectors/node/opentelemetry-resource-detector-alibaba-cloud":"0.27.2","detectors/node/opentelemetry-resource-detector-aws":"1.1.2","detectors/node/opentelemetry-resource-detector-container":"0.1.2","detectors/node/opentelemetry-resource-detector-gcp":"0.27.2","detectors/node/opentelemetry-resource-detector-github":"0.27.0","detectors/node/opentelemetry-resource-detector-instana":"0.3.0","metapackages/auto-instrumentations-node":"0.33.1","metapackages/auto-instrumentations-web":"0.30.0","packages/opentelemetry-host-metrics":"0.30.1","packages/opentelemetry-id-generator-aws-xray":"1.1.0","packages/opentelemetry-propagation-utils":"0.29.0","packages/opentelemetry-test-utils":"0.32.0","plugins/node/instrumentation-amqplib":"0.31.0","plugins/node/instrumentation-dataloader":"0.2.0","plugins/node/instrumentation-fs":"0.5.0","plugins/node/instrumentation-lru-memoizer":"0.31.0","plugins/node/instrumentation-mongoose":"0.31.0","plugins/node/instrumentation-tedious":"0.4.0","plugins/node/opentelemetry-instrumentation-aws-lambda":"0.33.0","plugins/node/opentelemetry-instrumentation-aws-sdk":"0.9.2","plugins/node/opentelemetry-instrumentation-bunyan":"0.30.0","plugins/node/opentelemetry-instrumentation-cassandra":"0.30.0","plugins/node/opentelemetry-instrumentation-connect":"0.30.0","plugins/node/opentelemetry-instrumentation-dns":"0.30.0","plugins/node/opentelemetry-instrumentation-express":"0.31.2","plugins/node/opentelemetry-instrumentation-fastify":"0.30.0","plugins/node/opentelemetry-instrumentation-generic-pool":"0.30.0","plugins/node/opentelemetry-instrumentation-graphql":"0.31.0","plugins/node/opentelemetry-instrumentation-hapi":"0.30.0","plugins/node/opentelemetry-instrumentation-ioredis":"0.32.1","plugins/node/opentelemetry-instrumentation-knex":"0.30.0","plugins/node/opentelemetry-instrumentation-koa":"0.32.0","plugins/node/opentelemetry-instrumentation-memcached":"0.30.0","plugins/node/opentelemetry-instrumentation-mongodb":"0.32.1","plugins/node/opentelemetry-instrumentation-mysql":"0.31.1","plugins/node/opentelemetry-instrumentation-mysql2":"0.32.0","plugins/node/opentelemetry-instrumentation-nestjs-core":"0.31.0","plugins/node/opentelemetry-instrumentation-net":"0.30.1","plugins/node/opentelemetry-instrumentation-pg":"0.31.1","plugins/node/opentelemetry-instrumentation-pino":"0.32.0","plugins/node/opentelemetry-instrumentation-redis":"0.33.0","plugins/node/opentelemetry-instrumentation-redis-4":"0.33.0","plugins/node/opentelemetry-instrumentation-restify":"0.30.0","plugins/node/opentelemetry-instrumentation-router":"0.30.0","plugins/node/opentelemetry-instrumentation-winston":"0.30.0","plugins/web/opentelemetry-instrumentation-document-load":"0.30.0","plugins/web/opentelemetry-instrumentation-long-task":"0.31.0","plugins/web/opentelemetry-instrumentation-user-interaction":"0.31.0","plugins/web/opentelemetry-plugin-react-load":"0.28.0","propagators/opentelemetry-propagator-aws-xray":"1.1.0","propagators/opentelemetry-propagator-grpc-census-binary":"0.26.0","propagators/opentelemetry-propagator-instana":"0.2.0","propagators/opentelemetry-propagator-ot-trace":"0.26.1"} From 9ed5aa54ecd5e3a1a04431be4eb6693c80de297f Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 30 Sep 2022 10:09:13 -0400 Subject: [PATCH 16/18] feat: fixing release please manifest --- .release-please-manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3abc6fe75f..c592ab763c 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1 +1 @@ -{"detectors/node/opentelemetry-resource-detector-alibaba-cloud":"0.27.2","detectors/node/opentelemetry-resource-detector-aws":"1.1.2","detectors/node/opentelemetry-resource-detector-container":"0.1.2","detectors/node/opentelemetry-resource-detector-gcp":"0.27.2","detectors/node/opentelemetry-resource-detector-github":"0.27.0","detectors/node/opentelemetry-resource-detector-instana":"0.3.0","metapackages/auto-instrumentations-node":"0.33.1","metapackages/auto-instrumentations-web":"0.30.0","packages/opentelemetry-host-metrics":"0.30.1","packages/opentelemetry-id-generator-aws-xray":"1.1.0","packages/opentelemetry-propagation-utils":"0.29.0","packages/opentelemetry-test-utils":"0.32.0","plugins/node/instrumentation-amqplib":"0.31.0","plugins/node/instrumentation-dataloader":"0.2.0","plugins/node/instrumentation-fs":"0.5.0","plugins/node/instrumentation-lru-memoizer":"0.31.0","plugins/node/instrumentation-mongoose":"0.31.0","plugins/node/instrumentation-tedious":"0.4.0","plugins/node/opentelemetry-instrumentation-aws-lambda":"0.33.0","plugins/node/opentelemetry-instrumentation-aws-sdk":"0.9.2","plugins/node/opentelemetry-instrumentation-bunyan":"0.30.0","plugins/node/opentelemetry-instrumentation-cassandra":"0.30.0","plugins/node/opentelemetry-instrumentation-connect":"0.30.0","plugins/node/opentelemetry-instrumentation-dns":"0.30.0","plugins/node/opentelemetry-instrumentation-express":"0.31.2","plugins/node/opentelemetry-instrumentation-fastify":"0.30.0","plugins/node/opentelemetry-instrumentation-generic-pool":"0.30.0","plugins/node/opentelemetry-instrumentation-graphql":"0.31.0","plugins/node/opentelemetry-instrumentation-hapi":"0.30.0","plugins/node/opentelemetry-instrumentation-ioredis":"0.32.1","plugins/node/opentelemetry-instrumentation-knex":"0.30.0","plugins/node/opentelemetry-instrumentation-koa":"0.32.0","plugins/node/opentelemetry-instrumentation-memcached":"0.30.0","plugins/node/opentelemetry-instrumentation-mongodb":"0.32.1","plugins/node/opentelemetry-instrumentation-mysql":"0.31.1","plugins/node/opentelemetry-instrumentation-mysql2":"0.32.0","plugins/node/opentelemetry-instrumentation-nestjs-core":"0.31.0","plugins/node/opentelemetry-instrumentation-net":"0.30.1","plugins/node/opentelemetry-instrumentation-pg":"0.31.1","plugins/node/opentelemetry-instrumentation-pino":"0.32.0","plugins/node/opentelemetry-instrumentation-redis":"0.33.0","plugins/node/opentelemetry-instrumentation-redis-4":"0.33.0","plugins/node/opentelemetry-instrumentation-restify":"0.30.0","plugins/node/opentelemetry-instrumentation-router":"0.30.0","plugins/node/opentelemetry-instrumentation-winston":"0.30.0","plugins/web/opentelemetry-instrumentation-document-load":"0.30.0","plugins/web/opentelemetry-instrumentation-long-task":"0.31.0","plugins/web/opentelemetry-instrumentation-user-interaction":"0.31.0","plugins/web/opentelemetry-plugin-react-load":"0.28.0","propagators/opentelemetry-propagator-aws-xray":"1.1.0","propagators/opentelemetry-propagator-grpc-census-binary":"0.26.0","propagators/opentelemetry-propagator-instana":"0.2.0","propagators/opentelemetry-propagator-ot-trace":"0.26.1"} +{"detectors/node/opentelemetry-resource-detector-alibaba-cloud":"0.27.2","detectors/node/opentelemetry-resource-detector-aws":"1.1.2","detectors/node/opentelemetry-resource-detector-container":"0.1.2","detectors/node/opentelemetry-resource-detector-gcp":"0.27.2","detectors/node/opentelemetry-resource-detector-github":"0.27.0","detectors/node/opentelemetry-resource-detector-instana":"0.3.0","metapackages/auto-instrumentations-node":"0.33.1","metapackages/auto-instrumentations-web":"0.30.0","packages/opentelemetry-host-metrics":"0.30.1","packages/opentelemetry-id-generator-aws-xray":"1.1.0","packages/opentelemetry-propagation-utils":"0.29.0","packages/opentelemetry-test-utils":"0.32.0","plugins/node/instrumentation-amqplib":"0.31.0","plugins/node/instrumentation-dataloader":"0.2.0","plugins/node/instrumentation-fs":"0.5.0","plugins/node/instrumentation-lru-memoizer":"0.31.0","plugins/node/instrumentation-mongoose":"0.31.0","plugins/node/instrumentation-tedious":"0.4.0","plugins/node/opentelemetry-instrumentation-aws-lambda":"0.33.0","plugins/node/opentelemetry-instrumentation-aws-sdk":"0.9.2","plugins/node/opentelemetry-instrumentation-bunyan":"0.30.0","plugins/node/opentelemetry-instrumentation-cassandra":"0.30.0","plugins/node/opentelemetry-instrumentation-connect":"0.30.0","plugins/node/opentelemetry-instrumentation-dns":"0.30.0","plugins/node/opentelemetry-instrumentation-express":"0.31.2","plugins/node/opentelemetry-instrumentation-fastify":"0.30.0","plugins/node/opentelemetry-instrumentation-generic-pool":"0.30.0","plugins/node/opentelemetry-instrumentation-graphql":"0.31.0","plugins/node/opentelemetry-instrumentation-hapi":"0.30.0","plugins/node/opentelemetry-instrumentation-ioredis":"0.32.1","plugins/node/opentelemetry-instrumentation-knex":"0.30.0","plugins/node/opentelemetry-instrumentation-koa":"0.32.0","plugins/node/opentelemetry-instrumentation-memcached":"0.30.0","plugins/node/opentelemetry-instrumentation-mongodb":"0.32.1","plugins/node/opentelemetry-instrumentation-mysql":"0.31.1","plugins/node/opentelemetry-instrumentation-mysql2":"0.32.0","plugins/node/opentelemetry-instrumentation-nestjs-core":"0.31.0","plugins/node/opentelemetry-instrumentation-net":"0.30.1","plugins/node/opentelemetry-instrumentation-pg":"0.31.1","plugins/node/opentelemetry-instrumentation-pino":"0.32.0","plugins/node/opentelemetry-instrumentation-redis":"0.33.0","plugins/node/opentelemetry-instrumentation-redis-4":"0.33.0","plugins/node/opentelemetry-instrumentation-restify":"0.30.0","plugins/node/opentelemetry-instrumentation-router":"0.30.0","plugins/node/opentelemetry-instrumentation-winston":"0.30.0","plugins/web/opentelemetry-instrumentation-document-load":"0.30.0","plugins/web/opentelemetry-instrumentation-long-task":"0.31.0","plugins/web/opentelemetry-instrumentation-user-interaction":"0.31.0","plugins/web/opentelemetry-plugin-react-load":"0.28.0","propagators/opentelemetry-propagator-aws-xray":"1.1.0","propagators/opentelemetry-propagator-grpc-census-binary":"0.26.0","propagators/opentelemetry-propagator-instana":"0.2.0","propagators/opentelemetry-propagator-ot-trace":"0.26.1"} \ No newline at end of file From a72a56fe2f791ee698dade1df1a5ee1fed780ed7 Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 30 Sep 2022 10:13:46 -0400 Subject: [PATCH 17/18] feat: changing please-config to rename docker to container --- release-please-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-please-config.json b/release-please-config.json index 00070fc0c4..76911a8653 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -8,7 +8,7 @@ "packages": { "detectors/node/opentelemetry-resource-detector-alibaba-cloud": {}, "detectors/node/opentelemetry-resource-detector-aws": {}, - "detectors/node/opentelemetry-resource-detector-docker": {}, + "detectors/node/opentelemetry-resource-detector-container": {}, "detectors/node/opentelemetry-resource-detector-gcp": {}, "detectors/node/opentelemetry-resource-detector-github": {}, "detectors/node/opentelemetry-resource-detector-instana": {}, From 2c4d7098c2231b0f2df4e1fcb923d11df5d0d14a Mon Sep 17 00:00:00 2001 From: abhinav mathur Date: Fri, 30 Sep 2022 15:34:23 -0400 Subject: [PATCH 18/18] feat: replaced >= check to == check --- .../src/detectors/ContainerDetector.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 c1190e6aab..e318c8bd4e 100644 --- a/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts +++ b/detectors/node/opentelemetry-resource-detector-container/src/detectors/ContainerDetector.ts @@ -76,10 +76,8 @@ export class ContainerDetector implements Detector { .find(s => s.includes(this.HOSTNAME)); const containerIdStr = str ?.split('/') - .find(s => s.length >= this.CONTAINER_ID_LENGTH); - return containerIdStr?.substring( - containerIdStr.length - this.CONTAINER_ID_LENGTH - ); + .find(s => s.length === this.CONTAINER_ID_LENGTH); + return containerIdStr || ''; } /*