index.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import styled from '@emotion/styled';
  2. import Breadcrumbs from 'sentry/components/breadcrumbs';
  3. import FeedbackWidget from 'sentry/components/feedback/widget/feedbackWidget';
  4. import * as Layout from 'sentry/components/layouts/thirds';
  5. import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
  6. import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
  7. import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
  8. import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
  9. import {t} from 'sentry/locale';
  10. import {useLocation} from 'sentry/utils/useLocation';
  11. import useOrganization from 'sentry/utils/useOrganization';
  12. import {useParams} from 'sentry/utils/useParams';
  13. import {normalizeUrl} from 'sentry/utils/withDomainRequired';
  14. import {FilterOptionsContainer} from 'sentry/views/performance/browser/resources/jsCssView';
  15. import ResourceInfo from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceInfo';
  16. import ResourceSummaryCharts from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceSummaryCharts';
  17. import ResourceSummaryTable from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceSummaryTable';
  18. import RenderBlockingSelector from 'sentry/views/performance/browser/resources/shared/renderBlockingSelector';
  19. import {useResourceModuleFilters} from 'sentry/views/performance/browser/resources/utils/useResourceFilters';
  20. import {ModulePageProviders} from 'sentry/views/performance/database/modulePageProviders';
  21. import {useSpanMetrics} from 'sentry/views/starfish/queries/useSpanMetrics';
  22. import {SpanMetricsField} from 'sentry/views/starfish/types';
  23. import {SampleList} from 'sentry/views/starfish/views/spanSummaryPage/sampleList';
  24. const {
  25. SPAN_SELF_TIME,
  26. SPAN_DESCRIPTION,
  27. HTTP_DECODED_RESPONSE_CONTENT_LENGTH,
  28. HTTP_RESPONSE_CONTENT_LENGTH,
  29. HTTP_RESPONSE_TRANSFER_SIZE,
  30. RESOURCE_RENDER_BLOCKING_STATUS,
  31. } = SpanMetricsField;
  32. function ResourceSummary() {
  33. const organization = useOrganization();
  34. const {groupId} = useParams();
  35. const filters = useResourceModuleFilters();
  36. const {
  37. query: {transaction},
  38. } = useLocation();
  39. const {data: spanMetrics} = useSpanMetrics(
  40. {
  41. 'span.group': groupId,
  42. },
  43. [
  44. `avg(${SPAN_SELF_TIME})`,
  45. `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
  46. `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
  47. `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
  48. `sum(${SPAN_SELF_TIME})`,
  49. 'spm()',
  50. SPAN_DESCRIPTION,
  51. 'time_spent_percentage()',
  52. ]
  53. );
  54. return (
  55. <ModulePageProviders
  56. title={[t('Performance'), t('Resources'), t('Resource Summary')].join(' — ')}
  57. >
  58. <Layout.Header>
  59. <Layout.HeaderContent>
  60. <Breadcrumbs
  61. crumbs={[
  62. {
  63. label: 'Performance',
  64. to: normalizeUrl(`/organizations/${organization.slug}/performance/`),
  65. preservePageFilters: true,
  66. },
  67. {
  68. label: 'Resources',
  69. to: normalizeUrl(
  70. `/organizations/${organization.slug}/performance/browser/resources/`
  71. ),
  72. preservePageFilters: true,
  73. },
  74. {
  75. label: 'Resource Summary',
  76. },
  77. ]}
  78. />
  79. <Layout.Title>{spanMetrics[SpanMetricsField.SPAN_DESCRIPTION]}</Layout.Title>
  80. </Layout.HeaderContent>
  81. </Layout.Header>
  82. <Layout.Body>
  83. <Layout.Main fullWidth>
  84. <FeedbackWidget />
  85. <HeaderContainer>
  86. <FilterOptionsContainer>
  87. <PageFilterBar condensed>
  88. <ProjectPageFilter />
  89. <EnvironmentPageFilter />
  90. <DatePageFilter />
  91. </PageFilterBar>
  92. <RenderBlockingSelector
  93. value={filters[RESOURCE_RENDER_BLOCKING_STATUS] || ''}
  94. />
  95. </FilterOptionsContainer>
  96. <ResourceInfo
  97. avgContentLength={spanMetrics[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`]}
  98. avgDecodedContentLength={
  99. spanMetrics[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`]
  100. }
  101. avgTransferSize={spanMetrics[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`]}
  102. avgDuration={spanMetrics[`avg(${SPAN_SELF_TIME})`]}
  103. throughput={spanMetrics['spm()']}
  104. timeSpentTotal={spanMetrics[`sum(${SPAN_SELF_TIME})`]}
  105. timeSpentPercentage={spanMetrics[`time_spent_percentage()`]}
  106. />
  107. </HeaderContainer>
  108. <ResourceSummaryCharts groupId={groupId} />
  109. <ResourceSummaryTable />
  110. <SampleList
  111. transactionRoute="/performance/browser/pageloads/"
  112. groupId={groupId}
  113. transactionName={transaction as string}
  114. additionalFields={[HTTP_RESPONSE_CONTENT_LENGTH]}
  115. />
  116. </Layout.Main>
  117. </Layout.Body>
  118. </ModulePageProviders>
  119. );
  120. }
  121. const HeaderContainer = styled('div')`
  122. display: flex;
  123. justify-content: space-between;
  124. flex-wrap: wrap;
  125. `;
  126. export default ResourceSummary;