chore: prefer use of global TracerProvider/MeterProvider (#2127)
Co-authored-by: Daniel Dyla <dyladan@users.noreply.github.com> Co-authored-by: Valentin Marchaud <contact@vmarchaud.fr>
This commit is contained in:
		
							parent
							
								
									23ba4bfdc7
								
							
						
					
					
						commit
						f077df3f14
					
				| 
						 | 
				
			
			@ -12,12 +12,6 @@ const EXPORTER = process.env.EXPORTER || '';
 | 
			
		|||
 | 
			
		||||
module.exports = (serviceName) => {
 | 
			
		||||
  const provider = new NodeTracerProvider();
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new GrpcInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
    tracerProvider: provider,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  let exporter;
 | 
			
		||||
  if (EXPORTER.toLowerCase().startsWith('z')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -35,5 +29,11 @@ module.exports = (serviceName) => {
 | 
			
		|||
  // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
 | 
			
		||||
  provider.register();
 | 
			
		||||
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new GrpcInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return opentelemetry.trace.getTracer('grpc-js-example');
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,12 +12,6 @@ const EXPORTER = process.env.EXPORTER || '';
 | 
			
		|||
 | 
			
		||||
module.exports = (serviceName) => {
 | 
			
		||||
  const provider = new NodeTracerProvider();
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    tracerProvider: provider,
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new GrpcInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  let exporter;
 | 
			
		||||
  if (EXPORTER.toLowerCase().startsWith('z')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -35,5 +29,11 @@ module.exports = (serviceName) => {
 | 
			
		|||
  // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
 | 
			
		||||
  provider.register();
 | 
			
		||||
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new GrpcInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return opentelemetry.trace.getTracer('grpc-example');
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,13 +12,6 @@ const EXPORTER = process.env.EXPORTER || '';
 | 
			
		|||
 | 
			
		||||
module.exports = (serviceName) => {
 | 
			
		||||
  const provider = new NodeTracerProvider();
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    tracerProvider: provider,
 | 
			
		||||
    // // when boostraping with lerna for testing purposes
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new HttpInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  let exporter;
 | 
			
		||||
  if (EXPORTER.toLowerCase().startsWith('z')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +29,12 @@ module.exports = (serviceName) => {
 | 
			
		|||
  // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
 | 
			
		||||
  provider.register();
 | 
			
		||||
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    // // when boostraping with lerna for testing purposes
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new HttpInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return opentelemetry.trace.getTracer('http-example');
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,12 +14,6 @@ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
 | 
			
		|||
module.exports = (serviceName) => {
 | 
			
		||||
  let exporter;
 | 
			
		||||
  const provider = new NodeTracerProvider();
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    tracerProvider: provider,
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new HttpInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (EXPORTER.toLowerCase().startsWith('z')) {
 | 
			
		||||
    exporter = new ZipkinExporter({
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +30,11 @@ module.exports = (serviceName) => {
 | 
			
		|||
  // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
 | 
			
		||||
  provider.register();
 | 
			
		||||
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    instrumentations: [
 | 
			
		||||
      new HttpInstrumentation(),
 | 
			
		||||
    ],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return opentelemetry.trace.getTracer('https-example');
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,14 +9,14 @@ const { TracerShim } = require('@opentelemetry/shim-opentracing');
 | 
			
		|||
 | 
			
		||||
function shim(serviceName) {
 | 
			
		||||
  const provider = new NodeTracerProvider();
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
    tracerProvider: provider,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  provider.addSpanProcessor(new SimpleSpanProcessor(getExporter(serviceName)));
 | 
			
		||||
  // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
 | 
			
		||||
  provider.register();
 | 
			
		||||
 | 
			
		||||
  registerInstrumentations({
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return new TracerShim(provider.getTracer('opentracing-shim'));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,12 @@ import { B3Propagator } from '@opentelemetry/propagator-b3';
 | 
			
		|||
import { registerInstrumentations } from '@opentelemetry/instrumentation';
 | 
			
		||||
 | 
			
		||||
const provider = new WebTracerProvider();
 | 
			
		||||
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
 | 
			
		||||
provider.addSpanProcessor(new SimpleSpanProcessor(new CollectorTraceExporter()));
 | 
			
		||||
provider.register({
 | 
			
		||||
  contextManager: new ZoneContextManager(),
 | 
			
		||||
  propagator: new B3Propagator(),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
| 
						 | 
				
			
			@ -20,17 +26,9 @@ registerInstrumentations({
 | 
			
		|||
        'https://cors-test.appspot.com/test',
 | 
			
		||||
        'https://httpbin.org/get',
 | 
			
		||||
      ],
 | 
			
		||||
      clearTimingResources: true
 | 
			
		||||
      clearTimingResources: true,
 | 
			
		||||
    }),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
 | 
			
		||||
provider.addSpanProcessor(new SimpleSpanProcessor(new CollectorTraceExporter()));
 | 
			
		||||
provider.register({
 | 
			
		||||
  contextManager: new ZoneContextManager(),
 | 
			
		||||
  propagator: new B3Propagator(),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const webTracerWithZone = provider.getTracer('example-tracer-web');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,13 @@ import { B3Propagator } from '@opentelemetry/propagator-b3';
 | 
			
		|||
import { registerInstrumentations } from '@opentelemetry/instrumentation';
 | 
			
		||||
 | 
			
		||||
const providerWithZone = new WebTracerProvider();
 | 
			
		||||
providerWithZone.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
 | 
			
		||||
providerWithZone.addSpanProcessor(new SimpleSpanProcessor(new CollectorTraceExporter()));
 | 
			
		||||
 | 
			
		||||
providerWithZone.register({
 | 
			
		||||
  contextManager: new ZoneContextManager(),
 | 
			
		||||
  propagator: new B3Propagator(),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
| 
						 | 
				
			
			@ -18,15 +25,6 @@ registerInstrumentations({
 | 
			
		|||
      ],
 | 
			
		||||
    }),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: providerWithZone,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
providerWithZone.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
 | 
			
		||||
providerWithZone.addSpanProcessor(new SimpleSpanProcessor(new CollectorTraceExporter()));
 | 
			
		||||
 | 
			
		||||
providerWithZone.register({
 | 
			
		||||
  contextManager: new ZoneContextManager(),
 | 
			
		||||
  propagator: new B3Propagator(),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const webTracerWithZone = providerWithZone.getTracer('example-tracer-web');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,8 @@ This guide walks you through the setup and configuration process for a tracing b
 | 
			
		|||
 | 
			
		||||
- [Getting started with OpenTelemetry JS](#getting-started-with-opentelemetry-js)
 | 
			
		||||
  - [Trace your application with OpenTelemetry](#trace-your-application-with-opentelemetry)
 | 
			
		||||
    - [Set up a Tracing Backend](#set-up-a-tracing-backend)
 | 
			
		||||
    - [Trace Your NodeJS Application](#trace-your-nodejs-application)
 | 
			
		||||
    - [Set up a tracing backend](#set-up-a-tracing-backend)
 | 
			
		||||
    - [Trace your NodeJS application](#trace-your-nodejs-application)
 | 
			
		||||
      - [Install the required OpenTelemetry libraries](#install-the-required-opentelemetry-libraries)
 | 
			
		||||
      - [Initialize a global tracer](#initialize-a-global-tracer)
 | 
			
		||||
      - [Initialize and register a trace exporter](#initialize-and-register-a-trace-exporter)
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,6 @@ registerInstrumentations({
 | 
			
		|||
    new HttpInstrumentation(),
 | 
			
		||||
    new GrpcInstrumentation(),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			@ -153,7 +152,6 @@ registerInstrumentations({
 | 
			
		|||
    new HttpInstrumentation(),
 | 
			
		||||
    new GrpcInstrumentation(),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log("tracing initialized");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,6 @@ provider.register();
 | 
			
		|||
 | 
			
		||||
// load old default plugins
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
    new ExpressInstrumentation(),
 | 
			
		||||
    new HttpInstrumentation(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,7 +88,6 @@ const provider: NodeTracerProvider = new NodeTracerProvider({
 | 
			
		|||
provider.register();
 | 
			
		||||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
    new ExpressInstrumentation(),
 | 
			
		||||
    new HttpInstrumentation(),
 | 
			
		||||
| 
						 | 
				
			
			@ -137,8 +136,6 @@ const provider: NodeTracerProvider = new NodeTracerProvider({
 | 
			
		|||
  logLevel: LogLevel.ERROR,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
provider.register();
 | 
			
		||||
 | 
			
		||||
provider.addSpanProcessor(
 | 
			
		||||
  new SimpleSpanProcessor(
 | 
			
		||||
    new ZipkinExporter({
 | 
			
		||||
| 
						 | 
				
			
			@ -152,8 +149,9 @@ provider.addSpanProcessor(
 | 
			
		|||
  ),
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
provider.register();
 | 
			
		||||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
    new ExpressInstrumentation(),
 | 
			
		||||
    new HttpInstrumentation(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,9 +10,6 @@ const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-expre
 | 
			
		|||
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
 | 
			
		||||
 | 
			
		||||
const provider: NodeTracerProvider = new NodeTracerProvider();
 | 
			
		||||
 | 
			
		||||
provider.register();
 | 
			
		||||
 | 
			
		||||
provider.addSpanProcessor(
 | 
			
		||||
  new SimpleSpanProcessor(
 | 
			
		||||
    new ZipkinExporter({
 | 
			
		||||
| 
						 | 
				
			
			@ -25,9 +22,9 @@ provider.addSpanProcessor(
 | 
			
		|||
    }),
 | 
			
		||||
  ),
 | 
			
		||||
);
 | 
			
		||||
provider.register();
 | 
			
		||||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
    new ExpressInstrumentation(),
 | 
			
		||||
    new HttpInstrumentation(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,6 @@ provider.register({
 | 
			
		|||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  instrumentations: [new FetchInstrumentation()],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// or plugin can be also initialised separately and then set the tracer provider or meter provider
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,6 @@ provider.register();
 | 
			
		|||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  instrumentations: [new GrpcInstrumentation()]
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,6 @@ provider.register();
 | 
			
		|||
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  instrumentations: [new HttpInstrumentation()],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,6 @@ registerInstrumentations({
 | 
			
		|||
      propagateTraceHeaderCorsUrls: ['http://localhost:8090']
 | 
			
		||||
    }),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,7 +109,7 @@ export class MyPlugin extends InstrumentationBase {
 | 
			
		|||
// Later
 | 
			
		||||
 | 
			
		||||
const myPLugin = new MyPlugin();
 | 
			
		||||
myPLugin.setTracerProvider(provider); // this is optional
 | 
			
		||||
myPLugin.setTracerProvider(provider); // this is optional, only if global TracerProvider shouldn't be used
 | 
			
		||||
myPLugin.setMeterProvider(meterProvider); // this is optional
 | 
			
		||||
myPLugin.enable();
 | 
			
		||||
// or use Auto Loader
 | 
			
		||||
| 
						 | 
				
			
			@ -151,8 +151,8 @@ export class MyPlugin extends InstrumentationBase {
 | 
			
		|||
// Later
 | 
			
		||||
 | 
			
		||||
const myPLugin = new MyPlugin();
 | 
			
		||||
myPLugin.setTracerProvider(provider);
 | 
			
		||||
myPLugin.setMeterProvider(meterProvider);
 | 
			
		||||
myPLugin.setTracerProvider(provider); // this is optional, only if global TracerProvider shouldn't be used
 | 
			
		||||
myPLugin.setMeterProvider(meterProvider); // this is optional, only if global MeterProvider shouldn't be used
 | 
			
		||||
myPLugin.enable();
 | 
			
		||||
// or use Auto Loader
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			@ -221,7 +221,8 @@ registerInstrumentations({
 | 
			
		|||
  instrumentations: [
 | 
			
		||||
    new HttpInstrumentation(),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: tracerProvider,
 | 
			
		||||
  //tracerProvider: tracerProvider, // optional, only if global TracerProvider shouldn't be used
 | 
			
		||||
  //meterProvider: meterProvider, // optional, only if global MeterProvider shouldn't be used
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			@ -249,10 +250,19 @@ registerInstrumentations({
 | 
			
		|||
      ],
 | 
			
		||||
    }),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: tracerProvider,
 | 
			
		||||
  //tracerProvider: tracerProvider, // optional, only if global TracerProvider shouldn't be used
 | 
			
		||||
  //meterProvider: meterProvider, // optional, only if global MeterProvider shouldn't be used
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Selection of the used TracerProvider/MeterProvider
 | 
			
		||||
 | 
			
		||||
The `registerInstrumentations()` API allows to specify which `TracerProvider` and/or `MeterProvider` to use by the given options object.
 | 
			
		||||
If nothing is specified the global registered provider is used. Usually this is what most users want therefore it's recommended to keep this default.
 | 
			
		||||
 | 
			
		||||
There might be usecase where someone has the need for more providers within an application. Please note that special care must be takes in such setups
 | 
			
		||||
to avoid leaking information from one provider to the other because there are a lot places where e.g. the global `ContextManager` or `Propagator` is used.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
Apache 2.0 - See [LICENSE][license-url] for more information.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,6 @@ provider.register();
 | 
			
		|||
// register and load instrumentation and old plugins - old plugins will be loaded automatically as previously
 | 
			
		||||
// but instrumentations needs to be added
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Your application code - http will automatically be instrumented if
 | 
			
		||||
| 
						 | 
				
			
			@ -80,15 +79,16 @@ In the following example:
 | 
			
		|||
- the http instrumentation has a custom config for a `requestHook`
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
 | 
			
		||||
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
 | 
			
		||||
const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');
 | 
			
		||||
 | 
			
		||||
const provider = new NodeTracerProvider();
 | 
			
		||||
provider.register();
 | 
			
		||||
 | 
			
		||||
// register and load instrumentation and old plugins - old plugins will be loaded automatically as previously
 | 
			
		||||
// but instrumentations needs to be added
 | 
			
		||||
registerInstrumentations({
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
  instrumentations: [
 | 
			
		||||
    new ExpressInstrumentation(),
 | 
			
		||||
    new HttpInstrumentation({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -176,8 +176,6 @@ export class NodeSDK {
 | 
			
		|||
 | 
			
		||||
    registerInstrumentations({
 | 
			
		||||
      instrumentations: this._instrumentations,
 | 
			
		||||
      tracerProvider: this._tracerProvider,
 | 
			
		||||
      meterProvider: this._meterProvider,
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,6 @@ registerInstrumentations({
 | 
			
		|||
  instrumentations: [
 | 
			
		||||
    new DocumentLoad(),
 | 
			
		||||
  ],
 | 
			
		||||
  tracerProvider: provider,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue