@module-federation/observability-plugin 0.0.0-pre-release-2-5-20260520035046 → 2.5.0
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 +18 -1
- package/dist/CHANGELOG.md +7 -4
- package/dist/README.md +18 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/build.js +2 -1
- package/dist/chrome-devtool.d.ts +1 -1
- package/dist/chrome-devtool.js +3 -2
- package/dist/{esm/core-CJhThq9p.js → core--1ofIHU9.js} +137 -28
- package/dist/{core-qz6RbeSc.d.ts → core-Db-z5jD3.d.ts} +4 -0
- package/dist/esm/browser.js +1 -1
- package/dist/esm/build.js +1 -1
- package/dist/esm/chrome-devtool.js +3 -2
- package/dist/{core-JP2QeDL_.js → esm/core-4ykFjWWj.js} +130 -33
- package/dist/esm/index.js +1 -1
- package/dist/esm/node.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -87,6 +87,7 @@ and exposes the final loading state through a small `summary` object:
|
|
|
87
87
|
- `runtime-loaded`: Module Federation finished loading the remote module.
|
|
88
88
|
- `component-loaded`: business code called `markComponentLoaded`, or a producer
|
|
89
89
|
called the injected `onMFRemoteLoaded` callback.
|
|
90
|
+
- `preloaded`: `preloadRemote` finished loading the selected resources.
|
|
90
91
|
- `failed`: the load failed and `failedPhase` points to the first specific
|
|
91
92
|
failing phase.
|
|
92
93
|
- `recovered`: loading hit an error but a fallback/recovery path returned a
|
|
@@ -114,6 +115,20 @@ manifest, remoteEntry load, remoteEntry init, expose resolution, module factory
|
|
|
114
115
|
execution, and final load completion. When a stage has matching start and end
|
|
115
116
|
events, the end event includes a bounded `duration` value.
|
|
116
117
|
|
|
118
|
+
Preload reports include resource-level results from `preloadRemote`. Each
|
|
119
|
+
result records the resource URL, `resourceType`, `initiator`, preload `id`, and
|
|
120
|
+
status: `success`, `error`, `timeout`, or `cached`. Calls without `exposes` use
|
|
121
|
+
`remoteName/*` as the preload `id`. Calls with `exposes` are recorded per
|
|
122
|
+
expose as `remoteName/expose`. The plugin does not change the existing
|
|
123
|
+
`generatePreloadAssets` return shape; preload resources are still plain URL
|
|
124
|
+
arrays.
|
|
125
|
+
|
|
126
|
+
Runtime resource hooks also receive a `resourceContext` object on manifest,
|
|
127
|
+
remoteEntry, preload JS, and preload CSS resource loads. It contains
|
|
128
|
+
`initiator`, `id`, `resourceType`, and `url`, so custom loaders can tell whether
|
|
129
|
+
the resource was requested by `loadRemote` or `preloadRemote` without parsing
|
|
130
|
+
the URL.
|
|
131
|
+
|
|
117
132
|
The report also keeps compact loading state under `summary`. It contains the
|
|
118
133
|
final outcome, per-phase status and duration under `summary.phases`, safe
|
|
119
134
|
cache/recovery markers under `summary.flags`, and the last resolved shared
|
|
@@ -304,7 +319,9 @@ ObservabilityPlugin({
|
|
|
304
319
|
The runtime plugin does not create a server. The MF skill starts a temporary
|
|
305
320
|
local Node collector, writes reports under `.mf/observability/collector`, and
|
|
306
321
|
the agent reads those files. The collector path is local-only and does not
|
|
307
|
-
execute code or control the page.
|
|
322
|
+
execute code or control the page. Collector delivery is controlled by the
|
|
323
|
+
`collector` option; debug mode only decides whether a failed collector request
|
|
324
|
+
prints a debug log.
|
|
308
325
|
|
|
309
326
|
For browser production use, set `browser.mode: "production"` when the runtime
|
|
310
327
|
console must stay minimal:
|
package/dist/CHANGELOG.md
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
# @module-federation/observability-plugin
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 2.5.0
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
7
|
+
- 41281f4: Add a Loading Trace panel that can configure and inject the observability plugin, reload the inspected page, stream loading events, and export collected reports.
|
|
8
|
+
- 41281f4: Add an opt-in observability plugin, a Chrome-extension-safe observability plugin entry with an independent name and fixed browser scope, a direct runtime plugin API with instance-bound component loaded marks, explicit temporary React `onMFRemoteLoaded` callback injection for matched remotes, opt-in start console traces for `loadRemote` and `loadShare`, a local collector mode for AI-assisted browser debugging, a Node-specific export for file reports, a build-specific export for build summaries and build error reports, remote and shared lifecycle hooks, console trace hints, safe browser/Node report outputs, configurable error stack capture with explicit console raw-stack opt-ins, shared/eager loading evidence gated to stable runtime `2.5.0+` for Chrome-extension compatibility, final loading outcome summaries for Module Federation loading reports including resolved shared dependencies, deterministic fact reports for runtime and build failures, no-op return handling for observer hooks, detailed remote match/init/expose/factory phase events with phase durations, compact phase summaries, cache/fallback markers, loaded-before evidence from existing federation instances when a remote load fails, length-limited business component metadata, clipped moduleInfo evidence with preserved deployment locator fields for snapshot-dependent failures, normalized runtime error summaries with error codes, owner hints, retryability, and safe context, dedicated runtime error codes for invalid manifests, missing exposes, and remote container init failures, plus MF skill guidance for reading and fixing observability reports.
|
|
9
9
|
|
|
10
10
|
### Patch Changes
|
|
11
11
|
|
|
12
|
+
- 0716c11: Track preload resource results and expose resource context to loader hooks.
|
|
13
|
+
- 328542c: Send configured local collector events outside debug mode while keeping failures quiet unless debug logging is enabled.
|
|
12
14
|
- Updated dependencies [5d4095d]
|
|
13
|
-
|
|
15
|
+
- Updated dependencies [0716c11]
|
|
16
|
+
- @module-federation/sdk@2.5.0
|
package/dist/README.md
CHANGED
|
@@ -87,6 +87,7 @@ and exposes the final loading state through a small `summary` object:
|
|
|
87
87
|
- `runtime-loaded`: Module Federation finished loading the remote module.
|
|
88
88
|
- `component-loaded`: business code called `markComponentLoaded`, or a producer
|
|
89
89
|
called the injected `onMFRemoteLoaded` callback.
|
|
90
|
+
- `preloaded`: `preloadRemote` finished loading the selected resources.
|
|
90
91
|
- `failed`: the load failed and `failedPhase` points to the first specific
|
|
91
92
|
failing phase.
|
|
92
93
|
- `recovered`: loading hit an error but a fallback/recovery path returned a
|
|
@@ -114,6 +115,20 @@ manifest, remoteEntry load, remoteEntry init, expose resolution, module factory
|
|
|
114
115
|
execution, and final load completion. When a stage has matching start and end
|
|
115
116
|
events, the end event includes a bounded `duration` value.
|
|
116
117
|
|
|
118
|
+
Preload reports include resource-level results from `preloadRemote`. Each
|
|
119
|
+
result records the resource URL, `resourceType`, `initiator`, preload `id`, and
|
|
120
|
+
status: `success`, `error`, `timeout`, or `cached`. Calls without `exposes` use
|
|
121
|
+
`remoteName/*` as the preload `id`. Calls with `exposes` are recorded per
|
|
122
|
+
expose as `remoteName/expose`. The plugin does not change the existing
|
|
123
|
+
`generatePreloadAssets` return shape; preload resources are still plain URL
|
|
124
|
+
arrays.
|
|
125
|
+
|
|
126
|
+
Runtime resource hooks also receive a `resourceContext` object on manifest,
|
|
127
|
+
remoteEntry, preload JS, and preload CSS resource loads. It contains
|
|
128
|
+
`initiator`, `id`, `resourceType`, and `url`, so custom loaders can tell whether
|
|
129
|
+
the resource was requested by `loadRemote` or `preloadRemote` without parsing
|
|
130
|
+
the URL.
|
|
131
|
+
|
|
117
132
|
The report also keeps compact loading state under `summary`. It contains the
|
|
118
133
|
final outcome, per-phase status and duration under `summary.phases`, safe
|
|
119
134
|
cache/recovery markers under `summary.flags`, and the last resolved shared
|
|
@@ -304,7 +319,9 @@ ObservabilityPlugin({
|
|
|
304
319
|
The runtime plugin does not create a server. The MF skill starts a temporary
|
|
305
320
|
local Node collector, writes reports under `.mf/observability/collector`, and
|
|
306
321
|
the agent reads those files. The collector path is local-only and does not
|
|
307
|
-
execute code or control the page.
|
|
322
|
+
execute code or control the page. Collector delivery is controlled by the
|
|
323
|
+
`collector` option; debug mode only decides whether a failed collector request
|
|
324
|
+
prints a debug log.
|
|
308
325
|
|
|
309
326
|
For browser production use, set `browser.mode: "production"` when the runtime
|
|
310
327
|
console must stay minimal:
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-
|
|
1
|
+
import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-Db-z5jD3.js";
|
|
2
2
|
|
|
3
3
|
//#region src/browser.d.ts
|
|
4
4
|
declare function ObservabilityPlugin(options?: ObservabilityPluginOptions): ObservabilityRuntimePlugin;
|
package/dist/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
2
|
-
const require_core = require('./core
|
|
2
|
+
const require_core = require('./core--1ofIHU9.js');
|
|
3
3
|
|
|
4
4
|
//#region src/browser.ts
|
|
5
5
|
function ObservabilityPlugin(options = {}) {
|
package/dist/build.js
CHANGED
|
@@ -26,11 +26,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
}) : target, mod));
|
|
27
27
|
|
|
28
28
|
//#endregion
|
|
29
|
+
let _module_federation_sdk = require("@module-federation/sdk");
|
|
29
30
|
let node_fs = require("node:fs");
|
|
30
31
|
node_fs = __toESM(node_fs);
|
|
31
32
|
let node_path = require("node:path");
|
|
32
33
|
node_path = __toESM(node_path);
|
|
33
|
-
let _module_federation_sdk = require("@module-federation/sdk");
|
|
34
34
|
|
|
35
35
|
//#region src/build.ts
|
|
36
36
|
const PLUGIN_NAME = "ObservabilityBuildPlugin";
|
|
@@ -707,4 +707,5 @@ var ObservabilityBuildPlugin = class {
|
|
|
707
707
|
|
|
708
708
|
//#endregion
|
|
709
709
|
exports.ObservabilityBuildPlugin = ObservabilityBuildPlugin;
|
|
710
|
+
exports.__toESM = __toESM;
|
|
710
711
|
exports.createObservabilityBuildInfo = createObservabilityBuildInfo;
|
package/dist/chrome-devtool.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-
|
|
1
|
+
import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-Db-z5jD3.js";
|
|
2
2
|
|
|
3
3
|
//#region src/chrome-devtool.d.ts
|
|
4
4
|
declare function ChromeObservabilityPlugin(options?: ObservabilityPluginOptions): ObservabilityRuntimePlugin;
|
package/dist/chrome-devtool.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
2
|
-
const require_core = require('./core
|
|
2
|
+
const require_core = require('./core--1ofIHU9.js');
|
|
3
3
|
|
|
4
4
|
//#region src/chrome-devtool.ts
|
|
5
5
|
function ChromeObservabilityPlugin(options = {}) {
|
|
@@ -10,7 +10,8 @@ function ChromeObservabilityPlugin(options = {}) {
|
|
|
10
10
|
guardSharedHooksByRuntimeVersion: true,
|
|
11
11
|
guardRuntimeHooksByRuntimeVersion: true,
|
|
12
12
|
disablePreloadHooks: true,
|
|
13
|
-
returnHookArgs: true
|
|
13
|
+
returnHookArgs: true,
|
|
14
|
+
forceDevelopmentChannels: true
|
|
14
15
|
}).plugin;
|
|
15
16
|
}
|
|
16
17
|
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
const require_build = require('./build.js');
|
|
2
|
+
let _module_federation_sdk = require("@module-federation/sdk");
|
|
3
|
+
|
|
1
4
|
//#region src/core.ts
|
|
2
5
|
const DEFAULT_MAX_EVENTS = 100;
|
|
3
6
|
const HARD_MAX_EVENTS = 1e3;
|
|
4
7
|
const DEFAULT_COLLECTOR_PORT = 17891;
|
|
5
8
|
const COLLECTOR_PATH = "/__mf_observability";
|
|
9
|
+
const logger = (0, _module_federation_sdk.createLogger)("[ Module Federation Observability Plugin ]");
|
|
6
10
|
const DEFAULT_DEVTOOLS_SOURCE = "module-federation/observability";
|
|
7
11
|
const COMPONENT_BUSINESS_LOADED_EVENT = "component:business-loaded";
|
|
8
12
|
const ON_MF_REMOTE_LOADED_PROP = "onMFRemoteLoaded";
|
|
@@ -537,6 +541,11 @@ function resolveRemoteFromRequestId(id, options) {
|
|
|
537
541
|
})[0];
|
|
538
542
|
return createRemoteInfo(matchedRemote);
|
|
539
543
|
}
|
|
544
|
+
function resolveAliasRequestId(requestId, remote) {
|
|
545
|
+
if (!requestId || !remote?.alias || remote.alias === remote.name) return;
|
|
546
|
+
if (requestId === remote.name) return remote.alias;
|
|
547
|
+
if (requestId.startsWith(`${remote.name}/`)) return `${remote.alias}/${requestId.slice(remote.name.length + 1)}`;
|
|
548
|
+
}
|
|
540
549
|
function sanitizeModuleInfoPath(value) {
|
|
541
550
|
if (typeof value !== "string") return;
|
|
542
551
|
return clipText(value, 320);
|
|
@@ -684,6 +693,7 @@ function createErrorContext(event, inputContext) {
|
|
|
684
693
|
const context = { ...inputContext };
|
|
685
694
|
if (event.lifecycle) context.lifecycle = event.lifecycle;
|
|
686
695
|
if (event.requestId) context.requestId = event.requestId;
|
|
696
|
+
if (event.requestAlias) context.requestAlias = event.requestAlias;
|
|
687
697
|
if (event.remote?.name) context.remoteName = event.remote.name;
|
|
688
698
|
if (event.remote?.alias) context.remoteAlias = event.remote.alias;
|
|
689
699
|
if (event.remote?.type) context.remoteType = event.remote.type;
|
|
@@ -717,6 +727,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
717
727
|
const shouldGuardRuntimeHooksByRuntimeVersion = adapterOptions.guardRuntimeHooksByRuntimeVersion === true;
|
|
718
728
|
const shouldDisablePreloadHooks = adapterOptions.disablePreloadHooks === true;
|
|
719
729
|
const shouldReturnHookArgs = adapterOptions.returnHookArgs === true;
|
|
730
|
+
const shouldForceDevelopmentChannels = adapterOptions.forceDevelopmentChannels === true;
|
|
720
731
|
const returnHookArgs = (args) => shouldReturnHookArgs ? args : void 0;
|
|
721
732
|
const level = options.level || "summary";
|
|
722
733
|
const configuredMaxEvents = normalizeMaxEvents(options.maxEvents, DEFAULT_MAX_EVENTS);
|
|
@@ -767,6 +778,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
767
778
|
const errorInfo = getErrorInfo(event.error, options.stackTrace);
|
|
768
779
|
const sanitizedRemote = sanitizeRemote(event.remote);
|
|
769
780
|
const sanitizedShared = sanitizeShared(event.shared);
|
|
781
|
+
const requestAlias = sanitizeRequestId(event.requestAlias) || resolveAliasRequestId(event.requestId, sanitizedRemote);
|
|
770
782
|
const hostName = sanitizeText(event.hostName, 120) || sanitizeText(origin?.options?.name, 120);
|
|
771
783
|
const runtimeVersion = sanitizeText(origin?.version, 80) || appliedRuntimeVersion;
|
|
772
784
|
const message = getRawText(event.message) || errorInfo.errorMessage;
|
|
@@ -776,6 +788,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
776
788
|
phase: sanitizeText(event.phase, 120) || "runtime",
|
|
777
789
|
status: event.status,
|
|
778
790
|
requestId: sanitizeRequestId(event.requestId),
|
|
791
|
+
requestAlias,
|
|
779
792
|
hostName,
|
|
780
793
|
runtimeVersion,
|
|
781
794
|
remote: sanitizedRemote,
|
|
@@ -966,7 +979,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
966
979
|
}
|
|
967
980
|
if (report.summary.componentLoaded) return "Business component loaded";
|
|
968
981
|
if (report.summary.runtimeLoaded) return "Remote loaded successfully";
|
|
969
|
-
if (report.summary.preloaded) return "Remote
|
|
982
|
+
if (report.summary.preloaded) return "Remote preloaded successfully";
|
|
970
983
|
return "Remote loading is pending";
|
|
971
984
|
}
|
|
972
985
|
switch (report.errorCode) {
|
|
@@ -1020,6 +1033,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1020
1033
|
addFact("ownerHint", ownerHint);
|
|
1021
1034
|
addFact("retryable", report.retryable ?? report.summary.error?.retryable);
|
|
1022
1035
|
addFact("requestId", report.requestId);
|
|
1036
|
+
addFact("requestAlias", report.requestAlias || report.summary.error?.context?.["requestAlias"]);
|
|
1023
1037
|
addFact("hostName", report.hostName);
|
|
1024
1038
|
addFact("remoteName", report.remote?.name);
|
|
1025
1039
|
addFact("remoteAlias", report.remote?.alias);
|
|
@@ -1157,6 +1171,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1157
1171
|
traceId: event.traceId,
|
|
1158
1172
|
status: event.status === "error" ? "error" : "pending",
|
|
1159
1173
|
requestId: event.requestId,
|
|
1174
|
+
requestAlias: event.requestAlias,
|
|
1160
1175
|
hostName: event.hostName,
|
|
1161
1176
|
runtimeVersion: event.runtimeVersion,
|
|
1162
1177
|
remote: event.remote ? { ...event.remote } : void 0,
|
|
@@ -1195,6 +1210,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1195
1210
|
reports.set(event.traceId, report);
|
|
1196
1211
|
}
|
|
1197
1212
|
if (event.requestId) report.requestId = event.requestId;
|
|
1213
|
+
if (event.requestAlias) report.requestAlias = event.requestAlias;
|
|
1198
1214
|
if (event.hostName) report.hostName = event.hostName;
|
|
1199
1215
|
if (event.runtimeVersion) report.runtimeVersion = event.runtimeVersion;
|
|
1200
1216
|
if (event.remote) report.remote = { ...event.remote };
|
|
@@ -1264,8 +1280,12 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1264
1280
|
keepalive: body.length <= 64 * 1024,
|
|
1265
1281
|
credentials: "omit",
|
|
1266
1282
|
mode: "cors"
|
|
1267
|
-
}).catch(() => {
|
|
1268
|
-
|
|
1283
|
+
}).catch((error) => {
|
|
1284
|
+
logger.debug("Failed to notify local observability collector.", error);
|
|
1285
|
+
});
|
|
1286
|
+
} catch (error) {
|
|
1287
|
+
logger.debug("Failed to notify local observability collector.", error);
|
|
1288
|
+
}
|
|
1269
1289
|
};
|
|
1270
1290
|
const notifyDevtools = (event, report) => {
|
|
1271
1291
|
if (!devtoolsOptions) return;
|
|
@@ -1304,6 +1324,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1304
1324
|
report.remote?.alias,
|
|
1305
1325
|
report.remote?.entry,
|
|
1306
1326
|
report.requestId,
|
|
1327
|
+
report.requestAlias,
|
|
1307
1328
|
report.sanitizedUrl
|
|
1308
1329
|
].some((value) => matchesReportValue(value, query.remote))) return false;
|
|
1309
1330
|
if (query.expose && ![report.expose, report.requestId].some((value) => matchesReportValue(value, query.expose))) return false;
|
|
@@ -1360,6 +1381,14 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1360
1381
|
}
|
|
1361
1382
|
};
|
|
1362
1383
|
const shouldUseConsole = () => options.console !== false;
|
|
1384
|
+
const shouldUseDevelopmentChannels = () => {
|
|
1385
|
+
if (shouldUseMinimalBrowserConsole()) return false;
|
|
1386
|
+
if (shouldForceDevelopmentChannels) return true;
|
|
1387
|
+
if (typeof process === "undefined" || !process.env) return true;
|
|
1388
|
+
return process.env.NODE_ENV !== "production";
|
|
1389
|
+
};
|
|
1390
|
+
const shouldNotifyCollector = () => Boolean(collectorOptions);
|
|
1391
|
+
const shouldNotifyDevtools = () => shouldUseDevelopmentChannels();
|
|
1363
1392
|
const shouldUseMinimalBrowserConsole = () => options.browser?.mode === "production";
|
|
1364
1393
|
const shouldUseStartTrace = () => options.trace?.printStart ?? (options.browser?.enabled === true && !shouldUseMinimalBrowserConsole());
|
|
1365
1394
|
const shouldPrintStartConsole = (event) => shouldUseStartTrace() && event.status === "start" && (event.phase === "loadRemote" || event.phase === "shared") && shouldUseConsole();
|
|
@@ -1386,6 +1415,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1386
1415
|
`phase: ${report.failedPhase || event.phase}`
|
|
1387
1416
|
];
|
|
1388
1417
|
if (report.requestId) lines.push(`requestId: ${report.requestId}`);
|
|
1418
|
+
if (report.requestAlias) lines.push(`requestAlias: ${report.requestAlias}`);
|
|
1389
1419
|
if (report.errorCode) lines.push(`errorCode: ${report.errorCode}`);
|
|
1390
1420
|
if (report.shared?.name) lines.push(`shared: ${report.shared.name}`);
|
|
1391
1421
|
const browserReadCommand = getBrowserReadCommand(report.traceId);
|
|
@@ -1413,6 +1443,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1413
1443
|
`phase: ${event.phase}`
|
|
1414
1444
|
];
|
|
1415
1445
|
if (event.requestId) lines.push(`requestId: ${event.requestId}`);
|
|
1446
|
+
if (event.requestAlias) lines.push(`requestAlias: ${event.requestAlias}`);
|
|
1416
1447
|
if (event.remote?.name) lines.push(`remote: ${event.remote.name}`);
|
|
1417
1448
|
if (event.shared?.name) lines.push(`shared: ${event.shared.name}`);
|
|
1418
1449
|
if (event.lifecycle) lines.push(`lifecycle: ${event.lifecycle}`);
|
|
@@ -1443,8 +1474,8 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1443
1474
|
const report = updateReport(event);
|
|
1444
1475
|
emitStartConsoleHint(event, report);
|
|
1445
1476
|
emitConsoleHint(event, report, input.error);
|
|
1446
|
-
notifyCollector(event, report);
|
|
1447
|
-
notifyDevtools(event, report);
|
|
1477
|
+
if (shouldNotifyCollector()) notifyCollector(event, report);
|
|
1478
|
+
if (shouldNotifyDevtools()) notifyDevtools(event, report);
|
|
1448
1479
|
notifyRawError(input.error, event, report, origin);
|
|
1449
1480
|
notifyEvent(event, report, origin);
|
|
1450
1481
|
notifyReport(report, origin);
|
|
@@ -1491,7 +1522,29 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1491
1522
|
if (options.react?.enabled === false || options.react?.injectLoadedCallback !== true) return;
|
|
1492
1523
|
const remoteIds = options.react.remoteIds || [];
|
|
1493
1524
|
if (!remoteIds.length) return { allowAnonymousComponent: false };
|
|
1494
|
-
|
|
1525
|
+
const normalizeRemoteId = (value) => value.replace(/\/\.\//g, "/").replace(/^\.\//, "");
|
|
1526
|
+
const expectedRemoteIds = new Set(remoteIds.map(normalizeRemoteId));
|
|
1527
|
+
const candidates = /* @__PURE__ */ new Set();
|
|
1528
|
+
const addCandidate = (value) => {
|
|
1529
|
+
if (!value) return;
|
|
1530
|
+
candidates.add(value);
|
|
1531
|
+
candidates.add(normalizeRemoteId(value));
|
|
1532
|
+
};
|
|
1533
|
+
const exposeValues = [loadArgs.expose];
|
|
1534
|
+
if (loadArgs.expose?.startsWith("./")) exposeValues.push(loadArgs.expose.slice(2));
|
|
1535
|
+
const remoteNames = [
|
|
1536
|
+
loadArgs.pkgNameOrAlias,
|
|
1537
|
+
loadArgs.remote?.alias,
|
|
1538
|
+
loadArgs.remote?.name
|
|
1539
|
+
];
|
|
1540
|
+
addCandidate(loadArgs.id);
|
|
1541
|
+
addCandidate(loadArgs.expose);
|
|
1542
|
+
remoteNames.forEach((remoteName) => {
|
|
1543
|
+
exposeValues.forEach((expose) => {
|
|
1544
|
+
addCandidate(remoteName && expose ? `${remoteName}/${expose}` : "");
|
|
1545
|
+
});
|
|
1546
|
+
});
|
|
1547
|
+
return Array.from(candidates).some((candidate) => expectedRemoteIds.has(candidate)) ? { allowAnonymousComponent: true } : void 0;
|
|
1495
1548
|
};
|
|
1496
1549
|
const createReactComponentWrapper = (component, loadArgs, wrapPolicy, react) => {
|
|
1497
1550
|
const target = resolveReactComponentTarget(component, options.react?.defaultExportMode || (wrapPolicy.allowAnonymousComponent ? "component" : "preserve"), wrapPolicy.allowAnonymousComponent);
|
|
@@ -1865,27 +1918,78 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1865
1918
|
return returnHookArgs(args);
|
|
1866
1919
|
}
|
|
1867
1920
|
};
|
|
1868
|
-
if (!shouldDisablePreloadHooks)
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1921
|
+
if (!shouldDisablePreloadHooks) {
|
|
1922
|
+
plugin.generatePreloadAssets = (args) => {
|
|
1923
|
+
const preloadArgs = args;
|
|
1924
|
+
if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
|
|
1925
|
+
const remote = createRemoteInfo(preloadArgs.remoteInfo || preloadArgs.remote);
|
|
1926
|
+
const preloadConfig = preloadArgs.preloadOptions?.preloadConfig;
|
|
1927
|
+
recordEvent({
|
|
1928
|
+
phase: "preload",
|
|
1929
|
+
status: "start",
|
|
1930
|
+
requestId: remote?.name || sanitizeText(preloadConfig?.nameOrAlias, 160),
|
|
1931
|
+
remote,
|
|
1932
|
+
lifecycle: "generatePreloadAssets",
|
|
1933
|
+
message: "preload:assets-ready",
|
|
1934
|
+
metadata: clipObservabilityMetadata({
|
|
1935
|
+
nameOrAlias: preloadConfig?.nameOrAlias,
|
|
1936
|
+
exposes: preloadConfig?.exposes?.join(","),
|
|
1937
|
+
resourceCategory: preloadConfig?.resourceCategory,
|
|
1938
|
+
share: preloadConfig?.share,
|
|
1939
|
+
depsRemote: Array.isArray(preloadConfig?.depsRemote) ? "custom" : preloadConfig?.depsRemote
|
|
1940
|
+
})
|
|
1941
|
+
}, preloadArgs.origin);
|
|
1942
|
+
return returnHookArgs(args);
|
|
1943
|
+
};
|
|
1944
|
+
plugin.afterPreloadRemote = (args) => {
|
|
1945
|
+
const preloadArgs = args;
|
|
1946
|
+
if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
|
|
1947
|
+
const results = preloadArgs.results || [];
|
|
1948
|
+
if (results.length === 0 && preloadArgs.error) {
|
|
1949
|
+
recordEvent({
|
|
1950
|
+
phase: "preload",
|
|
1951
|
+
status: "error",
|
|
1952
|
+
requestId: "preloadRemote",
|
|
1953
|
+
lifecycle: "afterPreloadRemote",
|
|
1954
|
+
message: "preload:failed",
|
|
1955
|
+
error: preloadArgs.error
|
|
1956
|
+
}, preloadArgs.origin);
|
|
1957
|
+
return returnHookArgs(args);
|
|
1958
|
+
}
|
|
1959
|
+
results.forEach((preloadResult) => {
|
|
1960
|
+
const remote = createRemoteInfo(preloadResult.remoteInfo || preloadResult.remote);
|
|
1961
|
+
const requestId = sanitizeRequestId(preloadResult.id) || remote?.name || sanitizeText(preloadResult.preloadConfig?.nameOrAlias, 160);
|
|
1962
|
+
preloadResult.results?.forEach((assetResult) => {
|
|
1963
|
+
const isError = assetResult.status === "error" || assetResult.status === "timeout";
|
|
1964
|
+
recordEvent({
|
|
1965
|
+
phase: "preload",
|
|
1966
|
+
status: isError ? "error" : "success",
|
|
1967
|
+
requestId,
|
|
1968
|
+
remote,
|
|
1969
|
+
url: assetResult.url,
|
|
1970
|
+
cached: assetResult.status === "cached",
|
|
1971
|
+
lifecycle: "afterPreloadRemote",
|
|
1972
|
+
message: `preload:${assetResult.resourceType || "resource"}:${assetResult.status || "complete"}`,
|
|
1973
|
+
error: isError ? assetResult.error : void 0,
|
|
1974
|
+
errorContext: isError ? {
|
|
1975
|
+
resourceType: assetResult.resourceType,
|
|
1976
|
+
initiator: assetResult.initiator,
|
|
1977
|
+
status: assetResult.status,
|
|
1978
|
+
id: assetResult.id
|
|
1979
|
+
} : void 0,
|
|
1980
|
+
metadata: clipObservabilityMetadata({
|
|
1981
|
+
resourceType: assetResult.resourceType,
|
|
1982
|
+
initiator: assetResult.initiator,
|
|
1983
|
+
status: assetResult.status,
|
|
1984
|
+
id: assetResult.id,
|
|
1985
|
+
preloadNameOrAlias: preloadResult.preloadConfig?.nameOrAlias
|
|
1986
|
+
})
|
|
1987
|
+
}, preloadArgs.origin);
|
|
1988
|
+
});
|
|
1989
|
+
});
|
|
1990
|
+
return returnHookArgs(args);
|
|
1991
|
+
};
|
|
1992
|
+
}
|
|
1889
1993
|
return {
|
|
1890
1994
|
plugin,
|
|
1891
1995
|
getEvents() {
|
|
@@ -1930,4 +2034,9 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1930
2034
|
}
|
|
1931
2035
|
|
|
1932
2036
|
//#endregion
|
|
1933
|
-
|
|
2037
|
+
Object.defineProperty(exports, 'createObservability', {
|
|
2038
|
+
enumerable: true,
|
|
2039
|
+
get: function () {
|
|
2040
|
+
return createObservability;
|
|
2041
|
+
}
|
|
2042
|
+
});
|
|
@@ -121,6 +121,7 @@ interface ObservabilityEvent {
|
|
|
121
121
|
phase: string;
|
|
122
122
|
status: ObservabilityEventStatus;
|
|
123
123
|
requestId?: string;
|
|
124
|
+
requestAlias?: string;
|
|
124
125
|
hostName?: string;
|
|
125
126
|
runtimeVersion?: string;
|
|
126
127
|
remote?: ObservabilityRemoteInfo;
|
|
@@ -149,6 +150,7 @@ interface ObservabilityReport {
|
|
|
149
150
|
traceId: string;
|
|
150
151
|
status: ObservabilityReportStatus;
|
|
151
152
|
requestId?: string;
|
|
153
|
+
requestAlias?: string;
|
|
152
154
|
hostName?: string;
|
|
153
155
|
runtimeVersion?: string;
|
|
154
156
|
remote?: ObservabilityRemoteInfo;
|
|
@@ -269,6 +271,7 @@ interface ObservabilityRuntimeAdapterOptions {
|
|
|
269
271
|
guardRuntimeHooksByRuntimeVersion?: boolean;
|
|
270
272
|
disablePreloadHooks?: boolean;
|
|
271
273
|
returnHookArgs?: boolean;
|
|
274
|
+
forceDevelopmentChannels?: boolean;
|
|
272
275
|
}
|
|
273
276
|
declare module '@module-federation/runtime-core' {
|
|
274
277
|
interface ModuleFederation {
|
|
@@ -279,6 +282,7 @@ interface ObservabilityRuntimeEventInput {
|
|
|
279
282
|
phase: string;
|
|
280
283
|
status: ObservabilityEventStatus;
|
|
281
284
|
requestId?: string;
|
|
285
|
+
requestAlias?: string;
|
|
282
286
|
hostName?: string;
|
|
283
287
|
remote?: ObservabilityRemoteInfo;
|
|
284
288
|
shared?: ObservabilitySharedInfo;
|
package/dist/esm/browser.js
CHANGED
package/dist/esm/build.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createObservability } from "./core-
|
|
1
|
+
import { t as createObservability } from "./core-4ykFjWWj.js";
|
|
2
2
|
|
|
3
3
|
//#region src/chrome-devtool.ts
|
|
4
4
|
function ChromeObservabilityPlugin(options = {}) {
|
|
@@ -9,7 +9,8 @@ function ChromeObservabilityPlugin(options = {}) {
|
|
|
9
9
|
guardSharedHooksByRuntimeVersion: true,
|
|
10
10
|
guardRuntimeHooksByRuntimeVersion: true,
|
|
11
11
|
disablePreloadHooks: true,
|
|
12
|
-
returnHookArgs: true
|
|
12
|
+
returnHookArgs: true,
|
|
13
|
+
forceDevelopmentChannels: true
|
|
13
14
|
}).plugin;
|
|
14
15
|
}
|
|
15
16
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { createLogger } from "@module-federation/sdk";
|
|
1
2
|
|
|
2
3
|
//#region src/core.ts
|
|
3
4
|
const DEFAULT_MAX_EVENTS = 100;
|
|
4
5
|
const HARD_MAX_EVENTS = 1e3;
|
|
5
6
|
const DEFAULT_COLLECTOR_PORT = 17891;
|
|
6
7
|
const COLLECTOR_PATH = "/__mf_observability";
|
|
8
|
+
const logger = createLogger("[ Module Federation Observability Plugin ]");
|
|
7
9
|
const DEFAULT_DEVTOOLS_SOURCE = "module-federation/observability";
|
|
8
10
|
const COMPONENT_BUSINESS_LOADED_EVENT = "component:business-loaded";
|
|
9
11
|
const ON_MF_REMOTE_LOADED_PROP = "onMFRemoteLoaded";
|
|
@@ -538,6 +540,11 @@ function resolveRemoteFromRequestId(id, options) {
|
|
|
538
540
|
})[0];
|
|
539
541
|
return createRemoteInfo(matchedRemote);
|
|
540
542
|
}
|
|
543
|
+
function resolveAliasRequestId(requestId, remote) {
|
|
544
|
+
if (!requestId || !remote?.alias || remote.alias === remote.name) return;
|
|
545
|
+
if (requestId === remote.name) return remote.alias;
|
|
546
|
+
if (requestId.startsWith(`${remote.name}/`)) return `${remote.alias}/${requestId.slice(remote.name.length + 1)}`;
|
|
547
|
+
}
|
|
541
548
|
function sanitizeModuleInfoPath(value) {
|
|
542
549
|
if (typeof value !== "string") return;
|
|
543
550
|
return clipText(value, 320);
|
|
@@ -685,6 +692,7 @@ function createErrorContext(event, inputContext) {
|
|
|
685
692
|
const context = { ...inputContext };
|
|
686
693
|
if (event.lifecycle) context.lifecycle = event.lifecycle;
|
|
687
694
|
if (event.requestId) context.requestId = event.requestId;
|
|
695
|
+
if (event.requestAlias) context.requestAlias = event.requestAlias;
|
|
688
696
|
if (event.remote?.name) context.remoteName = event.remote.name;
|
|
689
697
|
if (event.remote?.alias) context.remoteAlias = event.remote.alias;
|
|
690
698
|
if (event.remote?.type) context.remoteType = event.remote.type;
|
|
@@ -718,6 +726,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
718
726
|
const shouldGuardRuntimeHooksByRuntimeVersion = adapterOptions.guardRuntimeHooksByRuntimeVersion === true;
|
|
719
727
|
const shouldDisablePreloadHooks = adapterOptions.disablePreloadHooks === true;
|
|
720
728
|
const shouldReturnHookArgs = adapterOptions.returnHookArgs === true;
|
|
729
|
+
const shouldForceDevelopmentChannels = adapterOptions.forceDevelopmentChannels === true;
|
|
721
730
|
const returnHookArgs = (args) => shouldReturnHookArgs ? args : void 0;
|
|
722
731
|
const level = options.level || "summary";
|
|
723
732
|
const configuredMaxEvents = normalizeMaxEvents(options.maxEvents, DEFAULT_MAX_EVENTS);
|
|
@@ -768,6 +777,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
768
777
|
const errorInfo = getErrorInfo(event.error, options.stackTrace);
|
|
769
778
|
const sanitizedRemote = sanitizeRemote(event.remote);
|
|
770
779
|
const sanitizedShared = sanitizeShared(event.shared);
|
|
780
|
+
const requestAlias = sanitizeRequestId(event.requestAlias) || resolveAliasRequestId(event.requestId, sanitizedRemote);
|
|
771
781
|
const hostName = sanitizeText(event.hostName, 120) || sanitizeText(origin?.options?.name, 120);
|
|
772
782
|
const runtimeVersion = sanitizeText(origin?.version, 80) || appliedRuntimeVersion;
|
|
773
783
|
const message = getRawText(event.message) || errorInfo.errorMessage;
|
|
@@ -777,6 +787,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
777
787
|
phase: sanitizeText(event.phase, 120) || "runtime",
|
|
778
788
|
status: event.status,
|
|
779
789
|
requestId: sanitizeRequestId(event.requestId),
|
|
790
|
+
requestAlias,
|
|
780
791
|
hostName,
|
|
781
792
|
runtimeVersion,
|
|
782
793
|
remote: sanitizedRemote,
|
|
@@ -967,7 +978,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
967
978
|
}
|
|
968
979
|
if (report.summary.componentLoaded) return "Business component loaded";
|
|
969
980
|
if (report.summary.runtimeLoaded) return "Remote loaded successfully";
|
|
970
|
-
if (report.summary.preloaded) return "Remote
|
|
981
|
+
if (report.summary.preloaded) return "Remote preloaded successfully";
|
|
971
982
|
return "Remote loading is pending";
|
|
972
983
|
}
|
|
973
984
|
switch (report.errorCode) {
|
|
@@ -1021,6 +1032,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1021
1032
|
addFact("ownerHint", ownerHint);
|
|
1022
1033
|
addFact("retryable", report.retryable ?? report.summary.error?.retryable);
|
|
1023
1034
|
addFact("requestId", report.requestId);
|
|
1035
|
+
addFact("requestAlias", report.requestAlias || report.summary.error?.context?.["requestAlias"]);
|
|
1024
1036
|
addFact("hostName", report.hostName);
|
|
1025
1037
|
addFact("remoteName", report.remote?.name);
|
|
1026
1038
|
addFact("remoteAlias", report.remote?.alias);
|
|
@@ -1158,6 +1170,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1158
1170
|
traceId: event.traceId,
|
|
1159
1171
|
status: event.status === "error" ? "error" : "pending",
|
|
1160
1172
|
requestId: event.requestId,
|
|
1173
|
+
requestAlias: event.requestAlias,
|
|
1161
1174
|
hostName: event.hostName,
|
|
1162
1175
|
runtimeVersion: event.runtimeVersion,
|
|
1163
1176
|
remote: event.remote ? { ...event.remote } : void 0,
|
|
@@ -1196,6 +1209,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1196
1209
|
reports.set(event.traceId, report);
|
|
1197
1210
|
}
|
|
1198
1211
|
if (event.requestId) report.requestId = event.requestId;
|
|
1212
|
+
if (event.requestAlias) report.requestAlias = event.requestAlias;
|
|
1199
1213
|
if (event.hostName) report.hostName = event.hostName;
|
|
1200
1214
|
if (event.runtimeVersion) report.runtimeVersion = event.runtimeVersion;
|
|
1201
1215
|
if (event.remote) report.remote = { ...event.remote };
|
|
@@ -1265,8 +1279,12 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1265
1279
|
keepalive: body.length <= 64 * 1024,
|
|
1266
1280
|
credentials: "omit",
|
|
1267
1281
|
mode: "cors"
|
|
1268
|
-
}).catch(() => {
|
|
1269
|
-
|
|
1282
|
+
}).catch((error) => {
|
|
1283
|
+
logger.debug("Failed to notify local observability collector.", error);
|
|
1284
|
+
});
|
|
1285
|
+
} catch (error) {
|
|
1286
|
+
logger.debug("Failed to notify local observability collector.", error);
|
|
1287
|
+
}
|
|
1270
1288
|
};
|
|
1271
1289
|
const notifyDevtools = (event, report) => {
|
|
1272
1290
|
if (!devtoolsOptions) return;
|
|
@@ -1305,6 +1323,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1305
1323
|
report.remote?.alias,
|
|
1306
1324
|
report.remote?.entry,
|
|
1307
1325
|
report.requestId,
|
|
1326
|
+
report.requestAlias,
|
|
1308
1327
|
report.sanitizedUrl
|
|
1309
1328
|
].some((value) => matchesReportValue(value, query.remote))) return false;
|
|
1310
1329
|
if (query.expose && ![report.expose, report.requestId].some((value) => matchesReportValue(value, query.expose))) return false;
|
|
@@ -1361,6 +1380,14 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1361
1380
|
}
|
|
1362
1381
|
};
|
|
1363
1382
|
const shouldUseConsole = () => options.console !== false;
|
|
1383
|
+
const shouldUseDevelopmentChannels = () => {
|
|
1384
|
+
if (shouldUseMinimalBrowserConsole()) return false;
|
|
1385
|
+
if (shouldForceDevelopmentChannels) return true;
|
|
1386
|
+
if (typeof process === "undefined" || !process.env) return true;
|
|
1387
|
+
return process.env.NODE_ENV !== "production";
|
|
1388
|
+
};
|
|
1389
|
+
const shouldNotifyCollector = () => Boolean(collectorOptions);
|
|
1390
|
+
const shouldNotifyDevtools = () => shouldUseDevelopmentChannels();
|
|
1364
1391
|
const shouldUseMinimalBrowserConsole = () => options.browser?.mode === "production";
|
|
1365
1392
|
const shouldUseStartTrace = () => options.trace?.printStart ?? (options.browser?.enabled === true && !shouldUseMinimalBrowserConsole());
|
|
1366
1393
|
const shouldPrintStartConsole = (event) => shouldUseStartTrace() && event.status === "start" && (event.phase === "loadRemote" || event.phase === "shared") && shouldUseConsole();
|
|
@@ -1387,6 +1414,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1387
1414
|
`phase: ${report.failedPhase || event.phase}`
|
|
1388
1415
|
];
|
|
1389
1416
|
if (report.requestId) lines.push(`requestId: ${report.requestId}`);
|
|
1417
|
+
if (report.requestAlias) lines.push(`requestAlias: ${report.requestAlias}`);
|
|
1390
1418
|
if (report.errorCode) lines.push(`errorCode: ${report.errorCode}`);
|
|
1391
1419
|
if (report.shared?.name) lines.push(`shared: ${report.shared.name}`);
|
|
1392
1420
|
const browserReadCommand = getBrowserReadCommand(report.traceId);
|
|
@@ -1414,6 +1442,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1414
1442
|
`phase: ${event.phase}`
|
|
1415
1443
|
];
|
|
1416
1444
|
if (event.requestId) lines.push(`requestId: ${event.requestId}`);
|
|
1445
|
+
if (event.requestAlias) lines.push(`requestAlias: ${event.requestAlias}`);
|
|
1417
1446
|
if (event.remote?.name) lines.push(`remote: ${event.remote.name}`);
|
|
1418
1447
|
if (event.shared?.name) lines.push(`shared: ${event.shared.name}`);
|
|
1419
1448
|
if (event.lifecycle) lines.push(`lifecycle: ${event.lifecycle}`);
|
|
@@ -1444,8 +1473,8 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1444
1473
|
const report = updateReport(event);
|
|
1445
1474
|
emitStartConsoleHint(event, report);
|
|
1446
1475
|
emitConsoleHint(event, report, input.error);
|
|
1447
|
-
notifyCollector(event, report);
|
|
1448
|
-
notifyDevtools(event, report);
|
|
1476
|
+
if (shouldNotifyCollector()) notifyCollector(event, report);
|
|
1477
|
+
if (shouldNotifyDevtools()) notifyDevtools(event, report);
|
|
1449
1478
|
notifyRawError(input.error, event, report, origin);
|
|
1450
1479
|
notifyEvent(event, report, origin);
|
|
1451
1480
|
notifyReport(report, origin);
|
|
@@ -1492,7 +1521,29 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1492
1521
|
if (options.react?.enabled === false || options.react?.injectLoadedCallback !== true) return;
|
|
1493
1522
|
const remoteIds = options.react.remoteIds || [];
|
|
1494
1523
|
if (!remoteIds.length) return { allowAnonymousComponent: false };
|
|
1495
|
-
|
|
1524
|
+
const normalizeRemoteId = (value) => value.replace(/\/\.\//g, "/").replace(/^\.\//, "");
|
|
1525
|
+
const expectedRemoteIds = new Set(remoteIds.map(normalizeRemoteId));
|
|
1526
|
+
const candidates = /* @__PURE__ */ new Set();
|
|
1527
|
+
const addCandidate = (value) => {
|
|
1528
|
+
if (!value) return;
|
|
1529
|
+
candidates.add(value);
|
|
1530
|
+
candidates.add(normalizeRemoteId(value));
|
|
1531
|
+
};
|
|
1532
|
+
const exposeValues = [loadArgs.expose];
|
|
1533
|
+
if (loadArgs.expose?.startsWith("./")) exposeValues.push(loadArgs.expose.slice(2));
|
|
1534
|
+
const remoteNames = [
|
|
1535
|
+
loadArgs.pkgNameOrAlias,
|
|
1536
|
+
loadArgs.remote?.alias,
|
|
1537
|
+
loadArgs.remote?.name
|
|
1538
|
+
];
|
|
1539
|
+
addCandidate(loadArgs.id);
|
|
1540
|
+
addCandidate(loadArgs.expose);
|
|
1541
|
+
remoteNames.forEach((remoteName) => {
|
|
1542
|
+
exposeValues.forEach((expose) => {
|
|
1543
|
+
addCandidate(remoteName && expose ? `${remoteName}/${expose}` : "");
|
|
1544
|
+
});
|
|
1545
|
+
});
|
|
1546
|
+
return Array.from(candidates).some((candidate) => expectedRemoteIds.has(candidate)) ? { allowAnonymousComponent: true } : void 0;
|
|
1496
1547
|
};
|
|
1497
1548
|
const createReactComponentWrapper = (component, loadArgs, wrapPolicy, react) => {
|
|
1498
1549
|
const target = resolveReactComponentTarget(component, options.react?.defaultExportMode || (wrapPolicy.allowAnonymousComponent ? "component" : "preserve"), wrapPolicy.allowAnonymousComponent);
|
|
@@ -1866,27 +1917,78 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1866
1917
|
return returnHookArgs(args);
|
|
1867
1918
|
}
|
|
1868
1919
|
};
|
|
1869
|
-
if (!shouldDisablePreloadHooks)
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1920
|
+
if (!shouldDisablePreloadHooks) {
|
|
1921
|
+
plugin.generatePreloadAssets = (args) => {
|
|
1922
|
+
const preloadArgs = args;
|
|
1923
|
+
if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
|
|
1924
|
+
const remote = createRemoteInfo(preloadArgs.remoteInfo || preloadArgs.remote);
|
|
1925
|
+
const preloadConfig = preloadArgs.preloadOptions?.preloadConfig;
|
|
1926
|
+
recordEvent({
|
|
1927
|
+
phase: "preload",
|
|
1928
|
+
status: "start",
|
|
1929
|
+
requestId: remote?.name || sanitizeText(preloadConfig?.nameOrAlias, 160),
|
|
1930
|
+
remote,
|
|
1931
|
+
lifecycle: "generatePreloadAssets",
|
|
1932
|
+
message: "preload:assets-ready",
|
|
1933
|
+
metadata: clipObservabilityMetadata({
|
|
1934
|
+
nameOrAlias: preloadConfig?.nameOrAlias,
|
|
1935
|
+
exposes: preloadConfig?.exposes?.join(","),
|
|
1936
|
+
resourceCategory: preloadConfig?.resourceCategory,
|
|
1937
|
+
share: preloadConfig?.share,
|
|
1938
|
+
depsRemote: Array.isArray(preloadConfig?.depsRemote) ? "custom" : preloadConfig?.depsRemote
|
|
1939
|
+
})
|
|
1940
|
+
}, preloadArgs.origin);
|
|
1941
|
+
return returnHookArgs(args);
|
|
1942
|
+
};
|
|
1943
|
+
plugin.afterPreloadRemote = (args) => {
|
|
1944
|
+
const preloadArgs = args;
|
|
1945
|
+
if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
|
|
1946
|
+
const results = preloadArgs.results || [];
|
|
1947
|
+
if (results.length === 0 && preloadArgs.error) {
|
|
1948
|
+
recordEvent({
|
|
1949
|
+
phase: "preload",
|
|
1950
|
+
status: "error",
|
|
1951
|
+
requestId: "preloadRemote",
|
|
1952
|
+
lifecycle: "afterPreloadRemote",
|
|
1953
|
+
message: "preload:failed",
|
|
1954
|
+
error: preloadArgs.error
|
|
1955
|
+
}, preloadArgs.origin);
|
|
1956
|
+
return returnHookArgs(args);
|
|
1957
|
+
}
|
|
1958
|
+
results.forEach((preloadResult) => {
|
|
1959
|
+
const remote = createRemoteInfo(preloadResult.remoteInfo || preloadResult.remote);
|
|
1960
|
+
const requestId = sanitizeRequestId(preloadResult.id) || remote?.name || sanitizeText(preloadResult.preloadConfig?.nameOrAlias, 160);
|
|
1961
|
+
preloadResult.results?.forEach((assetResult) => {
|
|
1962
|
+
const isError = assetResult.status === "error" || assetResult.status === "timeout";
|
|
1963
|
+
recordEvent({
|
|
1964
|
+
phase: "preload",
|
|
1965
|
+
status: isError ? "error" : "success",
|
|
1966
|
+
requestId,
|
|
1967
|
+
remote,
|
|
1968
|
+
url: assetResult.url,
|
|
1969
|
+
cached: assetResult.status === "cached",
|
|
1970
|
+
lifecycle: "afterPreloadRemote",
|
|
1971
|
+
message: `preload:${assetResult.resourceType || "resource"}:${assetResult.status || "complete"}`,
|
|
1972
|
+
error: isError ? assetResult.error : void 0,
|
|
1973
|
+
errorContext: isError ? {
|
|
1974
|
+
resourceType: assetResult.resourceType,
|
|
1975
|
+
initiator: assetResult.initiator,
|
|
1976
|
+
status: assetResult.status,
|
|
1977
|
+
id: assetResult.id
|
|
1978
|
+
} : void 0,
|
|
1979
|
+
metadata: clipObservabilityMetadata({
|
|
1980
|
+
resourceType: assetResult.resourceType,
|
|
1981
|
+
initiator: assetResult.initiator,
|
|
1982
|
+
status: assetResult.status,
|
|
1983
|
+
id: assetResult.id,
|
|
1984
|
+
preloadNameOrAlias: preloadResult.preloadConfig?.nameOrAlias
|
|
1985
|
+
})
|
|
1986
|
+
}, preloadArgs.origin);
|
|
1987
|
+
});
|
|
1988
|
+
});
|
|
1989
|
+
return returnHookArgs(args);
|
|
1990
|
+
};
|
|
1991
|
+
}
|
|
1890
1992
|
return {
|
|
1891
1993
|
plugin,
|
|
1892
1994
|
getEvents() {
|
|
@@ -1931,9 +2033,4 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
|
|
|
1931
2033
|
}
|
|
1932
2034
|
|
|
1933
2035
|
//#endregion
|
|
1934
|
-
|
|
1935
|
-
enumerable: true,
|
|
1936
|
-
get: function () {
|
|
1937
|
-
return createObservability;
|
|
1938
|
-
}
|
|
1939
|
-
});
|
|
2036
|
+
export { createObservability as t };
|
package/dist/esm/index.js
CHANGED
package/dist/esm/node.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as ObservabilityReportListOptions, B as OnMFRemoteLoaded, C as ObservabilityPhaseCollection, D as ObservabilityRemoteInfo, E as ObservabilityRawErrorContext, F as ObservabilityRuntimeEventInput, I as ObservabilityRuntimeOrigin, L as ObservabilityRuntimePlugin, M as ObservabilityReportQuery, N as ObservabilityReportStatus, O as ObservabilityReport, P as ObservabilityRuntimeAdapterOptions, R as ObservabilitySharedInfo, S as ObservabilityOwnerHint, T as ObservabilityPluginOptions, V as createObservability, _ as ObservabilityLoadedBeforeInfo, a as ObservabilityBrowserMode, b as ObservabilityModuleInfoEntry, c as ObservabilityErrorSummary, d as ObservabilityEventSource, f as ObservabilityEventStatus, g as ObservabilityLoadedBeforeConsumer, h as ObservabilityLevel, i as ObservabilityActionId, j as ObservabilityReportOutcome, k as ObservabilityReportFlags, l as ObservabilityEvent, m as ObservabilityInstanceAPI, n as MarkComponentLoadedOptions, o as ObservabilityBrowserReader, p as ObservabilityFactReport, r as ObservabilityAction, s as ObservabilityController, t as MFRemoteLoadedOptions, u as ObservabilityEventContext, v as ObservabilityMetadata, w as ObservabilityPhaseSummary, x as ObservabilityModuleInfoSummary, y as ObservabilityMetadataValue, z as ObservabilitySharedSummary } from "./core-
|
|
1
|
+
import { A as ObservabilityReportListOptions, B as OnMFRemoteLoaded, C as ObservabilityPhaseCollection, D as ObservabilityRemoteInfo, E as ObservabilityRawErrorContext, F as ObservabilityRuntimeEventInput, I as ObservabilityRuntimeOrigin, L as ObservabilityRuntimePlugin, M as ObservabilityReportQuery, N as ObservabilityReportStatus, O as ObservabilityReport, P as ObservabilityRuntimeAdapterOptions, R as ObservabilitySharedInfo, S as ObservabilityOwnerHint, T as ObservabilityPluginOptions, V as createObservability, _ as ObservabilityLoadedBeforeInfo, a as ObservabilityBrowserMode, b as ObservabilityModuleInfoEntry, c as ObservabilityErrorSummary, d as ObservabilityEventSource, f as ObservabilityEventStatus, g as ObservabilityLoadedBeforeConsumer, h as ObservabilityLevel, i as ObservabilityActionId, j as ObservabilityReportOutcome, k as ObservabilityReportFlags, l as ObservabilityEvent, m as ObservabilityInstanceAPI, n as MarkComponentLoadedOptions, o as ObservabilityBrowserReader, p as ObservabilityFactReport, r as ObservabilityAction, s as ObservabilityController, t as MFRemoteLoadedOptions, u as ObservabilityEventContext, v as ObservabilityMetadata, w as ObservabilityPhaseSummary, x as ObservabilityModuleInfoSummary, y as ObservabilityMetadataValue, z as ObservabilitySharedSummary } from "./core-Db-z5jD3.js";
|
|
2
2
|
import { ObservabilityPlugin } from "./browser.js";
|
|
3
3
|
import { ChromeObservabilityPlugin } from "./chrome-devtool.js";
|
|
4
4
|
export { ChromeObservabilityPlugin, MFRemoteLoadedOptions, MarkComponentLoadedOptions, ObservabilityAction, ObservabilityActionId, ObservabilityBrowserMode, ObservabilityBrowserReader, ObservabilityController, ObservabilityErrorSummary, ObservabilityEvent, ObservabilityEventContext, ObservabilityEventSource, ObservabilityEventStatus, ObservabilityFactReport, ObservabilityInstanceAPI, ObservabilityLevel, ObservabilityLoadedBeforeConsumer, ObservabilityLoadedBeforeInfo, ObservabilityMetadata, ObservabilityMetadataValue, ObservabilityModuleInfoEntry, ObservabilityModuleInfoSummary, ObservabilityOwnerHint, ObservabilityPhaseCollection, ObservabilityPhaseSummary, ObservabilityPlugin, ObservabilityPlugin as default, ObservabilityPluginOptions, ObservabilityRawErrorContext, ObservabilityRemoteInfo, ObservabilityReport, ObservabilityReportFlags, ObservabilityReportListOptions, ObservabilityReportOutcome, ObservabilityReportQuery, ObservabilityReportStatus, ObservabilityRuntimeAdapterOptions, ObservabilityRuntimeEventInput, ObservabilityRuntimeOrigin, ObservabilityRuntimePlugin, ObservabilitySharedInfo, ObservabilitySharedSummary, OnMFRemoteLoaded, createObservability };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
2
|
-
const require_core = require('./core
|
|
2
|
+
const require_core = require('./core--1ofIHU9.js');
|
|
3
3
|
const require_browser = require('./browser.js');
|
|
4
4
|
const require_chrome_devtool = require('./chrome-devtool.js');
|
|
5
5
|
|
package/dist/node.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions, s as ObservabilityController } from "./core-
|
|
1
|
+
import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions, s as ObservabilityController } from "./core-Db-z5jD3.js";
|
|
2
2
|
|
|
3
3
|
//#region src/node.d.ts
|
|
4
4
|
interface ObservabilityNodeOptions extends Omit<ObservabilityPluginOptions, 'browser'> {
|
package/dist/node.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
2
|
-
const require_core = require('./core
|
|
2
|
+
const require_core = require('./core--1ofIHU9.js');
|
|
3
3
|
|
|
4
4
|
//#region src/node.ts
|
|
5
5
|
const DEFAULT_NODE_DIRECTORY = ".mf/observability";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@module-federation/observability-plugin",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"author": "module-federation",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@module-federation/runtime": "
|
|
68
|
+
"@module-federation/runtime": "2.5.0"
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@module-federation/sdk": "
|
|
71
|
+
"@module-federation/sdk": "2.5.0"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
74
74
|
"build": "tsdown --config tsdown.config.ts && cp *.md dist",
|