releaseChart.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import * as React from 'react';
  2. import MiniBarChart from 'app/components/charts/miniBarChart';
  3. import {t} from 'app/locale';
  4. import {Group, Release, TimeseriesValue} from 'app/types';
  5. import {Series} from 'app/types/echarts';
  6. import {formatVersion} from 'app/utils/formatters';
  7. import theme from 'app/utils/theme';
  8. import SidebarSection from './sidebarSection';
  9. type Markers = React.ComponentProps<typeof MiniBarChart>['markers'];
  10. /**
  11. * Stats are provided indexed by statsPeriod strings.
  12. */
  13. type StatsGroup = Record<string, TimeseriesValue[]>;
  14. type Props = {
  15. group: Group;
  16. statsPeriod: string;
  17. title: string;
  18. className?: string;
  19. firstSeen?: string;
  20. lastSeen?: string;
  21. environment?: string;
  22. release?: Release;
  23. releaseStats?: StatsGroup;
  24. environmentStats?: StatsGroup;
  25. };
  26. function GroupReleaseChart(props: Props) {
  27. const {
  28. className,
  29. group,
  30. lastSeen,
  31. firstSeen,
  32. statsPeriod,
  33. release,
  34. releaseStats,
  35. environment,
  36. environmentStats,
  37. title,
  38. } = props;
  39. const stats = group.stats[statsPeriod];
  40. if (!stats || !stats.length) {
  41. return null;
  42. }
  43. const series: Series[] = [];
  44. // Add all events.
  45. series.push({
  46. seriesName: t('Events'),
  47. data: stats.map(point => ({name: point[0] * 1000, value: point[1]})),
  48. });
  49. // Get the timestamp of the first point.
  50. const firstTime = series[0].data[0].value;
  51. if (environment && environmentStats) {
  52. series.push({
  53. seriesName: t('Events in %s', environment),
  54. data: environmentStats[statsPeriod].map(point => ({
  55. name: point[0] * 1000,
  56. value: point[1],
  57. })),
  58. });
  59. }
  60. if (release && releaseStats) {
  61. series.push({
  62. seriesName: t('Events in release %s', formatVersion(release.version)),
  63. data: releaseStats[statsPeriod].map(point => ({
  64. name: point[0] * 1000,
  65. value: point[1],
  66. })),
  67. });
  68. }
  69. const markers: Markers = [];
  70. if (firstSeen) {
  71. const firstSeenX = new Date(firstSeen).getTime();
  72. if (firstSeenX >= firstTime) {
  73. markers.push({
  74. name: t('First seen'),
  75. value: firstSeenX,
  76. color: theme.pink300,
  77. });
  78. }
  79. }
  80. if (lastSeen) {
  81. const lastSeenX = new Date(lastSeen).getTime();
  82. if (lastSeenX >= firstTime) {
  83. markers.push({
  84. name: t('Last seen'),
  85. value: lastSeenX,
  86. color: theme.green300,
  87. });
  88. }
  89. }
  90. return (
  91. <SidebarSection secondary title={title} className={className}>
  92. <MiniBarChart
  93. isGroupedByDate
  94. showTimeInTooltip
  95. height={42}
  96. series={series}
  97. markers={markers}
  98. />
  99. </SidebarSection>
  100. );
  101. }
  102. export default GroupReleaseChart;