diff --git a/lib/buildinfo/buildinfo.go b/lib/buildinfo/buildinfo.go index 2599271e8..5008dceb4 100644 --- a/lib/buildinfo/buildinfo.go +++ b/lib/buildinfo/buildinfo.go @@ -2,6 +2,9 @@ package buildinfo import ( "context" + "debug/elf" + "debug/macho" + "os" "runtime/debug" "strings" "time" @@ -32,6 +35,7 @@ func Instrument(ctx context.Context) { "version", version, "git_commit", commit, "git_timestamp", timestamp, + "arch", getArch(), ) versionGauge.WithLabelValues(version).Set(1) @@ -96,3 +100,27 @@ func get() (hash string, timestamp string) { //nolint:nonamedreturns // Disambig return hash, timestamp } + +// getArch returns the running binary's architecture. +// This is best effort. It may not work on all platforms. +func getArch() string { + path, err := os.Executable() + if err != nil { + return "unknown" + } + + if f, err := elf.Open(path); err == nil { + return f.Machine.String() + } else if f, err := macho.Open(path); err == nil { + return f.Cpu.String() + } else if f, err := macho.OpenFat(path); err == nil { + var arches []string + for _, a := range f.Arches { + arches = append(arches, a.Cpu.String()) + } + + return strings.Join(arches, ",") + } + + return "unknown" +}