@parca/profile 0.16.266 → 0.16.268
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 +8 -0
- package/dist/GraphTooltipArrow/Content.js +3 -2
- package/dist/GraphTooltipArrow/DockedGraphTooltip/index.js +3 -2
- package/dist/GraphTooltipArrow/useGraphTooltipMetaInfo/index.d.ts +1 -0
- package/dist/GraphTooltipArrow/useGraphTooltipMetaInfo/index.js +3 -1
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/index.d.ts +1 -0
- package/dist/ProfileIcicleGraph/IcicleGraphArrow/index.js +1 -0
- package/dist/ProfileIcicleGraph/index.js +19 -1
- package/package.json +5 -5
- package/src/GraphTooltipArrow/Content.tsx +10 -0
- package/src/GraphTooltipArrow/DockedGraphTooltip/index.tsx +9 -0
- package/src/GraphTooltipArrow/useGraphTooltipMetaInfo/index.ts +4 -0
- package/src/ProfileIcicleGraph/IcicleGraphArrow/index.tsx +1 -0
- package/src/ProfileIcicleGraph/index.tsx +21 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
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.268 (2023-10-01)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @parca/profile
|
|
9
|
+
|
|
10
|
+
## [0.16.267](https://github.com/parca-dev/parca/compare/@parca/profile@0.16.266...@parca/profile@0.16.267) (2023-09-24)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package @parca/profile
|
|
13
|
+
|
|
6
14
|
## 0.16.266 (2023-09-23)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @parca/profile
|
|
@@ -54,10 +54,11 @@ const TooltipMetaInfo = ({ table,
|
|
|
54
54
|
// total,
|
|
55
55
|
// totalUnfiltered,
|
|
56
56
|
onCopy, row, navigateTo, }) => {
|
|
57
|
-
const { labelPairs, functionFilename, file, openFile, isSourceAvailable, locationAddress, mappingFile, mappingBuildID, } = useGraphTooltipMetaInfo({ table, row, navigateTo });
|
|
57
|
+
const { labelPairs, functionFilename, file, openFile, isSourceAvailable, locationAddress, mappingFile, mappingBuildID, inlined, } = useGraphTooltipMetaInfo({ table, row, navigateTo });
|
|
58
58
|
const { enableSourcesView } = useParcaContext();
|
|
59
59
|
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])));
|
|
60
60
|
const isMappingBuildIDAvailable = mappingBuildID !== null && mappingBuildID !== '';
|
|
61
|
-
|
|
61
|
+
const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no';
|
|
62
|
+
return (_jsxs(_Fragment, { children: [_jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "File" }), _jsx("td", { className: "w-3/4 break-all", children: functionFilename === '' ? (_jsx(NoData, {})) : (_jsxs("div", { className: "flex gap-4", children: [_jsx(CopyToClipboard, { onCopy: onCopy, text: file, children: _jsx("button", { className: "cursor-pointer whitespace-nowrap text-left", children: _jsx(ExpandOnHover, { value: file, displayValue: truncateStringReverse(file, 30) }) }) }), _jsxs("div", { className: cx('flex gap-2', { hidden: enableSourcesView === false }), children: [_jsx("div", { "data-tooltip-id": "open-source-button-help", "data-tooltip-content": "There is no source code uploaded for this build", children: _jsx(Button, { variant: 'neutral', onClick: () => openFile(), className: "shrink-0", disabled: !isSourceAvailable, children: "open" }) }), !isSourceAvailable ? _jsx(Tooltip, { id: "open-source-button-help" }) : null] })] })) })] }), _jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Address" }), _jsx("td", { className: "w-3/4 break-all", children: locationAddress === 0n ? (_jsx(NoData, {})) : (_jsx(CopyToClipboard, { onCopy: onCopy, text: hexifyAddress(locationAddress), children: _jsx("button", { className: "cursor-pointer", children: hexifyAddress(locationAddress) }) })) })] }), _jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Inlined" }), _jsx("td", { className: "w-3/4 break-all", children: _jsx(CopyToClipboard, { onCopy: onCopy, text: inlinedText, children: _jsx("button", { className: "cursor-pointer", children: inlinedText }) }) })] }), _jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Binary" }), _jsx("td", { className: "w-3/4 break-all", children: mappingFile === null ? (_jsx(NoData, {})) : (_jsx(CopyToClipboard, { onCopy: onCopy, text: mappingFile, children: _jsx("button", { className: "cursor-pointer", children: getLastItem(mappingFile) }) })) })] }), _jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Build Id" }), _jsx("td", { className: "w-3/4 break-all", children: !isMappingBuildIDAvailable ? (_jsx(NoData, {})) : (_jsx(CopyToClipboard, { onCopy: onCopy, text: mappingBuildID, children: _jsx("button", { className: "cursor-pointer", children: truncateString(getLastItem(mappingBuildID), 28) }) })) })] }), labelPairs.length > 0 && (_jsxs("tr", { children: [_jsx("td", { className: "w-1/4", children: "Labels" }), _jsx("td", { className: "w-3/4 break-all", children: labels })] }))] }));
|
|
62
63
|
};
|
|
63
64
|
export default GraphTooltipArrowContent;
|
|
@@ -48,16 +48,17 @@ export const DockedGraphTooltip = ({ table, unit, total, totalUnfiltered, row, l
|
|
|
48
48
|
row,
|
|
49
49
|
level,
|
|
50
50
|
});
|
|
51
|
-
const { labelPairs, functionFilename, file, openFile, isSourceAvailable, locationAddress, mappingFile, mappingBuildID, } = useGraphTooltipMetaInfo({ table, row: row ?? 0, navigateTo });
|
|
51
|
+
const { labelPairs, functionFilename, file, openFile, isSourceAvailable, locationAddress, mappingFile, mappingBuildID, inlined, } = useGraphTooltipMetaInfo({ table, row: row ?? 0, navigateTo });
|
|
52
52
|
const [_, setIsDocked] = useUserPreference(USER_PREFERENCES.GRAPH_METAINFO_DOCKED.key);
|
|
53
53
|
if (graphTooltipData === null) {
|
|
54
54
|
return _jsx(_Fragment, {});
|
|
55
55
|
}
|
|
56
56
|
const { name, cumulativeText, diffText, diff } = graphTooltipData;
|
|
57
57
|
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])));
|
|
58
|
+
const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no';
|
|
58
59
|
const addressText = locationAddress !== 0n ? hexifyAddress(locationAddress) : 'unknown';
|
|
59
60
|
const fileText = functionFilename !== '' ? file : 'Not available';
|
|
60
61
|
return (_jsx("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: [_jsxs("div", { className: "flex justify-between gap-4", children: [row === 0 ? (_jsx("p", { children: "root" })) : (_jsx(_Fragment, { children: name !== '' ? (_jsx(CopyToClipboard, { onCopy: onCopy, text: name, children: _jsx("button", { className: "cursor-pointer text-left", children: name }) })) : (_jsx(_Fragment, { children: locationAddress !== 0n ? (_jsx(CopyToClipboard, { onCopy: onCopy, text: hexifyAddress(locationAddress), children: _jsx("button", { className: "cursor-pointer text-left", children: hexifyAddress(locationAddress) }) })) : (_jsx("p", { children: "unknown" })) })) })), _jsx(IconButton, { onClick: () => setIsDocked(false), icon: "mdi:dock-window", title: "Undock MetaInfo Panel" })] }), _jsxs("div", { className: "flex justify-between gap-3", children: [_jsx(InfoSection, { title: "Cumulative", value: cumulativeText, onCopy: onCopy, copyText: cumulativeText, minWidth: "w-44" }), diff !== 0n ? (_jsx(InfoSection, { title: "Diff", value: diffText, onCopy: onCopy, copyText: diffText, minWidth: "w-44" })) : null, _jsx(InfoSection, { title: "File", value: _jsxs("div", { className: "flex gap-2", children: [_jsx(ExpandOnHover, { value: fileText, displayValue: truncateStringReverse(fileText, 45) }), _jsxs("div", { className: cx('flex items-center gap-2', {
|
|
61
62
|
hidden: enableSourcesView === false || functionFilename === '',
|
|
62
|
-
}), children: [_jsx("div", { "data-tooltip-id": "open-source-button-help", "data-tooltip-content": "There is no source code uploaded for this build", children: _jsx(Button, { variant: 'neutral', onClick: () => openFile(), className: "shrink-0", disabled: !isSourceAvailable, children: "open" }) }), !isSourceAvailable ? _jsx(Tooltip, { id: "open-source-button-help" }) : null] })] }), onCopy: onCopy, copyText: file, minWidth: 'w-[460px]' }), _jsx(InfoSection, { title: "Address", value: addressText, onCopy: onCopy, copyText: addressText, minWidth: "w-44" }), _jsx(InfoSection, { title: "Binary", value: (mappingFile != null ? getLastItem(mappingFile) : null) ?? 'Not available', onCopy: onCopy, copyText: mappingFile ?? 'Not available', minWidth: "w-44" }), _jsx(InfoSection, { title: "Build ID", value: truncateString(getLastItem(mappingBuildID) ?? 'Not available', 28), onCopy: onCopy, copyText: mappingBuildID ?? 'Not available' })] }), _jsx("div", { children: _jsx("div", { className: "flex h-5 gap-1", children: labels }) }), _jsx("span", { className: "mx-2 block text-xs text-gray-500", children: isCopied ? 'Copied!' : 'Hold shift and click on a value to copy.' })] }) }));
|
|
63
|
+
}), children: [_jsx("div", { "data-tooltip-id": "open-source-button-help", "data-tooltip-content": "There is no source code uploaded for this build", children: _jsx(Button, { variant: 'neutral', onClick: () => openFile(), className: "shrink-0", disabled: !isSourceAvailable, children: "open" }) }), !isSourceAvailable ? _jsx(Tooltip, { id: "open-source-button-help" }) : null] })] }), onCopy: onCopy, copyText: file, minWidth: 'w-[460px]' }), _jsx(InfoSection, { title: "Address", value: addressText, onCopy: onCopy, copyText: addressText, minWidth: "w-44" }), _jsx(InfoSection, { title: "Inlined", value: inlinedText, onCopy: onCopy, copyText: inlinedText, minWidth: "w-44" }), _jsx(InfoSection, { title: "Binary", value: (mappingFile != null ? getLastItem(mappingFile) : null) ?? 'Not available', onCopy: onCopy, copyText: mappingFile ?? 'Not available', minWidth: "w-44" }), _jsx(InfoSection, { title: "Build ID", value: truncateString(getLastItem(mappingBuildID) ?? 'Not available', 28), onCopy: onCopy, copyText: mappingBuildID ?? 'Not available' })] }), _jsx("div", { children: _jsx("div", { className: "flex h-5 gap-1", children: labels }) }), _jsx("span", { className: "mx-2 block text-xs text-gray-500", children: isCopied ? 'Copied!' : 'Hold shift and click on a value to copy.' })] }) }));
|
|
63
64
|
};
|
|
@@ -14,6 +14,7 @@ interface GraphTooltipMetaInfoData {
|
|
|
14
14
|
locationAddress: bigint;
|
|
15
15
|
mappingFile: string | null;
|
|
16
16
|
mappingBuildID: string | null;
|
|
17
|
+
inlined: boolean | null;
|
|
17
18
|
}
|
|
18
19
|
export declare const useGraphTooltipMetaInfo: ({ table, row, navigateTo, }: Props) => GraphTooltipMetaInfoData;
|
|
19
20
|
export {};
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
import { QueryRequest_ReportType } from '@parca/client';
|
|
14
14
|
import { useParcaContext, useURLState } from '@parca/components';
|
|
15
|
-
import { FIELD_FUNCTION_FILE_NAME, FIELD_FUNCTION_START_LINE, FIELD_LOCATION_ADDRESS, FIELD_LOCATION_LINE, FIELD_MAPPING_BUILD_ID, FIELD_MAPPING_FILE, } from '../../ProfileIcicleGraph/IcicleGraphArrow';
|
|
15
|
+
import { FIELD_FUNCTION_FILE_NAME, FIELD_FUNCTION_START_LINE, FIELD_INLINED, FIELD_LOCATION_ADDRESS, FIELD_LOCATION_LINE, FIELD_MAPPING_BUILD_ID, FIELD_MAPPING_FILE, } from '../../ProfileIcicleGraph/IcicleGraphArrow';
|
|
16
16
|
import { arrowToString } from '../../ProfileIcicleGraph/IcicleGraphArrow/utils';
|
|
17
17
|
import { useProfileViewContext } from '../../ProfileView/ProfileViewContext';
|
|
18
18
|
import { useQuery } from '../../useQuery';
|
|
@@ -20,6 +20,7 @@ export const useGraphTooltipMetaInfo = ({ table, row, navigateTo, }) => {
|
|
|
20
20
|
const mappingFile = arrowToString(table.getChild(FIELD_MAPPING_FILE)?.get(row));
|
|
21
21
|
const mappingBuildID = arrowToString(table.getChild(FIELD_MAPPING_BUILD_ID)?.get(row));
|
|
22
22
|
const locationAddress = table.getChild(FIELD_LOCATION_ADDRESS)?.get(row) ?? 0n;
|
|
23
|
+
const inlined = table.getChild(FIELD_INLINED)?.get(row);
|
|
23
24
|
const locationLine = table.getChild(FIELD_LOCATION_LINE)?.get(row) ?? 0n;
|
|
24
25
|
const functionFilename = arrowToString(table.getChild(FIELD_FUNCTION_FILE_NAME)?.get(row)) ?? '';
|
|
25
26
|
const functionStartLine = table.getChild(FIELD_FUNCTION_START_LINE)?.get(row) ?? 0n;
|
|
@@ -90,5 +91,6 @@ export const useGraphTooltipMetaInfo = ({ table, row, navigateTo, }) => {
|
|
|
90
91
|
locationAddress,
|
|
91
92
|
mappingBuildID,
|
|
92
93
|
mappingFile,
|
|
94
|
+
inlined,
|
|
93
95
|
};
|
|
94
96
|
};
|
|
@@ -6,6 +6,7 @@ export declare const FIELD_MAPPING_FILE = "mapping_file";
|
|
|
6
6
|
export declare const FIELD_MAPPING_BUILD_ID = "mapping_build_id";
|
|
7
7
|
export declare const FIELD_LOCATION_ADDRESS = "location_address";
|
|
8
8
|
export declare const FIELD_LOCATION_LINE = "location_line";
|
|
9
|
+
export declare const FIELD_INLINED = "inlined";
|
|
9
10
|
export declare const FIELD_FUNCTION_NAME = "function_name";
|
|
10
11
|
export declare const FIELD_FUNCTION_FILE_NAME = "function_file_name";
|
|
11
12
|
export declare const FIELD_FUNCTION_START_LINE = "function_startline";
|
|
@@ -27,6 +27,7 @@ export const FIELD_MAPPING_FILE = 'mapping_file';
|
|
|
27
27
|
export const FIELD_MAPPING_BUILD_ID = 'mapping_build_id';
|
|
28
28
|
export const FIELD_LOCATION_ADDRESS = 'location_address';
|
|
29
29
|
export const FIELD_LOCATION_LINE = 'location_line';
|
|
30
|
+
export const FIELD_INLINED = 'inlined';
|
|
30
31
|
export const FIELD_FUNCTION_NAME = 'function_name';
|
|
31
32
|
export const FIELD_FUNCTION_FILE_NAME = 'function_file_name';
|
|
32
33
|
export const FIELD_FUNCTION_START_LINE = 'function_startline';
|
|
@@ -19,7 +19,7 @@ import { USER_PREFERENCES, useUserPreference } from '@parca/hooks';
|
|
|
19
19
|
import { capitalizeOnlyFirstLetter, divide, selectQueryParam, } from '@parca/utilities';
|
|
20
20
|
import DiffLegend from '../components/DiffLegend';
|
|
21
21
|
import IcicleGraph from './IcicleGraph';
|
|
22
|
-
import IcicleGraphArrow, { FIELD_CUMULATIVE, FIELD_DIFF, FIELD_FUNCTION_NAME, FIELD_LABELS, } from './IcicleGraphArrow';
|
|
22
|
+
import IcicleGraphArrow, { FIELD_CUMULATIVE, FIELD_DIFF, FIELD_FUNCTION_FILE_NAME, FIELD_FUNCTION_NAME, FIELD_LABELS, FIELD_LOCATION_ADDRESS, FIELD_MAPPING_FILE, } from './IcicleGraphArrow';
|
|
23
23
|
const numberFormatter = new Intl.NumberFormat('en-US');
|
|
24
24
|
const ErrorContent = ({ errorMessage }) => {
|
|
25
25
|
return _jsx("div", { className: "flex justify-center p-10", children: errorMessage });
|
|
@@ -129,6 +129,24 @@ const groupByOptions = [
|
|
|
129
129
|
description: 'Stacktraces are grouped by pprof labels.',
|
|
130
130
|
disabled: false,
|
|
131
131
|
},
|
|
132
|
+
{
|
|
133
|
+
value: FIELD_FUNCTION_FILE_NAME,
|
|
134
|
+
label: 'Filename',
|
|
135
|
+
description: 'Stacktraces are grouped by filenames.',
|
|
136
|
+
disabled: false,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
value: FIELD_LOCATION_ADDRESS,
|
|
140
|
+
label: 'Address',
|
|
141
|
+
description: 'Stacktraces are grouped by addresses.',
|
|
142
|
+
disabled: false,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
value: FIELD_MAPPING_FILE,
|
|
146
|
+
label: 'Binary',
|
|
147
|
+
description: 'Stacktraces are grouped by binaries.',
|
|
148
|
+
disabled: false,
|
|
149
|
+
},
|
|
132
150
|
];
|
|
133
151
|
const GroupByDropdown = ({ groupBy, toggleGroupBy, }) => {
|
|
134
152
|
const label = groupBy.length === 0
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parca/profile",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.268",
|
|
4
4
|
"description": "Profile viewing libraries",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@parca/client": "^0.16.89",
|
|
7
|
-
"@parca/components": "^0.16.
|
|
7
|
+
"@parca/components": "^0.16.203",
|
|
8
8
|
"@parca/dynamicsize": "^0.16.55",
|
|
9
9
|
"@parca/hooks": "^0.0.26",
|
|
10
|
-
"@parca/parser": "^0.16.
|
|
10
|
+
"@parca/parser": "^0.16.58",
|
|
11
11
|
"@parca/store": "^0.16.106",
|
|
12
12
|
"@parca/utilities": "^0.0.34",
|
|
13
13
|
"@tanstack/react-query": "^4.0.5",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/d3": "7.4.0",
|
|
31
31
|
"@types/react-copy-to-clipboard": "5.0.4",
|
|
32
|
-
"@types/react-syntax-highlighter": "
|
|
32
|
+
"@types/react-syntax-highlighter": "15.5.7"
|
|
33
33
|
},
|
|
34
34
|
"resolutions": {
|
|
35
35
|
"konva": "8.4.3"
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"access": "public",
|
|
50
50
|
"registry": "https://registry.npmjs.org/"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "355b09e20fe97aeb7e545547182f70e2f8665854"
|
|
53
53
|
}
|
|
@@ -179,6 +179,7 @@ const TooltipMetaInfo = ({
|
|
|
179
179
|
locationAddress,
|
|
180
180
|
mappingFile,
|
|
181
181
|
mappingBuildID,
|
|
182
|
+
inlined,
|
|
182
183
|
} = useGraphTooltipMetaInfo({table, row, navigateTo});
|
|
183
184
|
const {enableSourcesView} = useParcaContext();
|
|
184
185
|
|
|
@@ -194,6 +195,7 @@ const TooltipMetaInfo = ({
|
|
|
194
195
|
);
|
|
195
196
|
|
|
196
197
|
const isMappingBuildIDAvailable = mappingBuildID !== null && mappingBuildID !== '';
|
|
198
|
+
const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no';
|
|
197
199
|
|
|
198
200
|
return (
|
|
199
201
|
<>
|
|
@@ -241,6 +243,14 @@ const TooltipMetaInfo = ({
|
|
|
241
243
|
)}
|
|
242
244
|
</td>
|
|
243
245
|
</tr>
|
|
246
|
+
<tr>
|
|
247
|
+
<td className="w-1/4">Inlined</td>
|
|
248
|
+
<td className="w-3/4 break-all">
|
|
249
|
+
<CopyToClipboard onCopy={onCopy} text={inlinedText}>
|
|
250
|
+
<button className="cursor-pointer">{inlinedText}</button>
|
|
251
|
+
</CopyToClipboard>
|
|
252
|
+
</td>
|
|
253
|
+
</tr>
|
|
244
254
|
<tr>
|
|
245
255
|
<td className="w-1/4">Binary</td>
|
|
246
256
|
<td className="w-3/4 break-all">
|
|
@@ -105,6 +105,7 @@ export const DockedGraphTooltip = ({
|
|
|
105
105
|
locationAddress,
|
|
106
106
|
mappingFile,
|
|
107
107
|
mappingBuildID,
|
|
108
|
+
inlined,
|
|
108
109
|
} = useGraphTooltipMetaInfo({table, row: row ?? 0, navigateTo});
|
|
109
110
|
|
|
110
111
|
const [_, setIsDocked] = useUserPreference(USER_PREFERENCES.GRAPH_METAINFO_DOCKED.key);
|
|
@@ -126,6 +127,7 @@ export const DockedGraphTooltip = ({
|
|
|
126
127
|
)
|
|
127
128
|
);
|
|
128
129
|
|
|
130
|
+
const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no';
|
|
129
131
|
const addressText = locationAddress !== 0n ? hexifyAddress(locationAddress) : 'unknown';
|
|
130
132
|
const fileText = functionFilename !== '' ? file : 'Not available';
|
|
131
133
|
|
|
@@ -223,6 +225,13 @@ export const DockedGraphTooltip = ({
|
|
|
223
225
|
copyText={addressText}
|
|
224
226
|
minWidth="w-44"
|
|
225
227
|
/>
|
|
228
|
+
<InfoSection
|
|
229
|
+
title="Inlined"
|
|
230
|
+
value={inlinedText}
|
|
231
|
+
onCopy={onCopy}
|
|
232
|
+
copyText={inlinedText}
|
|
233
|
+
minWidth="w-44"
|
|
234
|
+
/>
|
|
226
235
|
<InfoSection
|
|
227
236
|
title="Binary"
|
|
228
237
|
value={(mappingFile != null ? getLastItem(mappingFile) : null) ?? 'Not available'}
|
|
@@ -20,6 +20,7 @@ import type {NavigateFunction} from '@parca/utilities';
|
|
|
20
20
|
import {
|
|
21
21
|
FIELD_FUNCTION_FILE_NAME,
|
|
22
22
|
FIELD_FUNCTION_START_LINE,
|
|
23
|
+
FIELD_INLINED,
|
|
23
24
|
FIELD_LOCATION_ADDRESS,
|
|
24
25
|
FIELD_LOCATION_LINE,
|
|
25
26
|
FIELD_MAPPING_BUILD_ID,
|
|
@@ -45,6 +46,7 @@ interface GraphTooltipMetaInfoData {
|
|
|
45
46
|
locationAddress: bigint;
|
|
46
47
|
mappingFile: string | null;
|
|
47
48
|
mappingBuildID: string | null;
|
|
49
|
+
inlined: boolean | null;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
export const useGraphTooltipMetaInfo = ({
|
|
@@ -57,6 +59,7 @@ export const useGraphTooltipMetaInfo = ({
|
|
|
57
59
|
table.getChild(FIELD_MAPPING_BUILD_ID)?.get(row)
|
|
58
60
|
);
|
|
59
61
|
const locationAddress: bigint = table.getChild(FIELD_LOCATION_ADDRESS)?.get(row) ?? 0n;
|
|
62
|
+
const inlined: boolean | null = table.getChild(FIELD_INLINED)?.get(row);
|
|
60
63
|
const locationLine: bigint = table.getChild(FIELD_LOCATION_LINE)?.get(row) ?? 0n;
|
|
61
64
|
const functionFilename: string =
|
|
62
65
|
arrowToString(table.getChild(FIELD_FUNCTION_FILE_NAME)?.get(row)) ?? '';
|
|
@@ -149,5 +152,6 @@ export const useGraphTooltipMetaInfo = ({
|
|
|
149
152
|
locationAddress,
|
|
150
153
|
mappingBuildID,
|
|
151
154
|
mappingFile,
|
|
155
|
+
inlined,
|
|
152
156
|
};
|
|
153
157
|
};
|
|
@@ -44,6 +44,7 @@ export const FIELD_MAPPING_FILE = 'mapping_file';
|
|
|
44
44
|
export const FIELD_MAPPING_BUILD_ID = 'mapping_build_id';
|
|
45
45
|
export const FIELD_LOCATION_ADDRESS = 'location_address';
|
|
46
46
|
export const FIELD_LOCATION_LINE = 'location_line';
|
|
47
|
+
export const FIELD_INLINED = 'inlined';
|
|
47
48
|
export const FIELD_FUNCTION_NAME = 'function_name';
|
|
48
49
|
export const FIELD_FUNCTION_FILE_NAME = 'function_file_name';
|
|
49
50
|
export const FIELD_FUNCTION_START_LINE = 'function_startline';
|
|
@@ -31,8 +31,11 @@ import IcicleGraph from './IcicleGraph';
|
|
|
31
31
|
import IcicleGraphArrow, {
|
|
32
32
|
FIELD_CUMULATIVE,
|
|
33
33
|
FIELD_DIFF,
|
|
34
|
+
FIELD_FUNCTION_FILE_NAME,
|
|
34
35
|
FIELD_FUNCTION_NAME,
|
|
35
36
|
FIELD_LABELS,
|
|
37
|
+
FIELD_LOCATION_ADDRESS,
|
|
38
|
+
FIELD_MAPPING_FILE,
|
|
36
39
|
} from './IcicleGraphArrow';
|
|
37
40
|
|
|
38
41
|
const numberFormatter = new Intl.NumberFormat('en-US');
|
|
@@ -303,6 +306,24 @@ const groupByOptions = [
|
|
|
303
306
|
description: 'Stacktraces are grouped by pprof labels.',
|
|
304
307
|
disabled: false,
|
|
305
308
|
},
|
|
309
|
+
{
|
|
310
|
+
value: FIELD_FUNCTION_FILE_NAME,
|
|
311
|
+
label: 'Filename',
|
|
312
|
+
description: 'Stacktraces are grouped by filenames.',
|
|
313
|
+
disabled: false,
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
value: FIELD_LOCATION_ADDRESS,
|
|
317
|
+
label: 'Address',
|
|
318
|
+
description: 'Stacktraces are grouped by addresses.',
|
|
319
|
+
disabled: false,
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
value: FIELD_MAPPING_FILE,
|
|
323
|
+
label: 'Binary',
|
|
324
|
+
description: 'Stacktraces are grouped by binaries.',
|
|
325
|
+
disabled: false,
|
|
326
|
+
},
|
|
306
327
|
];
|
|
307
328
|
|
|
308
329
|
const GroupByDropdown = ({
|