mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 14:35:41 +00:00
feat(perf): add on-demand (ui) throughput to cover pipeline cpm (#947)
* feat(perf): add on-demand (ui) throughput to cover pipeline cpm Cover cpm previously measured only the native backfill (lib) via the cover:library-progress done delta. Add a parallel UI series: every completed on-demand Rust cover ensure (grid / now-playing) records a timestamp, surfaced as a covers-per-minute rate. Both are exposed in the live cover diag, shown as separate Backfill (lib) / On-demand (ui) cards in the Monitor tab (each pinnable to the overlay) and as lib/ui rows in the Cover pipeline overlay block. * docs(changelog): note cover on-demand (ui) throughput (PR #947) Add CHANGELOG entry and credits line for the UI cover cpm metric. * fix(perf): source on-demand (ui) cpm from backend produced-cover count The JS ensure-queue counter never tracked: produced covers return hit:true (only misses/errors are hit:false), and ensure-queue dedup/HMR made client counting unreliable. Count on-demand covers natively in ensure_inner on the produce path (non-bulk, past the cache-hit gate), expose a cumulative uiEnsuredTotal in the pipeline stats, and derive the per-minute rate on the frontend from polled deltas — mirroring the lib backfill series. * perf(cover): measure cpm over trailing 5s instead of full minute A 60s rolling average added too much inertia, flattening real bursts and stalls in both the lib backfill and on-demand (ui) cover throughput. Compute the rate from the trailing 5s of samples (still extrapolated to per-minute), so the figure reacts promptly and decays to 0 within the window when idle.
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
import { useEffect } from 'react';
|
||||
import { listen } from '@tauri-apps/api/event';
|
||||
import { recordCoverProgress } from '../utils/perf/coverPerfStore';
|
||||
import { coverGetPipelineQueueStats } from '../api/coverCache';
|
||||
import { recordCoverProgress, recordCoverUiTotal } from '../utils/perf/coverPerfStore';
|
||||
|
||||
/** How often to sample the backend's cumulative on-demand (UI) ensure count. */
|
||||
const UI_POLL_MS = 1000;
|
||||
|
||||
type CoverLibraryProgressPayload = {
|
||||
serverIndexKey?: string;
|
||||
@@ -37,3 +41,28 @@ export function useCoverPerfListener(active: boolean): void {
|
||||
};
|
||||
}, [active]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll the backend's cumulative on-demand (UI) ensure total so the cover store
|
||||
* can derive a per-minute rate. Mount once (always-mounted probe hook) to avoid
|
||||
* duplicate polling.
|
||||
*/
|
||||
export function useCoverUiThroughputPoll(active: boolean): void {
|
||||
useEffect(() => {
|
||||
if (!active) return;
|
||||
let cancelled = false;
|
||||
const sample = (): void => {
|
||||
void coverGetPipelineQueueStats()
|
||||
.then(stats => {
|
||||
if (!cancelled) recordCoverUiTotal(stats.uiEnsuredTotal);
|
||||
})
|
||||
.catch(() => {});
|
||||
};
|
||||
sample();
|
||||
const timer = window.setInterval(sample, UI_POLL_MS);
|
||||
return () => {
|
||||
cancelled = true;
|
||||
window.clearInterval(timer);
|
||||
};
|
||||
}, [active]);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import { acquirePerfLivePoll, patchPerfLiveAnalysis } from '../utils/perf/perfLi
|
||||
import { setPerfProbeTelemetryActive } from '../utils/perf/perfTelemetry';
|
||||
import { useAnalysisPerfLast } from '../utils/perf/analysisPerfStore';
|
||||
import { useAnalysisPerfListener } from './useAnalysisPerfListener';
|
||||
import { useCoverPerfListener } from './useCoverPerfListener';
|
||||
import { useCoverPerfListener, useCoverUiThroughputPoll } from './useCoverPerfListener';
|
||||
import {
|
||||
getPerfProbeFlags,
|
||||
subscribePerfProbeFlags,
|
||||
@@ -39,6 +39,7 @@ function useNeedCoverTelemetry(perfProbeOpen: boolean, livePins: ReadonlySet<str
|
||||
perfProbeOpen
|
||||
|| getPerfProbeFlags().showCoverPerfOverlay
|
||||
|| livePins.has('cover:cpm')
|
||||
|| livePins.has('cover:cpm:ui')
|
||||
),
|
||||
() => perfProbeOpen,
|
||||
);
|
||||
@@ -54,6 +55,7 @@ export function useSidebarPerfProbe(): Result {
|
||||
|
||||
useAnalysisPerfListener(needAnalysis);
|
||||
useCoverPerfListener(needCover);
|
||||
useCoverUiThroughputPoll(needCover);
|
||||
|
||||
useEffect(() => {
|
||||
setPerfProbeTelemetryActive(perfProbeOpen);
|
||||
|
||||
Reference in New Issue
Block a user