spanOpSelector.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {browserHistory} from 'react-router';
  2. import {CompactSelect} from 'sentry/components/compactSelect';
  3. import {t} from 'sentry/locale';
  4. import type {NewQuery} from 'sentry/types';
  5. import EventView from 'sentry/utils/discover/eventView';
  6. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  7. import {decodeScalar} from 'sentry/utils/queryString';
  8. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  9. import {useLocation} from 'sentry/utils/useLocation';
  10. import usePageFilters from 'sentry/utils/usePageFilters';
  11. import {SpanMetricsField} from 'sentry/views/starfish/types';
  12. import {appendReleaseFilters} from 'sentry/views/starfish/utils/releaseComparison';
  13. import {COLD_START_TYPE} from 'sentry/views/starfish/views/appStartup/screenSummary/startTypeSelector';
  14. import {MobileCursors} from 'sentry/views/starfish/views/screens/constants';
  15. import {TTID_CONTRIBUTING_SPAN_OPS} from 'sentry/views/starfish/views/screens/screenLoadSpans/spanOpSelector';
  16. import {useTableQuery} from 'sentry/views/starfish/views/screens/screensTable';
  17. export const APP_START_SPANS = [
  18. ...TTID_CONTRIBUTING_SPAN_OPS,
  19. 'app.start.cold',
  20. 'app.start.warm',
  21. 'contentprovider.load',
  22. 'application.load',
  23. 'activity.load',
  24. 'process.load',
  25. ];
  26. type Props = {
  27. primaryRelease?: string;
  28. secondaryRelease?: string;
  29. transaction?: string;
  30. };
  31. export function SpanOpSelector({transaction, primaryRelease, secondaryRelease}: Props) {
  32. const location = useLocation();
  33. const {selection} = usePageFilters();
  34. const value = decodeScalar(location.query[SpanMetricsField.SPAN_OP]) ?? '';
  35. const appStartType =
  36. decodeScalar(location.query[SpanMetricsField.APP_START_TYPE]) ?? COLD_START_TYPE;
  37. const searchQuery = new MutableSearch([
  38. // Exclude root level spans because they're comprised of nested operations
  39. '!span.description:"Cold Start"',
  40. '!span.description:"Warm Start"',
  41. // Exclude this span because we can get TTID contributing spans instead
  42. '!span.description:"Initial Frame Render"',
  43. 'has:span.description',
  44. 'transaction.op:ui.load',
  45. `transaction:${transaction}`,
  46. `has:ttid`,
  47. `span.op:[${APP_START_SPANS.join(',')}]`,
  48. `app_start_type:${appStartType}`,
  49. ]);
  50. const queryStringPrimary = appendReleaseFilters(
  51. searchQuery,
  52. primaryRelease,
  53. secondaryRelease
  54. );
  55. const newQuery: NewQuery = {
  56. name: '',
  57. fields: [SpanMetricsField.SPAN_OP, 'count()'],
  58. query: queryStringPrimary,
  59. dataset: DiscoverDatasets.SPANS_METRICS,
  60. version: 2,
  61. projects: selection.projects,
  62. };
  63. const eventView = EventView.fromNewQueryWithLocation(newQuery, location);
  64. const {data} = useTableQuery({
  65. eventView,
  66. enabled: true,
  67. limit: 25,
  68. referrer: 'api.starfish.get-span-operations',
  69. });
  70. const options = [
  71. {value: '', label: t('All')},
  72. ...(data?.data ?? [])
  73. .filter(datum => Boolean(datum[SpanMetricsField.SPAN_OP]))
  74. .map(datum => {
  75. return {
  76. value: datum[SpanMetricsField.SPAN_OP],
  77. label: datum[SpanMetricsField.SPAN_OP],
  78. };
  79. }),
  80. ];
  81. return (
  82. <CompactSelect
  83. triggerProps={{prefix: t('Operation')}}
  84. value={value}
  85. options={options ?? []}
  86. onChange={newValue => {
  87. browserHistory.push({
  88. ...location,
  89. query: {
  90. ...location.query,
  91. [SpanMetricsField.SPAN_OP]: newValue.value,
  92. [MobileCursors.SPANS_TABLE]: undefined,
  93. },
  94. });
  95. }}
  96. />
  97. );
  98. }