Make version informations consistent between prometheus components

This also fixes #231 by adding the '-version' flag
This commit is contained in:
Steve Durrheimer 2016-04-30 19:58:17 +02:00
parent d890b63fb5
commit 60cbc9efc0
No known key found for this signature in database
GPG Key ID: 8F443EBA70F74839
7 changed files with 122 additions and 62 deletions

View File

@ -3,10 +3,11 @@ repository:
path: github.com/prometheus/node_exporter path: github.com/prometheus/node_exporter
build: build:
ldflags: | ldflags: |
-X main.Version={{.Version}} -X {{repoPath}}/vendor/github.com/prometheus/common/version.Version={{.Version}}
-X {{repoPath}}/collector.Version={{.Version}} -X {{repoPath}}/vendor/github.com/prometheus/common/version.Revision={{.Revision}}
-X {{repoPath}}/collector.Revision={{.Revision}} -X {{repoPath}}/vendor/github.com/prometheus/common/version.Branch={{.Branch}}
-X {{repoPath}}/collector.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: tarball:
files: files:
- LICENSE - LICENSE

View File

@ -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_ textfile | Exposes statistics read from local disk. The `--collector.textfile.directory` flag must be set. | _any_
time | Exposes the current system time. | _any_ time | Exposes the current system time. | _any_
vmstat | Exposes statistics from `/proc/vmstat`. | Linux vmstat | Exposes statistics from `/proc/vmstat`. | Linux
version | Exposes node\_exporter version. | _any_
### Disabled by default ### Disabled by default

View File

@ -365,6 +365,9 @@ node_disk_writes_merged{device="vda"} 2.0711856e+07
# HELP node_entropy_available_bits Bits of available entropy. # HELP node_entropy_available_bits Bits of available entropy.
# TYPE node_entropy_available_bits gauge # TYPE node_entropy_available_bits gauge
node_entropy_available_bits 1337 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. # HELP node_exporter_scrape_duration_seconds node_exporter: Duration of a scrape job.
# TYPE node_exporter_scrape_duration_seconds summary # TYPE node_exporter_scrape_duration_seconds summary
node_exporter_scrape_duration_seconds{collector="bonding",result="success",quantile="0.5"} 7.481600000000001e-05 node_exporter_scrape_duration_seconds{collector="bonding",result="success",quantile="0.5"} 7.481600000000001e-05

View File

@ -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
}

View File

@ -18,6 +18,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
_ "net/http/pprof" _ "net/http/pprof"
"os"
"sort" "sort"
"strings" "strings"
"sync" "sync"
@ -25,17 +26,15 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log" "github.com/prometheus/common/log"
"github.com/prometheus/common/version"
"github.com/prometheus/node_exporter/collector" "github.com/prometheus/node_exporter/collector"
) )
const ( 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 ( var (
// Version of node_exporter. Set at build time.
Version = "0.0.0.dev"
scrapeDurations = prometheus.NewSummaryVec( scrapeDurations = prometheus.NewSummaryVec(
prometheus.SummaryOpts{ prometheus.SummaryOpts{
Namespace: collector.Namespace, Namespace: collector.Namespace,
@ -114,8 +113,13 @@ func loadCollectors(list string) (map[string]collector.Collector, error) {
return collectors, nil return collectors, nil
} }
func init() {
prometheus.MustRegister(version.NewCollector("node_exporter"))
}
func main() { func main() {
var ( 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.") 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.") 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.") enabledCollectors = flag.String("collectors.enabled", filterAvailableCollectors(defaultCollectors), "Comma-separated list of collectors to use.")
@ -123,6 +127,14 @@ func main() {
) )
flag.Parse() 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 { if *printCollectors {
collectorNames := make(sort.StringSlice, 0, len(collector.Factories)) collectorNames := make(sort.StringSlice, 0, len(collector.Factories))
for n := range collector.Factories { for n := range collector.Factories {
@ -161,7 +173,7 @@ func main() {
</html>`)) </html>`))
}) })
log.Infof("Starting node_exporter v%s at %s", Version, *listenAddress) log.Infoln("Listening on", *listenAddress)
err = http.ListenAndServe(*listenAddress, nil) err = http.ListenAndServe(*listenAddress, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

89
vendor/github.com/prometheus/common/version/info.go generated vendored Normal file
View File

@ -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)
}

9
vendor/vendor.json vendored
View File

@ -72,6 +72,12 @@
"revision": "0a3005bb37bc411040083a55372e77c405f6464c", "revision": "0a3005bb37bc411040083a55372e77c405f6464c",
"revisionTime": "2016-01-04T14:47:38+01:00" "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", "path": "github.com/prometheus/procfs",
"revision": "406e5b7bfd8201a36e2bb5f7bdae0b03380c2ce8", "revision": "406e5b7bfd8201a36e2bb5f7bdae0b03380c2ce8",
@ -87,5 +93,6 @@
"revision": "833a04a10549a95dc34458c195cbad61bbb6cb4d", "revision": "833a04a10549a95dc34458c195cbad61bbb6cb4d",
"revisionTime": "2015-12-10T17:34:15-08:00" "revisionTime": "2015-12-10T17:34:15-08:00"
} }
] ],
"rootPath": "github.com/prometheus/node_exporter"
} }