@@ -9,15 +9,16 @@ import logger from './logger';
99
1010// For now this is a private env variable we use internally
1111// But we'll want to expose this feature officially some day
12- const PerfDebuggingEnabled : boolean = ! ! process . env . DOCUSAURUS_PERF_LOGGER ;
12+ const PerfDebuggingEnabled : boolean =
13+ process . env . DOCUSAURUS_PERF_LOGGER === 'true' ;
1314
1415const Thresholds = {
1516 min : 5 ,
1617 yellow : 100 ,
1718 red : 1000 ,
1819} ;
1920
20- const PerfPrefix = logger . yellow ( `[PERF] ` ) ;
21+ const PerfPrefix = logger . yellow ( `[PERF]` ) ;
2122
2223// This is what enables to "see the parent stack" for each log
2324// Parent1 > Parent2 > Parent3 > child trace
@@ -42,6 +43,14 @@ type Memory = {
4243 after : NodeJS . MemoryUsage ;
4344} ;
4445
46+ function getMemory ( ) : NodeJS . MemoryUsage {
47+ // Before reading memory stats, we explicitly call the GC
48+ // Note: this only works when Node.js option "--expose-gc" is provided
49+ globalThis . gc ?.( ) ;
50+
51+ return process . memoryUsage ( ) ;
52+ }
53+
4554function createPerfLogger ( ) : PerfLoggerAPI {
4655 if ( ! PerfDebuggingEnabled ) {
4756 const noop = ( ) => { } ;
@@ -73,29 +82,35 @@ function createPerfLogger(): PerfLoggerAPI {
7382 ) ;
7483 } ;
7584
85+ const formatStatus = ( error : Error | undefined ) : string => {
86+ return error ? logger . red ( '[KO]' ) : '' ; // logger.green('[OK]');
87+ } ;
88+
7689 const printPerfLog = ( {
7790 label,
7891 duration,
7992 memory,
93+ error,
8094 } : {
8195 label : string ;
8296 duration : number ;
8397 memory : Memory ;
98+ error : Error | undefined ;
8499 } ) => {
85100 if ( duration < Thresholds . min ) {
86101 return ;
87102 }
88103 console . log (
89- `${ PerfPrefix + label } - ${ formatDuration ( duration ) } - ${ formatMemory (
90- memory ,
91- ) } `,
104+ `${ PerfPrefix } ${ formatStatus ( error ) } ${ label } - ${ formatDuration (
105+ duration ,
106+ ) } - ${ formatMemory ( memory ) } `,
92107 ) ;
93108 } ;
94109
95110 const start : PerfLoggerAPI [ 'start' ] = ( label ) =>
96111 performance . mark ( label , {
97112 detail : {
98- memoryUsage : process . memoryUsage ( ) ,
113+ memoryUsage : getMemory ( ) ,
99114 } ,
100115 } ) ;
101116
@@ -110,30 +125,42 @@ function createPerfLogger(): PerfLoggerAPI {
110125 duration,
111126 memory : {
112127 before : memoryUsage ,
113- after : process . memoryUsage ( ) ,
128+ after : getMemory ( ) ,
114129 } ,
130+ error : undefined ,
115131 } ) ;
116132 } ;
117133
118134 const log : PerfLoggerAPI [ 'log' ] = ( label : string ) =>
119- console . log ( PerfPrefix + applyParentPrefix ( label ) ) ;
135+ console . log ( ` ${ PerfPrefix } ${ applyParentPrefix ( label ) } ` ) ;
120136
121137 const async : PerfLoggerAPI [ 'async' ] = async ( label , asyncFn ) => {
122138 const finalLabel = applyParentPrefix ( label ) ;
123139 const before = performance . now ( ) ;
124- const memoryBefore = process . memoryUsage ( ) ;
125- const result = await ParentPrefix . run ( finalLabel , ( ) => asyncFn ( ) ) ;
126- const memoryAfter = process . memoryUsage ( ) ;
127- const duration = performance . now ( ) - before ;
128- printPerfLog ( {
129- label : finalLabel ,
130- duration,
131- memory : {
132- before : memoryBefore ,
133- after : memoryAfter ,
134- } ,
135- } ) ;
136- return result ;
140+ const memoryBefore = getMemory ( ) ;
141+
142+ const asyncEnd = ( { error} : { error : Error | undefined } ) => {
143+ const memoryAfter = getMemory ( ) ;
144+ const duration = performance . now ( ) - before ;
145+ printPerfLog ( {
146+ error,
147+ label : finalLabel ,
148+ duration,
149+ memory : {
150+ before : memoryBefore ,
151+ after : memoryAfter ,
152+ } ,
153+ } ) ;
154+ } ;
155+
156+ try {
157+ const result = await ParentPrefix . run ( finalLabel , ( ) => asyncFn ( ) ) ;
158+ asyncEnd ( { error : undefined } ) ;
159+ return result ;
160+ } catch ( e ) {
161+ asyncEnd ( { error : e as Error } ) ;
162+ throw e ;
163+ }
137164 } ;
138165
139166 return {
0 commit comments