Browse Source

feat(profiling): Add profile column to supported perf issue all event… (#47189)

…s tab

If a platform supports profiling, we should show the `profile` column in
the all events tab of the issue.

Closes getsentry/team-profiling#230
Tony Xiao 1 year ago
parent
commit
f95c9c7130

+ 3 - 3
static/app/data/platformCategories.tsx

@@ -215,7 +215,7 @@ export const withoutPerformanceSupport: Set<PlatformKey> = new Set([
   'minidump',
 ]);
 
-export const profiling = [
+export const profiling: PlatformKey[] = [
   // mobile
   'android',
   'apple-ios',
@@ -225,7 +225,7 @@ export const profiling = [
   'node-koa',
   'node-connect',
   'javascript-nextjs',
-  // python, WSGI only
+  // python
   'python',
   'python-django',
   'python-flask',
@@ -244,7 +244,7 @@ export const profiling = [
   'php',
   'php-laravel',
   'php-symfony2',
-] as const;
+];
 
 export const releaseHealth: PlatformKey[] = [
   // frontend

+ 21 - 4
static/app/views/issueDetails/allEventsTable.tsx

@@ -2,7 +2,11 @@ import {useEffect, useState} from 'react';
 import {Location} from 'history';
 
 import LoadingError from 'sentry/components/loadingError';
-import {PlatformCategory, PlatformKey} from 'sentry/data/platformCategories';
+import {
+  PlatformCategory,
+  PlatformKey,
+  profiling as PROFILING_PLATFORMS,
+} from 'sentry/data/platformCategories';
 import {t} from 'sentry/locale';
 import {Group, IssueCategory, Organization} from 'sentry/types';
 import EventView, {decodeSorts} from 'sentry/utils/discover/eventView';
@@ -79,8 +83,15 @@ const getColumns = (group: Group, organization: Organization): ColumnInfo => {
   const isPerfIssue = group.issueCategory === IssueCategory.PERFORMANCE;
   const isReplayEnabled = organization.features.includes('session-replay');
 
+  // profiles only exist on transactions, so this only works with
+  // performance issues, and not errors
+  const isProfilingEnabled = isPerfIssue && organization.features.includes('profiling');
+
   const {fields: platformSpecificFields, columnTitles: platformSpecificColumnTitles} =
-    getPlatformColumns(group.project.platform ?? group.platform, {isReplayEnabled});
+    getPlatformColumns(group.project.platform ?? group.platform, {
+      isProfilingEnabled,
+      isReplayEnabled,
+    });
 
   const fields: string[] = [
     'id',
@@ -119,7 +130,7 @@ const getColumns = (group: Group, organization: Organization): ColumnInfo => {
 
 const getPlatformColumns = (
   platform: PlatformKey | undefined,
-  options: {isReplayEnabled: boolean}
+  options: {isProfilingEnabled: boolean; isReplayEnabled: boolean}
 ): ColumnInfo => {
   const replayField = options.isReplayEnabled ? ['replayId'] : [];
   const replayColumnTitle = options.isReplayEnabled ? [t('replay')] : [];
@@ -151,8 +162,14 @@ const getPlatformColumns = (
   };
 
   const platformCategory = platformToCategory(platform);
+  const platformColumns = categoryToColumnMap[platformCategory];
+
+  if (options.isProfilingEnabled && platform && PROFILING_PLATFORMS.includes(platform)) {
+    platformColumns.columnTitles.push(t('profile'));
+    platformColumns.fields.push('profile.id');
+  }
 
-  return categoryToColumnMap[platformCategory];
+  return platformColumns;
 };
 
 export default AllEventsTable;