@@ -289,27 +289,9 @@ class GitpodJsonRpcProxyFactory<T extends object> extends JsonRpcProxyFactory<T>
289
289
increaseApiCallUserCounter ( method , "anonymous" ) ;
290
290
}
291
291
292
- try {
293
- await this . rateLimiter . consume ( method ) ;
294
- } catch ( rlRejected ) {
295
- if ( rlRejected instanceof Error ) {
296
- log . error ( "Unexpected error in the rate limiter" , rlRejected ) ;
297
- increaseApiCallCounter ( method , 500 ) ;
298
- throw rlRejected ;
299
- }
300
- log . warn ( `Rate limiter prevents accessing method '${ method } ' of user '${ this . rateLimiter . user } due to too many requests.` , rlRejected ) ;
301
- increaseApiCallCounter ( method , ErrorCodes . TOO_MANY_REQUESTS ) ;
302
- throw new ResponseError ( ErrorCodes . TOO_MANY_REQUESTS , "too many requests" , { "Retry-After" : String ( Math . round ( rlRejected . msBeforeNext / 1000 ) ) || 1 } ) ;
303
- }
304
-
305
- if ( ! this . accessGuard . canAccess ( method ) ) {
306
- log . error ( `Request ${ method } is not allowed` , { method, args } ) ;
307
- increaseApiCallCounter ( method , ErrorCodes . PERMISSION_DENIED ) ;
308
- throw new ResponseError ( ErrorCodes . PERMISSION_DENIED , "not allowed" ) ;
309
- }
310
-
311
292
const span = opentracing . globalTracer ( ) . startSpan ( method ) ;
312
293
const ctx = { span } ;
294
+ const userId = this . clientMetadata . userId ;
313
295
try {
314
296
// generic tracing data
315
297
TraceContext . addNestedTags ( ctx , {
@@ -319,11 +301,29 @@ class GitpodJsonRpcProxyFactory<T extends object> extends JsonRpcProxyFactory<T>
319
301
} ,
320
302
} ) ;
321
303
TraceContext . setOWI ( ctx , {
322
- userId : this . clientMetadata . userId ,
304
+ userId,
323
305
sessionId : this . clientMetadata . sessionId ,
324
306
} ) ;
325
307
TraceContext . setJsonRPCMetadata ( ctx , method ) ;
326
308
309
+ // rate limiting
310
+ try {
311
+ await this . rateLimiter . consume ( method ) ;
312
+ } catch ( rlRejected ) {
313
+ if ( rlRejected instanceof Error ) {
314
+ log . error ( { userId } , "Unexpected error in the rate limiter" , rlRejected ) ;
315
+ throw rlRejected ;
316
+ }
317
+ log . warn ( { userId } , "Rate limiter prevents accessing method due to too many requests." , rlRejected , { method } ) ;
318
+ throw new ResponseError ( ErrorCodes . TOO_MANY_REQUESTS , "too many requests" , { "Retry-After" : String ( Math . round ( rlRejected . msBeforeNext / 1000 ) ) || 1 } ) ;
319
+ }
320
+
321
+ // access guard
322
+ if ( ! this . accessGuard . canAccess ( method ) ) {
323
+ // logging/tracing is done in 'catch' clause
324
+ throw new ResponseError ( ErrorCodes . PERMISSION_DENIED , `Request ${ method } is not allowed` ) ;
325
+ }
326
+
327
327
// actual call
328
328
const result = await this . target [ method ] ( ctx , ...args ) ; // we can inject TraceContext here because of GitpodServerWithTracing
329
329
increaseApiCallCounter ( method , 200 ) ;
@@ -333,15 +333,15 @@ class GitpodJsonRpcProxyFactory<T extends object> extends JsonRpcProxyFactory<T>
333
333
increaseApiCallCounter ( method , e . code ) ;
334
334
TraceContext . setJsonRPCError ( ctx , method , e ) ;
335
335
336
- log . info ( `Request ${ method } unsuccessful: ${ e . code } /"${ e . message } "` , { method, args } ) ;
336
+ log . info ( { userId } , `Request ${ method } unsuccessful: ${ e . code } /"${ e . message } "` , { method, args } ) ;
337
337
} else {
338
338
TraceContext . setError ( ctx , e ) ; // this is a "real" error
339
339
340
340
const err = new ResponseError ( 500 , "internal server error" ) ;
341
341
increaseApiCallCounter ( method , err . code ) ;
342
342
TraceContext . setJsonRPCError ( ctx , method , err ) ;
343
343
344
- log . error ( `Request ${ method } failed with internal server error` , e , { method, args } ) ;
344
+ log . error ( { userId } , `Request ${ method } failed with internal server error` , e , { method, args } ) ;
345
345
}
346
346
throw e ;
347
347
} finally {
0 commit comments