resourceSummaryCharts.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import {t, tct} from 'sentry/locale';
  2. import {formatBytesBase2} from 'sentry/utils/bytes/formatBytesBase2';
  3. import {formatRate} from 'sentry/utils/formatters';
  4. import getDynamicText from 'sentry/utils/getDynamicText';
  5. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  6. import {RESOURCE_THROUGHPUT_UNIT} from 'sentry/views/performance/browser/resources';
  7. import {Referrer} from 'sentry/views/performance/browser/resources/referrer';
  8. import {DATA_TYPE} from 'sentry/views/performance/browser/resources/settings';
  9. import {useResourceModuleFilters} from 'sentry/views/performance/browser/resources/utils/useResourceFilters';
  10. import {AVG_COLOR, THROUGHPUT_COLOR} from 'sentry/views/starfish/colors';
  11. import Chart, {ChartType} from 'sentry/views/starfish/components/chart';
  12. import ChartPanel from 'sentry/views/starfish/components/chartPanel';
  13. import {useSpanMetricsSeries} from 'sentry/views/starfish/queries/useDiscoverSeries';
  14. import {SpanMetricsField} from 'sentry/views/starfish/types';
  15. import {
  16. DataTitles,
  17. getDurationChartTitle,
  18. getThroughputChartTitle,
  19. } from 'sentry/views/starfish/views/spans/types';
  20. import {Block, BlockContainer} from 'sentry/views/starfish/views/spanSummaryPage/block';
  21. const {
  22. SPAN_SELF_TIME,
  23. HTTP_RESPONSE_CONTENT_LENGTH,
  24. HTTP_DECODED_RESPONSE_CONTENT_LENGTH,
  25. HTTP_RESPONSE_TRANSFER_SIZE,
  26. RESOURCE_RENDER_BLOCKING_STATUS,
  27. } = SpanMetricsField;
  28. function ResourceSummaryCharts(props: {groupId: string}) {
  29. const filters = useResourceModuleFilters();
  30. const {data: spanMetricsSeriesData, isLoading: areSpanMetricsSeriesLoading} =
  31. useSpanMetricsSeries(
  32. {
  33. search: MutableSearch.fromQueryObject({
  34. 'span.group': props.groupId,
  35. ...(filters[RESOURCE_RENDER_BLOCKING_STATUS]
  36. ? {
  37. [RESOURCE_RENDER_BLOCKING_STATUS]:
  38. filters[RESOURCE_RENDER_BLOCKING_STATUS],
  39. }
  40. : {}),
  41. }),
  42. yAxis: [
  43. `spm()`,
  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. ],
  49. enabled: Boolean(props.groupId),
  50. },
  51. Referrer.RESOURCE_SUMMARY_CHARTS
  52. );
  53. if (spanMetricsSeriesData) {
  54. spanMetricsSeriesData[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`].lineStyle = {
  55. type: 'dashed',
  56. };
  57. spanMetricsSeriesData[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`].lineStyle = {
  58. type: 'dashed',
  59. };
  60. }
  61. return (
  62. <BlockContainer>
  63. <Block>
  64. <ChartPanel title={getThroughputChartTitle('http', RESOURCE_THROUGHPUT_UNIT)}>
  65. <Chart
  66. height={160}
  67. data={[spanMetricsSeriesData?.[`spm()`]]}
  68. loading={areSpanMetricsSeriesLoading}
  69. type={ChartType.LINE}
  70. definedAxisTicks={4}
  71. aggregateOutputFormat="rate"
  72. rateUnit={RESOURCE_THROUGHPUT_UNIT}
  73. stacked
  74. chartColors={[THROUGHPUT_COLOR]}
  75. tooltipFormatterOptions={{
  76. valueFormatter: value => formatRate(value, RESOURCE_THROUGHPUT_UNIT),
  77. nameFormatter: () => t('Requests'),
  78. }}
  79. />
  80. </ChartPanel>
  81. </Block>
  82. <Block>
  83. <ChartPanel title={getDurationChartTitle('http')}>
  84. <Chart
  85. height={160}
  86. data={[spanMetricsSeriesData?.[`avg(${SPAN_SELF_TIME})`]]}
  87. loading={areSpanMetricsSeriesLoading}
  88. chartColors={[AVG_COLOR]}
  89. type={ChartType.LINE}
  90. definedAxisTicks={4}
  91. />
  92. </ChartPanel>
  93. </Block>
  94. <Block>
  95. <ChartPanel title={tct('Average [dataType] Size', {dataType: DATA_TYPE})}>
  96. <Chart
  97. height={160}
  98. aggregateOutputFormat="size"
  99. data={[
  100. spanMetricsSeriesData?.[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`],
  101. spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`],
  102. spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`],
  103. ]}
  104. loading={areSpanMetricsSeriesLoading}
  105. chartColors={[AVG_COLOR]}
  106. type={ChartType.LINE}
  107. definedAxisTicks={4}
  108. tooltipFormatterOptions={{
  109. valueFormatter: bytes =>
  110. getDynamicText({
  111. value: formatBytesBase2(bytes),
  112. fixed: 'xx KiB',
  113. }),
  114. nameFormatter: name => DataTitles[name],
  115. }}
  116. />
  117. </ChartPanel>
  118. </Block>
  119. </BlockContainer>
  120. );
  121. }
  122. export default ResourceSummaryCharts;