Files
2024-02-15 17:01:50 +00:00

96 lines
2.7 KiB
TypeScript

import type {Location} from 'history';
import {t} from 'sentry/locale';
import type {Organization, Project} from 'sentry/types';
import EventView from 'sentry/utils/discover/eventView';
import {isAggregateField} from 'sentry/utils/discover/fields';
import type {WebVital} from 'sentry/utils/fields';
import {WEB_VITAL_DETAILS} from 'sentry/utils/performance/vitals/constants';
import {decodeScalar} from 'sentry/utils/queryString';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
import withOrganization from 'sentry/utils/withOrganization';
import withProjects from 'sentry/utils/withProjects';
import PageLayout from '../pageLayout';
import Tab from '../tabs';
import {PERCENTILE, VITAL_GROUPS} from './constants';
import VitalsContent from './content';
type Props = {
location: Location;
organization: Organization;
projects: Project[];
};
function TransactionVitals(props: Props) {
const {location, organization, projects} = props;
return (
<PageLayout
location={location}
organization={organization}
projects={projects}
tab={Tab.WEB_VITALS}
getDocumentTitle={getDocumentTitle}
generateEventView={generateEventView}
childComponent={VitalsContent}
/>
);
}
function getDocumentTitle(transactionName: string): string {
const hasTransactionName =
typeof transactionName === 'string' && String(transactionName).trim().length > 0;
if (hasTransactionName) {
return [String(transactionName).trim(), t('Vitals')].join(' \u2014 ');
}
return [t('Summary'), t('Vitals')].join(' \u2014 ');
}
function generateEventView({
location,
transactionName,
}: {
location: Location;
transactionName: string;
}): EventView {
const query = decodeScalar(location.query.query, '');
const conditions = new MutableSearch(query);
conditions.setFilterValues('event.type', ['transaction']);
conditions.setFilterValues('transaction', [transactionName]);
Object.keys(conditions.filters).forEach(field => {
if (isAggregateField(field)) {
conditions.removeFilter(field);
}
});
const vitals = VITAL_GROUPS.reduce((allVitals: WebVital[], group) => {
return allVitals.concat(group.vitals);
}, []);
return EventView.fromNewQueryWithLocation(
{
id: undefined,
version: 2,
name: transactionName,
fields: [
...vitals.map(vital => `percentile(${vital}, ${PERCENTILE})`),
...vitals.map(vital => `count_at_least(${vital}, 0)`),
...vitals.map(
vital => `count_at_least(${vital}, ${WEB_VITAL_DETAILS[vital].poorThreshold})`
),
],
query: conditions.formatString(),
projects: [],
},
location
);
}
export default withProjects(withOrganization(TransactionVitals));