useMetricsMeta.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {useMemo} from 'react';
  2. import type {PageFilters} from 'sentry/types/core';
  3. import {formatMRI, getUseCaseFromMRI} from 'sentry/utils/metrics/mri';
  4. import type {ApiQueryKey} from 'sentry/utils/queryClient';
  5. import {useApiQuery} from 'sentry/utils/queryClient';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import type {MetricMeta, MRI, UseCase} from '../../types/metrics';
  8. const DEFAULT_USE_CASES: UseCase[] = ['sessions', 'transactions', 'custom', 'spans'];
  9. export function getMetricsMetaQueryKey(
  10. orgSlug: string,
  11. {projects}: Partial<PageFilters>,
  12. useCase?: UseCase[]
  13. ): ApiQueryKey {
  14. const queryParams = projects?.length ? {useCase, project: projects} : {useCase};
  15. return [`/organizations/${orgSlug}/metrics/meta/`, {query: queryParams}];
  16. }
  17. export function useMetricsMeta(
  18. pageFilters: Partial<PageFilters>,
  19. useCases: UseCase[] = DEFAULT_USE_CASES,
  20. filterBlockedMetrics = true,
  21. enabled: boolean = true
  22. ): {data: MetricMeta[]; isLoading: boolean; isRefetching: boolean; refetch: () => void} {
  23. const {slug} = useOrganization();
  24. const {data, isLoading, isRefetching, refetch} = useApiQuery<MetricMeta[]>(
  25. getMetricsMetaQueryKey(slug, pageFilters, useCases),
  26. {
  27. enabled,
  28. staleTime: 2000, // 2 seconds to cover page load
  29. }
  30. );
  31. const meta = useMemo(
  32. () => (data ?? []).sort((a, b) => formatMRI(a.mri).localeCompare(formatMRI(b.mri))),
  33. [data]
  34. );
  35. const filteredMeta = useMemo(
  36. () =>
  37. filterBlockedMetrics
  38. ? meta.filter(entry => {
  39. return entry.blockingStatus?.every(({isBlocked}) => !isBlocked) ?? true;
  40. })
  41. : meta,
  42. [filterBlockedMetrics, meta]
  43. );
  44. return {
  45. data: filteredMeta,
  46. isLoading,
  47. isRefetching,
  48. refetch,
  49. };
  50. }
  51. export function useProjectMetric(mri: MRI, projectId: number) {
  52. const useCase = getUseCaseFromMRI(mri);
  53. const res = useMetricsMeta({projects: [projectId]}, [useCase ?? 'custom'], false);
  54. const metricMeta = res.data?.find(({mri: metaMri}) => metaMri === mri);
  55. const blockingStatus = metricMeta?.blockingStatus?.[0];
  56. return {...res, data: {...metricMeta, blockingStatus}};
  57. }