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  }