Skip to content

Commit 4d856cd

Browse files
committed
metrics: filter outliers
1 parent 10dc496 commit 4d856cd

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

packages/replay/metrics/configs/ci/collect.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ const result = await collector.execute({
2727
async shouldAccept(results: Metrics[]): Promise<boolean> {
2828
const stats = new MetricsStats(results);
2929
return true
30-
&& checkStdDev(stats, 'lcp', MetricsStats.lcp, 10)
31-
&& checkStdDev(stats, 'cls', MetricsStats.cls, 10)
30+
&& checkStdDev(stats, 'lcp', MetricsStats.lcp, 30)
31+
&& checkStdDev(stats, 'cls', MetricsStats.cls, 1)
3232
&& checkStdDev(stats, 'cpu', MetricsStats.cpu, 10)
3333
&& checkStdDev(stats, 'memory-mean', MetricsStats.memoryMean, 10000)
3434
&& checkStdDev(stats, 'memory-max', MetricsStats.memoryMax, 10000);

packages/replay/metrics/src/results/metrics-stats.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,29 @@ export class MetricsStats {
1414
static memoryMax: NumberProvider = metrics => ss.max(Array.from(metrics.memory.snapshots.values()));
1515

1616
public mean(dataProvider: NumberProvider): number | undefined {
17-
const numbers = this._items.map(dataProvider);
17+
const numbers = this._filteredValues(dataProvider);
1818
return numbers.length > 0 ? ss.mean(numbers) : undefined;
1919
}
2020

2121
public max(dataProvider: NumberProvider): number | undefined {
22-
const numbers = this._items.map(dataProvider);
22+
const numbers = this._filteredValues(dataProvider);
2323
return numbers.length > 0 ? ss.max(numbers) : undefined;
2424
}
2525

2626
public stddev(dataProvider: NumberProvider): number | undefined {
27-
const numbers = this._items.map(dataProvider);
27+
const numbers = this._filteredValues(dataProvider);
2828
return numbers.length > 0 ? ss.standardDeviation(numbers) : undefined;
2929
}
30+
31+
// See https://en.wikipedia.org/wiki/Interquartile_range#Outliers for details on filtering.
32+
private _filteredValues(dataProvider: NumberProvider): number[] {
33+
const numbers = this._items.map(dataProvider);
34+
numbers.sort((a, b) => a - b)
35+
36+
const q1 = ss.quantileSorted(numbers, 0.25);
37+
const q3 = ss.quantileSorted(numbers, 0.75);
38+
const iqr = q3 - q1
39+
40+
return numbers.filter(num => num >= (q1 - 1.5 * iqr) && num <= (q3 + 1.5 * iqr))
41+
}
3042
}

0 commit comments

Comments
 (0)