Artist Map perf overlay: also POST timings to app.log (readable server-side)

The on-canvas overlay text can't be copied (and can't be grabbed mid-freeze), so
when perf mode is on ('d'), the frontend now also POSTs the render timings to
/api/discover/artist-map/perf ~1.5x/sec, which logs them as [ARTMAP-PERF] in
app.log. Lets the bottleneck be diagnosed from the server side with no manual
copying.
This commit is contained in:
BoulderBadgeDad 2026-06-03 07:54:32 -07:00
parent 77d6d49069
commit 884c3b5c07
2 changed files with 33 additions and 0 deletions

View file

@ -28284,6 +28284,19 @@ def get_artist_map_explore():
return _artists_map_get_artist_map_explore()
@app.route('/api/discover/artist-map/perf', methods=['POST'])
def log_artist_map_perf():
"""Debug sink: the artist-map frontend POSTs its render timings here (toggled
with 'd' on the map) so they land in app.log the on-canvas overlay text
can't be copied. Used to find the real drag/zoom bottleneck."""
try:
data = request.get_json(silent=True) or {}
logger.info("[ARTMAP-PERF] %s", json.dumps(data, ensure_ascii=False))
except Exception:
pass
return ('', 204)
@app.route('/api/discover/build-playlist/search-artists', methods=['GET'])
def search_artists_for_playlist():
"""Search for artists to use as seeds for custom playlist building"""

View file

@ -5720,6 +5720,26 @@ function _artMapDrawPerf(ctx, t0) {
_artMap._lastPerfTs = now;
const fps = dt > 0 ? Math.round(1000 / dt) : 0;
const oc = _artMap.offscreen;
// Ship the numbers to app.log (~1.5/s) so they can be read server-side —
// the on-canvas text below can't be copied, especially mid-lag.
if (!_artMap._perfPostTs || now - _artMap._perfPostTs > 700) {
_artMap._perfPostTs = now;
try {
fetch('/api/discover/artist-map/perf', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
nodes: _artMap.placed.length, edges: (_artMap.edges || []).length,
buffer: oc ? oc.width + 'x' + oc.height : '-',
scale: +(_artMap._bufferScale || 0).toFixed(3),
zoom: +_artMap.zoom.toFixed(3),
rebuildMs: +(_artMap._rebuildMs || 0).toFixed(1),
drawMs: +drawMs.toFixed(1), fps,
}),
}).catch(() => { });
} catch (e) { /* ignore */ }
}
const lines = [
`nodes ${_artMap.placed.length} edges ${(_artMap.edges || []).length}`,
`buffer ${oc ? oc.width + '×' + oc.height : '—'} scale ${(_artMap._bufferScale || 0).toFixed(3)}`,