vitess.io/vitess@v0.16.2/go/vt/servenv/buildinfo.go (about) 1 /* 2 Copyright 2019 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package servenv 18 19 import ( 20 "fmt" 21 "runtime" 22 "strconv" 23 "time" 24 25 "github.com/spf13/pflag" 26 27 "vitess.io/vitess/go/stats" 28 ) 29 30 var ( 31 buildHost = "" 32 buildUser = "" 33 buildTime = "" 34 buildGitRev = "" 35 buildGitBranch = "" 36 jenkinsBuildNumberStr = "" 37 38 // version registers the command line flag to expose build info. 39 version bool 40 ) 41 42 func registerVersionFlag(fs *pflag.FlagSet) { 43 fs.BoolVarP(&version, "version", "v", version, "print binary version") 44 } 45 46 // AppVersion is the struct to store build info. 47 var AppVersion versionInfo 48 49 type versionInfo struct { 50 buildHost string 51 buildUser string 52 buildTime int64 53 buildTimePretty string 54 buildGitRev string 55 buildGitBranch string 56 jenkinsBuildNumber int64 57 goVersion string 58 goOS string 59 goArch string 60 version string 61 } 62 63 // ToStringMap returns the version info as a map[string]string, allowing version 64 // info to be used in things like arbitrary string-tag maps (e.g. tablet tags 65 // in the topo). 66 func (v *versionInfo) ToStringMap() map[string]string { 67 return map[string]string{ 68 "build_host": v.buildHost, 69 "build_user": v.buildUser, 70 "build_time": v.buildTimePretty, 71 "build_git_rev": v.buildGitRev, 72 "build_git_branch": v.buildGitBranch, 73 "go_version": v.goVersion, 74 "goos": v.goOS, 75 "goarch": v.goArch, 76 "version": v.version, 77 } 78 } 79 80 func (v *versionInfo) Print() { 81 fmt.Println(v) 82 } 83 84 func (v *versionInfo) String() string { 85 jenkins := "" 86 if v.jenkinsBuildNumber != 0 { 87 jenkins = fmt.Sprintf(" (Jenkins build %d)", v.jenkinsBuildNumber) 88 } 89 return fmt.Sprintf("Version: %s%s (Git revision %s branch '%s') built on %s by %s@%s using %s %s/%s", 90 v.version, jenkins, v.buildGitRev, v.buildGitBranch, v.buildTimePretty, v.buildUser, v.buildHost, v.goVersion, v.goOS, v.goArch) 91 } 92 93 func (v *versionInfo) MySQLVersion() string { 94 return mySQLServerVersion 95 } 96 97 func init() { 98 t, err := time.Parse(time.UnixDate, buildTime) 99 if buildTime != "" && err != nil { 100 panic(fmt.Sprintf("Couldn't parse build timestamp %q: %v", buildTime, err)) 101 } 102 103 jenkinsBuildNumber, err := strconv.ParseInt(jenkinsBuildNumberStr, 10, 64) 104 if err != nil { 105 jenkinsBuildNumber = 0 106 } 107 108 AppVersion = versionInfo{ 109 buildHost: buildHost, 110 buildUser: buildUser, 111 buildTime: t.Unix(), 112 buildTimePretty: buildTime, 113 buildGitRev: buildGitRev, 114 buildGitBranch: buildGitBranch, 115 jenkinsBuildNumber: jenkinsBuildNumber, 116 goVersion: runtime.Version(), 117 goOS: runtime.GOOS, 118 goArch: runtime.GOARCH, 119 version: versionName, 120 } 121 stats.NewString("BuildHost").Set(AppVersion.buildHost) 122 stats.NewString("BuildUser").Set(AppVersion.buildUser) 123 stats.NewGauge("BuildTimestamp", "build timestamp").Set(AppVersion.buildTime) 124 stats.NewString("BuildGitRev").Set(AppVersion.buildGitRev) 125 stats.NewString("BuildGitBranch").Set(AppVersion.buildGitBranch) 126 stats.NewGauge("BuildNumber", "build number").Set(AppVersion.jenkinsBuildNumber) 127 stats.NewString("GoVersion").Set(AppVersion.goVersion) 128 stats.NewString("GoOS").Set(AppVersion.goOS) 129 stats.NewString("GoArch").Set(AppVersion.goArch) 130 131 buildLabels := []string{"BuildHost", "BuildUser", "BuildTimestamp", "BuildGitRev", "BuildGitBranch", "BuildNumber"} 132 buildValues := []string{ 133 AppVersion.buildHost, 134 AppVersion.buildUser, 135 fmt.Sprintf("%v", AppVersion.buildTime), 136 AppVersion.buildGitRev, 137 AppVersion.buildGitBranch, 138 fmt.Sprintf("%v", AppVersion.jenkinsBuildNumber), 139 } 140 stats.NewGaugesWithMultiLabels("BuildInformation", "build information exposed via label", buildLabels).Set(buildValues, 1) 141 142 OnParse(registerVersionFlag) 143 }