import { css } from '@emotion/css'; import React from 'react'; import { GrafanaTheme2, dateTime, dateTimeFormat } from '@grafana/data'; import { useStyles2, Tooltip } from '@grafana/ui'; import { Time } from 'app/features/explore/Time'; import { CombinedRule } from 'app/types/unified-alerting'; import { useCleanAnnotations } from '../../utils/annotations'; import { isRecordingRulerRule } from '../../utils/rules'; import { isNullDate } from '../../utils/time'; import { AlertLabels } from '../AlertLabels'; import { DetailsField } from '../DetailsField'; import { RuleDetailsActionButtons } from './RuleDetailsActionButtons'; import { RuleDetailsAnnotations } from './RuleDetailsAnnotations'; 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 && ( )}
); }; interface EvaluationBehaviorSummaryProps { rule: CombinedRule; } const EvaluationBehaviorSummary = ({ rule }: EvaluationBehaviorSummaryProps) => { let forDuration: string | undefined; let every = rule.group.interval; let lastEvaluation = rule.promRule?.lastEvaluation; let lastEvaluationDuration = rule.promRule?.evaluationTime; // recording rules don't have a for duration if (!isRecordingRulerRule(rule.rulerRule)) { forDuration = rule.rulerRule?.for; } return ( <> {every && ( Every {every} )} {forDuration && ( {forDuration} )} {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; flex-direction: row; ${theme.breakpoints.down('md')} { flex-direction: column; } `, leftSide: css` flex: 1; `, rightSide: css` ${theme.breakpoints.up('md')} { padding-left: 90px; width: 300px; } `, });