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/index.ts b/experimental/packages/opentelemetry-sdk-node/src/index.ts index 43552233940..bec831e94d2 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/index.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/index.ts @@ -33,3 +33,4 @@ export * as tracing from '@opentelemetry/sdk-trace-base'; export { NodeSDK } from './sdk'; export type { LoggerProviderConfig, MeterProviderConfig } from './sdk'; export type { NodeSDKConfiguration } from './types'; +export { startNodeSDK } from './start'; diff --git a/experimental/packages/opentelemetry-sdk-node/src/start.ts b/experimental/packages/opentelemetry-sdk-node/src/start.ts new file mode 100644 index 00000000000..197870fb0e6 --- /dev/null +++ b/experimental/packages/opentelemetry-sdk-node/src/start.ts @@ -0,0 +1,51 @@ +/* + * 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 { + ConfigFactory, + createConfigFactory, +} from '@opentelemetry/configuration'; +import { diag, DiagConsoleLogger } from '@opentelemetry/api'; +import { setupDefaultContextManager } from './utils'; + +/** + * @experimental Function to start the OpenTelemetry Node SDK + * @param sdkOptions + */ +export function startNodeSDK(): { + shutdown: () => Promise; +} { + const configFactory: ConfigFactory = createConfigFactory(); + const config = configFactory.getConfigModel(); + + if (config.disabled) { + diag.info('OpenTelemetry SDK is disabled'); + return NOOP_SDK; + } + if (config.log_level != null) { + diag.setLogger(new DiagConsoleLogger(), { logLevel: config.log_level }); + } + + setupDefaultContextManager(); + + const shutdownFn = async () => { + const promises: Promise[] = []; + await Promise.all(promises); + }; + return { shutdown: shutdownFn }; +} +const NOOP_SDK = { + shutdown: async () => {}, +}; diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index e80a1a110e7..5b5ff7fdac2 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -250,6 +250,12 @@ export function setupContextManager( context.setGlobalContextManager(contextManager); } +export function setupDefaultContextManager() { + const defaultContextManager = new AsyncLocalStorageContextManager(); + defaultContextManager.enable(); + context.setGlobalContextManager(defaultContextManager); +} + export function setupPropagator( propagator: TextMapPropagator | null | undefined ) { diff --git a/experimental/packages/opentelemetry-sdk-node/test/start.test.ts b/experimental/packages/opentelemetry-sdk-node/test/start.test.ts new file mode 100644 index 00000000000..c784ea4e3ee --- /dev/null +++ b/experimental/packages/opentelemetry-sdk-node/test/start.test.ts @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import { startNodeSDK } from '../src/start'; +import { context, diag } from '@opentelemetry/api'; +import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; +import * as Sinon from 'sinon'; + +describe('startNodeSDK', function () { + const _origEnvVariables = { ...process.env }; + + afterEach(function () { + for (const key of Object.keys(process.env)) { + delete process.env[key]; + } + for (const [key, value] of Object.entries(_origEnvVariables)) { + process.env[key] = value; + } + Sinon.restore(); + }); + + it('should return NOOP_SDK when disabled is true', () => { + const info = Sinon.spy(diag, 'info'); + process.env.OTEL_SDK_DISABLED = 'true'; + const sdk = startNodeSDK(); + + Sinon.assert.calledWith(info, 'OpenTelemetry SDK is disabled'); + + sdk.shutdown(); + }); + + it('should return NOOP_SDK when disabled is true', () => { + process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = + 'test/fixtures/kitchen-sink.yaml'; + const sdk = startNodeSDK(); + + assertDefaultContextManagerRegistered(); + + sdk.shutdown(); + }); +}); + +function assertDefaultContextManagerRegistered() { + assert.ok( + context['_getContextManager']().constructor.name === + AsyncLocalStorageContextManager.name + ); +} 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", diff --git a/tsconfig.json b/tsconfig.json index ad9cd2743fe..4259065d80b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "entryPoints": [ "api", "experimental/packages/api-logs", + "experimental/packages/configuration", "experimental/packages/exporter-logs-otlp-grpc", "experimental/packages/exporter-logs-otlp-http", "experimental/packages/exporter-logs-otlp-proto",