// Copyright 2022 The Parca Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import {Icon} from '@iconify/react'; import {Table} from '@uwdata/flechette'; import cx from 'classnames'; import {useWindowSize} from 'react-use'; import {useParcaContext} from '@parca/components'; import {ProfileType} from '@parca/parser'; import {getLastItem} from '@parca/utilities'; import {hexifyAddress, truncateString, truncateStringReverse} from '../../utils'; import {useGraphTooltip} from '../useGraphTooltip'; import {useGraphTooltipMetaInfo} from '../useGraphTooltipMetaInfo'; interface Props { table: Table; total: bigint; totalUnfiltered: bigint; row: number | null; profileType?: ProfileType; unit?: string; compareAbsolute: boolean; } const InfoSection = ({ title, value, minWidth = '', }: { title: string; value: string | JSX.Element; minWidth?: string; }): JSX.Element => { return (

{title}

{value}
); }; const NoData = (): React.JSX.Element => { return Not available; }; export const DockedGraphTooltip = ({ table, total, totalUnfiltered, row, profileType, unit, compareAbsolute, }: Props): JSX.Element => { let {width} = useWindowSize(); const {profileExplorer} = useParcaContext(); const {PaddingX} = profileExplorer ?? {PaddingX: 0}; width = width - PaddingX - 24; const graphTooltipData = useGraphTooltip({ table, profileType, unit, total, totalUnfiltered, row, compareAbsolute, }); const { labelPairs, functionFilename, file, locationAddress, mappingFile, mappingBuildID, inlined, } = useGraphTooltipMetaInfo({table, row: row ?? 0}); if (graphTooltipData === null) { return <>; } const {name, cumulativeText, flatText, diffText, diff} = graphTooltipData; const labels = labelPairs.map( (l): React.JSX.Element => ( {`${l[0]}="${l[1]}"`} ) ); const isMappingBuildIDAvailable = mappingBuildID !== null && mappingBuildID !== ''; const inlinedText = inlined === null ? 'merged' : inlined ? 'yes' : 'no'; const addressText = locationAddress !== 0n ? hexifyAddress(locationAddress) : ; return (
{row === 0 ? (

root

) : (

{name !== '' ? name : locationAddress !== 0n ? hexifyAddress(locationAddress) : 'unknown'}

)}
{diff !== 0n ? : null} } minWidth={'w-[460px]'} /> } minWidth="w-44" /> {truncateString(mappingBuildID, 28)}
) : ( ) } />
{labels}
Right click to show context menu
); };