1
1
package clistat
2
2
3
3
import (
4
- "fmt"
5
4
"math"
6
5
"runtime"
7
6
"strconv"
8
7
"strings"
9
8
"time"
10
9
11
- "github.com/dustin/go-humanize"
12
10
"github.com/elastic/go-sysinfo"
13
11
"github.com/spf13/afero"
14
12
"golang.org/x/xerrors"
@@ -17,15 +15,65 @@ import (
17
15
sysinfotypes "github.com/elastic/go-sysinfo/types"
18
16
)
19
17
18
+ // Prefix is a scale multiplier for a result.
19
+ // Used when creating a human-readable representation.
20
+ type Prefix float64
21
+
22
+ const (
23
+ PrefixDefault = 1.0
24
+ PrefixKibi = 1024.0
25
+ PrefixMebi = PrefixKibi * 1024.0
26
+ PrefixGibi = PrefixMebi * 1024.0
27
+ PrefixTebi = PrefixGibi * 1024.0
28
+ )
29
+
30
+ var (
31
+ PrefixHumanKibi = "Ki"
32
+ PrefixHumanMebi = "Mi"
33
+ PrefixHumanGibi = "Gi"
34
+ PrefixHumanTebi = "Ti"
35
+ )
36
+
37
+ func (s * Prefix ) String () string {
38
+ switch * s {
39
+ case PrefixKibi :
40
+ return "Ki"
41
+ case PrefixMebi :
42
+ return "Mi"
43
+ case PrefixGibi :
44
+ return "Gi"
45
+ case PrefixTebi :
46
+ return "Ti"
47
+ default :
48
+ return ""
49
+ }
50
+ }
51
+
52
+ func ParsePrefix (s string ) Prefix {
53
+ switch s {
54
+ case PrefixHumanKibi :
55
+ return PrefixKibi
56
+ case PrefixHumanMebi :
57
+ return PrefixMebi
58
+ case PrefixHumanGibi :
59
+ return PrefixGibi
60
+ case PrefixHumanTebi :
61
+ return PrefixTebi
62
+ default :
63
+ return PrefixDefault
64
+ }
65
+ }
66
+
20
67
// Result is a generic result type for a statistic.
21
68
// Total is the total amount of the resource available.
22
69
// It is nil if the resource is not a finite quantity.
23
70
// Unit is the unit of the resource.
24
71
// Used is the amount of the resource used.
25
72
type Result struct {
26
- Total * float64 `json:"total"`
27
- Unit string `json:"unit"`
28
- Used float64 `json:"used"`
73
+ Total * float64 `json:"total"`
74
+ Unit string `json:"unit"`
75
+ Used float64 `json:"used"`
76
+ Prefix Prefix `json:"-"`
29
77
}
30
78
31
79
// String returns a human-readable representation of the result.
@@ -34,38 +82,29 @@ func (r *Result) String() string {
34
82
return "-"
35
83
}
36
84
37
- var usedDisplay , totalDisplay string
38
- var usedScaled , totalScaled float64
39
- var usedPrefix , totalPrefix string
40
- usedScaled , usedPrefix = humanize .ComputeSI (r .Used )
41
- usedDisplay = humanizeFloat (usedScaled )
42
- if r .Total != (* float64 )(nil ) {
43
- totalScaled , totalPrefix = humanize .ComputeSI (* r .Total )
44
- totalDisplay = humanizeFloat (totalScaled )
85
+ scale := 1.0
86
+ if r .Prefix != 0.0 {
87
+ scale = float64 (r .Prefix )
45
88
}
46
89
47
90
var sb strings.Builder
48
- _ , _ = sb .WriteString (usedDisplay )
49
-
50
- // If the unit prefixes of the used and total values are different,
51
- // display the used value's prefix to avoid confusion.
52
- if usedPrefix != totalPrefix || totalDisplay == "" {
53
- _ , _ = sb .WriteString (" " )
54
- _ , _ = sb .WriteString (usedPrefix )
55
- _ , _ = sb .WriteString (r .Unit )
56
- }
57
-
58
- if totalDisplay != "" {
91
+ var usedScaled , totalScaled float64
92
+ usedScaled = r .Used / scale
93
+ _ , _ = sb .WriteString (humanizeFloat (usedScaled ))
94
+ if r .Total != (* float64 )(nil ) {
59
95
_ , _ = sb .WriteString ("/" )
60
- _ , _ = sb .WriteString (totalDisplay )
61
- _ , _ = sb .WriteString (" " )
62
- _ , _ = sb .WriteString (totalPrefix )
63
- _ , _ = sb .WriteString (r .Unit )
96
+ totalScaled = * r .Total / scale
97
+ _ , _ = sb .WriteString (humanizeFloat (totalScaled ))
64
98
}
65
99
66
- if r .Total != nil && * r .Total != 0.0 {
100
+ _ , _ = sb .WriteString (" " )
101
+ _ , _ = sb .WriteString (r .Prefix .String ())
102
+ _ , _ = sb .WriteString (r .Unit )
103
+
104
+ if r .Total != (* float64 )(nil ) && * r .Total > 0 {
67
105
_ , _ = sb .WriteString (" (" )
68
- _ , _ = sb .WriteString (fmt .Sprintf ("%.0f" , r .Used / (* r .Total )* 100.0 ))
106
+ pct := r .Used / * r .Total * 100.0
107
+ _ , _ = sb .WriteString (strconv .FormatFloat (pct , 'f' , 0 , 64 ))
69
108
_ , _ = sb .WriteString ("%)" )
70
109
}
71
110
@@ -153,8 +192,9 @@ func New(opts ...Option) (*Statter, error) {
153
192
// Units are in "cores".
154
193
func (s * Statter ) HostCPU () (* Result , error ) {
155
194
r := & Result {
156
- Unit : "cores" ,
157
- Total : ptr .To (float64 (s .nproc )),
195
+ Unit : "cores" ,
196
+ Total : ptr .To (float64 (s .nproc )),
197
+ Prefix : PrefixDefault ,
158
198
}
159
199
c1 , err := s .hi .CPUTime ()
160
200
if err != nil {
@@ -177,9 +217,10 @@ func (s *Statter) HostCPU() (*Result, error) {
177
217
}
178
218
179
219
// HostMemory returns the memory usage of the host, in gigabytes.
180
- func (s * Statter ) HostMemory () (* Result , error ) {
220
+ func (s * Statter ) HostMemory (p Prefix ) (* Result , error ) {
181
221
r := & Result {
182
- Unit : "B" ,
222
+ Unit : "B" ,
223
+ Prefix : p ,
183
224
}
184
225
hm , err := s .hi .Memory ()
185
226
if err != nil {
0 commit comments