update procfs to v0.0.4 (#1457)

Signed-off-by: Paul Gier <pgier@redhat.com>
This commit is contained in:
Paul Gier 2019-08-27 02:26:19 -05:00 committed by Ben Kochie
parent 154d59dee7
commit 0b7ac85acb
8 changed files with 1518 additions and 178 deletions

2
go.mod
View File

@ -15,7 +15,7 @@ require (
github.com/prometheus/client_golang v1.0.0
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
github.com/prometheus/common v0.4.1
github.com/prometheus/procfs v0.0.4-0.20190731153504-5da962fa40f1
github.com/prometheus/procfs v0.0.4
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745
github.com/sirupsen/logrus v1.4.2 // indirect
github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a

4
go.sum
View File

@ -68,8 +68,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.4-0.20190731153504-5da962fa40f1 h1:uqK/YnaVFq1uofHlzj+IR4HhCYA/nbrvJ431l7cm7Vs=
github.com/prometheus/procfs v0.0.4-0.20190731153504-5da962fa40f1/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/procfs v0.0.4 h1:w8DjqFMJDjuVwdZBQoOozr4MVWOnwF7RcL/7uxBjY78=
github.com/prometheus/procfs v0.0.4/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745 h1:IuH7WumZNax0D+rEqmy2TyhKCzrtMGqbZO0b8rO00JA=
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=

File diff suppressed because it is too large Load Diff

View File

@ -18,11 +18,7 @@ package sysfs
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"reflect"
"strconv"
"strings"
"github.com/prometheus/procfs/internal/util"
)
@ -33,32 +29,32 @@ const netclassPath = "class/net"
// for single interface (iface).
type NetClassIface struct {
Name string // Interface name
AddrAssignType *int64 `fileName:"addr_assign_type"` // /sys/class/net/<iface>/addr_assign_type
AddrLen *int64 `fileName:"addr_len"` // /sys/class/net/<iface>/addr_len
Address string `fileName:"address"` // /sys/class/net/<iface>/address
Broadcast string `fileName:"broadcast"` // /sys/class/net/<iface>/broadcast
Carrier *int64 `fileName:"carrier"` // /sys/class/net/<iface>/carrier
CarrierChanges *int64 `fileName:"carrier_changes"` // /sys/class/net/<iface>/carrier_changes
CarrierUpCount *int64 `fileName:"carrier_up_count"` // /sys/class/net/<iface>/carrier_up_count
CarrierDownCount *int64 `fileName:"carrier_down_count"` // /sys/class/net/<iface>/carrier_down_count
DevID *int64 `fileName:"dev_id"` // /sys/class/net/<iface>/dev_id
Dormant *int64 `fileName:"dormant"` // /sys/class/net/<iface>/dormant
Duplex string `fileName:"duplex"` // /sys/class/net/<iface>/duplex
Flags *int64 `fileName:"flags"` // /sys/class/net/<iface>/flags
IfAlias string `fileName:"ifalias"` // /sys/class/net/<iface>/ifalias
IfIndex *int64 `fileName:"ifindex"` // /sys/class/net/<iface>/ifindex
IfLink *int64 `fileName:"iflink"` // /sys/class/net/<iface>/iflink
LinkMode *int64 `fileName:"link_mode"` // /sys/class/net/<iface>/link_mode
MTU *int64 `fileName:"mtu"` // /sys/class/net/<iface>/mtu
NameAssignType *int64 `fileName:"name_assign_type"` // /sys/class/net/<iface>/name_assign_type
NetDevGroup *int64 `fileName:"netdev_group"` // /sys/class/net/<iface>/netdev_group
OperState string `fileName:"operstate"` // /sys/class/net/<iface>/operstate
PhysPortID string `fileName:"phys_port_id"` // /sys/class/net/<iface>/phys_port_id
PhysPortName string `fileName:"phys_port_name"` // /sys/class/net/<iface>/phys_port_name
PhysSwitchID string `fileName:"phys_switch_id"` // /sys/class/net/<iface>/phys_switch_id
Speed *int64 `fileName:"speed"` // /sys/class/net/<iface>/speed
TxQueueLen *int64 `fileName:"tx_queue_len"` // /sys/class/net/<iface>/tx_queue_len
Type *int64 `fileName:"type"` // /sys/class/net/<iface>/type
AddrAssignType *int64 // /sys/class/net/<iface>/addr_assign_type
AddrLen *int64 // /sys/class/net/<iface>/addr_len
Address string // /sys/class/net/<iface>/address
Broadcast string // /sys/class/net/<iface>/broadcast
Carrier *int64 // /sys/class/net/<iface>/carrier
CarrierChanges *int64 // /sys/class/net/<iface>/carrier_changes
CarrierUpCount *int64 // /sys/class/net/<iface>/carrier_up_count
CarrierDownCount *int64 // /sys/class/net/<iface>/carrier_down_count
DevID *int64 // /sys/class/net/<iface>/dev_id
Dormant *int64 // /sys/class/net/<iface>/dormant
Duplex string // /sys/class/net/<iface>/duplex
Flags *int64 // /sys/class/net/<iface>/flags
IfAlias string // /sys/class/net/<iface>/ifalias
IfIndex *int64 // /sys/class/net/<iface>/ifindex
IfLink *int64 // /sys/class/net/<iface>/iflink
LinkMode *int64 // /sys/class/net/<iface>/link_mode
MTU *int64 // /sys/class/net/<iface>/mtu
NameAssignType *int64 // /sys/class/net/<iface>/name_assign_type
NetDevGroup *int64 // /sys/class/net/<iface>/netdev_group
OperState string // /sys/class/net/<iface>/operstate
PhysPortID string // /sys/class/net/<iface>/phys_port_id
PhysPortName string // /sys/class/net/<iface>/phys_port_name
PhysSwitchID string // /sys/class/net/<iface>/phys_switch_id
Speed *int64 // /sys/class/net/<iface>/speed
TxQueueLen *int64 // /sys/class/net/<iface>/tx_queue_len
Type *int64 // /sys/class/net/<iface>/type
}
// NetClass is collection of info for every interface (iface) in /sys/class/net. The map keys
@ -109,54 +105,77 @@ func (fs FS) NetClass() (NetClass, error) {
// directory and gets their contents.
func (nc NetClass) parseNetClassIface(devicePath string) (*NetClassIface, error) {
interfaceClass := NetClassIface{}
interfaceElem := reflect.ValueOf(&interfaceClass).Elem()
interfaceType := reflect.TypeOf(interfaceClass)
//start from 1 - skip the Name field
for i := 1; i < interfaceElem.NumField(); i++ {
fieldType := interfaceType.Field(i)
fieldValue := interfaceElem.Field(i)
if fieldType.Tag.Get("fileName") == "" {
panic(fmt.Errorf("field %s does not have a filename tag", fieldType.Name))
}
value, err := util.SysReadFile(devicePath + "/" + fieldType.Tag.Get("fileName"))
if err != nil {
if os.IsNotExist(err) || err.Error() == "operation not supported" || err.Error() == "invalid argument" {
continue
}
return nil, fmt.Errorf("could not access file %s: %s", fieldType.Tag.Get("fileName"), err)
}
switch fieldValue.Kind() {
case reflect.String:
fieldValue.SetString(value)
case reflect.Ptr:
var int64ptr *int64
switch fieldValue.Type() {
case reflect.TypeOf(int64ptr):
var intValue int64
if strings.HasPrefix(value, "0x") {
intValue, err = strconv.ParseInt(value[2:], 16, 64)
if err != nil {
return nil, fmt.Errorf("expected hex value for %s, got: %s", fieldType.Name, value)
}
} else {
intValue, err = strconv.ParseInt(value, 10, 64)
if err != nil {
return nil, fmt.Errorf("expected Uint64 value for %s, got: %s", fieldType.Name, value)
}
}
fieldValue.Set(reflect.ValueOf(&intValue))
default:
return nil, fmt.Errorf("unhandled pointer type %q", fieldValue.Type())
}
default:
return nil, fmt.Errorf("unhandled type %q", fieldValue.Kind())
}
files, err := ioutil.ReadDir(devicePath)
if err != nil {
return nil, err
}
for _, f := range files {
if f.IsDir() {
continue
}
name := filepath.Join(devicePath, f.Name())
value, err := util.SysReadFile(name)
if err != nil {
return nil, fmt.Errorf("failed to read file %q: %v", name, err)
}
vp := util.NewValueParser(value)
switch f.Name() {
case "addr_assign_type":
interfaceClass.AddrAssignType = vp.PInt64()
case "addr_len":
interfaceClass.AddrLen = vp.PInt64()
case "address":
interfaceClass.Address = value
case "broadcast":
interfaceClass.Broadcast = value
case "carrier":
interfaceClass.Carrier = vp.PInt64()
case "carrier_changes":
interfaceClass.CarrierChanges = vp.PInt64()
case "carrier_up_count":
interfaceClass.CarrierUpCount = vp.PInt64()
case "carrier_down_count":
interfaceClass.CarrierDownCount = vp.PInt64()
case "dev_id":
interfaceClass.DevID = vp.PInt64()
case "dormant":
interfaceClass.Dormant = vp.PInt64()
case "duplex":
interfaceClass.Duplex = value
case "flags":
interfaceClass.Flags = vp.PInt64()
case "ifalias":
interfaceClass.IfAlias = value
case "ifindex":
interfaceClass.IfIndex = vp.PInt64()
case "iflink":
interfaceClass.IfLink = vp.PInt64()
case "link_mode":
interfaceClass.LinkMode = vp.PInt64()
case "mtu":
interfaceClass.MTU = vp.PInt64()
case "name_assign_type":
interfaceClass.NameAssignType = vp.PInt64()
case "netdev_group":
interfaceClass.NetDevGroup = vp.PInt64()
case "operstate":
interfaceClass.OperState = value
case "phys_port_id":
interfaceClass.PhysPortID = value
case "phys_port_name":
interfaceClass.PhysPortName = value
case "phys_switch_id":
interfaceClass.PhysSwitchID = value
case "speed":
interfaceClass.Speed = vp.PInt64()
case "tx_queue_len":
interfaceClass.TxQueueLen = vp.PInt64()
case "type":
interfaceClass.Type = vp.PInt64()
}
}
return &interfaceClass, nil
}

View File

@ -31,49 +31,49 @@ import (
// Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array
// and numa_zonelist_order (deprecated) which is a string
type VM struct {
AdminReserveKbytes int64 // /proc/sys/vm/admin_reserve_kbytes
BlockDump int64 // /proc/sys/vm/block_dump
CompactUnevictableAllowed int64 // /proc/sys/vm/compact_unevictable_allowed
DirtyBackgroundBytes int64 // /proc/sys/vm/dirty_background_bytes
DirtyBackgroundRatio int64 // /proc/sys/vm/dirty_background_ratio
DirtyBytes int64 // /proc/sys/vm/dirty_bytes
DirtyExpireCentisecs int64 // /proc/sys/vm/dirty_expire_centisecs
DirtyRatio int64 // /proc/sys/vm/dirty_ratio
DirtytimeExpireSeconds int64 // /proc/sys/vm/dirtytime_expire_seconds
DirtyWritebackCentisecs int64 // /proc/sys/vm/dirty_writeback_centisecs
DropCaches int64 // /proc/sys/vm/drop_caches
ExtfragThreshold int64 // /proc/sys/vm/extfrag_threshold
HugetlbShmGroup int64 // /proc/sys/vm/hugetlb_shm_group
LaptopMode int64 // /proc/sys/vm/laptop_mode
LegacyVaLayout int64 // /proc/sys/vm/legacy_va_layout
LowmemReserveRatio []int64 // /proc/sys/vm/lowmem_reserve_ratio
MaxMapCount int64 // /proc/sys/vm/max_map_count
MemoryFailureEarlyKill int64 // /proc/sys/vm/memory_failure_early_kill
MemoryFailureRecovery int64 // /proc/sys/vm/memory_failure_recovery
MinFreeKbytes int64 // /proc/sys/vm/min_free_kbytes
MinSlabRatio int64 // /proc/sys/vm/min_slab_ratio
MinUnmappedRatio int64 // /proc/sys/vm/min_unmapped_ratio
MmapMinAddr int64 // /proc/sys/vm/mmap_min_addr
NrHugepages int64 // /proc/sys/vm/nr_hugepages
NrHugepagesMempolicy int64 // /proc/sys/vm/nr_hugepages_mempolicy
NrOvercommitHugepages int64 // /proc/sys/vm/nr_overcommit_hugepages
NumaStat int64 // /proc/sys/vm/numa_stat
NumaZonelistOrder string // /proc/sys/vm/numa_zonelist_order
OomDumpTasks int64 // /proc/sys/vm/oom_dump_tasks
OomKillAllocatingTask int64 // /proc/sys/vm/oom_kill_allocating_task
OvercommitKbytes int64 // /proc/sys/vm/overcommit_kbytes
OvercommitMemory int64 // /proc/sys/vm/overcommit_memory
OvercommitRatio int64 // /proc/sys/vm/overcommit_ratio
PageCluster int64 // /proc/sys/vm/page-cluster
PanicOnOom int64 // /proc/sys/vm/panic_on_oom
PercpuPagelistFraction int64 // /proc/sys/vm/percpu_pagelist_fraction
StatInterval int64 // /proc/sys/vm/stat_interval
Swappiness int64 // /proc/sys/vm/swappiness
UserReserveKbytes int64 // /proc/sys/vm/user_reserve_kbytes
VfsCachePressure int64 // /proc/sys/vm/vfs_cache_pressure
WatermarkBoostFactor int64 // /proc/sys/vm/watermark_boost_factor
WatermarkScaleFactor int64 // /proc/sys/vm/watermark_scale_factor
ZoneReclaimMode int64 // /proc/sys/vm/zone_reclaim_mode
AdminReserveKbytes *int64 // /proc/sys/vm/admin_reserve_kbytes
BlockDump *int64 // /proc/sys/vm/block_dump
CompactUnevictableAllowed *int64 // /proc/sys/vm/compact_unevictable_allowed
DirtyBackgroundBytes *int64 // /proc/sys/vm/dirty_background_bytes
DirtyBackgroundRatio *int64 // /proc/sys/vm/dirty_background_ratio
DirtyBytes *int64 // /proc/sys/vm/dirty_bytes
DirtyExpireCentisecs *int64 // /proc/sys/vm/dirty_expire_centisecs
DirtyRatio *int64 // /proc/sys/vm/dirty_ratio
DirtytimeExpireSeconds *int64 // /proc/sys/vm/dirtytime_expire_seconds
DirtyWritebackCentisecs *int64 // /proc/sys/vm/dirty_writeback_centisecs
DropCaches *int64 // /proc/sys/vm/drop_caches
ExtfragThreshold *int64 // /proc/sys/vm/extfrag_threshold
HugetlbShmGroup *int64 // /proc/sys/vm/hugetlb_shm_group
LaptopMode *int64 // /proc/sys/vm/laptop_mode
LegacyVaLayout *int64 // /proc/sys/vm/legacy_va_layout
LowmemReserveRatio []*int64 // /proc/sys/vm/lowmem_reserve_ratio
MaxMapCount *int64 // /proc/sys/vm/max_map_count
MemoryFailureEarlyKill *int64 // /proc/sys/vm/memory_failure_early_kill
MemoryFailureRecovery *int64 // /proc/sys/vm/memory_failure_recovery
MinFreeKbytes *int64 // /proc/sys/vm/min_free_kbytes
MinSlabRatio *int64 // /proc/sys/vm/min_slab_ratio
MinUnmappedRatio *int64 // /proc/sys/vm/min_unmapped_ratio
MmapMinAddr *int64 // /proc/sys/vm/mmap_min_addr
NrHugepages *int64 // /proc/sys/vm/nr_hugepages
NrHugepagesMempolicy *int64 // /proc/sys/vm/nr_hugepages_mempolicy
NrOvercommitHugepages *int64 // /proc/sys/vm/nr_overcommit_hugepages
NumaStat *int64 // /proc/sys/vm/numa_stat
NumaZonelistOrder string // /proc/sys/vm/numa_zonelist_order
OomDumpTasks *int64 // /proc/sys/vm/oom_dump_tasks
OomKillAllocatingTask *int64 // /proc/sys/vm/oom_kill_allocating_task
OvercommitKbytes *int64 // /proc/sys/vm/overcommit_kbytes
OvercommitMemory *int64 // /proc/sys/vm/overcommit_memory
OvercommitRatio *int64 // /proc/sys/vm/overcommit_ratio
PageCluster *int64 // /proc/sys/vm/page-cluster
PanicOnOom *int64 // /proc/sys/vm/panic_on_oom
PercpuPagelistFraction *int64 // /proc/sys/vm/percpu_pagelist_fraction
StatInterval *int64 // /proc/sys/vm/stat_interval
Swappiness *int64 // /proc/sys/vm/swappiness
UserReserveKbytes *int64 // /proc/sys/vm/user_reserve_kbytes
VfsCachePressure *int64 // /proc/sys/vm/vfs_cache_pressure
WatermarkBoostFactor *int64 // /proc/sys/vm/watermark_boost_factor
WatermarkScaleFactor *int64 // /proc/sys/vm/watermark_scale_factor
ZoneReclaimMode *int64 // /proc/sys/vm/zone_reclaim_mode
}
// VM reads the VM statistics from the specified `proc` filesystem.
@ -109,97 +109,97 @@ func (fs FS) VM() (*VM, error) {
switch f.Name() {
case "admin_reserve_kbytes":
vm.AdminReserveKbytes = *vp.PInt64()
vm.AdminReserveKbytes = vp.PInt64()
case "block_dump":
vm.BlockDump = *vp.PInt64()
vm.BlockDump = vp.PInt64()
case "compact_unevictable_allowed":
vm.CompactUnevictableAllowed = *vp.PInt64()
vm.CompactUnevictableAllowed = vp.PInt64()
case "dirty_background_bytes":
vm.DirtyBackgroundBytes = *vp.PInt64()
vm.DirtyBackgroundBytes = vp.PInt64()
case "dirty_background_ratio":
vm.DirtyBackgroundRatio = *vp.PInt64()
vm.DirtyBackgroundRatio = vp.PInt64()
case "dirty_bytes":
vm.DirtyBytes = *vp.PInt64()
vm.DirtyBytes = vp.PInt64()
case "dirty_expire_centisecs":
vm.DirtyExpireCentisecs = *vp.PInt64()
vm.DirtyExpireCentisecs = vp.PInt64()
case "dirty_ratio":
vm.DirtyRatio = *vp.PInt64()
vm.DirtyRatio = vp.PInt64()
case "dirtytime_expire_seconds":
vm.DirtytimeExpireSeconds = *vp.PInt64()
vm.DirtytimeExpireSeconds = vp.PInt64()
case "dirty_writeback_centisecs":
vm.DirtyWritebackCentisecs = *vp.PInt64()
vm.DirtyWritebackCentisecs = vp.PInt64()
case "drop_caches":
vm.DropCaches = *vp.PInt64()
vm.DropCaches = vp.PInt64()
case "extfrag_threshold":
vm.ExtfragThreshold = *vp.PInt64()
vm.ExtfragThreshold = vp.PInt64()
case "hugetlb_shm_group":
vm.HugetlbShmGroup = *vp.PInt64()
vm.HugetlbShmGroup = vp.PInt64()
case "laptop_mode":
vm.LaptopMode = *vp.PInt64()
vm.LaptopMode = vp.PInt64()
case "legacy_va_layout":
vm.LegacyVaLayout = *vp.PInt64()
vm.LegacyVaLayout = vp.PInt64()
case "lowmem_reserve_ratio":
stringSlice := strings.Fields(value)
int64Slice := make([]int64, 0, len(stringSlice))
pint64Slice := make([]*int64, 0, len(stringSlice))
for _, value := range stringSlice {
vp := util.NewValueParser(value)
int64Slice = append(int64Slice, *vp.PInt64())
pint64Slice = append(pint64Slice, vp.PInt64())
}
vm.LowmemReserveRatio = int64Slice
vm.LowmemReserveRatio = pint64Slice
case "max_map_count":
vm.MaxMapCount = *vp.PInt64()
vm.MaxMapCount = vp.PInt64()
case "memory_failure_early_kill":
vm.MemoryFailureEarlyKill = *vp.PInt64()
vm.MemoryFailureEarlyKill = vp.PInt64()
case "memory_failure_recovery":
vm.MemoryFailureRecovery = *vp.PInt64()
vm.MemoryFailureRecovery = vp.PInt64()
case "min_free_kbytes":
vm.MinFreeKbytes = *vp.PInt64()
vm.MinFreeKbytes = vp.PInt64()
case "min_slab_ratio":
vm.MinSlabRatio = *vp.PInt64()
vm.MinSlabRatio = vp.PInt64()
case "min_unmapped_ratio":
vm.MinUnmappedRatio = *vp.PInt64()
vm.MinUnmappedRatio = vp.PInt64()
case "mmap_min_addr":
vm.MmapMinAddr = *vp.PInt64()
vm.MmapMinAddr = vp.PInt64()
case "nr_hugepages":
vm.NrHugepages = *vp.PInt64()
vm.NrHugepages = vp.PInt64()
case "nr_hugepages_mempolicy":
vm.NrHugepagesMempolicy = *vp.PInt64()
vm.NrHugepagesMempolicy = vp.PInt64()
case "nr_overcommit_hugepages":
vm.NrOvercommitHugepages = *vp.PInt64()
vm.NrOvercommitHugepages = vp.PInt64()
case "numa_stat":
vm.NumaStat = *vp.PInt64()
vm.NumaStat = vp.PInt64()
case "numa_zonelist_order":
vm.NumaZonelistOrder = value
case "oom_dump_tasks":
vm.OomDumpTasks = *vp.PInt64()
vm.OomDumpTasks = vp.PInt64()
case "oom_kill_allocating_task":
vm.OomKillAllocatingTask = *vp.PInt64()
vm.OomKillAllocatingTask = vp.PInt64()
case "overcommit_kbytes":
vm.OvercommitKbytes = *vp.PInt64()
vm.OvercommitKbytes = vp.PInt64()
case "overcommit_memory":
vm.OvercommitMemory = *vp.PInt64()
vm.OvercommitMemory = vp.PInt64()
case "overcommit_ratio":
vm.OvercommitRatio = *vp.PInt64()
vm.OvercommitRatio = vp.PInt64()
case "page-cluster":
vm.PageCluster = *vp.PInt64()
vm.PageCluster = vp.PInt64()
case "panic_on_oom":
vm.PanicOnOom = *vp.PInt64()
vm.PanicOnOom = vp.PInt64()
case "percpu_pagelist_fraction":
vm.PercpuPagelistFraction = *vp.PInt64()
vm.PercpuPagelistFraction = vp.PInt64()
case "stat_interval":
vm.StatInterval = *vp.PInt64()
vm.StatInterval = vp.PInt64()
case "swappiness":
vm.Swappiness = *vp.PInt64()
vm.Swappiness = vp.PInt64()
case "user_reserve_kbytes":
vm.UserReserveKbytes = *vp.PInt64()
vm.UserReserveKbytes = vp.PInt64()
case "vfs_cache_pressure":
vm.VfsCachePressure = *vp.PInt64()
vm.VfsCachePressure = vp.PInt64()
case "watermark_boost_factor":
vm.WatermarkBoostFactor = *vp.PInt64()
vm.WatermarkBoostFactor = vp.PInt64()
case "watermark_scale_factor":
vm.WatermarkScaleFactor = *vp.PInt64()
vm.WatermarkScaleFactor = vp.PInt64()
case "zone_reclaim_mode":
vm.ZoneReclaimMode = *vp.PInt64()
vm.ZoneReclaimMode = vp.PInt64()
}
if err := vp.Err(); err != nil {
return nil, err

View File

@ -35,23 +35,25 @@ func ParseStats(r io.Reader) (*Stats, error) {
fieldTrans = "trans"
fieldIg = "ig"
fieldLog = "log"
fieldPushAil = "push_ail"
fieldXstrat = "xstrat"
fieldRw = "rw"
fieldAttr = "attr"
fieldIcluster = "icluster"
fieldVnodes = "vnodes"
fieldBuf = "buf"
fieldXpc = "xpc"
fieldAbtb2 = "abtb2"
fieldAbtc2 = "abtc2"
fieldBmbt2 = "bmbt2"
fieldIbt2 = "ibt2"
//fieldFibt2 = "fibt2"
fieldQm = "qm"
fieldDebug = "debug"
// Unimplemented at this time due to lack of documentation.
// fieldPushAil = "push_ail"
// fieldXstrat = "xstrat"
// fieldAbtb2 = "abtb2"
// fieldAbtc2 = "abtc2"
// fieldBmbt2 = "bmbt2"
// fieldIbt2 = "ibt2"
// fieldFibt2 = "fibt2"
// fieldQm = "qm"
// fieldDebug = "debug"
//fieldRmapbt = "rmapbt"
//fieldRefcntbt = "refcntbt"
)
var xfss Stats
@ -115,6 +117,23 @@ func ParseStats(r io.Reader) (*Stats, error) {
xfss.Vnode, err = vnodeStats(us)
case fieldBuf:
xfss.Buffer, err = bufferStats(us)
case fieldPushAil:
xfss.PushAil, err = pushAilStats(us)
case fieldXstrat:
xfss.Xstrat, err = xStratStats(us)
case fieldAbtb2:
xfss.BtreeAllocBlocks2, err = btreeAllocBlocks2Stats(us)
case fieldAbtc2:
xfss.BtreeAllocContig2, err = btreeAllocContig2Stats(us)
case fieldBmbt2:
xfss.BtreeBlockMap2, err = btreeBlockMap2Stats(us)
case fieldIbt2:
xfss.BtreeInode2, err = btreeInode2Stats(us)
//case fieldFibt2:
case fieldQm:
xfss.QuotaManager, err = quotaManagerStats(us)
case fieldDebug:
xfss.Debug, err = debugStats(us)
}
if err != nil {
return nil, err
@ -228,7 +247,39 @@ func logOperationStats(us []uint32) (LogOperationStats, error) {
}, nil
}
// ReadWriteStats builds a ReadWriteStats from a slice of uint32s.
// push_ail
func pushAilStats(us []uint32) (PushAilStats, error) {
if l := len(us); l != 10 {
return PushAilStats{}, fmt.Errorf("incorrect number of values for XFS push ail stats: %d", l)
}
return PushAilStats{
TryLogspace: us[0],
SleepLogspace: us[1],
Pushes: us[2],
Success: us[3],
PushBuf: us[4],
Pinned: us[5],
Locked: us[6],
Flushing: us[7],
Restarts: us[8],
Flush: us[9],
}, nil
}
// xstrat
func xStratStats(us []uint32) (XstratStats, error) {
if l := len(us); l != 2 {
return XstratStats{}, fmt.Errorf("incorrect number of values for XFS xstrat stats: %d", l)
}
return XstratStats{
Quick: us[0],
Split: us[1],
}, nil
}
// rw
func readWriteStats(us []uint32) (ReadWriteStats, error) {
if l := len(us); l != 2 {
return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l)
@ -328,3 +379,130 @@ func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) {
ReadBytes: us[2],
}, nil
}
func quotaManagerStats(us []uint32) (QuotaManagerStats, error) {
if l := len(us); l != 8 {
return QuotaManagerStats{}, fmt.Errorf("incorrect number of values for XFS quota stats: %d", l)
}
return QuotaManagerStats{
Reclaims: us[0],
ReclaimMisses: us[1],
DquoteDups: us[2],
CacheMisses: us[3],
CacheHits: us[4],
Wants: us[5],
ShakeReclaims: us[6],
InactReclaims: us[7],
}, nil
}
func debugStats(us []uint32) (DebugStats, error) {
if l := len(us); l != 1 {
return DebugStats{}, fmt.Errorf("incorrect number of values for XFS debug stats: %d", l)
}
return DebugStats{
Enabled: us[0],
}, nil
}
// abtb2
func btreeAllocBlocks2Stats(us []uint32) (BtreeAllocBlocks2Stats, error) {
if l := len(us); l != 15 {
return BtreeAllocBlocks2Stats{}, fmt.Errorf("incorrect number of values for abtb2 stats: %d", 1)
}
return BtreeAllocBlocks2Stats{
Lookup: us[0],
Compare: us[1],
Insrec: us[2],
Delrec: us[3],
NewRoot: us[4],
KillRoot: us[5],
Increment: us[6],
Decrement: us[7],
Lshift: us[8],
Rshift: us[9],
Split: us[10],
Join: us[11],
Alloc: us[12],
Free: us[13],
Moves: us[14],
}, nil
}
// abtc2
func btreeAllocContig2Stats(us []uint32) (BtreeAllocContig2Stats, error) {
if l := len(us); l != 15 {
return BtreeAllocContig2Stats{}, fmt.Errorf("incorrect number of values for abtc2 stats: %d", 1)
}
return BtreeAllocContig2Stats{
Lookup: us[0],
Compare: us[1],
Insrec: us[2],
Delrec: us[3],
NewRoot: us[4],
KillRoot: us[5],
Increment: us[6],
Decrement: us[7],
Lshift: us[8],
Rshift: us[9],
Split: us[10],
Join: us[11],
Alloc: us[12],
Free: us[13],
Moves: us[14],
}, nil
}
// bmbt2
func btreeBlockMap2Stats(us []uint32) (BtreeBlockMap2Stats, error) {
if l := len(us); l != 15 {
return BtreeBlockMap2Stats{}, fmt.Errorf("incorrect number of values for bmbt2 stats: %d", 1)
}
return BtreeBlockMap2Stats{
Lookup: us[0],
Compare: us[1],
Insrec: us[2],
Delrec: us[3],
NewRoot: us[4],
KillRoot: us[5],
Increment: us[6],
Decrement: us[7],
Lshift: us[8],
Rshift: us[9],
Split: us[10],
Join: us[11],
Alloc: us[12],
Free: us[13],
Moves: us[14],
}, nil
}
// ibt2
func btreeInode2Stats(us []uint32) (BtreeInode2Stats, error) {
if l := len(us); l != 15 {
return BtreeInode2Stats{}, fmt.Errorf("incorrect number of values for ibt2 stats: %d", 1)
}
return BtreeInode2Stats{
Lookup: us[0],
Compare: us[1],
Insrec: us[2],
Delrec: us[3],
NewRoot: us[4],
KillRoot: us[5],
Increment: us[6],
Decrement: us[7],
Lshift: us[8],
Rshift: us[9],
Split: us[10],
Join: us[11],
Alloc: us[12],
Free: us[13],
Moves: us[14],
}, nil
}

View File

@ -49,6 +49,14 @@ type Stats struct {
Vnode VnodeStats
Buffer BufferStats
ExtendedPrecision ExtendedPrecisionStats
Xstrat XstratStats // xstrat
PushAil PushAilStats // push_ail
Debug DebugStats // debug
QuotaManager QuotaManagerStats // qm
BtreeAllocBlocks2 BtreeAllocBlocks2Stats // abtb2
BtreeAllocContig2 BtreeAllocContig2Stats // abtc2
BtreeBlockMap2 BtreeBlockMap2Stats // bmbt2
BtreeInode2 BtreeInode2Stats // ibt2
}
// ExtentAllocationStats contains statistics regarding XFS extent allocations.
@ -170,6 +178,119 @@ type ExtendedPrecisionStats struct {
ReadBytes uint64
}
// PushAilStats contains statistics on tail-pushing operations.
type PushAilStats struct {
TryLogspace uint32
SleepLogspace uint32
Pushes uint32
Success uint32
PushBuf uint32
Pinned uint32
Locked uint32
Flushing uint32
Restarts uint32
Flush uint32
}
// QuotaManagerStats contain statistics regarding quota processing.
type QuotaManagerStats struct {
Reclaims uint32
ReclaimMisses uint32
DquoteDups uint32
CacheMisses uint32
CacheHits uint32
Wants uint32
ShakeReclaims uint32
InactReclaims uint32
}
// XstratStats contains statistics regarding bytes processed by the XFS daemon.
type XstratStats struct {
Quick uint32
Split uint32
}
// DebugStats indicate if XFS debugging is enabled.
type DebugStats struct {
Enabled uint32
}
// BtreeAllocBlocks2Stats contains statistics on B-Tree v2 allocations.
type BtreeAllocBlocks2Stats struct {
Lookup uint32
Compare uint32
Insrec uint32
Delrec uint32
NewRoot uint32
KillRoot uint32
Increment uint32
Decrement uint32
Lshift uint32
Rshift uint32
Split uint32
Join uint32
Alloc uint32
Free uint32
Moves uint32
}
// BtreeAllocContig2Stats contain statistics on B-tree v2 free-space-by-size record operations.
type BtreeAllocContig2Stats struct {
Lookup uint32
Compare uint32
Insrec uint32
Delrec uint32
NewRoot uint32
KillRoot uint32
Increment uint32
Decrement uint32
Lshift uint32
Rshift uint32
Split uint32
Join uint32
Alloc uint32
Free uint32
Moves uint32
}
// BtreeBlockMap2Stats contain statistics on B-tree v2 block map operations.
type BtreeBlockMap2Stats struct {
Lookup uint32
Compare uint32
Insrec uint32
Delrec uint32
NewRoot uint32
KillRoot uint32
Increment uint32
Decrement uint32
Lshift uint32
Rshift uint32
Split uint32
Join uint32
Alloc uint32
Free uint32
Moves uint32
}
// BtreeInode2Stats contain statistics on B-tree v2 inode allocations.
type BtreeInode2Stats struct {
Lookup uint32
Compare uint32
Insrec uint32
Delrec uint32
NewRoot uint32
KillRoot uint32
Increment uint32
Decrement uint32
Lshift uint32
Rshift uint32
Split uint32
Join uint32
Alloc uint32
Free uint32
Moves uint32
}
// FS represents the pseudo-filesystems proc and sys, which provides an interface to
// kernel data structures.
type FS struct {

2
vendor/modules.txt vendored
View File

@ -45,7 +45,7 @@ github.com/prometheus/common/version
github.com/prometheus/common/expfmt
github.com/prometheus/common/model
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
# github.com/prometheus/procfs v0.0.4-0.20190731153504-5da962fa40f1
# github.com/prometheus/procfs v0.0.4
github.com/prometheus/procfs
github.com/prometheus/procfs/bcache
github.com/prometheus/procfs/nfs