123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import {getDateTimeParams, MetricMetaCodeLocation} from 'sentry/utils/metrics';
- import {useApiQuery} from 'sentry/utils/queryClient';
- import useOrganization from 'sentry/utils/useOrganization';
- import usePageFilters from 'sentry/utils/usePageFilters';
- type ApiResponse = {codeLocations: MetricMetaCodeLocation[]};
- export function useMetricsCodeLocations(mri: string | undefined) {
- const organization = useOrganization();
- const {selection} = usePageFilters();
- const {data, isLoading, isError, refetch} = useApiQuery<{
- codeLocations: MetricMetaCodeLocation[];
- }>(
- [
- `/organizations/${organization.slug}/ddm/meta/`,
- {
- query: {
- metric: mri,
- project: selection.projects,
- ...getDateTimeParams(selection.datetime),
- },
- },
- ],
- {
- enabled: !!mri,
- staleTime: Infinity,
- }
- );
- if (
- !data ||
- !Array.isArray(data?.codeLocations) ||
- !Array.isArray(data?.codeLocations[0]?.frames)
- ) {
- return {data, isLoading};
- }
- deduplicateCodeLocations(data);
- sortCodeLocations(data);
- return {data, isLoading, isError, refetch};
- }
- const sortCodeLocations = (data: ApiResponse) => {
- data.codeLocations.sort((a, b) => {
- return b.timestamp - a.timestamp;
- });
- };
- const deduplicateCodeLocations = (data: ApiResponse) => {
- data.codeLocations = data.codeLocations.filter((element, index) => {
- return !data.codeLocations.slice(0, index).some(e => equalCodeLocations(e, element));
- });
- };
- const equalCodeLocations = (a: MetricMetaCodeLocation, b: MetricMetaCodeLocation) => {
- if (a.mri !== b.mri) {
- return false;
- }
- const aFrame = JSON.stringify(a.frames?.[0] ?? {});
- const bFrame = JSON.stringify(b.frames?.[0] ?? {});
- return aFrame === bFrame;
- };
|