otel-tools
Version:
OpenTelemetry Tools
69 lines • 2.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.traceMethod = exports.TraceMethod = void 0;
var api_1 = require("@opentelemetry/api");
function TraceMethod(options) {
var tracer = options.tracer;
return function traceMethodDecorator(target, propertyKey, descriptor) {
var _a, _b;
var originalMethod = descriptor.value;
var spanName = (_a = options.spanName) !== null && _a !== void 0 ? _a : [(_b = target === null || target === void 0 ? void 0 : target.constructor) === null || _b === void 0 ? void 0 : _b.name, String(propertyKey)].join('.');
descriptor.value = traceMethod({ tracer: tracer, spanName: spanName }, originalMethod);
Object.defineProperty(descriptor.value, 'name', { value: propertyKey });
};
}
exports.TraceMethod = TraceMethod;
function traceMethod(options, fn) {
var _a;
var tracer = options.tracer;
var spanName = (_a = options.spanName) !== null && _a !== void 0 ? _a : fn.name;
if (!spanName) {
throw new Error('Specify spanName for anonymous function!');
}
var decoratedMethod = function () {
var _this = this;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return tracer.startActiveSpan(spanName, function (span) {
try {
var returnValue = fn.apply(_this, args);
if (typeof returnValue.then === 'function') {
return returnValue
.then(function (resolvedValue) {
span.setStatus({ code: api_1.SpanStatusCode.OK });
return resolvedValue;
})
.catch(function (error) {
span.recordException(error);
span.setStatus({
code: api_1.SpanStatusCode.ERROR,
message: error.message,
});
throw error;
})
.finally(function () { return span.end(); });
}
else {
span.setStatus({ code: api_1.SpanStatusCode.OK });
span.end();
return returnValue;
}
}
catch (error) {
span.recordException(error);
span.setStatus({
code: api_1.SpanStatusCode.ERROR,
message: error.message,
});
span.end();
throw error;
}
});
};
Object.defineProperty(decoratedMethod, 'name', { value: fn.name });
return decoratedMethod;
}
exports.traceMethod = traceMethod;
//# sourceMappingURL=decorator.js.map