import styled from '@emotion/styled'; import Feature from 'sentry/components/acl/feature'; import * as Layout from 'sentry/components/layouts/thirds'; import {NoAccess} from 'sentry/components/noAccess'; import {DatePageFilter} from 'sentry/components/organizations/datePageFilter'; import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter'; import PageFilterBar from 'sentry/components/organizations/pageFilterBar'; import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter'; import TransactionNameSearchBar from 'sentry/components/performance/searchBar'; import * as TeamKeyTransactionManager from 'sentry/components/performance/teamKeyTransactionsManager'; import {trackAnalytics} from 'sentry/utils/analytics'; import { canUseMetricsData, useMEPSettingContext, } from 'sentry/utils/performance/contexts/metricsEnhancedSetting'; import {PageAlert, usePageAlert} from 'sentry/utils/performance/contexts/pageAlert'; import {PerformanceDisplayProvider} from 'sentry/utils/performance/contexts/performanceDisplayContext'; import {MutableSearch} from 'sentry/utils/tokenizeSearch'; import {useLocation} from 'sentry/utils/useLocation'; import {useNavigate} from 'sentry/utils/useNavigate'; import useOrganization from 'sentry/utils/useOrganization'; import useProjects from 'sentry/utils/useProjects'; import {useUserTeams} from 'sentry/utils/useUserTeams'; import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout'; import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon'; import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject'; import {ViewTrendsButton} from 'sentry/views/insights/common/viewTrendsButton'; import {DomainOverviewPageProviders} from 'sentry/views/insights/pages/domainOverviewPageProviders'; import {MobileHeader} from 'sentry/views/insights/pages/mobile/mobilePageHeader'; import { MOBILE_LANDING_TITLE, OVERVIEW_PAGE_ALLOWED_OPS, } from 'sentry/views/insights/pages/mobile/settings'; import { generateGenericPerformanceEventView, generateMobilePerformanceEventView, } from 'sentry/views/performance/data'; import {checkIsReactNative} from 'sentry/views/performance/landing/utils'; import { DoubleChartRow, TripleChartRow, } from 'sentry/views/performance/landing/widgets/components/widgetChartRow'; import {filterAllowedChartsMetrics} from 'sentry/views/performance/landing/widgets/utils'; import {PerformanceWidgetSetting} from 'sentry/views/performance/landing/widgets/widgetDefinitions'; import Onboarding from 'sentry/views/performance/onboarding'; import Table from 'sentry/views/performance/table'; import { getTransactionSearchQuery, ProjectPerformanceType, } from 'sentry/views/performance/utils'; const MOBILE_COLUMN_TITLES = [ 'transaction', 'operation', 'project', 'tpm', 'slow frame %', 'frozen frame %', 'users', 'user misery', ]; const REACT_NATIVE_COLUMN_TITLES = [ 'transaction', 'operation', 'project', 'tpm', 'slow frame %', 'frozen frame %', 'stall %', 'users', 'user misery', ]; function MobileOverviewPage() { const organization = useOrganization(); const location = useLocation(); const {setPageError} = usePageAlert(); const {projects} = useProjects(); const onboardingProject = useOnboardingProject(); const navigate = useNavigate(); const {teams} = useUserTeams(); const mepSetting = useMEPSettingContext(); const withStaticFilters = canUseMetricsData(organization); const eventView = generateMobilePerformanceEventView( location, projects, generateGenericPerformanceEventView(location, withStaticFilters, organization), withStaticFilters, organization ); let columnTitles = checkIsReactNative(eventView) ? REACT_NATIVE_COLUMN_TITLES : MOBILE_COLUMN_TITLES; const doubleChartRowEventView = eventView.clone(); // some of the double chart rows rely on span metrics, so they can't be queried the same way const existingQuery = new MutableSearch(eventView.query); existingQuery.addDisjunctionFilterValues('transaction.op', OVERVIEW_PAGE_ALLOWED_OPS); eventView.query = existingQuery.formatString(); const showOnboarding = onboardingProject !== undefined; const doubleChartRowCharts = [ PerformanceWidgetSetting.MOST_SLOW_FRAMES, PerformanceWidgetSetting.MOST_FROZEN_FRAMES, ]; const tripleChartRowCharts = filterAllowedChartsMetrics( organization, [ PerformanceWidgetSetting.TPM_AREA, PerformanceWidgetSetting.DURATION_HISTOGRAM, PerformanceWidgetSetting.P50_DURATION_AREA, PerformanceWidgetSetting.P75_DURATION_AREA, PerformanceWidgetSetting.P95_DURATION_AREA, PerformanceWidgetSetting.P99_DURATION_AREA, PerformanceWidgetSetting.FAILURE_RATE_AREA, ], mepSetting ); if (organization.features.includes('mobile-vitals')) { columnTitles = [...columnTitles.slice(0, 5), 'ttid', ...columnTitles.slice(5, 0)]; tripleChartRowCharts.push( ...[ PerformanceWidgetSetting.TIME_TO_INITIAL_DISPLAY, PerformanceWidgetSetting.TIME_TO_FULL_DISPLAY, ] ); } if (organization.features.includes('insights-initial-modules')) { doubleChartRowCharts[0] = PerformanceWidgetSetting.SLOW_SCREENS_BY_TTID; } if (organization.features.includes('starfish-mobile-appstart')) { doubleChartRowCharts.push( PerformanceWidgetSetting.SLOW_SCREENS_BY_COLD_START, PerformanceWidgetSetting.SLOW_SCREENS_BY_WARM_START ); } if (organization.features.includes('insights-initial-modules')) { doubleChartRowCharts.push(PerformanceWidgetSetting.MOST_TIME_CONSUMING_DOMAINS); } const sharedProps = {eventView, location, organization, withStaticFilters}; const getFreeTextFromQuery = (query: string) => { const conditions = new MutableSearch(query); const transactionValues = conditions.getFilterValues('transaction'); if (transactionValues.length) { return transactionValues[0]; } if (conditions.freeText.length > 0) { // raw text query will be wrapped in wildcards in generatePerformanceEventView // so no need to wrap it here return conditions.freeText.join(' '); } return ''; }; function handleSearch(searchQuery: string) { trackAnalytics('performance.domains.mobile.search', {organization}); navigate({ pathname: location.pathname, query: { ...location.query, cursor: undefined, query: String(searchQuery).trim() || undefined, isDefaultQuery: false, }, }); } const derivedQuery = getTransactionSearchQuery(location, eventView.query); return ( } /> {!showOnboarding && ( { handleSearch(query); }} query={getFreeTextFromQuery(derivedQuery)} /> )} {!showOnboarding && ( )} {showOnboarding && ( )} ); } function MobileOverviewPageWithProviders() { return ( ); } const StyledTransactionNameSearchBar = styled(TransactionNameSearchBar)` flex: 2; `; export default MobileOverviewPageWithProviders;