-
Notifications
You must be signed in to change notification settings - Fork 12k
/
Copy pathdefault-stats-capture.ts
62 lines (59 loc) · 2.05 KB
/
default-stats-capture.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { Observable } from 'rxjs';
import { map, reduce } from 'rxjs/operators';
import { AggregatedProcessStats, Capture, MetricGroup } from './interfaces';
import { cumulativeMovingAverage, max } from './utils';
export const defaultStatsCapture: Capture = (
stats: Observable<AggregatedProcessStats>,
): Observable<MetricGroup> => {
type Accumulator = {
elapsed: number;
avgProcesses: number;
peakProcesses: number;
avgCpu: number;
peakCpu: number;
avgMemory: number;
peakMemory: number;
};
const seed: Accumulator = {
elapsed: 0,
avgProcesses: 0,
peakProcesses: 0,
avgCpu: 0,
peakCpu: 0,
avgMemory: 0,
peakMemory: 0,
};
return stats.pipe(
reduce<AggregatedProcessStats, Accumulator>(
(acc, val, idx) => ({
elapsed: val.elapsed,
avgProcesses: cumulativeMovingAverage(acc.avgProcesses, val.processes, idx),
peakProcesses: max(acc.peakProcesses, val.processes),
avgCpu: cumulativeMovingAverage(acc.avgCpu, val.cpu, idx),
peakCpu: max(acc.peakCpu, val.cpu),
avgMemory: cumulativeMovingAverage(acc.avgMemory, val.memory, idx),
peakMemory: max(acc.peakMemory, val.memory),
}),
seed,
),
map((metrics) => ({
name: 'Process Stats',
metrics: [
{ name: 'Elapsed Time', unit: 'ms', value: metrics.elapsed },
{ name: 'Average Process usage', unit: 'process(es)', value: metrics.avgProcesses },
{ name: 'Peak Process usage', unit: 'process(es)', value: metrics.peakProcesses },
{ name: 'Average CPU usage', unit: '%', value: metrics.avgCpu },
{ name: 'Peak CPU usage', unit: '%', value: metrics.peakCpu },
{ name: 'Average Memory usage', unit: 'MB', value: metrics.avgMemory * 1e-6 },
{ name: 'Peak Memory usage', unit: 'MB', value: metrics.peakMemory * 1e-6 },
],
})),
);
};