@@ -2,19 +2,134 @@ package gotoc
2
2
3
3
4
4
import (
5
-
6
-
5
+ "github.com/vmware/leap/util"
7
6
"unsafe"
7
+ "fmt"
8
+ "time"
9
+ "strconv"
8
10
)
9
11
10
12
11
13
//#include "../../../../../Include/sigar.h"
14
+ //#include "../../../../../Include/sigar_format.h"
12
15
import "C"
13
16
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
17
91
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
+ //------------------------------------------------------------------------------------------------------------------------------------------------
18
133
19
134
func Cpu () (C.sigar_cpu_list_t ,[]C.sigar_cpu_t ){
20
135
0 commit comments