From b594b7491f7ca00910dee44739946d69aa5e0143 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 6 Apr 2026 09:22:05 +0200 Subject: [PATCH] chore: systematic syncthing_build_info metric Signed-off-by: Jakob Borg --- cmd/infra/stcrashreceiver/main.go | 2 ++ cmd/infra/strelaypoolsrv/main.go | 3 +++ cmd/infra/stupgrades/main.go | 3 +++ cmd/infra/ursrv/main.go | 3 +++ cmd/stdiscosrv/main.go | 3 --- cmd/stdiscosrv/stats.go | 10 +--------- lib/build/build.go | 25 ++++++++++++++++++++++++- test/h2/config.xml | 2 +- 8 files changed, 37 insertions(+), 14 deletions(-) diff --git a/cmd/infra/stcrashreceiver/main.go b/cmd/infra/stcrashreceiver/main.go index 4fcd1b8a5..315bcd0ea 100644 --- a/cmd/infra/stcrashreceiver/main.go +++ b/cmd/infra/stcrashreceiver/main.go @@ -101,6 +101,8 @@ func main() { } log.SetOutput(os.Stdout) + log.Println(build.LongVersionFor("stcrashreceiver")) + if err := http.ListenAndServe(params.Listen, mux); err != nil { log.Fatalln("HTTP serve:", err) } diff --git a/cmd/infra/strelaypoolsrv/main.go b/cmd/infra/strelaypoolsrv/main.go index be1bab339..dd61dab8e 100644 --- a/cmd/infra/strelaypoolsrv/main.go +++ b/cmd/infra/strelaypoolsrv/main.go @@ -27,6 +27,7 @@ import ( "github.com/syncthing/syncthing/cmd/infra/strelaypoolsrv/auto" "github.com/syncthing/syncthing/lib/assets" + "github.com/syncthing/syncthing/lib/build" "github.com/syncthing/syncthing/lib/geoip" "github.com/syncthing/syncthing/lib/protocol" "github.com/syncthing/syncthing/lib/rand" @@ -146,6 +147,8 @@ func main() { flag.Parse() + log.Println(build.LongVersionFor("strelaypoolsrv")) + requests = make(chan request, requestQueueLen) geoip, err := geoip.NewGeoLite2CityProvider(context.Background(), geoipAccountID, geoipLicenseKey, os.TempDir()) if err != nil { diff --git a/cmd/infra/stupgrades/main.go b/cmd/infra/stupgrades/main.go index 8d18506c2..8bdb73bf3 100644 --- a/cmd/infra/stupgrades/main.go +++ b/cmd/infra/stupgrades/main.go @@ -25,6 +25,7 @@ import ( "github.com/alecthomas/kong" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/syncthing/syncthing/internal/slogutil" + "github.com/syncthing/syncthing/lib/build" "github.com/syncthing/syncthing/lib/httpcache" "github.com/syncthing/syncthing/lib/upgrade" ) @@ -44,6 +45,8 @@ func main() { Level: slog.LevelInfo, }))) + slog.Info(build.LongVersionFor("stupgrades")) + if err := server(¶ms); err != nil { fmt.Printf("Error: %v\n", err) os.Exit(1) diff --git a/cmd/infra/ursrv/main.go b/cmd/infra/ursrv/main.go index 2634edfb3..352a056f9 100644 --- a/cmd/infra/ursrv/main.go +++ b/cmd/infra/ursrv/main.go @@ -13,6 +13,7 @@ import ( "github.com/alecthomas/kong" "github.com/syncthing/syncthing/cmd/infra/ursrv/serve" + "github.com/syncthing/syncthing/lib/build" ) type CLI struct { @@ -24,6 +25,8 @@ func main() { Level: slog.LevelInfo, }))) + slog.Info(build.LongVersionFor("ursrv")) + var cli CLI ctx := kong.Parse(&cli) if err := ctx.Run(); err != nil { diff --git a/cmd/stdiscosrv/main.go b/cmd/stdiscosrv/main.go index a02455f7e..e6812cf43 100644 --- a/cmd/stdiscosrv/main.go +++ b/cmd/stdiscosrv/main.go @@ -14,7 +14,6 @@ import ( "net/http" "os" "os/signal" - "runtime" "time" "github.com/alecthomas/kong" @@ -96,8 +95,6 @@ func main() { } slog.Info(build.LongVersionFor("stdiscosrv")) - buildInfo.WithLabelValues(build.Version, runtime.Version(), build.User, build.Date.UTC().Format("2006-01-02T15:04:05Z")).Set(1) - var cert tls.Certificate if !cli.HTTP { var err error diff --git a/cmd/stdiscosrv/stats.go b/cmd/stdiscosrv/stats.go index 619a4ba32..ddc062d19 100644 --- a/cmd/stdiscosrv/stats.go +++ b/cmd/stdiscosrv/stats.go @@ -11,14 +11,6 @@ import ( ) var ( - buildInfo = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Namespace: "syncthing", - Subsystem: "discovery", - Name: "build_info", - Help: "A metric with a constant '1' value labeled by version, goversion, builduser and builddate from which stdiscosrv was built.", - }, []string{"version", "goversion", "builduser", "builddate"}) - apiRequestsTotal = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: "syncthing", @@ -132,7 +124,7 @@ const ( ) func init() { - prometheus.MustRegister(buildInfo, + prometheus.MustRegister( apiRequestsTotal, apiRequestsSeconds, lookupRequestsTotal, announceRequestsTotal, replicationSendsTotal, replicationRecvsTotal, diff --git a/lib/build/build.go b/lib/build/build.go index e2a60e9e2..f4908ea9e 100644 --- a/lib/build/build.go +++ b/lib/build/build.go @@ -16,8 +16,18 @@ import ( "strconv" "strings" "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) +var buildInfo = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: "syncthing", + Subsystem: "build", + Name: "info", + Help: "A metric with a constant '1' value labeled by version information from when the binary was built.", +}, []string{"program", "version", "codename", "goversion", "builduser", "builddate", "tags"}) + const Codename = "Hafnium Hornet" var ( @@ -98,9 +108,22 @@ func LongVersionFor(program string) string { date := Date.UTC().Format("2006-01-02 15:04:05 MST") v := fmt.Sprintf(`%s %s "%s" (%s %s-%s) %s@%s %s`, program, Version, Codename, runtime.Version(), runtime.GOOS, runtime.GOARCH, User, Host, date) - if tags := TagsList(); len(tags) > 0 { + tags := TagsList() + if len(tags) > 0 { v = fmt.Sprintf("%s [%s]", v, strings.Join(tags, ", ")) } + + buildInfo.Reset() + buildInfo.With(prometheus.Labels{ + "program": program, + "version": Version, + "codename": Codename, + "goversion": runtime.Version(), + "builduser": fmt.Sprintf("%s@%s", User, Host), + "builddate": Date.UTC().Format("2006-01-02 15:04:05 MST"), + "tags": strings.Join(tags, ","), + }).Set(1) + return v } diff --git a/test/h2/config.xml b/test/h2/config.xml index e91d6d633..123eac79c 100644 --- a/test/h2/config.xml +++ b/test/h2/config.xml @@ -1,4 +1,4 @@ - + basic