resourceSummaryCharts.tsx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import {Fragment} from 'react';
  2. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  3. import {Referrer} from 'sentry/views/insights/browser/resources/referrer';
  4. import {useResourceModuleFilters} from 'sentry/views/insights/browser/resources/utils/useResourceFilters';
  5. import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
  6. import {useSpanMetricsSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
  7. import {SpanMetricsField} from 'sentry/views/insights/types';
  8. import {AssetSizeChart} from './assetSizeChart';
  9. import {DurationChart} from './durationChart';
  10. import {ThroughputChart} from './throughputChart';
  11. const {
  12. SPAN_SELF_TIME,
  13. HTTP_RESPONSE_CONTENT_LENGTH,
  14. HTTP_DECODED_RESPONSE_CONTENT_LENGTH,
  15. HTTP_RESPONSE_TRANSFER_SIZE,
  16. RESOURCE_RENDER_BLOCKING_STATUS,
  17. } = SpanMetricsField;
  18. function ResourceSummaryCharts(props: {groupId: string}) {
  19. const filters = useResourceModuleFilters();
  20. const mutableSearch = MutableSearch.fromQueryObject({
  21. 'span.group': props.groupId,
  22. ...(filters[RESOURCE_RENDER_BLOCKING_STATUS]
  23. ? {
  24. [RESOURCE_RENDER_BLOCKING_STATUS]: filters[RESOURCE_RENDER_BLOCKING_STATUS],
  25. }
  26. : {}),
  27. ...(filters[SpanMetricsField.USER_GEO_SUBREGION]
  28. ? {
  29. [SpanMetricsField.USER_GEO_SUBREGION]: `[${filters[SpanMetricsField.USER_GEO_SUBREGION].join(',')}]`,
  30. }
  31. : {}),
  32. });
  33. const {data: spanMetricsSeriesData, isPending: areSpanMetricsSeriesLoading} =
  34. useSpanMetricsSeries(
  35. {
  36. search: mutableSearch,
  37. yAxis: [
  38. `spm()`,
  39. `avg(${SPAN_SELF_TIME})`,
  40. `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
  41. `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
  42. `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
  43. ],
  44. enabled: Boolean(props.groupId),
  45. },
  46. Referrer.RESOURCE_SUMMARY_CHARTS
  47. );
  48. if (spanMetricsSeriesData) {
  49. spanMetricsSeriesData[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`].lineStyle = {
  50. type: 'dashed',
  51. };
  52. spanMetricsSeriesData[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`].lineStyle = {
  53. type: 'dashed',
  54. };
  55. }
  56. return (
  57. <Fragment>
  58. <ModuleLayout.Third>
  59. <ThroughputChart
  60. series={spanMetricsSeriesData?.[`spm()`]}
  61. isLoading={areSpanMetricsSeriesLoading}
  62. />
  63. </ModuleLayout.Third>
  64. <ModuleLayout.Third>
  65. <DurationChart
  66. series={[spanMetricsSeriesData?.[`avg(${SPAN_SELF_TIME})`]]}
  67. isLoading={areSpanMetricsSeriesLoading}
  68. />
  69. </ModuleLayout.Third>
  70. <ModuleLayout.Third>
  71. <AssetSizeChart
  72. series={[
  73. spanMetricsSeriesData?.[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`],
  74. spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`],
  75. spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`],
  76. ]}
  77. isLoading={areSpanMetricsSeriesLoading}
  78. />
  79. </ModuleLayout.Third>
  80. </Fragment>
  81. );
  82. }
  83. export default ResourceSummaryCharts;