@opentelemetry/api
Version:
Public API for OpenTelemetry
92 lines • 2.87 kB
JavaScript
import { context, SpanStatusCode } from '../../';
var defaultOnException = function (e, span) {
span.recordException(e);
span.setStatus({
code: SpanStatusCode.ERROR,
});
};
/**
* return a new SugaredTracer created from the supplied one
* @param tracer
*/
export function wrapTracer(tracer) {
return new SugaredTracer(tracer);
}
var SugaredTracer = /** @class */ (function () {
function SugaredTracer(tracer) {
this._tracer = tracer;
this.startSpan = tracer.startSpan.bind(this._tracer);
this.startActiveSpan = tracer.startActiveSpan.bind(this._tracer);
}
SugaredTracer.prototype.withActiveSpan = function (name, arg2, arg3, arg4) {
var _a = massageParams(arg2, arg3, arg4), opts = _a.opts, ctx = _a.ctx, fn = _a.fn;
return this._tracer.startActiveSpan(name, opts, ctx, function (span) {
return handleFn(span, opts, fn);
});
};
SugaredTracer.prototype.withSpan = function (name, arg2, arg3, arg4) {
var _a = massageParams(arg2, arg3, arg4), opts = _a.opts, ctx = _a.ctx, fn = _a.fn;
var span = this._tracer.startSpan(name, opts, ctx);
return handleFn(span, opts, fn);
};
return SugaredTracer;
}());
export { SugaredTracer };
/**
* Massages parameters of withSpan and withActiveSpan to allow signature overwrites
* @param arg
* @param arg2
* @param arg3
*/
function massageParams(arg, arg2, arg3) {
var opts;
var ctx;
var fn;
if (!arg2 && !arg3) {
fn = arg;
}
else if (!arg3) {
opts = arg;
fn = arg2;
}
else {
opts = arg;
ctx = arg2;
fn = arg3;
}
opts = opts !== null && opts !== void 0 ? opts : {};
ctx = ctx !== null && ctx !== void 0 ? ctx : context.active();
return { opts: opts, ctx: ctx, fn: fn };
}
/**
* Executes fn, returns results and runs onException in the case of exception to allow overwriting of error handling
* @param span
* @param opts
* @param fn
*/
function handleFn(span, opts, fn) {
var _a;
var onException = (_a = opts.onException) !== null && _a !== void 0 ? _a : defaultOnException;
var errorHandler = function (e) {
onException(e, span);
span.end();
throw e;
};
try {
var ret = fn(span);
// if fn is an async function, attach a recordException and spanEnd callback to the promise
if (typeof (ret === null || ret === void 0 ? void 0 : ret.then) === 'function') {
return ret.then(function (val) {
span.end();
return val;
}, errorHandler);
}
span.end();
return ret;
}
catch (e) {
// add throw to signal the compiler that this will throw in the inner scope
throw errorHandler(e);
}
}
//# sourceMappingURL=SugaredTracer.js.map