@grafana/flamegraph
Version:
Grafana flamegraph visualization component
1 lines • 18.6 kB
Source Map (JSON)
{"version":3,"file":"FlameGraph.cjs","sources":["../../../src/FlameGraph/FlameGraph.tsx"],"sourcesContent":["// This component is based on logic from the flamebearer project\n// https://github.com/mapbox/flamebearer\n\n// ISC License\n\n// Copyright (c) 2018, Mapbox\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose\n// with or without fee is hereby granted, provided that the above copyright notice\n// and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n// THIS SOFTWARE.\nimport { css, cx } from '@emotion/css';\nimport { useEffect, useState } from 'react';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { Button, ButtonGroup, Icon, RadioButtonGroup, useStyles2 } from '@grafana/ui';\n\nimport { ColorSchemeButton } from '../ColorSchemeButton';\nimport { alignOptions } from '../FlameGraphHeader';\nimport { PIXELS_PER_LEVEL } from '../constants';\nimport {\n type ClickedItemData,\n type ColorScheme,\n type ColorSchemeDiff,\n type PaneView,\n type SelectedView,\n type ViewMode,\n type TextAlign,\n} from '../types';\n\nimport FlameGraphCanvas from './FlameGraphCanvas';\nimport { type GetExtraContextMenuButtonsFunction } from './FlameGraphContextMenu';\nimport FlameGraphMetadata from './FlameGraphMetadata';\nimport { type CollapsedMap, type FlameGraphDataContainer, type LevelItem } from './dataTransform';\n\ntype Props = {\n data: FlameGraphDataContainer;\n rangeMin: number;\n rangeMax: number;\n matchedLabels?: Set<string>;\n setRangeMin: (range: number) => void;\n setRangeMax: (range: number) => void;\n onItemFocused: (data: ClickedItemData) => void;\n focusedItemData?: ClickedItemData;\n textAlign: TextAlign;\n sandwichItem?: string;\n onSandwich: (label: string) => void;\n onFocusPillClick: () => void;\n onSandwichPillClick: () => void;\n colorScheme: ColorScheme | ColorSchemeDiff;\n showFlameGraphOnly?: boolean;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n collapsing?: boolean;\n search: string;\n collapsedMap: CollapsedMap;\n setCollapsedMap: (collapsedMap: CollapsedMap) => void;\n\n // Legacy props\n selectedView?: SelectedView;\n\n // New UI props (when enableNewUI is true, renders toolbar with controls)\n enableNewUI?: boolean;\n viewMode?: ViewMode;\n paneView?: PaneView;\n onTextAlignChange?: (align: TextAlign) => void;\n onColorSchemeChange?: (colorScheme: ColorScheme | ColorSchemeDiff) => void;\n isDiffMode?: boolean;\n};\n\nconst FlameGraph = ({\n data,\n rangeMin,\n rangeMax,\n matchedLabels,\n setRangeMin,\n setRangeMax,\n onItemFocused,\n focusedItemData,\n textAlign,\n onSandwich,\n sandwichItem,\n onFocusPillClick,\n onSandwichPillClick,\n colorScheme,\n showFlameGraphOnly,\n getExtraContextMenuButtons,\n collapsing,\n search,\n collapsedMap,\n setCollapsedMap,\n selectedView,\n enableNewUI,\n viewMode,\n paneView,\n onTextAlignChange,\n onColorSchemeChange,\n isDiffMode,\n}: Props) => {\n const isNewUI = enableNewUI === true;\n const newStyles = useStyles2(getStylesNew);\n const legacyStyles = getStylesLegacy();\n\n const [levels, setLevels] = useState<LevelItem[][]>();\n const [levelsCallers, setLevelsCallers] = useState<LevelItem[][]>();\n const [totalProfileTicks, setTotalProfileTicks] = useState<number>(0);\n const [totalProfileTicksRight, setTotalProfileTicksRight] = useState<number>();\n const [totalViewTicks, setTotalViewTicks] = useState<number>(0);\n\n useEffect(() => {\n if (data) {\n let levels = data.getLevels();\n let totalProfileTicks = levels.length ? levels[0][0].value : 0;\n let totalProfileTicksRight = levels.length ? levels[0][0].valueRight : undefined;\n let totalViewTicks = totalProfileTicks;\n let levelsCallers = undefined;\n\n if (sandwichItem) {\n const [callers, callees] = data.getSandwichLevels(sandwichItem);\n levels = callees;\n levelsCallers = callers;\n // We need this separate as in case of diff profile we want to compute diff colors based on the original ticks.\n totalViewTicks = callees[0]?.[0]?.value ?? 0;\n }\n setLevels(levels);\n setLevelsCallers(levelsCallers);\n setTotalProfileTicks(totalProfileTicks);\n setTotalProfileTicksRight(totalProfileTicksRight);\n setTotalViewTicks(totalViewTicks);\n }\n }, [data, sandwichItem]);\n\n if (!levels) {\n return null;\n }\n\n const commonCanvasProps = {\n data,\n rangeMin,\n rangeMax,\n matchedLabels,\n setRangeMin,\n setRangeMax,\n onItemFocused,\n focusedItemData,\n textAlign,\n onSandwich,\n colorScheme,\n totalProfileTicks,\n totalProfileTicksRight,\n totalViewTicks,\n showFlameGraphOnly,\n collapsedMap,\n setCollapsedMap,\n getExtraContextMenuButtons,\n collapsing,\n search,\n selectedView,\n viewMode,\n paneView,\n };\n let canvas = null;\n\n // Both style objects share sandwich/canvas styles, pick the right one based on mode.\n const canvasStyles = isNewUI ? newStyles : legacyStyles;\n\n if (levelsCallers?.length) {\n canvas = (\n <>\n <div className={canvasStyles.sandwichCanvasWrapper}>\n <div className={canvasStyles.sandwichMarker}>\n Callers\n <Icon className={canvasStyles.sandwichMarkerIcon} name={'arrow-down'} />\n </div>\n <FlameGraphCanvas\n {...commonCanvasProps}\n root={levelsCallers[levelsCallers.length - 1][0]}\n depth={levelsCallers.length}\n direction={'parents'}\n // We do not support collapsing in sandwich view for now.\n collapsing={false}\n />\n </div>\n\n <div className={canvasStyles.sandwichCanvasWrapper}>\n <div className={cx(canvasStyles.sandwichMarker, canvasStyles.sandwichMarkerCalees)}>\n <Icon className={canvasStyles.sandwichMarkerIcon} name={'arrow-up'} />\n Callees\n </div>\n <FlameGraphCanvas\n {...commonCanvasProps}\n root={levels[0][0]}\n depth={levels.length}\n direction={'children'}\n collapsing={false}\n />\n </div>\n </>\n );\n } else if (levels?.length) {\n canvas = (\n <FlameGraphCanvas {...commonCanvasProps} root={levels[0][0]} depth={levels.length} direction={'children'} />\n );\n }\n\n if (isNewUI) {\n return (\n <div className={newStyles.graph}>\n <div className={newStyles.toolbar}>\n <FlameGraphMetadata\n data={data}\n focusedItem={focusedItemData}\n sandwichedLabel={sandwichItem}\n totalTicks={totalViewTicks}\n onFocusPillClick={onFocusPillClick}\n onSandwichPillClick={onSandwichPillClick}\n />\n <div className={newStyles.controls}>\n {onColorSchemeChange && (\n <ColorSchemeButton value={colorScheme} onChange={onColorSchemeChange} isDiffMode={isDiffMode ?? false} />\n )}\n <ButtonGroup className={newStyles.buttonSpacing}>\n <Button\n variant={'secondary'}\n fill={'outline'}\n size={'sm'}\n tooltip={'Expand all groups'}\n onClick={() => {\n setCollapsedMap(collapsedMap.setAllCollapsedStatus(false));\n }}\n aria-label={'Expand all groups'}\n icon={'angle-double-down'}\n />\n <Button\n variant={'secondary'}\n fill={'outline'}\n size={'sm'}\n tooltip={'Collapse all groups'}\n onClick={() => {\n setCollapsedMap(collapsedMap.setAllCollapsedStatus(true));\n }}\n aria-label={'Collapse all groups'}\n icon={'angle-double-up'}\n />\n </ButtonGroup>\n {onTextAlignChange && (\n <RadioButtonGroup<TextAlign>\n size=\"sm\"\n options={alignOptions}\n value={textAlign}\n onChange={onTextAlignChange}\n />\n )}\n </div>\n </div>\n {canvas}\n </div>\n );\n }\n\n return (\n <div className={legacyStyles.graph}>\n <FlameGraphMetadata\n data={data}\n focusedItem={focusedItemData}\n sandwichedLabel={sandwichItem}\n totalTicks={totalViewTicks}\n onFocusPillClick={onFocusPillClick}\n onSandwichPillClick={onSandwichPillClick}\n />\n {canvas}\n </div>\n );\n};\n\nconst getStylesLegacy = () => ({\n graph: css({\n label: 'graph',\n overflow: 'auto',\n flexGrow: 1,\n flexBasis: '50%',\n }),\n sandwichCanvasWrapper: css({\n label: 'sandwichCanvasWrapper',\n display: 'flex',\n marginBottom: `${PIXELS_PER_LEVEL / window.devicePixelRatio}px`,\n }),\n sandwichMarker: css({\n label: 'sandwichMarker',\n writingMode: 'vertical-lr',\n transform: 'rotate(180deg)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }),\n sandwichMarkerCalees: css({\n label: 'sandwichMarkerCalees',\n textAlign: 'right',\n }),\n sandwichMarkerIcon: css({\n label: 'sandwichMarkerIcon',\n verticalAlign: 'baseline',\n }),\n});\n\nconst getStylesNew = (theme: GrafanaTheme2) => ({\n graph: css({\n label: 'graph',\n overflow: 'auto',\n flexGrow: 1,\n flexBasis: '50%',\n }),\n toolbar: css({\n label: 'toolbar',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }),\n controls: css({\n label: 'controls',\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n }),\n buttonSpacing: css({\n label: 'buttonSpacing',\n marginRight: theme.spacing(1),\n }),\n sandwichCanvasWrapper: css({\n label: 'sandwichCanvasWrapper',\n display: 'flex',\n marginBottom: `${PIXELS_PER_LEVEL / window.devicePixelRatio}px`,\n }),\n sandwichMarker: css({\n label: 'sandwichMarker',\n writingMode: 'vertical-lr',\n transform: 'rotate(180deg)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }),\n sandwichMarkerCalees: css({\n label: 'sandwichMarkerCalees',\n textAlign: 'right',\n }),\n sandwichMarkerIcon: css({\n label: 'sandwichMarkerIcon',\n verticalAlign: 'baseline',\n }),\n});\n\nexport default FlameGraph;\n"],"names":["useStyles2","useState","useEffect","levels","totalProfileTicks","totalProfileTicksRight","totalViewTicks","levelsCallers","jsxs","Fragment","Icon","jsx","FlameGraphCanvas","cx","ColorSchemeButton","ButtonGroup","Button","RadioButtonGroup","alignOptions","css","PIXELS_PER_LEVEL"],"mappings":"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"}