feat(node-tracer): use AsyncLocalStorageContextManager by default starting Node 14.8 #1511 (#1525)

Co-authored-by: Daniel Dyla <dyladan@users.noreply.github.com>
This commit is contained in:
Valentin Marchaud 2020-10-01 21:03:51 +02:00 committed by GitHub
parent f731c65201
commit aac3f56fb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 12 deletions

View File

@ -14,13 +14,17 @@
* limitations under the License. * limitations under the License.
*/ */
import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; import {
AsyncHooksContextManager,
AsyncLocalStorageContextManager,
} from '@opentelemetry/context-async-hooks';
import { import {
BasicTracerProvider, BasicTracerProvider,
SDKRegistrationConfig, SDKRegistrationConfig,
} from '@opentelemetry/tracing'; } from '@opentelemetry/tracing';
import { DEFAULT_INSTRUMENTATION_PLUGINS, NodeTracerConfig } from './config'; import { DEFAULT_INSTRUMENTATION_PLUGINS, NodeTracerConfig } from './config';
import { PluginLoader, Plugins } from './instrumentation/PluginLoader'; import { PluginLoader, Plugins } from './instrumentation/PluginLoader';
import * as semver from 'semver';
/** /**
* Register this TracerProvider for use with the OpenTelemetry API. * Register this TracerProvider for use with the OpenTelemetry API.
@ -53,7 +57,10 @@ export class NodeTracerProvider extends BasicTracerProvider {
register(config: SDKRegistrationConfig = {}) { register(config: SDKRegistrationConfig = {}) {
if (config.contextManager === undefined) { 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(); config.contextManager.enable();
} }

View File

@ -21,11 +21,19 @@ import {
trace, trace,
ProxyTracerProvider, ProxyTracerProvider,
} from '@opentelemetry/api'; } 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 { NoopContextManager } from '@opentelemetry/context-base';
import { CompositePropagator } from '@opentelemetry/core'; import { CompositePropagator } from '@opentelemetry/core';
import * as assert from 'assert'; import * as assert from 'assert';
import { NodeTracerProvider } from '../src'; import { NodeTracerProvider } from '../src';
import * as semver from 'semver';
const DefaultContextManager = semver.gte(process.version, '14.8.0')
? AsyncLocalStorageContextManager
: AsyncHooksContextManager;
describe('API registration', () => { describe('API registration', () => {
beforeEach(() => { beforeEach(() => {
@ -38,9 +46,7 @@ describe('API registration', () => {
const tracerProvider = new NodeTracerProvider(); const tracerProvider = new NodeTracerProvider();
tracerProvider.register(); tracerProvider.register();
assert.ok( assert.ok(context['_getContextManager']() instanceof DefaultContextManager);
context['_getContextManager']() instanceof AsyncHooksContextManager
);
assert.ok( assert.ok(
propagation['_getGlobalPropagator']() instanceof CompositePropagator propagation['_getGlobalPropagator']() instanceof CompositePropagator
); );
@ -96,9 +102,7 @@ describe('API registration', () => {
propagation['_getGlobalPropagator']() instanceof NoopTextMapPropagator propagation['_getGlobalPropagator']() instanceof NoopTextMapPropagator
); );
assert.ok( assert.ok(context['_getContextManager']() instanceof DefaultContextManager);
context['_getContextManager']() instanceof AsyncHooksContextManager
);
const apiTracerProvider = trace.getTracerProvider(); const apiTracerProvider = trace.getTracerProvider();
assert.ok(apiTracerProvider instanceof ProxyTracerProvider); assert.ok(apiTracerProvider instanceof ProxyTracerProvider);

View File

@ -26,7 +26,10 @@ import {
trace, trace,
ProxyTracerProvider, ProxyTracerProvider,
} from '@opentelemetry/api'; } 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 { NoopContextManager } from '@opentelemetry/context-base';
import { CompositePropagator } from '@opentelemetry/core'; import { CompositePropagator } from '@opentelemetry/core';
import { ConsoleMetricExporter, MeterProvider } from '@opentelemetry/metrics'; import { ConsoleMetricExporter, MeterProvider } from '@opentelemetry/metrics';
@ -81,6 +84,10 @@ const mockedIdentityResponse = {
}; };
const mockedHostResponse = 'my-hostname'; const mockedHostResponse = 'my-hostname';
const DefaultContextManager = semver.gte(process.version, '14.8.0')
? AsyncLocalStorageContextManager
: AsyncHooksContextManager;
describe('Node SDK', () => { describe('Node SDK', () => {
before(() => { before(() => {
// Disable attempted load of default plugins // Disable attempted load of default plugins
@ -127,7 +134,7 @@ describe('Node SDK', () => {
assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider); assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider);
assert.ok( assert.ok(
context['_getContextManager']() instanceof AsyncHooksContextManager context['_getContextManager']() instanceof DefaultContextManager
); );
assert.ok( assert.ok(
propagation['_getGlobalPropagator']() instanceof CompositePropagator propagation['_getGlobalPropagator']() instanceof CompositePropagator
@ -151,7 +158,7 @@ describe('Node SDK', () => {
assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider); assert.ok(metrics.getMeterProvider() instanceof NoopMeterProvider);
assert.ok( assert.ok(
context['_getContextManager']() instanceof AsyncHooksContextManager context['_getContextManager']() instanceof DefaultContextManager
); );
assert.ok( assert.ok(
propagation['_getGlobalPropagator']() instanceof CompositePropagator propagation['_getGlobalPropagator']() instanceof CompositePropagator