destinationSummaryPage.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import FeatureBadge from 'sentry/components/badge/featureBadge';
  4. import {Breadcrumbs} from 'sentry/components/breadcrumbs';
  5. import ButtonBar from 'sentry/components/buttonBar';
  6. import FeedbackWidgetButton from 'sentry/components/feedback/widget/feedbackWidgetButton';
  7. import * as Layout from 'sentry/components/layouts/thirds';
  8. import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
  9. import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
  10. import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
  11. import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
  12. import {t} from 'sentry/locale';
  13. import {space} from 'sentry/styles/space';
  14. import {DurationUnit} from 'sentry/utils/discover/fields';
  15. import {decodeScalar} from 'sentry/utils/queryString';
  16. import {useLocation} from 'sentry/utils/useLocation';
  17. import useOrganization from 'sentry/utils/useOrganization';
  18. import {normalizeUrl} from 'sentry/utils/withDomainRequired';
  19. import {useOnboardingProject} from 'sentry/views/performance/browser/webVitals/utils/useOnboardingProject';
  20. import {MetricReadout} from 'sentry/views/performance/metricReadout';
  21. import * as ModuleLayout from 'sentry/views/performance/moduleLayout';
  22. import {ModulePageProviders} from 'sentry/views/performance/modulePageProviders';
  23. import Onboarding from 'sentry/views/performance/onboarding';
  24. import {LatencyChart} from 'sentry/views/performance/queues/charts/latencyChart';
  25. import {ThroughputChart} from 'sentry/views/performance/queues/charts/throughputChart';
  26. import {TransactionsTable} from 'sentry/views/performance/queues/destinationSummary/transactionsTable';
  27. import {MessageConsumerSamplesPanel} from 'sentry/views/performance/queues/messageConsumerSamplesPanel';
  28. import {useQueuesMetricsQuery} from 'sentry/views/performance/queues/queries/useQueuesMetricsQuery';
  29. import {
  30. DESTINATION_TITLE,
  31. MODULE_TITLE,
  32. RELEASE_LEVEL,
  33. } from 'sentry/views/performance/queues/settings';
  34. function DestinationSummaryPage() {
  35. const organization = useOrganization();
  36. const onboardingProject = useOnboardingProject();
  37. const {query} = useLocation();
  38. const destination = decodeScalar(query.destination);
  39. const {data} = useQueuesMetricsQuery({destination});
  40. return (
  41. <Fragment>
  42. <Layout.Header>
  43. <Layout.HeaderContent>
  44. <Breadcrumbs
  45. crumbs={[
  46. {
  47. label: t('Performance'),
  48. to: normalizeUrl(`/organizations/${organization.slug}/performance/`),
  49. preservePageFilters: true,
  50. },
  51. {
  52. label: MODULE_TITLE,
  53. to: normalizeUrl(
  54. `/organizations/${organization.slug}/performance/queues/`
  55. ),
  56. preservePageFilters: true,
  57. },
  58. {
  59. label: DESTINATION_TITLE,
  60. },
  61. ]}
  62. />
  63. <Layout.Title>
  64. {destination}
  65. <FeatureBadge type={RELEASE_LEVEL} />
  66. </Layout.Title>
  67. </Layout.HeaderContent>
  68. <Layout.HeaderActions>
  69. <ButtonBar gap={1}>
  70. <FeedbackWidgetButton />
  71. </ButtonBar>
  72. </Layout.HeaderActions>
  73. </Layout.Header>
  74. <Layout.Body>
  75. <Layout.Main fullWidth>
  76. <ModuleLayout.Layout>
  77. <ModuleLayout.Full>
  78. <HeaderContainer>
  79. <PageFilterBar condensed>
  80. <ProjectPageFilter />
  81. <EnvironmentPageFilter />
  82. <DatePageFilter />
  83. </PageFilterBar>
  84. {!onboardingProject && (
  85. <MetricsRibbon>
  86. <MetricReadout
  87. title={t('Avg Time In Queue')}
  88. value={data[0]?.['avg(messaging.message.receive.latency)']}
  89. unit={DurationUnit.MILLISECOND}
  90. isLoading={false}
  91. />
  92. <MetricReadout
  93. title={t('Avg Processing Time')}
  94. value={data[0]?.['avg_if(span.duration,span.op,queue.process)']}
  95. unit={DurationUnit.MILLISECOND}
  96. isLoading={false}
  97. />
  98. <MetricReadout
  99. title={t('Error Rate')}
  100. value={undefined}
  101. unit={'percentage'}
  102. isLoading={false}
  103. />
  104. <MetricReadout
  105. title={t('Published')}
  106. value={data[0]?.['count_op(queue.publish)']}
  107. unit={'count'}
  108. isLoading={false}
  109. />
  110. <MetricReadout
  111. title={t('Processed')}
  112. value={data[0]?.['count_op(queue.process)']}
  113. unit={'count'}
  114. isLoading={false}
  115. />
  116. <MetricReadout
  117. title={t('Time Spent')}
  118. value={data[0]?.['sum(span.duration)']}
  119. unit={DurationUnit.MILLISECOND}
  120. isLoading={false}
  121. />
  122. </MetricsRibbon>
  123. )}
  124. </HeaderContainer>
  125. </ModuleLayout.Full>
  126. {onboardingProject && (
  127. <Onboarding organization={organization} project={onboardingProject} />
  128. )}
  129. {!onboardingProject && (
  130. <Fragment>
  131. <ModuleLayout.Half>
  132. <LatencyChart />
  133. </ModuleLayout.Half>
  134. <ModuleLayout.Half>
  135. <ThroughputChart />
  136. </ModuleLayout.Half>
  137. <ModuleLayout.Full>
  138. <Flex>
  139. <TransactionsTable />
  140. </Flex>
  141. </ModuleLayout.Full>
  142. </Fragment>
  143. )}
  144. </ModuleLayout.Layout>
  145. </Layout.Main>
  146. </Layout.Body>
  147. <MessageConsumerSamplesPanel />
  148. </Fragment>
  149. );
  150. }
  151. function DestinationSummaryPageWithProviders() {
  152. return (
  153. <ModulePageProviders
  154. title={[t('Performance'), MODULE_TITLE].join(' — ')}
  155. baseURL="/performance/queues"
  156. features="performance-queues-view"
  157. >
  158. <DestinationSummaryPage />
  159. </ModulePageProviders>
  160. );
  161. }
  162. export default DestinationSummaryPageWithProviders;
  163. const Flex = styled('div')`
  164. display: flex;
  165. flex-direction: column;
  166. gap: ${space(2)};
  167. `;
  168. const MetricsRibbon = styled('div')`
  169. display: flex;
  170. flex-wrap: wrap;
  171. gap: ${space(4)};
  172. `;
  173. const HeaderContainer = styled('div')`
  174. display: flex;
  175. justify-content: space-between;
  176. `;