insightsAreaChartWidget.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import styled from '@emotion/styled';
  2. import {openInsightChartModal} from 'sentry/actionCreators/modal';
  3. import ReleaseSeries from 'sentry/components/charts/releaseSeries';
  4. import {CHART_PALETTE} from 'sentry/constants/chartPalette';
  5. import usePageFilters from 'sentry/utils/usePageFilters';
  6. import {
  7. AreaChartWidget,
  8. type AreaChartWidgetProps,
  9. } from 'sentry/views/dashboards/widgets/areaChartWidget/areaChartWidget';
  10. import {
  11. AreaChartWidgetVisualization,
  12. type AreaChartWidgetVisualizationProps,
  13. } from 'sentry/views/dashboards/widgets/areaChartWidget/areaChartWidgetVisualization';
  14. import type {Aliases} from 'sentry/views/dashboards/widgets/common/types';
  15. import {THROUGHPUT_COLOR} from '../../colors';
  16. import type {DiscoverSeries} from '../queries/useDiscoverSeries';
  17. import {convertSeriesToTimeseries} from '../utils/convertSeriesToTimeseries';
  18. interface InsightsAreaChartWidgetProps
  19. extends Pick<AreaChartWidgetProps, 'title' | 'isLoading'> {
  20. aliases: Aliases;
  21. error: AreaChartWidgetProps['error'] | null;
  22. series: DiscoverSeries[];
  23. }
  24. export function InsightsAreaChartWidget(props: InsightsAreaChartWidgetProps) {
  25. const pageFilters = usePageFilters();
  26. const {start, end, period, utc} = pageFilters.selection.datetime;
  27. const {projects, environments} = pageFilters.selection;
  28. const visualizationProps: AreaChartWidgetVisualizationProps = {
  29. timeseries: (props.series.filter(Boolean) ?? [])?.map(serie => {
  30. const timeserie = convertSeriesToTimeseries(serie);
  31. return {
  32. ...timeserie,
  33. color: serie.color ?? COMMON_COLORS[timeserie.field],
  34. };
  35. }),
  36. aliases: props.aliases,
  37. };
  38. return (
  39. <ChartContainer>
  40. <AreaChartWidget
  41. title={props.title}
  42. isLoading={props.isLoading}
  43. error={props.error ?? undefined}
  44. {...visualizationProps}
  45. onFullScreenViewClick={() => {
  46. openInsightChartModal({
  47. title: props.title,
  48. children: (
  49. <ReleaseSeries
  50. start={start}
  51. end={end}
  52. queryExtra={undefined}
  53. period={period}
  54. utc={utc}
  55. projects={projects}
  56. environments={environments}
  57. >
  58. {({releases}) => {
  59. return (
  60. <ModalChartContainer>
  61. <AreaChartWidgetVisualization
  62. {...visualizationProps}
  63. releases={
  64. releases
  65. ? releases.map(release => ({
  66. timestamp: release.date,
  67. version: release.version,
  68. }))
  69. : []
  70. }
  71. />
  72. </ModalChartContainer>
  73. );
  74. }}
  75. </ReleaseSeries>
  76. ),
  77. });
  78. }}
  79. />
  80. </ChartContainer>
  81. );
  82. }
  83. const COMMON_COLORS: Record<string, string> = {
  84. 'spm()': THROUGHPUT_COLOR,
  85. 'avg(messaging.message.receive.latency)': CHART_PALETTE[2][1],
  86. 'avg(span.duration)': CHART_PALETTE[2][2],
  87. };
  88. const ChartContainer = styled('div')`
  89. height: 220px;
  90. `;
  91. const ModalChartContainer = styled('div')`
  92. height: 360px;
  93. `;