os: include installation type in Windows version retrieval (#2217)

This commit is contained in:
Jan-Otto Kröpke
2025-09-26 12:27:31 +02:00
committed by GitHub
parent 1394f2399d
commit bbe0d1aba7
2 changed files with 19 additions and 13 deletions

View File

@@ -17,7 +17,7 @@ None
| Name | Description | Type | Labels | | Name | Description | Type | Labels |
|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|------------------------------------------------------------------------| |-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|------------------------------------------------------------------------|
| `windows_os_hostname` | Labelled system hostname information as provided by ComputerSystem.DNSHostName and ComputerSystem.Domain | gauge | `domain`, `fqdn`, `hostname` | | `windows_os_hostname` | Labelled system hostname information as provided by ComputerSystem.DNSHostName and ComputerSystem.Domain | gauge | `domain`, `fqdn`, `hostname` |
| `windows_os_info` | Contains full product name & version in labels. Note that the `major_version` for Windows 11 is "10"; a build number greater than 22000 represents Windows 11. | gauge | `product`, `version`, `major_version`, `minor_version`, `build_number` | | `windows_os_info` | Contains full product name & version in labels. Note that the `major_version` for Windows 11 is "10"; a build number greater than 22000 represents Windows 11. | gauge | `product`, `version`, `major_version`, `minor_version`, `build_number`, `installation_type`|
### Example metric ### Example metric

View File

@@ -73,7 +73,7 @@ func (c *Collector) Close() error {
} }
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
productName, revision, err := c.getWindowsVersion() productName, revision, installationType, err := c.getWindowsVersion()
if err != nil { if err != nil {
return fmt.Errorf("failed to get Windows version: %w", err) return fmt.Errorf("failed to get Windows version: %w", err)
} }
@@ -90,12 +90,13 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
`Contains full product name & version in labels. Note that the "major_version" for Windows 11 is \"10\"; a build number greater than 22000 represents Windows 11.`, `Contains full product name & version in labels. Note that the "major_version" for Windows 11 is \"10\"; a build number greater than 22000 represents Windows 11.`,
nil, nil,
prometheus.Labels{ prometheus.Labels{
"product": productName, "product": productName,
"version": version.String(), "version": version.String(),
"major_version": strconv.FormatUint(uint64(version.MajorVersion), 10), "major_version": strconv.FormatUint(uint64(version.MajorVersion), 10),
"minor_version": strconv.FormatUint(uint64(version.MinorVersion), 10), "minor_version": strconv.FormatUint(uint64(version.MinorVersion), 10),
"build_number": strconv.FormatUint(uint64(version.Build), 10), "build_number": strconv.FormatUint(uint64(version.Build), 10),
"revision": revision, "revision": revision,
"installation_type": installationType,
}, },
) )
@@ -159,11 +160,11 @@ func (c *Collector) collectHostname(ch chan<- prometheus.Metric) error {
return nil return nil
} }
func (c *Collector) getWindowsVersion() (string, string, error) { func (c *Collector) getWindowsVersion() (string, string, string, error) {
// Get build number and product name from registry // Get build number and product name from registry
ntKey, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) ntKey, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
if err != nil { if err != nil {
return "", "", fmt.Errorf("failed to open registry key: %w", err) return "", "", "", fmt.Errorf("failed to open registry key: %w", err)
} }
defer func(ntKey registry.Key) { defer func(ntKey registry.Key) {
@@ -172,15 +173,20 @@ func (c *Collector) getWindowsVersion() (string, string, error) {
productName, _, err := ntKey.GetStringValue("ProductName") productName, _, err := ntKey.GetStringValue("ProductName")
if err != nil { if err != nil {
return "", "", err return "", "", "", err
}
installationType, _, err := ntKey.GetStringValue("InstallationType")
if err != nil {
return "", "", "", err
} }
revision, _, err := ntKey.GetIntegerValue("UBR") revision, _, err := ntKey.GetIntegerValue("UBR")
if errors.Is(err, registry.ErrNotExist) { if errors.Is(err, registry.ErrNotExist) {
revision = 0 revision = 0
} else if err != nil { } else if err != nil {
return "", "", err return "", "", "", err
} }
return strings.TrimSpace(productName), strconv.FormatUint(revision, 10), nil return strings.TrimSpace(productName), strconv.FormatUint(revision, 10), strings.TrimSpace(installationType), nil
} }