Skip to content

Commit aec49d8

Browse files
Fix for M2 Ultra collectMetrics not working
1 parent 0dd077b commit aec49d8

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

main.go

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)