From 22b5f32f74bc99be5a4d2f0ea987fa1b08a1c901 Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Mon, 21 Sep 2020 07:34:43 -0700 Subject: [PATCH] Add extras to timespan and points in performance logger Summary: Changelog: [Internal][Added] Added point-level extras to performance logger Reviewed By: lunaleaps, rubennorte Differential Revision: D23730275 fbshipit-source-id: 285c5d7ac769bd109df7ce0294da024401edf7d3 --- .../__tests__/PerformanceLogger-test.js | 22 +++++++++ .../Utilities/createPerformanceLogger.js | 45 +++++++++++++++---- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/Libraries/Utilities/__tests__/PerformanceLogger-test.js b/Libraries/Utilities/__tests__/PerformanceLogger-test.js index ea940f10947..a762157a165 100644 --- a/Libraries/Utilities/__tests__/PerformanceLogger-test.js +++ b/Libraries/Utilities/__tests__/PerformanceLogger-test.js @@ -21,6 +21,8 @@ const EXTRA_VALUE_2 = ''; const POINT = ''; const POINT_TIMESTAMP = 99; const POINT_TIMESTAMP_2 = 999; +const POINT_ANNOTATION_1 = {extra: 'value1'}; +const POINT_ANNOTATION_2 = {extra: 'value2'}; describe('PerformanceLogger', () => { beforeEach(() => { @@ -167,4 +169,24 @@ describe('PerformanceLogger', () => { checkLogger(localPerformanceLogger2, true); checkLogger(GlobalPerformanceLogger, true); }); + + it('records extras for a timespan', () => { + let perfLogger = createPerformanceLogger(); + perfLogger.startTimespan(TIMESPAN_1, POINT_ANNOTATION_1); + perfLogger.stopTimespan(TIMESPAN_1, POINT_ANNOTATION_2); + expect(perfLogger.getTimespans()[TIMESPAN_1].startExtras).toEqual( + POINT_ANNOTATION_1, + ); + expect(perfLogger.getTimespans()[TIMESPAN_1].endExtras).toEqual( + POINT_ANNOTATION_2, + ); + }); + + it('records extras for a point', () => { + let perfLogger = createPerformanceLogger(); + perfLogger.markPoint(POINT, POINT_TIMESTAMP, POINT_ANNOTATION_1); + + expect(Object.keys(perfLogger.getPointExtras())).toEqual([POINT]); + expect(perfLogger.getPointExtras()[POINT]).toEqual(POINT_ANNOTATION_1); + }); }); diff --git a/Libraries/Utilities/createPerformanceLogger.js b/Libraries/Utilities/createPerformanceLogger.js index c9baf0cd07a..195c1b30807 100644 --- a/Libraries/Utilities/createPerformanceLogger.js +++ b/Libraries/Utilities/createPerformanceLogger.js @@ -20,15 +20,25 @@ type Timespan = { startTime: number, endTime?: number, totalTime?: number, + startExtras?: Extras, + endExtras?: Extras, }; // Extra values should be serializable primitives type ExtraValue = number | string | boolean; +type Extras = {[key: string]: ExtraValue}; + export interface IPerformanceLogger { - addTimespan(key: string, startTime: number, endTime: number): void; - startTimespan(key: string): void; - stopTimespan(key: string): void; + addTimespan( + key: string, + startTime: number, + endTime: number, + startExtras?: Extras, + endExtras?: Extras, + ): void; + startTimespan(key: string, extras?: Extras): void; + stopTimespan(key: string, extras?: Extras): void; clear(): void; clearCompleted(): void; currentTimestamp(): number; @@ -37,8 +47,9 @@ export interface IPerformanceLogger { setExtra(key: string, value: ExtraValue): void; getExtras(): {[key: string]: ExtraValue, ...}; removeExtra(key: string): ExtraValue | void; - markPoint(key: string, timestamp?: number): void; + markPoint(key: string, timestamp?: number, extras?: Extras): void; getPoints(): {[key: string]: number, ...}; + getPointExtras(): {[key: string]: Extras, ...}; logEverything(): void; } @@ -50,8 +61,15 @@ class PerformanceLogger implements IPerformanceLogger { _timespans: {[key: string]: Timespan} = {}; _extras: {[key: string]: ExtraValue} = {}; _points: {[key: string]: number} = {}; + _pointExtras: {[key: string]: Extras, ...} = {}; - addTimespan(key: string, startTime: number, endTime: number) { + addTimespan( + key: string, + startTime: number, + endTime: number, + startExtras?: Extras, + endExtras?: Extras, + ) { if (this._timespans[key]) { if (PRINT_TO_CONSOLE && __DEV__) { infoLog( @@ -66,10 +84,12 @@ class PerformanceLogger implements IPerformanceLogger { startTime, endTime, totalTime: endTime - (startTime || 0), + startExtras, + endExtras, }; } - startTimespan(key: string) { + startTimespan(key: string, extras?: Extras) { if (this._timespans[key]) { if (PRINT_TO_CONSOLE && __DEV__) { infoLog( @@ -82,6 +102,7 @@ class PerformanceLogger implements IPerformanceLogger { this._timespans[key] = { startTime: performanceNow(), + startExtras: extras, }; _cookies[key] = Systrace.beginAsyncEvent(key); if (PRINT_TO_CONSOLE) { @@ -89,7 +110,7 @@ class PerformanceLogger implements IPerformanceLogger { } } - stopTimespan(key: string) { + stopTimespan(key: string, extras?: Extras) { const timespan = this._timespans[key]; if (!timespan || timespan.startTime == null) { if (PRINT_TO_CONSOLE && __DEV__) { @@ -110,6 +131,7 @@ class PerformanceLogger implements IPerformanceLogger { return; } + timespan.endExtras = extras; timespan.endTime = performanceNow(); timespan.totalTime = timespan.endTime - (timespan.startTime || 0); if (PRINT_TO_CONSOLE) { @@ -179,7 +201,7 @@ class PerformanceLogger implements IPerformanceLogger { return value; } - markPoint(key: string, timestamp?: number) { + markPoint(key: string, timestamp?: number, extras?: Extras) { if (this._points[key]) { if (PRINT_TO_CONSOLE && __DEV__) { infoLog( @@ -190,12 +212,19 @@ class PerformanceLogger implements IPerformanceLogger { return; } this._points[key] = timestamp ?? performanceNow(); + if (extras) { + this._pointExtras[key] = extras; + } } getPoints() { return this._points; } + getPointExtras() { + return this._pointExtras; + } + logEverything() { if (PRINT_TO_CONSOLE) { // log timespans