metric/memory/memory_helpers.go (49 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you 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 memory
import (
"bufio"
"bytes"
"fmt"
"io"
"os"
"strconv"
"strings"
"github.com/elastic/elastic-agent-system-metrics/metric/system/resolve"
)
// ParseMeminfo parses the contents of /proc/meminfo into a hashmap
func ParseMeminfo(rootfs resolve.Resolver) (map[string]uint64, error) {
table := map[string]uint64{}
meminfoPath := rootfs.ResolveHostFS("/proc/meminfo")
err := readFile(meminfoPath, func(line string) bool {
fields := strings.Split(line, ":")
if len(fields) != 2 {
return true // skip on errors
}
valueUnit := strings.Fields(fields[1])
value, err := strconv.ParseUint(valueUnit[0], 10, 64)
if err != nil {
return true // skip on errors
}
if len(valueUnit) > 1 && valueUnit[1] == "kB" {
value *= 1024
}
table[fields[0]] = value
return true
})
return table, err
}
func readFile(file string, handler func(string) bool) error {
contents, err := os.ReadFile(file)
if err != nil {
return fmt.Errorf("error reading file %s: %w", file, err)
}
reader := bufio.NewReader(bytes.NewBuffer(contents))
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
if !handler(string(line)) {
break
}
}
return nil
}