diff --git a/AUTHORS.md b/AUTHORS.md index 030d6171..0fafa505 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -35,5 +35,6 @@ The following individuals have contributed code to this repository * Siavash Safi * Stephen Shirley * Steve Durrheimer +* Thorhallur Sverrisson * Tobias Schmidt * Will Rouesnel diff --git a/README.md b/README.md index 33ab0a6f..d70928fc 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ zfs | Exposes [ZFS](http://open-zfs.org/) performance statistics. | [Linux](http Name | Description | OS ---------|-------------|---- bonding | Exposes the number of configured and active slaves of Linux bonding interfaces. | Linux +buddyinfo | Exposes statistics of memory fragments as reported by /proc/buddyinfo. | Linux devstat | Exposes device statistics | Dragonfly, FreeBSD drbd | Exposes Distributed Replicated Block Device statistics | Linux interrupts | Exposes detailed interrupts statistics. | Linux, OpenBSD diff --git a/collector/buddyinfo.go b/collector/buddyinfo.go new file mode 100644 index 00000000..782aceaf --- /dev/null +++ b/collector/buddyinfo.go @@ -0,0 +1,74 @@ +// Copyright 2017 The Prometheus Authors +// Licensed 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. + +// +build !nobuddyinfo +// +build !windows,!netbsd + +package collector + +import ( + "fmt" + "strconv" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/log" + "github.com/prometheus/procfs" +) + +const ( + buddyInfoSubsystem = "buddyinfo" +) + +type buddyinfoCollector struct { + desc *prometheus.Desc +} + +func init() { + Factories["buddyinfo"] = NewBuddyinfoCollector +} + +// NewBuddyinfoCollector returns a new Collector exposing buddyinfo stats. +func NewBuddyinfoCollector() (Collector, error) { + desc := prometheus.NewDesc( + prometheus.BuildFQName(Namespace, buddyInfoSubsystem, "count"), + "Count of free blocks according to size.", + []string{"node", "zone", "size"}, nil, + ) + return &buddyinfoCollector{desc}, nil +} + +// Update calls (*buddyinfoCollector).getBuddyInfo to get the platform specific +// buddyinfo metrics. +func (c *buddyinfoCollector) Update(ch chan<- prometheus.Metric) (err error) { + fs, err := procfs.NewFS(*procPath) + if err != nil { + return fmt.Errorf("failed to open procfs: %v", err) + } + + buddyInfo, err := fs.NewBuddyInfo() + if err != nil { + return fmt.Errorf("couldn't get buddyinfo: %s", err) + } + + log.Debugf("Set node_buddy: %#v", buddyInfo) + for _, entry := range buddyInfo { + for size, value := range entry.Sizes { + ch <- prometheus.MustNewConstMetric( + c.desc, + prometheus.GaugeValue, value, + entry.Node, entry.Zone, strconv.Itoa(size), + ) + } + } + return nil +} diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 9a08a561..b54f35d1 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -82,6 +82,41 @@ node_bonding_slaves{master="int"} 2 # HELP node_boot_time Node boot time, in unixtime. # TYPE node_boot_time gauge node_boot_time 1.418183276e+09 +# HELP node_buddyinfo_count Count of free blocks according to size. +# TYPE node_buddyinfo_count gauge +node_buddyinfo_count{node="0",size="0",zone="DMA"} 1 +node_buddyinfo_count{node="0",size="0",zone="DMA32"} 759 +node_buddyinfo_count{node="0",size="0",zone="Normal"} 4381 +node_buddyinfo_count{node="0",size="1",zone="DMA"} 0 +node_buddyinfo_count{node="0",size="1",zone="DMA32"} 572 +node_buddyinfo_count{node="0",size="1",zone="Normal"} 1093 +node_buddyinfo_count{node="0",size="10",zone="DMA"} 3 +node_buddyinfo_count{node="0",size="10",zone="DMA32"} 0 +node_buddyinfo_count{node="0",size="10",zone="Normal"} 0 +node_buddyinfo_count{node="0",size="2",zone="DMA"} 1 +node_buddyinfo_count{node="0",size="2",zone="DMA32"} 791 +node_buddyinfo_count{node="0",size="2",zone="Normal"} 185 +node_buddyinfo_count{node="0",size="3",zone="DMA"} 0 +node_buddyinfo_count{node="0",size="3",zone="DMA32"} 475 +node_buddyinfo_count{node="0",size="3",zone="Normal"} 1530 +node_buddyinfo_count{node="0",size="4",zone="DMA"} 2 +node_buddyinfo_count{node="0",size="4",zone="DMA32"} 194 +node_buddyinfo_count{node="0",size="4",zone="Normal"} 567 +node_buddyinfo_count{node="0",size="5",zone="DMA"} 1 +node_buddyinfo_count{node="0",size="5",zone="DMA32"} 45 +node_buddyinfo_count{node="0",size="5",zone="Normal"} 102 +node_buddyinfo_count{node="0",size="6",zone="DMA"} 1 +node_buddyinfo_count{node="0",size="6",zone="DMA32"} 12 +node_buddyinfo_count{node="0",size="6",zone="Normal"} 4 +node_buddyinfo_count{node="0",size="7",zone="DMA"} 0 +node_buddyinfo_count{node="0",size="7",zone="DMA32"} 0 +node_buddyinfo_count{node="0",size="7",zone="Normal"} 0 +node_buddyinfo_count{node="0",size="8",zone="DMA"} 1 +node_buddyinfo_count{node="0",size="8",zone="DMA32"} 0 +node_buddyinfo_count{node="0",size="8",zone="Normal"} 0 +node_buddyinfo_count{node="0",size="9",zone="DMA"} 1 +node_buddyinfo_count{node="0",size="9",zone="DMA32"} 0 +node_buddyinfo_count{node="0",size="9",zone="Normal"} 0 # HELP node_context_switches Total number of context switches. # TYPE node_context_switches counter node_context_switches 3.8014093e+07 diff --git a/collector/fixtures/proc/buddyinfo b/collector/fixtures/proc/buddyinfo new file mode 100644 index 00000000..f90594a8 --- /dev/null +++ b/collector/fixtures/proc/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 diff --git a/end-to-end-test.sh b/end-to-end-test.sh index 2e92dad5..39e55413 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -3,6 +3,7 @@ set -euf -o pipefail collectors=$(cat << COLLECTORS + buddyinfo conntrack diskstats drbd