useMetricSessionStats.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import type {SessionApiResponse} from 'sentry/types/organization';
  2. import type {Project} from 'sentry/types/project';
  3. import {
  4. type ApiQueryKey,
  5. useApiQuery,
  6. type UseApiQueryOptions,
  7. } from 'sentry/utils/queryClient';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import type {TimePeriodType} from 'sentry/views/alerts/rules/metric/details/constants';
  10. import {
  11. getPeriodInterval,
  12. getViableDateRange,
  13. } from 'sentry/views/alerts/rules/metric/details/utils';
  14. import type {MetricRule} from 'sentry/views/alerts/rules/metric/types';
  15. import {SESSION_AGGREGATE_TO_FIELD} from 'sentry/views/alerts/utils';
  16. interface MetricSessionStatsParams {
  17. project: Project;
  18. rule: MetricRule;
  19. timePeriod: TimePeriodType;
  20. }
  21. export function useMetricSessionStats(
  22. {project, rule, timePeriod}: MetricSessionStatsParams,
  23. options: Partial<UseApiQueryOptions<SessionApiResponse>> = {}
  24. ) {
  25. const organization = useOrganization();
  26. const {aggregate, query, environment} = rule;
  27. const interval = getPeriodInterval(timePeriod, rule);
  28. const {start: viableStartDate, end: viableEndDate} = getViableDateRange({
  29. rule,
  30. interval,
  31. timePeriod,
  32. });
  33. const queryKey: ApiQueryKey = [
  34. `/organizations/${organization.slug}/sessions/`,
  35. {
  36. query: {
  37. project: project.id ? [Number(project.id)] : [],
  38. environment,
  39. field: SESSION_AGGREGATE_TO_FIELD[aggregate],
  40. query,
  41. groupBy: ['session.status'],
  42. start: viableStartDate,
  43. end: viableEndDate,
  44. interval,
  45. },
  46. },
  47. ];
  48. return useApiQuery<SessionApiResponse>(queryKey, {
  49. staleTime: 0,
  50. ...options,
  51. });
  52. }