blob: a6a5a53c0ea7aafc76a4247183ead849c850f8c6 [file] [log] [blame]
Abhay Kumara2ae5992025-11-10 14:02:24 +00001// Copyright The OpenTelemetry Authors
2// SPDX-License-Identifier: Apache-2.0
3
4package resource // import "go.opentelemetry.io/otel/sdk/resource"
5
6import (
7 "fmt"
8 "strconv"
9
10 "golang.org/x/sys/windows/registry"
11)
12
13// platformOSDescription returns a human readable OS version information string.
14// It does so by querying registry values under the
15// `SOFTWARE\Microsoft\Windows NT\CurrentVersion` key. The final string
16// resembles the one displayed by the Version Reporter Applet (winver.exe).
17func platformOSDescription() (string, error) {
18 k, err := registry.OpenKey(
19 registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
20 if err != nil {
21 return "", err
22 }
23
24 defer k.Close()
25
26 var (
27 productName = readProductName(k)
28 displayVersion = readDisplayVersion(k)
29 releaseID = readReleaseID(k)
30 currentMajorVersionNumber = readCurrentMajorVersionNumber(k)
31 currentMinorVersionNumber = readCurrentMinorVersionNumber(k)
32 currentBuildNumber = readCurrentBuildNumber(k)
33 ubr = readUBR(k)
34 )
35
36 if displayVersion != "" {
37 displayVersion += " "
38 }
39
40 return fmt.Sprintf("%s %s(%s) [Version %s.%s.%s.%s]",
41 productName,
42 displayVersion,
43 releaseID,
44 currentMajorVersionNumber,
45 currentMinorVersionNumber,
46 currentBuildNumber,
47 ubr,
48 ), nil
49}
50
51func getStringValue(name string, k registry.Key) string {
52 value, _, _ := k.GetStringValue(name)
53
54 return value
55}
56
57func getIntegerValue(name string, k registry.Key) uint64 {
58 value, _, _ := k.GetIntegerValue(name)
59
60 return value
61}
62
63func readProductName(k registry.Key) string {
64 return getStringValue("ProductName", k)
65}
66
67func readDisplayVersion(k registry.Key) string {
68 return getStringValue("DisplayVersion", k)
69}
70
71func readReleaseID(k registry.Key) string {
72 return getStringValue("ReleaseID", k)
73}
74
75func readCurrentMajorVersionNumber(k registry.Key) string {
76 return strconv.FormatUint(getIntegerValue("CurrentMajorVersionNumber", k), 10)
77}
78
79func readCurrentMinorVersionNumber(k registry.Key) string {
80 return strconv.FormatUint(getIntegerValue("CurrentMinorVersionNumber", k), 10)
81}
82
83func readCurrentBuildNumber(k registry.Key) string {
84 return getStringValue("CurrentBuildNumber", k)
85}
86
87func readUBR(k registry.Key) string {
88 return strconv.FormatUint(getIntegerValue("UBR", k), 10)
89}