add dev-only profiling with pprof, runtime/trace, and operation timing
Wire up Go's standard profiling toolkit so it's automatically available in dev builds and completely absent from production. The profiling package uses build tags (dev/!dev) to eliminate all pprof, trace, and timing code from release binaries with zero new dependencies. - backend/profiling: pprof HTTP server on :6060, /debug/trace endpoint, block/mutex profiling, and TimeOp helper for structured operation timing - scripts/profile.sh: interactive menu-driven script that auto-selects free ports (8080-8089) so multiple profiles can be open simultaneously - Instrumented key operations: app init, database init, player load/restore, queue set/restore - Makefile targets: profile, profile-cpu, profile-heap, profile-trace - .gitignore: exclude trace-*.out and *.pprof artifacts
This commit is contained in:
@@ -19,6 +19,7 @@ import (
|
||||
"yellowjacket/backend/database"
|
||||
"yellowjacket/backend/database/sql/sqlcgen"
|
||||
"yellowjacket/backend/events"
|
||||
"yellowjacket/backend/profiling"
|
||||
)
|
||||
|
||||
// RepeatMode represents the queue repeat behavior.
|
||||
@@ -611,6 +612,8 @@ func (q *Queue) handlePlayTracksNext(data ...any) {
|
||||
// resolved in the background. A generation counter ensures stale
|
||||
// background work is discarded if SetQueue is called again.
|
||||
func (q *Queue) SetQueue(filePaths []string, startIndex int) {
|
||||
defer profiling.TimeOp(q.logger, "queue.SetQueue")()
|
||||
|
||||
gen := q.setQueueGen.Add(1)
|
||||
|
||||
if startIndex < 0 || startIndex >= len(filePaths) {
|
||||
@@ -1592,6 +1595,8 @@ func (q *Queue) SaveState() {
|
||||
|
||||
// RestoreState loads the queue state from the database.
|
||||
func (q *Queue) RestoreState() {
|
||||
defer profiling.TimeOp(q.logger, "queue.RestoreState")()
|
||||
|
||||
q.mu.Lock()
|
||||
defer q.mu.Unlock()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user