UNPKG

@grafana/flamegraph

Version:

Grafana flamegraph visualization component

1 lines • 26.1 kB
{"version":3,"file":"FlameGraphHeader.mjs","sources":["../../src/FlameGraphHeader.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useEffect, useState } from 'react';\nimport * as React from 'react';\nimport { useDebounce, usePrevious } from 'react-use';\n\nimport { type ChatContextItem, OpenAssistantButton } from '@grafana/assistant';\nimport { type GrafanaTheme2, type SelectableValue } from '@grafana/data';\nimport { Button, ButtonGroup, Dropdown, IconButton, Input, Menu, RadioButtonGroup, useStyles2 } from '@grafana/ui';\n\nimport { ColorSchemeButton } from './ColorSchemeButton';\nimport { type CollapsedMap } from './FlameGraph/dataTransform';\nimport { MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH, MIN_WIDTH_TO_SHOW_SPLIT_PANE_SELECTORS } from './constants';\nimport { type ColorScheme, type ColorSchemeDiff, PaneView, SelectedView, type TextAlign, ViewMode } from './types';\n\ntype LegacyProps = {\n search: string;\n setSearch: (search: string) => void;\n selectedView: SelectedView;\n setSelectedView: (view: SelectedView) => void;\n containerWidth: number;\n onReset: () => void;\n textAlign: TextAlign;\n onTextAlignChange: (align: TextAlign) => void;\n showResetButton: boolean;\n colorScheme: ColorScheme | ColorSchemeDiff;\n onColorSchemeChange: (colorScheme: ColorScheme | ColorSchemeDiff) => void;\n stickyHeader: boolean;\n vertical?: boolean;\n isDiffMode: boolean;\n setCollapsedMap: (collapsedMap: CollapsedMap) => void;\n collapsedMap: CollapsedMap;\n\n extraHeaderElements?: React.ReactNode;\n\n assistantContext?: ChatContextItem[];\n};\n\ntype NewUIProps = {\n search: string;\n setSearch: (search: string) => void;\n enableNewUI: true;\n viewMode: ViewMode;\n setViewMode: (mode: ViewMode) => void;\n canShowSplitView: boolean;\n containerWidth: number;\n leftPaneView: PaneView;\n setLeftPaneView: (view: PaneView) => void;\n rightPaneView: PaneView;\n setRightPaneView: (view: PaneView) => void;\n singleView: PaneView;\n setSingleView: (view: PaneView) => void;\n onSwapPanes: () => void;\n onReset: () => void;\n showResetButton: boolean;\n stickyHeader: boolean;\n\n extraHeaderElements?: React.ReactNode;\n\n assistantContext?: ChatContextItem[];\n};\n\ntype Props = LegacyProps | NewUIProps;\n\nfunction isNewUI(props: Props): props is NewUIProps {\n return 'enableNewUI' in props && props.enableNewUI === true;\n}\n\nconst FlameGraphHeader = (props: Props) => {\n const styles = useStyles2(getStyles);\n const [localSearch, setLocalSearch] = useSearchInput(props.search, props.setSearch);\n\n const suffix =\n localSearch !== '' ? (\n <Button\n icon=\"times\"\n fill=\"text\"\n size=\"sm\"\n onClick={() => {\n // We could set only one and wait them to sync but there is no need to debounce this.\n props.setSearch('');\n setLocalSearch('');\n }}\n >\n Clear\n </Button>\n ) : null;\n\n if (isNewUI(props)) {\n const effectiveViewMode = props.canShowSplitView ? props.viewMode : ViewMode.Single;\n\n return (\n <div className={cx(styles.header, styles.headerNew, { [styles.stickyHeader]: props.stickyHeader })}>\n <div className={styles.inputContainerNew}>\n <Input\n value={localSearch || ''}\n onChange={(v) => {\n setLocalSearch(v.currentTarget.value);\n }}\n placeholder={'Search...'}\n suffix={suffix}\n />\n </div>\n\n {effectiveViewMode === ViewMode.Split && (\n <div className={styles.middleContainer}>\n {props.containerWidth >= MIN_WIDTH_TO_SHOW_SPLIT_PANE_SELECTORS ? (\n <>\n <RadioButtonGroup<PaneView>\n size=\"sm\"\n options={paneViewOptions}\n value={props.leftPaneView}\n onChange={props.setLeftPaneView}\n className={styles.buttonSpacing}\n />\n <IconButton name=\"exchange-alt\" size=\"sm\" tooltip=\"Swap views\" onClick={props.onSwapPanes} />\n <RadioButtonGroup<PaneView>\n size=\"sm\"\n options={paneViewOptions}\n value={props.rightPaneView}\n onChange={props.setRightPaneView}\n className={styles.buttonSpacing}\n />\n </>\n ) : (\n <>\n <Dropdown\n overlay={\n <Menu>\n {paneViewOptions.map((option) => (\n <Menu.Item\n key={option.value}\n label={option.label ?? ''}\n active={props.leftPaneView === option.value}\n onClick={() => option.value && props.setLeftPaneView(option.value)}\n />\n ))}\n </Menu>\n }\n >\n <Button variant=\"secondary\" size=\"sm\" className={styles.paneDropdownButton}>\n {paneViewOptions.find((o) => o.value === props.leftPaneView)?.label}\n </Button>\n </Dropdown>\n <IconButton name=\"exchange-alt\" size=\"sm\" tooltip=\"Swap views\" onClick={props.onSwapPanes} />\n <Dropdown\n overlay={\n <Menu>\n {paneViewOptions.map((option) => (\n <Menu.Item\n key={option.value}\n label={option.label ?? ''}\n active={props.rightPaneView === option.value}\n onClick={() => option.value && props.setRightPaneView(option.value)}\n />\n ))}\n </Menu>\n }\n >\n <Button variant=\"secondary\" size=\"sm\" className={styles.paneDropdownButton}>\n {paneViewOptions.find((o) => o.value === props.rightPaneView)?.label}\n </Button>\n </Dropdown>\n </>\n )}\n </div>\n )}\n\n <div className={styles.rightContainer}>\n {!!props.assistantContext?.length && (\n <div className={styles.buttonSpacing}>\n <OpenAssistantButton\n origin=\"grafana/flame-graph\"\n prompt=\"Analyze this flamegraph by querying the current datasource\"\n context={props.assistantContext}\n />\n </div>\n )}\n {props.showResetButton && (\n <Button\n variant={'secondary'}\n fill={'outline'}\n size={'sm'}\n icon={'history-alt'}\n tooltip={'Reset focus and sandwich state'}\n onClick={() => {\n props.onReset();\n }}\n className={styles.buttonSpacing}\n aria-label={'Reset focus and sandwich state'}\n />\n )}\n {effectiveViewMode === ViewMode.Single && (\n <RadioButtonGroup<PaneView>\n size=\"sm\"\n options={paneViewOptions}\n value={props.singleView}\n onChange={props.setSingleView}\n className={styles.buttonSpacing}\n />\n )}\n {props.canShowSplitView && (\n <RadioButtonGroup<ViewMode>\n size=\"sm\"\n options={viewModeOptions}\n value={props.viewMode}\n onChange={props.setViewMode}\n className={styles.buttonSpacing}\n />\n )}\n {props.extraHeaderElements && <div className={styles.extraElements}>{props.extraHeaderElements}</div>}\n </div>\n </div>\n );\n }\n\n // Legacy UI rendering\n const {\n selectedView,\n setSelectedView,\n containerWidth,\n onReset,\n textAlign,\n onTextAlignChange,\n showResetButton,\n colorScheme,\n onColorSchemeChange,\n stickyHeader,\n extraHeaderElements,\n vertical,\n isDiffMode,\n setCollapsedMap,\n collapsedMap,\n assistantContext,\n } = props;\n\n return (\n <div className={cx(styles.header, { [styles.stickyHeader]: stickyHeader })}>\n <div className={styles.inputContainer}>\n <Input\n value={localSearch || ''}\n onChange={(v) => {\n setLocalSearch(v.currentTarget.value);\n }}\n placeholder={'Search...'}\n suffix={suffix}\n />\n </div>\n\n <div className={styles.rightContainer}>\n {!!assistantContext?.length && (\n <div className={styles.buttonSpacing}>\n <OpenAssistantButton\n origin=\"grafana/flame-graph\"\n prompt=\"Analyze this flamegraph by querying the current datasource\"\n context={assistantContext}\n />\n </div>\n )}\n {showResetButton && (\n <Button\n variant={'secondary'}\n fill={'outline'}\n size={'sm'}\n icon={'history-alt'}\n tooltip={'Reset focus and sandwich state'}\n onClick={() => {\n onReset();\n }}\n className={styles.buttonSpacing}\n aria-label={'Reset focus and sandwich state'}\n />\n )}\n <ColorSchemeButton value={colorScheme} onChange={onColorSchemeChange} isDiffMode={isDiffMode} />\n <ButtonGroup className={styles.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 disabled={selectedView === SelectedView.TopTable}\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 disabled={selectedView === SelectedView.TopTable}\n />\n </ButtonGroup>\n <RadioButtonGroup<TextAlign>\n size=\"sm\"\n disabled={selectedView === SelectedView.TopTable}\n options={alignOptions}\n value={textAlign}\n onChange={onTextAlignChange}\n className={styles.buttonSpacing}\n />\n <RadioButtonGroup<SelectedView>\n size=\"sm\"\n options={getViewOptions(containerWidth, vertical)}\n value={selectedView}\n onChange={setSelectedView}\n />\n {extraHeaderElements && <div className={styles.extraElements}>{extraHeaderElements}</div>}\n </div>\n </div>\n );\n};\n\nexport const alignOptions: Array<SelectableValue<TextAlign>> = [\n { value: 'left', description: 'Align text left', icon: 'align-left' },\n { value: 'right', description: 'Align text right', icon: 'align-right' },\n];\n\nconst viewModeOptions: Array<SelectableValue<ViewMode>> = [\n { value: ViewMode.Single, label: 'Single', description: 'Single view' },\n { value: ViewMode.Split, label: 'Split', description: 'Split view' },\n];\n\nconst paneViewOptions: Array<SelectableValue<PaneView>> = [\n { value: PaneView.TopTable, label: 'Top Table' },\n { value: PaneView.FlameGraph, label: 'Flame Graph' },\n { value: PaneView.CallTree, label: 'Call Tree' },\n];\n\nfunction getViewOptions(width: number, vertical?: boolean): Array<SelectableValue<SelectedView>> {\n let viewOptions: Array<{ value: SelectedView; label: string; description: string }> = [\n { value: SelectedView.TopTable, label: 'Top Table', description: 'Only show top table' },\n { value: SelectedView.FlameGraph, label: 'Flame Graph', description: 'Only show flame graph' },\n ];\n\n if (width >= MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH || vertical) {\n viewOptions.push({\n value: SelectedView.Both,\n label: 'Both',\n description: 'Show both the top table and flame graph',\n });\n }\n\n return viewOptions;\n}\n\nfunction useSearchInput(\n search: string,\n setSearch: (search: string) => void\n): [string | undefined, (search: string) => void] {\n const [localSearchState, setLocalSearchState] = useState(search);\n const prevSearch = usePrevious(search);\n\n // Debouncing cause changing parent search triggers rerender on both the flamegraph and table\n useDebounce(\n () => {\n setSearch(localSearchState);\n },\n 250,\n [localSearchState]\n );\n\n // Make sure we still handle updates from parent (from clicking on a table item for example). We check if the parent\n // search value changed to something that isn't our local value.\n useEffect(() => {\n if (prevSearch !== search && search !== localSearchState) {\n setLocalSearchState(search);\n }\n }, [search, prevSearch, localSearchState]);\n\n return [localSearchState, setLocalSearchState];\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n header: css({\n label: 'header',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n width: '100%',\n top: 0,\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n }),\n headerNew: css({\n label: 'headerNew',\n alignItems: 'flex-start',\n position: 'relative',\n }),\n stickyHeader: css({\n zIndex: theme.zIndex.navbarFixed,\n position: 'sticky',\n background: theme.colors.background.primary,\n }),\n inputContainer: css({\n label: 'inputContainer',\n flexGrow: 1,\n minWidth: '150px',\n maxWidth: '350px',\n }),\n inputContainerNew: css({\n label: 'inputContainerNew',\n flexGrow: 0,\n minWidth: '150px',\n maxWidth: '350px',\n }),\n middleContainer: css({\n label: 'middleContainer',\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n position: 'absolute',\n left: '50%',\n transform: 'translateX(-50%)',\n }),\n rightContainer: css({\n label: 'rightContainer',\n display: 'flex',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n }),\n buttonSpacing: css({\n label: 'buttonSpacing',\n marginRight: theme.spacing(1),\n }),\n resetButton: css({\n label: 'resetButton',\n display: 'flex',\n marginRight: theme.spacing(2),\n }),\n resetButtonIconWrapper: css({\n label: 'resetButtonIcon',\n padding: '0 5px',\n color: theme.colors.text.disabled,\n }),\n extraElements: css({\n label: 'extraElements',\n marginLeft: theme.spacing(1),\n }),\n paneDropdownButton: css({\n label: 'paneDropdownButton',\n minWidth: '95px',\n justifyContent: 'center',\n }),\n});\n\nexport default FlameGraphHeader;\n"],"names":["_a"],"mappings":"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"}