mirror of
https://github.com/SukkaW/Surge.git
synced 2026-01-29 01:51:52 +08:00
Refactor: rework tracer
This commit is contained in:
@@ -30,7 +30,7 @@ export interface Span {
|
||||
readonly traceAsyncFn: <T>(fn: (span: Span) => T | Promise<T>) => Promise<T>,
|
||||
readonly tracePromise: <T>(promise: Promise<T>) => Promise<T>,
|
||||
readonly traceChildSync: <T>(name: string, fn: (span: Span) => T) => T,
|
||||
readonly traceChildAsync: <T>(name: string, fn: (span: Span) => T | Promise<T>) => Promise<T>,
|
||||
readonly traceChildAsync: <T>(name: string, fn: (span: Span) => Promise<T>) => Promise<T>,
|
||||
readonly traceChildPromise: <T>(name: string, promise: Promise<T>) => Promise<T>,
|
||||
readonly traceResult: TraceResult
|
||||
}
|
||||
@@ -85,9 +85,7 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span
|
||||
span.stop();
|
||||
}
|
||||
},
|
||||
get traceResult() {
|
||||
return curTraceResult;
|
||||
},
|
||||
traceResult: curTraceResult,
|
||||
async tracePromise<T>(promise: Promise<T>): Promise<T> {
|
||||
try {
|
||||
return await promise;
|
||||
@@ -95,44 +93,44 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span
|
||||
span.stop();
|
||||
}
|
||||
},
|
||||
traceChildSync<T>(name: string, fn: (span: Span) => T): T {
|
||||
return traceChild(name).traceSyncFn(fn);
|
||||
},
|
||||
traceChildAsync<T>(name: string, fn: (span: Span) => T | Promise<T>): Promise<T> {
|
||||
return traceChild(name).traceAsyncFn(fn);
|
||||
},
|
||||
traceChildPromise<T>(name: string, promise: Promise<T>): Promise<T> {
|
||||
return traceChild(name).tracePromise(promise);
|
||||
}
|
||||
traceChildSync: <T>(name: string, fn: (span: Span) => T): T => traceChild(name).traceSyncFn(fn),
|
||||
traceChildAsync: <T>(name: string, fn: (span: Span) => T | Promise<T>): Promise<T> => traceChild(name).traceAsyncFn(fn),
|
||||
traceChildPromise: <T>(name: string, promise: Promise<T>): Promise<T> => traceChild(name).tracePromise(promise)
|
||||
};
|
||||
|
||||
// eslint-disable-next-line sukka/no-redundant-variable -- self reference
|
||||
return span;
|
||||
};
|
||||
|
||||
export const task = <T>(importMetaPath: string, fn: (span: Span) => T, customname?: string) => {
|
||||
const taskName = customname ?? path.basename(importMetaPath, path.extname(importMetaPath));
|
||||
export const task = (importMetaMain: boolean, importMetaPath: string) => <T>(fn: (span: Span) => Promise<T>, customName?: string) => {
|
||||
const taskName = customName ?? path.basename(importMetaPath, path.extname(importMetaPath));
|
||||
|
||||
const dummySpan = createSpan(taskName);
|
||||
|
||||
if (importMetaMain) {
|
||||
fn(dummySpan);
|
||||
}
|
||||
|
||||
return async (span?: Span) => {
|
||||
if (span) {
|
||||
return span.traceChildAsync(taskName, fn);
|
||||
}
|
||||
return fn(createSpan(taskName));
|
||||
return fn(dummySpan);
|
||||
};
|
||||
};
|
||||
|
||||
const isSpan = (obj: any): obj is Span => {
|
||||
return typeof obj === 'object' && obj && spanTag in obj;
|
||||
};
|
||||
|
||||
export const universalify = <A extends any[], R>(taskname: string, fn: (this: void, ...args: A) => R) => {
|
||||
return (...args: A) => {
|
||||
const lastArg = args[args.length - 1];
|
||||
if (isSpan(lastArg)) {
|
||||
return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args));
|
||||
}
|
||||
return fn(...args);
|
||||
};
|
||||
};
|
||||
// const isSpan = (obj: any): obj is Span => {
|
||||
// return typeof obj === 'object' && obj && spanTag in obj;
|
||||
// };
|
||||
// export const universalify = <A extends any[], R>(taskname: string, fn: (this: void, ...args: A) => R) => {
|
||||
// return (...args: A) => {
|
||||
// const lastArg = args[args.length - 1];
|
||||
// if (isSpan(lastArg)) {
|
||||
// return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args));
|
||||
// }
|
||||
// return fn(...args);
|
||||
// };
|
||||
// };
|
||||
|
||||
export const printTraceResult = (traceResult: TraceResult = rootTraceResult) => {
|
||||
printStats(traceResult.children);
|
||||
@@ -140,8 +138,7 @@ export const printTraceResult = (traceResult: TraceResult = rootTraceResult) =>
|
||||
};
|
||||
|
||||
function printTree(initialTree: TraceResult, printNode: (node: TraceResult, branch: string) => string) {
|
||||
function printBranch(tree: TraceResult, branch: string) {
|
||||
const isGraphHead = branch.length === 0;
|
||||
function printBranch(tree: TraceResult, branch: string, isGraphHead: boolean, isChildOfLastBranch: boolean) {
|
||||
const children = tree.children;
|
||||
|
||||
let branchHead = '';
|
||||
@@ -159,7 +156,6 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran
|
||||
let baseBranch = branch;
|
||||
|
||||
if (!isGraphHead) {
|
||||
const isChildOfLastBranch = branch.endsWith('└─');
|
||||
baseBranch = branch.slice(0, -2) + (isChildOfLastBranch ? ' ' : '│ ');
|
||||
}
|
||||
|
||||
@@ -167,11 +163,12 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran
|
||||
const lastBranch = `${baseBranch}└─`;
|
||||
|
||||
children.forEach((child, index) => {
|
||||
printBranch(child, children.length - 1 === index ? lastBranch : nextBranch);
|
||||
const last = children.length - 1 === index;
|
||||
printBranch(child, last ? lastBranch : nextBranch, false, last);
|
||||
});
|
||||
}
|
||||
|
||||
printBranch(initialTree, '');
|
||||
printBranch(initialTree, '', true, false);
|
||||
}
|
||||
|
||||
function printStats(stats: TraceResult[]): void {
|
||||
|
||||
Reference in New Issue
Block a user