From e2dd0e8301f8409bb6dc59e95b36150e4ad3a4da Mon Sep 17 00:00:00 2001 From: "Harper, Jason M" Date: Sat, 4 Jan 2025 11:42:09 -0800 Subject: [PATCH 1/4] assume events not supported on failure --- cmd/metrics/metadata.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/cmd/metrics/metadata.go b/cmd/metrics/metadata.go index efc349e8..71a4a3a3 100644 --- a/cmd/metrics/metadata.go +++ b/cmd/metrics/metadata.go @@ -101,7 +101,7 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem err = fmt.Errorf("failed to retrieve PMU driver version: %v", err) return } - // reduce startup time by running the three perf commands in their own threads + // reduce startup time by running the perf commands in their own threads slowFuncChannel := make(chan error) // perf list go func() { @@ -116,7 +116,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem var err error var output string if metadata.SupportsRefCycles, output, err = getSupportsRefCycles(myTarget, noRoot, perfPath, localTempDir); err != nil { - err = fmt.Errorf("failed to determine if ref_cycles is supported: %v", err) + slog.Warn("failed to determine if ref_cycles is supported, assuming not supported", slog.String("error", err.Error())) + err = nil } else { if !metadata.SupportsRefCycles { slog.Warn("ref-cycles not supported", slog.String("output", output)) @@ -129,7 +130,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem var err error var output string if metadata.SupportsFixedTMA, output, err = getSupportsFixedTMA(myTarget, noRoot, perfPath, localTempDir); err != nil { - err = fmt.Errorf("failed to determine if fixed-counter TMA is supported: %v", err) + slog.Warn("failed to determine if fixed-counter TMA is supported, assuming not supported", slog.String("error", err.Error())) + err = nil } else { if !metadata.SupportsFixedTMA { slog.Warn("Fixed-counter TMA events not supported", slog.String("output", output)) @@ -142,7 +144,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem var err error var output string if metadata.SupportsFixedCycles, output, err = getSupportsFixedEvent(myTarget, "cpu-cycles", cpu.MicroArchitecture, noRoot, perfPath, localTempDir); err != nil { - err = fmt.Errorf("failed to determine if fixed-counter 'cpu-cycles' is supported: %v", err) + slog.Warn("failed to determine if fixed-counter 'cpu-cycles' is supported, assuming not supported", slog.String("error", err.Error())) + err = nil } else { if !metadata.SupportsFixedCycles { slog.Warn("Fixed-counter 'cpu-cycles' events not supported", slog.String("output", output)) @@ -155,7 +158,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem var err error var output string if metadata.SupportsFixedInstructions, output, err = getSupportsFixedEvent(myTarget, "instructions", cpu.MicroArchitecture, noRoot, perfPath, localTempDir); err != nil { - err = fmt.Errorf("failed to determine if fixed-counter 'instructions' is supported: %v", err) + slog.Warn("failed to determine if fixed-counter 'instructions' is supported, assuming not supported", slog.String("error", err.Error())) + err = nil } else { if !metadata.SupportsFixedInstructions { slog.Warn("Fixed-counter 'instructions' events not supported", slog.String("output", output)) @@ -168,7 +172,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem var err error var output string if metadata.SupportsPEBS, output, err = getSupportsPEBS(myTarget, noRoot, perfPath, localTempDir); err != nil { - err = fmt.Errorf("failed to determine if 'PEBS' is supported: %v", err) + slog.Warn("failed to determine if 'PEBS' is supported, assuming not supported", slog.String("error", err.Error())) + err = nil } else { if !metadata.SupportsPEBS { slog.Warn("'PEBS' events not supported", slog.String("output", output)) @@ -181,7 +186,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem var err error var output string if metadata.SupportsOCR, output, err = getSupportsOCR(myTarget, noRoot, perfPath, localTempDir); err != nil { - err = fmt.Errorf("failed to determine if 'OCR' is supported: %v", err) + slog.Warn("failed to determine if 'OCR' is supported, assuming not supported", slog.String("error", err.Error())) + err = nil } else { if !metadata.SupportsOCR { slog.Warn("'OCR' events not supported", slog.String("output", output)) @@ -200,8 +206,8 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem errs = append(errs, <-slowFuncChannel) for _, errInside := range errs { if errInside != nil { - slog.Error("error loading metadata", slog.String("error", errInside.Error()), slog.String("target", myTarget.GetName())) - err = fmt.Errorf("target not supported, see log for details") + slog.Warn("error loading metadata", slog.String("error", errInside.Error()), slog.String("target", myTarget.GetName())) + err = nil //err = fmt.Errorf("target not supported, see log for details") } } }() From 134d6b0cce8b1c84382aae5c635cb4a1a02f738f Mon Sep 17 00:00:00 2001 From: "Harper, Jason M" Date: Sat, 4 Jan 2025 11:46:32 -0800 Subject: [PATCH 2/4] revert --- cmd/metrics/metadata.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/metrics/metadata.go b/cmd/metrics/metadata.go index 71a4a3a3..aa76d1ec 100644 --- a/cmd/metrics/metadata.go +++ b/cmd/metrics/metadata.go @@ -207,7 +207,7 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem for _, errInside := range errs { if errInside != nil { slog.Warn("error loading metadata", slog.String("error", errInside.Error()), slog.String("target", myTarget.GetName())) - err = nil //err = fmt.Errorf("target not supported, see log for details") + err = fmt.Errorf("target not supported, see log for details") } } }() From 2217ddca20c71ba52c6dee26c1bfdc33e374259d Mon Sep 17 00:00:00 2001 From: "Harper, Jason M" Date: Sat, 4 Jan 2025 11:47:17 -0800 Subject: [PATCH 3/4] revert --- cmd/metrics/metadata.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/metrics/metadata.go b/cmd/metrics/metadata.go index aa76d1ec..068fe9fe 100644 --- a/cmd/metrics/metadata.go +++ b/cmd/metrics/metadata.go @@ -206,7 +206,7 @@ func LoadMetadata(myTarget target.Target, noRoot bool, perfPath string, localTem errs = append(errs, <-slowFuncChannel) for _, errInside := range errs { if errInside != nil { - slog.Warn("error loading metadata", slog.String("error", errInside.Error()), slog.String("target", myTarget.GetName())) + slog.Error("error loading metadata", slog.String("error", errInside.Error()), slog.String("target", myTarget.GetName())) err = fmt.Errorf("target not supported, see log for details") } } From 77ccc3e7751dfdd29f889d011b14fb8b62ab7f9d Mon Sep 17 00:00:00 2001 From: "Harper, Jason M" Date: Mon, 6 Jan 2025 11:53:23 -0800 Subject: [PATCH 4/4] don't select event in group if value is NaN for metric --- cmd/metrics/metric.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/metrics/metric.go b/cmd/metrics/metric.go index c40589eb..c47f9656 100644 --- a/cmd/metrics/metric.go +++ b/cmd/metrics/metric.go @@ -159,10 +159,16 @@ func loadMetricBestGroups(metric MetricDefinition, frame EventFrame) (err error) // find group with the greatest number of event names that match the remaining variable names bestGroupIdx := -1 bestMatches := 0 - var matchedNames mapset.Set[string] // := mapset.NewSet([]string{}...) + var matchedNames mapset.Set[string] for groupIdx, group := range frame.EventGroups { groupEventNames := mapset.NewSetFromMapKeys(group.EventValues) intersection := remainingVariableNames.Intersect(groupEventNames) + // if an event value is NaN, remove it from the intersection map with hopes we'll find a better match + for _, name := range intersection.ToSlice() { + if math.IsNaN(group.EventValues[name]) { + intersection.Remove(name) + } + } if intersection.Cardinality() > bestMatches { bestGroupIdx = groupIdx bestMatches = intersection.Cardinality()