@@ -2,10 +2,38 @@ import { LoggerProvider } from '@ceramicnetwork/common'
2
2
import { Request , Response } from 'express'
3
3
import morgan from 'morgan'
4
4
5
+ const EXPECTED_RESPONSE_TIME_MS = 2000
6
+ const MAX_DAILY_SLOW_REQUESTS_TO_LOG = 10
7
+
5
8
const ACCESS_LOG_FMT =
6
9
'ip=:remote-addr ts=:date[iso] method=:method original_url=:original-url base_url=:base-url path=:path:params :body http_version=:http-version req_header:req[header] status=:status content_length=:res[content-length] content_type=":res[content-type]" ref=:referrer user_agent=":user-agent" elapsed_ms=:total-time[3] error_message=":error-message" error_code=:error-code'
7
10
8
11
export function logRequests ( loggerProvider : LoggerProvider ) : any [ ] {
12
+
13
+ // these trackers and middleware enable us to log just a sample of slow requests each day or app restart
14
+ let slowRequestCount = 0 ;
15
+ let lastLoggedDate = new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ;
16
+
17
+ // Middleware to calculate response time and handle daily reset of the counter
18
+ const responseTimeMiddleware = ( req : Request , res : Response , next : Function ) => {
19
+ const start = Date . now ( ) ;
20
+ const currentDate = new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ;
21
+
22
+ if ( lastLoggedDate !== currentDate ) {
23
+ slowRequestCount = 0 ; // Reset counter if it's a new day
24
+ lastLoggedDate = currentDate ; // Update the last logged date
25
+ }
26
+
27
+ res . on ( 'finish' , ( ) => {
28
+ const responseTime = Date . now ( ) - start ;
29
+ if ( responseTime > EXPECTED_RESPONSE_TIME_MS && slowRequestCount < MAX_DAILY_SLOW_REQUESTS_TO_LOG ) {
30
+ slowRequestCount ++ ;
31
+ res . locals . logSlowRequest = true ; // Flag to log this request
32
+ }
33
+ } ) ;
34
+ next ( ) ;
35
+ } ;
36
+
9
37
morgan . token < Request , Response > ( 'error-message' , ( req , res : Response ) => {
10
38
return res . locals . error ?. message
11
39
} )
@@ -33,8 +61,8 @@ export function logRequests(loggerProvider: LoggerProvider): any[] {
33
61
}
34
62
return ' params=-'
35
63
} )
36
- morgan . token < Request , Response > ( 'body' , ( req ) => {
37
- if ( req . body ) {
64
+ morgan . token < Request , Response > ( 'body' , ( req , res : Response ) => {
65
+ if ( req . body && res . locals . logSlowRequest ) {
38
66
const keys = Object . keys ( req . body )
39
67
if ( keys . length > 0 ) {
40
68
const body = keys . reduce ( ( prev , curr ) => {
0 commit comments