useMetricsCodeLocations.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import {getDateTimeParams, MetricMetaCodeLocation} from 'sentry/utils/metrics';
  2. import {useApiQuery} from 'sentry/utils/queryClient';
  3. import useOrganization from 'sentry/utils/useOrganization';
  4. import usePageFilters from 'sentry/utils/usePageFilters';
  5. type ApiResponse = {codeLocations: MetricMetaCodeLocation[]};
  6. export function useMetricsCodeLocations(mri: string | undefined) {
  7. const organization = useOrganization();
  8. const {selection} = usePageFilters();
  9. const {data, isLoading, isError, refetch} = useApiQuery<{
  10. codeLocations: MetricMetaCodeLocation[];
  11. }>(
  12. [
  13. `/organizations/${organization.slug}/ddm/meta/`,
  14. {
  15. query: {
  16. metric: mri,
  17. project: selection.projects,
  18. ...getDateTimeParams(selection.datetime),
  19. },
  20. },
  21. ],
  22. {
  23. enabled: !!mri,
  24. staleTime: Infinity,
  25. }
  26. );
  27. if (
  28. !data ||
  29. !Array.isArray(data?.codeLocations) ||
  30. !Array.isArray(data?.codeLocations[0]?.frames)
  31. ) {
  32. return {data, isLoading};
  33. }
  34. deduplicateCodeLocations(data);
  35. sortCodeLocations(data);
  36. return {data, isLoading, isError, refetch};
  37. }
  38. const sortCodeLocations = (data: ApiResponse) => {
  39. data.codeLocations.sort((a, b) => {
  40. return b.timestamp - a.timestamp;
  41. });
  42. };
  43. const deduplicateCodeLocations = (data: ApiResponse) => {
  44. data.codeLocations = data.codeLocations.filter((element, index) => {
  45. return !data.codeLocations.slice(0, index).some(e => equalCodeLocations(e, element));
  46. });
  47. };
  48. const equalCodeLocations = (a: MetricMetaCodeLocation, b: MetricMetaCodeLocation) => {
  49. if (a.mri !== b.mri) {
  50. return false;
  51. }
  52. const aFrame = JSON.stringify(a.frames?.[0] ?? {});
  53. const bFrame = JSON.stringify(b.frames?.[0] ?? {});
  54. return aFrame === bFrame;
  55. };