diff --git a/packages/opentelemetry-node/src/NodeTracerProvider.ts b/packages/opentelemetry-node/src/NodeTracerProvider.ts index 0abe4b9aa2..67301a2f9d 100644 --- a/packages/opentelemetry-node/src/NodeTracerProvider.ts +++ b/packages/opentelemetry-node/src/NodeTracerProvider.ts @@ -14,13 +14,17 @@ * limitations under the License. */ -import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; +import { + AsyncHooksContextManager, + AsyncLocalStorageContextManager, +} from '@opentelemetry/context-async-hooks'; import { BasicTracerProvider, SDKRegistrationConfig, } from '@opentelemetry/tracing'; import { DEFAULT_INSTRUMENTATION_PLUGINS, NodeTracerConfig } from './config'; import { PluginLoader, Plugins } from './instrumentation/PluginLoader'; +import * as semver from 'semver'; /** * Register this TracerProvider for use with the OpenTelemetry API. @@ -53,7 +57,10 @@ export class NodeTracerProvider extends BasicTracerProvider { register(config: SDKRegistrationConfig = {}) { if (config.contextManager === undefined) { - config.contextManager = new AsyncHooksContextManager(); + const ContextManager = semver.gte(process.version, '14.8.0') + ? AsyncLocalStorageContextManager + : AsyncHooksContextManager; + config.contextManager = new ContextManager(); config.contextManager.enable(); } diff --git a/packages/opentelemetry-node/test/registration.test.ts b/packages/opentelemetry-node/test/registration.test.ts index aef79760f5..a1f0bed822 100644 --- a/packages/opentelemetry-node/test/registration.test.ts +++ b/packages/opentelemetry-node/test/registration.test.ts @@ -21,11 +21,19 @@ import { trace, ProxyTracerProvider, } from '@opentelemetry/api'; -import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; +import { + AsyncHooksContextManager, + AsyncLocalStorageContextManager, +} from '@opentelemetry/context-async-hooks'; import { NoopContextManager } from '@opentelemetry/context-base'; import { CompositePropagator } from '@opentelemetry/core'; import * as assert from 'assert'; import { NodeTracerProvider } from '../src'; +import * as semver from 'semver'; + +const DefaultContextManager = semver.gte(process.version, '14.8.0') + ? AsyncLocalStorageContextManager + : AsyncHooksContextManager; describe('API registration', () => { beforeEach(() => { @@ -38,9 +46,7 @@ describe('API registration', () => { const tracerProvider = new NodeTracerProvider(); tracerProvider.register(); - assert.ok( - context['_getContextManager']() instanceof AsyncHooksContextManager - ); + assert.ok(context['_getContextManager']() instanceof DefaultContextManager); assert.ok( propagation['_getGlobalPropagator']() instanceof CompositePropagator ); @@ -96,9 +102,7 @@ describe('API registration', () => { propagation['_getGlobalPropagator']() instanceof NoopTextMapPropagator ); - assert.ok( - context['_getContextManager']() instanceof AsyncHooksContextManager - ); + assert.ok(context['_getContextManager']() instanceof DefaultContextManager); const apiTracerProvider = trace.getTracerProvider(); assert.ok(apiTracerProvider instanceof ProxyTracerProvider); diff --git a/packages/opentelemetry-sdk-node/test/sdk.test.ts b/packages/opentelemetry-sdk-node/test/sdk.test.ts index 34598a2cba..c33e84cfb6 100644 --- a/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -26,7 +26,10 @@ import { trace, ProxyTracerProvider, } from '@opentelemetry/api'; -import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; +import { + AsyncHooksContextManager, + AsyncLocalStorageContextManager, +} from '@opentelemetry/context-async-hooks'; import { NoopContextManager } from '@opentelemetry/context-base'; import { CompositePropagator } from '@opentelemetry/core'; import { ConsoleMetricExporter, MeterProvider } from '@opentelemetry/metrics'; @@ -81,6 +84,10 @@ const mockedIdentityResponse = { }; const mockedHostResponse = 'my-hostname'; +const DefaultContextManager = semver.gte(process.version, '14.8.0') + ? AsyncLocalStorageContextManager + : AsyncHooksContextManager; + describe('Node SDK', () => { before(() => { // Disable attempted load of default plugins @@ -127,7 +134,7 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider); assert.ok( - context['_getContextManager']() instanceof AsyncHooksContextManager + context['_getContextManager']() instanceof DefaultContextManager ); assert.ok( propagation['_getGlobalPropagator']() instanceof CompositePropagator @@ -151,7 +158,7 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider); assert.ok( - context['_getContextManager']() instanceof AsyncHooksContextManager + context['_getContextManager']() instanceof DefaultContextManager ); assert.ok( propagation['_getGlobalPropagator']() instanceof CompositePropagator