diff --git a/CHANGELOG.md b/CHANGELOG.md index db655a72..3c376d6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## v0.15.1 / 2017-11-07 + +* [BUGFIX] xfs: expose correct fields, fix metric names #708 +* [BUGFIX] Correct buffer_bytes > INT_MAX on BSD/amd64. #712 +* [BUGFIX] netstat: return nothing when /proc/net/snmp6 not found #718 +* [BUGFIX] Fix off by one in Linux interrupts collector #721 +* [BUGFIX] Add and use sysReadFile in hwmon collector #728 + ## v0.15.0 / 2017-10-06 **Breaking changes** diff --git a/VERSION b/VERSION index a5510516..e815b861 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.15.0 +0.15.1 diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 3e653963..4e86cba5 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -861,6 +861,120 @@ node_infiniband_unicast_packets_received_total{device="mlx4_0",port="2"} 0 # TYPE node_infiniband_unicast_packets_transmitted_total counter node_infiniband_unicast_packets_transmitted_total{device="mlx4_0",port="1"} 61239 node_infiniband_unicast_packets_transmitted_total{device="mlx4_0",port="2"} 0 +# HELP node_interrupts Interrupt details. +# TYPE node_interrupts counter +node_interrupts{CPU="0",devices="",info="APIC ICR read retries",type="RTR"} 0 +node_interrupts{CPU="0",devices="",info="Function call interrupts",type="CAL"} 148554 +node_interrupts{CPU="0",devices="",info="IRQ work interrupts",type="IWI"} 1.509379e+06 +node_interrupts{CPU="0",devices="",info="Local timer interrupts",type="LOC"} 1.74326351e+08 +node_interrupts{CPU="0",devices="",info="Machine check exceptions",type="MCE"} 0 +node_interrupts{CPU="0",devices="",info="Machine check polls",type="MCP"} 2406 +node_interrupts{CPU="0",devices="",info="Non-maskable interrupts",type="NMI"} 47 +node_interrupts{CPU="0",devices="",info="Performance monitoring interrupts",type="PMI"} 47 +node_interrupts{CPU="0",devices="",info="Rescheduling interrupts",type="RES"} 1.0847134e+07 +node_interrupts{CPU="0",devices="",info="Spurious interrupts",type="SPU"} 0 +node_interrupts{CPU="0",devices="",info="TLB shootdowns",type="TLB"} 1.0460334e+07 +node_interrupts{CPU="0",devices="",info="Thermal event interrupts",type="TRM"} 0 +node_interrupts{CPU="0",devices="",info="Threshold APIC interrupts",type="THR"} 0 +node_interrupts{CPU="0",devices="acpi",info="IR-IO-APIC-fasteoi",type="9"} 398553 +node_interrupts{CPU="0",devices="ahci",info="IR-PCI-MSI-edge",type="43"} 7.434032e+06 +node_interrupts{CPU="0",devices="dmar0",info="DMAR_MSI-edge",type="40"} 0 +node_interrupts{CPU="0",devices="dmar1",info="DMAR_MSI-edge",type="41"} 0 +node_interrupts{CPU="0",devices="ehci_hcd:usb1, mmc0",info="IR-IO-APIC-fasteoi",type="16"} 328511 +node_interrupts{CPU="0",devices="ehci_hcd:usb2",info="IR-IO-APIC-fasteoi",type="23"} 1.451445e+06 +node_interrupts{CPU="0",devices="i8042",info="IR-IO-APIC-edge",type="1"} 17960 +node_interrupts{CPU="0",devices="i8042",info="IR-IO-APIC-edge",type="12"} 380847 +node_interrupts{CPU="0",devices="i915",info="IR-PCI-MSI-edge",type="44"} 140636 +node_interrupts{CPU="0",devices="iwlwifi",info="IR-PCI-MSI-edge",type="46"} 4.3078464e+07 +node_interrupts{CPU="0",devices="mei_me",info="IR-PCI-MSI-edge",type="45"} 4 +node_interrupts{CPU="0",devices="rtc0",info="IR-IO-APIC-edge",type="8"} 1 +node_interrupts{CPU="0",devices="snd_hda_intel",info="IR-PCI-MSI-edge",type="47"} 350 +node_interrupts{CPU="0",devices="timer",info="IR-IO-APIC-edge",type="0"} 18 +node_interrupts{CPU="0",devices="xhci_hcd",info="IR-PCI-MSI-edge",type="42"} 378324 +node_interrupts{CPU="1",devices="",info="APIC ICR read retries",type="RTR"} 0 +node_interrupts{CPU="1",devices="",info="Function call interrupts",type="CAL"} 157441 +node_interrupts{CPU="1",devices="",info="IRQ work interrupts",type="IWI"} 2.411776e+06 +node_interrupts{CPU="1",devices="",info="Local timer interrupts",type="LOC"} 1.35776678e+08 +node_interrupts{CPU="1",devices="",info="Machine check exceptions",type="MCE"} 0 +node_interrupts{CPU="1",devices="",info="Machine check polls",type="MCP"} 2399 +node_interrupts{CPU="1",devices="",info="Non-maskable interrupts",type="NMI"} 5031 +node_interrupts{CPU="1",devices="",info="Performance monitoring interrupts",type="PMI"} 5031 +node_interrupts{CPU="1",devices="",info="Rescheduling interrupts",type="RES"} 9.111507e+06 +node_interrupts{CPU="1",devices="",info="Spurious interrupts",type="SPU"} 0 +node_interrupts{CPU="1",devices="",info="TLB shootdowns",type="TLB"} 9.918429e+06 +node_interrupts{CPU="1",devices="",info="Thermal event interrupts",type="TRM"} 0 +node_interrupts{CPU="1",devices="",info="Threshold APIC interrupts",type="THR"} 0 +node_interrupts{CPU="1",devices="acpi",info="IR-IO-APIC-fasteoi",type="9"} 2320 +node_interrupts{CPU="1",devices="ahci",info="IR-PCI-MSI-edge",type="43"} 8.092205e+06 +node_interrupts{CPU="1",devices="dmar0",info="DMAR_MSI-edge",type="40"} 0 +node_interrupts{CPU="1",devices="dmar1",info="DMAR_MSI-edge",type="41"} 0 +node_interrupts{CPU="1",devices="ehci_hcd:usb1, mmc0",info="IR-IO-APIC-fasteoi",type="16"} 322879 +node_interrupts{CPU="1",devices="ehci_hcd:usb2",info="IR-IO-APIC-fasteoi",type="23"} 3.333499e+06 +node_interrupts{CPU="1",devices="i8042",info="IR-IO-APIC-edge",type="1"} 105 +node_interrupts{CPU="1",devices="i8042",info="IR-IO-APIC-edge",type="12"} 1021 +node_interrupts{CPU="1",devices="i915",info="IR-PCI-MSI-edge",type="44"} 226313 +node_interrupts{CPU="1",devices="iwlwifi",info="IR-PCI-MSI-edge",type="46"} 130 +node_interrupts{CPU="1",devices="mei_me",info="IR-PCI-MSI-edge",type="45"} 22 +node_interrupts{CPU="1",devices="rtc0",info="IR-IO-APIC-edge",type="8"} 0 +node_interrupts{CPU="1",devices="snd_hda_intel",info="IR-PCI-MSI-edge",type="47"} 224 +node_interrupts{CPU="1",devices="timer",info="IR-IO-APIC-edge",type="0"} 0 +node_interrupts{CPU="1",devices="xhci_hcd",info="IR-PCI-MSI-edge",type="42"} 1.734637e+06 +node_interrupts{CPU="2",devices="",info="APIC ICR read retries",type="RTR"} 0 +node_interrupts{CPU="2",devices="",info="Function call interrupts",type="CAL"} 142912 +node_interrupts{CPU="2",devices="",info="IRQ work interrupts",type="IWI"} 1.512975e+06 +node_interrupts{CPU="2",devices="",info="Local timer interrupts",type="LOC"} 1.68393257e+08 +node_interrupts{CPU="2",devices="",info="Machine check exceptions",type="MCE"} 0 +node_interrupts{CPU="2",devices="",info="Machine check polls",type="MCP"} 2399 +node_interrupts{CPU="2",devices="",info="Non-maskable interrupts",type="NMI"} 6211 +node_interrupts{CPU="2",devices="",info="Performance monitoring interrupts",type="PMI"} 6211 +node_interrupts{CPU="2",devices="",info="Rescheduling interrupts",type="RES"} 1.5999335e+07 +node_interrupts{CPU="2",devices="",info="Spurious interrupts",type="SPU"} 0 +node_interrupts{CPU="2",devices="",info="TLB shootdowns",type="TLB"} 1.0494258e+07 +node_interrupts{CPU="2",devices="",info="Thermal event interrupts",type="TRM"} 0 +node_interrupts{CPU="2",devices="",info="Threshold APIC interrupts",type="THR"} 0 +node_interrupts{CPU="2",devices="acpi",info="IR-IO-APIC-fasteoi",type="9"} 824 +node_interrupts{CPU="2",devices="ahci",info="IR-PCI-MSI-edge",type="43"} 6.478877e+06 +node_interrupts{CPU="2",devices="dmar0",info="DMAR_MSI-edge",type="40"} 0 +node_interrupts{CPU="2",devices="dmar1",info="DMAR_MSI-edge",type="41"} 0 +node_interrupts{CPU="2",devices="ehci_hcd:usb1, mmc0",info="IR-IO-APIC-fasteoi",type="16"} 293782 +node_interrupts{CPU="2",devices="ehci_hcd:usb2",info="IR-IO-APIC-fasteoi",type="23"} 1.092032e+06 +node_interrupts{CPU="2",devices="i8042",info="IR-IO-APIC-edge",type="1"} 28 +node_interrupts{CPU="2",devices="i8042",info="IR-IO-APIC-edge",type="12"} 240 +node_interrupts{CPU="2",devices="i915",info="IR-PCI-MSI-edge",type="44"} 347 +node_interrupts{CPU="2",devices="iwlwifi",info="IR-PCI-MSI-edge",type="46"} 460171 +node_interrupts{CPU="2",devices="mei_me",info="IR-PCI-MSI-edge",type="45"} 0 +node_interrupts{CPU="2",devices="rtc0",info="IR-IO-APIC-edge",type="8"} 0 +node_interrupts{CPU="2",devices="snd_hda_intel",info="IR-PCI-MSI-edge",type="47"} 0 +node_interrupts{CPU="2",devices="timer",info="IR-IO-APIC-edge",type="0"} 0 +node_interrupts{CPU="2",devices="xhci_hcd",info="IR-PCI-MSI-edge",type="42"} 440240 +node_interrupts{CPU="3",devices="",info="APIC ICR read retries",type="RTR"} 0 +node_interrupts{CPU="3",devices="",info="Function call interrupts",type="CAL"} 155528 +node_interrupts{CPU="3",devices="",info="IRQ work interrupts",type="IWI"} 2.428828e+06 +node_interrupts{CPU="3",devices="",info="Local timer interrupts",type="LOC"} 1.30980079e+08 +node_interrupts{CPU="3",devices="",info="Machine check exceptions",type="MCE"} 0 +node_interrupts{CPU="3",devices="",info="Machine check polls",type="MCP"} 2399 +node_interrupts{CPU="3",devices="",info="Non-maskable interrupts",type="NMI"} 4968 +node_interrupts{CPU="3",devices="",info="Performance monitoring interrupts",type="PMI"} 4968 +node_interrupts{CPU="3",devices="",info="Rescheduling interrupts",type="RES"} 7.45726e+06 +node_interrupts{CPU="3",devices="",info="Spurious interrupts",type="SPU"} 0 +node_interrupts{CPU="3",devices="",info="TLB shootdowns",type="TLB"} 1.0345022e+07 +node_interrupts{CPU="3",devices="",info="Thermal event interrupts",type="TRM"} 0 +node_interrupts{CPU="3",devices="",info="Threshold APIC interrupts",type="THR"} 0 +node_interrupts{CPU="3",devices="acpi",info="IR-IO-APIC-fasteoi",type="9"} 863 +node_interrupts{CPU="3",devices="ahci",info="IR-PCI-MSI-edge",type="43"} 7.492252e+06 +node_interrupts{CPU="3",devices="dmar0",info="DMAR_MSI-edge",type="40"} 0 +node_interrupts{CPU="3",devices="dmar1",info="DMAR_MSI-edge",type="41"} 0 +node_interrupts{CPU="3",devices="ehci_hcd:usb1, mmc0",info="IR-IO-APIC-fasteoi",type="16"} 351412 +node_interrupts{CPU="3",devices="ehci_hcd:usb2",info="IR-IO-APIC-fasteoi",type="23"} 2.644609e+06 +node_interrupts{CPU="3",devices="i8042",info="IR-IO-APIC-edge",type="1"} 28 +node_interrupts{CPU="3",devices="i8042",info="IR-IO-APIC-edge",type="12"} 198 +node_interrupts{CPU="3",devices="i915",info="IR-PCI-MSI-edge",type="44"} 633 +node_interrupts{CPU="3",devices="iwlwifi",info="IR-PCI-MSI-edge",type="46"} 290 +node_interrupts{CPU="3",devices="mei_me",info="IR-PCI-MSI-edge",type="45"} 0 +node_interrupts{CPU="3",devices="rtc0",info="IR-IO-APIC-edge",type="8"} 0 +node_interrupts{CPU="3",devices="snd_hda_intel",info="IR-PCI-MSI-edge",type="47"} 0 +node_interrupts{CPU="3",devices="timer",info="IR-IO-APIC-edge",type="0"} 0 +node_interrupts{CPU="3",devices="xhci_hcd",info="IR-PCI-MSI-edge",type="42"} 2.434308e+06 # HELP node_intr Total number of interrupts serviced. # TYPE node_intr counter node_intr 8.885917e+06 @@ -2552,6 +2666,7 @@ node_scrape_collector_success{collector="entropy"} 1 node_scrape_collector_success{collector="filefd"} 1 node_scrape_collector_success{collector="hwmon"} 1 node_scrape_collector_success{collector="infiniband"} 1 +node_scrape_collector_success{collector="interrupts"} 1 node_scrape_collector_success{collector="ipvs"} 1 node_scrape_collector_success{collector="ksmd"} 1 node_scrape_collector_success{collector="loadavg"} 1 @@ -2660,18 +2775,18 @@ node_xfs_allocation_btree_records_deleted_total{device="sda1"} 0 # HELP node_xfs_allocation_btree_records_inserted_total Number of allocation B-tree records inserted for a filesystem. # TYPE node_xfs_allocation_btree_records_inserted_total counter node_xfs_allocation_btree_records_inserted_total{device="sda1"} 0 -# HELP node_xfs_block_mapping_btree_compares_total Number of block map B-tree compares for a filesystem. -# TYPE node_xfs_block_mapping_btree_compares_total counter -node_xfs_block_mapping_btree_compares_total{device="sda1"} 0 -# HELP node_xfs_block_mapping_btree_lookups_total Number of block map B-tree lookups for a filesystem. -# TYPE node_xfs_block_mapping_btree_lookups_total counter -node_xfs_block_mapping_btree_lookups_total{device="sda1"} 0 -# HELP node_xfs_block_mapping_btree_records_deleted_total Number of block map B-tree records deleted for a filesystem. -# TYPE node_xfs_block_mapping_btree_records_deleted_total counter -node_xfs_block_mapping_btree_records_deleted_total{device="sda1"} 0 -# HELP node_xfs_block_mapping_btree_records_inserted_total Number of block map B-tree records inserted for a filesystem. -# TYPE node_xfs_block_mapping_btree_records_inserted_total counter -node_xfs_block_mapping_btree_records_inserted_total{device="sda1"} 0 +# HELP node_xfs_block_map_btree_compares_total Number of block map B-tree compares for a filesystem. +# TYPE node_xfs_block_map_btree_compares_total counter +node_xfs_block_map_btree_compares_total{device="sda1"} 0 +# HELP node_xfs_block_map_btree_lookups_total Number of block map B-tree lookups for a filesystem. +# TYPE node_xfs_block_map_btree_lookups_total counter +node_xfs_block_map_btree_lookups_total{device="sda1"} 0 +# HELP node_xfs_block_map_btree_records_deleted_total Number of block map B-tree records deleted for a filesystem. +# TYPE node_xfs_block_map_btree_records_deleted_total counter +node_xfs_block_map_btree_records_deleted_total{device="sda1"} 0 +# HELP node_xfs_block_map_btree_records_inserted_total Number of block map B-tree records inserted for a filesystem. +# TYPE node_xfs_block_map_btree_records_inserted_total counter +node_xfs_block_map_btree_records_inserted_total{device="sda1"} 0 # HELP node_xfs_block_mapping_extent_list_compares_total Number of extent list compares for a filesystem. # TYPE node_xfs_block_mapping_extent_list_compares_total counter node_xfs_block_mapping_extent_list_compares_total{device="sda1"} 0 diff --git a/collector/hwmon_linux.go b/collector/hwmon_linux.go index 8e1ee4db..b2c40d56 100644 --- a/collector/hwmon_linux.go +++ b/collector/hwmon_linux.go @@ -24,6 +24,7 @@ import ( "regexp" "strconv" "strings" + "syscall" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" @@ -61,8 +62,8 @@ func cleanMetricName(name string) string { } func addValueFile(data map[string]map[string]string, sensor string, prop string, file string) { - raw, e := ioutil.ReadFile(file) - if e != nil { + raw, err := sysReadFile(file) + if err != nil { return } value := strings.Trim(string(raw), "\n") @@ -74,6 +75,28 @@ func addValueFile(data map[string]map[string]string, sensor string, prop string, data[sensor][prop] = value } +// sysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +func sysReadFile(file string) ([]byte, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + + // On some machines, hwmon drivers are broken and return EAGAIN. This causes + // Go's ioutil.ReadFile implementation to poll forever. + // + // Since we either want to read data or bail immediately, do the simplest + // possible read using syscall directly. + b := make([]byte, 128) + n, err := syscall.Read(int(f.Fd()), b) + if err != nil { + return nil, err + } + + return b[:n], nil +} + // explodeSensorFilename splits a sensor name into _. func explodeSensorFilename(filename string) (ok bool, sensorType string, sensorNum int, sensorProperty string) { matches := hwmonFilenameFormat.FindStringSubmatch(filename) diff --git a/collector/interrupts_linux.go b/collector/interrupts_linux.go index 1ef899c8..63aa694a 100644 --- a/collector/interrupts_linux.go +++ b/collector/interrupts_linux.go @@ -82,7 +82,7 @@ func parseInterrupts(r io.Reader) (map[string]interrupt, error) { } intName := parts[0][:len(parts[0])-1] // remove trailing : intr := interrupt{ - values: parts[1:cpuNum], + values: parts[1 : cpuNum+1], } if _, err := strconv.Atoi(intName); err == nil { // numeral interrupt diff --git a/collector/interrupts_linux_test.go b/collector/interrupts_linux_test.go index f076fe8a..02acb896 100644 --- a/collector/interrupts_linux_test.go +++ b/collector/interrupts_linux_test.go @@ -33,4 +33,8 @@ func TestInterrupts(t *testing.T) { if want, got := "5031", interrupts["NMI"].values[1]; want != got { t.Errorf("want interrupts %s, got %s", want, got) } + + if want, got := "4968", interrupts["NMI"].values[3]; want != got { + t.Errorf("want interrupts %s, got %s", want, got) + } } diff --git a/collector/meminfo_bsd.go b/collector/meminfo_bsd.go index 0c722c24..d8eedb96 100644 --- a/collector/meminfo_bsd.go +++ b/collector/meminfo_bsd.go @@ -39,7 +39,7 @@ func (c *meminfoCollector) getMemInfo() (map[string]float64, error) { {name: "inactive_bytes", mib: "vm.stats.vm.v_inactive_count", conversion: fromPage}, {name: "wired_bytes", mib: "vm.stats.vm.v_wire_count", conversion: fromPage}, {name: "cache_bytes", mib: "vm.stats.vm.v_cache_count", conversion: fromPage}, - {name: "buffer_bytes", mib: "vfs.bufspace"}, + {name: "buffer_bytes", mib: "vfs.bufspace", dataType: bsdSysctlTypeCLong}, {name: "free_bytes", mib: "vm.stats.vm.v_free_count", conversion: fromPage}, {name: "size_bytes", mib: "vm.stats.vm.v_page_count", conversion: fromPage}, {name: "swap_in_bytes_total", mib: "vm.stats.vm.v_swappgsin", conversion: fromPage}, diff --git a/collector/netstat_linux.go b/collector/netstat_linux.go index f16c8cf6..a7e7ac93 100644 --- a/collector/netstat_linux.go +++ b/collector/netstat_linux.go @@ -121,6 +121,12 @@ func parseNetStats(r io.Reader, fileName string) (map[string]map[string]string, func getSNMP6Stats(fileName string) (map[string]map[string]string, error) { file, err := os.Open(fileName) if err != nil { + // On systems with IPv6 disabled, this file won't exist. + // Do nothing. + if os.IsNotExist(err) { + return nil, nil + } + return nil, err } defer file.Close() diff --git a/collector/sysctl_bsd.go b/collector/sysctl_bsd.go index 1aed5530..8fa54b43 100644 --- a/collector/sysctl_bsd.go +++ b/collector/sysctl_bsd.go @@ -35,9 +35,11 @@ const ( bsdSysctlTypeUint32 bsdSysctlType = iota bsdSysctlTypeUint64 bsdSysctlTypeStructTimeval + bsdSysctlTypeCLong ) -// Contains all the info needed to map a single bsd-sysctl to a prometheus value. +// Contains all the info needed to map a single bsd-sysctl to a prometheus +// value. type bsdSysctl struct { // Prometheus name name string @@ -72,42 +74,9 @@ func (b bsdSysctl) Value() (float64, error) { tmp64, err = unix.SysctlUint64(b.mib) tmpf64 = float64(tmp64) case bsdSysctlTypeStructTimeval: - raw, err := unix.SysctlRaw(b.mib) - if err != nil { - return 0, err - } - - /* - * From 10.3-RELEASE sources: - * - * /usr/include/sys/_timeval.h:47 - * time_t tv_sec - * suseconds_t tv_usec - * - * /usr/include/sys/_types.h:60 - * long __suseconds_t - * - * ... architecture dependent, via #ifdef: - * typedef __int64_t __time_t; - * typedef __int32_t __time_t; - */ - if len(raw) != (C.sizeof_time_t + C.sizeof_suseconds_t) { - // Shouldn't get here, unless the ABI changes... - return 0, fmt.Errorf( - "length of bytes received from sysctl (%d) does not match expected bytes (%d)", - len(raw), - C.sizeof_time_t+C.sizeof_suseconds_t, - ) - } - - secondsUp := unsafe.Pointer(&raw[0]) - susecondsUp := uintptr(secondsUp) + C.sizeof_time_t - unix := float64(*(*C.time_t)(secondsUp)) - usec := float64(*(*C.suseconds_t)(unsafe.Pointer(susecondsUp))) - - // This conversion maintains the usec precision. Using - // the time package did not. - tmpf64 = unix + (usec / float64(1000*1000)) + tmpf64, err = b.getStructTimeval() + case bsdSysctlTypeCLong: + tmpf64, err = b.getCLong() } if err != nil { @@ -120,3 +89,69 @@ func (b bsdSysctl) Value() (float64, error) { return tmpf64, nil } + +func (b bsdSysctl) getStructTimeval() (float64, error) { + raw, err := unix.SysctlRaw(b.mib) + if err != nil { + return 0, err + } + + /* + * From 10.3-RELEASE sources: + * + * /usr/include/sys/_timeval.h:47 + * time_t tv_sec + * suseconds_t tv_usec + * + * /usr/include/sys/_types.h:60 + * long __suseconds_t + * + * ... architecture dependent, via #ifdef: + * typedef __int64_t __time_t; + * typedef __int32_t __time_t; + */ + if len(raw) != (C.sizeof_time_t + C.sizeof_suseconds_t) { + // Shouldn't get here, unless the ABI changes... + return 0, fmt.Errorf( + "length of bytes received from sysctl (%d) does not match expected bytes (%d)", + len(raw), + C.sizeof_time_t+C.sizeof_suseconds_t, + ) + } + + secondsUp := unsafe.Pointer(&raw[0]) + susecondsUp := uintptr(secondsUp) + C.sizeof_time_t + unix := float64(*(*C.time_t)(secondsUp)) + usec := float64(*(*C.suseconds_t)(unsafe.Pointer(susecondsUp))) + + // This conversion maintains the usec precision. Using the time + // package did not. + return (unix + (usec / float64(1000*1000))), nil +} + +func (b bsdSysctl) getCLong() (float64, error) { + raw, err := unix.SysctlRaw(b.mib) + if err != nil { + return 0, err + } + + if len(raw) == C.sizeof_long { + return float64(*(*C.long)(unsafe.Pointer(&raw[0]))), nil + } + + if len(raw) == C.sizeof_int { + // This is valid for at least vfs.bufspace, and the default + // long handler - which can clamp longs to 32-bits: + // https://github.com/freebsd/freebsd/blob/releng/10.3/sys/kern/vfs_bio.c#L338 + // https://github.com/freebsd/freebsd/blob/releng/10.3/sys/kern/kern_sysctl.c#L1062 + return float64(*(*C.int)(unsafe.Pointer(&raw[0]))), nil + } + + return 0, fmt.Errorf( + "length of bytes received from sysctl (%d) does not match expected bytes (long: %d), (int: %d)", + len(raw), + C.sizeof_long, + C.sizeof_int, + ) + +} diff --git a/collector/xfs_linux.go b/collector/xfs_linux.go index 8129de70..d1e23991 100644 --- a/collector/xfs_linux.go +++ b/collector/xfs_linux.go @@ -156,24 +156,24 @@ func (c *xfsCollector) updateXFSStats(ch chan<- prometheus.Metric, s *xfs.Stats) value: float64(s.BlockMapping.ExtentListCompares), }, { - name: "block_mapping_btree_lookups_total", + name: "block_map_btree_lookups_total", desc: "Number of block map B-tree lookups for a filesystem.", - value: float64(s.AllocationBTree.Lookups), + value: float64(s.BlockMapBTree.Lookups), }, { - name: "block_mapping_btree_compares_total", + name: "block_map_btree_compares_total", desc: "Number of block map B-tree compares for a filesystem.", - value: float64(s.AllocationBTree.Compares), + value: float64(s.BlockMapBTree.Compares), }, { - name: "block_mapping_btree_records_inserted_total", + name: "block_map_btree_records_inserted_total", desc: "Number of block map B-tree records inserted for a filesystem.", - value: float64(s.AllocationBTree.RecordsInserted), + value: float64(s.BlockMapBTree.RecordsInserted), }, { - name: "block_mapping_btree_records_deleted_total", + name: "block_map_btree_records_deleted_total", desc: "Number of block map B-tree records deleted for a filesystem.", - value: float64(s.AllocationBTree.RecordsDeleted), + value: float64(s.BlockMapBTree.RecordsDeleted), }, } diff --git a/end-to-end-test.sh b/end-to-end-test.sh index c1e45f67..664789e6 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -15,6 +15,7 @@ enabled_collectors=$(cat << COLLECTORS filefd hwmon infiniband + interrupts ipvs ksmd loadavg