"fmt"
"io/ioutil"
"net/http"
+ "os"
"time"
"gopkg.in/yaml.v2"
"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"`
}
}
+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 {
</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)
}
}
--- /dev/null
+// 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)
+}
"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",