Skip to content

Commit 1a0e2c7

Browse files
committed
feat: add parse timing and query cache metrics
- Add parseMs metric to track file parsing duration - Add query cache metrics: queryCacheHits, queryCacheSimilarHits, queryCacheMisses - Record metrics in getQueryEmbedding for exact/similar cache hits and misses
1 parent 9e2091f commit 1a0e2c7

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/indexer/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,10 +448,13 @@ export class Indexer {
448448
totalChunks: 0,
449449
});
450450

451+
const parseStartTime = performance.now();
451452
const parsedFiles = parseFiles(changedFiles);
453+
const parseMs = performance.now() - parseStartTime;
452454

453455
this.logger.recordFilesParsed(parsedFiles.length);
454-
this.logger.debug("Parsed changed files", { parsedCount: parsedFiles.length });
456+
this.logger.recordParseDuration(parseMs);
457+
this.logger.debug("Parsed changed files", { parsedCount: parsedFiles.length, parseMs: parseMs.toFixed(2) });
455458

456459
const existingChunks = new Map<string, string>();
457460
const existingChunksByFile = new Map<string, Set<string>>();
@@ -779,6 +782,7 @@ export class Indexer {
779782

780783
if (cached && (now - cached.timestamp) < this.queryCacheTtlMs) {
781784
this.logger.cache("debug", "Query embedding cache hit (exact)", { query: query.slice(0, 50) });
785+
this.logger.recordQueryCacheHit();
782786
return cached.embedding;
783787
}
784788

@@ -789,10 +793,12 @@ export class Indexer {
789793
similarTo: similarMatch.key.slice(0, 50),
790794
similarity: similarMatch.similarity.toFixed(3),
791795
});
796+
this.logger.recordQueryCacheSimilarHit();
792797
return similarMatch.embedding;
793798
}
794799

795800
this.logger.cache("debug", "Query embedding cache miss", { query: query.slice(0, 50) });
801+
this.logger.recordQueryCacheMiss();
796802
const { embedding, tokensUsed } = await provider.embed(query);
797803
this.logger.recordEmbeddingApiCall(tokensUsed);
798804

src/utils/logger.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface Metrics {
1212
indexingEndTime?: number;
1313
filesScanned: number;
1414
filesParsed: number;
15+
parseMs: number;
1516
chunksProcessed: number;
1617
chunksEmbedded: number;
1718
chunksFromCache: number;
@@ -32,6 +33,10 @@ export interface Metrics {
3233
cacheHits: number;
3334
cacheMisses: number;
3435

36+
queryCacheHits: number;
37+
queryCacheSimilarHits: number;
38+
queryCacheMisses: number;
39+
3540
gcRuns: number;
3641
gcOrphansRemoved: number;
3742
gcChunksRemoved: number;
@@ -50,6 +55,7 @@ function createEmptyMetrics(): Metrics {
5055
return {
5156
filesScanned: 0,
5257
filesParsed: 0,
58+
parseMs: 0,
5359
chunksProcessed: 0,
5460
chunksEmbedded: 0,
5561
chunksFromCache: 0,
@@ -67,6 +73,9 @@ function createEmptyMetrics(): Metrics {
6773
fusionMs: 0,
6874
cacheHits: 0,
6975
cacheMisses: 0,
76+
queryCacheHits: 0,
77+
queryCacheSimilarHits: 0,
78+
queryCacheMisses: 0,
7079
gcRuns: 0,
7180
gcOrphansRemoved: 0,
7281
gcChunksRemoved: 0,
@@ -173,6 +182,11 @@ export class Logger {
173182
this.metrics.filesParsed = count;
174183
}
175184

185+
recordParseDuration(durationMs: number): void {
186+
if (!this.config.metrics) return;
187+
this.metrics.parseMs = durationMs;
188+
}
189+
176190
recordChunksProcessed(count: number): void {
177191
if (!this.config.metrics) return;
178192
this.metrics.chunksProcessed += count;
@@ -229,6 +243,21 @@ export class Logger {
229243
this.metrics.cacheMisses++;
230244
}
231245

246+
recordQueryCacheHit(): void {
247+
if (!this.config.metrics) return;
248+
this.metrics.queryCacheHits++;
249+
}
250+
251+
recordQueryCacheSimilarHit(): void {
252+
if (!this.config.metrics) return;
253+
this.metrics.queryCacheSimilarHits++;
254+
}
255+
256+
recordQueryCacheMiss(): void {
257+
if (!this.config.metrics) return;
258+
this.metrics.queryCacheMisses++;
259+
}
260+
232261
recordGc(orphans: number, chunks: number, embeddings: number): void {
233262
if (!this.config.metrics) return;
234263
this.metrics.gcRuns++;

0 commit comments

Comments
 (0)