mirror of
				https://github.com/prometheus/node_exporter.git
				synced 2025-08-20 18:33:52 -07:00 
			
		
		
		
	Added node_memory_buffer, node_memory_swaptotal to meminfo_bsd (#451)
This commit is contained in:
		
							parent
							
								
									84eaa8fecd
								
							
						
					
					
						commit
						bdc2131332
					
				| 
						 | 
				
			
			@ -22,30 +22,63 @@ import (
 | 
			
		|||
	"golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type sysctlType uint8
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	sysctlTypeUint32 sysctlType = iota
 | 
			
		||||
	sysctlTypeUint64
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type meminfoSysctl struct {
 | 
			
		||||
	name       string
 | 
			
		||||
	dataType   sysctlType
 | 
			
		||||
	conversion func(uint64) uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *meminfoCollector) getMemInfo() (map[string]float64, error) {
 | 
			
		||||
	info := make(map[string]float64)
 | 
			
		||||
 | 
			
		||||
	size, err := unix.SysctlUint32("vm.stats.vm.v_page_size")
 | 
			
		||||
	tmp32, err := unix.SysctlUint32("vm.stats.vm.v_page_size")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("sysctl(vm.stats.vm.v_page_size) failed: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
	size := uint64(tmp32)
 | 
			
		||||
	fromPage := func(v uint64) uint64 {
 | 
			
		||||
		return v * size
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for key, v := range map[string]string{
 | 
			
		||||
		"active":     "vm.stats.vm.v_active_count",
 | 
			
		||||
		"inactive":   "vm.stats.vm.v_inactive_count",
 | 
			
		||||
		"wire":       "vm.stats.vm.v_wire_count",
 | 
			
		||||
		"cache":      "vm.stats.vm.v_cache_count",
 | 
			
		||||
		"free":       "vm.stats.vm.v_free_count",
 | 
			
		||||
		"swappgsin":  "vm.stats.vm.v_swappgsin",
 | 
			
		||||
		"swappgsout": "vm.stats.vm.v_swappgsout",
 | 
			
		||||
		"total":      "vm.stats.vm.v_page_count",
 | 
			
		||||
	for key, v := range map[string]meminfoSysctl{
 | 
			
		||||
		"active_bytes":         {"vm.stats.vm.v_active_count", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"inactive_bytes":       {"vm.stats.vm.v_inactive_count", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"wired_bytes":          {"vm.stats.vm.v_wire_count", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"cache_bytes":          {"vm.stats.vm.v_cache_count", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"buffer_bytes":         {"vfs.bufspace", sysctlTypeUint32, nil},
 | 
			
		||||
		"free_bytes":           {"vm.stats.vm.v_free_count", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"size_bytes":           {"vm.stats.vm.v_page_count", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"swap_in_bytes_total":  {"vm.stats.vm.v_swappgsin", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"swap_out_bytes_total": {"vm.stats.vm.v_swappgsout", sysctlTypeUint32, fromPage},
 | 
			
		||||
		"swap_size_bytes":      {"vm.swap_total", sysctlTypeUint64, nil},
 | 
			
		||||
	} {
 | 
			
		||||
		value, err := unix.SysctlUint32(v)
 | 
			
		||||
		var tmp64 uint64
 | 
			
		||||
		switch v.dataType {
 | 
			
		||||
		case sysctlTypeUint32:
 | 
			
		||||
			tmp32, err = unix.SysctlUint32(v.name)
 | 
			
		||||
			tmp64 = uint64(tmp32)
 | 
			
		||||
		case sysctlTypeUint64:
 | 
			
		||||
			tmp64, err = unix.SysctlUint64(v.name)
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		// Convert metrics to kB (same as Linux meminfo).
 | 
			
		||||
		info[key] = float64(value) * float64(size)
 | 
			
		||||
 | 
			
		||||
		if v.conversion != nil {
 | 
			
		||||
			// Convert to bytes.
 | 
			
		||||
			info[key] = float64(v.conversion(tmp64))
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		info[key] = float64(tmp64)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return info, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue