combinedAlertBadge.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import {AlertBadge} from 'sentry/components/core/badge/alertBadge';
  2. import {Tooltip} from 'sentry/components/tooltip';
  3. import {t, tct} from 'sentry/locale';
  4. import {getAggregateEnvStatus} from 'sentry/views/alerts/rules/crons/utils';
  5. import {UptimeMonitorStatus} from 'sentry/views/alerts/rules/uptime/types';
  6. import {
  7. type CombinedAlerts,
  8. CombinedAlertType,
  9. IncidentStatus,
  10. } from 'sentry/views/alerts/types';
  11. import {isIssueAlert} from 'sentry/views/alerts/utils';
  12. import {MonitorStatus} from 'sentry/views/monitors/types';
  13. interface Props {
  14. rule: CombinedAlerts;
  15. }
  16. const IncidentStatusText: Record<IncidentStatus, string> = {
  17. [IncidentStatus.CRITICAL]: t('Critical'),
  18. [IncidentStatus.WARNING]: t('Warning'),
  19. [IncidentStatus.CLOSED]: t('Resolved'),
  20. [IncidentStatus.OPENED]: t('Open'),
  21. };
  22. const UptimeStatusText: Record<
  23. UptimeMonitorStatus,
  24. {incidentStatus: IncidentStatus; statusText: string}
  25. > = {
  26. [UptimeMonitorStatus.OK]: {statusText: t('Up'), incidentStatus: IncidentStatus.CLOSED},
  27. [UptimeMonitorStatus.FAILED]: {
  28. statusText: t('Down'),
  29. incidentStatus: IncidentStatus.WARNING,
  30. },
  31. };
  32. const CronsStatusText: Record<
  33. MonitorStatus,
  34. {statusText: string; disabled?: boolean; incidentStatus?: IncidentStatus}
  35. > = {
  36. [MonitorStatus.ACTIVE]: {
  37. statusText: t('Active'),
  38. incidentStatus: IncidentStatus.CLOSED,
  39. },
  40. [MonitorStatus.OK]: {statusText: t('Ok'), incidentStatus: IncidentStatus.CLOSED},
  41. [MonitorStatus.ERROR]: {
  42. statusText: t('Failing'),
  43. incidentStatus: IncidentStatus.CRITICAL,
  44. },
  45. [MonitorStatus.DISABLED]: {
  46. statusText: t('Disabled'),
  47. disabled: true,
  48. },
  49. };
  50. /**
  51. * Takes in an alert rule (metric or issue) and renders the
  52. * appropriate tooltip and AlertBadge
  53. */
  54. export default function CombinedAlertBadge({rule}: Props) {
  55. if (rule.type === CombinedAlertType.UPTIME) {
  56. const {statusText, incidentStatus} = UptimeStatusText[rule.uptimeStatus];
  57. const disabled = rule.status === 'disabled';
  58. return (
  59. <Tooltip
  60. title={
  61. disabled
  62. ? t('Uptime monitor disabled')
  63. : tct('Uptime Alert Status: [statusText]', {statusText})
  64. }
  65. >
  66. <AlertBadge status={incidentStatus} isDisabled={disabled} />
  67. </Tooltip>
  68. );
  69. }
  70. if (rule.type === CombinedAlertType.CRONS) {
  71. const envStatus = getAggregateEnvStatus(rule.environments);
  72. const {statusText, incidentStatus, disabled} = CronsStatusText[envStatus];
  73. return (
  74. <Tooltip
  75. title={
  76. disabled
  77. ? t('Cron Monitor Disabled')
  78. : tct('Cron Monitor Status: [statusText]', {statusText})
  79. }
  80. >
  81. <AlertBadge status={incidentStatus} isDisabled={disabled} />
  82. </Tooltip>
  83. );
  84. }
  85. return (
  86. <Tooltip
  87. title={
  88. isIssueAlert(rule)
  89. ? t('Issue Alert')
  90. : tct('Metric Alert Status: [status]', {
  91. status:
  92. IncidentStatusText[rule?.latestIncident?.status ?? IncidentStatus.CLOSED],
  93. })
  94. }
  95. >
  96. <AlertBadge status={rule?.latestIncident?.status} isIssue={isIssueAlert(rule)} />
  97. </Tooltip>
  98. );
  99. }