version.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package version
  2. import (
  3. "fmt"
  4. "runtime/debug"
  5. "strings"
  6. )
  7. var (
  8. Version = "dev"
  9. Commit = "unknown"
  10. Date = "unknown"
  11. Dirty = ""
  12. )
  13. func init() {
  14. info, ok := debug.ReadBuildInfo()
  15. if !ok {
  16. return
  17. }
  18. for _, setting := range info.Settings {
  19. switch setting.Key {
  20. case "vcs.revision":
  21. if Commit == "unknown" && setting.Value != "" {
  22. Commit = shortCommit(setting.Value)
  23. }
  24. case "vcs.time":
  25. if Date == "unknown" && setting.Value != "" {
  26. Date = setting.Value
  27. }
  28. case "vcs.modified":
  29. if setting.Value == "true" {
  30. Dirty = "-dirty"
  31. }
  32. }
  33. }
  34. }
  35. func shortCommit(commit string) string {
  36. if len(commit) > 12 {
  37. return commit[:12]
  38. }
  39. return commit
  40. }
  41. func String() string {
  42. v := Version
  43. if v == "" || v == "dev" {
  44. v = Commit
  45. }
  46. if v == "" || v == "unknown" {
  47. v = "dev"
  48. }
  49. if Dirty != "" && !strings.HasSuffix(v, Dirty) {
  50. v += Dirty
  51. }
  52. if Date == "" || Date == "unknown" {
  53. return v
  54. }
  55. return fmt.Sprintf("%s_%s", v, normalizeDate(Date))
  56. }
  57. func normalizeDate(date string) string {
  58. d := strings.TrimSpace(date)
  59. if idx := strings.LastIndexAny(d, "+-"); idx > 0 {
  60. d = d[:idx] + "TZ" + d[idx+1:]
  61. }
  62. d = strings.ReplaceAll(d, "-", "_")
  63. d = strings.ReplaceAll(d, ":", "_")
  64. d = strings.ReplaceAll(d, " ", "_")
  65. return d
  66. }
  67. func PrometheusLabel() string {
  68. return strings.ReplaceAll(String(), "\"", "")
  69. }