internal/mode/webserver/webserver_linux.go (62 lines of code) (raw):
package webserver
import (
"path"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs"
sglog "github.com/sourcegraph/log"
)
func mustRegisterMemoryMapMetrics(logger sglog.Logger) {
logger = logger.Scoped("memoryMapMetrics")
// The memory map metrics are collected via /proc, which
// is only available on linux-based operating systems.
// Instantiate shared FS objects for accessing /proc and /proc/self,
// and skip metrics registration if we're aren't able to instantiate them
// for whatever reason.
fs, err := procfs.NewDefaultFS()
if err != nil {
logger.Debug(
"skipping registration",
sglog.String("reason", "failed to initialize proc FS"),
sglog.String("error", err.Error()),
)
return
}
info, err := fs.Self()
if err != nil {
logger.Debug(
"skipping registration",
sglog.String("path", path.Join(procfs.DefaultMountPoint, "self")),
sglog.String("reason", "failed to initialize process info object for current process"),
sglog.String("error", err.Error()),
)
return
}
// Register Prometheus memory map metrics
prometheus.MustRegister(prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Name: "proc_metrics_memory_map_max_limit",
Help: "Upper limit on amount of memory mapped regions a process may have.",
}, func() float64 {
vm, err := fs.VM()
if err != nil {
logger.Debug(
"failed to read virtual memory statistics for the current process",
sglog.String("path", path.Join(procfs.DefaultMountPoint, "sys", "vm")),
sglog.String("error", err.Error()),
)
return 0
}
if vm.MaxMapCount == nil {
return 0
}
return float64(*vm.MaxMapCount)
}))
prometheus.MustRegister(prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Name: "proc_metrics_memory_map_current_count",
Help: "Amount of memory mapped regions this process is currently using.",
}, func() float64 {
procMaps, err := info.ProcMaps()
if err != nil {
logger.Debug(
"failed to read memory mappings for current process",
sglog.String("path", path.Join(procfs.DefaultMountPoint, "self", "maps")),
sglog.String("error", err.Error()),
)
return 0
}
return float64(len(procMaps))
}))
}