diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 26fae05073d..bd910cceff5 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -17,6 +17,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(configuration): bump config schema to v1.1.0; rename `without_scope_info` → `scope_info_enabled` and `without_target_info/development` → `target_info_enabled/development` on the Prometheus pull exporter (semantics inverted), rename `with_resource_constant_labels` → `resource_constant_labels`. Validate `file_format` per the configuration versioning spec: accept any minor version of major `1` (e.g. `1.0`, `1.1`), warn when the minor version is newer than supported, and reject other major versions. [#6781](https://github.com/open-telemetry/opentelemetry-js/pull/6781) @MikeGoldsmith +* feat(sdk-node): wire up `id_generator` from declarative config [#6782](https://github.com/open-telemetry/opentelemetry-js/pull/6782) @MikeGoldsmith * feat(propagator-env-carrier): empty name normalization [#6827](https://github.com/open-telemetry/opentelemetry-js/pull/6827) @pellared ### :bug: Bug Fixes diff --git a/experimental/packages/configuration/src/index.ts b/experimental/packages/configuration/src/index.ts index 5cce47f15af..9ca439bedf6 100644 --- a/experimental/packages/configuration/src/index.ts +++ b/experimental/packages/configuration/src/index.ts @@ -19,6 +19,7 @@ export type { NameStringValuePair as NameStringValuePairConfigModel, HttpTls as HttpTlsConfigModel, GrpcTls as GrpcTlsConfigModel, + IdGenerator as IdGeneratorConfigModel, SeverityNumber as SeverityNumberConfigModel, LoggerProvider as LoggerProviderConfigModel, AttributeLimits as AttributeLimitsConfigModel, diff --git a/experimental/packages/opentelemetry-sdk-node/src/start.ts b/experimental/packages/opentelemetry-sdk-node/src/start.ts index 5631f7045a7..b90275eea0b 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/start.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/start.ts @@ -16,6 +16,7 @@ import { propagation, } from '@opentelemetry/api'; import { + getIdGeneratorFromConfiguration, getInstanceID, createLoggerProviderFromConfig, getMeterReadersFromConfiguration, @@ -166,15 +167,16 @@ function create( const spanProcessors = getSpanProcessorsFromConfiguration(config); if (spanProcessors) { + const idGenerator = getIdGeneratorFromConfiguration(config); // TODO (6506): support sampler configuration from config const tracerProvider = new TracerProvider({ resource, spanProcessors, + idGenerator, spanLimits: createSpanLimitsFromConfig( config.tracer_provider?.limits, config.attribute_limits ), - // TODO (6616): support idGenerator configuration from config // TODO (6624): support for `meterProvider: components.meterProvider` }); components.tracerProvider = tracerProvider; diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index 306c5cdb0ea..d378ac9104e 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -31,6 +31,7 @@ import { serviceInstanceIdDetector, } from '@opentelemetry/resources'; import type { + IdGenerator, Sampler, SpanExporter, SpanProcessor, @@ -41,6 +42,7 @@ import { BatchSpanProcessor, ConsoleSpanExporter, ParentBasedSampler, + RandomIdGenerator, SimpleSpanProcessor, TraceIdRatioBasedSampler, } from '@opentelemetry/sdk-trace'; @@ -959,6 +961,27 @@ export function getSpanProcessorsFromConfiguration( return undefined; } +export function getIdGeneratorFromConfiguration( + config: ConfigurationModel +): IdGenerator | undefined { + const idGenerator = config.tracer_provider?.id_generator; + if (!idGenerator) { + return undefined; + } + if (idGenerator.random !== undefined) { + return new RandomIdGenerator(); + } + // Any other key is a third-party / custom id_generator type which we + // don't currently support. Warn and fall back to SDK default. + const unknownKeys = Object.keys(idGenerator).filter(k => k !== 'random'); + if (unknownKeys.length > 0) { + diag.warn( + `Unsupported id_generator type(s): ${unknownKeys.join(', ')}. Using default.` + ); + } + return undefined; +} + export function getMeterReadersFromConfiguration( config: ConfigurationModel ): IMetricReader[] | undefined { diff --git a/experimental/packages/opentelemetry-sdk-node/test/utils.test.ts b/experimental/packages/opentelemetry-sdk-node/test/utils.test.ts index 218f078aa7a..95b566773b2 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/utils.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/utils.test.ts @@ -16,6 +16,7 @@ import { getHeadersFromConfiguration, getMeterViewsFromConfiguration, getHttpAgentOptionsFromTls, + getIdGeneratorFromConfiguration, } from '../src/utils'; import * as assert from 'assert'; import * as sinon from 'sinon'; @@ -786,6 +787,53 @@ describe('getMeterViewsFromConfiguration', function () { }); }); +describe('getIdGeneratorFromConfiguration', function () { + afterEach(() => { + sinon.restore(); + }); + + it('returns undefined when no tracer_provider is set', function () { + assert.equal( + getIdGeneratorFromConfiguration({} as ConfigurationModel), + undefined + ); + }); + + it('returns undefined when no id_generator is set', function () { + const config = { + tracer_provider: { processors: [] }, + } as ConfigurationModel; + assert.equal(getIdGeneratorFromConfiguration(config), undefined); + }); + + it('returns a RandomIdGenerator when random is set', function () { + const config = { + tracer_provider: { processors: [], id_generator: { random: {} } }, + } as ConfigurationModel; + const idGenerator = getIdGeneratorFromConfiguration(config); + assert.ok(idGenerator); + assert.strictEqual(idGenerator.constructor.name, 'RandomIdGenerator'); + }); + + it('warns and returns undefined for unsupported id_generator type', function () { + const warnStub = sinon.stub(diag, 'warn'); + const config = { + tracer_provider: { + processors: [], + id_generator: { custom_generator: {} }, + }, + } as ConfigurationModel; + assert.equal(getIdGeneratorFromConfiguration(config), undefined); + assert.ok( + warnStub.args.some(args => + String(args[0]).includes( + 'Unsupported id_generator type(s): custom_generator' + ) + ) + ); + }); +}); + describe('getHttpAgentOptionsFromTls', function () { afterEach(() => { sinon.restore();