diff --git a/CHANGELOG.md b/CHANGELOG.md index 2716f9a58eb..c946fbbf104 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :bug: Bug Fixes +* fix(opentelemetry-sdk-node): the custom value from env variable for service.instance.id should take priority over random uuid as backup [#6345](https://github.com/open-telemetry/opentelemetry-js/pull/6345) @maryliag + ### :books: Documentation ### :house: Internal diff --git a/experimental/packages/opentelemetry-sdk-node/README.md b/experimental/packages/opentelemetry-sdk-node/README.md index 9fa4fd479a7..3104e420f6a 100644 --- a/experimental/packages/opentelemetry-sdk-node/README.md +++ b/experimental/packages/opentelemetry-sdk-node/README.md @@ -149,9 +149,15 @@ If `resourceDetectors` was not set, you can also use the environment variable `O For example, to enable only the `env`, `host` detectors: ```shell -export OTEL_NODE_RESOURCE_DETECTORS="env,host" +export OTEL_NODE_RESOURCE_DETECTORS="host,env" ``` +NOTE: The order set on `OTEL_NODE_RESOURCE_DETECTORS` will be respected and the detectors will be executed in order. +For example, if you have `OTEL_RESOURCE_ATTRIBUTES="service.instance.id='custom-name'"`, but also `serviceinstance` and `env` on `OTEL_NODE_RESOURCE_DETECTORS`, it can have 2 scenarios: + +- `OTEL_NODE_RESOURCE_DETECTORS="serviceinstance,env"` will have the `service.instance.id` as `custom-name` +- `OTEL_NODE_RESOURCE_DETECTORS="env,serviceinstance"` will have the `service.instance.id` as a random UUID + ### sampler Configure a custom sampler. By default, all traces will be sampled. diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index b900436dfb7..4544a3220d5 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -76,11 +76,11 @@ const RESOURCE_DETECTOR_SERVICE_INSTANCE_ID = 'serviceinstance'; export function getResourceDetectorsFromEnv(): Array { // When updating this list, make sure to also update the section `resourceDetectors` on README. const resourceDetectors = new Map([ - [RESOURCE_DETECTOR_ENVIRONMENT, envDetector], [RESOURCE_DETECTOR_HOST, hostDetector], [RESOURCE_DETECTOR_OS, osDetector], [RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, serviceInstanceIdDetector], [RESOURCE_DETECTOR_PROCESS, processDetector], + [RESOURCE_DETECTOR_ENVIRONMENT, envDetector], ]); const resourceDetectorsFromEnv = getStringListFromEnv( diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 532e4863f08..dd4a23c44d0 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -998,6 +998,60 @@ describe('Node SDK', () => { assertServiceInstanceIdIsUUID(resource); await sdk.shutdown(); }); + + it('should configure service instance id with service instance id from env variable taking priority over random UUID', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = + 'service.instance.id=custom-service,service.name=my-service'; + process.env.OTEL_NODE_RESOURCE_DETECTORS = 'all'; + const sdk = new NodeSDK({ + autoDetectResources: true, + }); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assertServiceResource(resource, { + name: 'my-service', + instanceId: 'custom-service', + }); + await sdk.shutdown(); + }); + + it('should configure service instance id with service instance id from env variable taking priority over random UUID, based on order', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = + 'service.instance.id=custom-service,service.name=my-service'; + process.env.OTEL_NODE_RESOURCE_DETECTORS = 'serviceinstance,env'; + const sdk = new NodeSDK({ + autoDetectResources: true, + }); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assertServiceResource(resource, { + name: 'my-service', + instanceId: 'custom-service', + }); + await sdk.shutdown(); + }); + + it('should configure service instance id with service instance id from env variable taking priority over random UUID, based on order', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = + 'service.instance.id=custom-service,service.name=my-service'; + process.env.OTEL_NODE_RESOURCE_DETECTORS = 'env,serviceinstance'; + const sdk = new NodeSDK({ + autoDetectResources: true, + }); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assertServiceInstanceIdIsUUID(resource); + await sdk.shutdown(); + }); }); describe('A disabled SDK should be no-op', () => {