OpenTelemetry Tracing
npm install @opentelemetry/sdk-trace-base[![NPM Published Version][npm-img]][npm-url]
[![Apache License][license-image]][license-image]
The tracing module contains the foundation for all tracing SDKs of opentelemetry-js.
Used standalone, this module provides methods for manual instrumentation of code, offering full control over span creation for client-side JavaScript (browser) and Node.js.
It does not provide automated instrumentation of known libraries, context propagation or distributed-context out-of-the-box.
For a TracerProvider that includes default context management and propagation for Node.js, please see
@opentelemetry/sdk-trace-node.
For a TracerProvider that includes default context management and propagation for Browser, please see
@opentelemetry/sdk-trace-web.
``bash`
npm install --save @opentelemetry/api
npm install --save @opentelemetry/sdk-trace-base
`js
const { trace } = require('@opentelemetry/api');
const { BasicTracerProvider } = require('@opentelemetry/sdk-trace-base');
// To start a trace, you first need to initialize the Tracer provider.
// NOTE: The default OpenTelemetry tracer provider does not record any tracing information.
// Registering a working tracer provider allows the API methods to record traces.
trace.setGlobalTracerProvider(new BasicTracerProvider());
// Important: requires a context manager and propagator to be registered manually.
// propagation.setGlobalPropagator(propagator); // replace propagator with your TextMapPropagator, for example: W3CTraceContextPropagator from @openetelemetry/corecontextManager
// context.setGlobalContextManager(contextManager); // replace with your ContextManager: AsyncLocalStorageContextManager from @openetelemetry/async-hooks
// To create a span in a trace, we used the global singleton tracer to start a new span.
const span = trace.getTracer('default').startSpan('foo');
// Set a span attribute
span.setAttribute('key', 'value');
// We must end the spans so they become available for exporting.
span.end();
`
Tracing configuration is a merge of user supplied configuration with both the default
configuration as specified in config.ts and an
environmentally configurable sampling (via OTEL_TRACES_SAMPLER and OTEL_TRACES_SAMPLER_ARG).
Sampler is used to make decisions on Span sampling.
Samples every trace regardless of upstream sampling decisions.
> This is used as a default Sampler
`js
const {
AlwaysOnSampler,
BasicTracerProvider,
} = require("@opentelemetry/sdk-trace-base");
const tracerProvider = new BasicTracerProvider({
sampler: new AlwaysOnSampler()
});
`
Doesn't sample any trace, regardless of upstream sampling decisions.
`js
const {
AlwaysOffSampler,
BasicTracerProvider,
} = require("@opentelemetry/sdk-trace-base");
const tracerProvider = new BasicTracerProvider({
sampler: new AlwaysOffSampler()
});
`
Samples some percentage of traces, calculated deterministically using the trace ID.
Any trace that would be sampled at a given percentage will also be sampled at any higher percentage.
The TraceIDRatioSampler may be used with the ParentBasedSampler to respect the sampled flag of an incoming trace.
`js
const {
BasicTracerProvider,
TraceIdRatioBasedSampler,
} = require("@opentelemetry/sdk-trace-base");
const tracerProvider = new BasicTracerProvider({
// See details of ParentBasedSampler below
sampler: new ParentBasedSampler({
// Trace ID Ratio Sampler accepts a positional argument
// which represents the percentage of traces which should
// be sampled.
root: new TraceIdRatioBasedSampler(0.5)
});
});
`
- This is a composite sampler. ParentBased helps distinguished between thesampled
following cases:
- No parent (root span).
- Remote parent with flag truesampled
- Remote parent with flag falsesampled
- Local parent with flag truesampled
- Local parent with flag false
Required parameters:
- root(Sampler) - Sampler called for spans with no parent (root spans)
Optional parameters:
- remoteParentSampled(Sampler) (default: AlwaysOn)remoteParentNotSampled(Sampler)
- (default: AlwaysOff)localParentSampled(Sampler)
- (default: AlwaysOn)localParentNotSampled(Sampler)
- (default: AlwaysOff)
|Parent|parent.isRemote()|parent.isSampled()|Invoke sampler|
|---|---|---|---|
|absent|n/a|n/a|root()|remoteParentSampled()
|present|true|true||remoteParentNotSampled()
|present|true|false||localParentSampled()
|present|false|true||localParentNotSampled()
|present|false|false||
`js
const {
AlwaysOffSampler,
BasicTracerProvider,
ParentBasedSampler,
TraceIdRatioBasedSampler,
} = require("@opentelemetry/sdk-trace-base");
const tracerProvider = new BasicTracerProvider({
sampler: new ParentBasedSampler({
// By default, the ParentBasedSampler will respect the parent span's sampling
// decision. This is configurable by providing a different sampler to use
// based on the situation. See configuration details above.
//
// This will delegate the sampling decision of all root traces (no parent)
// to the TraceIdRatioBasedSampler.
// See details of TraceIdRatioBasedSampler above.
root: new TraceIdRatioBasedSampler(0.5)
})
});
``
See examples/basic-tracer-node for an end-to-end example, including exporting created spans.
- For more information on OpenTelemetry, visit:
- For more about OpenTelemetry JavaScript:
- For help or feedback on this project, join us in [GitHub Discussions][discussions-url]
Apache 2.0 - See [LICENSE][license-url] for more information.
[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions
[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE
[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat
[npm-url]: https://www.npmjs.com/package/@opentelemetry/sdk-trace-base
[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fsdk-trace-base.svg