resourceSummaryCharts.tsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {Series} from 'sentry/types/echarts';
  2. import {formatBytesBase2} from 'sentry/utils';
  3. import getDynamicText from 'sentry/utils/getDynamicText';
  4. import {AVG_COLOR} from 'sentry/views/starfish/colours';
  5. import Chart from 'sentry/views/starfish/components/chart';
  6. import ChartPanel from 'sentry/views/starfish/components/chartPanel';
  7. import {useSpanMetricsSeries} from 'sentry/views/starfish/queries/useSpanMetricsSeries';
  8. import {SpanMetricsField} from 'sentry/views/starfish/types';
  9. import {DataTitles, getDurationChartTitle} from 'sentry/views/starfish/views/spans/types';
  10. import {Block, BlockContainer} from 'sentry/views/starfish/views/spanSummaryPage/block';
  11. const {SPAN_SELF_TIME, HTTP_RESPONSE_CONTENT_LENGTH} = SpanMetricsField;
  12. function ResourceSummaryCharts(props: {groupId: string}) {
  13. const {data: spanMetricsSeriesData, isLoading: areSpanMetricsSeriesLoading} =
  14. useSpanMetricsSeries(props.groupId, {}, [
  15. `avg(${SPAN_SELF_TIME})`,
  16. `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
  17. ]);
  18. return (
  19. <BlockContainer>
  20. <Block>
  21. <ChartPanel title={getDurationChartTitle('http')}>
  22. <Chart
  23. height={160}
  24. data={[spanMetricsSeriesData?.[`avg(${SPAN_SELF_TIME})`]]}
  25. loading={areSpanMetricsSeriesLoading}
  26. utc={false}
  27. chartColors={[AVG_COLOR]}
  28. isLineChart
  29. definedAxisTicks={4}
  30. />
  31. </ChartPanel>
  32. </Block>
  33. <Block>
  34. <ChartPanel title={DataTitles['avg(http.response_content_length)']}>
  35. <Chart
  36. height={160}
  37. data={[spanMetricsSeriesData?.[`avg(${HTTP_RESPONSE_CONTENT_LENGTH})`]]}
  38. loading={areSpanMetricsSeriesLoading}
  39. utc={false}
  40. chartColors={[AVG_COLOR]}
  41. isLineChart
  42. definedAxisTicks={4}
  43. tooltipFormatterOptions={{
  44. valueFormatter: bytes =>
  45. getDynamicText({
  46. value: formatBytesBase2(bytes),
  47. fixed: 'xx KiB',
  48. }),
  49. }}
  50. />
  51. </ChartPanel>
  52. </Block>
  53. </BlockContainer>
  54. );
  55. }
  56. /**
  57. * Ensures a series has no zeros between two non-zero datapoints. This is useful in
  58. * @param series the series to fill
  59. * @returns a reference to the initial series filled
  60. */
  61. export const fillSeries = (series: Series): Series => {
  62. if (!series.data.length) {
  63. return series;
  64. }
  65. let lastSeenValue = series.data[0].value;
  66. return {
  67. ...series,
  68. data: series.data.map(dataPoint => {
  69. const value = dataPoint.value;
  70. if (value !== lastSeenValue && value !== 0) {
  71. lastSeenValue = value;
  72. return {...dataPoint};
  73. }
  74. return {...dataPoint, value: lastSeenValue};
  75. }),
  76. };
  77. };
  78. export default ResourceSummaryCharts;