@@ -1065,7 +1065,19 @@ func collectMetrics(done chan struct{}, cpumetricsChan chan CPUMetrics, gpumetri
10651065 if err := cmd .Start (); err != nil {
10661066 log .Fatal (err )
10671067 }
1068- scanner := bufio .NewScanner (stdout )
1068+
1069+ defer func () {
1070+ if err := cmd .Process .Kill (); err != nil {
1071+ stderrLogger .Fatalf ("ERROR: Failed to kill powermetrics: %v" , err )
1072+ }
1073+ }()
1074+
1075+ // Create buffered reader with larger buffer
1076+ reader := bufio .NewReaderSize (stdout , 1024 * 1024 ) // 1MB buffer
1077+
1078+ scanner := bufio .NewScanner (reader )
1079+ scanner .Buffer (make ([]byte , 1024 * 1024 ), 1024 * 1024 ) // 1MB buffer
1080+
10691081 scanner .Split (func (data []byte , atEOF bool ) (advance int , token []byte , err error ) {
10701082 if atEOF && len (data ) == 0 {
10711083 return 0 , nil , nil
@@ -1080,27 +1092,36 @@ func collectMetrics(done chan struct{}, cpumetricsChan chan CPUMetrics, gpumetri
10801092 }
10811093 }
10821094 if atEOF {
1095+ if start >= 0 {
1096+ return len (data ), data [start :], nil
1097+ }
10831098 return len (data ), nil , nil
10841099 }
10851100 return 0 , nil , nil
10861101 })
1102+ retryCount := 0
1103+ maxRetries := 3
10871104 for scanner .Scan () {
1088- plistData := scanner .Text ()
1089- if ! strings .Contains (plistData , "<?xml" ) || ! strings .Contains (plistData , "</plist>" ) {
1090- continue
1091- }
1092- var data map [string ]interface {}
1093- err := plist .NewDecoder (strings .NewReader (plistData )).Decode (& data )
1094- if err != nil {
1095- log .Printf ("Error decoding plist: %v" , err )
1096- continue
1097- }
10981105 select {
10991106 case <- done :
1100- cmd .Process .Kill ()
11011107 return
11021108 default :
1103- // Send all metrics at once
1109+ plistData := scanner .Text ()
1110+ if ! strings .Contains (plistData , "<?xml" ) || ! strings .Contains (plistData , "</plist>" ) {
1111+ retryCount ++
1112+ if retryCount >= maxRetries {
1113+ retryCount = 0
1114+ continue
1115+ }
1116+ continue
1117+ }
1118+ retryCount = 0 // Reset retry counter on successful parse
1119+ var data map [string ]interface {}
1120+ err := plist .NewDecoder (strings .NewReader (plistData )).Decode (& data )
1121+ if err != nil {
1122+ log .Printf ("Error decoding plist: %v" , err )
1123+ continue
1124+ }
11041125 cpuMetrics := parseCPUMetrics (data , NewCPUMetrics ())
11051126 gpuMetrics := parseGPUMetrics (data )
11061127 netdiskMetrics := parseNetDiskMetrics (data )
0 commit comments