From aee580d8d8fa0b7fe0257d83100878b6915d004f Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Wed, 13 Jan 2016 00:32:50 +0100 Subject: [PATCH] Introduce entropy collector for Linux --- README.md | 1 + collector/entropy_linux.go | 53 +++++++++++++++++++ collector/fixtures/e2e-output.txt | 3 ++ .../proc/sys/kernel/random/entropy_avail | 1 + end-to-end-test.sh | 2 +- node_exporter.go | 2 +- 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 collector/entropy_linux.go create mode 100644 collector/fixtures/proc/sys/kernel/random/entropy_avail diff --git a/README.md b/README.md index 83f6da53..1fb3b359 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Name | Description ---------|------------ conntrack | Shows conntrack statistics (does nothing if no `/proc/sys/net/netfilter/` present). diskstats | Exposes disk I/O statistics from `/proc/diskstats`. +entropy | Exposes available entropy. filefd | Exposes file descriptor statistics. filesystem | Exposes filesystem statistics, such as disk space used. loadavg | Exposes load average. diff --git a/collector/entropy_linux.go b/collector/entropy_linux.go new file mode 100644 index 00000000..ca37c1fb --- /dev/null +++ b/collector/entropy_linux.go @@ -0,0 +1,53 @@ +// Copyright 2015 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 !noentropy + +package collector + +import ( + "fmt" + + "github.com/prometheus/client_golang/prometheus" +) + +type entropyCollector struct { + entropy_avail *prometheus.Desc +} + +func init() { + Factories["entropy"] = NewEntropyCollector +} + +// Takes a prometheus registry and returns a new Collector exposing +// entropy stats +func NewEntropyCollector() (Collector, error) { + return &entropyCollector{ + entropy_avail: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, "", "entropy_avail"), + "Bits of available entropy.", + nil, nil, + ), + }, nil +} + +func (c *entropyCollector) Update(ch chan<- prometheus.Metric) (err error) { + value, err := readUintFromFile(procFilePath("sys/kernel/random/entropy_avail")) + if err != nil { + return fmt.Errorf("couldn't get entropy_avail: %s", err) + } + ch <- prometheus.MustNewConstMetric( + c.entropy_avail, prometheus.GaugeValue, float64(value)) + + return nil +} diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index ab6a7719..d3d45063 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -362,6 +362,9 @@ node_disk_writes_merged{device="mmcblk0p2"} 0 node_disk_writes_merged{device="sda"} 1.1134226e+07 node_disk_writes_merged{device="sr0"} 0 node_disk_writes_merged{device="vda"} 2.0711856e+07 +# HELP node_entropy_avail Bits of available entropy. +# TYPE node_entropy_avail gauge +node_entropy_avail 1337 # HELP node_exporter_scrape_duration_seconds node_exporter: Duration of a scrape job. # TYPE node_exporter_scrape_duration_seconds summary node_exporter_scrape_duration_seconds{collector="bonding",result="success",quantile="0.5"} 7.481600000000001e-05 diff --git a/collector/fixtures/proc/sys/kernel/random/entropy_avail b/collector/fixtures/proc/sys/kernel/random/entropy_avail new file mode 100644 index 00000000..a369ea60 --- /dev/null +++ b/collector/fixtures/proc/sys/kernel/random/entropy_avail @@ -0,0 +1 @@ +1337 diff --git a/end-to-end-test.sh b/end-to-end-test.sh index 0294364d..720772ee 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -42,7 +42,7 @@ fi ./node_exporter \ -collector.procfs="collector/fixtures/proc" \ -collector.sysfs="collector/fixtures/sys" \ - -collectors.enabled="conntrack,diskstats,filefd,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,bonding,megacli" \ + -collectors.enabled="conntrack,diskstats,entropy,filefd,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,bonding,megacli" \ -collector.textfile.directory="collector/fixtures/textfile/two_metric_files/" \ -collector.megacli.command="collector/fixtures/megacli" \ -web.listen-address "127.0.0.1:${port}" \ diff --git a/node_exporter.go b/node_exporter.go index 330de34c..c9b9f1e6 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -39,7 +39,7 @@ var ( listenAddress = flag.String("web.listen-address", ":9100", "Address on which to expose metrics and web interface.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") enabledCollectors = flag.String("collectors.enabled", - filterAvailableCollectors("conntrack,diskstats,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,time,uname,version,vmstat"), + filterAvailableCollectors("conntrack,diskstats,entropy,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,time,uname,version,vmstat"), "Comma-separated list of collectors to use.") printCollectors = flag.Bool("collectors.print", false, "If true, print available collectors and exit.")