From e38e25a66f5442ff2508f0dea7525aff2d698254 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 5 Apr 2024 10:15:20 -0400 Subject: [PATCH 01/12] feat(node-sdk): implements `service.instance.id` Implements `service.instance.id` Signed-off-by: maryliag --- CHANGELOG.md | 2 + .../opentelemetry-sdk-node/test/sdk.test.ts | 80 +++++++++++++++++-- experimental/packages/sdk-logs/package.json | 3 +- .../test/common/LoggerProvider.test.ts | 5 +- .../packages/sdk-logs/test/common/utils.ts | 33 ++++++++ .../packages/sdk-logs/tsconfig.esm.json | 3 + .../packages/sdk-logs/tsconfig.esnext.json | 3 + experimental/packages/sdk-logs/tsconfig.json | 3 + package-lock.json | 19 +---- .../test/common/transform.test.ts | 53 +++++++++--- .../opentelemetry-resources/src/Resource.ts | 24 ++++-- .../src/detectors/EnvDetectorSync.ts | 4 +- 12 files changed, 187 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e1ec010f15..9c53b6d10d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc +feat(sdk-node): set value for `service.instance.id` as random UUID as default. The value can still be overwritten by environment variable or cloud provider. + ### :bug: (Bug Fix) diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index d76534450fd..9dffa00623a 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -70,6 +70,7 @@ import { import { SEMRESATTRS_HOST_NAME, SEMRESATTRS_PROCESS_PID, + SEMRESATTRS_SERVICE_INSTANCE_ID, } from '@opentelemetry/semantic-conventions'; const DefaultContextManager = semver.gte(process.version, '14.8.0') @@ -126,6 +127,7 @@ describe('Node SDK', () => { assert.ok(!(metrics.getMeterProvider() instanceof MeterProvider)); assert.ok(!(logs.getLoggerProvider() instanceof LoggerProvider)); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('should register a diag logger with OTEL_LOG_LEVEL', () => { @@ -145,6 +147,7 @@ describe('Node SDK', () => { }); delete env.OTEL_LOG_LEVEL; + sdk.shutdown(); }); it('should not register a diag logger with OTEL_LOG_LEVEL unset', () => { @@ -158,6 +161,7 @@ describe('Node SDK', () => { sdk.start(); assert.strictEqual(spy.callCount, 0); + sdk.shutdown(); }); it('should register a tracer provider if an exporter is provided', async () => { @@ -180,6 +184,7 @@ describe('Node SDK', () => { const apiTracerProvider = trace.getTracerProvider() as ProxyTracerProvider; assert.ok(apiTracerProvider.getDelegate() instanceof NodeTracerProvider); + await sdk.shutdown(); }); it('should register a tracer provider if an exporter is provided via env', async () => { @@ -203,6 +208,7 @@ describe('Node SDK', () => { trace.getTracerProvider() as ProxyTracerProvider; assert.ok(apiTracerProvider.getDelegate() instanceof NodeTracerProvider); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('should register a tracer provider if span processors are provided', async () => { @@ -240,6 +246,7 @@ describe('Node SDK', () => { assert(listOfProcessors[0] instanceof NoopSpanProcessor); assert(listOfProcessors[1] instanceof SimpleSpanProcessor); assert(listOfProcessors[2] instanceof BatchSpanProcessor); + await sdk.shutdown(); }); it('should register a meter provider if a reader is provided', async () => { @@ -446,6 +453,7 @@ describe('Node SDK', () => { namespace: 'default', version: '0.0.1', }); + await sdk.shutdown(); }); }); @@ -497,6 +505,7 @@ describe('Node SDK', () => { namespace: 'default', version: '0.0.1', }); + await sdk.shutdown(); }); }); @@ -551,6 +560,7 @@ describe('Node SDK', () => { /{\s+"service\.instance\.id":\s+"627cc493",\s+"service\.name":\s+"my-service",\s+"service\.namespace":\s+"default",\s+"service\.version":\s+"0.0.1"\s+}\s*/gm ) ); + await sdk.shutdown(); }); describe('with a faulty environment variable', () => { @@ -578,6 +588,7 @@ describe('Node SDK', () => { 'EnvDetector failed: Attribute value should be a ASCII string with a length not exceed 255 characters.' ) ); + await sdk.shutdown(); }); }); }); @@ -595,6 +606,7 @@ describe('Node SDK', () => { assertServiceResource(resource, { name: 'config-set-name', }); + await sdk.shutdown(); }); it('should configure service name via OTEL_SERVICE_NAME env var', async () => { @@ -609,6 +621,7 @@ describe('Node SDK', () => { name: 'env-set-name', }); delete process.env.OTEL_SERVICE_NAME; + await sdk.shutdown(); }); it('should favor config set service name over OTEL_SERVICE_NAME env set service name', async () => { @@ -625,11 +638,12 @@ describe('Node SDK', () => { name: 'config-set-name', }); delete process.env.OTEL_SERVICE_NAME; + await sdk.shutdown(); }); it('should configure service name via OTEL_RESOURCE_ATTRIBUTES env var', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = - 'service.name=resource-env-set-name'; + 'service.name=resource-env-set-name,service.instance.id=my-instance-id'; const sdk = new NodeSDK(); sdk.start(); @@ -638,13 +652,15 @@ describe('Node SDK', () => { assertServiceResource(resource, { name: 'resource-env-set-name', + instanceId: 'my-instance-id', }); delete process.env.OTEL_RESOURCE_ATTRIBUTES; + await sdk.shutdown(); }); it('should favor config set service name over OTEL_RESOURCE_ATTRIBUTES env set service name', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = - 'service.name=resource-env-set-name'; + 'service.name=resource-env-set-name,service.instance.id=my-instance-id'; const sdk = new NodeSDK({ serviceName: 'config-set-name', }); @@ -655,8 +671,45 @@ describe('Node SDK', () => { assertServiceResource(resource, { name: 'config-set-name', + instanceId: 'my-instance-id', + }); + delete process.env.OTEL_RESOURCE_ATTRIBUTES; + await sdk.shutdown(); + }); + }); + + describe('configureServiceInstanceId', async () => { + it('should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = + 'service.instance.id=627cc493,service.name=my-service'; + const sdk = new NodeSDK(); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assertServiceResource(resource, { + name: 'my-service', + instanceId: '627cc493', }); delete process.env.OTEL_RESOURCE_ATTRIBUTES; + sdk.shutdown(); + }); + + it('should configure service instance id with random UUID', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; + const sdk = new NodeSDK(); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assert.equal( + resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]?.toString().length, + 36 + ); + delete process.env.OTEL_RESOURCE_ATTRIBUTES; + await sdk.shutdown(); }); }); @@ -671,7 +724,7 @@ describe('Node SDK', () => { it('should not register a trace provider', async () => { const sdk = new NodeSDK({}); - await sdk.start(); + sdk.start(); assert.strictEqual( (trace.getTracerProvider() as ProxyTracerProvider).getDelegate(), @@ -694,7 +747,7 @@ describe('Node SDK', () => { metricReader: metricReader, autoDetectResources: false, }); - await sdk.start(); + sdk.start(); assert.ok(!(metrics.getMeterProvider() instanceof MeterProvider)); @@ -730,6 +783,7 @@ describe('Node SDK', () => { await resource.waitForAsyncAttributes?.(); assert.deepStrictEqual(resource, Resource.empty()); + await sdk.shutdown(); }); }); }); @@ -758,6 +812,7 @@ describe('Node SDK', () => { assert.strictEqual(span.spanContext().spanId, 'constant-test-span-id'); assert.strictEqual(span.spanContext().traceId, 'constant-test-trace-id'); + await sdk.shutdown(); }); }); }); @@ -786,6 +841,7 @@ describe('setup exporter from env', () => { assert(sdk['_tracerProvider'] instanceof TracerProviderWithEnvExporters); assert(listOfProcessors.length === 1); assert(listOfProcessors[0] instanceof BatchSpanProcessor); + await sdk.shutdown(); }); it('ignore env exporter when user provides exporter to sdk config', async () => { const traceExporter = new ConsoleSpanExporter(); @@ -802,6 +858,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors.length === 1); assert(listOfProcessors[0] instanceof SimpleSpanProcessor === false); assert(listOfProcessors[0] instanceof BatchSpanProcessor); + await sdk.shutdown(); }); it('ignores default env exporter when user provides span processor to sdk config', async () => { const traceExporter = new ConsoleSpanExporter(); @@ -819,6 +876,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors.length === 1); assert(listOfProcessors[0] instanceof SimpleSpanProcessor); assert(listOfProcessors[0] instanceof BatchSpanProcessor === false); + await sdk.shutdown(); }); it('ignores env exporter when user provides tracer exporter to sdk config and sets exporter via env', async () => { env.OTEL_TRACES_EXPORTER = 'console'; @@ -837,6 +895,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors[0] instanceof SimpleSpanProcessor === false); assert(listOfProcessors[0] instanceof BatchSpanProcessor); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('should only create one span processor when configured using env vars and config', async () => { env.OTEL_TRACES_EXPORTER = 'console'; @@ -852,6 +911,7 @@ describe('setup exporter from env', () => { ); assert.strictEqual(listOfProcessors.length, 1); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('use otlp exporter and defined exporter protocol env value', async () => { env.OTEL_TRACES_EXPORTER = 'otlp'; @@ -866,6 +926,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors[0] instanceof BatchSpanProcessor); delete env.OTEL_TRACES_EXPORTER; delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + await sdk.shutdown(); }); it('use noop span processor when user sets env exporter to none', async () => { env.OTEL_TRACES_EXPORTER = 'none'; @@ -879,6 +940,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors.length === 0); assert(activeProcessor instanceof NoopSpanProcessor); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('log warning that sdk will not be initialized when exporter is set to none', async () => { env.OTEL_TRACES_EXPORTER = 'none'; @@ -890,16 +952,18 @@ describe('setup exporter from env', () => { 'OTEL_TRACES_EXPORTER contains "none". SDK will not be initialized.' ); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('use default otlp exporter when user does not set exporter via env or config', async () => { const sdk = new NodeSDK(); - await sdk.start(); + sdk.start(); const listOfProcessors = sdk['_tracerProvider']!['_registeredSpanProcessors']!; assert(sdk['_tracerProvider'] instanceof TracerProviderWithEnvExporters); assert(listOfProcessors.length === 1); assert(listOfProcessors[0] instanceof BatchSpanProcessor); + await sdk.shutdown(); }); it('use default otlp exporter when empty value is provided for exporter via env', async () => { env.OTEL_TRACES_EXPORTER = ''; @@ -912,6 +976,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors.length === 1); assert(listOfProcessors[0] instanceof BatchSpanProcessor); env.OTEL_TRACES_EXPORTER = ''; + await sdk.shutdown(); }); it('use only default exporter when none value is provided with other exporters', async () => { @@ -926,6 +991,7 @@ describe('setup exporter from env', () => { assert(listOfProcessors[0] instanceof BatchSpanProcessor); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('log warning that only default exporter will be used since exporter list contains none with other exports ', async () => { env.OTEL_TRACES_EXPORTER = 'otlp,zipkin,none'; @@ -937,6 +1003,7 @@ describe('setup exporter from env', () => { 'OTEL_TRACES_EXPORTER contains "none" along with other exporters. Using default otlp exporter.' ); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('should warn that provided exporter value is unrecognized and not able to be set up', async () => { env.OTEL_TRACES_EXPORTER = 'invalid'; @@ -954,6 +1021,7 @@ describe('setup exporter from env', () => { ); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); it('setup zipkin, jaeger and otlp exporters', async () => { env.OTEL_TRACES_EXPORTER = 'zipkin, otlp, jaeger'; @@ -971,6 +1039,7 @@ describe('setup exporter from env', () => { delete env.OTEL_TRACES_EXPORTER; delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + await sdk.shutdown(); }); it('use the console exporter', async () => { env.OTEL_TRACES_EXPORTER = 'console, otlp'; @@ -983,5 +1052,6 @@ describe('setup exporter from env', () => { assert(listOfProcessors[0] instanceof SimpleSpanProcessor); assert(listOfProcessors[1] instanceof BatchSpanProcessor); delete env.OTEL_TRACES_EXPORTER; + await sdk.shutdown(); }); }); diff --git a/experimental/packages/sdk-logs/package.json b/experimental/packages/sdk-logs/package.json index 04e8862ab7d..4f0b31edd48 100644 --- a/experimental/packages/sdk-logs/package.json +++ b/experimental/packages/sdk-logs/package.json @@ -102,6 +102,7 @@ }, "dependencies": { "@opentelemetry/core": "1.23.0", - "@opentelemetry/resources": "1.23.0" + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" } } diff --git a/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts b/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts index 0c4060f0ebc..0b82a22a88b 100644 --- a/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts +++ b/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts @@ -24,6 +24,7 @@ import { loadDefaultConfig } from '../../src/config'; import { DEFAULT_LOGGER_NAME } from './../../src/LoggerProvider'; import { MultiLogRecordProcessor } from '../../src/MultiLogRecordProcessor'; import { Logger } from '../../src/Logger'; +import { assertServiceResource } from './utils'; describe('LoggerProvider', () => { let envSource: Record; @@ -60,14 +61,14 @@ describe('LoggerProvider', () => { it('should have default resource if not pass', () => { const provider = new LoggerProvider(); const { resource } = provider['_sharedState']; - assert.deepStrictEqual(resource, Resource.default()); + assertServiceResource(resource, Resource.default()); }); it('should fallback to default resource attrs', () => { const passedInResource = new Resource({ foo: 'bar' }); const provider = new LoggerProvider({ resource: passedInResource }); const { resource } = provider['_sharedState']; - assert.deepStrictEqual( + assertServiceResource( resource, Resource.default().merge(passedInResource) ); diff --git a/experimental/packages/sdk-logs/test/common/utils.ts b/experimental/packages/sdk-logs/test/common/utils.ts index 80dc84e0c74..dd1c7c6f0f0 100644 --- a/experimental/packages/sdk-logs/test/common/utils.ts +++ b/experimental/packages/sdk-logs/test/common/utils.ts @@ -14,6 +14,10 @@ * limitations under the License. */ +import * as assert from 'assert'; +import { Resource } from '@opentelemetry/resources'; +import { SEMRESATTRS_SERVICE_INSTANCE_ID } from '@opentelemetry/semantic-conventions'; + export const validAttributes = { string: 'string', number: 0, @@ -32,3 +36,32 @@ export const invalidAttributes = { // This empty length attribute should not be set '': 'empty-key', }; + +/** + * Compare two Service Resource values. Since the value for service.instance.id can be a randomUUID, the function checks if the size of the value matches the size of a randomUUID and removes it from the object, otherwise leave for comparison. + * @param serviceResourceA + * @param serviceResourceB + */ +export const assertServiceResource = ( + serviceResourceA: Resource, + serviceResourceB: Resource +) => { + const UUID_REGEX = + /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; + const instanceIDAisUUID = + serviceResourceA.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] != null && + UUID_REGEX.test( + serviceResourceA.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID].toString() + ); + const instanceIDBisUUID = + serviceResourceB.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] != null && + UUID_REGEX.test( + serviceResourceB.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID].toString() + ); + if (instanceIDAisUUID && instanceIDBisUUID) { + delete serviceResourceA.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]; + delete serviceResourceB.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]; + } + + assert.deepStrictEqual(serviceResourceA, serviceResourceB); +}; diff --git a/experimental/packages/sdk-logs/tsconfig.esm.json b/experimental/packages/sdk-logs/tsconfig.esm.json index 54150ddebe8..7dfbf72fc2e 100644 --- a/experimental/packages/sdk-logs/tsconfig.esm.json +++ b/experimental/packages/sdk-logs/tsconfig.esm.json @@ -18,6 +18,9 @@ { "path": "../../../packages/opentelemetry-resources" }, + { + "path": "../../../packages/opentelemetry-semantic-conventions" + }, { "path": "../api-logs" } diff --git a/experimental/packages/sdk-logs/tsconfig.esnext.json b/experimental/packages/sdk-logs/tsconfig.esnext.json index 8cdb32ae007..21e0c639b6e 100644 --- a/experimental/packages/sdk-logs/tsconfig.esnext.json +++ b/experimental/packages/sdk-logs/tsconfig.esnext.json @@ -18,6 +18,9 @@ { "path": "../../../packages/opentelemetry-resources" }, + { + "path": "../../../packages/opentelemetry-semantic-conventions" + }, { "path": "../api-logs" } diff --git a/experimental/packages/sdk-logs/tsconfig.json b/experimental/packages/sdk-logs/tsconfig.json index 25205b8cf7c..e7b2be69e83 100644 --- a/experimental/packages/sdk-logs/tsconfig.json +++ b/experimental/packages/sdk-logs/tsconfig.json @@ -18,6 +18,9 @@ { "path": "../../../packages/opentelemetry-resources" }, + { + "path": "../../../packages/opentelemetry-semantic-conventions" + }, { "path": "../api-logs" } diff --git a/package-lock.json b/package-lock.json index bbae633a5d8..f1d33245f74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4727,7 +4727,8 @@ "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "1.23.0", - "@opentelemetry/resources": "1.23.0" + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "devDependencies": { "@babel/core": "7.23.6", @@ -4807,15 +4808,6 @@ "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, - "experimental/packages/sdk-logs/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.9.0.tgz", - "integrity": "sha512-po7penSfQ/Z8352lRVDpaBrd9znwA5mHGqXR7nDEiVnxkDFkBIhVf/tKeAJDIq/erFpcRowKFeCsr5eqqcSyFQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "experimental/packages/sdk-logs/node_modules/@webpack-cli/configtest": { "version": "2.1.1", "dev": true, @@ -43492,6 +43484,7 @@ "@opentelemetry/core": "1.23.0", "@opentelemetry/resources": "1.23.0", "@opentelemetry/resources_1.9.0": "npm:@opentelemetry/resources@1.9.0", + "@opentelemetry/semantic-conventions": "1.23.0", "@types/mocha": "10.0.6", "@types/node": "18.6.5", "@types/sinon": "10.0.20", @@ -43543,12 +43536,6 @@ } } }, - "@opentelemetry/semantic-conventions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.9.0.tgz", - "integrity": "sha512-po7penSfQ/Z8352lRVDpaBrd9znwA5mHGqXR7nDEiVnxkDFkBIhVf/tKeAJDIq/erFpcRowKFeCsr5eqqcSyFQ==", - "dev": true - }, "@webpack-cli/configtest": { "version": "2.1.1", "dev": true, diff --git a/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts index c7def85fc42..0c79f571125 100644 --- a/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts @@ -23,7 +23,11 @@ import { import { Resource } from '@opentelemetry/resources'; import { BasicTracerProvider, Span } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { + SEMRESATTRS_SERVICE_INSTANCE_ID, + SEMRESATTRS_SERVICE_NAME, + SEMRESATTRS_TELEMETRY_SDK_LANGUAGE, +} from '@opentelemetry/semantic-conventions'; import { defaultStatusCodeTagName, defaultStatusErrorTagName, @@ -35,7 +39,7 @@ import * as zipkinTypes from '../../src/types'; const tracer = new BasicTracerProvider({ resource: Resource.default().merge( new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', cost: '112.12', service: 'ui', version: '1', @@ -43,8 +47,7 @@ const tracer = new BasicTracerProvider({ ), }).getTracer('default'); -const language = - tracer.resource.attributes[SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]; +const language = tracer.resource.attributes[SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]; const parentId = '5c1c63257de34c67'; const spanContext: api.SpanContext = { @@ -68,6 +71,8 @@ describe('transform', () => { key1: 'value1', key2: 'value2', }); + span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; span.addEvent('my-event', { key3: 'value3' }); span.end(); @@ -97,7 +102,9 @@ describe('transform', () => { tags: { key1: 'value1', key2: 'value2', - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', cost: '112.12', service: 'ui', version: '1', @@ -117,6 +124,8 @@ describe('transform', () => { spanContext, api.SpanKind.SERVER ); + span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; span.end(); const zipkinSpan = toZipkinSpan( @@ -138,7 +147,9 @@ describe('transform', () => { name: span.name, parentId: undefined, tags: { - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', cost: '112.12', service: 'ui', version: '1', @@ -168,6 +179,8 @@ describe('transform', () => { spanContext, item.ot ); + span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; span.end(); const zipkinSpan = toZipkinSpan( @@ -189,7 +202,9 @@ describe('transform', () => { name: span.name, parentId: undefined, tags: { - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', cost: '112.12', service: 'ui', version: '1', @@ -218,6 +233,8 @@ describe('transform', () => { key1: 'value1', key2: 'value2', }); + span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; const tags: zipkinTypes.Tags = _toZipkinTags( span, defaultStatusCodeTagName, @@ -227,7 +244,9 @@ describe('transform', () => { assert.deepStrictEqual(tags, { key1: 'value1', key2: 'value2', - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, @@ -250,6 +269,8 @@ describe('transform', () => { { key1: 'value1', key2: 'value2', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', } ); const tags: zipkinTypes.Tags = _toZipkinTags( @@ -261,7 +282,9 @@ describe('transform', () => { assert.deepStrictEqual(tags, { key1: 'value1', key2: 'value2', - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, @@ -286,6 +309,8 @@ describe('transform', () => { span.setAttributes({ key1: 'value1', key2: 'value2', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', }); const tags: zipkinTypes.Tags = _toZipkinTags( span, @@ -297,7 +322,9 @@ describe('transform', () => { key1: 'value1', key2: 'value2', [defaultStatusCodeTagName]: 'ERROR', - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, @@ -323,6 +350,8 @@ describe('transform', () => { span.setAttributes({ key1: 'value1', key2: 'value2', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', }); const tags: zipkinTypes.Tags = _toZipkinTags( span, @@ -335,7 +364,9 @@ describe('transform', () => { key2: 'value2', [defaultStatusCodeTagName]: 'ERROR', [defaultStatusErrorTagName]: status.message, - [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SEMRESATTRS_SERVICE_INSTANCE_ID]: + 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index dfddda8ae1a..8ba00981ca7 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -15,11 +15,18 @@ */ import { diag } from '@opentelemetry/api'; -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { + SEMRESATTRS_SERVICE_INSTANCE_ID, + SEMRESATTRS_SERVICE_NAME, + SEMRESATTRS_TELEMETRY_SDK_LANGUAGE, + SEMRESATTRS_TELEMETRY_SDK_NAME, + SEMRESATTRS_TELEMETRY_SDK_VERSION, +} from '@opentelemetry/semantic-conventions'; import { SDK_INFO } from '@opentelemetry/core'; import { ResourceAttributes } from './types'; import { defaultServiceName } from './platform'; import { IResource } from './IResource'; +import { randomUUID } from 'crypto'; /** * A Resource describes the entity for which a signals (metrics or trace) are @@ -51,13 +58,14 @@ export class Resource implements IResource { */ static default(): IResource { return new Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: defaultServiceName(), - [SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]: - SDK_INFO[SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE], - [SemanticResourceAttributes.TELEMETRY_SDK_NAME]: - SDK_INFO[SemanticResourceAttributes.TELEMETRY_SDK_NAME], - [SemanticResourceAttributes.TELEMETRY_SDK_VERSION]: - SDK_INFO[SemanticResourceAttributes.TELEMETRY_SDK_VERSION], + [SEMRESATTRS_SERVICE_NAME]: defaultServiceName(), + [SEMRESATTRS_SERVICE_INSTANCE_ID]: randomUUID(), + [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: + SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_LANGUAGE], + [SEMRESATTRS_TELEMETRY_SDK_NAME]: + SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_NAME], + [SEMRESATTRS_TELEMETRY_SDK_VERSION]: + SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_VERSION], }); } diff --git a/packages/opentelemetry-resources/src/detectors/EnvDetectorSync.ts b/packages/opentelemetry-resources/src/detectors/EnvDetectorSync.ts index 8572323a09d..329d489ec4d 100644 --- a/packages/opentelemetry-resources/src/detectors/EnvDetectorSync.ts +++ b/packages/opentelemetry-resources/src/detectors/EnvDetectorSync.ts @@ -16,7 +16,7 @@ import { diag } from '@opentelemetry/api'; import { getEnv } from '@opentelemetry/core'; -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { Resource } from '../Resource'; import { DetectorSync, ResourceAttributes } from '../types'; import { ResourceDetectionConfig } from '../config'; @@ -70,7 +70,7 @@ class EnvDetectorSync implements DetectorSync { } if (serviceName) { - attributes[SemanticResourceAttributes.SERVICE_NAME] = serviceName; + attributes[SEMRESATTRS_SERVICE_NAME] = serviceName; } return new Resource(attributes); From b729f0b4eac686218d93395845a6cf085183dcf9 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 9 Apr 2024 15:40:44 -0400 Subject: [PATCH 02/12] implement service instance id by default with env var use an experimental environment variable to set the default value of `service.instance.id` as default --- CHANGELOG.md | 3 +- .../opentelemetry-sdk-node/test/sdk.test.ts | 42 ++++++++++++++- experimental/packages/sdk-logs/package.json | 3 +- .../test/common/LoggerProvider.test.ts | 5 +- .../packages/sdk-logs/test/common/utils.ts | 33 ------------ .../packages/sdk-logs/tsconfig.esm.json | 3 -- .../packages/sdk-logs/tsconfig.esnext.json | 3 -- experimental/packages/sdk-logs/tsconfig.json | 3 -- package-lock.json | 4 +- .../src/utils/environment.ts | 6 ++- .../test/common/transform.test.ts | 53 ++++--------------- .../opentelemetry-resources/src/Resource.ts | 11 +++- 12 files changed, 71 insertions(+), 98 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c53b6d10d3..6b02542f4b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,7 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -feat(sdk-node): set value for `service.instance.id` as random UUID as default. The value can still be overwritten by environment variable or cloud provider. - +feat(sdk-node): set value for `service.instance.id` as random UUID as default if environment variable `OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID` is set to true. The value can still be overwritten by the value of `service.instance.id` on the environment variable `OTEL_RESOURCE_ATTRIBUTES` or bt the cloud provider. ### :bug: (Bug Fix) diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 9dffa00623a..077f6715b1f 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -696,8 +696,10 @@ describe('Node SDK', () => { sdk.shutdown(); }); - it('should configure service instance id with random UUID', async () => { + it('should configure service instance id with random UUID with OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; + process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = + 'true'; const sdk = new NodeSDK(); sdk.start(); @@ -709,8 +711,46 @@ describe('Node SDK', () => { 36 ); delete process.env.OTEL_RESOURCE_ATTRIBUTES; + delete process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; await sdk.shutdown(); }); + + it('should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var even with OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = + 'service.instance.id=627cc493,service.name=my-service'; + process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = + 'true'; + const sdk = new NodeSDK(); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assertServiceResource(resource, { + name: 'my-service', + instanceId: '627cc493', + }); + delete process.env.OTEL_RESOURCE_ATTRIBUTES; + delete process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; + sdk.shutdown(); + }); + + it('should not configure service instance id with no value for it on OTEL_RESOURCE_ATTRIBUTES env var and OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var as false', async () => { + process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; + process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = + 'false'; + const sdk = new NodeSDK(); + + sdk.start(); + const resource = sdk['_resource']; + await resource.waitForAsyncAttributes?.(); + + assertServiceResource(resource, { + name: 'my-service', + }); + delete process.env.OTEL_RESOURCE_ATTRIBUTES; + sdk.shutdown(); + }); }); describe('A disabled SDK should be no-op', () => { diff --git a/experimental/packages/sdk-logs/package.json b/experimental/packages/sdk-logs/package.json index 4f0b31edd48..04e8862ab7d 100644 --- a/experimental/packages/sdk-logs/package.json +++ b/experimental/packages/sdk-logs/package.json @@ -102,7 +102,6 @@ }, "dependencies": { "@opentelemetry/core": "1.23.0", - "@opentelemetry/resources": "1.23.0", - "@opentelemetry/semantic-conventions": "1.23.0" + "@opentelemetry/resources": "1.23.0" } } diff --git a/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts b/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts index 0b82a22a88b..0c4060f0ebc 100644 --- a/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts +++ b/experimental/packages/sdk-logs/test/common/LoggerProvider.test.ts @@ -24,7 +24,6 @@ import { loadDefaultConfig } from '../../src/config'; import { DEFAULT_LOGGER_NAME } from './../../src/LoggerProvider'; import { MultiLogRecordProcessor } from '../../src/MultiLogRecordProcessor'; import { Logger } from '../../src/Logger'; -import { assertServiceResource } from './utils'; describe('LoggerProvider', () => { let envSource: Record; @@ -61,14 +60,14 @@ describe('LoggerProvider', () => { it('should have default resource if not pass', () => { const provider = new LoggerProvider(); const { resource } = provider['_sharedState']; - assertServiceResource(resource, Resource.default()); + assert.deepStrictEqual(resource, Resource.default()); }); it('should fallback to default resource attrs', () => { const passedInResource = new Resource({ foo: 'bar' }); const provider = new LoggerProvider({ resource: passedInResource }); const { resource } = provider['_sharedState']; - assertServiceResource( + assert.deepStrictEqual( resource, Resource.default().merge(passedInResource) ); diff --git a/experimental/packages/sdk-logs/test/common/utils.ts b/experimental/packages/sdk-logs/test/common/utils.ts index dd1c7c6f0f0..80dc84e0c74 100644 --- a/experimental/packages/sdk-logs/test/common/utils.ts +++ b/experimental/packages/sdk-logs/test/common/utils.ts @@ -14,10 +14,6 @@ * limitations under the License. */ -import * as assert from 'assert'; -import { Resource } from '@opentelemetry/resources'; -import { SEMRESATTRS_SERVICE_INSTANCE_ID } from '@opentelemetry/semantic-conventions'; - export const validAttributes = { string: 'string', number: 0, @@ -36,32 +32,3 @@ export const invalidAttributes = { // This empty length attribute should not be set '': 'empty-key', }; - -/** - * Compare two Service Resource values. Since the value for service.instance.id can be a randomUUID, the function checks if the size of the value matches the size of a randomUUID and removes it from the object, otherwise leave for comparison. - * @param serviceResourceA - * @param serviceResourceB - */ -export const assertServiceResource = ( - serviceResourceA: Resource, - serviceResourceB: Resource -) => { - const UUID_REGEX = - /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; - const instanceIDAisUUID = - serviceResourceA.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] != null && - UUID_REGEX.test( - serviceResourceA.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID].toString() - ); - const instanceIDBisUUID = - serviceResourceB.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] != null && - UUID_REGEX.test( - serviceResourceB.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID].toString() - ); - if (instanceIDAisUUID && instanceIDBisUUID) { - delete serviceResourceA.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]; - delete serviceResourceB.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]; - } - - assert.deepStrictEqual(serviceResourceA, serviceResourceB); -}; diff --git a/experimental/packages/sdk-logs/tsconfig.esm.json b/experimental/packages/sdk-logs/tsconfig.esm.json index 7dfbf72fc2e..54150ddebe8 100644 --- a/experimental/packages/sdk-logs/tsconfig.esm.json +++ b/experimental/packages/sdk-logs/tsconfig.esm.json @@ -18,9 +18,6 @@ { "path": "../../../packages/opentelemetry-resources" }, - { - "path": "../../../packages/opentelemetry-semantic-conventions" - }, { "path": "../api-logs" } diff --git a/experimental/packages/sdk-logs/tsconfig.esnext.json b/experimental/packages/sdk-logs/tsconfig.esnext.json index 21e0c639b6e..8cdb32ae007 100644 --- a/experimental/packages/sdk-logs/tsconfig.esnext.json +++ b/experimental/packages/sdk-logs/tsconfig.esnext.json @@ -18,9 +18,6 @@ { "path": "../../../packages/opentelemetry-resources" }, - { - "path": "../../../packages/opentelemetry-semantic-conventions" - }, { "path": "../api-logs" } diff --git a/experimental/packages/sdk-logs/tsconfig.json b/experimental/packages/sdk-logs/tsconfig.json index e7b2be69e83..25205b8cf7c 100644 --- a/experimental/packages/sdk-logs/tsconfig.json +++ b/experimental/packages/sdk-logs/tsconfig.json @@ -18,9 +18,6 @@ { "path": "../../../packages/opentelemetry-resources" }, - { - "path": "../../../packages/opentelemetry-semantic-conventions" - }, { "path": "../api-logs" } diff --git a/package-lock.json b/package-lock.json index f1d33245f74..73a66d070e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4727,8 +4727,7 @@ "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "1.23.0", - "@opentelemetry/resources": "1.23.0", - "@opentelemetry/semantic-conventions": "1.23.0" + "@opentelemetry/resources": "1.23.0" }, "devDependencies": { "@babel/core": "7.23.6", @@ -43484,7 +43483,6 @@ "@opentelemetry/core": "1.23.0", "@opentelemetry/resources": "1.23.0", "@opentelemetry/resources_1.9.0": "npm:@opentelemetry/resources@1.9.0", - "@opentelemetry/semantic-conventions": "1.23.0", "@types/mocha": "10.0.6", "@types/node": "18.6.5", "@types/sinon": "10.0.20", diff --git a/packages/opentelemetry-core/src/utils/environment.ts b/packages/opentelemetry-core/src/utils/environment.ts index fda6e103b7d..7a8f3e16236 100644 --- a/packages/opentelemetry-core/src/utils/environment.ts +++ b/packages/opentelemetry-core/src/utils/environment.ts @@ -24,7 +24,10 @@ const DEFAULT_LIST_SEPARATOR = ','; * Environment interface to define all names */ -const ENVIRONMENT_BOOLEAN_KEYS = ['OTEL_SDK_DISABLED'] as const; +const ENVIRONMENT_BOOLEAN_KEYS = [ + 'OTEL_SDK_DISABLED', + 'OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID', +] as const; type ENVIRONMENT_BOOLEANS = { [K in (typeof ENVIRONMENT_BOOLEAN_KEYS)[number]]?: boolean; @@ -236,6 +239,7 @@ export const DEFAULT_ENVIRONMENT: Required = { OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: 'http/protobuf', OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'http/protobuf', OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: 'cumulative', + OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID: false, }; /** diff --git a/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts b/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts index 0c79f571125..c7def85fc42 100644 --- a/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts +++ b/packages/opentelemetry-exporter-zipkin/test/common/transform.test.ts @@ -23,11 +23,7 @@ import { import { Resource } from '@opentelemetry/resources'; import { BasicTracerProvider, Span } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; -import { - SEMRESATTRS_SERVICE_INSTANCE_ID, - SEMRESATTRS_SERVICE_NAME, - SEMRESATTRS_TELEMETRY_SDK_LANGUAGE, -} from '@opentelemetry/semantic-conventions'; +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; import { defaultStatusCodeTagName, defaultStatusErrorTagName, @@ -39,7 +35,7 @@ import * as zipkinTypes from '../../src/types'; const tracer = new BasicTracerProvider({ resource: Resource.default().merge( new Resource({ - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', cost: '112.12', service: 'ui', version: '1', @@ -47,7 +43,8 @@ const tracer = new BasicTracerProvider({ ), }).getTracer('default'); -const language = tracer.resource.attributes[SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]; +const language = + tracer.resource.attributes[SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]; const parentId = '5c1c63257de34c67'; const spanContext: api.SpanContext = { @@ -71,8 +68,6 @@ describe('transform', () => { key1: 'value1', key2: 'value2', }); - span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; span.addEvent('my-event', { key3: 'value3' }); span.end(); @@ -102,9 +97,7 @@ describe('transform', () => { tags: { key1: 'value1', key2: 'value2', - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', cost: '112.12', service: 'ui', version: '1', @@ -124,8 +117,6 @@ describe('transform', () => { spanContext, api.SpanKind.SERVER ); - span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; span.end(); const zipkinSpan = toZipkinSpan( @@ -147,9 +138,7 @@ describe('transform', () => { name: span.name, parentId: undefined, tags: { - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', cost: '112.12', service: 'ui', version: '1', @@ -179,8 +168,6 @@ describe('transform', () => { spanContext, item.ot ); - span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; span.end(); const zipkinSpan = toZipkinSpan( @@ -202,9 +189,7 @@ describe('transform', () => { name: span.name, parentId: undefined, tags: { - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', cost: '112.12', service: 'ui', version: '1', @@ -233,8 +218,6 @@ describe('transform', () => { key1: 'value1', key2: 'value2', }); - span.resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b'; const tags: zipkinTypes.Tags = _toZipkinTags( span, defaultStatusCodeTagName, @@ -244,9 +227,7 @@ describe('transform', () => { assert.deepStrictEqual(tags, { key1: 'value1', key2: 'value2', - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, @@ -269,8 +250,6 @@ describe('transform', () => { { key1: 'value1', key2: 'value2', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', } ); const tags: zipkinTypes.Tags = _toZipkinTags( @@ -282,9 +261,7 @@ describe('transform', () => { assert.deepStrictEqual(tags, { key1: 'value1', key2: 'value2', - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, @@ -309,8 +286,6 @@ describe('transform', () => { span.setAttributes({ key1: 'value1', key2: 'value2', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', }); const tags: zipkinTypes.Tags = _toZipkinTags( span, @@ -322,9 +297,7 @@ describe('transform', () => { key1: 'value1', key2: 'value2', [defaultStatusCodeTagName]: 'ERROR', - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, @@ -350,8 +323,6 @@ describe('transform', () => { span.setAttributes({ key1: 'value1', key2: 'value2', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', }); const tags: zipkinTypes.Tags = _toZipkinTags( span, @@ -364,9 +335,7 @@ describe('transform', () => { key2: 'value2', [defaultStatusCodeTagName]: 'ERROR', [defaultStatusErrorTagName]: status.message, - [SEMRESATTRS_SERVICE_NAME]: 'zipkin-test', - [SEMRESATTRS_SERVICE_INSTANCE_ID]: - 'faabc844-c78f-4d87-952d-cbb4ca4cbf6b', + [SemanticResourceAttributes.SERVICE_NAME]: 'zipkin-test', 'telemetry.sdk.language': language, 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': VERSION, diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index 8ba00981ca7..c18492ed748 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -26,6 +26,7 @@ import { SDK_INFO } from '@opentelemetry/core'; import { ResourceAttributes } from './types'; import { defaultServiceName } from './platform'; import { IResource } from './IResource'; +import { getEnv } from '@opentelemetry/core'; import { randomUUID } from 'crypto'; /** @@ -57,9 +58,8 @@ export class Resource implements IResource { * Returns a Resource that identifies the SDK in use. */ static default(): IResource { - return new Resource({ + const defaultResource = new Resource({ [SEMRESATTRS_SERVICE_NAME]: defaultServiceName(), - [SEMRESATTRS_SERVICE_INSTANCE_ID]: randomUUID(), [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_LANGUAGE], [SEMRESATTRS_TELEMETRY_SDK_NAME]: @@ -67,6 +67,13 @@ export class Resource implements IResource { [SEMRESATTRS_TELEMETRY_SDK_VERSION]: SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_VERSION], }); + + if (getEnv().OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID) { + defaultResource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = + randomUUID(); + } + + return defaultResource; } constructor( From 6b005649f30d47cb64b12c8c06a8e1240a6bb482 Mon Sep 17 00:00:00 2001 From: Marylia Gutierrez Date: Wed, 10 Apr 2024 08:40:11 -0400 Subject: [PATCH 03/12] Update CHANGELOG.md Co-authored-by: Marc Pichler --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b02542f4b3..603f95c3029 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,12 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) -feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -feat(sdk-node): set value for `service.instance.id` as random UUID as default if environment variable `OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID` is set to true. The value can still be overwritten by the value of `service.instance.id` on the environment variable `OTEL_RESOURCE_ATTRIBUTES` or bt the cloud provider. +* feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc +* feat(resources): set value for `service.instance.id` as random UUID by default if environment variable `OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID` is set to true. + * The value can be overwritten by + * merging a resource containing the `service.instance.id` attribute + * setting `service.instance.id` via the `OTEL_RESOURCE_ATTRIBUTES` environment variable when using `envDetector` + * using another resource detector which writes `service.instance.id` ### :bug: (Bug Fix) From 7976713789b44fbab979518b6e8963180040712a Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 10 Apr 2024 09:01:26 -0400 Subject: [PATCH 04/12] create separate add experimental for browser and node create a function to add experimental default values (currently only service instance id, but others can be added in the future), with the value being set on the node case, but not on the browser case. Signed-off-by: maryliag --- CHANGELOG.md | 6 ++--- .../opentelemetry-sdk-node/test/sdk.test.ts | 19 ++++++-------- .../src/utils/environment.ts | 4 +-- .../opentelemetry-resources/src/Resource.ts | 10 ++----- .../browser/default-experimental-values.ts | 19 ++++++++++++++ .../src/platform/browser/index.ts | 1 + .../node/default-experimental-values.ts | 26 +++++++++++++++++++ .../src/platform/node/index.ts | 1 + 8 files changed, 62 insertions(+), 24 deletions(-) create mode 100644 packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts create mode 100644 packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 603f95c3029..110fc231661 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,10 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) * feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -* feat(resources): set value for `service.instance.id` as random UUID by default if environment variable `OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID` is set to true. - * The value can be overwritten by +* feat(resources): set value for `service.instance.id` as random UUID by default if environment variable `OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID` is set to true. + * The value can be overwritten by * merging a resource containing the `service.instance.id` attribute - * setting `service.instance.id` via the `OTEL_RESOURCE_ATTRIBUTES` environment variable when using `envDetector` + * setting `service.instance.id` via the `OTEL_RESOURCE_ATTRIBUTES` environment variable when using `envDetector` * using another resource detector which writes `service.instance.id` ### :bug: (Bug Fix) diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 077f6715b1f..42457069105 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -696,10 +696,9 @@ describe('Node SDK', () => { sdk.shutdown(); }); - it('should configure service instance id with random UUID with OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { + it('should configure service instance id with random UUID with OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; - process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = - 'true'; + process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = 'true'; const sdk = new NodeSDK(); sdk.start(); @@ -711,15 +710,14 @@ describe('Node SDK', () => { 36 ); delete process.env.OTEL_RESOURCE_ATTRIBUTES; - delete process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; + delete process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; await sdk.shutdown(); }); - it('should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var even with OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { + it('should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var even with OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.instance.id=627cc493,service.name=my-service'; - process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = - 'true'; + process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = 'true'; const sdk = new NodeSDK(); sdk.start(); @@ -731,14 +729,13 @@ describe('Node SDK', () => { instanceId: '627cc493', }); delete process.env.OTEL_RESOURCE_ATTRIBUTES; - delete process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; + delete process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; sdk.shutdown(); }); - it('should not configure service instance id with no value for it on OTEL_RESOURCE_ATTRIBUTES env var and OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var as false', async () => { + it('should not configure service instance id with no value for it on OTEL_RESOURCE_ATTRIBUTES env var and OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var as false', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; - process.env.OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = - 'false'; + process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = 'false'; const sdk = new NodeSDK(); sdk.start(); diff --git a/packages/opentelemetry-core/src/utils/environment.ts b/packages/opentelemetry-core/src/utils/environment.ts index 7a8f3e16236..acbb3ff3cc5 100644 --- a/packages/opentelemetry-core/src/utils/environment.ts +++ b/packages/opentelemetry-core/src/utils/environment.ts @@ -26,7 +26,7 @@ const DEFAULT_LIST_SEPARATOR = ','; const ENVIRONMENT_BOOLEAN_KEYS = [ 'OTEL_SDK_DISABLED', - 'OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID', + 'OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID', ] as const; type ENVIRONMENT_BOOLEANS = { @@ -239,7 +239,7 @@ export const DEFAULT_ENVIRONMENT: Required = { OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: 'http/protobuf', OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'http/protobuf', OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: 'cumulative', - OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID: false, + OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID: false, }; /** diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index c18492ed748..adc644b8702 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -16,7 +16,6 @@ import { diag } from '@opentelemetry/api'; import { - SEMRESATTRS_SERVICE_INSTANCE_ID, SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_TELEMETRY_SDK_LANGUAGE, SEMRESATTRS_TELEMETRY_SDK_NAME, @@ -24,10 +23,8 @@ import { } from '@opentelemetry/semantic-conventions'; import { SDK_INFO } from '@opentelemetry/core'; import { ResourceAttributes } from './types'; -import { defaultServiceName } from './platform'; +import { defaultServiceName, addExperimentalDefault } from './platform'; import { IResource } from './IResource'; -import { getEnv } from '@opentelemetry/core'; -import { randomUUID } from 'crypto'; /** * A Resource describes the entity for which a signals (metrics or trace) are @@ -68,10 +65,7 @@ export class Resource implements IResource { SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_VERSION], }); - if (getEnv().OTEL_NODE_JS_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID) { - defaultResource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = - randomUUID(); - } + addExperimentalDefault(defaultResource); return defaultResource; } diff --git a/packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts b/packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts new file mode 100644 index 00000000000..3fefcca8a06 --- /dev/null +++ b/packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts @@ -0,0 +1,19 @@ +/* + * 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 { IResource } from '../../IResource'; + +export function addExperimentalDefault(_: IResource): void {} diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index 9ed1b0151b1..3d66512d61d 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -15,6 +15,7 @@ */ export * from './default-service-name'; +export * from './default-experimental-values'; export * from './HostDetector'; export * from './OSDetector'; export * from './HostDetectorSync'; diff --git a/packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts b/packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts new file mode 100644 index 00000000000..d8ab997d378 --- /dev/null +++ b/packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts @@ -0,0 +1,26 @@ +/* + * 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 { IResource } from '../../IResource'; +import { getEnv } from '@opentelemetry/core'; +import { randomUUID } from 'crypto'; +import { SEMRESATTRS_SERVICE_INSTANCE_ID } from '@opentelemetry/semantic-conventions'; + +export function addExperimentalDefault(resource: IResource): void { + if (getEnv().OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID) { + resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = randomUUID(); + } +} diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index 9ed1b0151b1..3d66512d61d 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -15,6 +15,7 @@ */ export * from './default-service-name'; +export * from './default-experimental-values'; export * from './HostDetector'; export * from './OSDetector'; export * from './HostDetectorSync'; From 0f961581b12dc656f4420444eb1ff1995f4d5a22 Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 10 Apr 2024 13:38:14 -0400 Subject: [PATCH 05/12] use resource detector for service instance id use a resource detector for service instance id --- .../opentelemetry-sdk-node/src/sdk.ts | 13 ++++--- .../opentelemetry-sdk-node/test/sdk.test.ts | 11 ++++-- .../opentelemetry-resources/src/Resource.ts | 8 +--- ...values.ts => ServiceInstanceIDDetector.ts} | 4 +- .../ServiceInstanceIDDetectorSync.ts} | 11 +----- .../src/platform/browser/index.ts | 2 +- .../node/ServiceInstanceIDDetector.ts | 31 ++++++++++++++++ .../node/ServiceInstanceIDDetectorSync.ts | 37 +++++++++++++++++++ .../src/platform/node/index.ts | 2 +- 9 files changed, 92 insertions(+), 27 deletions(-) rename packages/opentelemetry-resources/src/platform/browser/{default-experimental-values.ts => ServiceInstanceIDDetector.ts} (83%) rename packages/opentelemetry-resources/src/platform/{node/default-experimental-values.ts => browser/ServiceInstanceIDDetectorSync.ts} (58%) create mode 100644 packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts create mode 100644 packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index c5f38d63a91..ed20939a2ce 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -36,6 +36,7 @@ import { processDetector, Resource, ResourceDetectionConfig, + serviceInstanceIDDetector, } from '@opentelemetry/resources'; import { LogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs'; import { MeterProvider, MetricReader, View } from '@opentelemetry/sdk-metrics'; @@ -121,11 +122,13 @@ export class NodeSDK { this._configuration = configuration; this._resource = configuration.resource ?? new Resource({}); - this._resourceDetectors = configuration.resourceDetectors ?? [ - envDetector, - processDetector, - hostDetector, - ]; + const defaultDetectors = [envDetector, processDetector, hostDetector]; + + if (env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID) { + defaultDetectors.push(serviceInstanceIDDetector); + } + this._resourceDetectors = + configuration.resourceDetectors ?? defaultDetectors; this._serviceName = configuration.serviceName; diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 42457069105..9119504f748 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -705,10 +705,15 @@ describe('Node SDK', () => { const resource = sdk['_resource']; await resource.waitForAsyncAttributes?.(); + const UUID_REGEX = + /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; assert.equal( - resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]?.toString().length, - 36 + UUID_REGEX.test( + resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID]?.toString() || '' + ), + true ); + delete process.env.OTEL_RESOURCE_ATTRIBUTES; delete process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; await sdk.shutdown(); @@ -746,7 +751,7 @@ describe('Node SDK', () => { name: 'my-service', }); delete process.env.OTEL_RESOURCE_ATTRIBUTES; - sdk.shutdown(); + await sdk.shutdown(); }); }); diff --git a/packages/opentelemetry-resources/src/Resource.ts b/packages/opentelemetry-resources/src/Resource.ts index adc644b8702..d44dbacc4df 100644 --- a/packages/opentelemetry-resources/src/Resource.ts +++ b/packages/opentelemetry-resources/src/Resource.ts @@ -23,7 +23,7 @@ import { } from '@opentelemetry/semantic-conventions'; import { SDK_INFO } from '@opentelemetry/core'; import { ResourceAttributes } from './types'; -import { defaultServiceName, addExperimentalDefault } from './platform'; +import { defaultServiceName } from './platform'; import { IResource } from './IResource'; /** @@ -55,7 +55,7 @@ export class Resource implements IResource { * Returns a Resource that identifies the SDK in use. */ static default(): IResource { - const defaultResource = new Resource({ + return new Resource({ [SEMRESATTRS_SERVICE_NAME]: defaultServiceName(), [SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_LANGUAGE], @@ -64,10 +64,6 @@ export class Resource implements IResource { [SEMRESATTRS_TELEMETRY_SDK_VERSION]: SDK_INFO[SEMRESATTRS_TELEMETRY_SDK_VERSION], }); - - addExperimentalDefault(defaultResource); - - return defaultResource; } constructor( diff --git a/packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts similarity index 83% rename from packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts rename to packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts index 3fefcca8a06..8874d738c2d 100644 --- a/packages/opentelemetry-resources/src/platform/browser/default-experimental-values.ts +++ b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -import { IResource } from '../../IResource'; +import { noopDetector } from '../../detectors/NoopDetector'; -export function addExperimentalDefault(_: IResource): void {} +export const serviceInstanceIDDetector = noopDetector; diff --git a/packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts similarity index 58% rename from packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts rename to packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts index d8ab997d378..81827e93f1f 100644 --- a/packages/opentelemetry-resources/src/platform/node/default-experimental-values.ts +++ b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts @@ -14,13 +14,6 @@ * limitations under the License. */ -import { IResource } from '../../IResource'; -import { getEnv } from '@opentelemetry/core'; -import { randomUUID } from 'crypto'; -import { SEMRESATTRS_SERVICE_INSTANCE_ID } from '@opentelemetry/semantic-conventions'; +import { noopDetectorSync } from '../../detectors/NoopDetectorSync'; -export function addExperimentalDefault(resource: IResource): void { - if (getEnv().OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID) { - resource.attributes[SEMRESATTRS_SERVICE_INSTANCE_ID] = randomUUID(); - } -} +export const serviceInstanceIDDetectorSync = noopDetectorSync; diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index 3d66512d61d..757d0a116cc 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -15,10 +15,10 @@ */ export * from './default-service-name'; -export * from './default-experimental-values'; export * from './HostDetector'; export * from './OSDetector'; export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; +export * from './ServiceInstanceIDDetector'; diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts new file mode 100644 index 00000000000..7a999e3fa61 --- /dev/null +++ b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts @@ -0,0 +1,31 @@ +/* + * 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 } from '../../types'; +import { ResourceDetectionConfig } from '../../config'; +import { IResource } from '../../IResource'; +import { serviceInstanceIDDetectorSync } from '../browser/ServiceInstanceIDDetectorSync'; + +/** + * ServiceInstanceIDDetector detects the resources related to the service instance ID. + */ +class ServiceInstanceIDDetector implements Detector { + detect(_config?: ResourceDetectionConfig): Promise { + return Promise.resolve(serviceInstanceIDDetectorSync.detect()); + } +} + +export const serviceInstanceIDDetector = new ServiceInstanceIDDetector(); diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts new file mode 100644 index 00000000000..8e624852cda --- /dev/null +++ b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts @@ -0,0 +1,37 @@ +/* + * 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 { SEMRESATTRS_SERVICE_INSTANCE_ID } from '@opentelemetry/semantic-conventions'; +import { Resource } from '../../Resource'; +import { DetectorSync, ResourceAttributes } from '../../types'; +import { ResourceDetectionConfig } from '../../config'; +import { randomUUID } from 'crypto'; + +/** + * ServiceInstanceIDDetectorSync detects the resources related to the service instance ID. + */ +class ServiceInstanceIDDetectorSync implements DetectorSync { + detect(_config?: ResourceDetectionConfig): Resource { + const attributes: ResourceAttributes = { + [SEMRESATTRS_SERVICE_INSTANCE_ID]: randomUUID(), + }; + + return new Resource(attributes); + } +} + +export const serviceInstanceIDDetectorSync = + new ServiceInstanceIDDetectorSync(); diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index 3d66512d61d..757d0a116cc 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -15,10 +15,10 @@ */ export * from './default-service-name'; -export * from './default-experimental-values'; export * from './HostDetector'; export * from './OSDetector'; export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; +export * from './ServiceInstanceIDDetector'; From 032c6608c1eabaaa13435c16c457f2e0bd5c5a1c Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 10 Apr 2024 16:51:14 -0400 Subject: [PATCH 06/12] remove references to env variables --- CHANGELOG.md | 6 +-- .../opentelemetry-sdk-node/src/sdk.ts | 13 ++--- .../opentelemetry-sdk-node/test/sdk.test.ts | 53 ++++--------------- .../src/utils/environment.ts | 6 +-- 4 files changed, 18 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 110fc231661..5acc2d69ee0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,7 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) * feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -* feat(resources): set value for `service.instance.id` as random UUID by default if environment variable `OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID` is set to true. - * The value can be overwritten by - * merging a resource containing the `service.instance.id` attribute - * setting `service.instance.id` via the `OTEL_RESOURCE_ATTRIBUTES` environment variable when using `envDetector` - * using another resource detector which writes `service.instance.id` +* feat(resources): new detector ServiceInstanceIDDetector that sets the value for `service.instance.id` as random UUID. ### :bug: (Bug Fix) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index ed20939a2ce..c5f38d63a91 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -36,7 +36,6 @@ import { processDetector, Resource, ResourceDetectionConfig, - serviceInstanceIDDetector, } from '@opentelemetry/resources'; import { LogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs'; import { MeterProvider, MetricReader, View } from '@opentelemetry/sdk-metrics'; @@ -122,13 +121,11 @@ export class NodeSDK { this._configuration = configuration; this._resource = configuration.resource ?? new Resource({}); - const defaultDetectors = [envDetector, processDetector, hostDetector]; - - if (env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID) { - defaultDetectors.push(serviceInstanceIDDetector); - } - this._resourceDetectors = - configuration.resourceDetectors ?? defaultDetectors; + this._resourceDetectors = configuration.resourceDetectors ?? [ + envDetector, + processDetector, + hostDetector, + ]; this._serviceName = configuration.serviceName; diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 9119504f748..cdb99684aae 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -59,6 +59,7 @@ import { processDetector, hostDetector, Resource, + serviceInstanceIDDetector, } from '@opentelemetry/resources'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { logs } from '@opentelemetry/api-logs'; @@ -696,10 +697,16 @@ describe('Node SDK', () => { sdk.shutdown(); }); - it('should configure service instance id with random UUID with OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { - process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; - process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = 'true'; - const sdk = new NodeSDK(); + it('should configure service instance id with random UUID', async () => { + const sdk = new NodeSDK({ + autoDetectResources: true, + resourceDetectors: [ + processDetector, + envDetector, + hostDetector, + serviceInstanceIDDetector, + ], + }); sdk.start(); const resource = sdk['_resource']; @@ -713,44 +720,6 @@ describe('Node SDK', () => { ), true ); - - delete process.env.OTEL_RESOURCE_ATTRIBUTES; - delete process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; - await sdk.shutdown(); - }); - - it('should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var even with OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var', async () => { - process.env.OTEL_RESOURCE_ATTRIBUTES = - 'service.instance.id=627cc493,service.name=my-service'; - process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = 'true'; - const sdk = new NodeSDK(); - - sdk.start(); - const resource = sdk['_resource']; - await resource.waitForAsyncAttributes?.(); - - assertServiceResource(resource, { - name: 'my-service', - instanceId: '627cc493', - }); - delete process.env.OTEL_RESOURCE_ATTRIBUTES; - delete process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID; - sdk.shutdown(); - }); - - it('should not configure service instance id with no value for it on OTEL_RESOURCE_ATTRIBUTES env var and OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID env var as false', async () => { - process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.name=my-service'; - process.env.OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID = 'false'; - const sdk = new NodeSDK(); - - sdk.start(); - const resource = sdk['_resource']; - await resource.waitForAsyncAttributes?.(); - - assertServiceResource(resource, { - name: 'my-service', - }); - delete process.env.OTEL_RESOURCE_ATTRIBUTES; await sdk.shutdown(); }); }); diff --git a/packages/opentelemetry-core/src/utils/environment.ts b/packages/opentelemetry-core/src/utils/environment.ts index acbb3ff3cc5..fda6e103b7d 100644 --- a/packages/opentelemetry-core/src/utils/environment.ts +++ b/packages/opentelemetry-core/src/utils/environment.ts @@ -24,10 +24,7 @@ const DEFAULT_LIST_SEPARATOR = ','; * Environment interface to define all names */ -const ENVIRONMENT_BOOLEAN_KEYS = [ - 'OTEL_SDK_DISABLED', - 'OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID', -] as const; +const ENVIRONMENT_BOOLEAN_KEYS = ['OTEL_SDK_DISABLED'] as const; type ENVIRONMENT_BOOLEANS = { [K in (typeof ENVIRONMENT_BOOLEAN_KEYS)[number]]?: boolean; @@ -239,7 +236,6 @@ export const DEFAULT_ENVIRONMENT: Required = { OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: 'http/protobuf', OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'http/protobuf', OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: 'cumulative', - OTEL_NODE_EXPERIMENTAL_DEFAULT_SERVICE_INSTANCE_ID: false, }; /** From f6a0694116bf091fb64804d260cea63cee26a29c Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 11 Apr 2024 08:44:42 -0400 Subject: [PATCH 07/12] remove Detector and use DetectorSync remove the Detector and use the DetectorSync instead. Also mark things as experimental. Signed-off-by: maryliag --- CHANGELOG.md | 2 +- .../browser/ServiceInstanceIDDetector.ts | 19 ------------ .../browser/ServiceInstanceIDDetectorSync.ts | 5 ++- .../src/platform/browser/index.ts | 2 +- .../node/ServiceInstanceIDDetector.ts | 31 ------------------- .../node/ServiceInstanceIDDetectorSync.ts | 6 ++-- .../src/platform/node/index.ts | 2 +- 7 files changed, 11 insertions(+), 56 deletions(-) delete mode 100644 packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts delete mode 100644 packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 5acc2d69ee0..93b5f78668c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) * feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -* feat(resources): new detector ServiceInstanceIDDetector that sets the value for `service.instance.id` as random UUID. +* feat(resources): new experimental detector ServiceInstanceIDDetector that sets the value for `service.instance.id` as random UUID. ### :bug: (Bug Fix) diff --git a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts deleted file mode 100644 index 8874d738c2d..00000000000 --- a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetector.ts +++ /dev/null @@ -1,19 +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 { noopDetector } from '../../detectors/NoopDetector'; - -export const serviceInstanceIDDetector = noopDetector; diff --git a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts index 81827e93f1f..cc1687e16d3 100644 --- a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts @@ -16,4 +16,7 @@ import { noopDetectorSync } from '../../detectors/NoopDetectorSync'; -export const serviceInstanceIDDetectorSync = noopDetectorSync; +/** + * @experimental + */ +export const serviceInstanceIDDetector = noopDetectorSync; diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index 757d0a116cc..222f0f8d43f 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIDDetector'; +export * from './ServiceInstanceIDDetectorSync'; diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts deleted file mode 100644 index 7a999e3fa61..00000000000 --- a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetector.ts +++ /dev/null @@ -1,31 +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 } from '../../types'; -import { ResourceDetectionConfig } from '../../config'; -import { IResource } from '../../IResource'; -import { serviceInstanceIDDetectorSync } from '../browser/ServiceInstanceIDDetectorSync'; - -/** - * ServiceInstanceIDDetector detects the resources related to the service instance ID. - */ -class ServiceInstanceIDDetector implements Detector { - detect(_config?: ResourceDetectionConfig): Promise { - return Promise.resolve(serviceInstanceIDDetectorSync.detect()); - } -} - -export const serviceInstanceIDDetector = new ServiceInstanceIDDetector(); diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts index 8e624852cda..aa77840d745 100644 --- a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts @@ -33,5 +33,7 @@ class ServiceInstanceIDDetectorSync implements DetectorSync { } } -export const serviceInstanceIDDetectorSync = - new ServiceInstanceIDDetectorSync(); +/** + * @experimental + */ +export const serviceInstanceIDDetector = new ServiceInstanceIDDetectorSync(); diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index 757d0a116cc..222f0f8d43f 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIDDetector'; +export * from './ServiceInstanceIDDetectorSync'; From bc7478ab3acc1c4905c6c63d91dcb4c9e9a067a4 Mon Sep 17 00:00:00 2001 From: Marylia Gutierrez Date: Thu, 11 Apr 2024 11:24:56 -0400 Subject: [PATCH 08/12] Update packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts Co-authored-by: Marc Pichler --- .../src/platform/node/ServiceInstanceIDDetectorSync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts index aa77840d745..82528c19b4f 100644 --- a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts @@ -36,4 +36,4 @@ class ServiceInstanceIDDetectorSync implements DetectorSync { /** * @experimental */ -export const serviceInstanceIDDetector = new ServiceInstanceIDDetectorSync(); +export const serviceInstanceIDDetectorSync = new ServiceInstanceIDDetectorSync(); From 78c31e932b109415b516e24373f3e5f28f7173a8 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 11 Apr 2024 11:29:10 -0400 Subject: [PATCH 09/12] rename ServiceInstanceIDDetector to ServiceInstanceIDDetectorSync --- CHANGELOG.md | 2 +- experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts | 4 ++-- .../src/platform/browser/ServiceInstanceIDDetectorSync.ts | 2 +- .../src/platform/node/ServiceInstanceIDDetectorSync.ts | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93b5f78668c..c50d0b5ae4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) * feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -* feat(resources): new experimental detector ServiceInstanceIDDetector that sets the value for `service.instance.id` as random UUID. +* feat(resources): new experimental detector ServiceInstanceIDDetectorSync that sets the value for `service.instance.id` as random UUID. ### :bug: (Bug Fix) diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index cdb99684aae..a822a7e76b3 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -59,7 +59,7 @@ import { processDetector, hostDetector, Resource, - serviceInstanceIDDetector, + serviceInstanceIDDetectorSync, } from '@opentelemetry/resources'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { logs } from '@opentelemetry/api-logs'; @@ -704,7 +704,7 @@ describe('Node SDK', () => { processDetector, envDetector, hostDetector, - serviceInstanceIDDetector, + serviceInstanceIDDetectorSync, ], }); diff --git a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts index cc1687e16d3..0f19b16768f 100644 --- a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts @@ -19,4 +19,4 @@ import { noopDetectorSync } from '../../detectors/NoopDetectorSync'; /** * @experimental */ -export const serviceInstanceIDDetector = noopDetectorSync; +export const serviceInstanceIDDetectorSync = noopDetectorSync; diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts index 82528c19b4f..072f5783a28 100644 --- a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts @@ -36,4 +36,5 @@ class ServiceInstanceIDDetectorSync implements DetectorSync { /** * @experimental */ -export const serviceInstanceIDDetectorSync = new ServiceInstanceIDDetectorSync(); +export const serviceInstanceIDDetectorSync = + new ServiceInstanceIDDetectorSync(); From a6a779f7e305dcec9453dd3b0a1f42bb7dbb9854 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 12 Apr 2024 08:28:36 -0400 Subject: [PATCH 10/12] change ID to Id --- CHANGELOG.md | 2 +- .../packages/opentelemetry-sdk-node/test/sdk.test.ts | 4 ++-- .../src/platform/browser/ServiceInstanceIDDetectorSync.ts | 2 +- .../opentelemetry-resources/src/platform/browser/index.ts | 2 +- .../src/platform/node/ServiceInstanceIDDetectorSync.ts | 8 ++++---- .../opentelemetry-resources/src/platform/node/index.ts | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c50d0b5ae4b..286a23dba3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ For experimental package changes, see the [experimental CHANGELOG](experimental/ ### :rocket: (Enhancement) * feat(sdk-trace-base): log resource attributes in ConsoleSpanExporter [#4605](https://github.com/open-telemetry/opentelemetry-js/pull/4605) @pichlermarc -* feat(resources): new experimental detector ServiceInstanceIDDetectorSync that sets the value for `service.instance.id` as random UUID. +* feat(resources): new experimental detector ServiceInstanceIdDetectorSync that sets the value for `service.instance.id` as random UUID. ### :bug: (Bug Fix) diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index a822a7e76b3..078a33d9cc7 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -59,7 +59,7 @@ import { processDetector, hostDetector, Resource, - serviceInstanceIDDetectorSync, + serviceInstanceIdDetectorSync, } from '@opentelemetry/resources'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { logs } from '@opentelemetry/api-logs'; @@ -704,7 +704,7 @@ describe('Node SDK', () => { processDetector, envDetector, hostDetector, - serviceInstanceIDDetectorSync, + serviceInstanceIdDetectorSync, ], }); diff --git a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts index 0f19b16768f..d79fa1f4eaf 100644 --- a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts @@ -19,4 +19,4 @@ import { noopDetectorSync } from '../../detectors/NoopDetectorSync'; /** * @experimental */ -export const serviceInstanceIDDetectorSync = noopDetectorSync; +export const serviceInstanceIdDetectorSync = noopDetectorSync; diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index 222f0f8d43f..47f5cf301ef 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIDDetectorSync'; +export * from './ServiceInstanceIdDetectorSync'; diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts index 072f5783a28..9196bcba51e 100644 --- a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts +++ b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts @@ -21,9 +21,9 @@ import { ResourceDetectionConfig } from '../../config'; import { randomUUID } from 'crypto'; /** - * ServiceInstanceIDDetectorSync detects the resources related to the service instance ID. + * ServiceInstanceIdDetectorSync detects the resources related to the service instance ID. */ -class ServiceInstanceIDDetectorSync implements DetectorSync { +class ServiceInstanceIdDetectorSync implements DetectorSync { detect(_config?: ResourceDetectionConfig): Resource { const attributes: ResourceAttributes = { [SEMRESATTRS_SERVICE_INSTANCE_ID]: randomUUID(), @@ -36,5 +36,5 @@ class ServiceInstanceIDDetectorSync implements DetectorSync { /** * @experimental */ -export const serviceInstanceIDDetectorSync = - new ServiceInstanceIDDetectorSync(); +export const serviceInstanceIdDetectorSync = + new ServiceInstanceIdDetectorSync(); diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index 222f0f8d43f..47f5cf301ef 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIDDetectorSync'; +export * from './ServiceInstanceIdDetectorSync'; From 118e713aaa9845fdc63a80ff1f9c8121bee81f29 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 12 Apr 2024 08:33:48 -0400 Subject: [PATCH 11/12] renaming something temp so git will pick up the name change it was not picking up the case change on previous commit --- ...tanceIDDetectorSync.ts => ServiceInstanceIdDetectorSyncA.ts} | 0 packages/opentelemetry-resources/src/platform/browser/index.ts | 2 +- ...tanceIDDetectorSync.ts => ServiceInstanceIdDetectorSyncA.ts} | 0 packages/opentelemetry-resources/src/platform/node/index.ts | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) rename packages/opentelemetry-resources/src/platform/browser/{ServiceInstanceIDDetectorSync.ts => ServiceInstanceIdDetectorSyncA.ts} (100%) rename packages/opentelemetry-resources/src/platform/node/{ServiceInstanceIDDetectorSync.ts => ServiceInstanceIdDetectorSyncA.ts} (100%) diff --git a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIdDetectorSyncA.ts similarity index 100% rename from packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIDDetectorSync.ts rename to packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIdDetectorSyncA.ts diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index 47f5cf301ef..cf62f3018d3 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIdDetectorSync'; +export * from './ServiceInstanceIdDetectorSyncA'; diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIdDetectorSyncA.ts similarity index 100% rename from packages/opentelemetry-resources/src/platform/node/ServiceInstanceIDDetectorSync.ts rename to packages/opentelemetry-resources/src/platform/node/ServiceInstanceIdDetectorSyncA.ts diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index 47f5cf301ef..cf62f3018d3 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIdDetectorSync'; +export * from './ServiceInstanceIdDetectorSyncA'; From 54baf5435b341a2ba6b2106abe3ae3d576497bbd Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 12 Apr 2024 08:35:33 -0400 Subject: [PATCH 12/12] update to final name using Id --- ...tanceIdDetectorSyncA.ts => ServiceInstanceIdDetectorSync.ts} | 0 packages/opentelemetry-resources/src/platform/browser/index.ts | 2 +- ...tanceIdDetectorSyncA.ts => ServiceInstanceIdDetectorSync.ts} | 0 packages/opentelemetry-resources/src/platform/node/index.ts | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) rename packages/opentelemetry-resources/src/platform/browser/{ServiceInstanceIdDetectorSyncA.ts => ServiceInstanceIdDetectorSync.ts} (100%) rename packages/opentelemetry-resources/src/platform/node/{ServiceInstanceIdDetectorSyncA.ts => ServiceInstanceIdDetectorSync.ts} (100%) diff --git a/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIdDetectorSyncA.ts b/packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIdDetectorSync.ts similarity index 100% rename from packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIdDetectorSyncA.ts rename to packages/opentelemetry-resources/src/platform/browser/ServiceInstanceIdDetectorSync.ts diff --git a/packages/opentelemetry-resources/src/platform/browser/index.ts b/packages/opentelemetry-resources/src/platform/browser/index.ts index cf62f3018d3..47f5cf301ef 100644 --- a/packages/opentelemetry-resources/src/platform/browser/index.ts +++ b/packages/opentelemetry-resources/src/platform/browser/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIdDetectorSyncA'; +export * from './ServiceInstanceIdDetectorSync'; diff --git a/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIdDetectorSyncA.ts b/packages/opentelemetry-resources/src/platform/node/ServiceInstanceIdDetectorSync.ts similarity index 100% rename from packages/opentelemetry-resources/src/platform/node/ServiceInstanceIdDetectorSyncA.ts rename to packages/opentelemetry-resources/src/platform/node/ServiceInstanceIdDetectorSync.ts diff --git a/packages/opentelemetry-resources/src/platform/node/index.ts b/packages/opentelemetry-resources/src/platform/node/index.ts index cf62f3018d3..47f5cf301ef 100644 --- a/packages/opentelemetry-resources/src/platform/node/index.ts +++ b/packages/opentelemetry-resources/src/platform/node/index.ts @@ -21,4 +21,4 @@ export * from './HostDetectorSync'; export * from './OSDetectorSync'; export * from './ProcessDetector'; export * from './ProcessDetectorSync'; -export * from './ServiceInstanceIdDetectorSyncA'; +export * from './ServiceInstanceIdDetectorSync';