import {Fragment} from 'react'; import {useTheme} from '@emotion/react'; import {BarChart} from 'sentry/components/charts/barChart'; import BarChartZoom from 'sentry/components/charts/barChartZoom'; import ErrorPanel from 'sentry/components/charts/errorPanel'; import {HeaderTitleLegend} from 'sentry/components/charts/styles'; import TransitionChart from 'sentry/components/charts/transitionChart'; import TransparentLoadingMask from 'sentry/components/charts/transparentLoadingMask'; import {pickBarColor} from 'sentry/components/performance/waterfall/utils'; import Placeholder from 'sentry/components/placeholder'; import QuestionTooltip from 'sentry/components/questionTooltip'; import {IconWarning} from 'sentry/icons'; import {t} from 'sentry/locale'; import type {Organization} from 'sentry/types'; import {axisLabelFormatter, tooltipFormatter} from 'sentry/utils/discover/charts'; import type EventView from 'sentry/utils/discover/eventView'; import {aggregateOutputType} from 'sentry/utils/discover/fields'; import getDynamicText from 'sentry/utils/getDynamicText'; import SpanHistogramQuery from 'sentry/utils/performance/histogram/spanHistogramQuery'; import type {HistogramData} from 'sentry/utils/performance/histogram/types'; import { computeBuckets, formatHistogramData, } from 'sentry/utils/performance/histogram/utils'; import type {SpanSlug} from 'sentry/utils/performance/suspectSpans/types'; import {decodeScalar} from 'sentry/utils/queryString'; import {useLocation} from 'sentry/utils/useLocation'; import {ZoomKeys} from './utils'; const NUM_BUCKETS = 50; const PRECISION = 0; type Props = { eventView: EventView; organization: Organization; spanSlug: SpanSlug; }; export default function ExclusiveTimeHistogram(props: Props) { const {organization, eventView, spanSlug} = props; const location = useLocation(); const start = decodeScalar(location.query[ZoomKeys.MIN]); const end = decodeScalar(location.query[ZoomKeys.MAX]); return ( {t('Self Time Distribution')} {({histogram, isLoading, error}) => { if (error) { return ( ); } return ( {zoomRenderProps => ( )} ); }} ); } type ChartProps = { chartData: HistogramData | null; isErrored: boolean; isLoading: boolean; spanSlug: SpanSlug; zoomProps: any; disableChartPadding?: boolean; }; export function Chart(props: ChartProps) { const theme = useTheme(); const {chartData, zoomProps, spanSlug} = props; if (!chartData) { return ; } const chartOptions = { grid: { left: '10px', right: '10px', top: '40px', bottom: '0px', }, colors: () => pickBarColor(spanSlug.op), seriesOptions: { showSymbol: false, }, tooltip: { trigger: 'axis' as const, // TODO (udameli) pull series name from the meta valueFormatter: (value, _seriesName) => tooltipFormatter(value, aggregateOutputType(_seriesName)), }, yAxis: { type: 'value' as const, axisLabel: { color: theme.chartLabel, formatter: (value: number) => axisLabelFormatter(value, 'number'), }, }, xAxis: { type: 'category' as const, truncate: true, axisTick: { alignWithLabel: true, }, }, height: 200, }; const series = { seriesName: t('Count'), data: formatHistogramData(chartData, {type: 'duration'}), }; return ( {getDynamicText({ value: , fixed: , })} ); }