123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- import {Fragment} from 'react';
- import type {Location} from 'history';
- import IdBadge from 'sentry/components/idBadge';
- import * as Layout from 'sentry/components/layouts/thirds';
- import type {Organization} from 'sentry/types/organization';
- import type {Project} from 'sentry/types/project';
- import type {SpanSlug} from 'sentry/utils/performance/suspectSpans/types';
- import useRouteAnalyticsEventNames from 'sentry/utils/routeAnalytics/useRouteAnalyticsEventNames';
- import useRouteAnalyticsParams from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
- import {MutableSearch} from 'sentry/utils/tokenizeSearch';
- import {useLocation} from 'sentry/utils/useLocation';
- import {useParams} from 'sentry/utils/useParams';
- import Breadcrumb from 'sentry/views/performance/breadcrumb';
- import {SpanSummaryReferrer} from 'sentry/views/performance/transactionSummary/transactionSpans/spanSummary/referrers';
- import SpanSummaryCharts from 'sentry/views/performance/transactionSummary/transactionSpans/spanSummary/spanSummaryCharts';
- import SpanSummaryTable from 'sentry/views/performance/transactionSummary/transactionSpans/spanSummary/spanSummaryTable';
- import {getSelectedProjectPlatforms} from 'sentry/views/performance/utils';
- import {useSpanMetrics} from 'sentry/views/starfish/queries/useDiscover';
- import type {SpanMetricsQueryFilters} from 'sentry/views/starfish/types';
- import Tab from '../../tabs';
- import SpanSummaryControls from './spanSummaryControls';
- import SpanSummaryHeader from './spanSummaryHeader';
- type Props = {
- organization: Organization;
- project: Project | undefined;
- spanSlug: SpanSlug;
- transactionName: string;
- };
- export default function SpanSummary(props: Props) {
- const {organization, project, transactionName, spanSlug} = props;
- const location = useLocation();
- // customize the route analytics event we send
- useRouteAnalyticsEventNames(
- 'performance_views.span_summary.view',
- 'Performance Views: Span Summary page viewed'
- );
- useRouteAnalyticsParams({
- project_platforms: project ? getSelectedProjectPlatforms(location, [project]) : '',
- });
- return (
- <Fragment>
- <Layout.Header>
- <Layout.HeaderContent>
- <Breadcrumb
- organization={organization}
- location={location}
- transaction={{
- project: project?.id ?? '',
- name: transactionName,
- }}
- tab={Tab.SPANS}
- spanSlug={spanSlug}
- />
- <Layout.Title>
- {project && (
- <IdBadge
- project={project}
- avatarSize={28}
- hideName
- avatarProps={{hasTooltip: true, tooltip: project.slug}}
- />
- )}
- {transactionName}
- </Layout.Title>
- </Layout.HeaderContent>
- </Layout.Header>
- <Layout.Body>
- <Layout.Main fullWidth>
- <SpanSummaryContent
- location={location}
- organization={organization}
- project={project}
- transactionName={transactionName}
- />
- </Layout.Main>
- </Layout.Body>
- </Fragment>
- );
- }
- type ContentProps = {
- location: Location;
- organization: Organization;
- project: Project | undefined;
- transactionName: string;
- };
- function SpanSummaryContent(props: ContentProps) {
- const {transactionName, project} = props;
- const {spanSlug: spanParam} = useParams();
- const [spanOp, groupId] = spanParam.split(':');
- const filters: SpanMetricsQueryFilters = {
- 'span.group': groupId,
- 'span.op': spanOp,
- transaction: transactionName,
- };
- const {data: spanHeaderData} = useSpanMetrics(
- {
- search: MutableSearch.fromQueryObject(filters),
- fields: [
- 'span.description',
- 'avg(span.duration)',
- 'sum(span.self_time)',
- 'count()',
- ],
- },
- SpanSummaryReferrer.SPAN_SUMMARY_HEADER_DATA
- );
- const description = spanHeaderData[0]?.['span.description'];
- const timeSpent = spanHeaderData[0]?.['sum(span.self_time)'];
- const avgDuration = spanHeaderData[0]?.['avg(span.duration)'];
- const spanCount = spanHeaderData[0]?.['count()'];
- return (
- <Fragment>
- <SpanSummaryControls />
- <SpanSummaryHeader
- spanOp={spanOp}
- spanDescription={description}
- avgDuration={avgDuration}
- timeSpent={timeSpent}
- spanCount={spanCount}
- />
- <SpanSummaryCharts />
- <SpanSummaryTable project={project} />
- </Fragment>
- );
- }
|