@@ -2,6 +2,7 @@ package main
22
33import (
44 "bufio"
5+ "encoding/json"
56 "flag"
67 "fmt"
78 "os"
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
2527func main () {
@@ -84,6 +86,70 @@ func main() {
8486}
8587
8688func 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