blob: f401b2ab55d5583c420de5fb3feb23f550274111 [file] [log] [blame]
LaMont Jones54b01cd2024-10-23 13:59:40 -07001// Copyright 2024 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14package metrics
15
16// The hostinfo* files contain code to extract host information from
17// /proc/cpuinfo and /proc/meminfo relevant to machine performance
18
19import (
20 "strconv"
21 "strings"
22)
23
24// CpuInfo holds information regarding the host's CPU cores.
25type CpuInfo struct {
26 // The vendor id
27 VendorId string
28
29 // The model name
30 ModelName string
31
32 // The number of CPU cores
33 CpuCores int32
34
35 // The CPU flags
36 Flags string
37}
38
39// MemInfo holds information regarding the host's memory.
40// The memory size in each of the field is in bytes.
41type MemInfo struct {
42 // The total memory.
43 MemTotal uint64
44
45 // The amount of free memory.
46 MemFree uint64
47
48 // The amount of available memory.
49 MemAvailable uint64
50}
51
52// fillCpuInfo takes the key and value, converts the value
53// to the proper size unit and is stores it in CpuInfo.
54func (c *CpuInfo) fillInfo(key, value string) {
55 switch key {
56 case "vendor_id":
57 c.VendorId = value
58 case "model name":
59 c.ModelName = value
60 case "cpu cores":
61 v, err := strconv.ParseInt(value, 10, 32)
62 if err == nil {
63 c.CpuCores = int32(v)
64 }
65 case "flags":
66 c.Flags = value
67 default:
68 // Ignore unknown keys
69 }
70}
71
72// fillCpuInfo takes the key and value, converts the value
73// to the proper size unit and is stores it in CpuInfo.
74func (m *MemInfo) fillInfo(key, value string) {
75 v := strToUint64(value)
76 switch key {
77 case "MemTotal":
78 m.MemTotal = v
79 case "MemFree":
80 m.MemFree = v
81 case "MemAvailable":
82 m.MemAvailable = v
83 default:
84 // Ignore unknown keys
85 }
86}
87
88// strToUint64 takes the string and converts to unsigned 64-bit integer.
89// If the string contains a memory unit such as kB and is converted to
90// bytes.
91func strToUint64(v string) uint64 {
92 // v could be "1024 kB" so scan for the empty space and
93 // split between the value and the unit.
94 var separatorIndex int
95 if separatorIndex = strings.IndexAny(v, " "); separatorIndex < 0 {
96 separatorIndex = len(v)
97 }
98 value, err := strconv.ParseUint(v[:separatorIndex], 10, 64)
99 if err != nil {
100 return 0
101 }
102
103 var scale uint64 = 1
104 switch strings.TrimSpace(v[separatorIndex:]) {
105 case "kB", "KB":
106 scale = 1024
107 case "mB", "MB":
108 scale = 1024 * 1024
109 }
110 return value * scale
111}