mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-10-30 14:49:14 +00:00
96 lines
2.7 KiB
TypeScript
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));
|