diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 9c2f2b1d917..d591087bd90 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -15,8 +15,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(configuration): set logger provider exporter type from env variable [#6104](https://github.com/open-telemetry/opentelemetry-js/pull/6104) @maryliag * feat(configuration): set meter provider exporter type from env variable [#6105](https://github.com/open-telemetry/opentelemetry-js/pull/6105) @maryliag * feat(configuration): set tracer provider exporter type from env variables [#6106](https://github.com/open-telemetry/opentelemetry-js/pull/6106) @maryliag -* feat(configuration): set meter provider exporter type from env variable [#6105](https://github.com/open-telemetry/opentelemetry-js/pull/6105) @maryliag * refactor(configuration): throw warning and not error for invalid files [#6124](https://github.com/open-telemetry/opentelemetry-js/pull/6124) @maryliag +* feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag * refactor(configuration): dont have a default value for node resource detectors [#x](https://github.com/open-telemetry/opentelemetry-js/pull/x) @maryliag ### :bug: Bug Fixes diff --git a/experimental/packages/configuration/package.json b/experimental/packages/configuration/package.json index 73ad90b24c3..5a4f10c0a44 100644 --- a/experimental/packages/configuration/package.json +++ b/experimental/packages/configuration/package.json @@ -1,6 +1,5 @@ { "name": "@opentelemetry/configuration", - "private": true, "version": "0.208.0", "description": "OpenTelemetry Configuration", "main": "build/src/index.js", diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json index 7f1e3c21044..f1097791e52 100644 --- a/experimental/packages/opentelemetry-sdk-node/package.json +++ b/experimental/packages/opentelemetry-sdk-node/package.json @@ -44,6 +44,7 @@ }, "dependencies": { "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/configuration": "0.208.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.208.0", "@opentelemetry/exporter-logs-otlp-http": "0.208.0", diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 527b1cdedba..1aedbc459cf 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -63,12 +63,7 @@ import { } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { NodeSDKConfiguration } from './types'; -import { - getBooleanFromEnv, - getStringFromEnv, - getStringListFromEnv, - diagLogLevelFromString, -} from '@opentelemetry/core'; +import { getStringFromEnv, getStringListFromEnv } from '@opentelemetry/core'; import { getResourceDetectorsFromEnv, getSpanProcessorsFromEnv, @@ -76,6 +71,11 @@ import { setupPropagator, setupContextManager, } from './utils'; +import { + ConfigFactory, + ConfigurationModel, + createConfigFactory, +} from '@opentelemetry/configuration'; type TracerProviderConfig = { tracerConfig: NodeTracerConfig; @@ -124,7 +124,7 @@ function configureMetricProviderFromEnv(): IMetricReader[] { if (enabledExporters.includes('none')) { diag.info( - `OTEL_METRICS_EXPORTER contains "none". Metric provider will not be initialized.` + `OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.` ); return metricReaders; } @@ -223,6 +223,7 @@ function configureMetricProviderFromEnv(): IMetricReader[] { * nodeSdk.start(); // registers all configured SDK components */ export class NodeSDK { + private _config: ConfigurationModel; private _tracerProviderConfig?: TracerProviderConfig; private _loggerProviderConfig?: LoggerProviderConfig; private _meterProviderConfig?: MeterProviderConfig; @@ -245,16 +246,17 @@ export class NodeSDK { * Create a new NodeJS SDK instance */ public constructor(configuration: Partial = {}) { - if (getBooleanFromEnv('OTEL_SDK_DISABLED')) { + const configFactory: ConfigFactory = createConfigFactory(); + this._config = configFactory.getConfigModel(); + if (this._config.disabled) { this._disabled = true; // Functions with possible side-effects are set // to no-op via the _disabled flag } - const logLevel = getStringFromEnv('OTEL_LOG_LEVEL'); - if (logLevel != null) { + if (this._config.log_level != null) { diag.setLogger(new DiagConsoleLogger(), { - logLevel: diagLogLevelFromString(logLevel), + logLevel: this._config.log_level, }); } @@ -266,8 +268,8 @@ export class NodeSDK { this._resourceDetectors = []; } else if (configuration.resourceDetectors != null) { this._resourceDetectors = configuration.resourceDetectors; - } else if (getStringFromEnv('OTEL_NODE_RESOURCE_DETECTORS')) { - this._resourceDetectors = getResourceDetectorsFromEnv(); + } else if (this._config.node_resource_detectors) { + this._resourceDetectors = getResourceDetectorsFromEnv(this._config); } else { this._resourceDetectors = [envDetector, processDetector, hostDetector]; } diff --git a/experimental/packages/opentelemetry-sdk-node/test/semconv.ts b/experimental/packages/opentelemetry-sdk-node/src/semconv.ts similarity index 100% rename from experimental/packages/opentelemetry-sdk-node/test/semconv.ts rename to experimental/packages/opentelemetry-sdk-node/src/semconv.ts diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index ffc71451cf9..1121c4075c7 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -50,6 +50,7 @@ import { import { B3InjectEncoding, B3Propagator } from '@opentelemetry/propagator-b3'; import { JaegerPropagator } from '@opentelemetry/propagator-jaeger'; import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; +import { ConfigurationModel } from '@opentelemetry/configuration'; const RESOURCE_DETECTOR_ENVIRONMENT = 'env'; const RESOURCE_DETECTOR_HOST = 'host'; @@ -57,7 +58,9 @@ const RESOURCE_DETECTOR_OS = 'os'; const RESOURCE_DETECTOR_PROCESS = 'process'; const RESOURCE_DETECTOR_SERVICE_INSTANCE_ID = 'serviceinstance'; -export function getResourceDetectorsFromEnv(): Array { +export function getResourceDetectorsFromEnv( + config: ConfigurationModel +): Array { // When updating this list, make sure to also update the section `resourceDetectors` on README. const resourceDetectors = new Map([ [RESOURCE_DETECTOR_ENVIRONMENT, envDetector], @@ -67,9 +70,7 @@ export function getResourceDetectorsFromEnv(): Array { [RESOURCE_DETECTOR_PROCESS, processDetector], ]); - const resourceDetectorsFromEnv = getStringListFromEnv( - 'OTEL_NODE_RESOURCE_DETECTORS' - ) ?? ['all']; + const resourceDetectorsFromEnv = config.node_resource_detectors ?? ['all']; if (resourceDetectorsFromEnv.includes('all')) { return [...resourceDetectors.values()].flat(); @@ -82,9 +83,7 @@ export function getResourceDetectorsFromEnv(): Array { return resourceDetectorsFromEnv.flatMap(detector => { const resourceDetector = resourceDetectors.get(detector); if (!resourceDetector) { - diag.warn( - `Invalid resource detector "${detector}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS` - ); + diag.warn(`Invalid resource detector "${detector}" specified`); } return resourceDetector || []; }); diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 3314f613a20..34919580779 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -82,7 +82,7 @@ import { OTLPTraceExporter as OTLPProtoTraceExporter } from '@opentelemetry/expo import { OTLPTraceExporter as OTLPGrpcTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'; import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; -import { ATTR_HOST_NAME, ATTR_PROCESS_PID } from './semconv'; +import { ATTR_HOST_NAME, ATTR_PROCESS_PID } from '../src/semconv'; function assertDefaultContextManagerRegistered() { assert.ok( @@ -179,20 +179,6 @@ describe('Node SDK', () => { sdk.shutdown(); }); - it('should not register a diag logger with OTEL_LOG_LEVEL unset', () => { - delete process.env.OTEL_LOG_LEVEL; - - const spy = Sinon.spy(diag, 'setLogger'); - const sdk = new NodeSDK({ - autoDetectResources: false, - }); - - sdk.start(); - - assert.strictEqual(spy.callCount, 0); - sdk.shutdown(); - }); - it('should register a tracer provider if an exporter is provided', async () => { const sdk = new NodeSDK({ traceExporter: new ConsoleSpanExporter(), @@ -1224,7 +1210,7 @@ describe('Node SDK', () => { }); }); - describe('configuring metric provider from env', () => { + describe('configuring meter provider from env', () => { let stubLogger: Sinon.SinonStub; beforeEach(() => { @@ -1247,7 +1233,7 @@ describe('Node SDK', () => { assert.ok(!(metrics.getMeterProvider() instanceof MeterProvider)); assert.strictEqual( stubLogger.args[0][0], - 'OTEL_METRICS_EXPORTER contains "none". Metric provider will not be initialized.' + 'OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.' ); await sdk.shutdown(); }); diff --git a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts index 0938b6090fb..b02e0d7d36a 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts @@ -21,7 +21,10 @@ import { ATTR_SERVICE_VERSION, } from '@opentelemetry/semantic-conventions'; -import { ATTR_SERVICE_INSTANCE_ID, ATTR_SERVICE_NAMESPACE } from '../semconv'; +import { + ATTR_SERVICE_INSTANCE_ID, + ATTR_SERVICE_NAMESPACE, +} from '../../src/semconv'; /** * Test utility method to validate a service resource @@ -43,6 +46,7 @@ export const assertServiceResource = ( resource.attributes[ATTR_SERVICE_INSTANCE_ID], validations.instanceId ); + if (validations.namespace) assert.strictEqual( resource.attributes[ATTR_SERVICE_NAMESPACE], diff --git a/experimental/packages/opentelemetry-sdk-node/tsconfig.json b/experimental/packages/opentelemetry-sdk-node/tsconfig.json index 5f842b7af04..8cb33508620 100644 --- a/experimental/packages/opentelemetry-sdk-node/tsconfig.json +++ b/experimental/packages/opentelemetry-sdk-node/tsconfig.json @@ -45,6 +45,9 @@ { "path": "../api-logs" }, + { + "path": "../configuration" + }, { "path": "../exporter-logs-otlp-grpc" }, diff --git a/package-lock.json b/package-lock.json index 924856edd60..1aef9931ed6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1115,6 +1115,7 @@ "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/configuration": "0.208.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.208.0", "@opentelemetry/exporter-logs-otlp-http": "0.208.0",