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