@multiplayer-app/session-recorder-common 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.d.ts +4 -2
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -1
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.js +78 -75
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -1
- package/dist/esm/sdk/capture-exception.d.ts.map +1 -1
- package/dist/esm/sdk/id-generator.d.ts.map +1 -1
- package/dist/esm/sdk/is-gzip.d.ts.map +1 -1
- package/dist/esm/sdk/mask.d.ts.map +1 -1
- package/dist/esm/sdk/save-continuous-deb-session.d.ts.map +1 -1
- package/dist/esm/sdk/schemify.d.ts.map +1 -1
- package/dist/esm/sdk/set-attribute.d.ts.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.d.ts +4 -2
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -1
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.js +40 -37
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -1
- package/dist/esnext/sdk/capture-exception.d.ts.map +1 -1
- package/dist/esnext/sdk/id-generator.d.ts.map +1 -1
- package/dist/esnext/sdk/is-gzip.d.ts.map +1 -1
- package/dist/esnext/sdk/mask.d.ts.map +1 -1
- package/dist/esnext/sdk/save-continuous-deb-session.d.ts.map +1 -1
- package/dist/esnext/sdk/schemify.d.ts.map +1 -1
- package/dist/esnext/sdk/set-attribute.d.ts.map +1 -1
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.d.ts +4 -2
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -1
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.js +39 -36
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -1
- package/dist/src/sdk/capture-exception.d.ts.map +1 -1
- package/dist/src/sdk/id-generator.d.ts.map +1 -1
- package/dist/src/sdk/is-gzip.d.ts.map +1 -1
- package/dist/src/sdk/mask.d.ts.map +1 -1
- package/dist/src/sdk/save-continuous-deb-session.d.ts.map +1 -1
- package/dist/src/sdk/schemify.d.ts.map +1 -1
- package/dist/src/sdk/set-attribute.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/SessionRecorderHttpInstrumentationHooksNode.ts +50 -42
|
@@ -12,8 +12,11 @@ const setDefaultOptions = (options) => {
|
|
|
12
12
|
options.captureBody = 'captureBody' in options
|
|
13
13
|
? options.captureBody
|
|
14
14
|
: true;
|
|
15
|
-
options.
|
|
16
|
-
? options.
|
|
15
|
+
options.isMaskBodyEnabled = 'isMaskBodyEnabled' in options
|
|
16
|
+
? options.isMaskBodyEnabled
|
|
17
|
+
: true;
|
|
18
|
+
options.isMaskHeadersEnabled = 'isMaskHeadersEnabled' in options
|
|
19
|
+
? options.isMaskHeadersEnabled
|
|
17
20
|
: true;
|
|
18
21
|
options.schemifyDocSpanPayload = 'schemifyDocSpanPayload' in options
|
|
19
22
|
? options.schemifyDocSpanPayload
|
|
@@ -65,7 +68,7 @@ exports.SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
65
68
|
// eslint-disable-next-line
|
|
66
69
|
// @ts-ignore
|
|
67
70
|
_response.end = async function (...restArgs) {
|
|
68
|
-
var _a
|
|
71
|
+
var _a;
|
|
69
72
|
if (_options.captureBody && restArgs[0]) {
|
|
70
73
|
chunks.push(Buffer.from(restArgs[0]));
|
|
71
74
|
}
|
|
@@ -99,10 +102,11 @@ exports.SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
99
102
|
}
|
|
100
103
|
if (!skipResponseBodyModification) {
|
|
101
104
|
if (traceId.startsWith(constants_node_1.MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
102
|
-
&& _options.
|
|
105
|
+
&& _options.isMaskBodyEnabled) {
|
|
103
106
|
responseBody = _options.maskBody(responseBody, span);
|
|
104
107
|
}
|
|
105
|
-
else if (
|
|
108
|
+
else if (traceId.startsWith(constants_node_1.MULTIPLAYER_TRACE_DOC_PREFIX)
|
|
109
|
+
&& _options.schemifyDocSpanPayload) {
|
|
106
110
|
responseBody = (0, sdk_1.schemify)(responseBody);
|
|
107
111
|
}
|
|
108
112
|
else if (typeof responseBody !== 'string') {
|
|
@@ -114,22 +118,21 @@ exports.SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
114
118
|
}
|
|
115
119
|
}
|
|
116
120
|
if (_options.captureHeaders) {
|
|
117
|
-
const headers =
|
|
121
|
+
const headers = (options.isMaskHeadersEnabled
|
|
122
|
+
? _options.maskHeaders(_response.getHeaders(), span)
|
|
123
|
+
: _response.getHeaders()) || {};
|
|
118
124
|
let _headers = {};
|
|
119
|
-
if (
|
|
120
|
-
|
|
121
|
-
|
|
125
|
+
if (_options.headersToInclude) {
|
|
126
|
+
for (const headerName of _options.headersToInclude) {
|
|
127
|
+
_headers[headerName] = headers[headerName];
|
|
128
|
+
}
|
|
122
129
|
}
|
|
123
130
|
else {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if ((_c = _options.headersToExclude) === null || _c === void 0 ? void 0 : _c.length) {
|
|
130
|
-
for (const headerName of _options.headersToExclude) {
|
|
131
|
-
delete _headers[headerName];
|
|
132
|
-
}
|
|
131
|
+
_headers = JSON.parse(JSON.stringify(headers));
|
|
132
|
+
}
|
|
133
|
+
if ((_a = _options.headersToExclude) === null || _a === void 0 ? void 0 : _a.length) {
|
|
134
|
+
for (const headerName of _options.headersToExclude) {
|
|
135
|
+
delete _headers[headerName];
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
138
|
const stringifiedHeaders = JSON.stringify(_headers);
|
|
@@ -148,7 +151,7 @@ exports.SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
148
151
|
}
|
|
149
152
|
},
|
|
150
153
|
requestHook: (options = {}) => (span, request) => {
|
|
151
|
-
var _a, _b
|
|
154
|
+
var _a, _b;
|
|
152
155
|
try {
|
|
153
156
|
const _options = setDefaultOptions(options);
|
|
154
157
|
if (!_options.captureBody && !_options.captureHeaders) {
|
|
@@ -157,27 +160,26 @@ exports.SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
157
160
|
const traceId = span.spanContext().traceId;
|
|
158
161
|
const _request = request;
|
|
159
162
|
if (_options.captureHeaders) {
|
|
163
|
+
const headers = (_options.isMaskHeadersEnabled
|
|
164
|
+
? _options.maskHeaders(_request.headers, span)
|
|
165
|
+
: _request.headers) || {};
|
|
160
166
|
let _headers = {};
|
|
161
|
-
if (
|
|
162
|
-
|
|
163
|
-
|
|
167
|
+
if (_options.headersToInclude) {
|
|
168
|
+
for (const headerName of _options.headersToInclude) {
|
|
169
|
+
_headers[headerName] = headers[headerName];
|
|
170
|
+
}
|
|
164
171
|
}
|
|
165
172
|
else {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
if ((_c = _options.headersToExclude) === null || _c === void 0 ? void 0 : _c.length) {
|
|
172
|
-
for (const headerName of _options.headersToExclude) {
|
|
173
|
-
delete _headers[headerName];
|
|
174
|
-
}
|
|
173
|
+
_headers = JSON.parse(JSON.stringify(headers));
|
|
174
|
+
}
|
|
175
|
+
if ((_a = _options.headersToExclude) === null || _a === void 0 ? void 0 : _a.length) {
|
|
176
|
+
for (const headerName of _options.headersToExclude) {
|
|
177
|
+
delete _headers[headerName];
|
|
175
178
|
}
|
|
176
179
|
}
|
|
177
|
-
|
|
178
|
-
span.setAttribute(constants_node_1.ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, JSON.stringify(headers));
|
|
180
|
+
span.setAttribute(constants_node_1.ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, JSON.stringify(_headers));
|
|
179
181
|
}
|
|
180
|
-
const contentType = (
|
|
182
|
+
const contentType = (_b = _request === null || _request === void 0 ? void 0 : _request.headers) === null || _b === void 0 ? void 0 : _b['content-type'];
|
|
181
183
|
if (_options.captureBody
|
|
182
184
|
&& (contentType === null || contentType === void 0 ? void 0 : contentType.includes('application/json'))) {
|
|
183
185
|
let body = '';
|
|
@@ -195,10 +197,11 @@ exports.SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
195
197
|
if (!requestBody)
|
|
196
198
|
return;
|
|
197
199
|
if (traceId.startsWith(constants_node_1.MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
198
|
-
&& _options.
|
|
200
|
+
&& _options.isMaskBodyEnabled) {
|
|
199
201
|
requestBody = _options.maskBody(requestBody, span);
|
|
200
202
|
}
|
|
201
|
-
else if (
|
|
203
|
+
else if (traceId.startsWith(constants_node_1.MULTIPLAYER_TRACE_DOC_PREFIX)
|
|
204
|
+
&& _options.schemifyDocSpanPayload) {
|
|
202
205
|
requestBody = (0, sdk_1.schemify)(requestBody);
|
|
203
206
|
}
|
|
204
207
|
else if (typeof requestBody !== 'string') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorderHttpInstrumentationHooksNode.js","sourceRoot":"","sources":["../../src/SessionRecorderHttpInstrumentationHooksNode.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IncomingMessage,\n ServerResponse,\n ClientRequest,\n} from 'http'\nimport * as zlib from 'zlib'\nimport type { Span } from '@opentelemetry/api'\nimport {\n ATTR_MULTIPLAYER_HTTP_REQUEST_BODY,\n ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY,\n ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS,\n MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE,\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n} from './constants.node'\nimport {\n mask,\n schemify,\n isGzip,\n} from './sdk'\nimport {\n sensitiveFields,\n sensitiveHeaders\n} from './sdk/mask'\n\ninterface HttpResponseHookOptions {\n maxPayloadSizeBytes?: number\n schemifyDocSpanPayload?: boolean\n uncompressPayload?: boolean\n\n captureHeaders?: boolean\n captureBody?: boolean\n\n isMaskingEnabled?: boolean\n\n maskBody?: (arg: any, span: Span) => any\n maskHeaders?: (arg: any, span: Span) => any\n\n maskBodyFieldsList?: string[]\n maskHeadersList?: string[]\n\n headersToInclude?: string[]\n headersToExclude?: string[]\n}\n\ninterface HttpRequestHookOptions {\n maxPayloadSizeBytes?: number\n schemifyDocSpanPayload?: boolean\n\n captureHeaders?: boolean\n captureBody?: boolean\n\n isMaskingEnabled?: boolean\n\n maskBody?: (arg: any, span: Span) => any\n maskHeaders?: (arg: any, span: Span) => any\n\n maskBodyFieldsList?: string[]\n maskHeadersList?: string[]\n\n headersToInclude?: string[]\n headersToExclude?: string[]\n}\n\nconst setDefaultOptions = (\n options: HttpResponseHookOptions | HttpResponseHookOptions\n): Omit<HttpResponseHookOptions & HttpResponseHookOptions, 'maskBody' | 'maskHeaders'>\n & {\n maskBody: (arg: any, span: Span) => any\n maskHeaders: (arg: any, span: Span) => any\n captureHeaders: boolean,\n captureBody: boolean,\n isMaskingEnabled: boolean,\n schemifyDocSpanPayload: boolean,\n uncompressPayload: boolean,\n maxPayloadSizeBytes: number\n } => {\n options.captureHeaders = 'captureHeaders' in options\n ? options.captureHeaders\n : true\n options.captureBody = 'captureBody' in options\n ? options.captureBody\n : true\n options.isMaskingEnabled = 'isMaskingEnabled' in options\n ? options.isMaskingEnabled\n : true\n options.schemifyDocSpanPayload = 'schemifyDocSpanPayload' in options\n ? options.schemifyDocSpanPayload\n : false\n options.uncompressPayload = 'uncompressPayload' in options\n ? options.uncompressPayload\n : true\n options.maskBody = options.maskBody || mask([\n ...(\n Array.isArray(options.maskBodyFieldsList)\n ? options.maskBodyFieldsList\n : sensitiveFields\n ),\n ...(\n Array.isArray(options.maskHeadersList)\n ? options.maskHeadersList\n : sensitiveHeaders\n ),\n ])\n options.maskHeaders = options.maskHeaders || mask([\n ...(\n Array.isArray(options.maskBodyFieldsList)\n ? options.maskBodyFieldsList\n : sensitiveFields\n ),\n ...(\n Array.isArray(options.maskHeadersList)\n ? options.maskHeadersList\n : sensitiveHeaders\n ),\n ])\n options.maxPayloadSizeBytes = options.maxPayloadSizeBytes || MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE\n\n return options as Omit<HttpResponseHookOptions & HttpResponseHookOptions, 'maskBody' | 'maskHeaders'>\n & {\n maskBody: (arg: any, span: Span) => any\n maskHeaders: (arg: any, span: Span) => any\n captureHeaders: boolean,\n captureBody: boolean,\n isMaskingEnabled: boolean,\n schemifyDocSpanPayload: boolean,\n uncompressPayload: boolean,\n maxPayloadSizeBytes: number\n }\n}\n\nexport const SessionRecorderHttpInstrumentationHooksNode = {\n responseHook: (options: HttpResponseHookOptions = {}) =>\n (span: Span, response: IncomingMessage | ServerResponse) => {\n try {\n const _options = setDefaultOptions(options)\n\n if (!_options.captureBody && !_options.captureHeaders) {\n return\n }\n\n const _response = response as ServerResponse\n const traceId = span.spanContext().traceId\n\n if (_response.setHeader) {\n _response.setHeader('X-Trace-Id', traceId)\n }\n\n const [oldWrite, oldEnd] = [_response.write, _response.end]\n\n const chunks: Buffer[] = [];\n\n if (_options.captureBody) {\n (_response.write as unknown) = function (...restArgs: any[]) {\n chunks.push(Buffer.from(restArgs[0]))\n // eslint-disable-next-line\n // @ts-ignore\n oldWrite.apply(_response, restArgs)\n }\n }\n\n // eslint-disable-next-line\n // @ts-ignore\n _response.end = async function (...restArgs) {\n if (_options.captureBody && restArgs[0]) {\n chunks.push(Buffer.from(restArgs[0]))\n }\n\n const responseBuffer = Buffer.concat(chunks)\n\n if (\n _options.captureBody\n && responseBuffer.byteLength > 0\n && responseBuffer.byteLength < _options.maxPayloadSizeBytes\n ) {\n let responseBody: string\n let skipResponseBodyModification = false\n\n if (isGzip(responseBuffer)) {\n if (_options.uncompressPayload) {\n const dezippedBuffer = await new Promise((resolve) => zlib\n .gunzip(responseBuffer, function (err, dezipped) {\n if (err) {\n return resolve(Buffer.from(''))\n } else {\n return resolve(dezipped)\n }\n })) as Buffer\n responseBody = dezippedBuffer.toString('utf-8')\n } else {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,\n 'gzip',\n )\n\n skipResponseBodyModification = true\n responseBody = responseBuffer.toString('hex')\n }\n } else {\n responseBody = responseBuffer.toString('utf-8')\n }\n\n if (!skipResponseBodyModification) {\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n && _options.isMaskingEnabled\n ) {\n responseBody = _options.maskBody(responseBody, span)\n } else if (_options.schemifyDocSpanPayload) {\n responseBody = schemify(responseBody)\n } else if (typeof responseBody !== 'string') {\n responseBody = JSON.stringify(responseBody)\n }\n }\n\n if (responseBody.length) {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY,\n responseBody,\n )\n }\n }\n\n if (_options.captureHeaders) {\n const headers = _options.maskHeaders(_response.getHeaders(), span)\n\n let _headers: any = {}\n\n if (\n !_options.headersToInclude?.length\n && !_options.headersToExclude?.length\n ) {\n _headers = JSON.parse(JSON.stringify(headers))\n } else {\n if (_options.headersToInclude) {\n for (const headerName of _options.headersToInclude) {\n _headers[headerName] = headers[headerName]\n }\n }\n\n if (_options.headersToExclude?.length) {\n for (const headerName of _options.headersToExclude) {\n delete _headers[headerName]\n }\n }\n }\n\n const stringifiedHeaders = JSON.stringify(_headers)\n\n if (stringifiedHeaders?.length) {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS,\n stringifiedHeaders,\n )\n }\n }\n\n // eslint-disable-next-line\n // @ts-ignore\n return oldEnd.apply(_response, restArgs)\n }\n } catch (error) {\n // eslint-disable-next-line\n console.error('An error occured in multiplayer otlp http responseHook', error)\n }\n },\n requestHook: (options: HttpRequestHookOptions = {}) =>\n (span: Span, request: ClientRequest | IncomingMessage) => {\n try {\n const _options = setDefaultOptions(options)\n\n if (!_options.captureBody && !_options.captureHeaders) {\n return\n }\n\n const traceId = span.spanContext().traceId\n const _request = request as IncomingMessage\n\n if (_options.captureHeaders) {\n let _headers: any = {}\n\n if (\n !_options.headersToInclude?.length\n && !_options.headersToExclude?.length\n ) {\n _headers = JSON.parse(JSON.stringify(_request.headers))\n } else {\n if (_options.headersToInclude) {\n for (const headerName of _options.headersToInclude) {\n _headers[headerName] = _request.headers\n }\n }\n\n if (_options.headersToExclude?.length) {\n for (const headerName of _options.headersToExclude) {\n delete _headers[headerName]\n }\n }\n }\n\n const headers = _options.maskHeaders(_headers, span)\n\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,\n JSON.stringify(headers),\n )\n }\n\n const contentType = _request?.headers?.['content-type']\n if (\n _options.captureBody\n && contentType?.includes('application/json')\n ) {\n let body = ''\n _request.on('data', (chunk) => {\n body += chunk\n })\n _request.on('end', () => {\n try {\n const requestBodySizeBytes = Buffer.byteLength(body, 'utf8')\n\n if (\n requestBodySizeBytes === 0\n || requestBodySizeBytes > _options.maxPayloadSizeBytes\n ) {\n return\n }\n\n let requestBody = body\n if (!requestBody) return\n\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n && _options.isMaskingEnabled\n ) {\n requestBody = _options.maskBody(requestBody, span)\n } else if (_options.schemifyDocSpanPayload) {\n requestBody = schemify(requestBody)\n } else if (typeof requestBody !== 'string') {\n requestBody = JSON.stringify(requestBody)\n }\n\n if (requestBody?.length) {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_REQUEST_BODY,\n requestBody,\n )\n }\n } catch (err) {\n // eslint-disable-next-line\n console.error('[MULTIPLAYER-HTTP-REQ-HOOK] An error occured in multiplayer otlp http requestHook', err)\n }\n })\n }\n\n } catch (error) {\n // eslint-disable-next-line\n console.error('An error occured in multiplayer otlp http requestHook', error)\n }\n },\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SessionRecorderHttpInstrumentationHooksNode.js","sourceRoot":"","sources":["../../src/SessionRecorderHttpInstrumentationHooksNode.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IncomingMessage,\n ServerResponse,\n ClientRequest,\n} from 'http'\nimport * as zlib from 'zlib'\nimport type { Span } from '@opentelemetry/api'\nimport {\n ATTR_MULTIPLAYER_HTTP_REQUEST_BODY,\n ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY,\n ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS,\n MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE,\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,\n MULTIPLAYER_TRACE_DEBUG_PREFIX,\n MULTIPLAYER_TRACE_DOC_PREFIX\n} from './constants.node'\nimport {\n mask,\n schemify,\n isGzip,\n} from './sdk'\nimport {\n sensitiveFields,\n sensitiveHeaders\n} from './sdk/mask'\n\ninterface HttpResponseHookOptions {\n maxPayloadSizeBytes?: number\n schemifyDocSpanPayload?: boolean\n uncompressPayload?: boolean\n\n captureHeaders?: boolean\n captureBody?: boolean\n\n isMaskBodyEnabled?: boolean\n isMaskHeadersEnabled?: boolean\n\n maskBody?: (arg: any, span: Span) => any\n maskHeaders?: (arg: any, span: Span) => any\n\n maskBodyFieldsList?: string[]\n maskHeadersList?: string[]\n\n headersToInclude?: string[]\n headersToExclude?: string[]\n}\n\ninterface HttpRequestHookOptions {\n maxPayloadSizeBytes?: number\n schemifyDocSpanPayload?: boolean\n\n captureHeaders?: boolean\n captureBody?: boolean\n\n isMaskBodyEnabled?: boolean\n isMaskHeadersEnabled?: boolean\n\n maskBody?: (arg: any, span: Span) => any\n maskHeaders?: (arg: any, span: Span) => any\n\n maskBodyFieldsList?: string[]\n maskHeadersList?: string[]\n\n headersToInclude?: string[]\n headersToExclude?: string[]\n}\n\nconst setDefaultOptions = (\n options: HttpResponseHookOptions | HttpResponseHookOptions\n): Omit<HttpResponseHookOptions & HttpResponseHookOptions, 'maskBody' | 'maskHeaders'>\n & {\n maskBody: (arg: any, span: Span) => any\n maskHeaders: (arg: any, span: Span) => any\n captureHeaders: boolean,\n captureBody: boolean,\n isMaskBodyEnabled: boolean\n isMaskHeadersEnabled: boolean\n schemifyDocSpanPayload: boolean,\n uncompressPayload: boolean,\n maxPayloadSizeBytes: number\n } => {\n options.captureHeaders = 'captureHeaders' in options\n ? options.captureHeaders\n : true\n options.captureBody = 'captureBody' in options\n ? options.captureBody\n : true\n options.isMaskBodyEnabled = 'isMaskBodyEnabled' in options\n ? options.isMaskBodyEnabled\n : true\n options.isMaskHeadersEnabled = 'isMaskHeadersEnabled' in options\n ? options.isMaskHeadersEnabled\n : true\n options.schemifyDocSpanPayload = 'schemifyDocSpanPayload' in options\n ? options.schemifyDocSpanPayload\n : false\n options.uncompressPayload = 'uncompressPayload' in options\n ? options.uncompressPayload\n : true\n options.maskBody = options.maskBody || mask([\n ...(\n Array.isArray(options.maskBodyFieldsList)\n ? options.maskBodyFieldsList\n : sensitiveFields\n ),\n ...(\n Array.isArray(options.maskHeadersList)\n ? options.maskHeadersList\n : sensitiveHeaders\n ),\n ])\n options.maskHeaders = options.maskHeaders || mask([\n ...(\n Array.isArray(options.maskBodyFieldsList)\n ? options.maskBodyFieldsList\n : sensitiveFields\n ),\n ...(\n Array.isArray(options.maskHeadersList)\n ? options.maskHeadersList\n : sensitiveHeaders\n ),\n ])\n options.maxPayloadSizeBytes = options.maxPayloadSizeBytes || MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE\n\n return options as Omit<HttpResponseHookOptions & HttpResponseHookOptions, 'maskBody' | 'maskHeaders'>\n & {\n maskBody: (arg: any, span: Span) => any\n maskHeaders: (arg: any, span: Span) => any\n captureHeaders: boolean,\n captureBody: boolean,\n isMaskBodyEnabled: boolean,\n isMaskHeadersEnabled: boolean,\n schemifyDocSpanPayload: boolean,\n uncompressPayload: boolean,\n maxPayloadSizeBytes: number\n }\n}\n\nexport const SessionRecorderHttpInstrumentationHooksNode = {\n responseHook: (options: HttpResponseHookOptions = {}) =>\n (span: Span, response: IncomingMessage | ServerResponse) => {\n try {\n const _options = setDefaultOptions(options)\n\n if (!_options.captureBody && !_options.captureHeaders) {\n return\n }\n\n const _response = response as ServerResponse\n const traceId = span.spanContext().traceId\n\n if (_response.setHeader) {\n _response.setHeader('X-Trace-Id', traceId)\n }\n\n const [oldWrite, oldEnd] = [_response.write, _response.end]\n\n const chunks: Buffer[] = [];\n\n if (_options.captureBody) {\n (_response.write as unknown) = function (...restArgs: any[]) {\n chunks.push(Buffer.from(restArgs[0]))\n // eslint-disable-next-line\n // @ts-ignore\n oldWrite.apply(_response, restArgs)\n }\n }\n\n // eslint-disable-next-line\n // @ts-ignore\n _response.end = async function (...restArgs) {\n if (_options.captureBody && restArgs[0]) {\n chunks.push(Buffer.from(restArgs[0]))\n }\n\n const responseBuffer = Buffer.concat(chunks)\n\n if (\n _options.captureBody\n && responseBuffer.byteLength > 0\n && responseBuffer.byteLength < _options.maxPayloadSizeBytes\n ) {\n let responseBody: string\n let skipResponseBodyModification = false\n\n if (isGzip(responseBuffer)) {\n if (_options.uncompressPayload) {\n const dezippedBuffer = await new Promise((resolve) => zlib\n .gunzip(responseBuffer, function (err, dezipped) {\n if (err) {\n return resolve(Buffer.from(''))\n } else {\n return resolve(dezipped)\n }\n })) as Buffer\n responseBody = dezippedBuffer.toString('utf-8')\n } else {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,\n 'gzip',\n )\n\n skipResponseBodyModification = true\n responseBody = responseBuffer.toString('hex')\n }\n } else {\n responseBody = responseBuffer.toString('utf-8')\n }\n\n if (!skipResponseBodyModification) {\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n && _options.isMaskBodyEnabled\n ) {\n responseBody = _options.maskBody(responseBody, span)\n } else if (\n traceId.startsWith(MULTIPLAYER_TRACE_DOC_PREFIX)\n && _options.schemifyDocSpanPayload\n ) {\n responseBody = schemify(responseBody)\n } else if (typeof responseBody !== 'string') {\n responseBody = JSON.stringify(responseBody)\n }\n }\n\n if (responseBody.length) {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY,\n responseBody,\n )\n }\n }\n\n if (_options.captureHeaders) {\n const headers = (options.isMaskHeadersEnabled\n ? _options.maskHeaders(_response.getHeaders(), span)\n : _response.getHeaders()) || {}\n\n let _headers: any = {}\n\n\n if (_options.headersToInclude) {\n for (const headerName of _options.headersToInclude) {\n _headers[headerName] = headers[headerName]\n }\n } else {\n _headers = JSON.parse(JSON.stringify(headers))\n }\n\n if (_options.headersToExclude?.length) {\n for (const headerName of _options.headersToExclude) {\n delete _headers[headerName]\n }\n }\n\n const stringifiedHeaders = JSON.stringify(_headers)\n\n if (stringifiedHeaders?.length) {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS,\n stringifiedHeaders,\n )\n }\n }\n\n // eslint-disable-next-line\n // @ts-ignore\n return oldEnd.apply(_response, restArgs)\n }\n } catch (error) {\n // eslint-disable-next-line\n console.error('An error occured in multiplayer otlp http responseHook', error)\n }\n },\n requestHook: (options: HttpRequestHookOptions = {}) =>\n (span: Span, request: ClientRequest | IncomingMessage) => {\n try {\n const _options = setDefaultOptions(options)\n\n if (!_options.captureBody && !_options.captureHeaders) {\n return\n }\n\n const traceId = span.spanContext().traceId\n const _request = request as IncomingMessage\n\n if (_options.captureHeaders) {\n const headers = (_options.isMaskHeadersEnabled\n ? _options.maskHeaders(_request.headers, span)\n : _request.headers) || {}\n let _headers: any = {}\n\n if (_options.headersToInclude) {\n for (const headerName of _options.headersToInclude) {\n _headers[headerName] = headers[headerName]\n }\n } else {\n _headers = JSON.parse(JSON.stringify(headers))\n }\n\n if (_options.headersToExclude?.length) {\n for (const headerName of _options.headersToExclude) {\n delete _headers[headerName]\n }\n }\n\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,\n JSON.stringify(_headers),\n )\n }\n\n const contentType = _request?.headers?.['content-type']\n if (\n _options.captureBody\n && contentType?.includes('application/json')\n ) {\n let body = ''\n _request.on('data', (chunk) => {\n body += chunk\n })\n _request.on('end', () => {\n try {\n const requestBodySizeBytes = Buffer.byteLength(body, 'utf8')\n\n if (\n requestBodySizeBytes === 0\n || requestBodySizeBytes > _options.maxPayloadSizeBytes\n ) {\n return\n }\n\n let requestBody = body\n if (!requestBody) return\n\n if (\n traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)\n && _options.isMaskBodyEnabled\n ) {\n requestBody = _options.maskBody(requestBody, span)\n } else if (\n traceId.startsWith(MULTIPLAYER_TRACE_DOC_PREFIX)\n && _options.schemifyDocSpanPayload\n ) {\n requestBody = schemify(requestBody)\n } else if (typeof requestBody !== 'string') {\n requestBody = JSON.stringify(requestBody)\n }\n\n if (requestBody?.length) {\n span.setAttribute(\n ATTR_MULTIPLAYER_HTTP_REQUEST_BODY,\n requestBody,\n )\n }\n } catch (err) {\n // eslint-disable-next-line\n console.error('[MULTIPLAYER-HTTP-REQ-HOOK] An error occured in multiplayer otlp http requestHook', err)\n }\n })\n }\n\n } catch (error) {\n // eslint-disable-next-line\n console.error('An error occured in multiplayer otlp http requestHook', error)\n }\n },\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-exception.d.ts","sourceRoot":"","sources":["../../../src/sdk/capture-exception.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"capture-exception.d.ts","sourceRoot":"","sources":["../../../src/sdk/capture-exception.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,SAW5C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../../src/sdk/id-generator.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../../src/sdk/id-generator.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,iBAc3C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-gzip.d.ts","sourceRoot":"","sources":["../../../src/sdk/is-gzip.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"is-gzip.d.ts","sourceRoot":"","sources":["../../../src/sdk/is-gzip.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,GAAG,UAAU,YAM9C,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../../../src/sdk/mask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAI9C,eAAO,MAAM,eAAe,EAAE,MAAM,EAoEnC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAKpC,CAAA;
|
|
1
|
+
{"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../../../src/sdk/mask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAI9C,eAAO,MAAM,eAAe,EAAE,MAAM,EAoEnC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAKpC,CAAA;yBA+De,aAAY,MAAM,EAAO,MAAM,OAAO,GAAG,EAAE,MAAM,IAAI,KAAG,GAAG;AAA3E,wBAkBC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-continuous-deb-session.d.ts","sourceRoot":"","sources":["../../../src/sdk/save-continuous-deb-session.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"save-continuous-deb-session.d.ts","sourceRoot":"","sources":["../../../src/sdk/save-continuous-deb-session.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAC9B,SAAS,MAAM,SAgBlB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemify.d.ts","sourceRoot":"","sources":["../../../src/sdk/schemify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"schemify.d.ts","sourceRoot":"","sources":["../../../src/sdk/schemify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;yBAuB7C,SAAS,MAAM,GAAG,MAAM,GAAG,SAAS,EACpC,mBAAgB,EAChB,UAAS,aAAa,CAAC,OAAgC,KACtD,GAAG;AAJN,wBAmCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-attribute.d.ts","sourceRoot":"","sources":["../../../src/sdk/set-attribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEf,MAAM,oBAAoB,CAAA;AAc3B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"set-attribute.d.ts","sourceRoot":"","sources":["../../../src/sdk/set-attribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEf,MAAM,oBAAoB,CAAA;AAc3B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,EAAE,OAAO,cAAc,SAK9D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,GAAG,EACT,UAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAmB,SAU5C,CAAA"}
|
package/package.json
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE,
|
|
14
14
|
ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,
|
|
15
15
|
MULTIPLAYER_TRACE_DEBUG_PREFIX,
|
|
16
|
+
MULTIPLAYER_TRACE_DOC_PREFIX
|
|
16
17
|
} from './constants.node'
|
|
17
18
|
import {
|
|
18
19
|
mask,
|
|
@@ -32,7 +33,8 @@ interface HttpResponseHookOptions {
|
|
|
32
33
|
captureHeaders?: boolean
|
|
33
34
|
captureBody?: boolean
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
isMaskBodyEnabled?: boolean
|
|
37
|
+
isMaskHeadersEnabled?: boolean
|
|
36
38
|
|
|
37
39
|
maskBody?: (arg: any, span: Span) => any
|
|
38
40
|
maskHeaders?: (arg: any, span: Span) => any
|
|
@@ -51,7 +53,8 @@ interface HttpRequestHookOptions {
|
|
|
51
53
|
captureHeaders?: boolean
|
|
52
54
|
captureBody?: boolean
|
|
53
55
|
|
|
54
|
-
|
|
56
|
+
isMaskBodyEnabled?: boolean
|
|
57
|
+
isMaskHeadersEnabled?: boolean
|
|
55
58
|
|
|
56
59
|
maskBody?: (arg: any, span: Span) => any
|
|
57
60
|
maskHeaders?: (arg: any, span: Span) => any
|
|
@@ -71,7 +74,8 @@ const setDefaultOptions = (
|
|
|
71
74
|
maskHeaders: (arg: any, span: Span) => any
|
|
72
75
|
captureHeaders: boolean,
|
|
73
76
|
captureBody: boolean,
|
|
74
|
-
|
|
77
|
+
isMaskBodyEnabled: boolean
|
|
78
|
+
isMaskHeadersEnabled: boolean
|
|
75
79
|
schemifyDocSpanPayload: boolean,
|
|
76
80
|
uncompressPayload: boolean,
|
|
77
81
|
maxPayloadSizeBytes: number
|
|
@@ -82,8 +86,11 @@ const setDefaultOptions = (
|
|
|
82
86
|
options.captureBody = 'captureBody' in options
|
|
83
87
|
? options.captureBody
|
|
84
88
|
: true
|
|
85
|
-
options.
|
|
86
|
-
? options.
|
|
89
|
+
options.isMaskBodyEnabled = 'isMaskBodyEnabled' in options
|
|
90
|
+
? options.isMaskBodyEnabled
|
|
91
|
+
: true
|
|
92
|
+
options.isMaskHeadersEnabled = 'isMaskHeadersEnabled' in options
|
|
93
|
+
? options.isMaskHeadersEnabled
|
|
87
94
|
: true
|
|
88
95
|
options.schemifyDocSpanPayload = 'schemifyDocSpanPayload' in options
|
|
89
96
|
? options.schemifyDocSpanPayload
|
|
@@ -123,7 +130,8 @@ const setDefaultOptions = (
|
|
|
123
130
|
maskHeaders: (arg: any, span: Span) => any
|
|
124
131
|
captureHeaders: boolean,
|
|
125
132
|
captureBody: boolean,
|
|
126
|
-
|
|
133
|
+
isMaskBodyEnabled: boolean,
|
|
134
|
+
isMaskHeadersEnabled: boolean,
|
|
127
135
|
schemifyDocSpanPayload: boolean,
|
|
128
136
|
uncompressPayload: boolean,
|
|
129
137
|
maxPayloadSizeBytes: number
|
|
@@ -204,10 +212,13 @@ export const SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
204
212
|
if (!skipResponseBodyModification) {
|
|
205
213
|
if (
|
|
206
214
|
traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
207
|
-
&& _options.
|
|
215
|
+
&& _options.isMaskBodyEnabled
|
|
208
216
|
) {
|
|
209
217
|
responseBody = _options.maskBody(responseBody, span)
|
|
210
|
-
} else if (
|
|
218
|
+
} else if (
|
|
219
|
+
traceId.startsWith(MULTIPLAYER_TRACE_DOC_PREFIX)
|
|
220
|
+
&& _options.schemifyDocSpanPayload
|
|
221
|
+
) {
|
|
211
222
|
responseBody = schemify(responseBody)
|
|
212
223
|
} else if (typeof responseBody !== 'string') {
|
|
213
224
|
responseBody = JSON.stringify(responseBody)
|
|
@@ -223,26 +234,24 @@ export const SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
223
234
|
}
|
|
224
235
|
|
|
225
236
|
if (_options.captureHeaders) {
|
|
226
|
-
const headers =
|
|
237
|
+
const headers = (options.isMaskHeadersEnabled
|
|
238
|
+
? _options.maskHeaders(_response.getHeaders(), span)
|
|
239
|
+
: _response.getHeaders()) || {}
|
|
227
240
|
|
|
228
241
|
let _headers: any = {}
|
|
229
242
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
_headers = JSON.parse(JSON.stringify(headers))
|
|
235
|
-
} else {
|
|
236
|
-
if (_options.headersToInclude) {
|
|
237
|
-
for (const headerName of _options.headersToInclude) {
|
|
238
|
-
_headers[headerName] = headers[headerName]
|
|
239
|
-
}
|
|
243
|
+
|
|
244
|
+
if (_options.headersToInclude) {
|
|
245
|
+
for (const headerName of _options.headersToInclude) {
|
|
246
|
+
_headers[headerName] = headers[headerName]
|
|
240
247
|
}
|
|
248
|
+
} else {
|
|
249
|
+
_headers = JSON.parse(JSON.stringify(headers))
|
|
250
|
+
}
|
|
241
251
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
252
|
+
if (_options.headersToExclude?.length) {
|
|
253
|
+
for (const headerName of _options.headersToExclude) {
|
|
254
|
+
delete _headers[headerName]
|
|
246
255
|
}
|
|
247
256
|
}
|
|
248
257
|
|
|
@@ -278,32 +287,28 @@ export const SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
278
287
|
const _request = request as IncomingMessage
|
|
279
288
|
|
|
280
289
|
if (_options.captureHeaders) {
|
|
290
|
+
const headers = (_options.isMaskHeadersEnabled
|
|
291
|
+
? _options.maskHeaders(_request.headers, span)
|
|
292
|
+
: _request.headers) || {}
|
|
281
293
|
let _headers: any = {}
|
|
282
294
|
|
|
283
|
-
if (
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
) {
|
|
287
|
-
_headers = JSON.parse(JSON.stringify(_request.headers))
|
|
288
|
-
} else {
|
|
289
|
-
if (_options.headersToInclude) {
|
|
290
|
-
for (const headerName of _options.headersToInclude) {
|
|
291
|
-
_headers[headerName] = _request.headers
|
|
292
|
-
}
|
|
295
|
+
if (_options.headersToInclude) {
|
|
296
|
+
for (const headerName of _options.headersToInclude) {
|
|
297
|
+
_headers[headerName] = headers[headerName]
|
|
293
298
|
}
|
|
299
|
+
} else {
|
|
300
|
+
_headers = JSON.parse(JSON.stringify(headers))
|
|
301
|
+
}
|
|
294
302
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}
|
|
303
|
+
if (_options.headersToExclude?.length) {
|
|
304
|
+
for (const headerName of _options.headersToExclude) {
|
|
305
|
+
delete _headers[headerName]
|
|
299
306
|
}
|
|
300
307
|
}
|
|
301
308
|
|
|
302
|
-
const headers = _options.maskHeaders(_headers, span)
|
|
303
|
-
|
|
304
309
|
span.setAttribute(
|
|
305
310
|
ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,
|
|
306
|
-
JSON.stringify(
|
|
311
|
+
JSON.stringify(_headers),
|
|
307
312
|
)
|
|
308
313
|
}
|
|
309
314
|
|
|
@@ -332,10 +337,13 @@ export const SessionRecorderHttpInstrumentationHooksNode = {
|
|
|
332
337
|
|
|
333
338
|
if (
|
|
334
339
|
traceId.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
335
|
-
&& _options.
|
|
340
|
+
&& _options.isMaskBodyEnabled
|
|
336
341
|
) {
|
|
337
342
|
requestBody = _options.maskBody(requestBody, span)
|
|
338
|
-
} else if (
|
|
343
|
+
} else if (
|
|
344
|
+
traceId.startsWith(MULTIPLAYER_TRACE_DOC_PREFIX)
|
|
345
|
+
&& _options.schemifyDocSpanPayload
|
|
346
|
+
) {
|
|
339
347
|
requestBody = schemify(requestBody)
|
|
340
348
|
} else if (typeof requestBody !== 'string') {
|
|
341
349
|
requestBody = JSON.stringify(requestBody)
|