diff --git a/.promu.yml b/.promu.yml index aa65811b..b8483c7a 100644 --- a/.promu.yml +++ b/.promu.yml @@ -3,10 +3,11 @@ repository: path: github.com/prometheus/node_exporter build: ldflags: | - -X main.Version={{.Version}} - -X {{repoPath}}/collector.Version={{.Version}} - -X {{repoPath}}/collector.Revision={{.Revision}} - -X {{repoPath}}/collector.Branch={{.Branch}} + -X {{repoPath}}/vendor/github.com/prometheus/common/version.Version={{.Version}} + -X {{repoPath}}/vendor/github.com/prometheus/common/version.Revision={{.Revision}} + -X {{repoPath}}/vendor/github.com/prometheus/common/version.Branch={{.Branch}} + -X {{repoPath}}/vendor/github.com/prometheus/common/version.BuildUser={{user}}@{{host}} + -X {{repoPath}}/vendor/github.com/prometheus/common/version.BuildDate={{date "20060102-15:04:05"}} tarball: files: - LICENSE diff --git a/README.md b/README.md index e53366c9..cbff06a1 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ stat | Exposes various statistics from `/proc/stat`. This includes CPU usage, bo textfile | Exposes statistics read from local disk. The `--collector.textfile.directory` flag must be set. | _any_ time | Exposes the current system time. | _any_ vmstat | Exposes statistics from `/proc/vmstat`. | Linux -version | Exposes node\_exporter version. | _any_ ### Disabled by default diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 1ab0356f..2d949d63 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -365,6 +365,9 @@ node_disk_writes_merged{device="vda"} 2.0711856e+07 # HELP node_entropy_available_bits Bits of available entropy. # TYPE node_entropy_available_bits gauge node_entropy_available_bits 1337 +# 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 +node_exporter_build_info{branch="master",goversion="go1.5.4",revision="252feb6",version="0.12.0rc3"} 1 # 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/version.go b/collector/version.go deleted file mode 100644 index 09aa59f9..00000000 --- a/collector/version.go +++ /dev/null @@ -1,51 +0,0 @@ -// 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. - -package collector - -import ( - "github.com/prometheus/client_golang/prometheus" -) - -var ( - Version string - Revision string - Branch string -) - -type versionCollector struct { - metric *prometheus.GaugeVec -} - -func init() { - Factories["version"] = NewVersionCollector -} - -func NewVersionCollector() (Collector, error) { - metric := prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "node_exporter_build_info", - Help: "A metric with a constant '1' value labeled by version, revision, and branch from which the node_exporter was built.", - }, - []string{"version", "revision", "branch"}, - ) - metric.WithLabelValues(Version, Revision, Branch).Set(1) - return &versionCollector{ - metric: metric, - }, nil -} - -func (c *versionCollector) Update(ch chan<- prometheus.Metric) (err error) { - c.metric.Collect(ch) - return err -} diff --git a/node_exporter.go b/node_exporter.go index 4f64663f..1e5594ad 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -18,6 +18,7 @@ import ( "fmt" "net/http" _ "net/http/pprof" + "os" "sort" "strings" "sync" @@ -25,17 +26,15 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" + "github.com/prometheus/common/version" "github.com/prometheus/node_exporter/collector" ) const ( - defaultCollectors = "conntrack,cpu,diskstats,entropy,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,time,uname,version,vmstat" + defaultCollectors = "conntrack,cpu,diskstats,entropy,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,time,uname,vmstat" ) var ( - // Version of node_exporter. Set at build time. - Version = "0.0.0.dev" - scrapeDurations = prometheus.NewSummaryVec( prometheus.SummaryOpts{ Namespace: collector.Namespace, @@ -114,8 +113,13 @@ func loadCollectors(list string) (map[string]collector.Collector, error) { return collectors, nil } +func init() { + prometheus.MustRegister(version.NewCollector("node_exporter")) +} + func main() { var ( + showVersion = flag.Bool("version", false, "Print version information.") 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(defaultCollectors), "Comma-separated list of collectors to use.") @@ -123,6 +127,14 @@ func main() { ) flag.Parse() + if *showVersion { + fmt.Fprintln(os.Stdout, version.Print("node_exporter")) + os.Exit(0) + } + + log.Infoln("Starting node_exporter", version.Info()) + log.Infoln("Build context", version.BuildContext()) + if *printCollectors { collectorNames := make(sort.StringSlice, 0, len(collector.Factories)) for n := range collector.Factories { @@ -161,7 +173,7 @@ func main() { `)) }) - log.Infof("Starting node_exporter v%s at %s", Version, *listenAddress) + log.Infoln("Listening on", *listenAddress) err = http.ListenAndServe(*listenAddress, nil) if err != nil { log.Fatal(err) diff --git a/vendor/github.com/prometheus/common/version/info.go b/vendor/github.com/prometheus/common/version/info.go new file mode 100644 index 00000000..84489a51 --- /dev/null +++ b/vendor/github.com/prometheus/common/version/info.go @@ -0,0 +1,89 @@ +// Copyright 2016 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. + +package version + +import ( + "bytes" + "fmt" + "runtime" + "strings" + "text/template" + + "github.com/prometheus/client_golang/prometheus" +) + +// Build information. Populated at build-time. +var ( + Version string + Revision string + Branch string + BuildUser string + BuildDate string + GoVersion = runtime.Version() +) + +// NewCollector returns a collector which exports metrics about current version information. +func NewCollector(program string) *prometheus.GaugeVec { + buildInfo := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: program, + Name: "build_info", + Help: fmt.Sprintf( + "A metric with a constant '1' value labeled by version, revision, branch, and goversion from which %s was built.", + program, + ), + }, + []string{"version", "revision", "branch", "goversion"}, + ) + buildInfo.WithLabelValues(Version, Revision, Branch, GoVersion).Set(1) + return buildInfo +} + +// versionInfoTmpl contains the template used by Info. +var versionInfoTmpl = ` +{{.program}}, version {{.version}} (branch: {{.branch}}, revision: {{.revision}}) + build user: {{.buildUser}} + build date: {{.buildDate}} + go version: {{.goVersion}} +` + +// Print returns version information. +func Print(program string) string { + m := map[string]string{ + "program": program, + "version": Version, + "revision": Revision, + "branch": Branch, + "buildUser": BuildUser, + "buildDate": BuildDate, + "goVersion": GoVersion, + } + t := template.Must(template.New("version").Parse(versionInfoTmpl)) + + var buf bytes.Buffer + if err := t.ExecuteTemplate(&buf, "version", m); err != nil { + panic(err) + } + return strings.TrimSpace(buf.String()) +} + +// Info returns version, branch and revision information. +func Info() string { + return fmt.Sprintf("(version=%s, branch=%s, revision=%s)", Version, Branch, Revision) +} + +// BuildContext returns goVersion, buildUser and buildDate information. +func BuildContext() string { + return fmt.Sprintf("(go=%s, user=%s, date=%s)", GoVersion, BuildUser, BuildDate) +} diff --git a/vendor/vendor.json b/vendor/vendor.json index a1c86507..edd27bb7 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -72,6 +72,12 @@ "revision": "0a3005bb37bc411040083a55372e77c405f6464c", "revisionTime": "2016-01-04T14:47:38+01:00" }, + { + "checksumSHA1": "91KYK0SpvkaMJJA2+BcxbVnyRO0=", + "path": "github.com/prometheus/common/version", + "revision": "dd586c1c5abb0be59e60f942c22af711a2008cb4", + "revisionTime": "2016-05-03T22:05:32Z" + }, { "path": "github.com/prometheus/procfs", "revision": "406e5b7bfd8201a36e2bb5f7bdae0b03380c2ce8", @@ -87,5 +93,6 @@ "revision": "833a04a10549a95dc34458c195cbad61bbb6cb4d", "revisionTime": "2015-12-10T17:34:15-08:00" } - ] + ], + "rootPath": "github.com/prometheus/node_exporter" }