useProfileEventsStats.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. continuousProfilingCompat?: boolean;
  13. datetime?: PageFilters['datetime'];
  14. enabled?: boolean;
  15. interval?: string;
  16. query?: string;
  17. }
  18. export function useProfileEventsStats<F extends string>({
  19. continuousProfilingCompat,
  20. dataset,
  21. datetime,
  22. interval,
  23. query,
  24. referrer,
  25. yAxes,
  26. enabled = true,
  27. }: UseProfileEventsStatsOptions<F>) {
  28. const organization = useOrganization();
  29. const {selection} = usePageFilters();
  30. // when using the profiles dataset and the feature flag is enabled,
  31. // switch over to the discover dataset under the hood
  32. if (dataset === 'profiles') {
  33. dataset = 'discover';
  34. }
  35. if (dataset === 'discover') {
  36. if (continuousProfilingCompat) {
  37. query = `(has:profile.id OR (has:profiler.id has:thread.id)) ${query ? `(${query})` : ''}`;
  38. } else {
  39. query = `has:profile.id ${query ? `(${query})` : ''}`;
  40. }
  41. }
  42. const path = `/organizations/${organization.slug}/events-stats/`;
  43. const endpointOptions = {
  44. query: {
  45. dataset,
  46. referrer,
  47. project: selection.projects,
  48. environment: selection.environments,
  49. ...normalizeDateTimeParams(datetime ?? selection.datetime),
  50. yAxis: yAxes,
  51. interval,
  52. query,
  53. },
  54. };
  55. const {data, ...rest} = useApiQuery<any>([path, endpointOptions], {
  56. enabled,
  57. staleTime: Infinity,
  58. });
  59. const transformed = useMemo(
  60. () => data && transformStatsResponse(dataset, yAxes, data),
  61. [yAxes, data, dataset]
  62. );
  63. return {
  64. data: transformed,
  65. ...rest,
  66. };
  67. }