useProfileEventsStats.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import {useMemo} from 'react';
  2. import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
  3. import type {PageFilters} from 'sentry/types';
  4. import {transformStatsResponse} from 'sentry/utils/profiling/hooks/utils';
  5. import {useApiQuery} from 'sentry/utils/queryClient';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import usePageFilters from 'sentry/utils/usePageFilters';
  8. interface UseProfileEventsStatsOptions<F> {
  9. dataset: 'discover' | 'profiles' | 'profileFunctions';
  10. referrer: string;
  11. yAxes: readonly F[];
  12. datetime?: PageFilters['datetime'];
  13. enabled?: boolean;
  14. interval?: string;
  15. query?: string;
  16. }
  17. export function useProfileEventsStats<F extends string>({
  18. dataset,
  19. datetime,
  20. interval,
  21. query,
  22. referrer,
  23. yAxes,
  24. enabled = true,
  25. }: UseProfileEventsStatsOptions<F>) {
  26. const organization = useOrganization();
  27. const {selection} = usePageFilters();
  28. // when using the profiles dataset and the feature flag is enabled,
  29. // switch over to the discover dataset under the hood
  30. if (
  31. dataset === 'profiles' &&
  32. organization.features.includes('profiling-using-transactions')
  33. ) {
  34. dataset = 'discover';
  35. }
  36. if (dataset === 'discover') {
  37. query = `has:profile.id ${query ? `(${query})` : ''}`;
  38. }
  39. const path = `/organizations/${organization.slug}/events-stats/`;
  40. const endpointOptions = {
  41. query: {
  42. dataset,
  43. referrer,
  44. project: selection.projects,
  45. environment: selection.environments,
  46. ...normalizeDateTimeParams(datetime ?? selection.datetime),
  47. yAxis: yAxes,
  48. interval,
  49. query,
  50. },
  51. };
  52. const {data, ...rest} = useApiQuery<any>([path, endpointOptions], {
  53. enabled,
  54. staleTime: Infinity,
  55. });
  56. const transformed = useMemo(
  57. () => data && transformStatsResponse(dataset, yAxes, data),
  58. [yAxes, data, dataset]
  59. );
  60. return {
  61. data: transformed,
  62. ...rest,
  63. };
  64. }