Skip to content

Commit 4c4b80a

Browse files
authored
feat(issues): Use the new suspect scores for flags in the event section (#91155)
Fixes getsentry/team-replay#579
1 parent 391f1c2 commit 4c4b80a

File tree

9 files changed

+48
-26
lines changed

9 files changed

+48
-26
lines changed

static/app/components/events/featureFlags/eventFeatureFlagSection.tsx

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import {
2222
sortedFlags,
2323
} from 'sentry/components/events/featureFlags/utils';
2424
import useDrawer from 'sentry/components/globalDrawer';
25+
import {useGroupSuspectFlagScores} from 'sentry/components/issues/suspect/useGroupSuspectFlagScores';
26+
import useLegacyEventSuspectFlags from 'sentry/components/issues/suspect/useLegacyEventSuspectFlags';
27+
import useSuspectFlagScoreThreshold from 'sentry/components/issues/suspect/useSuspectFlagScoreThreshold';
2528
import {KeyValueData} from 'sentry/components/keyValueData';
2629
import {featureFlagOnboardingPlatforms} from 'sentry/data/platformCategories';
2730
import {IconMegaphone, IconSearch} from 'sentry/icons';
@@ -35,10 +38,10 @@ import {useFeedbackForm} from 'sentry/utils/useFeedbackForm';
3538
import {useLocation} from 'sentry/utils/useLocation';
3639
import useOrganization from 'sentry/utils/useOrganization';
3740
import {SectionKey} from 'sentry/views/issueDetails/streamline/context';
38-
import useLegacyEventSuspectFlags from 'sentry/views/issueDetails/streamline/hooks/featureFlags/useLegacyEventSuspectFlags';
3941
import {useOrganizationFlagLog} from 'sentry/views/issueDetails/streamline/hooks/featureFlags/useOrganizationFlagLog';
4042
import {useIssueDetailsEventView} from 'sentry/views/issueDetails/streamline/hooks/useIssueDetailsDiscoverQuery';
4143
import {InterimSection} from 'sentry/views/issueDetails/streamline/interimSection';
44+
import {useEnvironmentsFromUrl} from 'sentry/views/issueDetails/utils';
4245

4346
export function EventFeatureFlagSection(props: EventFeatureFlagSectionProps) {
4447
return (
@@ -55,6 +58,9 @@ type EventFeatureFlagSectionProps = {
5558
};
5659

5760
function BaseEventFeatureFlagList({event, group, project}: EventFeatureFlagSectionProps) {
61+
const organization = useOrganization();
62+
const environments = useEnvironmentsFromUrl();
63+
5864
const openForm = useFeedbackForm();
5965
const feedbackButton = openForm ? (
6066
<Button
@@ -75,11 +81,14 @@ function BaseEventFeatureFlagList({event, group, project}: EventFeatureFlagSecti
7581
</Button>
7682
) : null;
7783

84+
// If we're showing the suspect section at all
85+
const enableSuspectFlags = organization.features.includes('feature-flag-suspect-flags');
86+
7887
const [sortBy, setSortBy] = useState<SortBy>(SortBy.EVAL_ORDER);
7988
const [orderBy, setOrderBy] = useState<OrderBy>(OrderBy.NEWEST);
8089
const {closeDrawer, isDrawerOpen, openDrawer} = useDrawer();
8190
const viewAllButtonRef = useRef<HTMLButtonElement>(null);
82-
const organization = useOrganization();
91+
8392
const eventView = useIssueDetailsEventView({group});
8493
const {data: rawFlagData} = useOrganizationFlagLog({
8594
organization,
@@ -120,22 +129,31 @@ function BaseEventFeatureFlagList({event, group, project}: EventFeatureFlagSecti
120129
[organization, queryParams]
121130
);
122131

123-
const {
124-
suspectFlags,
125-
isError: isSuspectError,
126-
isPending: isSuspectPending,
127-
} = useLegacyEventSuspectFlags({
132+
const {suspectFlags: legacySuspectFlags} = useLegacyEventSuspectFlags({
133+
enabled: !enableSuspectFlags, // Fallback to the legacy strategy
128134
organization,
129135
firstSeen: group.firstSeen,
130136
rawFlagData,
131137
event,
132138
});
133139

140+
const [suspectThreshold] = useSuspectFlagScoreThreshold();
141+
const {data: suspectScores} = useGroupSuspectFlagScores({
142+
groupId: group.id,
143+
environment: environments.length ? environments : undefined,
144+
enabled: enableSuspectFlags,
145+
});
146+
134147
const suspectFlagNames: Set<string> = useMemo(() => {
135-
return isSuspectError || isSuspectPending
136-
? new Set()
137-
: new Set(suspectFlags.map(f => f.flag));
138-
}, [isSuspectError, isSuspectPending, suspectFlags]);
148+
if (enableSuspectFlags) {
149+
return new Set(
150+
suspectScores?.data
151+
.filter(score => score.score >= suspectThreshold)
152+
.map(score => score.flag)
153+
);
154+
}
155+
return new Set(legacySuspectFlags.map(f => f.flag));
156+
}, [enableSuspectFlags, legacySuspectFlags, suspectScores?.data, suspectThreshold]);
139157

140158
const eventFlags: Array<Required<FeatureFlag>> = useMemo(() => {
141159
// At runtime there's no type guarantees on the event flags. So we have to
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const SUSPECT_SCORE_THRESHOLD = 7;

static/app/views/issueDetails/groupDistributions/suspectTable.tsx renamed to static/app/components/issues/suspect/suspectTable.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import {Alert} from 'sentry/components/core/alert';
77
import {NumberInput} from 'sentry/components/core/input/numberInput';
88
import {Tooltip} from 'sentry/components/core/tooltip';
99
import {OrderBy, SortBy} from 'sentry/components/events/featureFlags/utils';
10+
import useSuspectFlagScoreThreshold from 'sentry/components/issues/suspect/useSuspectFlagScoreThreshold';
1011
import {IconSentry} from 'sentry/icons/iconSentry';
1112
import {t} from 'sentry/locale';
1213
import {space} from 'sentry/styles/space';
1314
import type {Group} from 'sentry/types/group';
1415
import {trackAnalytics} from 'sentry/utils/analytics';
1516
import toRoundedPercent from 'sentry/utils/number/toRoundedPercent';
16-
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
1717
import useOrganization from 'sentry/utils/useOrganization';
1818
import FlagDetailsLink from 'sentry/views/issueDetails/groupFeatureFlags/details/flagDetailsLink';
1919
import useGroupFlagDrawerData from 'sentry/views/issueDetails/groupFeatureFlags/hooks/useGroupFlagDrawerData';
@@ -24,16 +24,9 @@ interface Props {
2424
group: Group;
2525
}
2626

27-
const SUSPECT_SCORE_LOCAL_STATE_KEY = 'flag-drawer-suspicion-score-threshold';
28-
const SUSPECT_SCORE_THRESHOLD = 7;
29-
3027
export default function SuspectTable({debugSuspectScores, environments, group}: Props) {
3128
const organization = useOrganization();
32-
33-
const [threshold, setThreshold] = useLocalStorageState(
34-
SUSPECT_SCORE_LOCAL_STATE_KEY,
35-
SUSPECT_SCORE_THRESHOLD
36-
);
29+
const [threshold, setThreshold] = useSuspectFlagScoreThreshold();
3730

3831
const {displayFlags, isPending} = useGroupFlagDrawerData({
3932
environments,
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ import {
2020
* B) organization audit logs (queried from /logs/).
2121
*/
2222
export default function useLegacyEventSuspectFlags({
23-
organization,
23+
enabled,
24+
event,
2425
firstSeen,
26+
organization,
2527
rawFlagData,
26-
event,
2728
}: {
29+
enabled: boolean;
2830
event: Event | undefined;
2931
firstSeen: string;
3032
organization: Organization;
@@ -57,7 +59,7 @@ export default function useLegacyEventSuspectFlags({
5759
{
5860
staleTime: 0,
5961
// if no intersection, then there are no suspect flags
60-
enabled: Boolean(intersectionFlags.length),
62+
enabled: enabled && Boolean(intersectionFlags.length),
6163
}
6264
);
6365

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import {SUSPECT_SCORE_THRESHOLD} from 'sentry/components/issues/suspect/constants';
2+
import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
3+
4+
const SUSPECT_SCORE_LOCAL_STATE_KEY = 'flag-drawer-suspicion-score-threshold';
5+
6+
export default function useSuspectFlagScoreThreshold() {
7+
return useLocalStorageState(SUSPECT_SCORE_LOCAL_STATE_KEY, SUSPECT_SCORE_THRESHOLD);
8+
}

static/app/views/issueDetails/groupDistributions/flagsDistributionDrawer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {Checkbox} from 'sentry/components/core/checkbox';
88
import {EventDrawerBody, EventNavigator} from 'sentry/components/events/eventDrawer';
99
import FeatureFlagSort from 'sentry/components/events/featureFlags/featureFlagSort';
1010
import {OrderBy, SortBy} from 'sentry/components/events/featureFlags/utils';
11+
import SuspectTable from 'sentry/components/issues/suspect/suspectTable';
1112
import {IconSentry} from 'sentry/icons/iconSentry';
1213
import {t} from 'sentry/locale';
1314
import {space} from 'sentry/styles/space';
@@ -18,7 +19,6 @@ import {useLocalStorageState} from 'sentry/utils/useLocalStorageState';
1819
import {useParams} from 'sentry/utils/useParams';
1920
import GroupDistributionsSearchInput from 'sentry/views/issueDetails/groupDistributions/groupDistributionsSearchInput';
2021
import HeaderTitle from 'sentry/views/issueDetails/groupDistributions/headerTitle';
21-
import SuspectTable from 'sentry/views/issueDetails/groupDistributions/suspectTable';
2222
import TagFlagPicker from 'sentry/views/issueDetails/groupDistributions/tagFlagPicker';
2323
import {DrawerTab} from 'sentry/views/issueDetails/groupDistributions/types';
2424
import {FlagDetailsDrawerContent} from 'sentry/views/issueDetails/groupFeatureFlags/details/flagDetailsDrawerContent';

static/app/views/issueDetails/groupDistributions/tagsDistributionDrawer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {Button} from 'sentry/components/core/button';
55
import {ButtonBar} from 'sentry/components/core/button/buttonBar';
66
import {Tooltip} from 'sentry/components/core/tooltip';
77
import {EventDrawerBody, EventNavigator} from 'sentry/components/events/eventDrawer';
8+
import SuspectTable from 'sentry/components/issues/suspect/suspectTable';
89
import {IconSort} from 'sentry/icons';
910
import type {Group} from 'sentry/types/group';
1011
import type {Organization} from 'sentry/types/organization';
@@ -13,7 +14,6 @@ import {trackAnalytics} from 'sentry/utils/analytics';
1314
import {useParams} from 'sentry/utils/useParams';
1415
import GroupDistributionsSearchInput from 'sentry/views/issueDetails/groupDistributions/groupDistributionsSearchInput';
1516
import HeaderTitle from 'sentry/views/issueDetails/groupDistributions/headerTitle';
16-
import SuspectTable from 'sentry/views/issueDetails/groupDistributions/suspectTable';
1717
import TagExportDropdown from 'sentry/views/issueDetails/groupDistributions/tagExportDropdown';
1818
import TagFlagPicker from 'sentry/views/issueDetails/groupDistributions/tagFlagPicker';
1919
import {DrawerTab} from 'sentry/views/issueDetails/groupDistributions/types';

static/app/views/issueDetails/groupFeatureFlags/hooks/useGroupFlagDrawerData.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {useMemo} from 'react';
22

33
import {OrderBy, SortBy} from 'sentry/components/events/featureFlags/utils';
4+
import {useGroupSuspectFlagScores} from 'sentry/components/issues/suspect/useGroupSuspectFlagScores';
45
import type {Group} from 'sentry/types/group';
56
import useGroupFeatureFlags from 'sentry/views/issueDetails/groupFeatureFlags/hooks/useGroupFeatureFlags';
6-
import {useGroupSuspectFlagScores} from 'sentry/views/issueDetails/groupFeatureFlags/hooks/useGroupSuspectFlagScores';
77
import type {GroupTag} from 'sentry/views/issueDetails/groupTags/useGroupTags';
88

99
interface SuspectGroupTag extends GroupTag {

0 commit comments

Comments
 (0)