Skip to content

Commit c816a11

Browse files
committed
feat: json output
1 parent bfde9a1 commit c816a11

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ vmrss -m -cpu -peak firefox
4545
-peak Show peak memory usage
4646
-swap Show swap memory
4747
-io Show disk I/O rates (KB/s)
48+
-format Output format (json)
4849
```
4950

5051
## Examples
@@ -61,4 +62,7 @@ vmrss -m -t 10s -cpu -peak discord
6162

6263
# Show disk I/O rates
6364
vmrss -m -io firefox
65+
66+
# JSON output
67+
vmrss -format json firefox
6468
```

main.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"bufio"
5+
"encoding/json"
56
"flag"
67
"fmt"
78
"os"
@@ -20,6 +21,7 @@ var (
2021
flagCPU = flag.Bool("cpu", false, "Show CPU usage")
2122
flagPeak = flag.Bool("peak", false, "Show peak memory usage")
2223
flagIO = flag.Bool("io", false, "Show disk I/O rates")
24+
flagFormat = flag.String("format", "", "Output format (json)")
2325
)
2426

2527
func main() {
@@ -84,6 +86,70 @@ func main() {
8486
}
8587

8688
func displayProcesses(pids []int, peakMemory, peakTotal map[int]float64, lastIO map[int][2]float64, elapsed float64) {
89+
if *flagFormat == "json" {
90+
var result []map[string]any
91+
for _, pid := range pids {
92+
processes := getVmrss(pid, peakMemory, lastIO, elapsed)
93+
if len(processes) == 0 {
94+
continue
95+
}
96+
currentTotal := getVmrssTotal(processes)
97+
if currentTotal > peakTotal[pid] {
98+
peakTotal[pid] = currentTotal
99+
}
100+
101+
var procs []map[string]any
102+
for _, p := range processes {
103+
if *flagChild || p.Pid == pid {
104+
proc := map[string]any{"pid": p.Pid, "name": p.Name, "memory_mb": p.Mem}
105+
if *flagPeak && p.PeakMem > 0 {
106+
proc["peak_memory_mb"] = p.PeakMem
107+
}
108+
if *flagCPU {
109+
proc["cpu_percent"] = p.CPU
110+
}
111+
if *flagIO {
112+
if *flagMonitor {
113+
proc["read_kb_per_sec"] = p.ReadRate
114+
proc["write_kb_per_sec"] = p.WriteRate
115+
} else {
116+
proc["read_mb"] = p.ReadRate / 1024
117+
proc["write_mb"] = p.WriteRate / 1024
118+
}
119+
}
120+
if *flagSwap {
121+
proc["swap_mb"] = p.Swap
122+
}
123+
procs = append(procs, proc)
124+
}
125+
}
126+
127+
entry := map[string]any{"main_pid": pid, "processes": procs, "total_memory_mb": currentTotal}
128+
if *flagPeak && peakTotal[pid] > 0 {
129+
entry["peak_total_mb"] = peakTotal[pid]
130+
}
131+
if *flagCPU {
132+
entry["total_cpu_percent"] = getVmrssCPUTotal(processes)
133+
}
134+
if *flagIO {
135+
totalRead, totalWrite := getVmrssIOTotal(processes)
136+
if *flagMonitor {
137+
entry["total_read_kb_per_sec"] = totalRead
138+
entry["total_write_kb_per_sec"] = totalWrite
139+
} else {
140+
entry["total_read_mb"] = totalRead / 1024
141+
entry["total_write_mb"] = totalWrite / 1024
142+
}
143+
}
144+
if *flagSwap {
145+
entry["total_swap_mb"] = getVmrssSwapTotal(processes)
146+
}
147+
result = append(result, entry)
148+
}
149+
json.NewEncoder(os.Stdout).Encode(result)
150+
return
151+
}
152+
87153
for i, pid := range pids {
88154
if i > 0 {
89155
fmt.Println()

0 commit comments

Comments
 (0)