useMetricEventStats.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import type {EventsStats} from 'sentry/types/organization';
  2. import type {Project} from 'sentry/types/project';
  3. import type {DiscoverDatasets} from 'sentry/utils/discover/types';
  4. import {getPeriod} from 'sentry/utils/duration/getPeriod';
  5. import {
  6. type ApiQueryKey,
  7. useApiQuery,
  8. type UseApiQueryOptions,
  9. } from 'sentry/utils/queryClient';
  10. import {useLocation} from 'sentry/utils/useLocation';
  11. import useOrganization from 'sentry/utils/useOrganization';
  12. import type {TimePeriodType} from 'sentry/views/alerts/rules/metric/details/constants';
  13. import {
  14. getPeriodInterval,
  15. getViableDateRange,
  16. } from 'sentry/views/alerts/rules/metric/details/utils';
  17. import {Dataset, type MetricRule} from 'sentry/views/alerts/rules/metric/types';
  18. import {extractEventTypeFilterFromRule} from 'sentry/views/alerts/rules/metric/utils/getEventTypeFilter';
  19. import {getMetricDatasetQueryExtras} from 'sentry/views/alerts/rules/metric/utils/getMetricDatasetQueryExtras';
  20. import {isOnDemandMetricAlert} from 'sentry/views/alerts/rules/metric/utils/onDemandMetricAlert';
  21. interface MetricEventStatsParams {
  22. project: Project;
  23. referrer: string;
  24. rule: MetricRule;
  25. timePeriod: TimePeriodType;
  26. }
  27. export interface EventRequestQueryParams {
  28. comparisonDelta?: number;
  29. dataset?: DiscoverDatasets;
  30. end?: string;
  31. environment?: string[];
  32. excludeOther?: '1';
  33. field?: string[];
  34. interval?: string;
  35. orderby?: string;
  36. partial?: '1';
  37. project?: number[];
  38. query?: string;
  39. referrer?: string;
  40. start?: string;
  41. statsPeriod?: string;
  42. team?: string | string[];
  43. topEvents?: number;
  44. // XXX: This is the literal string 'true', not a boolean
  45. useOnDemandMetrics?: 'true';
  46. useRpc?: '1';
  47. withoutZerofill?: '1';
  48. yAxis?: string | string[];
  49. }
  50. export function useMetricEventStats(
  51. {project, rule, timePeriod, referrer}: MetricEventStatsParams,
  52. options: Partial<UseApiQueryOptions<EventsStats>> = {}
  53. ) {
  54. const organization = useOrganization();
  55. const location = useLocation();
  56. const {dataset, aggregate, query: ruleQuery, environment: ruleEnvironment} = rule;
  57. const interval = getPeriodInterval(timePeriod, rule);
  58. const isOnDemandAlert = isOnDemandMetricAlert(dataset, aggregate, ruleQuery);
  59. const eventType = extractEventTypeFilterFromRule(rule);
  60. const query =
  61. dataset === Dataset.EVENTS_ANALYTICS_PLATFORM
  62. ? ruleQuery
  63. : (ruleQuery ? `(${ruleQuery}) AND (${eventType})` : eventType).trim();
  64. const {start: viableStartDate, end: viableEndDate} = getViableDateRange({
  65. rule,
  66. interval,
  67. timePeriod,
  68. });
  69. const queryExtras: Record<string, string> = getMetricDatasetQueryExtras({
  70. organization,
  71. location,
  72. dataset,
  73. newAlertOrQuery: false,
  74. useOnDemandMetrics: isOnDemandAlert,
  75. });
  76. const queryObject: EventRequestQueryParams = Object.fromEntries(
  77. Object.entries({
  78. ...getPeriod({start: viableStartDate, end: viableEndDate}),
  79. interval,
  80. comparisonDelta: rule.comparisonDelta ? rule.comparisonDelta * 60 : undefined,
  81. project: project.id ? [Number(project.id)] : [],
  82. environment: ruleEnvironment ? [ruleEnvironment] : undefined,
  83. query,
  84. yAxis: aggregate,
  85. useRpc: dataset === Dataset.EVENTS_ANALYTICS_PLATFORM ? '1' : undefined,
  86. referrer,
  87. ...queryExtras,
  88. }).filter(([, value]) => typeof value !== 'undefined')
  89. );
  90. const queryKey: ApiQueryKey = [
  91. `/organizations/${organization.slug}/events-stats/`,
  92. {query: queryObject},
  93. ];
  94. return useApiQuery<EventsStats>(queryKey, {
  95. staleTime: 0,
  96. ...options,
  97. });
  98. }