Skip to content

Commit 759234d

Browse files
committed
feat(logging): Limit full body logging to first 10 slow requests per day
1 parent ffe141c commit 759234d

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

packages/cli/src/daemon/log-requests.ts

+30-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,38 @@ import { LoggerProvider } from '@ceramicnetwork/common'
22
import { Request, Response } from 'express'
33
import morgan from 'morgan'
44

5+
const EXPECTED_RESPONSE_TIME_MS = 2000
6+
const MAX_DAILY_SLOW_REQUESTS_TO_LOG = 10
7+
58
const ACCESS_LOG_FMT =
69
'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'
710

811
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+
937
morgan.token<Request, Response>('error-message', (req, res: Response) => {
1038
return res.locals.error?.message
1139
})
@@ -33,8 +61,8 @@ export function logRequests(loggerProvider: LoggerProvider): any[] {
3361
}
3462
return ' params=-'
3563
})
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) {
3866
const keys = Object.keys(req.body)
3967
if (keys.length > 0) {
4068
const body = keys.reduce((prev, curr) => {

0 commit comments

Comments
 (0)