diff --git a/internal/pdh/registry/collector.go b/internal/pdh/registry/collector.go index a868e977..f4200f74 100644 --- a/internal/pdh/registry/collector.go +++ b/internal/pdh/registry/collector.go @@ -53,7 +53,7 @@ func NewCollector[T any](object string, _ []string) (*Collector, error) { counters: make(map[string]Counter), } - valueType := reflect.TypeFor[T]().Elem() + valueType := reflect.TypeFor[T]() if f, ok := valueType.FieldByName("Name"); ok { if f.Type.Kind() == reflect.String { diff --git a/internal/pdh/registry/perflib_test.go b/internal/pdh/registry/perflib_test.go index ecc74359..c3340b4d 100644 --- a/internal/pdh/registry/perflib_test.go +++ b/internal/pdh/registry/perflib_test.go @@ -21,6 +21,22 @@ import ( "testing" ) +// TestNewCollectorStructTypeParam guards against a regression where +// reflect.TypeFor[T]().Elem() panicked when T is a plain struct (not a pointer). +// See https://github.com/prometheus-community/windows_exporter/issues/2365 +func TestNewCollectorStructTypeParam(t *testing.T) { + type systemCounterValues struct { + Name string + + ProcessorQueueLength float64 `perfdata:"Processor Queue Length"` + } + + _, err := NewCollector[systemCounterValues]("System", nil) + if err != nil { + t.Skipf("skipping: failed to create collector: %v", err) + } +} + func BenchmarkQueryPerformanceData(b *testing.B) { for b.Loop() { _, _ = QueryPerformanceData("Global", "")