autotel
Version:
Write Once, Observe Anywhere
44 lines (42 loc) • 1.61 kB
JavaScript
import { getConfig } from "./config.js";
import { p as createTraceContext } from "./track-COUuU48p.js";
import { SpanStatusCode } from "@opentelemetry/api";
//#region src/decorators.ts
function Trace(nameOrOptions, maybeOptions) {
const name = typeof nameOrOptions === "string" ? nameOrOptions : nameOrOptions?.name;
return function(originalMethod, context) {
const methodName = String(context.name);
const methodStr = originalMethod?.toString() || "";
if (!(originalMethod && (originalMethod.constructor?.name === "AsyncFunction" || methodStr.trim().startsWith("async ") || methodStr.includes("[native code]") && methodStr.includes("async") || /async\s+/.test(methodStr)))) return originalMethod;
const spanName = name || methodName;
return async function(...args) {
return getConfig().tracer.startActiveSpan(spanName, async (span) => {
try {
const ctx = createTraceContext(span);
const originalCtx = this.ctx;
try {
this.ctx = ctx;
const result = await originalMethod.apply(this, args);
span.setStatus({ code: SpanStatusCode.OK });
return result;
} finally {
if (originalCtx === void 0) delete this.ctx;
else this.ctx = originalCtx;
}
} catch (error) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: error instanceof Error ? error.message : "Unknown error"
});
span.recordException(error instanceof Error ? error : new Error(String(error)));
throw error;
} finally {
span.end();
}
});
};
};
}
//#endregion
export { Trace };
//# sourceMappingURL=decorators.js.map