@parca/profile 0.16.417 → 0.16.418
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/dist/GraphTooltipArrow/Content.d.ts +2 -1
- package/dist/GraphTooltipArrow/Content.d.ts.map +1 -1
- package/dist/GraphTooltipArrow/Content.js +4 -3
- package/dist/GraphTooltipArrow/DockedGraphTooltip/index.d.ts +2 -1
- package/dist/GraphTooltipArrow/DockedGraphTooltip/index.d.ts.map +1 -1
- package/dist/GraphTooltipArrow/DockedGraphTooltip/index.js +4 -5
- package/dist/GraphTooltipArrow/useGraphTooltip/index.d.ts +2 -3
- package/dist/GraphTooltipArrow/useGraphTooltip/index.d.ts.map +1 -1
- package/dist/GraphTooltipArrow/useGraphTooltip/index.js +9 -30
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/ContextMenu.d.ts +2 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/ContextMenu.d.ts.map +1 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/ContextMenu.js +2 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/IcicleGraphNodes.d.ts.map +1 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/IcicleGraphNodes.js +6 -46
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/index.d.ts +1 -3
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/index.d.ts.map +1 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/index.js +2 -5
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/useNodeColor.d.ts +1 -3
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/useNodeColor.d.ts.map +1 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/useNodeColor.js +2 -5
- package/dist/ProfileIcicleGraph/index.d.ts.map +1 -1
- package/dist/ProfileIcicleGraph/index.js +2 -1
- package/package.json +6 -6
- package/src/GraphTooltipArrow/Content.tsx +3 -22
- package/src/GraphTooltipArrow/DockedGraphTooltip/index.tsx +6 -14
- package/src/GraphTooltipArrow/useGraphTooltip/index.ts +10 -42
- package/src/ProfileIcicleGraph/IcicleGraphArrow/ContextMenu.tsx +3 -0
- package/src/ProfileIcicleGraph/IcicleGraphArrow/IcicleGraphNodes.tsx +9 -54
- package/src/ProfileIcicleGraph/IcicleGraphArrow/index.tsx +5 -3
- package/src/ProfileIcicleGraph/IcicleGraphArrow/useNodeColor.ts +1 -9
- package/src/ProfileIcicleGraph/index.tsx +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [0.16.418](https://github.com/parca-dev/parca/compare/@parca/profile@0.16.417...@parca/profile@0.16.418) (2024-07-29)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @parca/profile
|
|
9
|
+
|
|
6
10
|
## 0.16.417 (2024-07-29)
|
|
7
11
|
|
|
8
12
|
**Note:** Version bump only for package @parca/profile
|
|
@@ -10,7 +10,8 @@ interface GraphTooltipArrowContentProps {
|
|
|
10
10
|
row: number | null;
|
|
11
11
|
level: number;
|
|
12
12
|
isFixed: boolean;
|
|
13
|
+
compareAbsolute: boolean;
|
|
13
14
|
}
|
|
14
|
-
declare const GraphTooltipArrowContent: ({ table, profileType, unit, total, totalUnfiltered, row, level, isFixed, }: GraphTooltipArrowContentProps) => React.JSX.Element;
|
|
15
|
+
declare const GraphTooltipArrowContent: ({ table, profileType, unit, total, totalUnfiltered, row, level, isFixed, compareAbsolute, }: GraphTooltipArrowContentProps) => React.JSX.Element;
|
|
15
16
|
export default GraphTooltipArrowContent;
|
|
16
17
|
//# sourceMappingURL=Content.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Content.d.ts","sourceRoot":"","sources":["../../src/GraphTooltipArrow/Content.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAQ1C,UAAU,6BAA6B;IACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Content.d.ts","sourceRoot":"","sources":["../../src/GraphTooltipArrow/Content.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAQ1C,UAAU,6BAA6B;IACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAMD,QAAA,MAAM,wBAAwB,gGAU3B,6BAA6B,KAAG,KAAK,CAAC,GAAG,CAAC,OAgF5C,CAAC;AA2EF,eAAe,wBAAwB,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { useGraphTooltipMetaInfo } from './useGraphTooltipMetaInfo';
|
|
|
8
8
|
const NoData = () => {
|
|
9
9
|
return _jsx("span", { className: "rounded bg-gray-200 px-2 dark:bg-gray-800", children: "Not available" });
|
|
10
10
|
};
|
|
11
|
-
const GraphTooltipArrowContent = ({ table, profileType, unit, total, totalUnfiltered, row, level, isFixed, }) => {
|
|
11
|
+
const GraphTooltipArrowContent = ({ table, profileType, unit, total, totalUnfiltered, row, level, isFixed, compareAbsolute, }) => {
|
|
12
12
|
const graphTooltipData = useGraphTooltip({
|
|
13
13
|
table,
|
|
14
14
|
profileType,
|
|
@@ -17,16 +17,17 @@ const GraphTooltipArrowContent = ({ table, profileType, unit, total, totalUnfilt
|
|
|
17
17
|
totalUnfiltered,
|
|
18
18
|
row,
|
|
19
19
|
level,
|
|
20
|
+
compareAbsolute,
|
|
20
21
|
});
|
|
21
22
|
if (graphTooltipData === null) {
|
|
22
23
|
return _jsx(_Fragment, {});
|
|
23
24
|
}
|
|
24
|
-
const { name, locationAddress, cumulativeText,
|
|
25
|
+
const { name, locationAddress, cumulativeText, flatText, diffText, diff, row: rowNumber, } = graphTooltipData;
|
|
25
26
|
return (_jsx("div", { className: `flex text-sm ${isFixed ? 'w-full' : ''}`, children: _jsx("div", { className: `m-auto w-full ${isFixed ? 'w-full' : ''}`, children: _jsxs("div", { className: "min-h-52 flex w-[500px] flex-col justify-between rounded-lg border border-gray-300 bg-gray-50 p-3 shadow-lg dark:border-gray-500 dark:bg-gray-900", children: [_jsx("div", { className: "flex flex-row", children: _jsxs("div", { className: "mx-2", children: [_jsx("div", { className: "flex h-10 items-start justify-between gap-4 break-all font-semibold", children: row === 0 ? (_jsx("p", { children: "root" })) : (_jsx("p", { children: name !== ''
|
|
26
27
|
? name
|
|
27
28
|
: locationAddress !== 0n
|
|
28
29
|
? hexifyAddress(locationAddress)
|
|
29
|
-
: 'unknown' })) }), _jsx("table", { className: "my-2 w-full table-fixed pr-0 text-gray-700 dark:text-gray-300", children: _jsxs("tbody", { children: [_jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Cumulative" }), _jsx("td", { className: "w-3/4", children: _jsx("div", { children: cumulativeText }) })] }),
|
|
30
|
+
: 'unknown' })) }), _jsx("table", { className: "my-2 w-full table-fixed pr-0 text-gray-700 dark:text-gray-300", children: _jsxs("tbody", { children: [_jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Cumulative" }), _jsx("td", { className: "w-3/4", children: _jsx("div", { children: cumulativeText }) })] }), _jsxs("tr", { children: [_jsx("td", { className: "w-1/4 pt-2", children: "Flat" }), _jsx("td", { className: "w-3/4 pt-2", children: _jsx("div", { children: flatText }) })] }), diff !== 0n && (_jsxs("tr", { children: [_jsx("td", { className: "w-1/4 pt-2", children: "Diff" }), _jsx("td", { className: "w-3/4 pt-2", children: _jsx("div", { children: diffText }) })] })), _jsx(TooltipMetaInfo, { table: table, row: rowNumber })] }) })] }) }), _jsxs("div", { className: "flex w-full items-center gap-1 text-xs text-gray-500", children: [_jsx(Icon, { icon: "iconoir:mouse-button-right" }), _jsx("div", { children: "Right click to show context menu" })] })] }) }) }));
|
|
30
31
|
};
|
|
31
32
|
const TooltipMetaInfo = ({ table, row }) => {
|
|
32
33
|
const { labelPairs, functionFilename, file, locationAddress, mappingFile, mappingBuildID, inlined, } = useGraphTooltipMetaInfo({ table, row });
|
|
@@ -8,7 +8,8 @@ interface Props {
|
|
|
8
8
|
level: number;
|
|
9
9
|
profileType?: ProfileType;
|
|
10
10
|
unit?: string;
|
|
11
|
+
compareAbsolute: boolean;
|
|
11
12
|
}
|
|
12
|
-
export declare const DockedGraphTooltip: ({ table, total, totalUnfiltered, row, level, profileType, unit, }: Props) => JSX.Element;
|
|
13
|
+
export declare const DockedGraphTooltip: ({ table, total, totalUnfiltered, row, level, profileType, unit, compareAbsolute, }: Props) => JSX.Element;
|
|
13
14
|
export {};
|
|
14
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/GraphTooltipArrow/DockedGraphTooltip/index.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAKnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAO1C,UAAU,KAAK;IACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/GraphTooltipArrow/DockedGraphTooltip/index.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAKnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAO1C,UAAU,KAAK;IACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAuBD,eAAO,MAAM,kBAAkB,uFAS5B,KAAK,KAAG,GAAG,CAAC,OAwGd,CAAC"}
|
|
@@ -25,7 +25,7 @@ const InfoSection = ({ title, value, minWidth = '', }) => {
|
|
|
25
25
|
const NoData = () => {
|
|
26
26
|
return _jsx("span", { className: "rounded bg-gray-200 px-2 dark:bg-gray-800", children: "Not available" });
|
|
27
27
|
};
|
|
28
|
-
export const DockedGraphTooltip = ({ table, total, totalUnfiltered, row, level, profileType, unit, }) => {
|
|
28
|
+
export const DockedGraphTooltip = ({ table, total, totalUnfiltered, row, level, profileType, unit, compareAbsolute, }) => {
|
|
29
29
|
let { width } = useWindowSize();
|
|
30
30
|
const { profileExplorer } = useParcaContext();
|
|
31
31
|
const { PaddingX } = profileExplorer ?? { PaddingX: 0 };
|
|
@@ -38,21 +38,20 @@ export const DockedGraphTooltip = ({ table, total, totalUnfiltered, row, level,
|
|
|
38
38
|
totalUnfiltered,
|
|
39
39
|
row,
|
|
40
40
|
level,
|
|
41
|
+
compareAbsolute,
|
|
41
42
|
});
|
|
42
43
|
const { labelPairs, functionFilename, file, locationAddress, mappingFile, mappingBuildID, inlined, } = useGraphTooltipMetaInfo({ table, row: row ?? 0 });
|
|
43
44
|
if (graphTooltipData === null) {
|
|
44
45
|
return _jsx(_Fragment, {});
|
|
45
46
|
}
|
|
46
|
-
const { name, cumulativeText,
|
|
47
|
+
const { name, cumulativeText, flatText, diffText, diff } = graphTooltipData;
|
|
47
48
|
const labels = labelPairs.map((l) => (_jsx("span", { className: "mr-3 inline-block rounded-lg bg-gray-200 px-2 py-1 text-xs font-bold text-gray-700 dark:bg-gray-700 dark:text-gray-400", children: `${l[0]}="${l[1]}"` }, l[0])));
|
|
48
49
|
const isMappingBuildIDAvailable = mappingBuildID !== null && mappingBuildID !== '';
|
|
49
50
|
const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no';
|
|
50
51
|
const addressText = locationAddress !== 0n ? hexifyAddress(locationAddress) : _jsx(NoData, {});
|
|
51
|
-
const cumulativeTextBoth = `${cumulativeText}\n${cumulativePerSecondText}`;
|
|
52
|
-
const flatTextBoth = `${flatText}\n${flatPerSecondText}`;
|
|
53
52
|
return (_jsxs("div", { className: "fixed bottom-0 z-20 overflow-hidden rounded-t-lg border-l border-r border-t border-gray-400 bg-white bg-opacity-90 px-8 py-3 dark:border-gray-600 dark:bg-black dark:bg-opacity-80", style: { width }, children: [_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("div", { className: "flex justify-between gap-4", children: row === 0 ? (_jsx("p", { children: "root" })) : (_jsx("p", { children: name !== ''
|
|
54
53
|
? name
|
|
55
54
|
: locationAddress !== 0n
|
|
56
55
|
? hexifyAddress(locationAddress)
|
|
57
|
-
: 'unknown' })) }), _jsxs("div", { className: "flex justify-between gap-3", children: [_jsx(InfoSection, { title: "Cumulative", value:
|
|
56
|
+
: 'unknown' })) }), _jsxs("div", { className: "flex justify-between gap-3", children: [_jsx(InfoSection, { title: "Cumulative", value: cumulativeText, minWidth: "w-44" }), _jsx(InfoSection, { title: "Flat", value: flatText, minWidth: "w-44" }), diff !== 0n ? _jsx(InfoSection, { title: "Diff", value: diffText, minWidth: "w-44" }) : null, _jsx(InfoSection, { title: "File", value: functionFilename !== '' ? truncateStringReverse(file, 45) : _jsx(NoData, {}), minWidth: 'w-[460px]' }), _jsx(InfoSection, { title: "Address", value: addressText, minWidth: "w-44" }), _jsx(InfoSection, { title: "Inlined", value: inlinedText, minWidth: "w-44" }), _jsx(InfoSection, { title: "Binary", value: (mappingFile != null ? getLastItem(mappingFile) : null) ?? _jsx(NoData, {}), minWidth: "w-44" }), _jsx(InfoSection, { title: "Build ID", value: isMappingBuildIDAvailable ? (_jsx("div", { children: truncateString(mappingBuildID, 28) })) : (_jsx(NoData, {})) })] }), _jsx("div", { children: _jsx("div", { className: "flex h-5 gap-1", children: labels }) })] }), _jsxs("div", { className: "flex w-full items-center gap-1 text-xs text-gray-500", children: [_jsx(Icon, { icon: "iconoir:mouse-button-right" }), _jsx("div", { children: "Right click to show context menu" })] })] }));
|
|
58
57
|
};
|
|
@@ -6,6 +6,7 @@ interface Props {
|
|
|
6
6
|
unit?: string;
|
|
7
7
|
total: bigint;
|
|
8
8
|
totalUnfiltered: bigint;
|
|
9
|
+
compareAbsolute: boolean;
|
|
9
10
|
row: number | null;
|
|
10
11
|
level: number;
|
|
11
12
|
}
|
|
@@ -13,13 +14,11 @@ interface GraphTooltipData {
|
|
|
13
14
|
name: string;
|
|
14
15
|
locationAddress: bigint;
|
|
15
16
|
cumulativeText: string;
|
|
16
|
-
cumulativePerSecondText: string;
|
|
17
17
|
flatText: string;
|
|
18
|
-
flatPerSecondText: string;
|
|
19
18
|
diffText: string;
|
|
20
19
|
diff: bigint;
|
|
21
20
|
row: number;
|
|
22
21
|
}
|
|
23
|
-
export declare const useGraphTooltip: ({ table, profileType, unit, total, totalUnfiltered, row, level, }: Props) => GraphTooltipData | null;
|
|
22
|
+
export declare const useGraphTooltip: ({ table, profileType, unit, compareAbsolute, total, totalUnfiltered, row, level, }: Props) => GraphTooltipData | null;
|
|
24
23
|
export {};
|
|
25
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/GraphTooltipArrow/useGraphTooltip/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/GraphTooltipArrow/useGraphTooltip/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAW1C,UAAU,KAAK;IACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,eAAe,uFASzB,KAAK,KAAG,gBAAgB,GAAG,IAyC7B,CAAC"}
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
import { divide, valueFormatter } from '@parca/utilities';
|
|
14
|
-
import { FIELD_CUMULATIVE,
|
|
15
|
-
import { getTextForCumulative,
|
|
16
|
-
export const useGraphTooltip = ({ table, profileType, unit, total, totalUnfiltered, row, level, }) => {
|
|
14
|
+
import { FIELD_CUMULATIVE, FIELD_DIFF, FIELD_FLAT, FIELD_LOCATION_ADDRESS, } from '../../ProfileIcicleGraph/IcicleGraphArrow';
|
|
15
|
+
import { getTextForCumulative, nodeLabel } from '../../ProfileIcicleGraph/IcicleGraphArrow/utils';
|
|
16
|
+
export const useGraphTooltip = ({ table, profileType, unit, compareAbsolute, total, totalUnfiltered, row, level, }) => {
|
|
17
17
|
if (row === null || profileType === undefined) {
|
|
18
18
|
return null;
|
|
19
19
|
}
|
|
@@ -22,46 +22,25 @@ export const useGraphTooltip = ({ table, profileType, unit, total, totalUnfilter
|
|
|
22
22
|
const cumulative = table.getChild(FIELD_CUMULATIVE)?.get(row) !== null
|
|
23
23
|
? BigInt(table.getChild(FIELD_CUMULATIVE)?.get(row))
|
|
24
24
|
: 0n;
|
|
25
|
-
const cumulativePerSecond = table.getChild(FIELD_CUMULATIVE_PER_SECOND)?.get(row) !== null
|
|
26
|
-
? table.getChild(FIELD_CUMULATIVE_PER_SECOND)?.get(row)
|
|
27
|
-
: 0;
|
|
28
25
|
const flat = table.getChild(FIELD_FLAT)?.get(row) !== null
|
|
29
26
|
? BigInt(table.getChild(FIELD_FLAT)?.get(row))
|
|
30
27
|
: 0n;
|
|
31
|
-
const flatPerSecond = table.getChild(FIELD_FLAT_PER_SECOND)?.get(row) !== null
|
|
32
|
-
? table.getChild(FIELD_FLAT_PER_SECOND)?.get(row)
|
|
33
|
-
: 0;
|
|
34
28
|
const diff = table.getChild(FIELD_DIFF)?.get(row) !== null
|
|
35
29
|
? BigInt(table.getChild(FIELD_DIFF)?.get(row))
|
|
36
30
|
: 0n;
|
|
37
|
-
const diffPerSecond = table.getChild(FIELD_DIFF_PER_SECOND)?.get(row) !== null
|
|
38
|
-
? table.getChild(FIELD_DIFF_PER_SECOND)?.get(row)
|
|
39
|
-
: 0;
|
|
40
31
|
let diffText = '';
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
diffText = `${diffValueText} (${diffPercentageText})`;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const prevValue = cumulative - diff;
|
|
51
|
-
const diffRatio = diff !== 0n ? divide(diff, prevValue) : 0;
|
|
52
|
-
const diffSign = diff > 0 ? '+' : '';
|
|
53
|
-
const diffValueText = diffSign + valueFormatter(diff, unit, 1);
|
|
54
|
-
const diffPercentageText = diffSign + (diffRatio * 100).toFixed(2) + '%';
|
|
55
|
-
diffText = `${diffValueText} (${diffPercentageText})`;
|
|
56
|
-
}
|
|
32
|
+
const prevValue = cumulative - diff;
|
|
33
|
+
const diffRatio = diff !== 0n ? divide(diff, prevValue) : 0;
|
|
34
|
+
const diffSign = diff > 0 ? '+' : '';
|
|
35
|
+
const diffValueText = diffSign + valueFormatter(diff, unit, 1);
|
|
36
|
+
const diffPercentageText = diffSign + (diffRatio * 100).toFixed(2) + '%';
|
|
37
|
+
diffText = compareAbsolute ? `${diffValueText} (${diffPercentageText})` : diffPercentageText;
|
|
57
38
|
const name = nodeLabel(table, row, level, false);
|
|
58
39
|
return {
|
|
59
40
|
name,
|
|
60
41
|
locationAddress,
|
|
61
42
|
cumulativeText: getTextForCumulative(cumulative, totalUnfiltered, total, unit ?? ''),
|
|
62
|
-
cumulativePerSecondText: getTextForCumulativePerSecond(cumulativePerSecond, unit ?? 'CPU Cores'),
|
|
63
43
|
flatText: getTextForCumulative(flat, totalUnfiltered, total, unit ?? ''),
|
|
64
|
-
flatPerSecondText: getTextForCumulativePerSecond(flatPerSecond, unit ?? 'CPU Cores'),
|
|
65
44
|
diffText,
|
|
66
45
|
diff,
|
|
67
46
|
row,
|
|
@@ -9,12 +9,13 @@ interface ContextMenuProps {
|
|
|
9
9
|
totalUnfiltered: bigint;
|
|
10
10
|
row: number;
|
|
11
11
|
level: number;
|
|
12
|
+
compareAbsolute: boolean;
|
|
12
13
|
trackVisibility: (isVisible: boolean) => void;
|
|
13
14
|
curPath: string[];
|
|
14
15
|
setCurPath: (path: string[]) => void;
|
|
15
16
|
hideMenu: () => void;
|
|
16
17
|
hideBinary: (binaryToRemove: string) => void;
|
|
17
18
|
}
|
|
18
|
-
declare const ContextMenu: ({ menuId, table, total, totalUnfiltered, row, level, trackVisibility, curPath, setCurPath, hideMenu, profileType, unit, hideBinary, }: ContextMenuProps) => JSX.Element;
|
|
19
|
+
declare const ContextMenu: ({ menuId, table, total, totalUnfiltered, row, level, compareAbsolute, trackVisibility, curPath, setCurPath, hideMenu, profileType, unit, hideBinary, }: ContextMenuProps) => JSX.Element;
|
|
19
20
|
export default ContextMenu;
|
|
20
21
|
//# sourceMappingURL=ContextMenu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/ContextMenu.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAMnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAO1C,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,QAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/ContextMenu.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAMnC,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAO1C,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,QAAA,MAAM,WAAW,2JAed,gBAAgB,KAAG,GAAG,CAAC,OA6JzB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -20,7 +20,7 @@ import { getLastItem } from '@parca/utilities';
|
|
|
20
20
|
import { useGraphTooltip } from '../../GraphTooltipArrow/useGraphTooltip';
|
|
21
21
|
import { useGraphTooltipMetaInfo } from '../../GraphTooltipArrow/useGraphTooltipMetaInfo';
|
|
22
22
|
import { hexifyAddress, truncateString } from '../../utils';
|
|
23
|
-
const ContextMenu = ({ menuId, table, total, totalUnfiltered, row, level, trackVisibility, curPath, setCurPath, hideMenu, profileType, unit, hideBinary, }) => {
|
|
23
|
+
const ContextMenu = ({ menuId, table, total, totalUnfiltered, row, level, compareAbsolute, trackVisibility, curPath, setCurPath, hideMenu, profileType, unit, hideBinary, }) => {
|
|
24
24
|
const { isDarkMode } = useParcaContext();
|
|
25
25
|
const { enableSourcesView } = useParcaContext();
|
|
26
26
|
const [isGraphTooltipDocked, setIsDocked] = useUserPreference(USER_PREFERENCES.GRAPH_METAINFO_DOCKED.key);
|
|
@@ -32,6 +32,7 @@ const ContextMenu = ({ menuId, table, total, totalUnfiltered, row, level, trackV
|
|
|
32
32
|
totalUnfiltered,
|
|
33
33
|
row,
|
|
34
34
|
level,
|
|
35
|
+
compareAbsolute,
|
|
35
36
|
});
|
|
36
37
|
const { functionFilename, functionSystemName, file, openFile, isSourceAvailable, locationAddress, mappingFile, mappingBuildID, inlined, } = useGraphTooltipMetaInfo({ table, row });
|
|
37
38
|
if (contextMenuData === null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IcicleGraphNodes.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/IcicleGraphNodes.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAMnC,OAAO,yCAAyC,CAAC;AAEjD,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"IcicleGraphNodes.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/IcicleGraphNodes.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AAMnC,OAAO,yCAAyC,CAAC;AAEjD,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAY1C,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,UAAU,qBAAqB;IAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gCAAgC,EAAE,OAAO,CAAC;CAC3C;AAED,eAAO,MAAM,gBAAgB,mDA+E3B,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,UAAU,eAAe;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gCAAgC,EAAE,OAAO,CAAC;CAC3C;AAYD,eAAO,MAAM,UAAU,6CAgPrB,CAAC"}
|
|
@@ -16,7 +16,7 @@ import cx from 'classnames';
|
|
|
16
16
|
import { selectBinaries, useAppSelector } from '@parca/store';
|
|
17
17
|
import { isSearchMatch, scaleLinear } from '@parca/utilities';
|
|
18
18
|
import 'react-contexify/dist/ReactContexify.css';
|
|
19
|
-
import { FIELD_CHILDREN, FIELD_CUMULATIVE,
|
|
19
|
+
import { FIELD_CHILDREN, FIELD_CUMULATIVE, FIELD_DIFF, FIELD_FUNCTION_NAME, FIELD_MAPPING_FILE, } from './index';
|
|
20
20
|
import useNodeColor from './useNodeColor';
|
|
21
21
|
import { arrowToString, nodeLabel } from './utils';
|
|
22
22
|
export const RowHeight = 26;
|
|
@@ -53,16 +53,12 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({ table, row, map
|
|
|
53
53
|
const mappingColumn = table.getChild(FIELD_MAPPING_FILE);
|
|
54
54
|
const functionNameColumn = table.getChild(FIELD_FUNCTION_NAME);
|
|
55
55
|
const cumulativeColumn = table.getChild(FIELD_CUMULATIVE);
|
|
56
|
-
const cumulativePerSecondColumn = table.getChild(FIELD_CUMULATIVE_PER_SECOND);
|
|
57
56
|
const diffColumn = table.getChild(FIELD_DIFF);
|
|
58
|
-
const diffPerSecondColumn = table.getChild(FIELD_DIFF_PER_SECOND);
|
|
59
57
|
// get the actual values from the columns
|
|
60
58
|
const mappingFile = arrowToString(mappingColumn?.get(row));
|
|
61
59
|
const functionName = arrowToString(functionNameColumn?.get(row));
|
|
62
60
|
const cumulative = cumulativeColumn?.get(row) !== null ? BigInt(cumulativeColumn?.get(row)) : 0n;
|
|
63
|
-
const cumulativePerSecond = cumulativePerSecondColumn?.get(row) != null ? cumulativePerSecondColumn.get(row) : 0;
|
|
64
61
|
const diff = diffColumn?.get(row) !== null ? BigInt(diffColumn?.get(row)) : null;
|
|
65
|
-
const diffPerSecond = diffPerSecondColumn?.get(row) != null ? diffPerSecondColumn.get(row) : null;
|
|
66
62
|
const childRows = Array.from(table.getChild(FIELD_CHILDREN)?.get(row) ?? []);
|
|
67
63
|
const highlightedNodes = useMemo(() => {
|
|
68
64
|
if (!highlightSimilarStacksPreference) {
|
|
@@ -97,14 +93,6 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({ table, row, map
|
|
|
97
93
|
});
|
|
98
94
|
break;
|
|
99
95
|
case FIELD_CUMULATIVE:
|
|
100
|
-
if (profileType?.delta ?? false) {
|
|
101
|
-
childRows.sort((a, b) => {
|
|
102
|
-
const aCumulativePerSecond = cumulativePerSecondColumn?.get(a);
|
|
103
|
-
const bCumulativePerSecond = cumulativePerSecondColumn?.get(b);
|
|
104
|
-
return bCumulativePerSecond - aCumulativePerSecond;
|
|
105
|
-
});
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
96
|
childRows.sort((a, b) => {
|
|
109
97
|
const aCumulative = cumulativeColumn?.get(a);
|
|
110
98
|
const bCumulative = cumulativeColumn?.get(b);
|
|
@@ -113,44 +101,18 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({ table, row, map
|
|
|
113
101
|
break;
|
|
114
102
|
case FIELD_DIFF:
|
|
115
103
|
childRows.sort((a, b) => {
|
|
116
|
-
if (profileType?.delta ?? false) {
|
|
117
|
-
let aRatio = null;
|
|
118
|
-
let bRatio = null;
|
|
119
|
-
const aDiff = diffPerSecondColumn?.get(a);
|
|
120
|
-
if (aDiff !== null) {
|
|
121
|
-
const cumulative = cumulativePerSecondColumn?.get(a);
|
|
122
|
-
const prev = cumulative - aDiff;
|
|
123
|
-
aRatio = aDiff / prev;
|
|
124
|
-
}
|
|
125
|
-
const bDiff = diffPerSecondColumn?.get(b);
|
|
126
|
-
if (bDiff !== null) {
|
|
127
|
-
const cumulative = cumulativePerSecondColumn?.get(b);
|
|
128
|
-
const prev = cumulative - bDiff;
|
|
129
|
-
bRatio = bDiff / prev;
|
|
130
|
-
}
|
|
131
|
-
if (aRatio !== null && bRatio !== null) {
|
|
132
|
-
return bRatio - aRatio;
|
|
133
|
-
}
|
|
134
|
-
if (aRatio === null && bRatio !== null) {
|
|
135
|
-
return -1;
|
|
136
|
-
}
|
|
137
|
-
if (aRatio !== null && bRatio === null) {
|
|
138
|
-
return 1;
|
|
139
|
-
}
|
|
140
|
-
// both are null
|
|
141
|
-
return 0;
|
|
142
|
-
}
|
|
143
104
|
let aRatio = null;
|
|
144
|
-
const aDiff = diffColumn?.get(a);
|
|
105
|
+
const aDiff = diffColumn?.get(a) !== null ? BigInt(diffColumn?.get(a)) : null;
|
|
145
106
|
if (aDiff !== null) {
|
|
146
|
-
const cumulative = cumulativeColumn?.get(a)
|
|
107
|
+
const cumulative = cumulativeColumn?.get(a) !== null ? BigInt(cumulativeColumn?.get(a)) : 0n;
|
|
108
|
+
console.log(typeof cumulative, typeof aDiff);
|
|
147
109
|
const prev = cumulative - aDiff;
|
|
148
110
|
aRatio = Number(aDiff) / Number(prev);
|
|
149
111
|
}
|
|
150
112
|
let bRatio = null;
|
|
151
|
-
const bDiff = diffColumn?.get(b);
|
|
113
|
+
const bDiff = diffColumn?.get(b) !== null ? BigInt(diffColumn?.get(b)) : null;
|
|
152
114
|
if (bDiff !== null) {
|
|
153
|
-
const cumulative = cumulativeColumn?.get(b)
|
|
115
|
+
const cumulative = cumulativeColumn?.get(b) !== null ? BigInt(cumulativeColumn?.get(b)) : 0n;
|
|
154
116
|
const prev = cumulative - bDiff;
|
|
155
117
|
bRatio = Number(bDiff) / Number(prev);
|
|
156
118
|
}
|
|
@@ -173,9 +135,7 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({ table, row, map
|
|
|
173
135
|
isDarkMode: darkMode,
|
|
174
136
|
compareMode,
|
|
175
137
|
cumulative,
|
|
176
|
-
cumulativePerSecond,
|
|
177
138
|
diff,
|
|
178
|
-
diffPerSecond,
|
|
179
139
|
mappingColors,
|
|
180
140
|
mappingFile,
|
|
181
141
|
});
|
|
@@ -16,11 +16,8 @@ export declare const FIELD_FUNCTION_START_LINE = "function_startline";
|
|
|
16
16
|
export declare const FIELD_CHILDREN = "children";
|
|
17
17
|
export declare const FIELD_LABELS = "labels";
|
|
18
18
|
export declare const FIELD_CUMULATIVE = "cumulative";
|
|
19
|
-
export declare const FIELD_CUMULATIVE_PER_SECOND = "cumulative_per_second";
|
|
20
19
|
export declare const FIELD_FLAT = "flat";
|
|
21
|
-
export declare const FIELD_FLAT_PER_SECOND = "flat_per_second";
|
|
22
20
|
export declare const FIELD_DIFF = "diff";
|
|
23
|
-
export declare const FIELD_DIFF_PER_SECOND = "diff_per_second";
|
|
24
21
|
interface IcicleGraphArrowProps {
|
|
25
22
|
arrow: FlamegraphArrow;
|
|
26
23
|
total: bigint;
|
|
@@ -33,6 +30,7 @@ interface IcicleGraphArrowProps {
|
|
|
33
30
|
flamegraphLoading: boolean;
|
|
34
31
|
isHalfScreen: boolean;
|
|
35
32
|
mappingsListFromMetadata: string[];
|
|
33
|
+
compareAbsolute: boolean;
|
|
36
34
|
}
|
|
37
35
|
export declare const getMappingColors: (mappingsList: string[], isDarkMode: boolean, currentColorProfile: ColorConfig) => mappingColors;
|
|
38
36
|
export declare const IcicleGraphArrow: React.NamedExoticComponent<IcicleGraphArrowProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAgE,MAAM,OAAO,CAAC;AAKrF,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAQ1C,OAAO,EAA2B,KAAK,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAO5E,OAAO,EAAwB,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAGxE,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AACjE,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAC7D,eAAO,MAAM,yBAAyB,uBAAuB,CAAC;AAC9D,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAC7C,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAgE,MAAM,OAAO,CAAC;AAKrF,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAQ1C,OAAO,EAA2B,KAAK,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAO5E,OAAO,EAAwB,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAGxE,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AACjE,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAC7D,eAAO,MAAM,yBAAyB,uBAAuB,CAAC;AAC9D,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAC7C,eAAO,MAAM,UAAU,SAAS,CAAC;AACjC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,UAAU,qBAAqB;IAC7B,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,iBACb,MAAM,EAAE,cACV,OAAO,uBACE,WAAW,KAC/B,aAQF,CAAC;AAIF,eAAO,MAAM,gBAAgB,mDAgQ3B,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -38,11 +38,8 @@ export const FIELD_FUNCTION_START_LINE = 'function_startline';
|
|
|
38
38
|
export const FIELD_CHILDREN = 'children';
|
|
39
39
|
export const FIELD_LABELS = 'labels';
|
|
40
40
|
export const FIELD_CUMULATIVE = 'cumulative';
|
|
41
|
-
export const FIELD_CUMULATIVE_PER_SECOND = 'cumulative_per_second';
|
|
42
41
|
export const FIELD_FLAT = 'flat';
|
|
43
|
-
export const FIELD_FLAT_PER_SECOND = 'flat_per_second';
|
|
44
42
|
export const FIELD_DIFF = 'diff';
|
|
45
|
-
export const FIELD_DIFF_PER_SECOND = 'diff_per_second';
|
|
46
43
|
export const getMappingColors = (mappingsList, isDarkMode, currentColorProfile) => {
|
|
47
44
|
const mappingFeatures = mappingsList.map(mapping => extractFeature(mapping));
|
|
48
45
|
const colors = {};
|
|
@@ -52,7 +49,7 @@ export const getMappingColors = (mappingsList, isDarkMode, currentColorProfile)
|
|
|
52
49
|
return colors;
|
|
53
50
|
};
|
|
54
51
|
const noop = () => { };
|
|
55
|
-
export const IcicleGraphArrow = memo(function IcicleGraphArrow({ arrow, total, filtered, width, setCurPath, curPath, profileType, sortBy, flamegraphLoading, mappingsListFromMetadata, }) {
|
|
52
|
+
export const IcicleGraphArrow = memo(function IcicleGraphArrow({ arrow, total, filtered, width, setCurPath, curPath, profileType, sortBy, flamegraphLoading, mappingsListFromMetadata, compareAbsolute, }) {
|
|
56
53
|
const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);
|
|
57
54
|
const dispatch = useAppDispatch();
|
|
58
55
|
const [highlightSimilarStacksPreference] = useUserPreference(USER_PREFERENCES.HIGHLIGHT_SIMILAR_STACKS.key);
|
|
@@ -177,6 +174,6 @@ export const IcicleGraphArrow = memo(function IcicleGraphArrow({ arrow, total, f
|
|
|
177
174
|
highlightSimilarStacksSetLevel,
|
|
178
175
|
highlightSimilarStacksSetName,
|
|
179
176
|
]);
|
|
180
|
-
return (_jsx(_Fragment, { children: _jsxs("div", { onMouseLeave: () => dispatch(setHoveringNode(undefined)), children: [_jsx(ContextMenu, { menuId: MENU_ID, table: table, row: hoveringRow ?? 0, level: hoveringLevel ?? 0, total: total, totalUnfiltered: total + filtered, profileType: profileType, trackVisibility: trackVisibility, curPath: curPath, setCurPath: setCurPath, hideMenu: hideAll, hideBinary: hideBinary, unit: arrow.unit }), dockedMetainfo ? (_jsx(DockedGraphTooltip, { table: table, row: hoveringRow, level: hoveringLevel ?? 0, total: total, totalUnfiltered: total + filtered, profileType: profileType, unit: arrow.unit })) : (!isContextMenuOpen && (_jsx(GraphTooltipArrow, { contextElement: svg.current, isContextMenuOpen: isContextMenuOpen, children: _jsx(GraphTooltipArrowContent, { table: table, row: hoveringRow, level: hoveringLevel ?? 0, isFixed: false, total: total, totalUnfiltered: total + filtered, profileType: profileType, unit: arrow.unit }) }))), root] }) }));
|
|
177
|
+
return (_jsx(_Fragment, { children: _jsxs("div", { onMouseLeave: () => dispatch(setHoveringNode(undefined)), children: [_jsx(ContextMenu, { menuId: MENU_ID, table: table, row: hoveringRow ?? 0, level: hoveringLevel ?? 0, total: total, totalUnfiltered: total + filtered, profileType: profileType, compareAbsolute: compareAbsolute, trackVisibility: trackVisibility, curPath: curPath, setCurPath: setCurPath, hideMenu: hideAll, hideBinary: hideBinary, unit: arrow.unit }), dockedMetainfo ? (_jsx(DockedGraphTooltip, { table: table, row: hoveringRow, level: hoveringLevel ?? 0, total: total, totalUnfiltered: total + filtered, profileType: profileType, unit: arrow.unit, compareAbsolute: compareAbsolute })) : (!isContextMenuOpen && (_jsx(GraphTooltipArrow, { contextElement: svg.current, isContextMenuOpen: isContextMenuOpen, children: _jsx(GraphTooltipArrowContent, { table: table, row: hoveringRow, level: hoveringLevel ?? 0, isFixed: false, total: total, totalUnfiltered: total + filtered, profileType: profileType, unit: arrow.unit, compareAbsolute: compareAbsolute }) }))), root] }) }));
|
|
181
178
|
});
|
|
182
179
|
export default IcicleGraphArrow;
|
|
@@ -5,12 +5,10 @@ interface Props {
|
|
|
5
5
|
isDarkMode: boolean;
|
|
6
6
|
compareMode: boolean;
|
|
7
7
|
cumulative: bigint;
|
|
8
|
-
cumulativePerSecond: number | null;
|
|
9
8
|
diff: bigint | null;
|
|
10
|
-
diffPerSecond: number | null;
|
|
11
9
|
mappingColors: mappingColors;
|
|
12
10
|
mappingFile: string | null;
|
|
13
11
|
}
|
|
14
|
-
declare const useNodeColor: ({ isDarkMode, compareMode, cumulative,
|
|
12
|
+
declare const useNodeColor: ({ isDarkMode, compareMode, cumulative, diff, mappingColors, mappingFile, }: Props) => string;
|
|
15
13
|
export default useNodeColor;
|
|
16
14
|
//# sourceMappingURL=useNodeColor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNodeColor.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/useNodeColor.ts"],"names":[],"mappings":"AAgBA,UAAU,aAAa;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,UAAU,KAAK;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"useNodeColor.d.ts","sourceRoot":"","sources":["../../../src/ProfileIcicleGraph/IcicleGraphArrow/useNodeColor.ts"],"names":[],"mappings":"AAgBA,UAAU,aAAa;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,UAAU,KAAK;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,QAAA,MAAM,YAAY,+EAOf,KAAK,KAAG,MAMV,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -11,12 +11,9 @@
|
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
import { EVERYTHING_ELSE } from '@parca/store';
|
|
14
|
-
import { diffColor,
|
|
15
|
-
const useNodeColor = ({ isDarkMode, compareMode, cumulative,
|
|
14
|
+
import { diffColor, getLastItem } from '@parca/utilities';
|
|
15
|
+
const useNodeColor = ({ isDarkMode, compareMode, cumulative, diff, mappingColors, mappingFile, }) => {
|
|
16
16
|
if (compareMode) {
|
|
17
|
-
if (cumulativePerSecond !== null && diffPerSecond !== null) {
|
|
18
|
-
return diffColorPerSecond(diffPerSecond, cumulativePerSecond, isDarkMode);
|
|
19
|
-
}
|
|
20
17
|
return diffColor(diff ?? 0n, cumulative, isDarkMode);
|
|
21
18
|
}
|
|
22
19
|
return mappingColors[getLastItem(mappingFile ?? '') ?? EVERYTHING_ELSE];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ProfileIcicleGraph/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAC,UAAU,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAS1D,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAc1C,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpE,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACvB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAyHD,QAAA,MAAM,kBAAkB,6IAcrB,uBAAuB,KAAG,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ProfileIcicleGraph/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAC,UAAU,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAS1D,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAc1C,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpE,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACvB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAyHD,QAAA,MAAM,kBAAkB,6IAcrB,uBAAuB,KAAG,GAAG,CAAC,OAkPhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -130,7 +130,7 @@ const ProfileIcicleGraph = function ProfileIcicleGraphNonMemo({ graph, arrow, to
|
|
|
130
130
|
if (graph !== undefined)
|
|
131
131
|
return (_jsx(IcicleGraph, { width: width, graph: graph, total: total, filtered: filtered, curPath: curPath, setCurPath: setNewCurPath, profileType: profileType }));
|
|
132
132
|
if (arrow !== undefined)
|
|
133
|
-
return (_jsx(IcicleGraphArrow, { width: width, arrow: arrow, total: total, filtered: filtered, curPath: curPath, setCurPath: setNewCurPath, profileType: profileType, sortBy: storeSortBy, flamegraphLoading: isLoading, isHalfScreen: isHalfScreen, mappingsListFromMetadata: mappingsList }));
|
|
133
|
+
return (_jsx(IcicleGraphArrow, { width: width, arrow: arrow, total: total, filtered: filtered, curPath: curPath, setCurPath: setNewCurPath, profileType: profileType, sortBy: storeSortBy, flamegraphLoading: isLoading, isHalfScreen: isHalfScreen, mappingsListFromMetadata: mappingsList, compareAbsolute: isCompareAbsolute }));
|
|
134
134
|
}, [
|
|
135
135
|
isLoading,
|
|
136
136
|
graph,
|
|
@@ -146,6 +146,7 @@ const ProfileIcicleGraph = function ProfileIcicleGraphNonMemo({ graph, arrow, to
|
|
|
146
146
|
isHalfScreen,
|
|
147
147
|
isDarkMode,
|
|
148
148
|
mappingsList,
|
|
149
|
+
isCompareAbsolute,
|
|
149
150
|
]);
|
|
150
151
|
if (error != null) {
|
|
151
152
|
onError?.(error);
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parca/profile",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.418",
|
|
4
4
|
"description": "Profile viewing libraries",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@headlessui/react": "^1.7.19",
|
|
7
7
|
"@iconify/react": "^4.0.0",
|
|
8
8
|
"@parca/client": "0.16.123",
|
|
9
|
-
"@parca/components": "0.16.
|
|
9
|
+
"@parca/components": "0.16.295",
|
|
10
10
|
"@parca/dynamicsize": "0.16.65",
|
|
11
|
-
"@parca/hooks": "0.0.
|
|
11
|
+
"@parca/hooks": "0.0.69",
|
|
12
12
|
"@parca/icons": "0.16.70",
|
|
13
13
|
"@parca/parser": "0.16.77",
|
|
14
|
-
"@parca/store": "0.16.
|
|
15
|
-
"@parca/utilities": "0.0.
|
|
14
|
+
"@parca/store": "0.16.158",
|
|
15
|
+
"@parca/utilities": "0.0.85",
|
|
16
16
|
"@popperjs/core": "^2.11.8",
|
|
17
17
|
"@protobuf-ts/runtime-rpc": "^2.5.0",
|
|
18
18
|
"@tanstack/react-query": "^4.0.5",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"access": "public",
|
|
74
74
|
"registry": "https://registry.npmjs.org/"
|
|
75
75
|
},
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "cdd20a679a256fa717088741fb9065eaec99c2d3"
|
|
77
77
|
}
|
|
@@ -33,6 +33,7 @@ interface GraphTooltipArrowContentProps {
|
|
|
33
33
|
row: number | null;
|
|
34
34
|
level: number;
|
|
35
35
|
isFixed: boolean;
|
|
36
|
+
compareAbsolute: boolean;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
const NoData = (): React.JSX.Element => {
|
|
@@ -48,6 +49,7 @@ const GraphTooltipArrowContent = ({
|
|
|
48
49
|
row,
|
|
49
50
|
level,
|
|
50
51
|
isFixed,
|
|
52
|
+
compareAbsolute,
|
|
51
53
|
}: GraphTooltipArrowContentProps): React.JSX.Element => {
|
|
52
54
|
const graphTooltipData = useGraphTooltip({
|
|
53
55
|
table,
|
|
@@ -57,6 +59,7 @@ const GraphTooltipArrowContent = ({
|
|
|
57
59
|
totalUnfiltered,
|
|
58
60
|
row,
|
|
59
61
|
level,
|
|
62
|
+
compareAbsolute,
|
|
60
63
|
});
|
|
61
64
|
|
|
62
65
|
if (graphTooltipData === null) {
|
|
@@ -67,9 +70,7 @@ const GraphTooltipArrowContent = ({
|
|
|
67
70
|
name,
|
|
68
71
|
locationAddress,
|
|
69
72
|
cumulativeText,
|
|
70
|
-
cumulativePerSecondText,
|
|
71
73
|
flatText,
|
|
72
|
-
flatPerSecondText,
|
|
73
74
|
diffText,
|
|
74
75
|
diff,
|
|
75
76
|
row: rowNumber,
|
|
@@ -102,32 +103,12 @@ const GraphTooltipArrowContent = ({
|
|
|
102
103
|
<div>{cumulativeText}</div>
|
|
103
104
|
</td>
|
|
104
105
|
</tr>
|
|
105
|
-
{profileType?.delta ?? false ? (
|
|
106
|
-
<tr>
|
|
107
|
-
<td className="w-1/4"></td>
|
|
108
|
-
<td className="w-3/4">
|
|
109
|
-
<div>{cumulativePerSecondText}</div>
|
|
110
|
-
</td>
|
|
111
|
-
</tr>
|
|
112
|
-
) : (
|
|
113
|
-
<></>
|
|
114
|
-
)}
|
|
115
106
|
<tr>
|
|
116
107
|
<td className="w-1/4 pt-2">Flat</td>
|
|
117
108
|
<td className="w-3/4 pt-2">
|
|
118
109
|
<div>{flatText}</div>
|
|
119
110
|
</td>
|
|
120
111
|
</tr>
|
|
121
|
-
{profileType?.delta ?? false ? (
|
|
122
|
-
<tr>
|
|
123
|
-
<td className="w-1/4"></td>
|
|
124
|
-
<td className="w-3/4">
|
|
125
|
-
<div>{flatPerSecondText}</div>
|
|
126
|
-
</td>
|
|
127
|
-
</tr>
|
|
128
|
-
) : (
|
|
129
|
-
<></>
|
|
130
|
-
)}
|
|
131
112
|
{diff !== 0n && (
|
|
132
113
|
<tr>
|
|
133
114
|
<td className="w-1/4 pt-2">Diff</td>
|
|
@@ -32,6 +32,7 @@ interface Props {
|
|
|
32
32
|
level: number;
|
|
33
33
|
profileType?: ProfileType;
|
|
34
34
|
unit?: string;
|
|
35
|
+
compareAbsolute: boolean;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
const InfoSection = ({
|
|
@@ -63,6 +64,7 @@ export const DockedGraphTooltip = ({
|
|
|
63
64
|
level,
|
|
64
65
|
profileType,
|
|
65
66
|
unit,
|
|
67
|
+
compareAbsolute,
|
|
66
68
|
}: Props): JSX.Element => {
|
|
67
69
|
let {width} = useWindowSize();
|
|
68
70
|
const {profileExplorer} = useParcaContext();
|
|
@@ -77,6 +79,7 @@ export const DockedGraphTooltip = ({
|
|
|
77
79
|
totalUnfiltered,
|
|
78
80
|
row,
|
|
79
81
|
level,
|
|
82
|
+
compareAbsolute,
|
|
80
83
|
});
|
|
81
84
|
|
|
82
85
|
const {
|
|
@@ -93,15 +96,7 @@ export const DockedGraphTooltip = ({
|
|
|
93
96
|
return <></>;
|
|
94
97
|
}
|
|
95
98
|
|
|
96
|
-
const {
|
|
97
|
-
name,
|
|
98
|
-
cumulativeText,
|
|
99
|
-
cumulativePerSecondText,
|
|
100
|
-
flatText,
|
|
101
|
-
flatPerSecondText,
|
|
102
|
-
diffText,
|
|
103
|
-
diff,
|
|
104
|
-
} = graphTooltipData;
|
|
99
|
+
const {name, cumulativeText, flatText, diffText, diff} = graphTooltipData;
|
|
105
100
|
|
|
106
101
|
const labels = labelPairs.map(
|
|
107
102
|
(l): React.JSX.Element => (
|
|
@@ -118,9 +113,6 @@ export const DockedGraphTooltip = ({
|
|
|
118
113
|
const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no';
|
|
119
114
|
const addressText = locationAddress !== 0n ? hexifyAddress(locationAddress) : <NoData />;
|
|
120
115
|
|
|
121
|
-
const cumulativeTextBoth = `${cumulativeText}\n${cumulativePerSecondText}`;
|
|
122
|
-
const flatTextBoth = `${flatText}\n${flatPerSecondText}`;
|
|
123
|
-
|
|
124
116
|
return (
|
|
125
117
|
<div
|
|
126
118
|
className="fixed bottom-0 z-20 overflow-hidden rounded-t-lg border-l border-r border-t border-gray-400 bg-white bg-opacity-90 px-8 py-3 dark:border-gray-600 dark:bg-black dark:bg-opacity-80"
|
|
@@ -141,8 +133,8 @@ export const DockedGraphTooltip = ({
|
|
|
141
133
|
)}
|
|
142
134
|
</div>
|
|
143
135
|
<div className="flex justify-between gap-3">
|
|
144
|
-
<InfoSection title="Cumulative" value={
|
|
145
|
-
<InfoSection title="Flat" value={
|
|
136
|
+
<InfoSection title="Cumulative" value={cumulativeText} minWidth="w-44" />
|
|
137
|
+
<InfoSection title="Flat" value={flatText} minWidth="w-44" />
|
|
146
138
|
{diff !== 0n ? <InfoSection title="Diff" value={diffText} minWidth="w-44" /> : null}
|
|
147
139
|
<InfoSection
|
|
148
140
|
title="File"
|
|
@@ -18,18 +18,11 @@ import {divide, valueFormatter} from '@parca/utilities';
|
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
20
|
FIELD_CUMULATIVE,
|
|
21
|
-
FIELD_CUMULATIVE_PER_SECOND,
|
|
22
21
|
FIELD_DIFF,
|
|
23
|
-
FIELD_DIFF_PER_SECOND,
|
|
24
22
|
FIELD_FLAT,
|
|
25
|
-
FIELD_FLAT_PER_SECOND,
|
|
26
23
|
FIELD_LOCATION_ADDRESS,
|
|
27
24
|
} from '../../ProfileIcicleGraph/IcicleGraphArrow';
|
|
28
|
-
import {
|
|
29
|
-
getTextForCumulative,
|
|
30
|
-
getTextForCumulativePerSecond,
|
|
31
|
-
nodeLabel,
|
|
32
|
-
} from '../../ProfileIcicleGraph/IcicleGraphArrow/utils';
|
|
25
|
+
import {getTextForCumulative, nodeLabel} from '../../ProfileIcicleGraph/IcicleGraphArrow/utils';
|
|
33
26
|
|
|
34
27
|
interface Props {
|
|
35
28
|
table: Table<any>;
|
|
@@ -37,6 +30,7 @@ interface Props {
|
|
|
37
30
|
unit?: string;
|
|
38
31
|
total: bigint;
|
|
39
32
|
totalUnfiltered: bigint;
|
|
33
|
+
compareAbsolute: boolean;
|
|
40
34
|
row: number | null;
|
|
41
35
|
level: number;
|
|
42
36
|
}
|
|
@@ -45,9 +39,7 @@ interface GraphTooltipData {
|
|
|
45
39
|
name: string;
|
|
46
40
|
locationAddress: bigint;
|
|
47
41
|
cumulativeText: string;
|
|
48
|
-
cumulativePerSecondText: string;
|
|
49
42
|
flatText: string;
|
|
50
|
-
flatPerSecondText: string;
|
|
51
43
|
diffText: string;
|
|
52
44
|
diff: bigint;
|
|
53
45
|
row: number;
|
|
@@ -57,6 +49,7 @@ export const useGraphTooltip = ({
|
|
|
57
49
|
table,
|
|
58
50
|
profileType,
|
|
59
51
|
unit,
|
|
52
|
+
compareAbsolute,
|
|
60
53
|
total,
|
|
61
54
|
totalUnfiltered,
|
|
62
55
|
row,
|
|
@@ -73,43 +66,23 @@ export const useGraphTooltip = ({
|
|
|
73
66
|
table.getChild(FIELD_CUMULATIVE)?.get(row) !== null
|
|
74
67
|
? BigInt(table.getChild(FIELD_CUMULATIVE)?.get(row))
|
|
75
68
|
: 0n;
|
|
76
|
-
const cumulativePerSecond: number =
|
|
77
|
-
table.getChild(FIELD_CUMULATIVE_PER_SECOND)?.get(row) !== null
|
|
78
|
-
? table.getChild(FIELD_CUMULATIVE_PER_SECOND)?.get(row)
|
|
79
|
-
: 0;
|
|
80
69
|
const flat: bigint =
|
|
81
70
|
table.getChild(FIELD_FLAT)?.get(row) !== null
|
|
82
71
|
? BigInt(table.getChild(FIELD_FLAT)?.get(row))
|
|
83
72
|
: 0n;
|
|
84
|
-
const flatPerSecond: number =
|
|
85
|
-
table.getChild(FIELD_FLAT_PER_SECOND)?.get(row) !== null
|
|
86
|
-
? table.getChild(FIELD_FLAT_PER_SECOND)?.get(row)
|
|
87
|
-
: 0;
|
|
88
73
|
const diff: bigint =
|
|
89
74
|
table.getChild(FIELD_DIFF)?.get(row) !== null
|
|
90
75
|
? BigInt(table.getChild(FIELD_DIFF)?.get(row))
|
|
91
76
|
: 0n;
|
|
92
|
-
const diffPerSecond: number =
|
|
93
|
-
table.getChild(FIELD_DIFF_PER_SECOND)?.get(row) !== null
|
|
94
|
-
? table.getChild(FIELD_DIFF_PER_SECOND)?.get(row)
|
|
95
|
-
: 0;
|
|
96
77
|
|
|
97
78
|
let diffText = '';
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
} else {
|
|
106
|
-
const prevValue = cumulative - diff;
|
|
107
|
-
const diffRatio = diff !== 0n ? divide(diff, prevValue) : 0;
|
|
108
|
-
const diffSign = diff > 0 ? '+' : '';
|
|
109
|
-
const diffValueText = diffSign + valueFormatter(diff, unit, 1);
|
|
110
|
-
const diffPercentageText = diffSign + (diffRatio * 100).toFixed(2) + '%';
|
|
111
|
-
diffText = `${diffValueText} (${diffPercentageText})`;
|
|
112
|
-
}
|
|
79
|
+
const prevValue = cumulative - diff;
|
|
80
|
+
const diffRatio = diff !== 0n ? divide(diff, prevValue) : 0;
|
|
81
|
+
const diffSign = diff > 0 ? '+' : '';
|
|
82
|
+
const diffValueText = diffSign + valueFormatter(diff, unit, 1);
|
|
83
|
+
const diffPercentageText = diffSign + (diffRatio * 100).toFixed(2) + '%';
|
|
84
|
+
|
|
85
|
+
diffText = compareAbsolute ? `${diffValueText} (${diffPercentageText})` : diffPercentageText;
|
|
113
86
|
|
|
114
87
|
const name = nodeLabel(table, row, level, false);
|
|
115
88
|
|
|
@@ -117,12 +90,7 @@ export const useGraphTooltip = ({
|
|
|
117
90
|
name,
|
|
118
91
|
locationAddress,
|
|
119
92
|
cumulativeText: getTextForCumulative(cumulative, totalUnfiltered, total, unit ?? ''),
|
|
120
|
-
cumulativePerSecondText: getTextForCumulativePerSecond(
|
|
121
|
-
cumulativePerSecond,
|
|
122
|
-
unit ?? 'CPU Cores'
|
|
123
|
-
),
|
|
124
93
|
flatText: getTextForCumulative(flat, totalUnfiltered, total, unit ?? ''),
|
|
125
|
-
flatPerSecondText: getTextForCumulativePerSecond(flatPerSecond, unit ?? 'CPU Cores'),
|
|
126
94
|
diffText,
|
|
127
95
|
diff,
|
|
128
96
|
row,
|
|
@@ -34,6 +34,7 @@ interface ContextMenuProps {
|
|
|
34
34
|
totalUnfiltered: bigint;
|
|
35
35
|
row: number;
|
|
36
36
|
level: number;
|
|
37
|
+
compareAbsolute: boolean;
|
|
37
38
|
trackVisibility: (isVisible: boolean) => void;
|
|
38
39
|
curPath: string[];
|
|
39
40
|
setCurPath: (path: string[]) => void;
|
|
@@ -48,6 +49,7 @@ const ContextMenu = ({
|
|
|
48
49
|
totalUnfiltered,
|
|
49
50
|
row,
|
|
50
51
|
level,
|
|
52
|
+
compareAbsolute,
|
|
51
53
|
trackVisibility,
|
|
52
54
|
curPath,
|
|
53
55
|
setCurPath,
|
|
@@ -69,6 +71,7 @@ const ContextMenu = ({
|
|
|
69
71
|
totalUnfiltered,
|
|
70
72
|
row,
|
|
71
73
|
level,
|
|
74
|
+
compareAbsolute,
|
|
72
75
|
});
|
|
73
76
|
|
|
74
77
|
const {
|
|
@@ -26,9 +26,7 @@ import {ProfileType} from '@parca/parser';
|
|
|
26
26
|
import {
|
|
27
27
|
FIELD_CHILDREN,
|
|
28
28
|
FIELD_CUMULATIVE,
|
|
29
|
-
FIELD_CUMULATIVE_PER_SECOND,
|
|
30
29
|
FIELD_DIFF,
|
|
31
|
-
FIELD_DIFF_PER_SECOND,
|
|
32
30
|
FIELD_FUNCTION_NAME,
|
|
33
31
|
FIELD_MAPPING_FILE,
|
|
34
32
|
} from './index';
|
|
@@ -224,18 +222,12 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({
|
|
|
224
222
|
const mappingColumn = table.getChild(FIELD_MAPPING_FILE);
|
|
225
223
|
const functionNameColumn = table.getChild(FIELD_FUNCTION_NAME);
|
|
226
224
|
const cumulativeColumn = table.getChild(FIELD_CUMULATIVE);
|
|
227
|
-
const cumulativePerSecondColumn = table.getChild(FIELD_CUMULATIVE_PER_SECOND);
|
|
228
225
|
const diffColumn = table.getChild(FIELD_DIFF);
|
|
229
|
-
const diffPerSecondColumn = table.getChild(FIELD_DIFF_PER_SECOND);
|
|
230
226
|
// get the actual values from the columns
|
|
231
227
|
const mappingFile: string | null = arrowToString(mappingColumn?.get(row));
|
|
232
228
|
const functionName: string | null = arrowToString(functionNameColumn?.get(row));
|
|
233
229
|
const cumulative = cumulativeColumn?.get(row) !== null ? BigInt(cumulativeColumn?.get(row)) : 0n;
|
|
234
|
-
const cumulativePerSecond: number | null =
|
|
235
|
-
cumulativePerSecondColumn?.get(row) != null ? cumulativePerSecondColumn.get(row) : 0;
|
|
236
230
|
const diff: bigint | null = diffColumn?.get(row) !== null ? BigInt(diffColumn?.get(row)) : null;
|
|
237
|
-
const diffPerSecond: number | null =
|
|
238
|
-
diffPerSecondColumn?.get(row) != null ? diffPerSecondColumn.get(row) : null;
|
|
239
231
|
const childRows: number[] = Array.from(table.getChild(FIELD_CHILDREN)?.get(row) ?? []);
|
|
240
232
|
|
|
241
233
|
const highlightedNodes = useMemo(() => {
|
|
@@ -274,15 +266,6 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({
|
|
|
274
266
|
});
|
|
275
267
|
break;
|
|
276
268
|
case FIELD_CUMULATIVE:
|
|
277
|
-
if (profileType?.delta ?? false) {
|
|
278
|
-
childRows.sort((a, b) => {
|
|
279
|
-
const aCumulativePerSecond = cumulativePerSecondColumn?.get(a);
|
|
280
|
-
const bCumulativePerSecond = cumulativePerSecondColumn?.get(b);
|
|
281
|
-
return bCumulativePerSecond - aCumulativePerSecond;
|
|
282
|
-
});
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
269
|
childRows.sort((a, b) => {
|
|
287
270
|
const aCumulative: bigint = cumulativeColumn?.get(a);
|
|
288
271
|
const bCumulative: bigint = cumulativeColumn?.get(b);
|
|
@@ -291,48 +274,22 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({
|
|
|
291
274
|
break;
|
|
292
275
|
case FIELD_DIFF:
|
|
293
276
|
childRows.sort((a, b) => {
|
|
294
|
-
if (profileType?.delta ?? false) {
|
|
295
|
-
let aRatio: number | null = null;
|
|
296
|
-
let bRatio: number | null = null;
|
|
297
|
-
|
|
298
|
-
const aDiff: number | null = diffPerSecondColumn?.get(a);
|
|
299
|
-
if (aDiff !== null) {
|
|
300
|
-
const cumulative: number = cumulativePerSecondColumn?.get(a);
|
|
301
|
-
const prev = cumulative - aDiff;
|
|
302
|
-
aRatio = aDiff / prev;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const bDiff: number | null = diffPerSecondColumn?.get(b);
|
|
306
|
-
if (bDiff !== null) {
|
|
307
|
-
const cumulative: number = cumulativePerSecondColumn?.get(b);
|
|
308
|
-
const prev = cumulative - bDiff;
|
|
309
|
-
bRatio = bDiff / prev;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
if (aRatio !== null && bRatio !== null) {
|
|
313
|
-
return bRatio - aRatio;
|
|
314
|
-
}
|
|
315
|
-
if (aRatio === null && bRatio !== null) {
|
|
316
|
-
return -1;
|
|
317
|
-
}
|
|
318
|
-
if (aRatio !== null && bRatio === null) {
|
|
319
|
-
return 1;
|
|
320
|
-
}
|
|
321
|
-
// both are null
|
|
322
|
-
return 0;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
277
|
let aRatio: number | null = null;
|
|
326
|
-
const aDiff: bigint | null =
|
|
278
|
+
const aDiff: bigint | null =
|
|
279
|
+
diffColumn?.get(a) !== null ? BigInt(diffColumn?.get(a)) : null;
|
|
327
280
|
if (aDiff !== null) {
|
|
328
|
-
const cumulative: bigint =
|
|
281
|
+
const cumulative: bigint =
|
|
282
|
+
cumulativeColumn?.get(a) !== null ? BigInt(cumulativeColumn?.get(a)) : 0n;
|
|
283
|
+
console.log(typeof cumulative, typeof aDiff);
|
|
329
284
|
const prev: bigint = cumulative - aDiff;
|
|
330
285
|
aRatio = Number(aDiff) / Number(prev);
|
|
331
286
|
}
|
|
332
287
|
let bRatio: number | null = null;
|
|
333
|
-
const bDiff: bigint | null =
|
|
288
|
+
const bDiff: bigint | null =
|
|
289
|
+
diffColumn?.get(b) !== null ? BigInt(diffColumn?.get(b)) : null;
|
|
334
290
|
if (bDiff !== null) {
|
|
335
|
-
const cumulative: bigint =
|
|
291
|
+
const cumulative: bigint =
|
|
292
|
+
cumulativeColumn?.get(b) !== null ? BigInt(cumulativeColumn?.get(b)) : 0n;
|
|
336
293
|
const prev: bigint = cumulative - bDiff;
|
|
337
294
|
bRatio = Number(bDiff) / Number(prev);
|
|
338
295
|
}
|
|
@@ -357,9 +314,7 @@ export const IcicleNode = React.memo(function IcicleNodeNoMemo({
|
|
|
357
314
|
isDarkMode: darkMode,
|
|
358
315
|
compareMode,
|
|
359
316
|
cumulative,
|
|
360
|
-
cumulativePerSecond,
|
|
361
317
|
diff,
|
|
362
|
-
diffPerSecond,
|
|
363
318
|
mappingColors,
|
|
364
319
|
mappingFile,
|
|
365
320
|
});
|
|
@@ -50,11 +50,8 @@ export const FIELD_FUNCTION_START_LINE = 'function_startline';
|
|
|
50
50
|
export const FIELD_CHILDREN = 'children';
|
|
51
51
|
export const FIELD_LABELS = 'labels';
|
|
52
52
|
export const FIELD_CUMULATIVE = 'cumulative';
|
|
53
|
-
export const FIELD_CUMULATIVE_PER_SECOND = 'cumulative_per_second';
|
|
54
53
|
export const FIELD_FLAT = 'flat';
|
|
55
|
-
export const FIELD_FLAT_PER_SECOND = 'flat_per_second';
|
|
56
54
|
export const FIELD_DIFF = 'diff';
|
|
57
|
-
export const FIELD_DIFF_PER_SECOND = 'diff_per_second';
|
|
58
55
|
|
|
59
56
|
interface IcicleGraphArrowProps {
|
|
60
57
|
arrow: FlamegraphArrow;
|
|
@@ -68,6 +65,7 @@ interface IcicleGraphArrowProps {
|
|
|
68
65
|
flamegraphLoading: boolean;
|
|
69
66
|
isHalfScreen: boolean;
|
|
70
67
|
mappingsListFromMetadata: string[];
|
|
68
|
+
compareAbsolute: boolean;
|
|
71
69
|
}
|
|
72
70
|
|
|
73
71
|
export const getMappingColors = (
|
|
@@ -97,6 +95,7 @@ export const IcicleGraphArrow = memo(function IcicleGraphArrow({
|
|
|
97
95
|
sortBy,
|
|
98
96
|
flamegraphLoading,
|
|
99
97
|
mappingsListFromMetadata,
|
|
98
|
+
compareAbsolute,
|
|
100
99
|
}: IcicleGraphArrowProps): React.JSX.Element {
|
|
101
100
|
const [isContextMenuOpen, setIsContextMenuOpen] = useState<boolean>(false);
|
|
102
101
|
const dispatch = useAppDispatch();
|
|
@@ -301,6 +300,7 @@ export const IcicleGraphArrow = memo(function IcicleGraphArrow({
|
|
|
301
300
|
total={total}
|
|
302
301
|
totalUnfiltered={total + filtered}
|
|
303
302
|
profileType={profileType}
|
|
303
|
+
compareAbsolute={compareAbsolute}
|
|
304
304
|
trackVisibility={trackVisibility}
|
|
305
305
|
curPath={curPath}
|
|
306
306
|
setCurPath={setCurPath}
|
|
@@ -317,6 +317,7 @@ export const IcicleGraphArrow = memo(function IcicleGraphArrow({
|
|
|
317
317
|
totalUnfiltered={total + filtered}
|
|
318
318
|
profileType={profileType}
|
|
319
319
|
unit={arrow.unit}
|
|
320
|
+
compareAbsolute={compareAbsolute}
|
|
320
321
|
/>
|
|
321
322
|
) : (
|
|
322
323
|
!isContextMenuOpen && (
|
|
@@ -330,6 +331,7 @@ export const IcicleGraphArrow = memo(function IcicleGraphArrow({
|
|
|
330
331
|
totalUnfiltered={total + filtered}
|
|
331
332
|
profileType={profileType}
|
|
332
333
|
unit={arrow.unit}
|
|
334
|
+
compareAbsolute={compareAbsolute}
|
|
333
335
|
/>
|
|
334
336
|
</GraphTooltipArrow>
|
|
335
337
|
)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
|
|
14
14
|
import {EVERYTHING_ELSE} from '@parca/store';
|
|
15
|
-
import {diffColor,
|
|
15
|
+
import {diffColor, getLastItem} from '@parca/utilities';
|
|
16
16
|
|
|
17
17
|
interface mappingColors {
|
|
18
18
|
[key: string]: string;
|
|
@@ -22,9 +22,7 @@ interface Props {
|
|
|
22
22
|
isDarkMode: boolean;
|
|
23
23
|
compareMode: boolean;
|
|
24
24
|
cumulative: bigint;
|
|
25
|
-
cumulativePerSecond: number | null;
|
|
26
25
|
diff: bigint | null;
|
|
27
|
-
diffPerSecond: number | null;
|
|
28
26
|
mappingColors: mappingColors;
|
|
29
27
|
mappingFile: string | null;
|
|
30
28
|
}
|
|
@@ -33,17 +31,11 @@ const useNodeColor = ({
|
|
|
33
31
|
isDarkMode,
|
|
34
32
|
compareMode,
|
|
35
33
|
cumulative,
|
|
36
|
-
cumulativePerSecond,
|
|
37
34
|
diff,
|
|
38
|
-
diffPerSecond,
|
|
39
35
|
mappingColors,
|
|
40
36
|
mappingFile,
|
|
41
37
|
}: Props): string => {
|
|
42
38
|
if (compareMode) {
|
|
43
|
-
if (cumulativePerSecond !== null && diffPerSecond !== null) {
|
|
44
|
-
return diffColorPerSecond(diffPerSecond, cumulativePerSecond, isDarkMode);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
39
|
return diffColor(diff ?? 0n, cumulative, isDarkMode);
|
|
48
40
|
}
|
|
49
41
|
|
|
@@ -368,6 +368,7 @@ const ProfileIcicleGraph = function ProfileIcicleGraphNonMemo({
|
|
|
368
368
|
flamegraphLoading={isLoading}
|
|
369
369
|
isHalfScreen={isHalfScreen}
|
|
370
370
|
mappingsListFromMetadata={mappingsList}
|
|
371
|
+
compareAbsolute={isCompareAbsolute}
|
|
371
372
|
/>
|
|
372
373
|
);
|
|
373
374
|
}, [
|
|
@@ -385,6 +386,7 @@ const ProfileIcicleGraph = function ProfileIcicleGraphNonMemo({
|
|
|
385
386
|
isHalfScreen,
|
|
386
387
|
isDarkMode,
|
|
387
388
|
mappingsList,
|
|
389
|
+
isCompareAbsolute,
|
|
388
390
|
]);
|
|
389
391
|
|
|
390
392
|
if (error != null) {
|