-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathpino.js
106 lines (90 loc) · 3.07 KB
/
pino.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { stdSerializers } from 'pino';
import { monitoringTools } from '../../../../src/shared/infrastructure/monitoring-tools.js';
import { generateHash } from '../../../identity-access-management/infrastructure/utils/crypto.js';
import { getForwardedOrigin } from '../../../identity-access-management/infrastructure/utils/network.js';
import { config } from '../../config.js';
import { logger } from '../utils/logger.js';
const serializersSym = Symbol.for('pino.serializers');
function requestSerializer(req) {
const enhancedReq = {
...req,
version: config.version,
clientVersion: req.headers['x-app-version'] || '-',
clientVersionMismatched: config.version !== req.headers['x-app-version'],
};
if (!config.hapi.enableRequestMonitoring) return enhancedReq;
// monitor api token route
const context = monitoringTools.getContext();
if (context?.request?.route?.path === '/api/token') {
const { username, refresh_token, grant_type } = context.request.payload || {};
let origin;
try {
origin = getForwardedOrigin(context.request.headers);
} catch {
origin = '-';
}
enhancedReq.audience = origin;
enhancedReq.grantType = grant_type || '-';
enhancedReq.usernameHash = generateHash(username) || '-';
enhancedReq.refreshTokenHash = generateHash(refresh_token) || '-';
}
return {
...enhancedReq,
user_id: monitoringTools.extractUserIdFromRequest(req),
metrics: context?.metrics,
route: context?.request?.route?.path,
};
}
const plugin = {
name: 'hapi-pino',
register: async function (server, options) {
const serializers = {
req: stdSerializers.wrapRequestSerializer(requestSerializer),
res: stdSerializers.wrapResponseSerializer(stdSerializers.res),
};
const logger = options.instance;
logger[serializersSym] = Object.assign({}, serializers, logger[serializersSym]);
server.ext('onPostStart', async function () {
logger.info(server.info, 'server started');
});
server.ext('onPostStop', async function () {
logger.info(server.info, 'server stopped');
});
server.events.on('log', function (event) {
logger.info({ tags: event.tags, data: event.data });
});
server.events.on('request', function (request, event) {
if (event.channel !== 'error') {
return;
}
if (event.error) {
logger.error(
{
tags: event.tags,
err: event.error,
},
'request error',
);
}
});
server.events.on('response', (request) => {
const info = request.info;
const shouldLog = !config.featureToggles.isDirectMetricsEnabled;
if (shouldLog || request.raw.res.statusCode != 200) {
logger.info(
{
queryParams: request.query,
req: request,
res: request.raw.res,
responseTime: (info.completed !== undefined ? info.completed : info.responded) - info.received,
},
'request completed',
);
}
});
},
};
const options = {
instance: logger,
};
export { options, plugin };