| package regression |
| |
| import ( |
| "context" |
| "fmt" |
| "math" |
| |
| "go.skia.org/infra/perf/go/alerts" |
| perfgit "go.skia.org/infra/perf/go/git" |
| "go.skia.org/infra/perf/go/git/provider" |
| "go.skia.org/infra/perf/go/stepfit" |
| ) |
| |
| // RegressionFromClusterResponse returns the commit for the regression along with |
| // the *Regression. |
| func RegressionFromClusterResponse(ctx context.Context, resp *RegressionDetectionResponse, cfg *alerts.Alert, perfGit perfgit.Git) (provider.Commit, *Regression, error) { |
| ret := &Regression{} |
| headerLength := len(resp.Frame.DataFrame.Header) |
| midPoint := headerLength / 2 |
| commitNumber := resp.Frame.DataFrame.Header[midPoint].Offset |
| details, err := perfGit.CommitFromCommitNumber(ctx, commitNumber) |
| if err != nil { |
| return perfgit.BadCommit, nil, fmt.Errorf("Failed to look up commit %d: %s", commitNumber, err) |
| } |
| lastLowRegression := float64(-1.0) |
| lastHighRegression := float64(-1.0) |
| for _, cl := range resp.Summary.Clusters { |
| if cl.StepPoint.Offset == commitNumber { |
| if cl.StepFit.Status == stepfit.LOW && len(cl.Keys) >= cfg.MinimumNum && (cfg.DirectionAsString == alerts.DOWN || cfg.DirectionAsString == alerts.BOTH) { |
| if math.Abs(float64(cl.StepFit.Regression)) > lastLowRegression { |
| ret.Frame = resp.Frame |
| ret.Low = cl |
| ret.LowStatus = TriageStatus{ |
| Status: Untriaged, |
| } |
| lastLowRegression = math.Abs(float64(cl.StepFit.Regression)) |
| } |
| } |
| if cl.StepFit.Status == stepfit.HIGH && len(cl.Keys) >= cfg.MinimumNum && (cfg.DirectionAsString == alerts.UP || cfg.DirectionAsString == alerts.BOTH) { |
| if math.Abs(float64(cl.StepFit.Regression)) > lastHighRegression { |
| ret.Frame = resp.Frame |
| ret.High = cl |
| ret.HighStatus = TriageStatus{ |
| Status: Untriaged, |
| } |
| lastHighRegression = math.Abs(float64(cl.StepFit.Regression)) |
| } |
| } |
| } |
| } |
| return details, ret, nil |
| } |