aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--collector/fixtures/e2e-output.txt31
-rwxr-xr-xend-to-end-test.sh2
-rw-r--r--node_exporter.go32
3 files changed, 48 insertions, 17 deletions
diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt
index 03cb207..feac6c7 100644
--- a/collector/fixtures/e2e-output.txt
+++ b/collector/fixtures/e2e-output.txt
@@ -457,8 +457,6 @@ node_edac_uncorrectable_errors_total{controller="0"} 5
457node_entropy_available_bits 1337 457node_entropy_available_bits 1337
458# 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. 458# 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.
459# TYPE node_exporter_build_info gauge 459# TYPE node_exporter_build_info gauge
460# HELP node_exporter_scrape_duration_seconds node_exporter: Duration of a scrape job.
461# TYPE node_exporter_scrape_duration_seconds summary
462# HELP node_filefd_allocated File descriptor statistics: allocated. 460# HELP node_filefd_allocated File descriptor statistics: allocated.
463# TYPE node_filefd_allocated gauge 461# TYPE node_filefd_allocated gauge
464node_filefd_allocated 1024 462node_filefd_allocated 1024
@@ -2072,6 +2070,35 @@ node_procs_blocked 0
2072# HELP node_procs_running Number of processes in runnable state. 2070# HELP node_procs_running Number of processes in runnable state.
2073# TYPE node_procs_running gauge 2071# TYPE node_procs_running gauge
2074node_procs_running 2 2072node_procs_running 2
2073# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
2074# TYPE node_scrape_collector_duration_seconds gauge
2075# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
2076# TYPE node_scrape_collector_success gauge
2077node_scrape_collector_success{collector="bonding"} 1
2078node_scrape_collector_success{collector="buddyinfo"} 1
2079node_scrape_collector_success{collector="conntrack"} 1
2080node_scrape_collector_success{collector="diskstats"} 1
2081node_scrape_collector_success{collector="drbd"} 1
2082node_scrape_collector_success{collector="edac"} 1
2083node_scrape_collector_success{collector="entropy"} 1
2084node_scrape_collector_success{collector="filefd"} 1
2085node_scrape_collector_success{collector="hwmon"} 1
2086node_scrape_collector_success{collector="infiniband"} 1
2087node_scrape_collector_success{collector="ksmd"} 1
2088node_scrape_collector_success{collector="loadavg"} 1
2089node_scrape_collector_success{collector="mdadm"} 1
2090node_scrape_collector_success{collector="megacli"} 1
2091node_scrape_collector_success{collector="meminfo"} 1
2092node_scrape_collector_success{collector="meminfo_numa"} 1
2093node_scrape_collector_success{collector="mountstats"} 1
2094node_scrape_collector_success{collector="netdev"} 1
2095node_scrape_collector_success{collector="netstat"} 1
2096node_scrape_collector_success{collector="nfs"} 1
2097node_scrape_collector_success{collector="sockstat"} 1
2098node_scrape_collector_success{collector="stat"} 1
2099node_scrape_collector_success{collector="textfile"} 1
2100node_scrape_collector_success{collector="wifi"} 1
2101node_scrape_collector_success{collector="zfs"} 1
2075# HELP node_sockstat_FRAG_inuse Number of FRAG sockets in state inuse. 2102# HELP node_sockstat_FRAG_inuse Number of FRAG sockets in state inuse.
2076# TYPE node_sockstat_FRAG_inuse gauge 2103# TYPE node_sockstat_FRAG_inuse gauge
2077node_sockstat_FRAG_inuse 0 2104node_sockstat_FRAG_inuse 0
diff --git a/end-to-end-test.sh b/end-to-end-test.sh
index 26a191b..e074556 100755
--- a/end-to-end-test.sh
+++ b/end-to-end-test.sh
@@ -35,7 +35,7 @@ cd "$(dirname $0)"
35port="$((10000 + (RANDOM % 10000)))" 35port="$((10000 + (RANDOM % 10000)))"
36tmpdir=$(mktemp -d /tmp/node_exporter_e2e_test.XXXXXX) 36tmpdir=$(mktemp -d /tmp/node_exporter_e2e_test.XXXXXX)
37 37
38skip_re="^(go_|node_exporter_|process_|node_textfile_mtime)" 38skip_re="^(go_|node_exporter_build_info|node_scrape_collector_duration_seconds|process_|node_textfile_mtime)"
39 39
40keep=0; update=0; verbose=0 40keep=0; update=0; verbose=0
41while getopts 'hkuv' opt 41while getopts 'hkuv' opt
diff --git a/node_exporter.go b/node_exporter.go
index 1028ed8..4a7f88a 100644
--- a/node_exporter.go
+++ b/node_exporter.go
@@ -36,14 +36,17 @@ const (
36) 36)
37 37
38var ( 38var (
39 scrapeDurations = prometheus.NewSummaryVec( 39 scrapeDurationDesc = prometheus.NewDesc(
40 prometheus.SummaryOpts{ 40 prometheus.BuildFQName(collector.Namespace, "scrape", "collector_duration_seconds"),
41 Namespace: collector.Namespace, 41 "node_exporter: Duration of a collector scrape.",
42 Subsystem: "exporter", 42 []string{"collector"},
43 Name: "scrape_duration_seconds", 43 nil,
44 Help: "node_exporter: Duration of a scrape job.", 44 )
45 }, 45 scrapeSuccessDesc = prometheus.NewDesc(
46 []string{"collector", "result"}, 46 prometheus.BuildFQName(collector.Namespace, "scrape", "collector_success"),
47 "node_exporter: Whether a collector succeeded.",
48 []string{"collector"},
49 nil,
47 ) 50 )
48) 51)
49 52
@@ -54,7 +57,8 @@ type NodeCollector struct {
54 57
55// Describe implements the prometheus.Collector interface. 58// Describe implements the prometheus.Collector interface.
56func (n NodeCollector) Describe(ch chan<- *prometheus.Desc) { 59func (n NodeCollector) Describe(ch chan<- *prometheus.Desc) {
57 scrapeDurations.Describe(ch) 60 ch <- scrapeDurationDesc
61 ch <- scrapeSuccessDesc
58} 62}
59 63
60// Collect implements the prometheus.Collector interface. 64// Collect implements the prometheus.Collector interface.
@@ -68,7 +72,6 @@ func (n NodeCollector) Collect(ch chan<- prometheus.Metric) {
68 }(name, c) 72 }(name, c)
69 } 73 }
70 wg.Wait() 74 wg.Wait()
71 scrapeDurations.Collect(ch)
72} 75}
73 76
74func filterAvailableCollectors(collectors string) string { 77func filterAvailableCollectors(collectors string) string {
@@ -86,16 +89,17 @@ func execute(name string, c collector.Collector, ch chan<- prometheus.Metric) {
86 begin := time.Now() 89 begin := time.Now()
87 err := c.Update(ch) 90 err := c.Update(ch)
88 duration := time.Since(begin) 91 duration := time.Since(begin)
89 var result string 92 var success float64
90 93
91 if err != nil { 94 if err != nil {
92 log.Errorf("ERROR: %s collector failed after %fs: %s", name, duration.Seconds(), err) 95 log.Errorf("ERROR: %s collector failed after %fs: %s", name, duration.Seconds(), err)
93 result = "error" 96 success = 0
94 } else { 97 } else {
95 log.Debugf("OK: %s collector succeeded after %fs.", name, duration.Seconds()) 98 log.Debugf("OK: %s collector succeeded after %fs.", name, duration.Seconds())
96 result = "success" 99 success = 1
97 } 100 }
98 scrapeDurations.WithLabelValues(name, result).Observe(duration.Seconds()) 101 ch <- prometheus.MustNewConstMetric(scrapeDurationDesc, prometheus.GaugeValue, duration.Seconds(), name)
102 ch <- prometheus.MustNewConstMetric(scrapeSuccessDesc, prometheus.GaugeValue, success, name)
99} 103}
100 104
101func loadCollectors(list string) (map[string]collector.Collector, error) { 105func loadCollectors(list string) (map[string]collector.Collector, error) {