#!/bin/zsh
# Passive resource monitor for a running local ViewRegatta simulator.
#
# Usage:
#   ./v3/broadcast/tools/monitor_live_resources.sh <bridge-pid> [minutes] [output.csv]
#
# It observes processes only; it never starts, stops, reloads, or modifies the simulator/browser.

set -eu

bridge_pid=${1:?"Usage: monitor_live_resources.sh <bridge-pid> [minutes] [output.csv]"}
minutes=${2:-480}
output=${3:-"v3/broadcast/_sim_logs/soak/live-resource-monitor-$(date +%Y%m%dT%H%M%S).csv"}

mkdir -p "${output:h}"
print 'timestamp,bridge_rss_kb,bridge_cpu_pct,top_renderer_pid,top_renderer_rss_kb,top_renderer_cpu_pct,chrome_renderers,pages_free,compressor_pages,swapins,swapouts' > "$output"

for _ in $(seq 1 "$minutes"); do
  timestamp=$(date -Iseconds)
  bridge=$(ps -p "$bridge_pid" -o rss=,%cpu= 2>/dev/null | awk '{print $1 "," $2}')
  bridge=${bridge:-",0"}
  renderer=$(ps -Ao pid=,rss=,%cpu=,command= | awk '
    /Chrome Helper \(Renderer\)/ { if ($2 > max) { max=$2; pid=$1; cpu=$3 } }
    END { if (pid) print pid "," max "," cpu; else print ",," }
  ')
  renderer_count=$(ps -Ao command= | rg -c 'Chrome Helper \(Renderer\)' || true)
  vm=$(vm_stat)
  free=$(print -r -- "$vm" | awk '/Pages free/ {gsub("\\.", "", $3); print $3}')
  compressor=$(print -r -- "$vm" | awk '/Pages occupied by compressor/ {gsub("\\.", "", $5); print $5}')
  swapins=$(print -r -- "$vm" | awk '/Swapins/ {gsub("\\.", "", $2); print $2}')
  swapouts=$(print -r -- "$vm" | awk '/Swapouts/ {gsub("\\.", "", $2); print $2}')
  print -r -- "$timestamp,$bridge,$renderer,$renderer_count,$free,$compressor,$swapins,$swapouts" >> "$output"
  sleep 60
done
