import { css } from '@emotion/css'; import React, { FC } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '@grafana/ui'; import { CombinedRule } from 'app/types/unified-alerting'; import { isRecordingRulerRule } from '../../utils/rules'; 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 const INSTANCES_DISPLAY_LIMIT = 15; export const RuleDetails: FC = ({ rule }) => { const styles = useStyles2(getStyles); const { namespace: { rulesSource }, } = rule; const annotations = Object.entries(rule.annotations).filter(([_, value]) => !!value.trim()); 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; // recording rules don't have a for duration if (!isRecordingRulerRule(rule.rulerRule)) { forDuration = rule.rulerRule?.for; } return ( <> {every && ( Every {every} )} {forDuration && ( {forDuration} )} ); }; 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; } `, });