diff --git a/.promu.yml b/.promu.yml index 4f03be9d..0f22be33 100644 --- a/.promu.yml +++ b/.promu.yml @@ -4,10 +4,11 @@ repository: build: flags: -a -tags 'netgo static_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/Makefile.COMMON b/Makefile.COMMON deleted file mode 100644 index ac286fd4..00000000 --- a/Makefile.COMMON +++ /dev/null @@ -1,131 +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. - -# THE AUTHORITATIVE VERSION OF THIS MAKEFILE LIVES IN: -# -# https://github.com/prometheus/utils -# -# PLEASE MAKE ANY CHANGES THERE AND PROPAGATE THEM TO ALL PROMETHEUS -# REPOSITORIES THAT ARE USING THIS MAKEFILE. -# -# This file provides common Makefile infrastructure for several Prometheus -# components. This includes make tasks for downloading Go, setting up a -# self-contained build environment, fetching Go dependencies, building -# binaries, running tests, and doing release management. This file is intended -# to be included from a project's Makefile, which needs to define the following -# variables, at a minimum: -# -# * VERSION - The current version of the project in question. -# * TARGET - The desired name of the built binary. -# -# Many of the variables defined below are defined conditionally (using '?'), -# which allows the project's main Makefile to override any of these settings, if -# needed. See also: -# -# https://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors. -# -# The including Makefile may define any number of extra targets that are -# specific to that project. - -VERSION ?= $(error VERSION not set in including Makefile) -TARGET ?= $(error TARGET not set in including Makefile) - -SRC ?= $(shell find . -type f -name "*.go" ! -path "./.build/*") -GOOS ?= $(shell uname | tr A-Z a-z) -GOARCH ?= $(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) - -GO_VERSION ?= 1.5.3 -GOPATH ?= $(CURDIR)/.build/gopath -ROOTPKG ?= github.com/prometheus/$(TARGET) -SELFLINK ?= $(GOPATH)/src/$(ROOTPKG) - -# Check for the correct version of go in the path. If we find it, use it. -# Otherwise, prepare to build go locally. -ifeq ($(shell command -v "go" >/dev/null && go version | sed -e 's/^[^0-9.]*\([0-9.]*\).*/\1/'), $(GO_VERSION)) - GOCC ?= $(shell command -v "go") - GOFMT ?= $(shell command -v "gofmt") - GO ?= GOPATH=$(GOPATH) $(GOCC) -else - GOURL ?= https://golang.org/dl - GOPKG ?= go$(GO_VERSION).$(GOOS)-$(GOARCH).tar.gz - GOROOT ?= $(CURDIR)/.build/go$(GO_VERSION) - GOCC ?= $(GOROOT)/bin/go - GOFMT ?= $(GOROOT)/bin/gofmt - GO ?= GOPATH=$(GOPATH) GOROOT=$(GOROOT) $(GOCC) -endif - -# Use vendored dependencies if available. Otherwise try to download them. -ifneq (,$(wildcard vendor)) - DEPENDENCIES := $(shell find vendor/ -type f -iname '*.go') - GO := GO15VENDOREXPERIMENT=1 $(GO) -else - DEPENDENCIES := dependencies-stamp -endif - -# Never honor GOBIN, should it be set at all. -unexport GOBIN - -SUFFIX ?= $(GOOS)-$(GOARCH) -BINARY ?= $(TARGET) -ARCHIVE ?= $(TARGET)-$(VERSION).$(SUFFIX).tar.gz - -default: $(BINARY) - -$(BINARY): $(GOCC) $(SRC) $(DEPENDENCIES) Makefile Makefile.COMMON | $(SELFLINK) - cd $(SELFLINK) && $(GO) build $(GOFLAGS) -o $@ - -.PHONY: archive -archive: $(ARCHIVE) - -$(ARCHIVE): $(BINARY) - tar -czf $@ $< - -.PHONY: tag -tag: - git tag $(VERSION) - git push --tags - -.PHONY: test -test: $(GOCC) $(DEPENDENCIES) | $(SELFLINK) - cd $(SELFLINK) && $(GO) test $$($(GO) list ./... | grep -v /vendor/) - -.PHONY: format -format: $(GOCC) - find . -iname '*.go' | egrep -v "^\./\.build|./generated|\./vendor|\.(l|y)\.go" | xargs -n1 $(GOFMT) -w -s=true - -.PHONY: clean -clean: - rm -rf $(BINARY) $(ARCHIVE) .build *-stamp - - - -$(GOCC): - @echo Go version $(GO_VERSION) required but not found in PATH. - @echo About to download and install go$(GO_VERSION) to $(GOROOT) - @echo Abort now if you want to manually install it system-wide instead. - @echo - @sleep 5 - mkdir -p .build - # The archive contains a single directory called 'go/'. - curl -L $(GOURL)/$(GOPKG) | tar -C .build -xzf - - rm -rf $(GOROOT) - mv .build/go $(GOROOT) - -$(SELFLINK): - mkdir -p $(dir $@) - ln -s $(CURDIR) $@ - -# Download dependencies if project doesn't vendor them. -dependencies-stamp: $(GOCC) $(SRC) | $(SELFLINK) - $(GO) get -d - touch $@ diff --git a/README.md b/README.md index 16c2ba25..4fc180f4 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,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" }