resourceSummaryCharts.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import {Fragment} from 'react';
  2. import {t} from 'sentry/locale';
  3. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  4. import {Referrer} from 'sentry/views/insights/browser/resources/referrer';
  5. import {useResourceModuleFilters} from 'sentry/views/insights/browser/resources/utils/useResourceFilters';
  6. import {InsightsLineChartWidget} from 'sentry/views/insights/common/components/insightsLineChartWidget';
  7. import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
  8. import {useSpanMetricsSeries} from 'sentry/views/insights/common/queries/useDiscoverSeries';
  9. import {
  10. getDurationChartTitle,
  11. getThroughputChartTitle,
  12. } from 'sentry/views/insights/common/views/spans/types';
  13. import {SpanMetricsField} from 'sentry/views/insights/types';
  14. import {DATA_TYPE, FIELD_ALIASES} from '../../settings';
  15. const {
  16. SPAN_SELF_TIME,
  17. HTTP_RESPONSE_CONTENT_LENGTH,
  18. HTTP_DECODED_RESPONSE_CONTENT_LENGTH,
  19. HTTP_RESPONSE_TRANSFER_SIZE,
  20. RESOURCE_RENDER_BLOCKING_STATUS,
  21. } = SpanMetricsField;
  22. function ResourceSummaryCharts(props: {groupId: string}) {
  23. const filters = useResourceModuleFilters();
  24. const mutableSearch = MutableSearch.fromQueryObject({
  25. 'span.group': props.groupId,
  26. ...(filters[RESOURCE_RENDER_BLOCKING_STATUS]
  27. ? {
  28. [RESOURCE_RENDER_BLOCKING_STATUS]: filters[RESOURCE_RENDER_BLOCKING_STATUS],
  29. }
  30. : {}),
  31. ...(filters[SpanMetricsField.USER_GEO_SUBREGION]
  32. ? {
  33. [SpanMetricsField.USER_GEO_SUBREGION]: `[${filters[SpanMetricsField.USER_GEO_SUBREGION].join(',')}]`,
  34. }
  35. : {}),
  36. });
  37. const {
  38. data: spanMetricsSeriesData,
  39. isPending: areSpanMetricsSeriesLoading,
  40. error: spanMetricsSeriesError,
  41. } = useSpanMetricsSeries(
  42. {
  43. search: mutableSearch,
  44. yAxis: [
  45. `spm()`,
  46. `avg(${SPAN_SELF_TIME})`,
  47. `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
  48. `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
  49. `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
  50. ],
  51. enabled: Boolean(props.groupId),
  52. transformAliasToInputFormat: true,
  53. },
  54. Referrer.RESOURCE_SUMMARY_CHARTS
  55. );
  56. if (spanMetricsSeriesData) {
  57. spanMetricsSeriesData[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`].lineStyle = {
  58. type: 'dashed',
  59. };
  60. spanMetricsSeriesData[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`].lineStyle = {
  61. type: 'dashed',
  62. };
  63. }
  64. return (
  65. <Fragment>
  66. <ModuleLayout.Third>
  67. <InsightsLineChartWidget
  68. title={getThroughputChartTitle('resource')}
  69. series={[spanMetricsSeriesData?.[`spm()`]]}
  70. isLoading={areSpanMetricsSeriesLoading}
  71. error={spanMetricsSeriesError}
  72. />
  73. </ModuleLayout.Third>
  74. <ModuleLayout.Third>
  75. <InsightsLineChartWidget
  76. title={getDurationChartTitle('resource')}
  77. series={[spanMetricsSeriesData?.[`avg(${SPAN_SELF_TIME})`]]}
  78. isLoading={areSpanMetricsSeriesLoading}
  79. error={spanMetricsSeriesError}
  80. />
  81. </ModuleLayout.Third>
  82. <ModuleLayout.Third>
  83. <InsightsLineChartWidget
  84. title={t('Average %s Size', DATA_TYPE)}
  85. series={[
  86. spanMetricsSeriesData?.[`avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`],
  87. spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`],
  88. spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`],
  89. ]}
  90. aliases={FIELD_ALIASES}
  91. isLoading={areSpanMetricsSeriesLoading}
  92. error={spanMetricsSeriesError}
  93. />
  94. </ModuleLayout.Third>
  95. </Fragment>
  96. );
  97. }
  98. export default ResourceSummaryCharts;