pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/system/info_loadavg_darwin.go (about) 1 package system 2 3 // ////////////////////////////////////////////////////////////////////////////////// // 4 // // 5 // Copyright (c) 2022 ESSENTIAL KAOS // 6 // Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0> // 7 // // 8 // ////////////////////////////////////////////////////////////////////////////////// // 9 10 import ( 11 "errors" 12 "os/exec" 13 "strings" 14 "unsafe" 15 16 "golang.org/x/sys/unix" 17 ) 18 19 // ////////////////////////////////////////////////////////////////////////////////// // 20 21 // GetLA returns loadavg 22 // 23 // Implementation borrowed from https://github.com/prometheus/node_exporter/blob/master/collector/loadavg_bsd.go 24 func GetLA() (*LoadAvg, error) { 25 type loadavg struct { 26 load [3]uint32 27 scale int 28 } 29 30 b, err := unix.SysctlRaw("vm.loadavg") 31 32 if err != nil { 33 return nil, err 34 } 35 36 rproc, tproc, err := getProcStats() 37 38 if err != nil { 39 return nil, err 40 } 41 42 load := *(*loadavg)(unsafe.Pointer((&b[0]))) 43 scale := float64(load.scale) 44 45 return &LoadAvg{ 46 Min1: float64(load.load[0]) / scale, 47 Min5: float64(load.load[1]) / scale, 48 Min15: float64(load.load[2]) / scale, 49 RProc: rproc, 50 TProc: tproc, 51 }, nil 52 } 53 54 // ////////////////////////////////////////////////////////////////////////////////// // 55 56 func getProcStats() (int, int, error) { 57 cmd := exec.Command("ps", "axo", "state") 58 output, err := cmd.Output() 59 60 if err != nil { 61 return 0, 0, errors.New("Can't run ps command for collecting information about processes") 62 } 63 64 outputStr := string(output) 65 rproc := strings.Count(outputStr, "R") 66 tproc := strings.Count(outputStr, "\n") 67 68 return rproc, tproc, nil 69 }