useResourceDomansQuery.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import * as Sentry from '@sentry/react';
  2. import {useDiscoverQuery} from 'sentry/utils/discover/discoverQuery';
  3. import EventView from 'sentry/utils/discover/eventView';
  4. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  5. import {useLocation} from 'sentry/utils/useLocation';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import usePageFilters from 'sentry/utils/usePageFilters';
  8. import {useResourceModuleFilters} from 'sentry/views/performance/browser/resources/utils/useResourceFilters';
  9. import {
  10. DEFAULT_RESOURCE_FILTERS,
  11. getResourceTypeFilter,
  12. } from 'sentry/views/performance/browser/resources/utils/useResourcesQuery';
  13. import {SpanMetricsField} from 'sentry/views/starfish/types';
  14. const {SPAN_DOMAIN, SPAN_OP, TRANSACTION} = SpanMetricsField;
  15. /**
  16. * Gets a list of pages that have a resource.
  17. */
  18. export const useResourceDomainsQuery = (defaultResourceTypes?: string[]) => {
  19. const location = useLocation();
  20. const pageFilters = usePageFilters();
  21. const {slug: orgSlug} = useOrganization();
  22. const resourceFilters = useResourceModuleFilters();
  23. const fields = [SPAN_DOMAIN, 'count()']; // count() is only here because an aggregation is required for the query to work
  24. const queryConditions = [
  25. ...DEFAULT_RESOURCE_FILTERS,
  26. `has:${SPAN_DOMAIN}`,
  27. ...getResourceTypeFilter(resourceFilters[SPAN_OP], defaultResourceTypes),
  28. ...(resourceFilters[TRANSACTION]
  29. ? [`transaction:${resourceFilters[TRANSACTION]}`]
  30. : []),
  31. ];
  32. const eventView = EventView.fromNewQueryWithPageFilters(
  33. {
  34. fields, // for some reason we need a function, otherwise the query fails
  35. name: 'Resource module - page selector',
  36. version: 2,
  37. query: queryConditions.join(' '),
  38. dataset: DiscoverDatasets.SPANS_METRICS,
  39. },
  40. pageFilters.selection
  41. );
  42. const result = useDiscoverQuery({
  43. eventView,
  44. referrer: 'api.performance.browser.resources.page-selector',
  45. location,
  46. orgSlug,
  47. limit: 100,
  48. });
  49. const data: string[] =
  50. result?.data?.data
  51. .map(row => {
  52. const domains = row[SPAN_DOMAIN] as any as string[];
  53. if (domains?.length > 1) {
  54. Sentry.captureException(new Error('More than one domain found in a resource'));
  55. }
  56. return domains[0].toString();
  57. })
  58. .filter(domain => domain !== '*')
  59. .sort() || [];
  60. return {...result, data};
  61. };