@multiplayer-app/session-recorder-common 0.0.1
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/LICENSE +22 -0
- package/README.md +230 -0
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.d.ts +35 -0
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -0
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.js +355 -0
- package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -0
- package/dist/esm/SessionRecorderHttpTraceExporterBrowser.d.ts +26 -0
- package/dist/esm/SessionRecorderHttpTraceExporterBrowser.d.ts.map +1 -0
- package/dist/esm/SessionRecorderHttpTraceExporterBrowser.js +116 -0
- package/dist/esm/SessionRecorderHttpTraceExporterBrowser.js.map +1 -0
- package/dist/esm/SessionRecorderIdGenerator.d.ts +15 -0
- package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -0
- package/dist/esm/SessionRecorderIdGenerator.js +63 -0
- package/dist/esm/SessionRecorderIdGenerator.js.map +1 -0
- package/dist/esm/SessionRecorderJsonTraceSerializer.d.ts +4 -0
- package/dist/esm/SessionRecorderJsonTraceSerializer.d.ts.map +1 -0
- package/dist/esm/SessionRecorderJsonTraceSerializer.js +26 -0
- package/dist/esm/SessionRecorderJsonTraceSerializer.js.map +1 -0
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.d.ts +11 -0
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -0
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js +45 -0
- package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -0
- package/dist/esm/constants.base.d.ts +32 -0
- package/dist/esm/constants.base.d.ts.map +1 -0
- package/dist/esm/constants.base.js +32 -0
- package/dist/esm/constants.base.js.map +1 -0
- package/dist/esm/constants.browser.d.ts +2 -0
- package/dist/esm/constants.browser.d.ts.map +1 -0
- package/dist/esm/constants.browser.js +2 -0
- package/dist/esm/constants.browser.js.map +1 -0
- package/dist/esm/constants.node.d.ts +3 -0
- package/dist/esm/constants.node.d.ts.map +1 -0
- package/dist/esm/constants.node.js +5 -0
- package/dist/esm/constants.node.js.map +1 -0
- package/dist/esm/index-browser.d.ts +8 -0
- package/dist/esm/index-browser.d.ts.map +1 -0
- package/dist/esm/index-browser.js +9 -0
- package/dist/esm/index-browser.js.map +1 -0
- package/dist/esm/index-node.d.ts +8 -0
- package/dist/esm/index-node.d.ts.map +1 -0
- package/dist/esm/index-node.js +9 -0
- package/dist/esm/index-node.js.map +1 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/sdk/capture-exception.d.ts +7 -0
- package/dist/esm/sdk/capture-exception.d.ts.map +1 -0
- package/dist/esm/sdk/capture-exception.js +19 -0
- package/dist/esm/sdk/capture-exception.js.map +1 -0
- package/dist/esm/sdk/id-generator.d.ts +2 -0
- package/dist/esm/sdk/id-generator.d.ts.map +1 -0
- package/dist/esm/sdk/id-generator.js +14 -0
- package/dist/esm/sdk/id-generator.js.map +1 -0
- package/dist/esm/sdk/index.d.ts +8 -0
- package/dist/esm/sdk/index.d.ts.map +1 -0
- package/dist/esm/sdk/index.js +8 -0
- package/dist/esm/sdk/index.js.map +1 -0
- package/dist/esm/sdk/is-gzip.d.ts +2 -0
- package/dist/esm/sdk/is-gzip.d.ts.map +1 -0
- package/dist/esm/sdk/is-gzip.js +7 -0
- package/dist/esm/sdk/is-gzip.js.map +1 -0
- package/dist/esm/sdk/mask.d.ts +6 -0
- package/dist/esm/sdk/mask.d.ts.map +1 -0
- package/dist/esm/sdk/mask.js +148 -0
- package/dist/esm/sdk/mask.js.map +1 -0
- package/dist/esm/sdk/save-continuous-deb-session.d.ts +7 -0
- package/dist/esm/sdk/save-continuous-deb-session.d.ts.map +1 -0
- package/dist/esm/sdk/save-continuous-deb-session.js +21 -0
- package/dist/esm/sdk/save-continuous-deb-session.js.map +1 -0
- package/dist/esm/sdk/schemify.d.ts +4 -0
- package/dist/esm/sdk/schemify.d.ts.map +1 -0
- package/dist/esm/sdk/schemify.js +51 -0
- package/dist/esm/sdk/schemify.js.map +1 -0
- package/dist/esm/sdk/set-attribute.d.ts +90 -0
- package/dist/esm/sdk/set-attribute.d.ts.map +1 -0
- package/dist/esm/sdk/set-attribute.js +160 -0
- package/dist/esm/sdk/set-attribute.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/type/index.d.ts +2 -0
- package/dist/esm/type/index.d.ts.map +1 -0
- package/dist/esm/type/index.js +2 -0
- package/dist/esm/type/index.js.map +1 -0
- package/dist/esm/type/session-type.enum.d.ts +5 -0
- package/dist/esm/type/session-type.enum.d.ts.map +1 -0
- package/dist/esm/type/session-type.enum.js +6 -0
- package/dist/esm/type/session-type.enum.js.map +1 -0
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.d.ts +35 -0
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -0
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.js +221 -0
- package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -0
- package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.d.ts +26 -0
- package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.d.ts.map +1 -0
- package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.js +82 -0
- package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.js.map +1 -0
- package/dist/esnext/SessionRecorderIdGenerator.d.ts +15 -0
- package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -0
- package/dist/esnext/SessionRecorderIdGenerator.js +42 -0
- package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -0
- package/dist/esnext/SessionRecorderJsonTraceSerializer.d.ts +4 -0
- package/dist/esnext/SessionRecorderJsonTraceSerializer.d.ts.map +1 -0
- package/dist/esnext/SessionRecorderJsonTraceSerializer.js +26 -0
- package/dist/esnext/SessionRecorderJsonTraceSerializer.js.map +1 -0
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.d.ts +11 -0
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -0
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js +42 -0
- package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -0
- package/dist/esnext/constants.base.d.ts +32 -0
- package/dist/esnext/constants.base.d.ts.map +1 -0
- package/dist/esnext/constants.base.js +32 -0
- package/dist/esnext/constants.base.js.map +1 -0
- package/dist/esnext/constants.browser.d.ts +2 -0
- package/dist/esnext/constants.browser.d.ts.map +1 -0
- package/dist/esnext/constants.browser.js +2 -0
- package/dist/esnext/constants.browser.js.map +1 -0
- package/dist/esnext/constants.node.d.ts +3 -0
- package/dist/esnext/constants.node.d.ts.map +1 -0
- package/dist/esnext/constants.node.js +5 -0
- package/dist/esnext/constants.node.js.map +1 -0
- package/dist/esnext/index-browser.d.ts +8 -0
- package/dist/esnext/index-browser.d.ts.map +1 -0
- package/dist/esnext/index-browser.js +8 -0
- package/dist/esnext/index-browser.js.map +1 -0
- package/dist/esnext/index-node.d.ts +8 -0
- package/dist/esnext/index-node.d.ts.map +1 -0
- package/dist/esnext/index-node.js +8 -0
- package/dist/esnext/index-node.js.map +1 -0
- package/dist/esnext/index.d.ts +9 -0
- package/dist/esnext/index.d.ts.map +1 -0
- package/dist/esnext/index.js +9 -0
- package/dist/esnext/index.js.map +1 -0
- package/dist/esnext/sdk/capture-exception.d.ts +7 -0
- package/dist/esnext/sdk/capture-exception.d.ts.map +1 -0
- package/dist/esnext/sdk/capture-exception.js +19 -0
- package/dist/esnext/sdk/capture-exception.js.map +1 -0
- package/dist/esnext/sdk/id-generator.d.ts +2 -0
- package/dist/esnext/sdk/id-generator.d.ts.map +1 -0
- package/dist/esnext/sdk/id-generator.js +14 -0
- package/dist/esnext/sdk/id-generator.js.map +1 -0
- package/dist/esnext/sdk/index.d.ts +8 -0
- package/dist/esnext/sdk/index.d.ts.map +1 -0
- package/dist/esnext/sdk/index.js +8 -0
- package/dist/esnext/sdk/index.js.map +1 -0
- package/dist/esnext/sdk/is-gzip.d.ts +2 -0
- package/dist/esnext/sdk/is-gzip.d.ts.map +1 -0
- package/dist/esnext/sdk/is-gzip.js +7 -0
- package/dist/esnext/sdk/is-gzip.js.map +1 -0
- package/dist/esnext/sdk/mask.d.ts +6 -0
- package/dist/esnext/sdk/mask.d.ts.map +1 -0
- package/dist/esnext/sdk/mask.js +144 -0
- package/dist/esnext/sdk/mask.js.map +1 -0
- package/dist/esnext/sdk/save-continuous-deb-session.d.ts +7 -0
- package/dist/esnext/sdk/save-continuous-deb-session.d.ts.map +1 -0
- package/dist/esnext/sdk/save-continuous-deb-session.js +21 -0
- package/dist/esnext/sdk/save-continuous-deb-session.js.map +1 -0
- package/dist/esnext/sdk/schemify.d.ts +4 -0
- package/dist/esnext/sdk/schemify.d.ts.map +1 -0
- package/dist/esnext/sdk/schemify.js +49 -0
- package/dist/esnext/sdk/schemify.js.map +1 -0
- package/dist/esnext/sdk/set-attribute.d.ts +90 -0
- package/dist/esnext/sdk/set-attribute.d.ts.map +1 -0
- package/dist/esnext/sdk/set-attribute.js +151 -0
- package/dist/esnext/sdk/set-attribute.js.map +1 -0
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -0
- package/dist/esnext/type/index.d.ts +2 -0
- package/dist/esnext/type/index.d.ts.map +1 -0
- package/dist/esnext/type/index.js +2 -0
- package/dist/esnext/type/index.js.map +1 -0
- package/dist/esnext/type/session-type.enum.d.ts +5 -0
- package/dist/esnext/type/session-type.enum.d.ts.map +1 -0
- package/dist/esnext/type/session-type.enum.js +6 -0
- package/dist/esnext/type/session-type.enum.js.map +1 -0
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.d.ts +35 -0
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -0
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.js +224 -0
- package/dist/src/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -0
- package/dist/src/SessionRecorderHttpTraceExporterBrowser.d.ts +26 -0
- package/dist/src/SessionRecorderHttpTraceExporterBrowser.d.ts.map +1 -0
- package/dist/src/SessionRecorderHttpTraceExporterBrowser.js +86 -0
- package/dist/src/SessionRecorderHttpTraceExporterBrowser.js.map +1 -0
- package/dist/src/SessionRecorderIdGenerator.d.ts +15 -0
- package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -0
- package/dist/src/SessionRecorderIdGenerator.js +46 -0
- package/dist/src/SessionRecorderIdGenerator.js.map +1 -0
- package/dist/src/SessionRecorderJsonTraceSerializer.d.ts +4 -0
- package/dist/src/SessionRecorderJsonTraceSerializer.d.ts.map +1 -0
- package/dist/src/SessionRecorderJsonTraceSerializer.js +29 -0
- package/dist/src/SessionRecorderJsonTraceSerializer.js.map +1 -0
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.d.ts +11 -0
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -0
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js +46 -0
- package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -0
- package/dist/src/constants.base.d.ts +32 -0
- package/dist/src/constants.base.d.ts.map +1 -0
- package/dist/src/constants.base.js +35 -0
- package/dist/src/constants.base.js.map +1 -0
- package/dist/src/constants.browser.d.ts +2 -0
- package/dist/src/constants.browser.d.ts.map +1 -0
- package/dist/src/constants.browser.js +18 -0
- package/dist/src/constants.browser.js.map +1 -0
- package/dist/src/constants.node.d.ts +3 -0
- package/dist/src/constants.node.d.ts.map +1 -0
- package/dist/src/constants.node.js +22 -0
- package/dist/src/constants.node.js.map +1 -0
- package/dist/src/index-browser.d.ts +8 -0
- package/dist/src/index-browser.d.ts.map +1 -0
- package/dist/src/index-browser.js +29 -0
- package/dist/src/index-browser.js.map +1 -0
- package/dist/src/index-node.d.ts +8 -0
- package/dist/src/index-node.d.ts.map +1 -0
- package/dist/src/index-node.js +29 -0
- package/dist/src/index-node.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +31 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/sdk/capture-exception.d.ts +7 -0
- package/dist/src/sdk/capture-exception.d.ts.map +1 -0
- package/dist/src/sdk/capture-exception.js +23 -0
- package/dist/src/sdk/capture-exception.js.map +1 -0
- package/dist/src/sdk/id-generator.d.ts +2 -0
- package/dist/src/sdk/id-generator.d.ts.map +1 -0
- package/dist/src/sdk/id-generator.js +18 -0
- package/dist/src/sdk/id-generator.js.map +1 -0
- package/dist/src/sdk/index.d.ts +8 -0
- package/dist/src/sdk/index.d.ts.map +1 -0
- package/dist/src/sdk/index.js +29 -0
- package/dist/src/sdk/index.js.map +1 -0
- package/dist/src/sdk/is-gzip.d.ts +2 -0
- package/dist/src/sdk/is-gzip.d.ts.map +1 -0
- package/dist/src/sdk/is-gzip.js +11 -0
- package/dist/src/sdk/is-gzip.js.map +1 -0
- package/dist/src/sdk/mask.d.ts +6 -0
- package/dist/src/sdk/mask.d.ts.map +1 -0
- package/dist/src/sdk/mask.js +147 -0
- package/dist/src/sdk/mask.js.map +1 -0
- package/dist/src/sdk/save-continuous-deb-session.d.ts +7 -0
- package/dist/src/sdk/save-continuous-deb-session.d.ts.map +1 -0
- package/dist/src/sdk/save-continuous-deb-session.js +25 -0
- package/dist/src/sdk/save-continuous-deb-session.js.map +1 -0
- package/dist/src/sdk/schemify.d.ts +4 -0
- package/dist/src/sdk/schemify.d.ts.map +1 -0
- package/dist/src/sdk/schemify.js +51 -0
- package/dist/src/sdk/schemify.js.map +1 -0
- package/dist/src/sdk/set-attribute.d.ts +90 -0
- package/dist/src/sdk/set-attribute.d.ts.map +1 -0
- package/dist/src/sdk/set-attribute.js +164 -0
- package/dist/src/sdk/set-attribute.js.map +1 -0
- package/dist/src/type/index.d.ts +2 -0
- package/dist/src/type/index.d.ts.map +1 -0
- package/dist/src/type/index.js +18 -0
- package/dist/src/type/index.js.map +1 -0
- package/dist/src/type/session-type.enum.d.ts +5 -0
- package/dist/src/type/session-type.enum.d.ts.map +1 -0
- package/dist/src/type/session-type.enum.js +9 -0
- package/dist/src/type/session-type.enum.js.map +1 -0
- package/package.json +50 -0
- package/src/SessionRecorderHttpInstrumentationHooksNode.ts +362 -0
- package/src/SessionRecorderHttpTraceExporterBrowser.ts +123 -0
- package/src/SessionRecorderIdGenerator.ts +72 -0
- package/src/SessionRecorderJsonTraceSerializer.ts +43 -0
- package/src/SessionRecorderTraceIdRatioBasedSampler.ts +57 -0
- package/src/constants.base.ts +61 -0
- package/src/constants.browser.ts +1 -0
- package/src/constants.node.ts +5 -0
- package/src/index-browser.ts +7 -0
- package/src/index-node.ts +7 -0
- package/src/index.ts +8 -0
- package/src/sdk/capture-exception.ts +19 -0
- package/src/sdk/id-generator.ts +17 -0
- package/src/sdk/index.ts +7 -0
- package/src/sdk/is-gzip.ts +7 -0
- package/src/sdk/mask.ts +161 -0
- package/src/sdk/save-continuous-deb-session.ts +28 -0
- package/src/sdk/schemify.ts +58 -0
- package/src/sdk/set-attribute.ts +210 -0
- package/src/type/index.ts +1 -0
- package/src/type/session-type.enum.ts +4 -0
- package/tsconfig.base.es5.json +8 -0
- package/tsconfig.base.esm.json +7 -0
- package/tsconfig.base.esnext.json +10 -0
- package/tsconfig.base.json +35 -0
- package/tsconfig.esm.json +12 -0
- package/tsconfig.esnext.json +12 -0
- package/tsconfig.json +25 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
MIT License
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2024 Multiplayer Software, Inc.
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# Session Recorder OpenTelemetry Core
|
|
2
|
+
|
|
3
|
+
This package provides implementations of the OpenTelemetry API for trace and metrics. It's intended for use both on the server and in the browser.
|
|
4
|
+
|
|
5
|
+
## Built-in Implementations
|
|
6
|
+
|
|
7
|
+
- [Session Recorder OpenTelemetry Core](#session-recorder-opentelemetry-core)
|
|
8
|
+
- [Built-in Implementations](#built-in-implementations)
|
|
9
|
+
- [Constants](#constants)
|
|
10
|
+
- [Setup opentelemetry for capturing http request/response body](#session-recorder-http-instrumentation-hooks-node)
|
|
11
|
+
- [Session Recorder Http Trace exporter web](#session-recorder-http-trace-exporter-web)
|
|
12
|
+
- [Session Recorder id generator](#session-recorder-id-generator)
|
|
13
|
+
- [Trace id ratio based sampler](#trace-id-ratio-based-sampler)
|
|
14
|
+
- [Helper for capturing exception in session recording](#helper-for-capturing-exceptions)
|
|
15
|
+
- [Helpers for adding content to session recording](#helper-for-setting-attributes-to-span)
|
|
16
|
+
- [License](#license)
|
|
17
|
+
|
|
18
|
+
### Constants
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
import {
|
|
22
|
+
MULTIPLAYER_TRACE_DOC_PREFIX,
|
|
23
|
+
MULTIPLAYER_TRACE_DEBUG_PREFIX,
|
|
24
|
+
MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL,
|
|
25
|
+
MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL,
|
|
26
|
+
MULTIPLAYER_ATTRIBUTE_PREFIX,
|
|
27
|
+
MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE,
|
|
28
|
+
ATTR_MULTIPLAYER_DEBUG_SESSION,
|
|
29
|
+
ATTR_MULTIPLAYER_HTTP_REQUEST_BODY,
|
|
30
|
+
ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY,
|
|
31
|
+
ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,
|
|
32
|
+
ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS,
|
|
33
|
+
ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,
|
|
34
|
+
ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE,
|
|
35
|
+
ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE,
|
|
36
|
+
ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE,
|
|
37
|
+
ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE,
|
|
38
|
+
ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY,
|
|
39
|
+
} from '@multiplayer-app/session-recorder-opentelemetry'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Setup opentelemetry for capturing http request/response body
|
|
43
|
+
|
|
44
|
+
Session Recorder hooks for nodejs http instrumentation for injecting http request/response headers and payload to span.
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'
|
|
48
|
+
import { type Instrumentation } from '@opentelemetry/instrumentation'
|
|
49
|
+
import { SessionRecorderHttpInstrumentationHooks } from '@multiplayer-app/session-recorder-opentelemetry'
|
|
50
|
+
|
|
51
|
+
export const instrumentations: Instrumentation[] = getNodeAutoInstrumentations({
|
|
52
|
+
'@opentelemetry/instrumentation-http': {
|
|
53
|
+
enabled: true,
|
|
54
|
+
responseHook: SessionRecorderHttpInstrumentationHooks.responseHook({
|
|
55
|
+
maxPayloadSizeBytes: 1000,
|
|
56
|
+
uncompressPayload: true,
|
|
57
|
+
captureHeaders: true,
|
|
58
|
+
captureBody: true,
|
|
59
|
+
isMaskingEnabled: true,
|
|
60
|
+
maskBody: (data, span) => {
|
|
61
|
+
// mask logic here
|
|
62
|
+
return data
|
|
63
|
+
},
|
|
64
|
+
maskHeaders: (data, span) => {
|
|
65
|
+
// mask logic here
|
|
66
|
+
return data
|
|
67
|
+
},
|
|
68
|
+
maskBodyFieldsList: ['password', 'card'],
|
|
69
|
+
maskHeadersList: ['x-trace-id'],
|
|
70
|
+
headersToInclude: ['Set-Cookie', 'Authorization'],
|
|
71
|
+
headersToExclude: ['Cookie'],
|
|
72
|
+
}),
|
|
73
|
+
requestHook: SessionRecorderHttpInstrumentationHooks.requestHook({
|
|
74
|
+
maxPayloadSizeBytes: 1000,
|
|
75
|
+
captureHeaders: true,
|
|
76
|
+
captureBody: true,
|
|
77
|
+
isMaskingEnabled: true,
|
|
78
|
+
maskBody: (data, span) => {
|
|
79
|
+
// mask logic here
|
|
80
|
+
return data
|
|
81
|
+
},
|
|
82
|
+
maskHeaders: (data, span) => {
|
|
83
|
+
// mask logic here
|
|
84
|
+
return data
|
|
85
|
+
},
|
|
86
|
+
maskBodyFieldsList: ['password', 'card'],
|
|
87
|
+
maskHeadersList: ['x-trace-id'],
|
|
88
|
+
headersToInclude: ['Set-Cookie', 'Authorization'],
|
|
89
|
+
headersToExclude: ['Cookie'],
|
|
90
|
+
}),
|
|
91
|
+
},
|
|
92
|
+
)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Session Recorder Http Trace exporter web
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
|
|
99
|
+
import { SessionRecorderHttpTraceExporterBrowser } from '@multiplayer-app/session-recorder-opentelemetry'
|
|
100
|
+
|
|
101
|
+
const collectorOptions = {
|
|
102
|
+
url: '<opentelemetry-collector-url>', // url is optional and can be omitted - default is https://api.multiplayer.app/v1/traces
|
|
103
|
+
apiKey: '<multiplayer-otlp-key>' // api key from multiplayer integration
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const exporter = new SessionRecorderHttpTraceExporterBrowser(collectorOptions)
|
|
107
|
+
const provider = new WebTracerProvider({
|
|
108
|
+
spanProcessors: [
|
|
109
|
+
new BatchSpanProcessor(exporter, {
|
|
110
|
+
// The maximum queue size. After the size is reached spans are dropped.
|
|
111
|
+
maxQueueSize: 100,
|
|
112
|
+
// The maximum batch size of every export. It must be smaller or equal to maxQueueSize.
|
|
113
|
+
maxExportBatchSize: 10,
|
|
114
|
+
// The interval between two consecutive exports
|
|
115
|
+
scheduledDelayMillis: 500,
|
|
116
|
+
// How long the export can run before it is cancelled
|
|
117
|
+
exportTimeoutMillis: 30000
|
|
118
|
+
})
|
|
119
|
+
]
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
provider.register()
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Session Recorder id generator
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
|
|
130
|
+
import { SessionRecorderIdGenerator, SessionRecorderHttpTraceExporterBrowser } from '@multiplayer-app/session-recorder-opentelemetry'
|
|
131
|
+
|
|
132
|
+
const idGenerator = new SessionRecorderIdGenerator({ autoDocTracesRatio: 0.05 })
|
|
133
|
+
|
|
134
|
+
const collectorOptions = {
|
|
135
|
+
url: '<opentelemetry-collector-url>', // url is optional and can be omitted - default is https://api.multiplayer.app/v1/traces
|
|
136
|
+
apiKey: '<multiplayer-otlp-key>' // api key from multiplayer integration
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const exporter = new SessionRecorderHttpTraceExporterBrowser(collectorOptions)
|
|
140
|
+
const provider = new WebTracerProvider({
|
|
141
|
+
spanProcessors: [
|
|
142
|
+
new BatchSpanProcessor(exporter, {
|
|
143
|
+
// The maximum queue size. After the size is reached spans are dropped.
|
|
144
|
+
maxQueueSize: 100,
|
|
145
|
+
// The maximum batch size of every export. It must be smaller or equal to maxQueueSize.
|
|
146
|
+
maxExportBatchSize: 10,
|
|
147
|
+
// The interval between two consecutive exports
|
|
148
|
+
scheduledDelayMillis: 500,
|
|
149
|
+
// How long the export can run before it is cancelled
|
|
150
|
+
exportTimeoutMillis: 30000
|
|
151
|
+
})
|
|
152
|
+
],
|
|
153
|
+
idGenerator
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
idGenerator.setSessionId('<multiplayer-debug-session-short-id>')
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Trace id ratio based sampler
|
|
160
|
+
|
|
161
|
+
Session Recorder sampler will always sample traces with appropriate prefixes, other traces will be sampled using ration provided to constructor.
|
|
162
|
+
|
|
163
|
+
```javascript
|
|
164
|
+
import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
|
|
165
|
+
import { SessionRecorderTraceIdRatioBasedSampler, SessionRecorderHttpTraceExporterBrowser } from '@multiplayer-app/session-recorder-opentelemetry'
|
|
166
|
+
|
|
167
|
+
const collectorOptions = {
|
|
168
|
+
url: '<opentelemetry-collector-url>', // url is optional and can be omitted - default is https://api.multiplayer.app/v1/traces
|
|
169
|
+
apiKey: '<multiplayer-otlp-key>' // api key from multiplayer integration
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const exporter = new SessionRecorderHttpTraceExporterBrowser(collectorOptions)
|
|
173
|
+
const provider = new WebTracerProvider({
|
|
174
|
+
spanProcessors: [
|
|
175
|
+
new BatchSpanProcessor(exporter, {
|
|
176
|
+
// The maximum queue size. After the size is reached spans are dropped.
|
|
177
|
+
maxQueueSize: 100,
|
|
178
|
+
// The maximum batch size of every export. It must be smaller or equal to maxQueueSize.
|
|
179
|
+
maxExportBatchSize: 10,
|
|
180
|
+
// The interval between two consecutive exports
|
|
181
|
+
scheduledDelayMillis: 500,
|
|
182
|
+
// How long the export can run before it is cancelled
|
|
183
|
+
exportTimeoutMillis: 30000
|
|
184
|
+
})
|
|
185
|
+
],
|
|
186
|
+
sampler: new SessionRecorderTraceIdRatioBasedSampler(0.05)
|
|
187
|
+
})
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Helper for capturing exception in session recording
|
|
191
|
+
|
|
192
|
+
```javascript
|
|
193
|
+
import { SessionRecorderSdk } from '@multiplayer-app/session-recorder-opentelemetry'
|
|
194
|
+
|
|
195
|
+
const error = new Error('Some text here')
|
|
196
|
+
|
|
197
|
+
SessionRecorderSdk.captureException(error)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Helpers for adding content to session recording
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
import { SessionRecorderSdk } from '@multiplayer-app/session-recorder-opentelemetry'
|
|
204
|
+
|
|
205
|
+
SessionRecorderSdk.setAttribute('{{SOME_KEY}}', '{{SOME_VALUE}}')
|
|
206
|
+
|
|
207
|
+
// following helpers do masking of sensitive fields
|
|
208
|
+
SessionRecorderSdk.setHttpRequestBody('{{ANY_REQUEST_PAYLOAD_HERE}}')
|
|
209
|
+
|
|
210
|
+
SessionRecorderSdk.setHttpRequestHeaders({ Cookie: '...', Authorization: '...'})
|
|
211
|
+
|
|
212
|
+
SessionRecorderSdk.setHttpResponseBody({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
|
|
213
|
+
|
|
214
|
+
SessionRecorderSdk.setHttpResponseHeaders({ 'Set-Cookie': '...' })
|
|
215
|
+
|
|
216
|
+
SessionRecorderSdk.setMessageBody({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
|
|
217
|
+
|
|
218
|
+
SessionRecorderSdk.setRpcRequestMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
|
|
219
|
+
|
|
220
|
+
SessionRecorderSdk.setRpcResponseMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
|
|
221
|
+
|
|
222
|
+
SessionRecorderSdk.setGrpcRequestMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
|
|
223
|
+
|
|
224
|
+
SessionRecorderSdk.setGrpcResponseMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## License
|
|
229
|
+
|
|
230
|
+
MIT - See [LICENSE](./LICENSE) for more information.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse, ClientRequest } from 'http';
|
|
2
|
+
import type { Span } from '@opentelemetry/api';
|
|
3
|
+
interface HttpResponseHookOptions {
|
|
4
|
+
maxPayloadSizeBytes?: number;
|
|
5
|
+
schemifyDocSpanPayload?: boolean;
|
|
6
|
+
uncompressPayload?: boolean;
|
|
7
|
+
captureHeaders?: boolean;
|
|
8
|
+
captureBody?: boolean;
|
|
9
|
+
isMaskingEnabled?: boolean;
|
|
10
|
+
maskBody?: (arg: any, span: Span) => any;
|
|
11
|
+
maskHeaders?: (arg: any, span: Span) => any;
|
|
12
|
+
maskBodyFieldsList?: string[];
|
|
13
|
+
maskHeadersList?: string[];
|
|
14
|
+
headersToInclude?: string[];
|
|
15
|
+
headersToExclude?: string[];
|
|
16
|
+
}
|
|
17
|
+
interface HttpRequestHookOptions {
|
|
18
|
+
maxPayloadSizeBytes?: number;
|
|
19
|
+
schemifyDocSpanPayload?: boolean;
|
|
20
|
+
captureHeaders?: boolean;
|
|
21
|
+
captureBody?: boolean;
|
|
22
|
+
isMaskingEnabled?: boolean;
|
|
23
|
+
maskBody?: (arg: any, span: Span) => any;
|
|
24
|
+
maskHeaders?: (arg: any, span: Span) => any;
|
|
25
|
+
maskBodyFieldsList?: string[];
|
|
26
|
+
maskHeadersList?: string[];
|
|
27
|
+
headersToInclude?: string[];
|
|
28
|
+
headersToExclude?: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare const SessionRecorderHttpInstrumentationHooksNode: {
|
|
31
|
+
responseHook: (options?: HttpResponseHookOptions) => (span: Span, response: IncomingMessage | ServerResponse) => void;
|
|
32
|
+
requestHook: (options?: HttpRequestHookOptions) => (span: Span, request: ClientRequest | IncomingMessage) => void;
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=SessionRecorderHttpInstrumentationHooksNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionRecorderHttpInstrumentationHooksNode.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderHttpInstrumentationHooksNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAoB9C,UAAU,uBAAuB;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IACxC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IAE3C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAE1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B;AAED,UAAU,sBAAsB;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAEhC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IACxC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IAE3C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAE1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B;AAqED,eAAO,MAAM,2CAA2C;6BAC9B,uBAAuB,YACtC,IAAI,YAAY,eAAe,GAAG,cAAc;4BAqIlC,sBAAsB,YACpC,IAAI,WAAW,aAAa,GAAG,eAAe;CA6FxD,CAAA"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
38
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
39
|
+
if (!m) return o;
|
|
40
|
+
var i = m.call(o), r, ar = [], e;
|
|
41
|
+
try {
|
|
42
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
43
|
+
}
|
|
44
|
+
catch (error) { e = { error: error }; }
|
|
45
|
+
finally {
|
|
46
|
+
try {
|
|
47
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
48
|
+
}
|
|
49
|
+
finally { if (e) throw e.error; }
|
|
50
|
+
}
|
|
51
|
+
return ar;
|
|
52
|
+
};
|
|
53
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
54
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
55
|
+
if (ar || !(i in from)) {
|
|
56
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
57
|
+
ar[i] = from[i];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
61
|
+
};
|
|
62
|
+
var __values = (this && this.__values) || function(o) {
|
|
63
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
64
|
+
if (m) return m.call(o);
|
|
65
|
+
if (o && typeof o.length === "number") return {
|
|
66
|
+
next: function () {
|
|
67
|
+
if (o && i >= o.length) o = void 0;
|
|
68
|
+
return { value: o && o[i++], done: !o };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
72
|
+
};
|
|
73
|
+
import * as zlib from 'zlib';
|
|
74
|
+
import { ATTR_MULTIPLAYER_HTTP_REQUEST_BODY, ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY, ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS, MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE, ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING, MULTIPLAYER_TRACE_DEBUG_PREFIX, } from './constants.node';
|
|
75
|
+
import { mask, schemify, isGzip, } from './sdk';
|
|
76
|
+
import { sensitiveFields, sensitiveHeaders } from './sdk/mask';
|
|
77
|
+
var setDefaultOptions = function (options) {
|
|
78
|
+
options.captureHeaders = 'captureHeaders' in options
|
|
79
|
+
? options.captureHeaders
|
|
80
|
+
: true;
|
|
81
|
+
options.captureBody = 'captureBody' in options
|
|
82
|
+
? options.captureBody
|
|
83
|
+
: true;
|
|
84
|
+
options.isMaskingEnabled = 'isMaskingEnabled' in options
|
|
85
|
+
? options.isMaskingEnabled
|
|
86
|
+
: true;
|
|
87
|
+
options.schemifyDocSpanPayload = 'schemifyDocSpanPayload' in options
|
|
88
|
+
? options.schemifyDocSpanPayload
|
|
89
|
+
: false;
|
|
90
|
+
options.uncompressPayload = 'uncompressPayload' in options
|
|
91
|
+
? options.uncompressPayload
|
|
92
|
+
: true;
|
|
93
|
+
options.maskBody = options.maskBody || mask(__spreadArray(__spreadArray([], __read((Array.isArray(options.maskBodyFieldsList)
|
|
94
|
+
? options.maskBodyFieldsList
|
|
95
|
+
: sensitiveFields)), false), __read((Array.isArray(options.maskHeadersList)
|
|
96
|
+
? options.maskHeadersList
|
|
97
|
+
: sensitiveHeaders)), false));
|
|
98
|
+
options.maskHeaders = options.maskHeaders || mask(__spreadArray(__spreadArray([], __read((Array.isArray(options.maskBodyFieldsList)
|
|
99
|
+
? options.maskBodyFieldsList
|
|
100
|
+
: sensitiveFields)), false), __read((Array.isArray(options.maskHeadersList)
|
|
101
|
+
? options.maskHeadersList
|
|
102
|
+
: sensitiveHeaders)), false));
|
|
103
|
+
options.maxPayloadSizeBytes = options.maxPayloadSizeBytes || MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE;
|
|
104
|
+
return options;
|
|
105
|
+
};
|
|
106
|
+
export var SessionRecorderHttpInstrumentationHooksNode = {
|
|
107
|
+
responseHook: function (options) {
|
|
108
|
+
if (options === void 0) { options = {}; }
|
|
109
|
+
return function (span, response) {
|
|
110
|
+
try {
|
|
111
|
+
var _options_1 = setDefaultOptions(options);
|
|
112
|
+
if (!_options_1.captureBody && !_options_1.captureHeaders) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
var _response_1 = response;
|
|
116
|
+
var traceId_1 = span.spanContext().traceId;
|
|
117
|
+
if (_response_1.setHeader) {
|
|
118
|
+
_response_1.setHeader('X-Trace-Id', traceId_1);
|
|
119
|
+
}
|
|
120
|
+
var _a = __read([_response_1.write, _response_1.end], 2), oldWrite_1 = _a[0], oldEnd_1 = _a[1];
|
|
121
|
+
var chunks_1 = [];
|
|
122
|
+
if (_options_1.captureBody) {
|
|
123
|
+
_response_1.write = function () {
|
|
124
|
+
var restArgs = [];
|
|
125
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
126
|
+
restArgs[_i] = arguments[_i];
|
|
127
|
+
}
|
|
128
|
+
chunks_1.push(Buffer.from(restArgs[0]));
|
|
129
|
+
// eslint-disable-next-line
|
|
130
|
+
// @ts-ignore
|
|
131
|
+
oldWrite_1.apply(_response_1, restArgs);
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// eslint-disable-next-line
|
|
135
|
+
// @ts-ignore
|
|
136
|
+
_response_1.end = function () {
|
|
137
|
+
var restArgs = [];
|
|
138
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
139
|
+
restArgs[_i] = arguments[_i];
|
|
140
|
+
}
|
|
141
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
142
|
+
var responseBuffer, responseBody, skipResponseBodyModification, dezippedBuffer, headers, _headers, _a, _b, headerName, _c, _d, headerName, stringifiedHeaders;
|
|
143
|
+
var e_1, _e, e_2, _f;
|
|
144
|
+
var _g, _h, _j;
|
|
145
|
+
return __generator(this, function (_k) {
|
|
146
|
+
switch (_k.label) {
|
|
147
|
+
case 0:
|
|
148
|
+
if (_options_1.captureBody && restArgs[0]) {
|
|
149
|
+
chunks_1.push(Buffer.from(restArgs[0]));
|
|
150
|
+
}
|
|
151
|
+
responseBuffer = Buffer.concat(chunks_1);
|
|
152
|
+
if (!(_options_1.captureBody
|
|
153
|
+
&& responseBuffer.byteLength > 0
|
|
154
|
+
&& responseBuffer.byteLength < _options_1.maxPayloadSizeBytes)) return [3 /*break*/, 6];
|
|
155
|
+
responseBody = void 0;
|
|
156
|
+
skipResponseBodyModification = false;
|
|
157
|
+
if (!isGzip(responseBuffer)) return [3 /*break*/, 4];
|
|
158
|
+
if (!_options_1.uncompressPayload) return [3 /*break*/, 2];
|
|
159
|
+
return [4 /*yield*/, new Promise(function (resolve) { return zlib
|
|
160
|
+
.gunzip(responseBuffer, function (err, dezipped) {
|
|
161
|
+
if (err) {
|
|
162
|
+
return resolve(Buffer.from(''));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
return resolve(dezipped);
|
|
166
|
+
}
|
|
167
|
+
}); })];
|
|
168
|
+
case 1:
|
|
169
|
+
dezippedBuffer = _k.sent();
|
|
170
|
+
responseBody = dezippedBuffer.toString('utf-8');
|
|
171
|
+
return [3 /*break*/, 3];
|
|
172
|
+
case 2:
|
|
173
|
+
span.setAttribute(ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING, 'gzip');
|
|
174
|
+
skipResponseBodyModification = true;
|
|
175
|
+
responseBody = responseBuffer.toString('hex');
|
|
176
|
+
_k.label = 3;
|
|
177
|
+
case 3: return [3 /*break*/, 5];
|
|
178
|
+
case 4:
|
|
179
|
+
responseBody = responseBuffer.toString('utf-8');
|
|
180
|
+
_k.label = 5;
|
|
181
|
+
case 5:
|
|
182
|
+
if (!skipResponseBodyModification) {
|
|
183
|
+
if (traceId_1.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
184
|
+
&& _options_1.isMaskingEnabled) {
|
|
185
|
+
responseBody = _options_1.maskBody(responseBody, span);
|
|
186
|
+
}
|
|
187
|
+
else if (_options_1.schemifyDocSpanPayload) {
|
|
188
|
+
responseBody = schemify(responseBody);
|
|
189
|
+
}
|
|
190
|
+
else if (typeof responseBody !== 'string') {
|
|
191
|
+
responseBody = JSON.stringify(responseBody);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (responseBody.length) {
|
|
195
|
+
span.setAttribute(ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY, responseBody);
|
|
196
|
+
}
|
|
197
|
+
_k.label = 6;
|
|
198
|
+
case 6:
|
|
199
|
+
if (_options_1.captureHeaders) {
|
|
200
|
+
headers = _options_1.maskHeaders(_response_1.getHeaders(), span);
|
|
201
|
+
_headers = {};
|
|
202
|
+
if (!((_g = _options_1.headersToInclude) === null || _g === void 0 ? void 0 : _g.length)
|
|
203
|
+
&& !((_h = _options_1.headersToExclude) === null || _h === void 0 ? void 0 : _h.length)) {
|
|
204
|
+
_headers = JSON.parse(JSON.stringify(headers));
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
if (_options_1.headersToInclude) {
|
|
208
|
+
try {
|
|
209
|
+
for (_a = __values(_options_1.headersToInclude), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
210
|
+
headerName = _b.value;
|
|
211
|
+
_headers[headerName] = headers[headerName];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
215
|
+
finally {
|
|
216
|
+
try {
|
|
217
|
+
if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
|
|
218
|
+
}
|
|
219
|
+
finally { if (e_1) throw e_1.error; }
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if ((_j = _options_1.headersToExclude) === null || _j === void 0 ? void 0 : _j.length) {
|
|
223
|
+
try {
|
|
224
|
+
for (_c = __values(_options_1.headersToExclude), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
225
|
+
headerName = _d.value;
|
|
226
|
+
delete _headers[headerName];
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
230
|
+
finally {
|
|
231
|
+
try {
|
|
232
|
+
if (_d && !_d.done && (_f = _c.return)) _f.call(_c);
|
|
233
|
+
}
|
|
234
|
+
finally { if (e_2) throw e_2.error; }
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
stringifiedHeaders = JSON.stringify(_headers);
|
|
239
|
+
if (stringifiedHeaders === null || stringifiedHeaders === void 0 ? void 0 : stringifiedHeaders.length) {
|
|
240
|
+
span.setAttribute(ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS, stringifiedHeaders);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// eslint-disable-next-line
|
|
244
|
+
// @ts-ignore
|
|
245
|
+
return [2 /*return*/, oldEnd_1.apply(_response_1, restArgs)];
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
// eslint-disable-next-line
|
|
253
|
+
console.error('An error occured in multiplayer otlp http responseHook', error);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
requestHook: function (options) {
|
|
258
|
+
if (options === void 0) { options = {}; }
|
|
259
|
+
return function (span, request) {
|
|
260
|
+
var e_3, _a, e_4, _b;
|
|
261
|
+
var _c, _d, _e, _f;
|
|
262
|
+
try {
|
|
263
|
+
var _options_2 = setDefaultOptions(options);
|
|
264
|
+
if (!_options_2.captureBody && !_options_2.captureHeaders) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
var traceId_2 = span.spanContext().traceId;
|
|
268
|
+
var _request = request;
|
|
269
|
+
if (_options_2.captureHeaders) {
|
|
270
|
+
var _headers = {};
|
|
271
|
+
if (!((_c = _options_2.headersToInclude) === null || _c === void 0 ? void 0 : _c.length)
|
|
272
|
+
&& !((_d = _options_2.headersToExclude) === null || _d === void 0 ? void 0 : _d.length)) {
|
|
273
|
+
_headers = JSON.parse(JSON.stringify(_request.headers));
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
if (_options_2.headersToInclude) {
|
|
277
|
+
try {
|
|
278
|
+
for (var _g = __values(_options_2.headersToInclude), _h = _g.next(); !_h.done; _h = _g.next()) {
|
|
279
|
+
var headerName = _h.value;
|
|
280
|
+
_headers[headerName] = _request.headers;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
284
|
+
finally {
|
|
285
|
+
try {
|
|
286
|
+
if (_h && !_h.done && (_a = _g.return)) _a.call(_g);
|
|
287
|
+
}
|
|
288
|
+
finally { if (e_3) throw e_3.error; }
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if ((_e = _options_2.headersToExclude) === null || _e === void 0 ? void 0 : _e.length) {
|
|
292
|
+
try {
|
|
293
|
+
for (var _j = __values(_options_2.headersToExclude), _k = _j.next(); !_k.done; _k = _j.next()) {
|
|
294
|
+
var headerName = _k.value;
|
|
295
|
+
delete _headers[headerName];
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
299
|
+
finally {
|
|
300
|
+
try {
|
|
301
|
+
if (_k && !_k.done && (_b = _j.return)) _b.call(_j);
|
|
302
|
+
}
|
|
303
|
+
finally { if (e_4) throw e_4.error; }
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
var headers = _options_2.maskHeaders(_headers, span);
|
|
308
|
+
span.setAttribute(ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, JSON.stringify(headers));
|
|
309
|
+
}
|
|
310
|
+
var contentType = (_f = _request === null || _request === void 0 ? void 0 : _request.headers) === null || _f === void 0 ? void 0 : _f['content-type'];
|
|
311
|
+
if (_options_2.captureBody
|
|
312
|
+
&& (contentType === null || contentType === void 0 ? void 0 : contentType.includes('application/json'))) {
|
|
313
|
+
var body_1 = '';
|
|
314
|
+
_request.on('data', function (chunk) {
|
|
315
|
+
body_1 += chunk;
|
|
316
|
+
});
|
|
317
|
+
_request.on('end', function () {
|
|
318
|
+
try {
|
|
319
|
+
var requestBodySizeBytes = Buffer.byteLength(body_1, 'utf8');
|
|
320
|
+
if (requestBodySizeBytes === 0
|
|
321
|
+
|| requestBodySizeBytes > _options_2.maxPayloadSizeBytes) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
var requestBody = body_1;
|
|
325
|
+
if (!requestBody)
|
|
326
|
+
return;
|
|
327
|
+
if (traceId_2.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
|
|
328
|
+
&& _options_2.isMaskingEnabled) {
|
|
329
|
+
requestBody = _options_2.maskBody(requestBody, span);
|
|
330
|
+
}
|
|
331
|
+
else if (_options_2.schemifyDocSpanPayload) {
|
|
332
|
+
requestBody = schemify(requestBody);
|
|
333
|
+
}
|
|
334
|
+
else if (typeof requestBody !== 'string') {
|
|
335
|
+
requestBody = JSON.stringify(requestBody);
|
|
336
|
+
}
|
|
337
|
+
if (requestBody === null || requestBody === void 0 ? void 0 : requestBody.length) {
|
|
338
|
+
span.setAttribute(ATTR_MULTIPLAYER_HTTP_REQUEST_BODY, requestBody);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
// eslint-disable-next-line
|
|
343
|
+
console.error('[MULTIPLAYER-HTTP-REQ-HOOK] An error occured in multiplayer otlp http requestHook', err);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
// eslint-disable-next-line
|
|
350
|
+
console.error('An error occured in multiplayer otlp http requestHook', error);
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
//# sourceMappingURL=SessionRecorderHttpInstrumentationHooksNode.js.map
|