import styled from '@emotion/styled';
import {pickBarColor} from 'sentry/components/performance/waterfall/utils';
import Placeholder from 'sentry/components/placeholder';
import {IconCircleFill} from 'sentry/icons/iconCircleFill';
import {space} from 'sentry/styles/space';
import type {Color} from 'sentry/utils/theme';
import type {TraceMetaQueryResults} from './traceApi/useTraceMeta';
import {useHasTraceNewUi} from './useHasTraceNewUi';
function LoadingPlaceHolder() {
return (
);
}
type Props = {
isTraceLoading: boolean;
metaQueryResults: TraceMetaQueryResults;
};
export function TraceLevelOpsBreakdown({metaQueryResults, isTraceLoading}: Props) {
const hasNewTraceUi = useHasTraceNewUi();
if (!hasNewTraceUi || metaQueryResults.status === 'error') {
return null;
}
if (isTraceLoading || metaQueryResults.status === 'pending') {
return ;
}
const {span_count, span_count_map} = metaQueryResults.data!;
if (span_count <= 0) {
return null;
}
return (
{Object.entries(span_count_map)
.sort((a, b) => b[1] - a[1]) // Sort by count
.slice(0, 4)
.map(([op, count]) => {
const percentage = count / span_count;
const color = pickBarColor(op);
const pctLabel = isFinite(percentage) ? Math.round(percentage * 100) : '∞';
return (
{op}
{pctLabel}%
);
})}
);
}
const HighlightsOpRow = styled('div')`
display: flex;
align-items: center;
font-size: ${p => p.theme.fontSizeSmall};
gap: 5px;
`;
const Container = styled('div')`
display: flex;
align-items: center;
padding-left: ${space(1)};
gap: ${space(2)};
`;
const StyledPlaceholder = styled(Placeholder)`
border-radius: ${p => p.theme.borderRadius};
`;