136 lines
5.8 KiB
JavaScript
136 lines
5.8 KiB
JavaScript
|
/*
|
||
|
* 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 api from '@opentelemetry/api';
|
||
|
import { sanitizeAttributes, isTracingSuppressed, } from '@opentelemetry/core';
|
||
|
import { Span } from './Span';
|
||
|
import { mergeConfig } from './utility';
|
||
|
import { RandomIdGenerator } from './platform';
|
||
|
/**
|
||
|
* This class represents a basic tracer.
|
||
|
*/
|
||
|
var Tracer = /** @class */ (function () {
|
||
|
/**
|
||
|
* Constructs a new Tracer instance.
|
||
|
*/
|
||
|
function Tracer(instrumentationLibrary, config, _tracerProvider) {
|
||
|
this._tracerProvider = _tracerProvider;
|
||
|
var localConfig = mergeConfig(config);
|
||
|
this._sampler = localConfig.sampler;
|
||
|
this._generalLimits = localConfig.generalLimits;
|
||
|
this._spanLimits = localConfig.spanLimits;
|
||
|
this._idGenerator = config.idGenerator || new RandomIdGenerator();
|
||
|
this.resource = _tracerProvider.resource;
|
||
|
this.instrumentationLibrary = instrumentationLibrary;
|
||
|
}
|
||
|
/**
|
||
|
* Starts a new Span or returns the default NoopSpan based on the sampling
|
||
|
* decision.
|
||
|
*/
|
||
|
Tracer.prototype.startSpan = function (name, options, context) {
|
||
|
var _a, _b, _c;
|
||
|
if (options === void 0) { options = {}; }
|
||
|
if (context === void 0) { context = api.context.active(); }
|
||
|
// remove span from context in case a root span is requested via options
|
||
|
if (options.root) {
|
||
|
context = api.trace.deleteSpan(context);
|
||
|
}
|
||
|
var parentSpan = api.trace.getSpan(context);
|
||
|
if (isTracingSuppressed(context)) {
|
||
|
api.diag.debug('Instrumentation suppressed, returning Noop Span');
|
||
|
var nonRecordingSpan = api.trace.wrapSpanContext(api.INVALID_SPAN_CONTEXT);
|
||
|
return nonRecordingSpan;
|
||
|
}
|
||
|
var parentSpanContext = parentSpan === null || parentSpan === void 0 ? void 0 : parentSpan.spanContext();
|
||
|
var spanId = this._idGenerator.generateSpanId();
|
||
|
var traceId;
|
||
|
var traceState;
|
||
|
var parentSpanId;
|
||
|
if (!parentSpanContext ||
|
||
|
!api.trace.isSpanContextValid(parentSpanContext)) {
|
||
|
// New root span.
|
||
|
traceId = this._idGenerator.generateTraceId();
|
||
|
}
|
||
|
else {
|
||
|
// New child span.
|
||
|
traceId = parentSpanContext.traceId;
|
||
|
traceState = parentSpanContext.traceState;
|
||
|
parentSpanId = parentSpanContext.spanId;
|
||
|
}
|
||
|
var spanKind = (_a = options.kind) !== null && _a !== void 0 ? _a : api.SpanKind.INTERNAL;
|
||
|
var links = ((_b = options.links) !== null && _b !== void 0 ? _b : []).map(function (link) {
|
||
|
return {
|
||
|
context: link.context,
|
||
|
attributes: sanitizeAttributes(link.attributes),
|
||
|
};
|
||
|
});
|
||
|
var attributes = sanitizeAttributes(options.attributes);
|
||
|
// make sampling decision
|
||
|
var samplingResult = this._sampler.shouldSample(context, traceId, name, spanKind, attributes, links);
|
||
|
traceState = (_c = samplingResult.traceState) !== null && _c !== void 0 ? _c : traceState;
|
||
|
var traceFlags = samplingResult.decision === api.SamplingDecision.RECORD_AND_SAMPLED
|
||
|
? api.TraceFlags.SAMPLED
|
||
|
: api.TraceFlags.NONE;
|
||
|
var spanContext = { traceId: traceId, spanId: spanId, traceFlags: traceFlags, traceState: traceState };
|
||
|
if (samplingResult.decision === api.SamplingDecision.NOT_RECORD) {
|
||
|
api.diag.debug('Recording is off, propagating context in a non-recording span');
|
||
|
var nonRecordingSpan = api.trace.wrapSpanContext(spanContext);
|
||
|
return nonRecordingSpan;
|
||
|
}
|
||
|
// Set initial span attributes. The attributes object may have been mutated
|
||
|
// by the sampler, so we sanitize the merged attributes before setting them.
|
||
|
var initAttributes = sanitizeAttributes(Object.assign(attributes, samplingResult.attributes));
|
||
|
var span = new Span(this, context, name, spanContext, spanKind, parentSpanId, links, options.startTime, undefined, initAttributes);
|
||
|
return span;
|
||
|
};
|
||
|
Tracer.prototype.startActiveSpan = function (name, arg2, arg3, arg4) {
|
||
|
var opts;
|
||
|
var ctx;
|
||
|
var fn;
|
||
|
if (arguments.length < 2) {
|
||
|
return;
|
||
|
}
|
||
|
else if (arguments.length === 2) {
|
||
|
fn = arg2;
|
||
|
}
|
||
|
else if (arguments.length === 3) {
|
||
|
opts = arg2;
|
||
|
fn = arg3;
|
||
|
}
|
||
|
else {
|
||
|
opts = arg2;
|
||
|
ctx = arg3;
|
||
|
fn = arg4;
|
||
|
}
|
||
|
var parentContext = ctx !== null && ctx !== void 0 ? ctx : api.context.active();
|
||
|
var span = this.startSpan(name, opts, parentContext);
|
||
|
var contextWithSpanSet = api.trace.setSpan(parentContext, span);
|
||
|
return api.context.with(contextWithSpanSet, fn, undefined, span);
|
||
|
};
|
||
|
/** Returns the active {@link GeneralLimits}. */
|
||
|
Tracer.prototype.getGeneralLimits = function () {
|
||
|
return this._generalLimits;
|
||
|
};
|
||
|
/** Returns the active {@link SpanLimits}. */
|
||
|
Tracer.prototype.getSpanLimits = function () {
|
||
|
return this._spanLimits;
|
||
|
};
|
||
|
Tracer.prototype.getActiveSpanProcessor = function () {
|
||
|
return this._tracerProvider.getActiveSpanProcessor();
|
||
|
};
|
||
|
return Tracer;
|
||
|
}());
|
||
|
export { Tracer };
|
||
|
//# sourceMappingURL=Tracer.js.map
|