useIndexedResourcesQuery.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {useDiscoverQuery} from 'sentry/utils/discover/discoverQuery';
  2. import EventView from 'sentry/utils/discover/eventView';
  3. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  4. import {useLocation} from 'sentry/utils/useLocation';
  5. import useOrganization from 'sentry/utils/useOrganization';
  6. import usePageFilters from 'sentry/utils/usePageFilters';
  7. import {useResourceModuleFilters} from 'sentry/views/performance/browser/resources/utils/useResourceFilters';
  8. import {SpanIndexedField} from 'sentry/views/starfish/types';
  9. const {
  10. SPAN_DESCRIPTION,
  11. SPAN_OP,
  12. HTTP_RESPONSE_CONTENT_LENGTH,
  13. SPAN_SELF_TIME,
  14. RESOURCE_RENDER_BLOCKING_STATUS,
  15. SPAN_DOMAIN,
  16. } = SpanIndexedField;
  17. export const useIndexedResourcesQuery = () => {
  18. const pageFilters = usePageFilters();
  19. const location = useLocation();
  20. const resourceFilters = useResourceModuleFilters();
  21. const {slug: orgSlug} = useOrganization();
  22. const queryConditions = [
  23. `${SPAN_OP}:resource.img`,
  24. ...(resourceFilters['resource.render_blocking_status']
  25. ? [
  26. `resource.render_blocking_status:${resourceFilters['resource.render_blocking_status']}`,
  27. ]
  28. : [`!resource.render_blocking_status:blocking`]),
  29. ...(resourceFilters[SPAN_DOMAIN]
  30. ? [`span.domain:${resourceFilters[SPAN_DOMAIN]}`]
  31. : []),
  32. ];
  33. // TODO - we should be using metrics data here
  34. const eventView = EventView.fromNewQueryWithPageFilters(
  35. {
  36. fields: [
  37. 'id',
  38. 'project',
  39. 'span.group',
  40. 'transaction.id',
  41. 'count_unique(span.description)',
  42. SPAN_DESCRIPTION,
  43. SPAN_SELF_TIME,
  44. HTTP_RESPONSE_CONTENT_LENGTH,
  45. RESOURCE_RENDER_BLOCKING_STATUS,
  46. ],
  47. name: 'Resource module - resource table',
  48. query: queryConditions.join(' '),
  49. version: 2,
  50. orderby: '-count()',
  51. dataset: DiscoverDatasets.SPANS_INDEXED,
  52. },
  53. pageFilters.selection
  54. );
  55. const result = useDiscoverQuery({
  56. eventView,
  57. limit: 100,
  58. location,
  59. orgSlug,
  60. referrer: 'api.performance.browser.resource.image-table',
  61. });
  62. const data =
  63. result?.data?.data.map(row => ({
  64. id: row.id as string,
  65. project: row.project as string,
  66. 'transaction.id': row['transaction.id'] as string,
  67. [SPAN_DESCRIPTION]: row[SPAN_DESCRIPTION].toString(),
  68. [SPAN_SELF_TIME]: row[SPAN_SELF_TIME] as number,
  69. [RESOURCE_RENDER_BLOCKING_STATUS]: row[RESOURCE_RENDER_BLOCKING_STATUS] as
  70. | ''
  71. | 'non-blocking'
  72. | 'blocking',
  73. // TODO - parseFloat here is temporary, we should be parsing from the backend
  74. [HTTP_RESPONSE_CONTENT_LENGTH]: parseFloat(
  75. (row[HTTP_RESPONSE_CONTENT_LENGTH] as string) || '0'
  76. ),
  77. })) ?? [];
  78. return {...result, data};
  79. };