Skip to content

Commit

Permalink
[RAM] Update Rule Status - UI Changes (#144466)
Browse files Browse the repository at this point in the history
## Summary
Parent issue for updating rule status:
#136039
Frontend issue: #145191

Backend PR: #140882

Updates the rules list and rules details page to support the new
consolidated statuses. With E2E and unit testing.

Rules list:
- Table cell values
- Last response filter
- Table cell filtering
- Status aggregations

Rule details:
- Rule status summary
- KPI headers renaming
- Event log cells renaming


![dashdash](https://user-images.githubusercontent.com/74562234/201778676-775f58e9-6707-4972-a1ca-2dcf71befc5b.png)


![rule_details_consolidate](https://user-images.githubusercontent.com/74562234/201778792-f03c368a-3b0d-43cf-805e-f8151b4b96ae.png)

### Checklist
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios

Co-authored-by: Xavier Mouligneau <[email protected]>
Co-authored-by: kibanamachine <[email protected]>
  • Loading branch information
3 people authored Nov 15, 2022
1 parent 9cd5c0d commit 256e1f8
Show file tree
Hide file tree
Showing 41 changed files with 1,255 additions and 289 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const getMockRule = () => {
error: null,
},
monitoring: {
execution: {
run: {
history: [
{
success: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export const StorybookContextDecorator: React.FC<StorybookContextDecoratorProps>
ruleTagFilter: true,
ruleStatusFilter: true,
rulesDetailLogs: true,
ruleLastRunOutcome: true,
},
});
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const allowedExperimentalValues = Object.freeze({
ruleTagFilter: true,
ruleStatusFilter: true,
rulesDetailLogs: true,
ruleLastRunOutcome: true,
});

type ExperimentalConfigKeys = Array<keyof ExperimentalFeatures>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ interface UseBulkEditSelectProps {
actionTypesFilter?: string[];
tagsFilter?: string[];
ruleExecutionStatusesFilter?: string[];
ruleLastRunOutcomesFilter?: string[];
ruleStatusesFilter?: RuleStatus[];
searchText?: string;
}
Expand All @@ -89,6 +90,7 @@ export function useBulkEditSelect(props: UseBulkEditSelectProps) {
actionTypesFilter,
tagsFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
searchText,
} = props;
Expand Down Expand Up @@ -187,6 +189,7 @@ export function useBulkEditSelect(props: UseBulkEditSelectProps) {
actionTypesFilter,
tagsFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
searchText,
});
Expand All @@ -208,6 +211,7 @@ export function useBulkEditSelect(props: UseBulkEditSelectProps) {
actionTypesFilter,
tagsFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
searchText,
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,21 @@

import { i18n } from '@kbn/i18n';
import { useState, useCallback, useMemo } from 'react';
import { RuleExecutionStatusValues } from '@kbn/alerting-plugin/common';
import { RuleExecutionStatusValues, RuleLastRunOutcomeValues } from '@kbn/alerting-plugin/common';
import type { LoadRuleAggregationsProps } from '../lib/rule_api';
import { loadRuleAggregationsWithKueryFilter } from '../lib/rule_api/aggregate_kuery_filter';
import { useKibana } from '../../common/lib/kibana';

const initializeAggregationResult = (values: readonly string[]) => {
return values.reduce<Record<string, number>>(
(prev: Record<string, number>, status: string) => ({
...prev,
[status]: 0,
}),
{}
);
};

type UseLoadRuleAggregationsProps = Omit<LoadRuleAggregationsProps, 'http'> & {
onError: (message: string) => void;
};
Expand All @@ -21,22 +31,21 @@ export function useLoadRuleAggregations({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
onError,
}: UseLoadRuleAggregationsProps) {
const { http } = useKibana().services;

const [rulesStatusesTotal, setRulesStatusesTotal] = useState<Record<string, number>>(
RuleExecutionStatusValues.reduce<Record<string, number>>(
(prev: Record<string, number>, status: string) => ({
...prev,
[status]: 0,
}),
{}
)
initializeAggregationResult(RuleExecutionStatusValues)
);

const [rulesLastRunOutcomesTotal, setRulesLastRunOutcomesTotal] = useState<
Record<string, number>
>(initializeAggregationResult(RuleLastRunOutcomeValues));

const internalLoadRuleAggregations = useCallback(async () => {
try {
const rulesAggs = await loadRuleAggregationsWithKueryFilter({
Expand All @@ -45,12 +54,16 @@ export function useLoadRuleAggregations({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
});
if (rulesAggs?.ruleExecutionStatus) {
setRulesStatusesTotal(rulesAggs.ruleExecutionStatus);
}
if (rulesAggs?.ruleLastRunOutcome) {
setRulesLastRunOutcomesTotal(rulesAggs.ruleLastRunOutcome);
}
} catch (e) {
onError(
i18n.translate(
Expand All @@ -67,18 +80,28 @@ export function useLoadRuleAggregations({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
onError,
setRulesStatusesTotal,
setRulesLastRunOutcomesTotal,
]);

return useMemo(
() => ({
loadRuleAggregations: internalLoadRuleAggregations,
rulesStatusesTotal,
rulesLastRunOutcomesTotal,
setRulesStatusesTotal,
setRulesLastRunOutcomesTotal,
}),
[internalLoadRuleAggregations, rulesStatusesTotal, setRulesStatusesTotal]
[
internalLoadRuleAggregations,
rulesStatusesTotal,
rulesLastRunOutcomesTotal,
setRulesStatusesTotal,
setRulesLastRunOutcomesTotal,
]
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ export function useLoadRules({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
sort,
Expand Down Expand Up @@ -120,6 +121,7 @@ export function useLoadRules({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
sort,
Expand All @@ -144,6 +146,7 @@ export function useLoadRules({
hasEmptyTypesFilter &&
isEmpty(actionTypesFilter) &&
isEmpty(ruleExecutionStatusesFilter) &&
isEmpty(ruleLastRunOutcomesFilter) &&
isEmpty(ruleStatusesFilter) &&
isEmpty(tagsFilter)
);
Expand All @@ -168,6 +171,7 @@ export function useLoadRules({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
sort,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface RuleTagsAggregations {

export const rewriteBodyRes: RewriteRequestCase<RuleAggregations> = ({
rule_execution_status: ruleExecutionStatus,
rule_last_run_outcome: ruleLastRunOutcome,
rule_enabled_status: ruleEnabledStatus,
rule_muted_status: ruleMutedStatus,
rule_snoozed_status: ruleSnoozedStatus,
Expand All @@ -26,6 +27,7 @@ export const rewriteBodyRes: RewriteRequestCase<RuleAggregations> = ({
ruleEnabledStatus,
ruleMutedStatus,
ruleSnoozedStatus,
ruleLastRunOutcome,
ruleTags,
});

Expand All @@ -41,6 +43,7 @@ export interface LoadRuleAggregationsProps {
typesFilter?: string[];
actionTypesFilter?: string[];
ruleExecutionStatusesFilter?: string[];
ruleLastRunOutcomesFilter?: string[];
ruleStatusesFilter?: RuleStatus[];
tagsFilter?: string[];
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/
import { RuleExecutionStatus } from '@kbn/alerting-plugin/common';
import { AsApiContract, RewriteRequestCase } from '@kbn/actions-plugin/common';
import { Rule, RuleAction, ResolvedRule } from '../../../types';
import { Rule, RuleAction, ResolvedRule, RuleLastRun } from '../../../types';

const transformAction: RewriteRequestCase<RuleAction> = ({
group,
Expand All @@ -30,6 +30,16 @@ const transformExecutionStatus: RewriteRequestCase<RuleExecutionStatus> = ({
...rest,
});

const transformLastRun: RewriteRequestCase<RuleLastRun> = ({
outcome_msg: outcomeMsg,
alerts_count: alertsCount,
...rest
}) => ({
outcomeMsg,
alertsCount,
...rest,
});

export const transformRule: RewriteRequestCase<Rule> = ({
rule_type_id: ruleTypeId,
created_by: createdBy,
Expand All @@ -46,6 +56,8 @@ export const transformRule: RewriteRequestCase<Rule> = ({
snooze_schedule: snoozeSchedule,
is_snoozed_until: isSnoozedUntil,
active_snoozes: activeSnoozes,
last_run: lastRun,
next_run: nextRun,
...rest
}: any) => ({
ruleTypeId,
Expand All @@ -65,6 +77,8 @@ export const transformRule: RewriteRequestCase<Rule> = ({
scheduledTaskId,
isSnoozedUntil,
activeSnoozes,
...(lastRun ? { lastRun: transformLastRun(lastRun) } : {}),
...(nextRun ? { nextRun } : {}),
...rest,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ import { transformRule } from './common_transformations';

type RuleCreateBody = Omit<
RuleUpdates,
'createdBy' | 'updatedBy' | 'muteAll' | 'mutedInstanceIds' | 'executionStatus'
| 'createdBy'
| 'updatedBy'
| 'muteAll'
| 'mutedInstanceIds'
| 'executionStatus'
| 'lastRun'
| 'nextRun'
>;
const rewriteBodyRequest: RewriteResponseCase<RuleCreateBody> = ({
ruleTypeId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,30 @@ describe('mapFiltersToKueryNode', () => {
);
});

test('should handle ruleLastRunOutcomesFilter', () => {
expect(
toElasticsearchQuery(
mapFiltersToKueryNode({
ruleLastRunOutcomesFilter: ['succeeded'],
}) as KueryNode
)
).toEqual(
toElasticsearchQuery(fromKueryExpression('alert.attributes.lastRun.outcome: succeeded'))
);

expect(
toElasticsearchQuery(
mapFiltersToKueryNode({
ruleLastRunOutcomesFilter: ['succeeded', 'failed', 'warning'],
}) as KueryNode
)
).toEqual(
toElasticsearchQuery(
fromKueryExpression('alert.attributes.lastRun.outcome: (succeeded or failed or warning)')
)
);
});

test('should handle ruleStatusesFilter', () => {
expect(
toElasticsearchQuery(
Expand Down Expand Up @@ -260,6 +284,7 @@ describe('mapFiltersToKueryNode', () => {
typesFilter: ['type', 'filter'],
actionTypesFilter: ['action', 'types', 'filter'],
ruleExecutionStatusesFilter: ['alert', 'statuses', 'filter'],
ruleLastRunOutcomesFilter: ['warning', 'failed'],
tagsFilter: ['a', 'b', 'c'],
}) as KueryNode
)
Expand All @@ -271,6 +296,7 @@ describe('mapFiltersToKueryNode', () => {
alert.attributes.actions:{ actionTypeId:types } OR
alert.attributes.actions:{ actionTypeId:filter }) and
alert.attributes.executionStatus.status:(alert or statuses or filter) and
alert.attributes.lastRun.outcome:(warning or failed) and
alert.attributes.tags:(a or b or c)`
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const mapFiltersToKueryNode = ({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
searchText,
Expand All @@ -20,6 +21,7 @@ export const mapFiltersToKueryNode = ({
actionTypesFilter?: string[];
tagsFilter?: string[];
ruleExecutionStatusesFilter?: string[];
ruleLastRunOutcomesFilter?: string[];
ruleStatusesFilter?: RuleStatus[];
searchText?: string;
}): KueryNode | null => {
Expand Down Expand Up @@ -51,6 +53,16 @@ export const mapFiltersToKueryNode = ({
);
}

if (ruleLastRunOutcomesFilter && ruleLastRunOutcomesFilter.length) {
filterKueryNode.push(
nodeBuilder.or(
ruleLastRunOutcomesFilter.map((resf) =>
nodeBuilder.is('alert.attributes.lastRun.outcome', resf)
)
)
);
}

if (ruleStatusesFilter && ruleStatusesFilter.length) {
const snoozedFilter = nodeBuilder.or([
fromKueryExpression('alert.attributes.muteAll: true'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export interface LoadRulesProps {
actionTypesFilter?: string[];
tagsFilter?: string[];
ruleExecutionStatusesFilter?: string[];
ruleLastRunOutcomesFilter?: string[];
ruleStatusesFilter?: RuleStatus[];
sort?: Sorting;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export async function loadRulesWithKueryFilter({
typesFilter,
actionTypesFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
tagsFilter,
sort = { field: 'name', direction: 'asc' },
Expand All @@ -32,6 +33,7 @@ export async function loadRulesWithKueryFilter({
actionTypesFilter,
tagsFilter,
ruleExecutionStatusesFilter,
ruleLastRunOutcomesFilter,
ruleStatusesFilter,
searchText,
});
Expand Down
Loading

0 comments on commit 256e1f8

Please sign in to comment.