Revert "[perf] Add support for absolute and percentage alerts."
This reverts commit 2a74dcaf2a3eb86206dfd53c8c70727249033935.
Reason for revert: This is the wrong way to accomplish this. New CL incoming.
Original change's description:
> [perf] Add support for absolute and percentage alerts.
>
> Bug: skia:8521
> Change-Id: Id2f70207b570551434ac7354cb052bc474712412
> Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/264639
> Reviewed-by: Ravi Mistry <rmistry@google.com>
> Commit-Queue: Joe Gregorio <jcgregorio@google.com>
TBR=rmistry@google.com,jcgregorio@google.com
Change-Id: Iad03d63fc347c7eb7887f0a1289fbd62f664b380
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:8521
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/265036
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
Commit-Queue: Joe Gregorio <jcgregorio@google.com>
diff --git a/perf/Makefile b/perf/Makefile
index f5fa4fd..9114306 100644
--- a/perf/Makefile
+++ b/perf/Makefile
@@ -1,7 +1,6 @@
.PHONY: build
-build:
+build: web ingest_json_validator
go install -v ./go/...
- npx webpack-cli --mode=production
buildk: web
CGO_ENABLED=0 GOOS=linux go install -a ./go/skiaperf
diff --git a/perf/go/absolute/absolute.go b/perf/go/absolute/absolute.go
deleted file mode 100644
index 636ea8b..0000000
--- a/perf/go/absolute/absolute.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package absolute
-
-import (
- "go.skia.org/infra/go/sklog"
- "go.skia.org/infra/go/vec32"
- "go.skia.org/infra/perf/go/stepfit"
-)
-
-// GetStepFitAtMid takes one []float32 trace and calculates and returns a
-// StepFit.
-//
-// See StepFit for a description of the values being calculated.
-//
-// If percent is true then use delta as a percent difference, otherwise use
-// delta as an absolute difference between to two means.
-func GetStepFitAtMid(trace []float32, delta float32, percent bool) *stepfit.StepFit {
- stepSize := float32(0)
-
- i := len(trace) / 2
- y0 := vec32.Mean(trace[:i])
- y1 := vec32.Mean(trace[i:])
-
- if y0 != y1 {
- if percent {
- y := vec32.Mean(trace)
- stepSize = (y0 - y1) / (y)
- } else {
- stepSize = (y0 - y1)
- }
- sklog.Warningf("stepSize: %f", stepSize)
- }
- status := stepfit.UNINTERESTING
- if stepSize >= delta {
- status = stepfit.LOW
- } else if stepSize <= -delta {
- status = stepfit.HIGH
- }
- return &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: stepSize,
- TurningPoint: i,
- Regression: stepSize,
- Status: status,
- }
-}
diff --git a/perf/go/absolute/absolute_test.go b/perf/go/absolute/absolute_test.go
deleted file mode 100644
index 7330df6..0000000
--- a/perf/go/absolute/absolute_test.go
+++ /dev/null
@@ -1,151 +0,0 @@
-package absolute
-
-import (
- "reflect"
- "testing"
-
- "go.skia.org/infra/go/testutils/unittest"
- "go.skia.org/infra/perf/go/stepfit"
-)
-
-func TestGetStepFitAtMid(t *testing.T) {
- unittest.SmallTest(t)
- type args struct {
- trace []float32
- delta float32
- percent bool
- }
- tests := []struct {
- name string
- args args
- want *stepfit.StepFit
- }{
- {
- name: "No step - absolute",
- args: args{
- trace: []float32{1, 2, 1, 2},
- delta: 1.0,
- percent: false,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: 0,
- TurningPoint: 2,
- Regression: 0,
- Status: stepfit.UNINTERESTING,
- },
- },
- {
- name: "No step - percent",
- args: args{
- trace: []float32{1, 2, 1, 2},
- delta: 1.0,
- percent: true,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: 0,
- TurningPoint: 2,
- Regression: 0,
- Status: stepfit.UNINTERESTING,
- },
- },
- {
- name: "Step - absolute - exact",
- args: args{
- trace: []float32{1, 1, 2, 2},
- delta: 1.0,
- percent: false,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: -1.0,
- TurningPoint: 2,
- Regression: -1.0,
- Status: stepfit.HIGH,
- },
- },
- {
- name: "No step - absolute - too small",
- args: args{
- trace: []float32{1, 1, 1.5, 1.5},
- delta: 1.0,
- percent: false,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: -0.5,
- TurningPoint: 2,
- Regression: -0.5,
- Status: stepfit.UNINTERESTING,
- },
- },
- {
- name: "Step - absolute - big - odd",
- args: args{
- trace: []float32{1, 1, 4, 4, 4},
- delta: 1.0,
- percent: false,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: -3,
- TurningPoint: 2,
- Regression: -3,
- Status: stepfit.HIGH,
- },
- },
- {
- name: "Step - percent - big - odd",
- args: args{
- trace: []float32{1, 1, 4, 4, 4, 4},
- delta: 0.10,
- percent: true,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: -2.0 / 3.0,
- TurningPoint: 3,
- Regression: -2.0 / 3.0,
- Status: stepfit.HIGH,
- },
- },
- {
- name: "Empty absolute",
- args: args{
- trace: []float32{},
- delta: 0.10,
- percent: false,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: 0,
- TurningPoint: 0,
- Regression: 0,
- Status: stepfit.UNINTERESTING,
- },
- },
- {
- name: "Empty percent",
- args: args{
- trace: []float32{},
- delta: 0.10,
- percent: false,
- },
- want: &stepfit.StepFit{
- LeastSquares: 0,
- StepSize: 0,
- TurningPoint: 0,
- Regression: 0,
- Status: stepfit.UNINTERESTING,
- },
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- if got := GetStepFitAtMid(tt.args.trace, tt.args.delta, tt.args.percent); !reflect.DeepEqual(got, tt.want) {
- t.Errorf("GetStepFitAtMid() = %v, want %v", got, tt.want)
- }
- })
- }
-}
diff --git a/perf/go/regression/async.go b/perf/go/regression/async.go
index 9781ae5..491f983 100644
--- a/perf/go/regression/async.go
+++ b/perf/go/regression/async.go
@@ -69,7 +69,6 @@
TZ string `json:"tz"`
Algo types.ClusterAlgo `json:"algo"`
Interesting float32 `json:"interesting"`
- Delta float32 `json:"delta"` // Used by both absolute and percent Algos.
Sparse bool `json:"sparse"`
Type ClusterRequestType `json:"type"`
N int32 `json:"n"`
@@ -373,12 +372,7 @@
case types.KMEANS_ALGO:
summary, err = clustering2.CalculateClusterSummaries(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting)
case types.STEPFIT_ALGO:
- summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting, p.request.Algo)
- case types.ABSOLUTE_ALGO:
- summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting, p.request.Algo)
- case types.PERCENT_ALGO:
- summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting, p.request.Algo)
-
+ summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting)
default:
p.reportError(skerr.Fmt("Invalid type of clustering: %s", p.request.Algo), "Invalid type of clustering.")
}
diff --git a/perf/go/regression/stepfit.go b/perf/go/regression/stepfit.go
index f22fbc9..da6bc30 100644
--- a/perf/go/regression/stepfit.go
+++ b/perf/go/regression/stepfit.go
@@ -3,16 +3,14 @@
import (
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/go/vec32"
- "go.skia.org/infra/perf/go/absolute"
"go.skia.org/infra/perf/go/clustering2"
"go.skia.org/infra/perf/go/config"
"go.skia.org/infra/perf/go/dataframe"
"go.skia.org/infra/perf/go/stepfit"
- "go.skia.org/infra/perf/go/types"
)
// StepFit finds regressions by looking at each trace individually and seeing if that looks like a regression.
-func StepFit(df *dataframe.DataFrame, k int, stddevThreshold float32, progress clustering2.Progress, interesting float32, algo types.ClusterAlgo) (*clustering2.ClusterSummaries, error) {
+func StepFit(df *dataframe.DataFrame, k int, stddevThreshold float32, progress clustering2.Progress, interesting float32) (*clustering2.ClusterSummaries, error) {
low := clustering2.NewClusterSummary()
high := clustering2.NewClusterSummary()
// Normalize each trace and then run through stepfit. If interesting then
@@ -23,14 +21,9 @@
if count%10000 == 0 {
sklog.Infof("stepfit count: %d", count)
}
- var sf *stepfit.StepFit
- if algo == types.STEPFIT_ALGO {
- t := vec32.Dup(trace)
- vec32.Norm(t, stddevThreshold)
- sf = stepfit.GetStepFitAtMid(t, interesting)
- } else {
- sf = absolute.GetStepFitAtMid(trace, interesting, algo == types.PERCENT_ALGO)
- }
+ t := vec32.Dup(trace)
+ vec32.Norm(t, stddevThreshold)
+ sf := stepfit.GetStepFitAtMid(t, interesting)
isLow := sf.Status == stepfit.LOW
isHigh := sf.Status == stepfit.HIGH
diff --git a/perf/go/regression/stepfit_test.go b/perf/go/regression/stepfit_test.go
index 846b446..c69a81c 100644
--- a/perf/go/regression/stepfit_test.go
+++ b/perf/go/regression/stepfit_test.go
@@ -63,7 +63,7 @@
df.ParamSet.AddParamsFromKey(key)
}
- sum, err := StepFit(df, 4, 0.01, nil, 50, types.STEPFIT_ALGO)
+ sum, err := StepFit(df, 4, 0.01, nil, 50)
assert.NoError(t, err)
assert.NotNil(t, sum)
assert.Equal(t, 1, len(sum.Clusters))
diff --git a/perf/go/types/types.go b/perf/go/types/types.go
index f4338e6..76a121c 100644
--- a/perf/go/types/types.go
+++ b/perf/go/types/types.go
@@ -26,15 +26,12 @@
//
// Update algo-select-sk if this enum is changed.
const (
- KMEANS_ALGO ClusterAlgo = "kmeans" // Cluster traces using k-means clustering on their shapes.
- STEPFIT_ALGO ClusterAlgo = "stepfit" // Look at each trace individually and determine if it steps up or down.
- ABSOLUTE_ALGO ClusterAlgo = "absolute" // Look at each trace individually and determine if it steps up or down by some value.
- PERCENT_ALGO ClusterAlgo = "percent" // Look at each trace individually and determine if it steps up or down by a certain percentage.
-
+ KMEANS_ALGO ClusterAlgo = "kmeans" // Cluster traces using k-means clustering on their shapes.
+ STEPFIT_ALGO ClusterAlgo = "stepfit" // Look at each trace individually and determing if it steps up or down.
)
var (
- AllClusterAlgos = []ClusterAlgo{KMEANS_ALGO, STEPFIT_ALGO, ABSOLUTE_ALGO, PERCENT_ALGO}
+ AllClusterAlgos = []ClusterAlgo{KMEANS_ALGO, STEPFIT_ALGO}
)
func ToClusterAlgo(s string) (ClusterAlgo, error) {
diff --git a/perf/modules/alert-config-sk/alert-config-sk-demo.js b/perf/modules/alert-config-sk/alert-config-sk-demo.js
index 2c7b10a..1c51332 100644
--- a/perf/modules/alert-config-sk/alert-config-sk-demo.js
+++ b/perf/modules/alert-config-sk/alert-config-sk-demo.js
@@ -1,5 +1 @@
-window.sk = window.sk || {}
-window.sk.perf = window.sk.perf || {}
-window.sk.perf.key_order = [];
-
import './index.js'
diff --git a/perf/modules/alert-config-sk/alert-config-sk.js b/perf/modules/alert-config-sk/alert-config-sk.js
index 18e1e37..dcd4b43 100644
--- a/perf/modules/alert-config-sk/alert-config-sk.js
+++ b/perf/modules/alert-config-sk/alert-config-sk.js
@@ -28,49 +28,49 @@
const template = (ele) => html`
<h3>Display Name</h3>
<label for=display-name>Display Name</label>
- <input id=display-name type=text .value=${ele._config.display_name} @change=${(e) => ele._config.display_name = e.target.value}>
+ <input id=display-name type=text .value=${ele._config.display_name} @change=${(e) => ele._config.display_name=e.target.value}>
<h3>Category</h3>
<label for=category>Alerts will be grouped by category.</label>
- <input id=category type=text .value=${ele._config.category} @input=${(e) => ele._config.category = e.target.value}>
+ <input id=category type=text .value=${ele._config.category} @input=${(e) => ele._config.category=e.target.value}>
<h3>Which traces should be monitored</h3>
- <query-chooser-sk id=querychooser .paramset=${ele.paramset} .key_order=${ele.key_order} current_query=${ele._config.query} count_url='/_/count/' @query-change=${(e) => ele._config.query = e.detail.q}></query-chooser-sk>
+ <query-chooser-sk id=querychooser .paramset=${ele.paramset} .key_order=${ele.key_order} current_query=${ele._config.query} count_url='/_/count/' @query-change=${(e) => ele._config.query=e.detail.q}></query-chooser-sk>
<h3>What triggers an alert</h3>
<h4>Algorithm</h4>
- <algo-select-sk algo=${ele._config.algo} @algo-change=${(e) => ele._config.algo = e.detail.algo}></algo-select-sk>
+ <algo-select-sk algo=${ele._config.algo} @algo-change=${(e) => ele._config.algo=e.detail.algo}></algo-select-sk>
<h4>K</h4>
<label for=k>The number of clusters. Only used in kmeans. 0 = use a server chosen value. (For Tail algorithm, K is the jump percentage.)</label>
- <input id=k type=number min=0 .value=${ele._config.k} @input=${(e) => ele._config.k = +e.target.value}>
+ <input id=k type=number min=0 .value=${ele._config.k} @input=${(e) => ele._config.k=+e.target.value}>
<h4>Radius</h4>
<label for=radius>Number of commits on either side to consider. 0 = use a server chosen value. (For Tail algorithm, we only consider 2*Radius commits on the left side.)</label>
- <input id=radius type=number min=0 .value=${ele._config.radius} @input=${(e) => ele._config.radius = +e.target.value}>
+ <input id=radius type=number min=0 .value=${ele._config.radius} @input=${(e) => ele._config.radius=+e.target.value}>
<h4>Step Direction</h4>
- <select-sk @selection-changed=${(e) => ele._config.direction = e.target.children[e.detail.selection].getAttribute('value')}>
+ <select-sk @selection-changed=${(e) => ele._config.direction=e.target.children[e.detail.selection].getAttribute('value')}>
<!-- TODO(jcgregorio) Go back to using select-sk.selection once we've excised all Polymer. -->
<div value=BOTH ?selected=${ele._config.direction === 'BOTH'} >Either step up or step down trigger an alert.</div>
<div value=UP ?selected=${ele._config.direction === 'UP'}>Step up triggers an alert.</div>
<div value=DOWN ?selected=${ele._config.direction === 'DOWN'}>Step down triggers an alert.</div>
</select-sk>
<h4>Threshold</h4>
- <label for=threshold>Interesting Threshold for clusters to be interesting. This value is based on the Algorithm chosen. It is a Regression factor for K-Means and Stepfit, an absolute value for Absolute, and a percentage value (0.0 -> 1.0) for Percent.</label>
- <input id=threshold .value=${ele._config.interesting} @input=${(e) => ele._config.interesting = +e.target.value}>
+ <label for=threshold>Interesting Threshold for clusters to be interesting. (Tail algorithm use this 1/Threshold as the min/max quantile.)</label>
+ <input id=threshold type=number min=1 max=500 .value=${ele._config.interesting} @input=${(e) => ele._config.interesting=+e.target.value}>
<h4>Minimum</h4>
<label for=min>Minimum number of interesting traces to trigger an alert.</label>
- <input id=min type=number .value=${ele._config.minimum_num} @input=${(e) => ele._config.minimum_num = +e.target.value}>
+ <input id=min type=number .value=${ele._config.minimum_num} @input=${(e) => ele._config.minimum_num=+e.target.value}>
<h4>Sparse</h4>
<checkbox-sk ?checked=${ele._config.sparse} @input=${(e) => ele._config.sparse = e.target.checked} label='Data is sparse, so only include commits that have data.'></checkbox-sk>
<h3>Where are alerts sent</h3>
<label for=sent>Alert Destination: Comma separated list of email addresses.</label>
- <input id=sent .value=${ele._config.alert} @input=${(e) => ele._config.alert = e.target.value}>
+ <input id=sent .value=${ele._config.alert} @input=${(e) => ele._config.alert=e.target.value}>
<button @click=${ele._testAlert}>Test</button>
<spinner-sk id=alertSpinner></spinner-sk>
<h3>Where are bugs filed</h3>
<label for=template>Bug URI Template: {cluster_url}, {commit_url}, and {message}.</label>
- <input id=template .value=${ele._config.bug_uri_template} @input=${(e) => ele._config.bug_uri_template = e.target.value}>
+ <input id=template .value=${ele._config.bug_uri_template} @input=${(e) => ele._config.bug_uri_template=e.target.value}>
<button @click=${ele._testBugTemplate}>Test</button>
<spinner-sk id=bugSpinner></spinner-sk>
<h3>Who owns this alert</h3>
<label for=owner>Email address of owner.</label>
- <input id=owner .value=${ele._config.owner} @input=${(e) => ele._config.owner = e.target.value}>
+ <input id=owner .value=${ele._config.owner} @input=${(e) => ele._config.owner=e.target.value}>
<h3>Group By</h3>
<label for=groupby>Group clusters by these parameters. (Multiselect)</label>
<multi-select-sk
@@ -80,7 +80,7 @@
${_groupByChoices(ele)}
</multi-select-sk>
<h3>Status</h3>
- <select-sk @selection-changed=${(e) => ele._config.state = e.target.children[e.detail.selection].getAttribute('value')}>
+ <select-sk @selection-changed=${(e) => ele._config.state=e.target.children[e.detail.selection].getAttribute('value')}>
<div value=ACTIVE ?selected=${ele._config.state === 'ACTIVE'} title='Clusters that match this will generate alerts.'>Active</div>
<div value=DELETED ?selected=${ele._config.state === 'DELETED'} title='Currently inactive.'>Deleted</div>
</select-sk>
@@ -103,16 +103,14 @@
owner: '',
step_up_only: false,
direction: 'BOTH',
- radius: 10,
+ radius: 10,
k: 50,
group_by: '',
sparse: false,
minimum_num: 0,
category: 'Experimental'
};
- if (sk) {
- this._key_order = sk.perf.key_order;
- }
+ this._key_order = sk.perf.key_order;
}
connectedCallback() {
@@ -132,7 +130,7 @@
fetch('/_/alert/bug/try', {
method: 'POST',
body: JSON.stringify(body),
- headers: {
+ headers:{
'Content-Type': 'application/json'
}
}).then(jsonOrThrow).then((json) => {
@@ -155,7 +153,7 @@
fetch('/_/alert/notify/try', {
method: 'POST',
body: JSON.stringify(body),
- headers: {
+ headers:{
'Content-Type': 'application/json'
}
}).then(jsonOrThrow).then((json) => {
diff --git a/perf/modules/algo-select-sk/algo-select-sk.js b/perf/modules/algo-select-sk/algo-select-sk.js
index dafade9..46cca52 100644
--- a/perf/modules/algo-select-sk/algo-select-sk.js
+++ b/perf/modules/algo-select-sk/algo-select-sk.js
@@ -32,8 +32,6 @@
<select-sk @selection-changed=${ele._selectionChanged}>
<div value=kmeans ?selected=${ele.algo === 'kmeans'} title="Use k-means clustering on the trace shapes.">K-Means</div>
<div value=stepfit ?selected=${ele.algo === 'stepfit'} title="Only look for traces that step up or down at the selected commit.">StepFit</div>
- <div value=absolute ?selected=${ele.algo === 'absolute'} title="Only look for traces that step up or down by a specific value.">Absolute</div>
- <div value=percent ?selected=${ele.algo === 'percent'} title="Only look for traces that step up or down by some percentage.">Percent</div>
</select-sk>
`;