@localstack/appinspector-ui 1.0.30 → 1.0.31
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/dist/index.cjs +140 -89
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +87 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -37,8 +37,8 @@ module.exports = __toCommonJS(index_exports);
|
|
|
37
37
|
|
|
38
38
|
// src/pages/spans-list-page.tsx
|
|
39
39
|
var import_material8 = require("@mui/material");
|
|
40
|
-
var
|
|
41
|
-
var
|
|
40
|
+
var import_react10 = require("react");
|
|
41
|
+
var import_react_router_dom2 = require("react-router-dom");
|
|
42
42
|
|
|
43
43
|
// src/api/use-api.tsx
|
|
44
44
|
var import_react = require("react");
|
|
@@ -3513,29 +3513,71 @@ var useStatus = () => {
|
|
|
3513
3513
|
return { checking, checkStatus, error, status };
|
|
3514
3514
|
};
|
|
3515
3515
|
|
|
3516
|
+
// src/utils/use-search-param-codec.ts
|
|
3517
|
+
var import_react9 = require("react");
|
|
3518
|
+
var import_react_router_dom = require("react-router-dom");
|
|
3519
|
+
var useSearchParamCodec = (key, codec) => {
|
|
3520
|
+
const [searchParams, setSearchParams] = (0, import_react_router_dom.useSearchParams)();
|
|
3521
|
+
const raw = searchParams.get(key) ?? void 0;
|
|
3522
|
+
const value = (0, import_react9.useMemo)(() => {
|
|
3523
|
+
return codec.decode(raw);
|
|
3524
|
+
}, [raw, codec]);
|
|
3525
|
+
const setValue = (0, import_react9.useCallback)(
|
|
3526
|
+
(next) => {
|
|
3527
|
+
setSearchParams((previous) => {
|
|
3528
|
+
const nextParams = new URLSearchParams(previous);
|
|
3529
|
+
nextParams.set(key, codec.encode(next));
|
|
3530
|
+
return nextParams;
|
|
3531
|
+
});
|
|
3532
|
+
},
|
|
3533
|
+
[key, codec, setSearchParams]
|
|
3534
|
+
);
|
|
3535
|
+
return [value, setValue];
|
|
3536
|
+
};
|
|
3537
|
+
|
|
3516
3538
|
// src/pages/spans-list-page.tsx
|
|
3517
3539
|
var import_jsx_runtime130 = require("react/jsx-runtime");
|
|
3518
3540
|
var spansPerPageOptions = [25, 50, 100];
|
|
3519
3541
|
var SpansListPage = () => {
|
|
3520
3542
|
const api = useAppInspectorApi();
|
|
3521
|
-
const [spans, setSpans] = (0,
|
|
3522
|
-
const [loading, setLoading] = (0,
|
|
3523
|
-
const hasFetched = (0,
|
|
3543
|
+
const [spans, setSpans] = (0, import_react10.useState)();
|
|
3544
|
+
const [loading, setLoading] = (0, import_react10.useState)(false);
|
|
3545
|
+
const hasFetched = (0, import_react10.useRef)(false);
|
|
3524
3546
|
const [filterWriteOperations, setFilterWriteOperations] = useLocalStorage("filterWriteOperations", true);
|
|
3525
|
-
const mapPageToNextCursor = (0,
|
|
3526
|
-
const [page, setPage] = (
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3547
|
+
const mapPageToNextCursor = (0, import_react10.useRef)({});
|
|
3548
|
+
const [page, setPage] = useSearchParamCodec("page", {
|
|
3549
|
+
decode: (raw) => {
|
|
3550
|
+
const defaultPage = 0;
|
|
3551
|
+
if (!raw) {
|
|
3552
|
+
return defaultPage;
|
|
3553
|
+
}
|
|
3554
|
+
const parsed = Number.parseInt(raw, 10);
|
|
3555
|
+
return Number.isNaN(parsed) || parsed < 0 ? defaultPage : parsed;
|
|
3556
|
+
},
|
|
3557
|
+
encode: (value) => value.toString()
|
|
3558
|
+
});
|
|
3559
|
+
const [pageSize, setPageSize] = useSearchParamCodec("pageSize", {
|
|
3560
|
+
decode: (raw) => {
|
|
3561
|
+
const defaultPageSize = 100;
|
|
3562
|
+
if (!raw) {
|
|
3563
|
+
return defaultPageSize;
|
|
3564
|
+
}
|
|
3565
|
+
const parsed = Number.parseInt(raw, 10);
|
|
3566
|
+
return spansPerPageOptions.includes(parsed) ? parsed : defaultPageSize;
|
|
3567
|
+
},
|
|
3568
|
+
encode: (value) => value.toString()
|
|
3569
|
+
});
|
|
3570
|
+
const [spanCount, setSpanCount] = (0, import_react10.useState)(0);
|
|
3571
|
+
const queryOptions = (0, import_react10.useMemo)(() => {
|
|
3530
3572
|
return {
|
|
3531
3573
|
is_write_operation: filterWriteOperations ? true : void 0,
|
|
3532
3574
|
limit: pageSize,
|
|
3533
3575
|
pagination_token: mapPageToNextCursor.current[page - 1]
|
|
3534
3576
|
};
|
|
3535
3577
|
}, [filterWriteOperations, pageSize, page]);
|
|
3536
|
-
const [fetchError, setFetchError] = (0,
|
|
3578
|
+
const [fetchError, setFetchError] = (0, import_react10.useState)();
|
|
3537
3579
|
const { checkStatus, error: statusError, status } = useStatus();
|
|
3538
|
-
const fetchSpans = (0,
|
|
3580
|
+
const fetchSpans = (0, import_react10.useCallback)(async () => {
|
|
3539
3581
|
setLoading(true);
|
|
3540
3582
|
try {
|
|
3541
3583
|
const response = await api.getSpans(queryOptions);
|
|
@@ -3552,26 +3594,31 @@ var SpansListPage = () => {
|
|
|
3552
3594
|
setLoading(false);
|
|
3553
3595
|
}
|
|
3554
3596
|
}, [api, page, queryOptions]);
|
|
3555
|
-
const fetchSpansSync = (0,
|
|
3597
|
+
const fetchSpansSync = (0, import_react10.useCallback)(() => {
|
|
3556
3598
|
void fetchSpans();
|
|
3557
3599
|
}, [fetchSpans]);
|
|
3558
|
-
(0,
|
|
3600
|
+
(0, import_react10.useEffect)(() => {
|
|
3559
3601
|
if (hasFetched.current) return;
|
|
3560
3602
|
if (status?.status !== "ENABLED") return;
|
|
3561
3603
|
hasFetched.current = true;
|
|
3562
3604
|
void fetchSpans();
|
|
3563
3605
|
}, [fetchSpans, status]);
|
|
3564
|
-
(0,
|
|
3606
|
+
(0, import_react10.useEffect)(() => {
|
|
3565
3607
|
if (!hasFetched.current) return;
|
|
3566
3608
|
void fetchSpans();
|
|
3567
3609
|
}, [fetchSpans]);
|
|
3568
|
-
const navigate = (0,
|
|
3610
|
+
const navigate = (0, import_react_router_dom2.useNavigate)();
|
|
3569
3611
|
const { resolveLink } = useAppInspector();
|
|
3570
|
-
const navigateToSpan = (0,
|
|
3612
|
+
const navigateToSpan = (0, import_react10.useCallback)((span) => {
|
|
3571
3613
|
const url = resolveLink({ to: "trace-graph", traceId: span.trace_id });
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3614
|
+
const searchParams = new URLSearchParams({
|
|
3615
|
+
page: String(page),
|
|
3616
|
+
pageSize: String(pageSize),
|
|
3617
|
+
spanId: span.span_id
|
|
3618
|
+
});
|
|
3619
|
+
navigate(`${url}?${searchParams.toString()}`);
|
|
3620
|
+
}, [navigate, resolveLink, page, pageSize]);
|
|
3621
|
+
const clearSpans = (0, import_react10.useCallback)(async () => {
|
|
3575
3622
|
setLoading(true);
|
|
3576
3623
|
try {
|
|
3577
3624
|
await api.deleteSpans();
|
|
@@ -3585,7 +3632,7 @@ var SpansListPage = () => {
|
|
|
3585
3632
|
setLoading(false);
|
|
3586
3633
|
}
|
|
3587
3634
|
}, [api, fetchSpans]);
|
|
3588
|
-
const handleRetry = (0,
|
|
3635
|
+
const handleRetry = (0, import_react10.useCallback)(() => {
|
|
3589
3636
|
void checkStatus();
|
|
3590
3637
|
}, [checkStatus]);
|
|
3591
3638
|
const shouldShowStatusMessage = Boolean(statusError) || status?.status === "DISABLED";
|
|
@@ -3644,13 +3691,13 @@ var SpansListPage = () => {
|
|
|
3644
3691
|
var import_icons_material11 = require("@mui/icons-material");
|
|
3645
3692
|
var import_material21 = require("@mui/material");
|
|
3646
3693
|
var import_styles = require("@mui/material/styles");
|
|
3647
|
-
var
|
|
3648
|
-
var
|
|
3649
|
-
var
|
|
3694
|
+
var import_react23 = require("@xyflow/react");
|
|
3695
|
+
var import_react24 = require("react");
|
|
3696
|
+
var import_react_router_dom3 = require("react-router-dom");
|
|
3650
3697
|
|
|
3651
3698
|
// src/components/event-details/event-details.tsx
|
|
3652
3699
|
var import_material16 = require("@mui/material");
|
|
3653
|
-
var
|
|
3700
|
+
var import_react14 = require("react");
|
|
3654
3701
|
|
|
3655
3702
|
// src/utils/iam-utils.ts
|
|
3656
3703
|
function determinePermissionStatus(payload) {
|
|
@@ -3884,7 +3931,7 @@ var import_material15 = require("@mui/material");
|
|
|
3884
3931
|
// src/components/event-details/event-detail.tsx
|
|
3885
3932
|
var import_icons_material7 = require("@mui/icons-material");
|
|
3886
3933
|
var import_material13 = require("@mui/material");
|
|
3887
|
-
var
|
|
3934
|
+
var import_react12 = require("react");
|
|
3888
3935
|
|
|
3889
3936
|
// src/components/status-icon.tsx
|
|
3890
3937
|
var import_icons_material4 = require("@mui/icons-material");
|
|
@@ -4035,7 +4082,7 @@ var IAMEventDetail = ({ event }) => {
|
|
|
4035
4082
|
// src/components/event-details/iam-permission-detail.tsx
|
|
4036
4083
|
var import_icons_material6 = require("@mui/icons-material");
|
|
4037
4084
|
var import_material12 = require("@mui/material");
|
|
4038
|
-
var
|
|
4085
|
+
var import_react11 = require("react");
|
|
4039
4086
|
var import_jsx_runtime134 = require("react/jsx-runtime");
|
|
4040
4087
|
var getChipColors = (status) => {
|
|
4041
4088
|
const isAllowed = status === "explicitly_allowed" || status === "implicitly_allowed";
|
|
@@ -4045,8 +4092,8 @@ var getChipColors = (status) => {
|
|
|
4045
4092
|
};
|
|
4046
4093
|
};
|
|
4047
4094
|
var IAMPermissionItem = ({ event }) => {
|
|
4048
|
-
const [isOpen, setIsOpen] = (0,
|
|
4049
|
-
const parsedData = (0,
|
|
4095
|
+
const [isOpen, setIsOpen] = (0, import_react11.useState)(false);
|
|
4096
|
+
const parsedData = (0, import_react11.useMemo)(() => {
|
|
4050
4097
|
const payloadString = event.attributes?.payload;
|
|
4051
4098
|
if (!payloadString) {
|
|
4052
4099
|
return;
|
|
@@ -4116,15 +4163,15 @@ var DetailRow2 = ({ content, label }) => /* @__PURE__ */ (0, import_jsx_runtime1
|
|
|
4116
4163
|
) : content })
|
|
4117
4164
|
] });
|
|
4118
4165
|
var EventMessage = ({ event }) => {
|
|
4119
|
-
const [isOpen, setIsOpen] = (0,
|
|
4120
|
-
const [isOverflowing, setIsOverflowing] = (0,
|
|
4121
|
-
const textReference = (0,
|
|
4122
|
-
const parsedMessage = (0,
|
|
4123
|
-
const isIAMPolicyEvent = (0,
|
|
4166
|
+
const [isOpen, setIsOpen] = (0, import_react12.useState)(false);
|
|
4167
|
+
const [isOverflowing, setIsOverflowing] = (0, import_react12.useState)(false);
|
|
4168
|
+
const textReference = (0, import_react12.useRef)(null);
|
|
4169
|
+
const parsedMessage = (0, import_react12.useMemo)(() => parseEventMessage(event), [event]);
|
|
4170
|
+
const isIAMPolicyEvent = (0, import_react12.useMemo)(
|
|
4124
4171
|
() => event.event_type === "iam.policy_evaluation" && event.attributes?.payload && typeof event.attributes.payload === "string",
|
|
4125
4172
|
[event]
|
|
4126
4173
|
);
|
|
4127
|
-
(0,
|
|
4174
|
+
(0, import_react12.useEffect)(() => {
|
|
4128
4175
|
const checkOverflow = () => {
|
|
4129
4176
|
const element = textReference.current;
|
|
4130
4177
|
if (element) {
|
|
@@ -4137,11 +4184,11 @@ var EventMessage = ({ event }) => {
|
|
|
4137
4184
|
window.removeEventListener("resize", checkOverflow);
|
|
4138
4185
|
};
|
|
4139
4186
|
}, [parsedMessage.headline]);
|
|
4140
|
-
const hasAdditionalContent = (0,
|
|
4187
|
+
const hasAdditionalContent = (0, import_react12.useMemo)(
|
|
4141
4188
|
() => parsedMessage.message || parsedMessage.details || isIAMPolicyEvent,
|
|
4142
4189
|
[parsedMessage.message, parsedMessage.details, isIAMPolicyEvent]
|
|
4143
4190
|
);
|
|
4144
|
-
const shouldShowToggle = (0,
|
|
4191
|
+
const shouldShowToggle = (0, import_react12.useMemo)(
|
|
4145
4192
|
() => isOverflowing || hasAdditionalContent,
|
|
4146
4193
|
[isOverflowing, hasAdditionalContent]
|
|
4147
4194
|
);
|
|
@@ -4283,10 +4330,10 @@ var EventDetail = ({
|
|
|
4283
4330
|
// src/components/event-details/toggle-section.tsx
|
|
4284
4331
|
var import_icons_material8 = require("@mui/icons-material");
|
|
4285
4332
|
var import_material14 = require("@mui/material");
|
|
4286
|
-
var
|
|
4333
|
+
var import_react13 = require("react");
|
|
4287
4334
|
var import_jsx_runtime136 = require("react/jsx-runtime");
|
|
4288
4335
|
var ToggleSection = ({ children, headline, initialOpen = true }) => {
|
|
4289
|
-
const [isOpen, setIsOpen] = (0,
|
|
4336
|
+
const [isOpen, setIsOpen] = (0, import_react13.useState)(initialOpen);
|
|
4290
4337
|
return /* @__PURE__ */ (0, import_jsx_runtime136.jsxs)(import_material14.Box, { sx: { mt: 4 }, children: [
|
|
4291
4338
|
/* @__PURE__ */ (0, import_jsx_runtime136.jsx)(
|
|
4292
4339
|
import_material14.Box,
|
|
@@ -4362,7 +4409,7 @@ var EventSection = ({
|
|
|
4362
4409
|
// src/components/event-details/event-details.tsx
|
|
4363
4410
|
var import_jsx_runtime138 = require("react/jsx-runtime");
|
|
4364
4411
|
var EventDetails = ({ onClose, selectedEvent }) => {
|
|
4365
|
-
const attributes = (0,
|
|
4412
|
+
const attributes = (0, import_react14.useMemo)(() => {
|
|
4366
4413
|
const attributes2 = Object.entries(selectedEvent?.attributes ?? {});
|
|
4367
4414
|
return attributes2.filter(([key]) => key !== "localstack.aws.account_id" && key !== "localstack.aws.service");
|
|
4368
4415
|
}, [selectedEvent?.attributes]);
|
|
@@ -4461,22 +4508,22 @@ function renderKeyValue(key, value) {
|
|
|
4461
4508
|
// src/components/trace-graph/trace-graph.tsx
|
|
4462
4509
|
var import_base = require("@xyflow/react/dist/base.css");
|
|
4463
4510
|
var import_material20 = require("@mui/material");
|
|
4464
|
-
var
|
|
4465
|
-
var
|
|
4511
|
+
var import_react21 = require("@xyflow/react");
|
|
4512
|
+
var import_react22 = require("react");
|
|
4466
4513
|
|
|
4467
4514
|
// src/components/trace-graph/service-node.tsx
|
|
4468
4515
|
var import_material18 = require("@mui/material");
|
|
4469
4516
|
var import_style = require("@xyflow/react/dist/style.css");
|
|
4470
|
-
var
|
|
4471
|
-
var
|
|
4517
|
+
var import_react16 = require("@xyflow/react");
|
|
4518
|
+
var import_react17 = require("react");
|
|
4472
4519
|
|
|
4473
4520
|
// src/components/trace-graph/problem-indicator.tsx
|
|
4474
4521
|
var import_icons_material9 = require("@mui/icons-material");
|
|
4475
4522
|
var import_material17 = require("@mui/material");
|
|
4476
|
-
var
|
|
4523
|
+
var import_react15 = require("react");
|
|
4477
4524
|
var import_jsx_runtime139 = require("react/jsx-runtime");
|
|
4478
4525
|
var ProblemIndicator = ({ error }) => {
|
|
4479
|
-
const icon = (0,
|
|
4526
|
+
const icon = (0, import_react15.useMemo)(() => {
|
|
4480
4527
|
switch (error.level) {
|
|
4481
4528
|
case "error": {
|
|
4482
4529
|
return /* @__PURE__ */ (0, import_jsx_runtime139.jsx)(import_icons_material9.Error, { sx: { color: "#d32f2f", fontSize: "14px" } });
|
|
@@ -4489,7 +4536,7 @@ var ProblemIndicator = ({ error }) => {
|
|
|
4489
4536
|
}
|
|
4490
4537
|
}
|
|
4491
4538
|
}, [error.level]);
|
|
4492
|
-
const color = (0,
|
|
4539
|
+
const color = (0, import_react15.useMemo)(() => {
|
|
4493
4540
|
switch (error.level) {
|
|
4494
4541
|
case "error": {
|
|
4495
4542
|
return "#d32f2f";
|
|
@@ -4528,7 +4575,7 @@ var handleStyle = {
|
|
|
4528
4575
|
borderColor: "lightgray",
|
|
4529
4576
|
opacity: 0
|
|
4530
4577
|
};
|
|
4531
|
-
var ServiceNode = (0,
|
|
4578
|
+
var ServiceNode = (0, import_react17.memo)(({ data, selected }) => {
|
|
4532
4579
|
const hasErrors = (data.event.errors && data.event.errors.length > 0) ?? false;
|
|
4533
4580
|
return /* @__PURE__ */ (0, import_jsx_runtime140.jsxs)(import_material18.Box, { sx: { maxWidth: 200 }, children: [
|
|
4534
4581
|
/* @__PURE__ */ (0, import_jsx_runtime140.jsxs)(
|
|
@@ -4552,8 +4599,8 @@ var ServiceNode = (0, import_react16.memo)(({ data, selected }) => {
|
|
|
4552
4599
|
},
|
|
4553
4600
|
tabIndex: 0,
|
|
4554
4601
|
children: [
|
|
4555
|
-
/* @__PURE__ */ (0, import_jsx_runtime140.jsx)(
|
|
4556
|
-
/* @__PURE__ */ (0, import_jsx_runtime140.jsx)(
|
|
4602
|
+
/* @__PURE__ */ (0, import_jsx_runtime140.jsx)(import_react16.Handle, { position: import_react16.Position.Left, style: handleStyle, type: "target" }),
|
|
4603
|
+
/* @__PURE__ */ (0, import_jsx_runtime140.jsx)(import_react16.Handle, { position: import_react16.Position.Right, style: handleStyle, type: "source" }),
|
|
4557
4604
|
/* @__PURE__ */ (0, import_jsx_runtime140.jsx)(
|
|
4558
4605
|
ServiceCell,
|
|
4559
4606
|
{
|
|
@@ -4613,7 +4660,7 @@ var ServiceNode = (0, import_react16.memo)(({ data, selected }) => {
|
|
|
4613
4660
|
|
|
4614
4661
|
// src/components/trace-graph/utils.ts
|
|
4615
4662
|
var import_dagre = __toESM(require("@dagrejs/dagre"), 1);
|
|
4616
|
-
var
|
|
4663
|
+
var import_react18 = require("@xyflow/react");
|
|
4617
4664
|
var generateNodesAndEdges = (event, parentId) => {
|
|
4618
4665
|
const nodes = [];
|
|
4619
4666
|
const edges = [];
|
|
@@ -4629,8 +4676,8 @@ var generateNodesAndEdges = (event, parentId) => {
|
|
|
4629
4676
|
id: event.span_id,
|
|
4630
4677
|
position: { x: 0, y: 0 },
|
|
4631
4678
|
// Will be set by layout
|
|
4632
|
-
sourcePosition:
|
|
4633
|
-
targetPosition:
|
|
4679
|
+
sourcePosition: import_react18.Position.Right,
|
|
4680
|
+
targetPosition: import_react18.Position.Left,
|
|
4634
4681
|
type: "service"
|
|
4635
4682
|
});
|
|
4636
4683
|
if (parentId) {
|
|
@@ -4640,7 +4687,7 @@ var generateNodesAndEdges = (event, parentId) => {
|
|
|
4640
4687
|
markerEnd: {
|
|
4641
4688
|
color: "lightgray",
|
|
4642
4689
|
height: 16,
|
|
4643
|
-
type:
|
|
4690
|
+
type: import_react18.MarkerType.Arrow,
|
|
4644
4691
|
width: 16
|
|
4645
4692
|
},
|
|
4646
4693
|
source: parentId,
|
|
@@ -4708,8 +4755,8 @@ var calculateCenterX = (focusNodeX, viewPortPixelWidth, minX, maxX) => {
|
|
|
4708
4755
|
// src/components/trace-graph/xyflow/controls.tsx
|
|
4709
4756
|
var import_icons_material10 = require("@mui/icons-material");
|
|
4710
4757
|
var import_material19 = require("@mui/material");
|
|
4711
|
-
var
|
|
4712
|
-
var
|
|
4758
|
+
var import_react19 = require("@xyflow/react");
|
|
4759
|
+
var import_react20 = require("react");
|
|
4713
4760
|
|
|
4714
4761
|
// node_modules/zustand/esm/shallow.mjs
|
|
4715
4762
|
function shallow$1(objA, objB) {
|
|
@@ -4756,9 +4803,9 @@ var selector = (s) => ({
|
|
|
4756
4803
|
maxZoomReached: s.transform[2] >= s.maxZoom,
|
|
4757
4804
|
minZoomReached: s.transform[2] <= s.minZoom
|
|
4758
4805
|
});
|
|
4759
|
-
var Controls = (0,
|
|
4760
|
-
const { maxZoomReached, minZoomReached } = (0,
|
|
4761
|
-
const { fitView, zoomIn, zoomOut } = (0,
|
|
4806
|
+
var Controls = (0, import_react20.memo)(() => {
|
|
4807
|
+
const { maxZoomReached, minZoomReached } = (0, import_react19.useStore)(selector, shallow$1);
|
|
4808
|
+
const { fitView, zoomIn, zoomOut } = (0, import_react19.useReactFlow)();
|
|
4762
4809
|
const onZoomInHandler = () => {
|
|
4763
4810
|
void zoomIn();
|
|
4764
4811
|
};
|
|
@@ -4828,17 +4875,17 @@ var TraceGraph = ({
|
|
|
4828
4875
|
spans,
|
|
4829
4876
|
viewPortPixelWidth
|
|
4830
4877
|
}) => {
|
|
4831
|
-
const [nodes, setNodes] = (0,
|
|
4832
|
-
const [edges, setEdges] = (0,
|
|
4833
|
-
const [initialViewSet, setInitialViewSet] = (0,
|
|
4834
|
-
const { fitView, setCenter } = (0,
|
|
4835
|
-
const updateSelectedNode = (0,
|
|
4878
|
+
const [nodes, setNodes] = (0, import_react22.useState)([]);
|
|
4879
|
+
const [edges, setEdges] = (0, import_react22.useState)([]);
|
|
4880
|
+
const [initialViewSet, setInitialViewSet] = (0, import_react22.useState)(false);
|
|
4881
|
+
const { fitView, setCenter } = (0, import_react21.useReactFlow)();
|
|
4882
|
+
const updateSelectedNode = (0, import_react22.useCallback)((nodeId) => {
|
|
4836
4883
|
const toSelect = new Set(nodeId ? [nodeId] : []);
|
|
4837
4884
|
setNodes((previousNodes) => {
|
|
4838
4885
|
return previousNodes.map((node) => ({ ...node, selected: toSelect.has(node.id) }));
|
|
4839
4886
|
});
|
|
4840
4887
|
}, []);
|
|
4841
|
-
(0,
|
|
4888
|
+
(0, import_react22.useEffect)(() => {
|
|
4842
4889
|
const spansMap = /* @__PURE__ */ new Map();
|
|
4843
4890
|
const rootSpans = [];
|
|
4844
4891
|
for (const span of spans.data ?? []) {
|
|
@@ -4873,7 +4920,7 @@ var TraceGraph = ({
|
|
|
4873
4920
|
setNodes(layoutedNodes);
|
|
4874
4921
|
setEdges(layoutedEdges);
|
|
4875
4922
|
}, [spans.data, initialFocusEventId]);
|
|
4876
|
-
(0,
|
|
4923
|
+
(0, import_react22.useEffect)(() => {
|
|
4877
4924
|
const shouldSetInitialView = !spans.loading && nodes.length > 0 && !initialViewSet;
|
|
4878
4925
|
if (shouldSetInitialView) {
|
|
4879
4926
|
if (initialFocusEventId) {
|
|
@@ -4893,12 +4940,12 @@ var TraceGraph = ({
|
|
|
4893
4940
|
setInitialViewSet(true);
|
|
4894
4941
|
}
|
|
4895
4942
|
}, [spans.loading, nodes, initialFocusEventId, viewPortPixelWidth, setCenter, fitView, onEventSelect, initialViewSet]);
|
|
4896
|
-
(0,
|
|
4943
|
+
(0, import_react22.useEffect)(() => {
|
|
4897
4944
|
if (initialFocusEventId) {
|
|
4898
4945
|
updateSelectedNode(initialFocusEventId);
|
|
4899
4946
|
}
|
|
4900
4947
|
}, [initialFocusEventId, updateSelectedNode]);
|
|
4901
|
-
const onNodeClick = (0,
|
|
4948
|
+
const onNodeClick = (0, import_react22.useCallback)((_event, node) => {
|
|
4902
4949
|
onEventSelect(node.data.event);
|
|
4903
4950
|
updateSelectedNode(node.id);
|
|
4904
4951
|
}, [onEventSelect, updateSelectedNode]);
|
|
@@ -4919,7 +4966,7 @@ var TraceGraph = ({
|
|
|
4919
4966
|
}
|
|
4920
4967
|
),
|
|
4921
4968
|
/* @__PURE__ */ (0, import_jsx_runtime142.jsxs)(
|
|
4922
|
-
|
|
4969
|
+
import_react21.ReactFlow,
|
|
4923
4970
|
{
|
|
4924
4971
|
"data-testid": "trace-graph",
|
|
4925
4972
|
defaultViewport: { x: 0, y: 0, zoom: 1 },
|
|
@@ -4934,7 +4981,7 @@ var TraceGraph = ({
|
|
|
4934
4981
|
children: [
|
|
4935
4982
|
/* @__PURE__ */ (0, import_jsx_runtime142.jsx)(Controls, {}),
|
|
4936
4983
|
/* @__PURE__ */ (0, import_jsx_runtime142.jsx)(
|
|
4937
|
-
|
|
4984
|
+
import_react21.Background,
|
|
4938
4985
|
{
|
|
4939
4986
|
bgColor: theme.palette.background.paper,
|
|
4940
4987
|
color: theme.palette.text.disabled
|
|
@@ -5040,7 +5087,7 @@ var TraceGraphView = ({
|
|
|
5040
5087
|
height: "100%",
|
|
5041
5088
|
overflow: "auto"
|
|
5042
5089
|
},
|
|
5043
|
-
children: traceId !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
|
|
5090
|
+
children: traceId !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(import_react23.ReactFlowProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
|
|
5044
5091
|
TraceGraph,
|
|
5045
5092
|
{
|
|
5046
5093
|
initialFocusEventId: spanId,
|
|
@@ -5067,14 +5114,14 @@ var TraceGraphView = ({
|
|
|
5067
5114
|
);
|
|
5068
5115
|
};
|
|
5069
5116
|
var TraceGraphPage = () => {
|
|
5070
|
-
const { traceId } = (0,
|
|
5071
|
-
const [searchParameters] = (0,
|
|
5117
|
+
const { traceId } = (0, import_react_router_dom3.useParams)();
|
|
5118
|
+
const [searchParameters] = (0, import_react_router_dom3.useSearchParams)();
|
|
5072
5119
|
const spanId = searchParameters.get("spanId");
|
|
5073
5120
|
const api = useAppInspectorApi();
|
|
5074
|
-
const [spans, setSpans] = (0,
|
|
5075
|
-
const [loading, setLoading] = (0,
|
|
5076
|
-
const [fetchError, setFetchError] = (0,
|
|
5077
|
-
const fetchSpans = (0,
|
|
5121
|
+
const [spans, setSpans] = (0, import_react24.useState)();
|
|
5122
|
+
const [loading, setLoading] = (0, import_react24.useState)(false);
|
|
5123
|
+
const [fetchError, setFetchError] = (0, import_react24.useState)();
|
|
5124
|
+
const fetchSpans = (0, import_react24.useCallback)(async () => {
|
|
5078
5125
|
setLoading(true);
|
|
5079
5126
|
try {
|
|
5080
5127
|
const response = await api.getSpans({
|
|
@@ -5089,14 +5136,14 @@ var TraceGraphPage = () => {
|
|
|
5089
5136
|
setLoading(false);
|
|
5090
5137
|
}
|
|
5091
5138
|
}, [api, traceId]);
|
|
5092
|
-
(0,
|
|
5139
|
+
(0, import_react24.useEffect)(() => {
|
|
5093
5140
|
void fetchSpans();
|
|
5094
5141
|
}, [fetchSpans]);
|
|
5095
|
-
const [open, setOpen] = (0,
|
|
5096
|
-
const [selectedEvent, setSelectedEvent] = (0,
|
|
5097
|
-
const [viewPortPixelWidth, setViewPortPixelWidth] = (0,
|
|
5142
|
+
const [open, setOpen] = (0, import_react24.useState)(true);
|
|
5143
|
+
const [selectedEvent, setSelectedEvent] = (0, import_react24.useState)();
|
|
5144
|
+
const [viewPortPixelWidth, setViewPortPixelWidth] = (0, import_react24.useState)(0);
|
|
5098
5145
|
const { checkStatus, error: statusError, status } = useStatus();
|
|
5099
|
-
const calculateDrawerWidth = (0,
|
|
5146
|
+
const calculateDrawerWidth = (0, import_react24.useCallback)(() => {
|
|
5100
5147
|
const percentageMatch = /(\d+)%/.exec(DRAWER_WIDTH);
|
|
5101
5148
|
if (percentageMatch && open) {
|
|
5102
5149
|
const percentage = Number.parseInt(percentageMatch[1], 10);
|
|
@@ -5104,7 +5151,7 @@ var TraceGraphPage = () => {
|
|
|
5104
5151
|
}
|
|
5105
5152
|
return 0;
|
|
5106
5153
|
}, [open]);
|
|
5107
|
-
(0,
|
|
5154
|
+
(0, import_react24.useEffect)(() => {
|
|
5108
5155
|
const updateViewportWidth = () => {
|
|
5109
5156
|
const totalWidth = window.innerWidth;
|
|
5110
5157
|
const drawerPixelWidth = open ? calculateDrawerWidth() : 0;
|
|
@@ -5118,19 +5165,23 @@ var TraceGraphPage = () => {
|
|
|
5118
5165
|
clearTimeout(timeoutId);
|
|
5119
5166
|
};
|
|
5120
5167
|
}, [open, calculateDrawerWidth]);
|
|
5121
|
-
const handleEventSelect = (0,
|
|
5168
|
+
const handleEventSelect = (0, import_react24.useCallback)((event) => {
|
|
5122
5169
|
setSelectedEvent(event);
|
|
5123
5170
|
setOpen(true);
|
|
5124
5171
|
}, []);
|
|
5125
|
-
const handleRetry = (0,
|
|
5172
|
+
const handleRetry = (0, import_react24.useCallback)(() => {
|
|
5126
5173
|
void checkStatus();
|
|
5127
5174
|
}, [checkStatus]);
|
|
5128
|
-
const navigate = (0,
|
|
5175
|
+
const navigate = (0, import_react_router_dom3.useNavigate)();
|
|
5129
5176
|
const { resolveLink } = useAppInspector();
|
|
5130
|
-
const navigateToSpansList = (0,
|
|
5177
|
+
const navigateToSpansList = (0, import_react24.useCallback)(() => {
|
|
5131
5178
|
const url = resolveLink({ to: "spans-list" });
|
|
5132
|
-
|
|
5133
|
-
|
|
5179
|
+
const searchParams = new URLSearchParams({
|
|
5180
|
+
page: searchParameters.get("page") ?? "",
|
|
5181
|
+
pageSize: searchParameters.get("pageSize") ?? ""
|
|
5182
|
+
});
|
|
5183
|
+
navigate(`${url}?${searchParams.toString()}`);
|
|
5184
|
+
}, [navigate, resolveLink, searchParameters]);
|
|
5134
5185
|
return /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
|
|
5135
5186
|
TraceGraphView,
|
|
5136
5187
|
{
|