[ResponseOps][Alerting] Store rule name in alerting event log documents (#140441)

* Removing secondary query

* Adding field to agg

* Removing log statement

* Fixing types

* Adding rule name to function tests
This commit is contained in:
doakalexi 2022-09-13 14:56:08 -04:00 committed by GitHub
parent 4c6dc3c86d
commit 286d542635
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 37 additions and 35 deletions

View file

@ -49,6 +49,7 @@ export interface IExecutionLog {
schedule_delay_ms: number;
timed_out: boolean;
rule_id: string;
rule_name: string;
}
export interface IExecutionErrors {

View file

@ -278,6 +278,7 @@ describe('getExecutionLogAggregation', () => {
'error.message',
'kibana.version',
'rule.id',
'rule.name',
],
},
},
@ -482,6 +483,7 @@ describe('getExecutionLogAggregation', () => {
'error.message',
'kibana.version',
'rule.id',
'rule.name',
],
},
},
@ -686,6 +688,7 @@ describe('getExecutionLogAggregation', () => {
'error.message',
'kibana.version',
'rule.id',
'rule.name',
],
},
},
@ -776,7 +779,7 @@ describe('formatExecutionLogResult', () => {
_id: 'S4wIZX8B8TGQpG7XQZns',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
},
@ -860,7 +863,7 @@ describe('formatExecutionLogResult', () => {
_id: 'a4wIZX8B8TGQpG7Xwpnz',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
@ -940,6 +943,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3074,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
{
id: '41b2755e-765a-4044-9745-b03875d5e79a',
@ -961,6 +965,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
],
});
@ -1015,7 +1020,7 @@ describe('formatExecutionLogResult', () => {
_id: 'S4wIZX8B8TGQpG7XQZns',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'failure',
},
@ -1102,7 +1107,7 @@ describe('formatExecutionLogResult', () => {
_id: 'a4wIZX8B8TGQpG7Xwpnz',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
},
@ -1181,6 +1186,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3074,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
{
id: '41b2755e-765a-4044-9745-b03875d5e79a',
@ -1202,6 +1208,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
],
});
@ -1256,7 +1263,7 @@ describe('formatExecutionLogResult', () => {
_id: 'dJkWa38B1ylB1EvsAckB',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
},
@ -1335,7 +1342,7 @@ describe('formatExecutionLogResult', () => {
_id: 'a4wIZX8B8TGQpG7Xwpnz',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
},
@ -1414,6 +1421,7 @@ describe('formatExecutionLogResult', () => {
timed_out: true,
schedule_delay_ms: 3074,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
{
id: '41b2755e-765a-4044-9745-b03875d5e79a',
@ -1435,6 +1443,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
],
});
@ -1489,7 +1498,7 @@ describe('formatExecutionLogResult', () => {
_id: '7xKcb38BcntAq5ycFwiu',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
},
@ -1573,7 +1582,7 @@ describe('formatExecutionLogResult', () => {
_id: 'zRKbb38BcntAq5ycOwgk',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule_name' },
event: {
outcome: 'success',
},
@ -1652,6 +1661,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
{
id: '61bb867b-661a-471f-bf92-23471afa10b3',
@ -1673,6 +1683,7 @@ describe('formatExecutionLogResult', () => {
timed_out: false,
schedule_delay_ms: 3133,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
],
});

View file

@ -17,6 +17,7 @@ import { IExecutionLog, IExecutionLogResult } from '../../common';
const DEFAULT_MAX_BUCKETS_LIMIT = 1000; // do not retrieve more than this number of executions
const RULE_ID_FIELD = 'rule.id';
const RULE_NAME_FIELD = 'rule.name';
const PROVIDER_FIELD = 'event.provider';
const START_FIELD = 'event.start';
const ACTION_FIELD = 'event.action';
@ -265,6 +266,7 @@ export function getExecutionLogAggregation({
ERROR_MESSAGE_FIELD,
VERSION_FIELD,
RULE_ID_FIELD,
RULE_NAME_FIELD,
],
},
},
@ -336,6 +338,7 @@ function formatExecutionLogAggBucket(bucket: IExecutionUuidAggBucket): IExecutio
const version = outcomeAndMessage ? outcomeAndMessage?.kibana?.version ?? '' : '';
const ruleId = outcomeAndMessage ? outcomeAndMessage?.rule?.id ?? '' : '';
const ruleName = outcomeAndMessage ? outcomeAndMessage?.rule?.name ?? '' : '';
return {
id: bucket?.key ?? '',
timestamp: bucket?.ruleExecution?.executeStartTime.value_as_string ?? '',
@ -355,6 +358,7 @@ function formatExecutionLogAggBucket(bucket: IExecutionUuidAggBucket): IExecutio
schedule_delay_ms: scheduleDelayUs / Millis2Nanos,
timed_out: timedOut,
rule_id: ruleId,
rule_name: ruleName,
};
}

View file

@ -46,6 +46,7 @@ describe('getRuleExecutionLogRoute', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule-name',
},
{
id: '41b2755e-765a-4044-9745-b03875d5e79a',
@ -67,6 +68,7 @@ describe('getRuleExecutionLogRoute', () => {
timed_out: false,
schedule_delay_ms: 3008,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule-name',
},
],
};

View file

@ -47,6 +47,7 @@ describe('getRuleExecutionLogRoute', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
{
id: '41b2755e-765a-4044-9745-b03875d5e79a',
@ -68,6 +69,7 @@ describe('getRuleExecutionLogRoute', () => {
timed_out: false,
schedule_delay_ms: 3008,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule_name',
},
],
};

View file

@ -944,32 +944,7 @@ export class RulesClient {
}
);
const formattedResult = formatExecutionLogResult(aggResult);
const ruleIds = [...new Set(formattedResult.data.map((l) => l.rule_id))].filter(
Boolean
) as string[];
const ruleNameIdEntries = await Promise.all(
ruleIds.map(async (id) => {
try {
const result = await this.get({ id });
return [id, result.name];
} catch (e) {
return [id, id];
}
})
);
const ruleNameIdMap: Record<string, string> = ruleNameIdEntries.reduce(
(result, [key, val]) => ({ ...result, [key]: val }),
{}
);
return {
...formattedResult,
data: formattedResult.data.map((entry) => ({
...entry,
rule_name: ruleNameIdMap[entry.rule_id!],
})),
};
return formatExecutionLogResult(aggResult);
} catch (err) {
this.logger.debug(
`rulesClient.getGlobalExecutionLogWithAuth(): error searching global event log: ${err.message}`

View file

@ -145,6 +145,7 @@ const aggregateResults = {
_source: {
rule: {
id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
name: 'rule-name',
},
event: {
outcome: 'success',
@ -248,7 +249,7 @@ const aggregateResults = {
_id: 'a4wIZX8B8TGQpG7Xwpnz',
_score: 1.0,
_source: {
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef' },
rule: { id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', name: 'rule-name' },
event: {
outcome: 'success',
},
@ -377,6 +378,7 @@ describe('getExecutionLogForRule()', () => {
timed_out: false,
schedule_delay_ms: 3126,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule-name',
},
{
id: '41b2755e-765a-4044-9745-b03875d5e79a',
@ -398,6 +400,7 @@ describe('getExecutionLogForRule()', () => {
timed_out: false,
schedule_delay_ms: 3345,
rule_id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef',
rule_name: 'rule-name',
},
],
});

View file

@ -74,6 +74,7 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo
let previousTimestamp: string | null = null;
for (const log of execLogs) {
expect(log.rule_name).to.equal('abc');
if (previousTimestamp) {
// default sort is `desc` by timestamp
expect(Date.parse(log.timestamp)).to.be.lessThan(Date.parse(previousTimestamp));
@ -177,6 +178,7 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo
expect(execLogs.length).to.eql(1);
for (const log of execLogs) {
expect(log.rule_name).to.equal('abc');
expect(log.duration_ms).to.be.greaterThan(0);
expect(log.schedule_delay_ms).to.be.greaterThan(0);
expect(log.status).to.equal('success');
@ -314,6 +316,7 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo
expect(execLogs.length).to.eql(1);
for (const log of execLogs) {
expect(log.rule_name).to.equal('abc');
expect(log.status).to.equal('success');
expect(log.num_active_alerts).to.equal(1);
@ -372,6 +375,7 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo
expect(execLogs.length).to.eql(1);
for (const log of execLogs) {
expect(log.rule_name).to.equal('abc');
expect(log.status).to.equal('success');
expect(log.num_active_alerts).to.equal(1);