Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/cli/src/commands/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1558,6 +1558,10 @@ function trackRenderMetrics(
extractPhase3Ms: extract?.extractMs,
extractCacheHits: extract?.cacheHits,
extractCacheMisses: extract?.cacheMisses,
extractCachePublishFailures: extract?.cachePublishFailures,
extractCacheGcEvictions: extract?.cacheGcEvictions,
extractCacheGcBytesFreed: extract?.cacheGcBytesFreed,
extractCacheAgedPartialsCleared: extract?.cacheAgedPartialsCleared,
...renderJobObservabilityTelemetryPayload(job),
...getMemorySnapshot(),
});
Expand Down
14 changes: 10 additions & 4 deletions packages/cli/src/server/studioRenderTelemetry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,12 @@ const fullPerf: RenderPerfSummary = {
extractMs: 60,
cacheHits: 3,
cacheMisses: 4,
cachePublishFailures: 0,
cacheGcEvictions: 0,
cacheGcBytesFreed: 0,
cacheAgedPartialsCleared: 0,
// Distinct non-zero values: all-zeros cannot tell a correct mapping from
// one that crossed two fields.
cachePublishFailures: 5,
cacheGcEvictions: 6,
cacheGcBytesFreed: 7,
cacheAgedPartialsCleared: 8,
},
tmpPeakBytes: 1024,
captureAvgMs: 13,
Expand Down Expand Up @@ -184,6 +186,10 @@ describe("studioRenderTelemetry", () => {
expect(p.extractPhase3Ms).toBe(60);
expect(p.extractCacheHits).toBe(3);
expect(p.extractCacheMisses).toBe(4);
expect(p.extractCachePublishFailures).toBe(5);
expect(p.extractCacheGcEvictions).toBe(6);
expect(p.extractCacheGcBytesFreed).toBe(7);
expect(p.extractCacheAgedPartialsCleared).toBe(8);
// observability aggregate
expect(p.observabilityRenderJobId).toBe("render-123");
expect(p.observabilityCompositionHash).toBe("abc123");
Expand Down
4 changes: 4 additions & 0 deletions packages/cli/src/server/studioRenderTelemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ function extractPayload(
extractPhase3Ms: extract.extractMs,
extractCacheHits: extract.cacheHits,
extractCacheMisses: extract.cacheMisses,
extractCachePublishFailures: extract.cachePublishFailures,
extractCacheGcEvictions: extract.cacheGcEvictions,
extractCacheGcBytesFreed: extract.cacheGcBytesFreed,
extractCacheAgedPartialsCleared: extract.cacheAgedPartialsCleared,
};
}

Expand Down
15 changes: 15 additions & 0 deletions packages/cli/src/telemetry/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,17 @@ export function trackRenderComplete(
extractPhase3Ms?: number;
extractCacheHits?: number;
extractCacheMisses?: number;
/**
* Frame-cache health. `cachePublishFailures` is the one to alert on: the
* render still succeeded from the partial dir, so nothing surfaces, but
* every later render re-extracts — warm renders going cold with no signal.
* The GC counters give it a denominator (was the entry evicted, or did the
* publish fail?).
*/
extractCachePublishFailures?: number;
extractCacheGcEvictions?: number;
extractCacheGcBytesFreed?: number;
extractCacheAgedPartialsCleared?: number;
// Attribute this event to a specific user (e.g. the browser user who
// triggered a studio render); defaults to the install anonymousId.
distinctId?: string;
Expand Down Expand Up @@ -368,6 +379,10 @@ export function trackRenderComplete(
extract_phase3_ms: props.extractPhase3Ms,
extract_cache_hits: props.extractCacheHits,
extract_cache_misses: props.extractCacheMisses,
extract_cache_publish_failures: props.extractCachePublishFailures,
extract_cache_gc_evictions: props.extractCacheGcEvictions,
extract_cache_gc_bytes_freed: props.extractCacheGcBytesFreed,
extract_cache_aged_partials_cleared: props.extractCacheAgedPartialsCleared,
},
props.distinctId,
);
Expand Down
Loading