diff --git a/js/core/src/tracing/localFileTraceStore.ts b/js/core/src/tracing/localFileTraceStore.ts index fc1f31b01..f46335f8e 100644 --- a/js/core/src/tracing/localFileTraceStore.ts +++ b/js/core/src/tracing/localFileTraceStore.ts @@ -34,8 +34,14 @@ import { export class LocalFileTraceStore implements TraceStore { private readonly storeRoot; private mutexes: Record = {}; + private filters: Record; - constructor() { + static defaultFilters: Record = { + // Prevent prompt rendering from spamming local trace store + 'genkit:metadata:subtype': 'prompt', + }; + + constructor(filters = LocalFileTraceStore.defaultFilters) { const rootHash = crypto .createHash('md5') .update(require?.main?.filename || 'unknown') @@ -45,6 +51,7 @@ export class LocalFileTraceStore implements TraceStore { logger.info( `Initialized local file trace store at root: ${this.storeRoot}` ); + this.filters = filters; } async load(id: string): Promise { @@ -68,7 +75,11 @@ export class LocalFileTraceStore implements TraceStore { return this.mutexes[id]; } - async save(id: string, trace: TraceData): Promise { + async save(id: string, rawTrace: TraceData): Promise { + let trace = this.filter(rawTrace); + if (Object.keys(trace.spans).length === 0) { + return; + } const mutex = this.getMutex(id); await mutex.waitForUnlock(); const release = await mutex.acquire(); @@ -126,4 +137,26 @@ export class LocalFileTraceStore implements TraceStore { continuationToken: files.length > stopAt ? stopAt.toString() : undefined, }; } + + private filter(trace: TraceData): TraceData { + // Delete any spans that match the filter criteria + Object.keys(trace.spans).forEach((spanId) => { + const span = trace.spans[spanId]; + Object.keys(this.filters).forEach((f) => { + if (span.attributes[f] === this.filters[f]) { + delete trace.spans[spanId]; + } + }); + }); + // Delete the root wrapper if it's the only span left + if (Object.keys(trace.spans).length === 1) { + Object.keys(trace.spans).forEach((spanId) => { + const span = trace.spans[spanId]; + if (span.attributes['genkit:name'] === 'dev-run-action-wrapper') { + delete trace.spans[spanId]; + } + }); + } + return trace; + } }