| // Copyright 2024 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| package metrics |
| |
| // The hostinfo* files contain code to extract host information from |
| // /proc/cpuinfo and /proc/meminfo relevant to machine performance |
| |
| import ( |
| "strconv" |
| "strings" |
| ) |
| |
| // CpuInfo holds information regarding the host's CPU cores. |
| type CpuInfo struct { |
| // The vendor id |
| VendorId string |
| |
| // The model name |
| ModelName string |
| |
| // The number of CPU cores |
| CpuCores int32 |
| |
| // The CPU flags |
| Flags string |
| } |
| |
| // MemInfo holds information regarding the host's memory. |
| // The memory size in each of the field is in bytes. |
| type MemInfo struct { |
| // The total memory. |
| MemTotal uint64 |
| |
| // The amount of free memory. |
| MemFree uint64 |
| |
| // The amount of available memory. |
| MemAvailable uint64 |
| } |
| |
| // fillCpuInfo takes the key and value, converts the value |
| // to the proper size unit and is stores it in CpuInfo. |
| func (c *CpuInfo) fillInfo(key, value string) { |
| switch key { |
| case "vendor_id": |
| c.VendorId = value |
| case "model name": |
| c.ModelName = value |
| case "cpu cores": |
| v, err := strconv.ParseInt(value, 10, 32) |
| if err == nil { |
| c.CpuCores = int32(v) |
| } |
| case "flags": |
| c.Flags = value |
| default: |
| // Ignore unknown keys |
| } |
| } |
| |
| // fillCpuInfo takes the key and value, converts the value |
| // to the proper size unit and is stores it in CpuInfo. |
| func (m *MemInfo) fillInfo(key, value string) { |
| v := strToUint64(value) |
| switch key { |
| case "MemTotal": |
| m.MemTotal = v |
| case "MemFree": |
| m.MemFree = v |
| case "MemAvailable": |
| m.MemAvailable = v |
| default: |
| // Ignore unknown keys |
| } |
| } |
| |
| // strToUint64 takes the string and converts to unsigned 64-bit integer. |
| // If the string contains a memory unit such as kB and is converted to |
| // bytes. |
| func strToUint64(v string) uint64 { |
| // v could be "1024 kB" so scan for the empty space and |
| // split between the value and the unit. |
| var separatorIndex int |
| if separatorIndex = strings.IndexAny(v, " "); separatorIndex < 0 { |
| separatorIndex = len(v) |
| } |
| value, err := strconv.ParseUint(v[:separatorIndex], 10, 64) |
| if err != nil { |
| return 0 |
| } |
| |
| var scale uint64 = 1 |
| switch strings.TrimSpace(v[separatorIndex:]) { |
| case "kB", "KB": |
| scale = 1024 |
| case "mB", "MB": |
| scale = 1024 * 1024 |
| } |
| return value * scale |
| } |