feat(perf): cover pipeline throughput (cpm) in performance probe (#945)

* feat(perf): cover pipeline throughput (cpm) in performance probe

Mirror the analysis pipeline's tpm for covers. A new coverPerfStore samples the
backfill `done` progress from cover:library-progress events and derives a rolling
one-minute covers-per-minute rate. Surfaced as a live diag in perfLiveStore, a
pinnable "Cover backfill" throughput card in the Monitor tab, and a cpm row in
the Cover pipeline overlay block.

* docs(changelog): note cover pipeline cpm metric (PR #945)

Add CHANGELOG entry and credits line for the cover-pipeline covers-per-minute
throughput metric in the Performance Probe.
This commit is contained in:
cucadmuh
2026-06-02 11:05:28 +03:00
committed by GitHub
parent 42aec6720c
commit c6df05e576
11 changed files with 279 additions and 4 deletions
+51
View File
@@ -0,0 +1,51 @@
import { describe, expect, it, beforeEach, vi, afterEach } from 'vitest';
import {
getCoverCachedPerMinute,
getCoverPerfState,
recordCoverProgress,
resetCoverPerfStateForTest,
} from './coverPerfStore';
beforeEach(() => {
resetCoverPerfStateForTest();
});
afterEach(() => {
vi.useRealTimers();
});
describe('coverPerfStore', () => {
it('derives covers-per-minute from done deltas over time', () => {
vi.useFakeTimers();
vi.setSystemTime(1_000_000);
recordCoverProgress({ done: 100, total: 1000, pending: 900 });
vi.advanceTimersByTime(30_000);
recordCoverProgress({ done: 130, total: 1000, pending: 870 });
// +30 covers over 30s ≈ 60 cpm.
expect(getCoverCachedPerMinute()).toBeCloseTo(60, 0);
expect(getCoverPerfState().done).toBe(130);
});
it('returns 0 with a single sample and prunes the window after a minute', () => {
vi.useFakeTimers();
vi.setSystemTime(2_000_000);
recordCoverProgress({ done: 10 });
expect(getCoverCachedPerMinute()).toBe(0);
vi.advanceTimersByTime(20_000);
recordCoverProgress({ done: 20 });
expect(getCoverCachedPerMinute()).toBeGreaterThan(0);
vi.advanceTimersByTime(61_000);
expect(getCoverCachedPerMinute()).toBe(0);
});
it('resets the window on a backwards jump (server switch / cache clear)', () => {
vi.useFakeTimers();
vi.setSystemTime(3_000_000);
recordCoverProgress({ done: 500 });
vi.advanceTimersByTime(5_000);
recordCoverProgress({ done: 5 });
// Only the new baseline remains → no rate yet.
expect(getCoverCachedPerMinute()).toBe(0);
expect(getCoverPerfState().done).toBe(5);
});
});