mirror of
https://github.com/grafana/grafana.git
synced 2025-08-02 07:23:11 +08:00
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import { css } from '@emotion/css';
|
|
import React from 'react';
|
|
|
|
import { useStyles2 } from '@grafana/ui';
|
|
|
|
import { Metadata } from '../types';
|
|
|
|
import { FlameGraphDataContainer } from './dataTransform';
|
|
|
|
type Props = {
|
|
data: FlameGraphDataContainer;
|
|
totalTicks: number;
|
|
focusedItemIndex?: number;
|
|
};
|
|
|
|
const FlameGraphMetadata = React.memo(({ data, focusedItemIndex, totalTicks }: Props) => {
|
|
const styles = useStyles2(getStyles);
|
|
const metadata = getMetadata(data, focusedItemIndex || 0, totalTicks);
|
|
const metadataText = `${metadata?.unitValue} (${metadata?.percentValue}%) of ${metadata?.samples} total samples (${metadata?.unitTitle})`;
|
|
return <>{<div className={styles.metadata}>{metadataText}</div>}</>;
|
|
});
|
|
|
|
export const getMetadata = (data: FlameGraphDataContainer, itemIndex: number, totalTicks: number): Metadata => {
|
|
const displayValue = data.getValueDisplay(itemIndex);
|
|
const percentValue = Math.round(10000 * (displayValue.numeric / totalTicks)) / 100;
|
|
let unitValue = displayValue.text + displayValue.suffix;
|
|
|
|
const unitTitle = data.getUnitTitle();
|
|
if (unitTitle === 'Count') {
|
|
if (!displayValue.suffix) {
|
|
// Makes sure we don't show 123undefined or something like that if suffix isn't defined
|
|
unitValue = displayValue.text;
|
|
}
|
|
}
|
|
|
|
return {
|
|
percentValue,
|
|
unitTitle,
|
|
unitValue,
|
|
samples: totalTicks.toLocaleString(),
|
|
};
|
|
};
|
|
|
|
FlameGraphMetadata.displayName = 'FlameGraphMetadata';
|
|
|
|
const getStyles = () => ({
|
|
metadata: css`
|
|
margin: 8px 0;
|
|
text-align: center;
|
|
`,
|
|
});
|
|
|
|
export default FlameGraphMetadata;
|