Skip to content

Commit ad47dc3

Browse files
committed
Go sources update
With latest changes from Lean Agent
1 parent 9158290 commit ad47dc3

File tree

14 files changed

+1211
-133
lines changed

14 files changed

+1211
-133
lines changed

go_bindings/gotoc/cpu.go

Lines changed: 120 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,134 @@ package gotoc
22

33

44
import (
5-
6-
5+
"github.com/vmware/leap/util"
76
"unsafe"
7+
"fmt"
8+
"time"
9+
"strconv"
810
)
911

1012

1113
//#include "../../../../../Include/sigar.h"
14+
//#include "../../../../../Include/sigar_format.h"
1215
import "C"
1316

14-
15-
16-
17+
var _prevCpuUsage C.sigar_cpu_t //usged for percentage calculation
18+
var prevSampleTs int64
19+
20+
type CpuUsageInfo struct {
21+
User uint64
22+
Sys uint64
23+
Nice uint64
24+
Idle uint64
25+
Wait uint64
26+
Irq uint64
27+
SoftIrq uint64
28+
Stolen uint64
29+
Total uint64
30+
}
31+
32+
type CpuPctUsageInfo struct {
33+
User float64
34+
Sys float64
35+
Nice float64
36+
Idle float64
37+
Wait float64
38+
Irq float64
39+
SoftIrq float64
40+
Stolen float64
41+
Combined float64
42+
}
43+
func (this *CpuPctUsageInfo) String() string {
44+
return "CPU states: "+
45+
strconv.FormatFloat(this.User,'f', 1, 64)+"% user, "+
46+
strconv.FormatFloat(this.Sys,'f', 1, 64)+"% system, "+
47+
strconv.FormatFloat(this.Nice,'f', 1, 64)+"% nice, "+
48+
strconv.FormatFloat(this.Wait,'f', 1, 64) +"% wait, "+
49+
strconv.FormatFloat(this.Idle,'f', 1, 64)+"% idle"
50+
}
51+
52+
//------------------------------------------------------------------------------------------------------------------------------------------------
53+
// CpuPctUsageInfo (Float64) CpuPctUsageInfo (Float64) CpuPctUsageInfo (Float64) CpuPctUsageInfo (Float64) CpuPctUsageInfo (Float64)
54+
//------------------------------------------------------------------------------------------------------------------------------------------------
55+
func GetCpuPctUsageInfo() (result *CpuPctUsageInfo, err error) {
56+
defer util.Panic2Error(&err)
57+
58+
sigar := GetSigarHandle()
59+
cur_c_cpu_t, err := _getCpu(sigar)
60+
if err != nil {
61+
return nil,err
62+
}
63+
64+
if prevSampleTs == 0 {
65+
66+
_prevCpuUsage = *cur_c_cpu_t
67+
time.Sleep(500*time.Millisecond)
68+
69+
cur_c_cpu_t, err = _getCpu(sigar)
70+
if err != nil {
71+
return nil,err
72+
}
73+
}
74+
75+
var c_pct_cpu_t C.sigar_cpu_perc_t
76+
C.sigar_cpu_perc_calculate(&_prevCpuUsage, cur_c_cpu_t, &c_pct_cpu_t)
77+
_prevCpuUsage = *cur_c_cpu_t
78+
prevSampleTs = util.NowEpoch()
79+
80+
return &CpuPctUsageInfo{
81+
User : float64(c_pct_cpu_t.user),
82+
Sys : float64(c_pct_cpu_t.sys),
83+
Nice : float64(c_pct_cpu_t.nice),
84+
Idle : float64(c_pct_cpu_t.idle),
85+
Wait : float64(c_pct_cpu_t.wait),
86+
Irq : float64(c_pct_cpu_t.irq),
87+
SoftIrq : float64(c_pct_cpu_t.soft_irq),
88+
Stolen : float64(c_pct_cpu_t.stolen),
89+
Combined : float64(c_pct_cpu_t.combined),
90+
},nil
1791

92+
}
93+
94+
//------------------------------------------------------------------------------------------------------------------------------------------------
95+
//CpuUsageInfo (uint64) CpuUsageInfo (uint64) CpuUsageInfo (uint64) CpuUsageInfo (uint64) CpuUsageInfo (uint64) CpuUsageInfo (uint64)
96+
//------------------------------------------------------------------------------------------------------------------------------------------------
97+
func GetCpuUsageInfo() (result *CpuUsageInfo, err error) {
98+
defer util.Panic2Error(&err)
99+
100+
c_cpu_t, err := _getCpu(GetSigarHandle())
101+
if err != nil {
102+
return nil,err
103+
}
104+
105+
return &CpuUsageInfo{
106+
User : uint64(c_cpu_t.user),
107+
Sys : uint64(c_cpu_t.sys),
108+
Nice : uint64(c_cpu_t.nice),
109+
Idle : uint64(c_cpu_t.idle),
110+
Wait : uint64(c_cpu_t.wait),
111+
Irq : uint64(c_cpu_t.irq),
112+
SoftIrq : uint64(c_cpu_t.soft_irq),
113+
Stolen : uint64(c_cpu_t.stolen),
114+
Total : uint64(c_cpu_t.total),
115+
},nil
116+
}
117+
118+
//------------------------------------------------------------------------------------------------------------------------------------------------
119+
//Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers Helpers
120+
//------------------------------------------------------------------------------------------------------------------------------------------------
121+
func _getCpu(sigar *C.sigar_t) (*C.sigar_cpu_t, error) {
122+
123+
var c_cpu_t C.sigar_cpu_t
124+
if status := int(C.sigar_cpu_get(sigar, &c_cpu_t)) ; status != SIGAR_OK {
125+
return nil,fmt.Errorf("Failed to retrieve cpu usage info with error: %v", status)
126+
}
127+
128+
return &c_cpu_t,nil
129+
}
130+
//------------------------------------------------------------------------------------------------------------------------------------------------
131+
//List List List List List List List List List List List List List List List List List List List List List List List List List List List List
132+
//------------------------------------------------------------------------------------------------------------------------------------------------
18133

19134
func Cpu() (C.sigar_cpu_list_t,[]C.sigar_cpu_t){
20135

go_bindings/gotoc/fileInfo.go

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package gotoc
22

33

44
import (
5-
6-
5+
"fmt"
76
"unsafe"
7+
"strconv"
88
)
99
/*
1010
#include "../../../../../Include/sigar.h"
@@ -15,30 +15,77 @@ import (
1515
import "C"
1616

1717

18-
func FileInfo() []C.sigar_file_system_t{
18+
const (
19+
FSTYPE_UNKNOWN = iota
20+
FSTYPE_NONE
21+
FSTYPE_LOCAL_DISK
22+
FSTYPE_NETWORK
23+
FSTYPE_RAM_DISK
24+
FSTYPE_CDROM
25+
FSTYPE_SWAP
26+
FSTYPE_MAX
27+
)
28+
29+
30+
type FsInfo struct {
31+
DirName string
32+
DevName string
33+
TypeName string
34+
SysTypeName string
35+
Options string
36+
Type int
37+
Flags uint64
38+
}
39+
func (this *FsInfo) String() string {
40+
return fmt.Sprintf("{Dirname: %v, DevName: %v, TypeName: %v, SysTypeName: %v, Options: %v, Type: %v, Flags:%v",
41+
this.DirName,
42+
this.DevName,
43+
this.TypeName,
44+
this.SysTypeName,
45+
this.Options,
46+
this.Type,
47+
this.Flags,
48+
)
49+
}
1950

51+
func GetFsInfo() (result []*FsInfo, err error){
52+
defer func() {
53+
if r := recover() ; r != nil{
54+
err = fmt.Errorf("Failed to discover file systems due to: " + err.Error())
55+
}
56+
}()
2057
var sigar *C.sigar_t=GetSigarHandle()
2158
var fileSystemList C.sigar_file_system_list_t
22-
//C.fileInfo(sigar,&fileSystemList)
2359
C.sigar_file_system_list_get(sigar, &fileSystemList);
60+
defer C.sigar_file_system_list_destroy(sigar, &fileSystemList);
2461

2562
var length int=int(fileSystemList.number)
2663

27-
2864
cFs:=GetGoSlice(length, unsafe.Pointer(fileSystemList.data))
2965

3066
var goFs []C.sigar_file_system_t
3167
goFs = *(*[]C.sigar_file_system_t)(unsafe.Pointer(&cFs))
32-
33-
//fmt.Printf("%v\n", C.GoString(&goFs[1].dir_name[0]))
34-
C.sigar_file_system_list_destroy(sigar, &fileSystemList);
3568

36-
return goFs
37-
38-
69+
result = make([]*FsInfo, length)
70+
for i,fs := range goFs {
71+
fsType,err := strconv.Atoi(fmt.Sprintf("%v", fs._type))
72+
if err != nil {
73+
fsType = FSTYPE_UNKNOWN
74+
}
75+
result[i] = &FsInfo{
76+
DirName : C.GoString(&fs.dir_name[0]),
77+
DevName : C.GoString(&fs.dev_name[0]),
78+
TypeName : C.GoString(&fs.type_name[0]),
79+
SysTypeName : C.GoString(&fs.sys_type_name[0]),
80+
Options : C.GoString(&fs.options[0]),
81+
Type : fsType,
82+
Flags : uint64(fs.flags),
83+
}
84+
}
85+
86+
return result,nil
3987

4088
}
41-
4289

4390

4491

go_bindings/gotoc/fsusage.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package gotoc
2+
3+
4+
import (
5+
"fmt"
6+
"unsafe"
7+
)
8+
/*
9+
#include <stdlib.h>
10+
#include "../../../../../Include/sigar.h"
11+
*/
12+
import "C"
13+
14+
type sigar_file_system_usage_t struct {
15+
UsedPct float64
16+
Total int64
17+
Free int64
18+
Used int64
19+
Avail int64
20+
Files int64
21+
FreeFiles int64
22+
}
23+
24+
type FsUsage struct {
25+
UsedPct float64
26+
Total int64
27+
Free int64
28+
Used int64
29+
Avail int64
30+
Files int64
31+
FreeFiles int64
32+
}
33+
34+
func (this *FsUsage) String() string { return fmt.Sprintf("used: %v, total: %v, free: %v, used: %v, avail: %v, files: %v, freeFiles: %v", this.UsedPct, this.Total, this.Free, this.Used, this.Avail, this.Files, this.FreeFiles) }
35+
36+
type DiskUsage struct {
37+
Reads int64
38+
Writes int64
39+
WriteBytes int64
40+
ReadBytes int64
41+
Rtime int64
42+
Wtime int64
43+
Qtime int64
44+
Time int64
45+
SnapTime int64
46+
ServiceTime float64
47+
Queue float64
48+
}
49+
50+
type FsUsageInfo struct {
51+
Fs *FsUsage
52+
Disk *DiskUsage
53+
}
54+
55+
func GetFsUsageInfo(dirName string, diskName string)(fsUsageInfo *FsUsageInfo,err error){
56+
57+
var sigar *C.sigar_t=GetSigarHandle()
58+
//TODO: noticed that sigar_file_system_usage_t contains a sigar_disk_usage_t member, should there be two invocations?
59+
fsUsage, err := _getFsUsage(dirName, sigar)
60+
if err != nil {
61+
return nil, err
62+
}
63+
64+
diskUsage, err := _getDiskUsage(diskName, sigar) ;
65+
if err != nil {
66+
return nil,err
67+
}
68+
69+
70+
return &FsUsageInfo {fsUsage, diskUsage}, err
71+
}
72+
73+
74+
func GetFsUsage(dirName string) (*FsUsage, error) {
75+
return _getFsUsage(dirName, GetSigarHandle())
76+
}
77+
78+
func _getFsUsage(dirName string, sigar *C.sigar_t) (out *FsUsage, err error) {
79+
var fsusage C.sigar_file_system_usage_t
80+
81+
dir:=C.CString(dirName)
82+
83+
C.free(unsafe.Pointer(dir))
84+
85+
C.sigar_file_system_usage_get(sigar , dir, &fsusage)
86+
87+
out = &FsUsage{
88+
float64(fsusage.use_percent),
89+
int64(fsusage.total),
90+
int64(fsusage.free),
91+
int64(fsusage.used),
92+
int64(fsusage.avail),
93+
int64(fsusage.files),
94+
int64(fsusage.free_files),
95+
}
96+
97+
return out,nil
98+
}
99+
100+
func GetDiskUsage(diskName string) (*DiskUsage, error) {
101+
return _getDiskUsage(diskName, GetSigarHandle())
102+
}
103+
104+
func _getDiskUsage(diskName string, sigar *C.sigar_t) (*DiskUsage, error) {
105+
var diskusage C.sigar_disk_usage_t
106+
disk:=C.CString(diskName)
107+
defer C.free(unsafe.Pointer(disk))
108+
C.sigar_disk_usage_get(sigar , disk, &diskusage)
109+
return &DiskUsage {
110+
int64(diskusage.reads),
111+
int64(diskusage.writes),
112+
int64(diskusage.write_bytes),
113+
int64(diskusage.read_bytes),
114+
int64(diskusage.rtime),
115+
int64(diskusage.wtime),
116+
int64(diskusage.qtime),
117+
int64(diskusage.time),
118+
int64(diskusage.snaptime),
119+
float64(diskusage.service_time),
120+
float64(diskusage.queue),
121+
},nil
122+
}

go_bindings/gotoc/handle.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,19 @@ func GetGoSlice(number int, pointer unsafe.Pointer ) reflect.SliceHeader{
4848
Len: length,
4949
Cap: length,
5050
}
51-
52-
53-
5451

5552
return cObj
53+
}
54+
55+
56+
func CArr2SlicePtr(length int, cArray interface{}) unsafe.Pointer{
5657

58+
vl := reflect.ValueOf(cArray)
59+
header := reflect.SliceHeader{
60+
Data: uintptr(unsafe.Pointer(vl.Pointer())),
61+
Len: length,
62+
Cap: length,
63+
}
5764

65+
return unsafe.Pointer(&header)
5866
}

0 commit comments

Comments
 (0)