MM-58281 Allow client metrics to be floats and round timestamps (#27027)

* MM-58281 Allow client metrics to be floats and round timestamps

* MM-58281 Fix report version

* Ensure reports can contain a single timestamp

* Round timestamps in unit tests
Этот коммит содержится в:
Harrison Healey
2024-05-16 14:01:21 -04:00
коммит произвёл GitHub
родитель 617053e206
Коммит 6cf93ea480
4 изменённых файлов: 37 добавлений и 22 удалений

Просмотреть файл

@@ -52,23 +52,23 @@ describe('PerformanceReporter', () => {
expect(sendBeacon.mock.calls[0][0]).toEqual(siteUrl + '/api/v4/client_perf');
const report = JSON.parse(sendBeacon.mock.calls[0][1]);
expect(report).toMatchObject({
start: performance.timeOrigin + testMarkA.startTime,
end: performance.timeOrigin + testMarkB.startTime,
start: Math.round(performance.timeOrigin + testMarkA.startTime),
end: Math.round(performance.timeOrigin + testMarkB.startTime),
histograms: [
{
metric: 'testMeasureA',
value: testMarkB.startTime - testMarkA.startTime,
timestamp: performance.timeOrigin + testMarkA.startTime,
timestamp: Math.round(performance.timeOrigin + testMarkA.startTime),
},
{
metric: 'testMeasureB',
value: testMarkC.startTime - testMarkA.startTime,
timestamp: performance.timeOrigin + testMarkA.startTime,
timestamp: Math.round(performance.timeOrigin + testMarkA.startTime),
},
{
metric: 'testMeasureC',
value: testMarkC.startTime - testMarkB.startTime,
timestamp: performance.timeOrigin + testMarkB.startTime,
timestamp: Math.round(performance.timeOrigin + testMarkB.startTime),
},
],
});
@@ -94,7 +94,7 @@ describe('PerformanceReporter', () => {
expect(reporter.handleObservations).toHaveBeenCalled();
const timestamp = performance.timeOrigin + performance.now();
const timestamp = Math.round(performance.timeOrigin + performance.now());
await waitForReport();

Просмотреть файл

@@ -17,13 +17,28 @@ import type {PlatformLabel, UserAgentLabel} from './platform_detection';
import {getPlatformLabel, getUserAgentLabel} from './platform_detection';
type PerformanceReportMeasure = {
/**
* metric is the name of a counter or histogram metric which must match a MetricType constant as defined in
* model/metrics.go on the server.
*/
metric: string;
/**
* value is the floating point value of the metric. It's often a millisecond duration, but it's meaning depends
* on which metric this is.
*/
value: number;
/**
* timestamp is an integer value representing when the metric was measured as a millisecond value. Some browsers
* use floating point numbers for performance timestamps, so we need to make sure to round this.
*/
timestamp: number;
}
type PerformanceReport = {
version: '1.0';
version: '0.1.0';
labels: {
platform: PlatformLabel;
@@ -126,7 +141,7 @@ export default class PerformanceReporter {
this.histogramMeasures.push({
metric: entry.name,
value: entry.duration,
timestamp: performance.timeOrigin + entry.startTime,
timestamp: Math.round(performance.timeOrigin + entry.startTime),
});
}
@@ -151,7 +166,7 @@ export default class PerformanceReporter {
this.histogramMeasures.push({
metric: metric.name,
value: metric.value,
timestamp: performance.timeOrigin + performance.now(),
timestamp: Math.round(performance.timeOrigin + performance.now()),
});
}
@@ -212,7 +227,7 @@ export default class PerformanceReporter {
const counterMeasures = this.countersToMeasures(now, counters);
return {
version: '1.0',
version: '0.1.0',
labels: {
platform: this.platformLabel,
@@ -252,7 +267,7 @@ export default class PerformanceReporter {
counterMeasures.push({
metric: name,
value,
timestamp: now,
timestamp: Math.round(now),
});
}