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