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