Use common/version package
authorSteve Durrheimer <s.durrheimer@gmail.com>
Sat, 14 May 2016 12:17:09 +0000 (14:17 +0200)
committerSteve Durrheimer <s.durrheimer@gmail.com>
Sat, 14 May 2016 19:10:45 +0000 (21:10 +0200)
.promu.yml
main.go
vendor/github.com/prometheus/common/version/info.go [new file with mode: 0644]
vendor/vendor.json

index 48904d50061a047ab4f873d30a0ca9c161cf09a8..3c32f1e1d55941742a5c1fd729511ecfc8d9a00b 100644 (file)
@@ -4,7 +4,11 @@ repository:
 build:
     flags: -a -tags netgo
     ldflags: |
-        -X main.Version={{.Version}}
+        -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:
         - blackbox.yml
diff --git a/main.go b/main.go
index acc8666b17df33e7e75dae37c3acad29223eb4a5..0ef2f118c2845a1b0405a617c76bfe5976032124 100644 (file)
--- a/main.go
+++ b/main.go
@@ -18,6 +18,7 @@ import (
        "fmt"
        "io/ioutil"
        "net/http"
+       "os"
        "time"
 
        "gopkg.in/yaml.v2"
@@ -25,10 +26,14 @@ import (
        "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/common/config"
        "github.com/prometheus/common/log"
+       "github.com/prometheus/common/version"
 )
 
-var addr = flag.String("web.listen-address", ":9115", "The address to listen on for HTTP requests.")
-var configFile = flag.String("config.file", "blackbox.yml", "Blackbox exporter configuration file.")
+var (
+       configFile    = flag.String("config.file", "blackbox.yml", "Blackbox exporter configuration file.")
+       listenAddress = flag.String("web.listen-address", ":9115", "The address to listen on for HTTP requests.")
+       showVersion   = flag.Bool("version", false, "Print version information.")
+)
 
 type Config struct {
        Modules map[string]Module `yaml:"modules"`
@@ -105,9 +110,21 @@ func probeHandler(w http.ResponseWriter, r *http.Request, config *Config) {
        }
 }
 
+func init() {
+       prometheus.MustRegister(version.NewCollector("blackbox_exporter"))
+}
+
 func main() {
        flag.Parse()
 
+       if *showVersion {
+               fmt.Fprintln(os.Stdout, version.Print("blackbox_exporter"))
+               os.Exit(0)
+       }
+
+       log.Infoln("Starting blackbox_exporter", version.Info())
+       log.Infoln("Build context", version.BuildContext())
+
        yamlFile, err := ioutil.ReadFile(*configFile)
 
        if err != nil {
@@ -136,7 +153,9 @@ func main() {
             </body>
             </html>`))
        })
-       if err := http.ListenAndServe(*addr, nil); err != nil {
+
+       log.Infoln("Listening on", *listenAddress)
+       if err := http.ListenAndServe(*listenAddress, nil); err != nil {
                log.Fatalf("Error starting HTTP server: %s", 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 (file)
index 0000000..84489a5
--- /dev/null
@@ -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)
+}
index c770e9dc59aed1011c03736d6f10689e241029f4..7707a948b7cfc07af6861ccf9e2f783044bce5dc 100644 (file)
                        "revision": "167b27da48d058a9b46d84b834d67f68f0243f67",
                        "revisionTime": "2016-03-18T12:23:18Z"
                },
+               {
+                       "checksumSHA1": "91KYK0SpvkaMJJA2+BcxbVnyRO0=",
+                       "path": "github.com/prometheus/common/version",
+                       "revision": "dd586c1c5abb0be59e60f942c22af711a2008cb4",
+                       "revisionTime": "2016-05-03T22:05:32Z"
+               },
                {
                        "path": "github.com/prometheus/procfs",
                        "revision": "406e5b7bfd8201a36e2bb5f7bdae0b03380c2ce8",