UNPKG

@grafana/flamegraph

Version:

Grafana flamegraph visualization component

1 lines • 18.1 kB
{"version":3,"file":"FlameGraphPane.mjs","sources":["../../src/FlameGraphPane.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { escapeStringForRegex } from '@grafana/data';\n\nimport FlameGraphCallTreeContainer from './CallTree/FlameGraphCallTreeContainer';\nimport FlameGraph from './FlameGraph/FlameGraph';\nimport { type GetExtraContextMenuButtonsFunction } from './FlameGraph/FlameGraphContextMenu';\nimport { type FlameGraphDataContainer } from './FlameGraph/dataTransform';\nimport FlameGraphTopTableContainer from './TopTable/FlameGraphTopTableContainer';\nimport { FLAMEGRAPH_CONTAINER_HEIGHT } from './constants';\nimport { useColorScheme } from './hooks';\nimport { type ClickedItemData, PaneView, type ViewMode, type TextAlign } from './types';\n\nexport type FlameGraphPaneProps = {\n paneView: PaneView;\n dataContainer: FlameGraphDataContainer;\n search: string;\n matchedLabels: Set<string> | undefined;\n onTableSymbolClick?: (symbol: string) => void;\n onTextAlignSelected?: (align: string) => void;\n onTableSort?: (sort: string) => void;\n showFlameGraphOnly?: boolean;\n disableCollapsing?: boolean;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n viewMode: ViewMode;\n paneViewForContextMenu: PaneView;\n setSearch: (search: string) => void;\n resetKey?: number;\n keepFocusOnDataChange?: boolean;\n focusedItemIndexes?: number[];\n setFocusedItemIndexes?: (itemIndexes: number[] | undefined) => void;\n sharedSandwichItem?: string;\n setSharedSandwichItem?: (item: string | undefined) => void;\n};\n\nconst FlameGraphPane = ({\n paneView,\n dataContainer,\n search,\n matchedLabels,\n onTableSymbolClick,\n onTextAlignSelected,\n onTableSort,\n showFlameGraphOnly,\n disableCollapsing,\n getExtraContextMenuButtons,\n viewMode,\n paneViewForContextMenu,\n setSearch,\n resetKey,\n keepFocusOnDataChange,\n focusedItemIndexes,\n setFocusedItemIndexes,\n sharedSandwichItem,\n setSharedSandwichItem,\n}: FlameGraphPaneProps) => {\n const [focusedItemData, setFocusedItemData] = useState<ClickedItemData>();\n const [rangeMin, setRangeMin] = useState(0);\n const [rangeMax, setRangeMax] = useState(1);\n const [textAlign, setTextAlign] = useState<TextAlign>('left');\n const [localSandwichItem, setLocalSandwichItem] = useState<string>();\n\n const isUsingSharedSandwich = setSharedSandwichItem !== undefined;\n const sandwichItem = isUsingSharedSandwich ? sharedSandwichItem : localSandwichItem;\n const setSandwichItem = useCallback(\n (item: string | undefined) => {\n if (isUsingSharedSandwich && setSharedSandwichItem) {\n setSharedSandwichItem(item);\n } else {\n setLocalSandwichItem(item);\n }\n },\n [isUsingSharedSandwich, setSharedSandwichItem]\n );\n const [collapsedMap, setCollapsedMap] = useState(() => dataContainer.getCollapsedMap());\n const [colorScheme, setColorScheme] = useColorScheme(dataContainer);\n\n const styles = getStyles();\n\n useLayoutEffect(() => {\n setCollapsedMap(dataContainer.getCollapsedMap());\n }, [dataContainer]);\n\n useEffect(() => {\n if (resetKey !== undefined && resetKey > 0) {\n setFocusedItemData(undefined);\n setRangeMin(0);\n setRangeMax(1);\n setLocalSandwichItem(undefined);\n }\n }, [resetKey]);\n\n useEffect(() => {\n if (!keepFocusOnDataChange) {\n setFocusedItemData(undefined);\n setRangeMin(0);\n setRangeMax(1);\n setSandwichItem(undefined);\n return;\n }\n\n if (dataContainer && focusedItemData) {\n const item = dataContainer.getNodesWithLabel(focusedItemData.label)?.[0];\n\n if (item) {\n setFocusedItemData({ ...focusedItemData, item });\n\n const levels = dataContainer.getLevels();\n const totalViewTicks = levels.length ? levels[0][0].value : 0;\n setRangeMin(item.start / totalViewTicks);\n setRangeMax((item.start + item.value) / totalViewTicks);\n } else {\n setFocusedItemData({\n ...focusedItemData,\n item: {\n start: 0,\n value: 0,\n itemIndexes: [],\n children: [],\n level: 0,\n },\n });\n\n setRangeMin(0);\n setRangeMax(1);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dataContainer, keepFocusOnDataChange]);\n\n const weSetFocusRef = useRef(false);\n\n useEffect(() => {\n if (!focusedItemIndexes || focusedItemIndexes.length === 0) {\n return;\n }\n\n if (weSetFocusRef.current) {\n weSetFocusRef.current = false;\n return;\n }\n\n const currentIndexes = focusedItemData?.item.itemIndexes;\n if (currentIndexes && currentIndexes.length === focusedItemIndexes.length) {\n const matches = currentIndexes.every((val, idx) => val === focusedItemIndexes[idx]);\n if (matches) {\n return;\n }\n }\n\n const levels = dataContainer.getLevels();\n for (const level of levels) {\n for (const item of level) {\n if (\n item.itemIndexes.length === focusedItemIndexes.length &&\n item.itemIndexes.every((val, idx) => val === focusedItemIndexes[idx])\n ) {\n const label = dataContainer.getLabel(item.itemIndexes[0]);\n const totalViewTicks = levels[0][0].value;\n\n setFocusedItemData({ label, item, posX: 0, posY: 0 });\n setRangeMin(item.start / totalViewTicks);\n setRangeMax((item.start + item.value) / totalViewTicks);\n return;\n }\n }\n }\n }, [focusedItemIndexes, dataContainer, focusedItemData]);\n\n const resetFocus = useCallback(() => {\n setFocusedItemData(undefined);\n setRangeMin(0);\n setRangeMax(1);\n setFocusedItemIndexes?.(undefined);\n }, [setFocusedItemIndexes]);\n\n const resetSandwich = useCallback(() => {\n setSandwichItem(undefined);\n }, [setSandwichItem]);\n\n const onSymbolClick = useCallback(\n (symbol: string) => {\n const anchored = `^${escapeStringForRegex(symbol)}$`;\n if (search === anchored) {\n setSearch('');\n } else {\n onTableSymbolClick?.(symbol);\n setSearch(anchored);\n resetFocus();\n }\n },\n [search, setSearch, resetFocus, onTableSymbolClick]\n );\n\n const onCallTreeSymbolClick = useCallback(\n (symbol: string) => {\n onTableSymbolClick?.(symbol);\n },\n [onTableSymbolClick]\n );\n\n const onCallTreeSearch = useCallback(\n (symbol: string) => {\n const anchored = `^${escapeStringForRegex(symbol)}$`;\n if (search === anchored) {\n setSearch('');\n } else {\n onTableSymbolClick?.(symbol);\n setSearch(anchored);\n resetFocus();\n }\n },\n [search, setSearch, resetFocus, onTableSymbolClick]\n );\n\n const onTopTableSearch = useCallback(\n (str: string) => {\n if (!str) {\n setSearch('');\n return;\n }\n setSearch(`^${escapeStringForRegex(str)}$`);\n },\n [setSearch]\n );\n\n let content;\n switch (paneView) {\n case PaneView.TopTable:\n content = (\n <div className={styles.tableContainer}>\n <FlameGraphTopTableContainer\n data={dataContainer}\n onSymbolClick={onSymbolClick}\n search={search}\n matchedLabels={matchedLabels}\n sandwichItem={sandwichItem}\n onSandwich={setSandwichItem}\n onSearch={onTopTableSearch}\n onTableSort={onTableSort}\n colorScheme={colorScheme}\n />\n </div>\n );\n break;\n case PaneView.FlameGraph:\n default:\n content = (\n <FlameGraph\n data={dataContainer}\n rangeMin={rangeMin}\n rangeMax={rangeMax}\n matchedLabels={matchedLabels}\n setRangeMin={setRangeMin}\n setRangeMax={setRangeMax}\n onItemFocused={(data) => {\n setFocusedItemData(data);\n weSetFocusRef.current = true;\n setFocusedItemIndexes?.(data.item.itemIndexes);\n }}\n focusedItemData={focusedItemData}\n textAlign={textAlign}\n onTextAlignChange={(align) => {\n setTextAlign(align);\n onTextAlignSelected?.(align);\n }}\n sandwichItem={sandwichItem}\n onSandwich={(label: string) => {\n resetFocus();\n setSandwichItem(label);\n }}\n onFocusPillClick={resetFocus}\n onSandwichPillClick={resetSandwich}\n colorScheme={colorScheme}\n onColorSchemeChange={setColorScheme}\n isDiffMode={dataContainer.isDiffFlamegraph()}\n showFlameGraphOnly={showFlameGraphOnly}\n collapsing={!disableCollapsing}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n enableNewUI={true}\n viewMode={viewMode}\n paneView={paneViewForContextMenu}\n search={search}\n collapsedMap={collapsedMap}\n setCollapsedMap={setCollapsedMap}\n />\n );\n break;\n case PaneView.CallTree:\n content = (\n <div className={styles.tableContainer}>\n <FlameGraphCallTreeContainer\n data={dataContainer}\n onSymbolClick={onCallTreeSymbolClick}\n sandwichItem={sandwichItem}\n onSandwich={setSandwichItem}\n onTableSort={onTableSort}\n search={search}\n onSearch={onCallTreeSearch}\n focusedItemIndexes={focusedItemIndexes}\n setFocusedItemIndexes={setFocusedItemIndexes}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n viewMode={viewMode}\n paneView={paneViewForContextMenu}\n />\n </div>\n );\n break;\n }\n\n return <div className={styles.paneWrapper}>{content}</div>;\n};\n\nfunction getStyles() {\n return {\n paneWrapper: css({\n width: '100%',\n height: '100%',\n }),\n tableContainer: css({\n height: FLAMEGRAPH_CONTAINER_HEIGHT,\n minWidth: 0,\n overflow: 'hidden',\n }),\n };\n}\n\nexport default FlameGraphPane;\n"],"names":[],"mappings":"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"}