averageComparisonChart.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import {useMemo} from 'react';
  2. import {t} from 'sentry/locale';
  3. import type {NewQuery} from 'sentry/types/organization';
  4. import {defined} from 'sentry/utils';
  5. import type {TableDataRow} from 'sentry/utils/discover/discoverQuery';
  6. import EventView from 'sentry/utils/discover/eventView';
  7. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  8. import {formatVersion} from 'sentry/utils/formatters';
  9. import {decodeScalar} from 'sentry/utils/queryString';
  10. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  11. import {useLocation} from 'sentry/utils/useLocation';
  12. import usePageFilters from 'sentry/utils/usePageFilters';
  13. import {MAX_CHART_RELEASE_CHARS} from 'sentry/views/performance/mobile/appStarts/screens';
  14. import {COLD_START_TYPE} from 'sentry/views/performance/mobile/appStarts/screenSummary/startTypeSelector';
  15. import {YAxis, YAXIS_COLUMNS} from 'sentry/views/performance/mobile/screenload/screens';
  16. import {ScreensBarChart} from 'sentry/views/performance/mobile/screenload/screens/screenBarChart';
  17. import {useTableQuery} from 'sentry/views/performance/mobile/screenload/screens/screensTable';
  18. import {PRIMARY_RELEASE_COLOR} from 'sentry/views/starfish/colors';
  19. import {useReleaseSelection} from 'sentry/views/starfish/queries/useReleases';
  20. import {SpanMetricsField} from 'sentry/views/starfish/types';
  21. import {formatVersionAndCenterTruncate} from 'sentry/views/starfish/utils/centerTruncate';
  22. import {appendReleaseFilters} from 'sentry/views/starfish/utils/releaseComparison';
  23. interface Props {
  24. chartHeight?: number;
  25. }
  26. function transformData(data: TableDataRow[] | undefined, appStartType: string) {
  27. if (!defined(data)) {
  28. return [];
  29. }
  30. return [
  31. {
  32. seriesName: t('Average Duration'),
  33. data:
  34. data?.map(row => ({
  35. name: formatVersion(row.release as string),
  36. value:
  37. (row[
  38. YAXIS_COLUMNS[
  39. appStartType === COLD_START_TYPE ? YAxis.COLD_START : YAxis.WARM_START
  40. ]
  41. ] as number) ?? 0,
  42. })) ?? [],
  43. itemStyle: {
  44. color: PRIMARY_RELEASE_COLOR,
  45. },
  46. },
  47. ];
  48. }
  49. export function AverageComparisonChart({chartHeight}: Props) {
  50. const location = useLocation();
  51. const {
  52. primaryRelease,
  53. secondaryRelease,
  54. isLoading: isReleasesLoading,
  55. } = useReleaseSelection();
  56. const {selection} = usePageFilters();
  57. const appStartType =
  58. decodeScalar(location.query[SpanMetricsField.APP_START_TYPE]) ?? COLD_START_TYPE;
  59. const query = new MutableSearch([
  60. 'event.type:transaction',
  61. 'transaction.op:ui.load',
  62. `count_starts(measurements.app_start_${appStartType}):>0`,
  63. ]);
  64. const queryString = appendReleaseFilters(query, primaryRelease, secondaryRelease);
  65. const newQuery: NewQuery = {
  66. name: '',
  67. fields: ['release', `avg(measurements.app_start_${appStartType})`],
  68. dataset: DiscoverDatasets.METRICS,
  69. query: queryString,
  70. version: 2,
  71. projects: selection.projects,
  72. };
  73. const tableEventView = EventView.fromNewQueryWithLocation(newQuery, location);
  74. const {data, isLoading} = useTableQuery({
  75. eventView: tableEventView,
  76. enabled: !isReleasesLoading,
  77. referrer: 'api.starfish.mobile-startup-bar-chart',
  78. });
  79. const transformedData = useMemo(() => {
  80. return transformData(data?.data, appStartType);
  81. }, [data, appStartType]);
  82. const truncatedPrimaryChart = formatVersionAndCenterTruncate(
  83. primaryRelease ?? '',
  84. MAX_CHART_RELEASE_CHARS
  85. );
  86. const truncatedSecondaryChart = formatVersionAndCenterTruncate(
  87. secondaryRelease ?? '',
  88. MAX_CHART_RELEASE_CHARS
  89. );
  90. return (
  91. <ScreensBarChart
  92. chartOptions={[
  93. {
  94. title:
  95. appStartType === COLD_START_TYPE
  96. ? t('Average Cold Start')
  97. : t('Average Warm Start'),
  98. yAxis: `avg(measurements.app_start_${appStartType})`,
  99. xAxisLabel: [
  100. ...(primaryRelease ? [formatVersion(primaryRelease)] : []),
  101. ...(secondaryRelease ? [formatVersion(secondaryRelease)] : []),
  102. ],
  103. series: transformedData,
  104. subtitle: primaryRelease
  105. ? t(
  106. '%s v. %s',
  107. truncatedPrimaryChart,
  108. secondaryRelease ? truncatedSecondaryChart : ''
  109. )
  110. : '',
  111. },
  112. ]}
  113. chartHeight={chartHeight}
  114. isLoading={isLoading || isReleasesLoading}
  115. chartKey={`averageStart`}
  116. />
  117. );
  118. }