import { css } from '@emotion/css'; import { GrafanaTheme2, dateTime, dateTimeFormat } from '@grafana/data'; import { Tooltip, useStyles2 } from '@grafana/ui'; import { Time } from 'app/features/explore/Time'; import { CombinedRule } from 'app/types/unified-alerting'; import { usePendingPeriod } from '../../hooks/rules/usePendingPeriod'; import { useCleanAnnotations } from '../../utils/annotations'; import { isGrafanaRecordingRule, isRecordingRule, isRecordingRulerRule } from '../../utils/rules'; import { isNullDate } from '../../utils/time'; import { AlertLabels } from '../AlertLabels'; import { DetailsField } from '../DetailsField'; import { RuleDetailsAnnotations } from './RuleDetailsAnnotations'; import RuleDetailsButtons from './RuleDetailsButtons'; import { RuleDetailsDataSources } from './RuleDetailsDataSources'; import { RuleDetailsExpression } from './RuleDetailsExpression'; import { RuleDetailsMatchingInstances } from './RuleDetailsMatchingInstances'; interface Props { rule: CombinedRule; } // The limit is set to 15 in order to upkeep the good performance // and to encourage users to go to the rule details page to see the rest of the instances // We don't want to paginate the instances list on the alert list page export const INSTANCES_DISPLAY_LIMIT = 15; export const RuleDetails = ({ rule }: Props) => { const styles = useStyles2(getStyles); const { namespace: { rulesSource }, } = rule; const annotations = useCleanAnnotations(rule.annotations); return (
{} {!!rule.labels && !!Object.keys(rule.labels).length && ( )}
{!( isRecordingRulerRule(rule.rulerRule) || isRecordingRule(rule.promRule) || isGrafanaRecordingRule(rule.rulerRule) ) && ( )}
); }; interface EvaluationBehaviorSummaryProps { rule: CombinedRule; } const EvaluationBehaviorSummary = ({ rule }: EvaluationBehaviorSummaryProps) => { const every = rule.group.interval; const lastEvaluation = rule.promRule?.lastEvaluation; const lastEvaluationDuration = rule.promRule?.evaluationTime; const metric = isGrafanaRecordingRule(rule.rulerRule) ? rule.rulerRule?.grafana_alert.record?.metric : undefined; const pendingPeriod = usePendingPeriod(rule); return ( <> {metric && ( {metric} )} {every && ( Every {every} )} {pendingPeriod && ( {pendingPeriod} )} {lastEvaluation && !isNullDate(lastEvaluation) && ( {`${dateTime(lastEvaluation).locale('en').fromNow(true)} ago`} )} {lastEvaluation && !isNullDate(lastEvaluation) && lastEvaluationDuration !== undefined && ( {Time({ timeInMs: lastEvaluationDuration * 1000, humanize: true })} )} ); }; export const getStyles = (theme: GrafanaTheme2) => ({ wrapper: css({ display: 'flex', flexDirection: 'row', [theme.breakpoints.down('md')]: { flexDirection: 'column', }, }), leftSide: css({ flex: 1, }), rightSide: css({ [theme.breakpoints.up('md')]: { paddingLeft: '90px', width: '300px', }, }), });