From 0a31eacb3daff1e19a34fc1677f11bca9956f261 Mon Sep 17 00:00:00 2001 From: Max Kotliar Date: Thu, 9 Apr 2026 18:32:47 +0300 Subject: [PATCH] lib/{osinfo,appmetrics}: Move vm_os_info metric code to lib/appmetrics package (#10776) Follow-up commit for https://github.com/VictoriaMetrics/VictoriaMetrics/commit/211fb080289ed43f006598f8dbf5e5df37d6c0ee Address @f41gh7 review comments: - Move code from `lib/osinfo` to `lib/appmetrics`. - Make the logic private. - Use metrics.WriteGaugeUint64 func. - Remove registration logic from `app/xxx/main.go`. - Remove `lib/osinfo` package. --- app/victoria-metrics/main.go | 3 -- app/vmagent/main.go | 2 -- app/vmalert/main.go | 2 -- app/vmauth/main.go | 2 -- app/vmbackup/main.go | 2 -- app/vminsert/main.go | 2 -- app/vmrestore/main.go | 2 -- app/vmselect/main.go | 2 -- app/vmstorage/main.go | 2 -- lib/appmetrics/appmetrics.go | 1 + lib/appmetrics/osmetrics.go | 25 ++++++++++++++++ lib/appmetrics/osmetrics_darwin.go | 20 +++++++++++++ lib/appmetrics/osmetrics_linux.go | 26 ++++++++++++++++ .../osmetrics_other.go} | 5 ++-- lib/appmetrics/osmetrics_windows.go | 19 ++++++++++++ lib/osinfo/info_darwin.go | 24 --------------- lib/osinfo/info_linux.go | 30 ------------------- lib/osinfo/info_windows.go | 21 ------------- 18 files changed, 94 insertions(+), 96 deletions(-) create mode 100644 lib/appmetrics/osmetrics.go create mode 100644 lib/appmetrics/osmetrics_darwin.go create mode 100644 lib/appmetrics/osmetrics_linux.go rename lib/{osinfo/info_other.go => appmetrics/osmetrics_other.go} (51%) create mode 100644 lib/appmetrics/osmetrics_windows.go delete mode 100644 lib/osinfo/info_darwin.go delete mode 100644 lib/osinfo/info_linux.go delete mode 100644 lib/osinfo/info_windows.go diff --git a/app/victoria-metrics/main.go b/app/victoria-metrics/main.go index 09123f7957..1d85ba85dd 100644 --- a/app/victoria-metrics/main.go +++ b/app/victoria-metrics/main.go @@ -19,7 +19,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape" "github.com/VictoriaMetrics/VictoriaMetrics/lib/pushmetrics" @@ -65,8 +64,6 @@ func main() { buildinfo.Init() logger.Init() - osinfo.ExposeAsMetric() - if promscrape.IsDryRun() { *dryRun = true } diff --git a/app/vmagent/main.go b/app/vmagent/main.go index d48a0183b6..1d6058bf52 100644 --- a/app/vmagent/main.go +++ b/app/vmagent/main.go @@ -41,7 +41,6 @@ import ( opentsdbserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/opentsdb" opentsdbhttpserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/opentsdbhttp" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape" "github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/opentelemetry/firehose" @@ -117,7 +116,6 @@ func main() { buildinfo.Init() logger.Init() timeserieslimits.Init(*maxLabelsPerTimeseries, *maxLabelNameLen, *maxLabelValueLen) - osinfo.ExposeAsMetric() if promscrape.IsDryRun() { if err := promscrape.CheckConfig(); err != nil { diff --git a/app/vmalert/main.go b/app/vmalert/main.go index 017a28975c..a509a68f8b 100644 --- a/app/vmalert/main.go +++ b/app/vmalert/main.go @@ -26,7 +26,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/pushmetrics" ) @@ -95,7 +94,6 @@ func main() { notifier.InitSecretFlags() buildinfo.Init() logger.Init() - osinfo.ExposeAsMetric() var err error extURL, err = getExternalURL(*externalURL) diff --git a/app/vmauth/main.go b/app/vmauth/main.go index 599bdb9598..a12b88cc8a 100644 --- a/app/vmauth/main.go +++ b/app/vmauth/main.go @@ -28,7 +28,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/ioutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/netutil" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth" "github.com/VictoriaMetrics/VictoriaMetrics/lib/pushmetrics" @@ -100,7 +99,6 @@ func main() { envflag.Parse() buildinfo.Init() logger.Init() - osinfo.ExposeAsMetric() if *dryRun { if len(*authConfigPath) == 0 { diff --git a/app/vmbackup/main.go b/app/vmbackup/main.go index 763918514f..f3ad57702c 100644 --- a/app/vmbackup/main.go +++ b/app/vmbackup/main.go @@ -19,7 +19,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/pushmetrics" @@ -53,7 +52,6 @@ func main() { envflag.Parse() buildinfo.Init() logger.Init() - osinfo.ExposeAsMetric() ctx, cancel := context.WithCancel(context.Background()) go func() { diff --git a/app/vminsert/main.go b/app/vminsert/main.go index 552be8bb1e..ffcbea5972 100644 --- a/app/vminsert/main.go +++ b/app/vminsert/main.go @@ -37,7 +37,6 @@ import ( influxserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/influx" opentsdbserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/opentsdb" opentsdbhttpserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/opentsdbhttp" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompb" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape" @@ -107,7 +106,6 @@ func Init() { prompush.Push(wr) }) timeserieslimits.Init(*maxLabelsPerTimeseries, *maxLabelNameLen, *maxLabelValueLen) - osinfo.ExposeAsMetric() } // Stop stops vminsert. diff --git a/app/vmrestore/main.go b/app/vmrestore/main.go index 04413e8f39..18b24f2d77 100644 --- a/app/vmrestore/main.go +++ b/app/vmrestore/main.go @@ -15,7 +15,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/pushmetrics" ) @@ -41,7 +40,6 @@ func main() { envflag.Parse() buildinfo.Init() logger.Init() - osinfo.ExposeAsMetric() listenAddrs := []string{*httpListenAddr} go httpserver.Serve(listenAddrs, nil, httpserver.ServeOptions{}) diff --git a/app/vmselect/main.go b/app/vmselect/main.go index 1ec5bf7f1f..c062d341f9 100644 --- a/app/vmselect/main.go +++ b/app/vmselect/main.go @@ -27,7 +27,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/httputil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape" "github.com/VictoriaMetrics/VictoriaMetrics/lib/querytracer" "github.com/VictoriaMetrics/VictoriaMetrics/lib/timerpool" @@ -70,7 +69,6 @@ func Init() { concurrencyLimitCh = make(chan struct{}, *maxConcurrentRequests) initVMUIConfig() initVMAlertProxy() - osinfo.ExposeAsMetric() } // Stop stops vmselect diff --git a/app/vmstorage/main.go b/app/vmstorage/main.go index 79d232bae7..1b46b625f9 100644 --- a/app/vmstorage/main.go +++ b/app/vmstorage/main.go @@ -21,7 +21,6 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/mergeset" - "github.com/VictoriaMetrics/VictoriaMetrics/lib/osinfo" "github.com/VictoriaMetrics/VictoriaMetrics/lib/querytracer" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage/metricnamestats" @@ -173,7 +172,6 @@ func Init(resetCacheIfNeeded func(mrs []storage.MetricRow)) { writeStorageMetrics(w, strg) }) metrics.RegisterSet(storageMetrics) - osinfo.ExposeAsMetric() } var storageMetrics *metrics.Set diff --git a/lib/appmetrics/appmetrics.go b/lib/appmetrics/appmetrics.go index fe9af54d14..1caa16024a 100644 --- a/lib/appmetrics/appmetrics.go +++ b/lib/appmetrics/appmetrics.go @@ -36,6 +36,7 @@ func WritePrometheusMetrics(w io.Writer) { if currentTime.Sub(metricsCacheLastUpdateTime) > time.Second { var bb bytesutil.ByteBuffer writePrometheusMetrics(&bb) + writeOSMetrics(&bb) metricsCache.Store(&bb) metricsCacheLastUpdateTime = currentTime } diff --git a/lib/appmetrics/osmetrics.go b/lib/appmetrics/osmetrics.go new file mode 100644 index 0000000000..11c2665742 --- /dev/null +++ b/lib/appmetrics/osmetrics.go @@ -0,0 +1,25 @@ +package appmetrics + +import ( + "fmt" + "io" + "sync" + + "github.com/VictoriaMetrics/metrics" +) + +type osInfo struct { + name string + release string +} + +var os osInfo +var initOSOnce sync.Once + +func writeOSMetrics(w io.Writer) { + initOSOnce.Do(initOS) + + if os.name != "" { + metrics.WriteGaugeUint64(w, fmt.Sprintf(`vm_os_info{os=%q, release=%q}`, os.name, os.release), 1) + } +} diff --git a/lib/appmetrics/osmetrics_darwin.go b/lib/appmetrics/osmetrics_darwin.go new file mode 100644 index 0000000000..2a4a4f55e3 --- /dev/null +++ b/lib/appmetrics/osmetrics_darwin.go @@ -0,0 +1,20 @@ +package appmetrics + +import ( + "os/exec" + "strings" + + "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" +) + +func initOS() { + os = osInfo{name: "darwin"} + + out, err := exec.Command("sysctl", "-n", "kern.osrelease").Output() + if err != nil { + logger.Warnf("vm_os_info metric will miss release info since exec 'sysctl -n \"kern.osrelease\"' call failed: %s", err) + return + } + + os.release = strings.TrimSpace(string(out)) +} diff --git a/lib/appmetrics/osmetrics_linux.go b/lib/appmetrics/osmetrics_linux.go new file mode 100644 index 0000000000..cba8adf62e --- /dev/null +++ b/lib/appmetrics/osmetrics_linux.go @@ -0,0 +1,26 @@ +package appmetrics + +import ( + "syscall" + + "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" +) + +func initOS() { + os = osInfo{name: "linux"} + + var uname syscall.Utsname + if err := syscall.Uname(&uname); err != nil { + logger.Warnf("vm_os_info metric will miss release info since syscall.Uname failed: %s", err) + return + } + + ur := make([]byte, 0, len(uname.Release)) + for _, v := range uname.Release { + if v == 0 { + break + } + ur = append(ur, byte(v)) + } + os.release = string(ur) +} diff --git a/lib/osinfo/info_other.go b/lib/appmetrics/osmetrics_other.go similarity index 51% rename from lib/osinfo/info_other.go rename to lib/appmetrics/osmetrics_other.go index a13bd9bd58..43cb0ad68e 100644 --- a/lib/osinfo/info_other.go +++ b/lib/appmetrics/osmetrics_other.go @@ -1,5 +1,6 @@ //go:build !linux && !windows && !darwin -package osinfo +package appmetrics -func ExposeAsMetric() {} +func initOS() { +} diff --git a/lib/appmetrics/osmetrics_windows.go b/lib/appmetrics/osmetrics_windows.go new file mode 100644 index 0000000000..650f345d00 --- /dev/null +++ b/lib/appmetrics/osmetrics_windows.go @@ -0,0 +1,19 @@ +package appmetrics + +import ( + "fmt" + + "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" + "golang.org/x/sys/windows" +) + +func initOS() { + os = osInfo{name: "windows"} + + ver := windows.RtlGetVersion() + if ver == nil { + logger.Warnf("vm_os_info metric will miss release info since windows.RtlGetVersion returned nil version") + return + } + os.release = fmt.Sprintf("%d.%d.%d", ver.MajorVersion, ver.MinorVersion, ver.BuildNumber) +} diff --git a/lib/osinfo/info_darwin.go b/lib/osinfo/info_darwin.go deleted file mode 100644 index e509cb4bcf..0000000000 --- a/lib/osinfo/info_darwin.go +++ /dev/null @@ -1,24 +0,0 @@ -package osinfo - -import ( - "fmt" - "os/exec" - "strings" - - "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/metrics" -) - -var darwinRelease string - -func ExposeAsMetric() { - out, err := exec.Command("sysctl", "-n", "kern.osrelease").Output() - if err != nil { - logger.Warnf("os info wont be exposed as vm_os_info metric; exec 'sysctl -n \"kern.osrelease\"' failed: %s", err) - return - } - - darwinRelease = strings.TrimSpace(string(out)) - - _ = metrics.GetOrCreateGauge(fmt.Sprintf(`vm_os_info{os="darwin", release=%q}`, darwinRelease), func() float64 { return 1 }) -} diff --git a/lib/osinfo/info_linux.go b/lib/osinfo/info_linux.go deleted file mode 100644 index c60c5faf18..0000000000 --- a/lib/osinfo/info_linux.go +++ /dev/null @@ -1,30 +0,0 @@ -package osinfo - -import ( - "fmt" - "syscall" - - "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/metrics" -) - -var linuxRelease string - -func ExposeAsMetric() { - var uname syscall.Utsname - if err := syscall.Uname(&uname); err != nil { - logger.Warnf("os info wont be exposed as vm_os_info metric; failed to call syscall.Uname: %s", err) - return - } - - release := make([]byte, 0, len(uname.Release)) - for _, v := range uname.Release { - if v == 0 { - break - } - release = append(release, byte(v)) - } - linuxRelease = string(release) - - _ = metrics.GetOrCreateGauge(fmt.Sprintf(`vm_os_info{os="linux", release=%q}`, linuxRelease), func() float64 { return 1 }) -} diff --git a/lib/osinfo/info_windows.go b/lib/osinfo/info_windows.go deleted file mode 100644 index 473a7608f3..0000000000 --- a/lib/osinfo/info_windows.go +++ /dev/null @@ -1,21 +0,0 @@ -package osinfo - -import ( - "fmt" - - "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" - "github.com/VictoriaMetrics/metrics" - "golang.org/x/sys/windows" -) - -var windowsRelease string - -func ExposeAsMetric() { - ver := windows.RtlGetVersion() - if ver == nil { - logger.Warnf("os info wont be exposed as vm_os_info metric; windows.RtlGetVersion returned nil version") - return - } - windowsRelease = fmt.Sprintf("%d.%d.%d", ver.MajorVersion, ver.MinorVersion, ver.BuildNumber) - _ = metrics.GetOrCreateGauge(fmt.Sprintf(`vm_os_info{os="windows", release=%q}`, windowsRelease), func() float64 { return 1 }) -}