insightsLineChartWidget.tsx 3.5 KB

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