useSpanSamplesCategorizedQuery.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {defined} from 'sentry/utils';
  2. import {
  3. CLS_SPANS_FILTER,
  4. INTERACTION_SPANS_FILTER,
  5. LCP_SPANS_FILTER,
  6. SPANS_FILTER,
  7. useSpanSamplesWebVitalsQuery,
  8. } from 'sentry/views/insights/browser/webVitals/queries/useSpanSamplesWebVitalsQuery';
  9. import type {
  10. SpanSampleRowWithScore,
  11. WebVitals,
  12. } from 'sentry/views/insights/browser/webVitals/types';
  13. import type {BrowserType} from 'sentry/views/insights/browser/webVitals/utils/queryParameterDecoders/browserType';
  14. import {
  15. PERFORMANCE_SCORE_MEDIANS,
  16. PERFORMANCE_SCORE_P90S,
  17. } from 'sentry/views/insights/browser/webVitals/utils/scoreThresholds';
  18. import type {SubregionCode} from 'sentry/views/insights/types';
  19. type Props = {
  20. browserTypes: BrowserType[];
  21. enabled: boolean;
  22. subregions: SubregionCode[];
  23. transaction: string;
  24. webVital: WebVitals | null;
  25. };
  26. export function useSpanSamplesCategorizedQuery({
  27. transaction,
  28. enabled,
  29. browserTypes,
  30. subregions,
  31. webVital,
  32. }: Props) {
  33. const webVitalFilter =
  34. webVital === 'inp'
  35. ? INTERACTION_SPANS_FILTER
  36. : webVital === 'lcp'
  37. ? LCP_SPANS_FILTER
  38. : webVital === 'cls'
  39. ? CLS_SPANS_FILTER
  40. : SPANS_FILTER;
  41. const {data: goodData, isFetching: isGoodDataLoading} = useSpanSamplesWebVitalsQuery({
  42. transaction,
  43. enabled: enabled && defined(webVital),
  44. limit: 3,
  45. filter: defined(webVital)
  46. ? `measurements.${webVital}:<${PERFORMANCE_SCORE_P90S[webVital]} ${webVitalFilter}`
  47. : undefined,
  48. browserTypes,
  49. subregions,
  50. webVital: webVital ?? undefined,
  51. });
  52. const {data: mehData, isFetching: isMehDataLoading} = useSpanSamplesWebVitalsQuery({
  53. transaction,
  54. enabled: enabled && defined(webVital),
  55. limit: 3,
  56. filter: defined(webVital)
  57. ? `measurements.${webVital}:>=${PERFORMANCE_SCORE_P90S[webVital]} measurements.${webVital}:<${PERFORMANCE_SCORE_MEDIANS[webVital]} ${webVitalFilter}`
  58. : undefined,
  59. browserTypes,
  60. subregions,
  61. webVital: webVital ?? undefined,
  62. });
  63. const {data: poorData, isFetching: isBadDataLoading} = useSpanSamplesWebVitalsQuery({
  64. transaction,
  65. enabled: enabled && defined(webVital),
  66. limit: 3,
  67. filter: defined(webVital)
  68. ? `measurements.${webVital}:>=${PERFORMANCE_SCORE_MEDIANS[webVital]} ${webVitalFilter}`
  69. : undefined,
  70. browserTypes,
  71. subregions,
  72. webVital: webVital ?? undefined,
  73. });
  74. const data = [...goodData, ...mehData, ...poorData];
  75. const isLoading = isGoodDataLoading || isMehDataLoading || isBadDataLoading;
  76. const spanSamplesTableData: SpanSampleRowWithScore[] = data.sort(
  77. (a, b) => a.totalScore - b.totalScore
  78. );
  79. return {
  80. data: spanSamplesTableData,
  81. isLoading,
  82. };
  83. }