Browse Source

feat(escalating-issues): Add archived analytics to issue stream (#49646)

Add analytics for when an issue is archived from the issue stream
Jodi Jang 1 year ago
parent
commit
7a4818aeec

+ 2 - 0
static/app/utils/analytics/issueAnalyticsEvents.tsx

@@ -136,6 +136,7 @@ export type IssueEventParameters = {
     search_source: string;
     search_type: string;
   };
+  'issues_stream.archived': {status_details?: string; substatus?: string};
   'issues_stream.issue_assigned': IssueStream & {
     assigned_type: string;
     did_assign_suggestion: boolean;
@@ -219,6 +220,7 @@ export const issueEventMap: Record<IssueEventKey, string | null> = {
   'issue_search.empty': 'Issue Search: Empty',
   'issue.search_sidebar_clicked': 'Issue Search Sidebar Clicked',
   'inbox_tab.issue_clicked': 'Clicked Issue from Inbox Tab',
+  'issues_stream.archived': 'Issues Stream: Archived',
   'issues_stream.realtime_clicked': 'Issues Stream: Realtime Clicked',
   'issues_stream.issue_clicked': 'Clicked Issue from Issues Stream',
   'issues_stream.issue_assigned': 'Assigned Issue from Issues Stream',

+ 49 - 0
static/app/views/issueList/actions/index.spec.jsx

@@ -13,6 +13,7 @@ import GlobalModal from 'sentry/components/globalModal';
 import GroupStore from 'sentry/stores/groupStore';
 import SelectedGroupStore from 'sentry/stores/selectedGroupStore';
 import {IssueCategory} from 'sentry/types';
+import * as analytics from 'sentry/utils/analytics';
 import {IssueListActions} from 'sentry/views/issueList/actions';
 
 const organization = TestStubs.Organization();
@@ -189,6 +190,7 @@ describe('IssueListActions', function () {
       });
 
       it('can ignore selected items (custom)', async function () {
+        const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics');
         const apiMock = MockApiClient.addMockResponse({
           url: '/organizations/org-slug/issues/',
           method: 'PUT',
@@ -233,10 +235,57 @@ describe('IssueListActions', function () {
             },
           })
         );
+
+        expect(analyticsSpy).toHaveBeenCalledWith(
+          'issues_stream.archived',
+          expect.objectContaining({
+            status_details: {
+              ignoreUserCount: 300,
+              ignoreUserWindow: 10080,
+            },
+          })
+        );
       });
     });
   });
 
+  it('can archive an issue until escalating', async () => {
+    const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics');
+    const org_escalating = {...organization, features: ['escalating-issues-ui']};
+    const apiMock = MockApiClient.addMockResponse({
+      url: `/organizations/${org_escalating.slug}/issues/`,
+      method: 'PUT',
+    });
+    jest.spyOn(SelectedGroupStore, 'getSelectedIds').mockReturnValue(new Set(['1']));
+
+    render(<WrappedComponent {...defaultProps} />, {organization: org_escalating});
+
+    await userEvent.click(screen.getByRole('button', {name: 'Archive'}));
+
+    expect(apiMock).toHaveBeenCalledWith(
+      expect.anything(),
+      expect.objectContaining({
+        query: {
+          id: ['1'],
+          project: [1],
+        },
+        data: {
+          status: 'ignored',
+          statusDetails: {},
+          substatus: 'archived_until_escalating',
+        },
+      })
+    );
+
+    expect(analyticsSpy).toHaveBeenCalledWith(
+      'issues_stream.archived',
+      expect.objectContaining({
+        status_details: {},
+        substatus: 'archived_until_escalating',
+      })
+    );
+  });
+
   it('can resolve but not merge issues from different projects', function () {
     jest
       .spyOn(SelectedGroupStore, 'getSelectedIds')

+ 9 - 0
static/app/views/issueList/actions/index.tsx

@@ -12,6 +12,7 @@ import SelectedGroupStore from 'sentry/stores/selectedGroupStore';
 import {useLegacyStore} from 'sentry/stores/useLegacyStore';
 import {space} from 'sentry/styles/space';
 import {Group, PageFilters} from 'sentry/types';
+import {trackAnalytics} from 'sentry/utils/analytics';
 import theme from 'sentry/utils/theme';
 import useApi from 'sentry/utils/useApi';
 import useMedia from 'sentry/utils/useMedia';
@@ -136,6 +137,14 @@ function IssueListActions({
       'issue-list-removal-action'
     );
 
+    if (data.status === 'ignored') {
+      trackAnalytics('issues_stream.archived', {
+        status_details: data.statusDetails,
+        substatus: data.substatus,
+        organization,
+      });
+    }
+
     actionSelectedGroups(itemIds => {
       // TODO(Kelly): remove once issue-list-removal-action feature is stable
       if (!hasIssueListRemovalAction) {