@@ -21,6 +21,7 @@ import (
2121 "fmt"
2222 "path/filepath"
2323 "regexp"
24+ "strings"
2425 "syscall"
2526
2627 "github.com/prometheus/procfs/internal/util"
@@ -31,6 +32,10 @@ const (
3132 deviceDriverAMDGPU = "amdgpu"
3233)
3334
35+ var (
36+ hwmonInvalidMetricChars = regexp .MustCompile ("[^a-z0-9:_]" )
37+ )
38+
3439// ClassDRMCardAMDGPUStats contains info from files in
3540// /sys/class/drm/card<card>/device for a single amdgpu card.
3641// Not all cards expose all metrics.
@@ -47,6 +52,38 @@ type ClassDRMCardAMDGPUStats struct {
4752 MemoryVRAMVendor string // The VRAM vendor name.
4853 PowerDPMForcePerformanceLevel string // The current power performance level.
4954 UniqueID string // The unique ID of the GPU that will persist from machine to machine.
55+ HWmonChip string // The hwmon chip.
56+ }
57+
58+ func cleanChipName (name string ) string {
59+ lower := strings .ToLower (name )
60+ replaced := hwmonInvalidMetricChars .ReplaceAllLiteralString (lower , "_" )
61+ cleaned := strings .Trim (replaced , "_" )
62+ return cleaned
63+ }
64+
65+ func readHWmonChip (dir string ) (string , error ) {
66+ // generate a name for a sensor path
67+ // construct a name based on device name, always unique
68+ // can be used to relate to hwmon sensor metrics
69+ devicePath , devErr := filepath .EvalSymlinks (filepath .Join (dir , "device" ))
70+ if devErr == nil {
71+ devPathPrefix , devName := filepath .Split (devicePath )
72+ _ , devType := filepath .Split (strings .TrimRight (devPathPrefix , "/" ))
73+
74+ cleanDevName := cleanChipName (devName )
75+ cleanDevType := cleanChipName (devType )
76+
77+ if cleanDevType != "" && cleanDevName != "" {
78+ return cleanDevType + "_" + cleanDevName , nil
79+ }
80+
81+ if cleanDevName != "" {
82+ return cleanDevName , nil
83+ }
84+ }
85+
86+ return "" , devErr
5087}
5188
5289// ClassDRMCardAMDGPUStats returns DRM card metrics for all amdgpu cards.
@@ -117,6 +154,9 @@ func parseClassDRMAMDGPUCard(card string) (ClassDRMCardAMDGPUStats, error) {
117154 if v , err := readDRMCardField (card , "unique_id" ); err == nil {
118155 stats .UniqueID = v
119156 }
157+ if v , err := readHWmonChip (card ); err == nil {
158+ stats .HWmonChip = v
159+ }
120160
121161 return stats , nil
122162}
0 commit comments