From 6d1a4ddb24c156d3337b4f7e995eace0aa1bee32 Mon Sep 17 00:00:00 2001 From: binjip978 Date: Tue, 16 Jun 2020 07:35:51 +0300 Subject: [PATCH] add pool size to entropy collector Signed-off-by: binjip978 --- collector/entropy_linux.go | 34 ++++++++++++++++--- collector/fixtures/e2e-output.txt | 3 ++ .../fixtures/proc/sys/kernel/random/poolsize | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 collector/fixtures/proc/sys/kernel/random/poolsize diff --git a/collector/entropy_linux.go b/collector/entropy_linux.go index e68eb958..848e54e7 100644 --- a/collector/entropy_linux.go +++ b/collector/entropy_linux.go @@ -20,11 +20,14 @@ import ( "github.com/go-kit/kit/log" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/procfs" ) type entropyCollector struct { - entropyAvail *prometheus.Desc - logger log.Logger + fs procfs.FS + entropyAvail *prometheus.Desc + entropyPoolSize *prometheus.Desc + logger log.Logger } func init() { @@ -33,23 +36,44 @@ func init() { // NewEntropyCollector returns a new Collector exposing entropy stats. func NewEntropyCollector(logger log.Logger) (Collector, error) { + fs, err := procfs.NewFS(*procPath) + if err != nil { + return nil, fmt.Errorf("failed to open procfs: %w", err) + } + return &entropyCollector{ + fs: fs, entropyAvail: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "entropy_available_bits"), "Bits of available entropy.", nil, nil, ), + entropyPoolSize: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "entropy_pool_size_bytes"), + "Bytes of entropy pool.", + nil, nil, + ), logger: logger, }, nil } func (c *entropyCollector) Update(ch chan<- prometheus.Metric) error { - value, err := readUintFromFile(procFilePath("sys/kernel/random/entropy_avail")) + stats, err := c.fs.KernelRandom() if err != nil { - return fmt.Errorf("couldn't get entropy_avail: %s", err) + return fmt.Errorf("failed to get kernel random stats: %w", err) + } + + if stats.EntropyAvaliable == nil { + return fmt.Errorf("couldn't get entropy_avail") } ch <- prometheus.MustNewConstMetric( - c.entropyAvail, prometheus.GaugeValue, float64(value)) + c.entropyAvail, prometheus.GaugeValue, float64(*stats.EntropyAvaliable)) + + if stats.PoolSize == nil { + return fmt.Errorf("couldn't get entropy pool size") + } + ch <- prometheus.MustNewConstMetric( + c.entropyPoolSize, prometheus.GaugeValue, float64(*stats.PoolSize)) return nil } diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index df04679d..64f74a08 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -627,6 +627,9 @@ node_edac_uncorrectable_errors_total{controller="0"} 5 # HELP node_entropy_available_bits Bits of available entropy. # TYPE node_entropy_available_bits gauge node_entropy_available_bits 1337 +# HELP node_entropy_pool_size_bytes Bytes of entropy pool. +# TYPE node_entropy_pool_size_bytes gauge +node_entropy_pool_size_bytes 4096 # HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which node_exporter was built. # TYPE node_exporter_build_info gauge # HELP node_filefd_allocated File descriptor statistics: allocated. diff --git a/collector/fixtures/proc/sys/kernel/random/poolsize b/collector/fixtures/proc/sys/kernel/random/poolsize new file mode 100644 index 00000000..801c306e --- /dev/null +++ b/collector/fixtures/proc/sys/kernel/random/poolsize @@ -0,0 +1 @@ +4096