@salesforce/pwa-kit-react-sdk 3.12.0 → 3.13.0-nightly-20250909080205
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/CHANGELOG.md +4 -0
- package/package.json +11 -5
- package/ssr/server/opentelemetry-server.js +187 -0
- package/ssr/server/opentelemetry-server.test.js +586 -0
- package/ssr/server/react-rendering.js +37 -20
- package/ssr/server/react-rendering.test.js +265 -4
- package/ssr/universal/components/with-legacy-get-props/index.js +5 -3
- package/ssr/universal/components/with-react-query/index.js +9 -7
- package/ssr/universal/components/with-react-query/index.test.js +17 -17
- package/utils/opentelemetry-config.js +27 -0
- package/utils/opentelemetry-config.test.js +98 -0
- package/utils/opentelemetry.js +189 -0
- package/utils/opentelemetry.test.js +350 -0
- package/utils/performance-marks.js +27 -0
- package/utils/performance-marks.test.js +35 -0
- package/utils/performance.js +147 -43
- package/utils/performance.test.js +564 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
## v3.13.0-nightly-20250909080205 (Sep 09, 2025)
|
|
2
|
+
## v3.13.0-dev (Sep 04, 2025)
|
|
3
|
+
- Opentelemetry integration for SSR tracing [#3133](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3133)
|
|
4
|
+
|
|
1
5
|
## v3.12.0 (Sep 04, 2025)
|
|
2
6
|
- Add support for environment level base paths on /mobify routes [#2892](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2892)
|
|
3
7
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/pwa-kit-react-sdk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.13.0-nightly-20250909080205",
|
|
4
4
|
"description": "A library that supports the isomorphic React rendering pipeline for Commerce Cloud Managed Runtime apps",
|
|
5
5
|
"homepage": "https://github.com/SalesforceCommerceCloud/pwa-kit/tree/develop/packages/pwa-kit-react-sdk#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -37,7 +37,13 @@
|
|
|
37
37
|
"@loadable/babel-plugin": "^5.15.3",
|
|
38
38
|
"@loadable/server": "^5.15.3",
|
|
39
39
|
"@loadable/webpack-plugin": "^5.15.2",
|
|
40
|
-
"@
|
|
40
|
+
"@opentelemetry/api": "^1.4.1",
|
|
41
|
+
"@opentelemetry/core": "^1.15.1",
|
|
42
|
+
"@opentelemetry/propagator-b3": "^1.15.1",
|
|
43
|
+
"@opentelemetry/resources": "^1.15.1",
|
|
44
|
+
"@opentelemetry/sdk-trace-base": "^1.15.1",
|
|
45
|
+
"@opentelemetry/sdk-trace-node": "^1.15.1",
|
|
46
|
+
"@salesforce/pwa-kit-runtime": "3.13.0-nightly-20250909080205",
|
|
41
47
|
"@tanstack/react-query": "^4.28.0",
|
|
42
48
|
"cross-env": "^5.2.1",
|
|
43
49
|
"event-emitter": "^0.3.5",
|
|
@@ -50,11 +56,11 @@
|
|
|
50
56
|
},
|
|
51
57
|
"devDependencies": {
|
|
52
58
|
"@loadable/component": "^5.15.3",
|
|
53
|
-
"@salesforce/pwa-kit-dev": "3.
|
|
59
|
+
"@salesforce/pwa-kit-dev": "3.13.0-nightly-20250909080205",
|
|
54
60
|
"@testing-library/jest-dom": "^5.16.5",
|
|
55
61
|
"@testing-library/react": "^14.0.0",
|
|
56
62
|
"@testing-library/user-event": "14.4.3",
|
|
57
|
-
"internal-lib-build": "3.
|
|
63
|
+
"internal-lib-build": "3.13.0-nightly-20250909080205",
|
|
58
64
|
"node-html-parser": "^3.3.6",
|
|
59
65
|
"nodemon": "^2.0.22",
|
|
60
66
|
"react": "^18.2.0",
|
|
@@ -79,5 +85,5 @@
|
|
|
79
85
|
"publishConfig": {
|
|
80
86
|
"directory": "dist"
|
|
81
87
|
},
|
|
82
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "6f1395801a36b95520095770165cb0124a1928fe"
|
|
83
89
|
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.tracePerformance = exports.shutdownServerTracing = exports.isServerTracingInitialized = exports.initializeServerTracing = exports.getServerTracingProvider = void 0;
|
|
7
|
+
var _sdkTraceNode = require("@opentelemetry/sdk-trace-node");
|
|
8
|
+
var _sdkTraceBase = require("@opentelemetry/sdk-trace-base");
|
|
9
|
+
var _propagatorB = require("@opentelemetry/propagator-b3");
|
|
10
|
+
var _resources = require("@opentelemetry/resources");
|
|
11
|
+
var _api = require("@opentelemetry/api");
|
|
12
|
+
var _loggerInstance = _interopRequireDefault(require("../../utils/logger-instance"));
|
|
13
|
+
var _opentelemetryConfig = require("../../utils/opentelemetry-config");
|
|
14
|
+
var _opentelemetry = require("../../utils/opentelemetry");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
17
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /*
|
|
18
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
19
|
+
* All rights reserved.
|
|
20
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
21
|
+
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
22
|
+
*/
|
|
23
|
+
let provider = null;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Initialize OpenTelemetry tracing for server-side rendering
|
|
27
|
+
* @param {Object} options
|
|
28
|
+
* @param {string} [options.serviceName]
|
|
29
|
+
* @param {string} [options.serviceVersion]
|
|
30
|
+
* @param {boolean} [options.enabled]
|
|
31
|
+
* @returns {NodeTracerProvider|null}
|
|
32
|
+
*/
|
|
33
|
+
const initializeServerTracing = (options = {}) => {
|
|
34
|
+
const {
|
|
35
|
+
serviceName = options.serviceName || (0, _opentelemetryConfig.getServiceName)(),
|
|
36
|
+
serviceVersion,
|
|
37
|
+
enabled = (0, _opentelemetryConfig.getOTELConfig)().enabled
|
|
38
|
+
} = options;
|
|
39
|
+
// If tracing is disabled, return null without initializing
|
|
40
|
+
if (!enabled) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
// Build resource attributes
|
|
45
|
+
const resourceAttributes = {
|
|
46
|
+
'service.name': serviceName
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Add service version if provided
|
|
50
|
+
if (serviceVersion) {
|
|
51
|
+
resourceAttributes['service.version'] = serviceVersion;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Initialize the tracer provider
|
|
55
|
+
provider = new _sdkTraceNode.NodeTracerProvider({
|
|
56
|
+
resource: new _resources.Resource(resourceAttributes),
|
|
57
|
+
spanProcessor: new _sdkTraceBase.SimpleSpanProcessor()
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Add B3 propagator
|
|
61
|
+
_api.propagation.setGlobalPropagator(new _propagatorB.B3Propagator());
|
|
62
|
+
provider.register();
|
|
63
|
+
return provider;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
// Log errors from OpenTelemetry initialization
|
|
66
|
+
_loggerInstance.default.error('Failed to initialize OpenTelemetry provider', {
|
|
67
|
+
namespace: 'opentelemetry-server.initializeServerTracing',
|
|
68
|
+
additionalProperties: {
|
|
69
|
+
error: error.message
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Shutdown OpenTelemetry tracing and clean up resources
|
|
78
|
+
* @returns {Promise<void>}
|
|
79
|
+
*/
|
|
80
|
+
exports.initializeServerTracing = initializeServerTracing;
|
|
81
|
+
const shutdownServerTracing = exports.shutdownServerTracing = /*#__PURE__*/function () {
|
|
82
|
+
var _ref = _asyncToGenerator(function* () {
|
|
83
|
+
if (provider) {
|
|
84
|
+
try {
|
|
85
|
+
yield provider.shutdown();
|
|
86
|
+
provider = null; // Clean up after successful shutdown
|
|
87
|
+
} catch (error) {
|
|
88
|
+
_loggerInstance.default.warn('Failed to shutdown OpenTelemetry provider', {
|
|
89
|
+
namespace: 'opentelemetry-server.shutdownServerTracing',
|
|
90
|
+
additionalProperties: {
|
|
91
|
+
error: error.message
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return function shutdownServerTracing() {
|
|
98
|
+
return _ref.apply(this, arguments);
|
|
99
|
+
};
|
|
100
|
+
}();
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get the current OpenTelemetry provider instance
|
|
104
|
+
* @returns {NodeTracerProvider|null} The current provider or null if not initialized
|
|
105
|
+
*/
|
|
106
|
+
const getServerTracingProvider = () => {
|
|
107
|
+
return provider;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if OpenTelemetry tracing is currently initialized
|
|
112
|
+
* @returns {boolean} True if tracing is initialized, false otherwise
|
|
113
|
+
*/
|
|
114
|
+
exports.getServerTracingProvider = getServerTracingProvider;
|
|
115
|
+
const isServerTracingInitialized = () => {
|
|
116
|
+
return provider !== null;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Creates a span for performance measurement
|
|
121
|
+
* @param {string} name - The name of the performance span
|
|
122
|
+
* @param {Function} fn - The function to measure
|
|
123
|
+
* @param {Object} res - The response object (optional)
|
|
124
|
+
* @returns {Promise<any>} The result of the function
|
|
125
|
+
*/
|
|
126
|
+
exports.isServerTracingInitialized = isServerTracingInitialized;
|
|
127
|
+
const tracePerformance = exports.tracePerformance = /*#__PURE__*/function () {
|
|
128
|
+
var _ref2 = _asyncToGenerator(function* (name, fn, res = null, req = null) {
|
|
129
|
+
// Check if OpenTelemetry is properly configured
|
|
130
|
+
const otelConfig = (0, _opentelemetryConfig.getOTELConfig)();
|
|
131
|
+
let rootSpan = null;
|
|
132
|
+
let ctx = null;
|
|
133
|
+
const includeServerTimingHeader = '__server_timing' in req.query;
|
|
134
|
+
const shouldTrackPerformance = includeServerTimingHeader || process.env.SERVER_TIMING;
|
|
135
|
+
if (otelConfig.enabled && shouldTrackPerformance) {
|
|
136
|
+
// Initialize server tracing if needed for this request
|
|
137
|
+
if (shouldTrackPerformance && !isServerTracingInitialized()) {
|
|
138
|
+
initializeServerTracing();
|
|
139
|
+
}
|
|
140
|
+
const tracer = _api.trace.getTracer((0, _opentelemetryConfig.getServiceName)());
|
|
141
|
+
// Create the root span
|
|
142
|
+
rootSpan = tracer.startSpan(name, {
|
|
143
|
+
attributes: {
|
|
144
|
+
'service.name': (0, _opentelemetryConfig.getServiceName)()
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Create a new context with the root span
|
|
149
|
+
ctx = _api.trace.setSpan(_api.context.active(), rootSpan);
|
|
150
|
+
|
|
151
|
+
// Inject B3 headers into response if available
|
|
152
|
+
if (res && (0, _opentelemetryConfig.getOTELConfig)().enabled && shouldTrackPerformance) {
|
|
153
|
+
res.setHeader('x-b3-traceid', rootSpan.spanContext().traceId);
|
|
154
|
+
res.setHeader('x-b3-spanid', rootSpan.spanContext().spanId);
|
|
155
|
+
res.setHeader('x-b3-sampled', '1');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
// Run the function within the context of the root span (if ctx exists)
|
|
160
|
+
const result = ctx ? yield _api.context.with(ctx, /*#__PURE__*/_asyncToGenerator(function* () {
|
|
161
|
+
try {
|
|
162
|
+
return yield fn();
|
|
163
|
+
} catch (error) {
|
|
164
|
+
rootSpan.setStatus({
|
|
165
|
+
code: _api.SpanStatusCode.ERROR,
|
|
166
|
+
message: error.message
|
|
167
|
+
});
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
})) : yield fn();
|
|
171
|
+
if (otelConfig.enabled && shouldTrackPerformance) {
|
|
172
|
+
rootSpan.end();
|
|
173
|
+
(0, _opentelemetry.logSpanData)(rootSpan, 'end', res);
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
} catch (error) {
|
|
177
|
+
if (otelConfig.enabled && shouldTrackPerformance) {
|
|
178
|
+
rootSpan.end();
|
|
179
|
+
(0, _opentelemetry.logSpanData)(rootSpan, 'end', res);
|
|
180
|
+
}
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return function tracePerformance(_x, _x2) {
|
|
185
|
+
return _ref2.apply(this, arguments);
|
|
186
|
+
};
|
|
187
|
+
}();
|