Skip to content

Commit

Permalink
[8.x] Add error handling/retry logic for search source alert tests (#…
Browse files Browse the repository at this point in the history
…196443) (#203878)

# Backport

This will backport the following commits from `main` to `8.x`:
- [Add error handling/retry logic for search source alert tests
(#196443)](#196443)

<!--- Backport version: 8.9.8 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Lukas
Olson","email":"[email protected]"},"sourceCommit":{"committedDate":"2024-12-10T20:27:36Z","message":"Add
error handling/retry logic for search source alert tests (#196443)\n\n##
Summary\r\n\r\nResolves
https://github.com/elastic/kibana/issues/193842.\r\n\r\nAdds error
handling & retry logic for search source alerts that are\r\ncausing
failures on MKI.\r\n\r\n### Checklist\r\n\r\n- [x] [Flaky
Test\r\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1)
was\r\nused on any tests
changed","sha":"5acba9678aef16b460bb7b578dcdf4ce10a012a4","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","backport:skip","v9.0.0","Team:DataDiscovery"],"number":196443,"url":"https://github.com/elastic/kibana/pull/196443","mergeCommit":{"message":"Add
error handling/retry logic for search source alert tests (#196443)\n\n##
Summary\r\n\r\nResolves
https://github.com/elastic/kibana/issues/193842.\r\n\r\nAdds error
handling & retry logic for search source alerts that are\r\ncausing
failures on MKI.\r\n\r\n### Checklist\r\n\r\n- [x] [Flaky
Test\r\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1)
was\r\nused on any tests
changed","sha":"5acba9678aef16b460bb7b578dcdf4ce10a012a4"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/196443","number":196443,"mergeCommit":{"message":"Add
error handling/retry logic for search source alert tests (#196443)\n\n##
Summary\r\n\r\nResolves
https://github.com/elastic/kibana/issues/193842.\r\n\r\nAdds error
handling & retry logic for search source alerts that are\r\ncausing
failures on MKI.\r\n\r\n### Checklist\r\n\r\n- [x] [Flaky
Test\r\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1)
was\r\nused on any tests
changed","sha":"5acba9678aef16b460bb7b578dcdf4ce10a012a4"}}]}]
BACKPORT-->
  • Loading branch information
lukasolson authored Dec 19, 2024
1 parent b8031cc commit ff5042e
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,53 +45,59 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
let connectorId: string;

const createSourceIndex = () =>
es.index({
index: SOURCE_DATA_VIEW,
body: {
settings: { number_of_shards: 1 },
mappings: {
properties: {
'@timestamp': { type: 'date' },
message: { type: 'keyword' },
},
retry.try(() =>
createIndex(SOURCE_DATA_VIEW, {
'@timestamp': { type: 'date' },
message: { type: 'keyword' },
})
);

const createOutputDataIndex = () =>
retry.try(() =>
createIndex(OUTPUT_DATA_VIEW, {
rule_id: { type: 'text' },
rule_name: { type: 'text' },
alert_id: { type: 'text' },
context_link: { type: 'text' },
})
);

async function createIndex(index: string, properties: unknown) {
try {
await es.index({
index,
body: {
settings: { number_of_shards: 1 },
mappings: { properties },
},
},
});
});
} catch (e) {
log.error(`Failed to create index "${index}" with error "${e.message}"`);
}
}

const generateNewDocs = async (docsNumber: number) => {
async function generateNewDocs(docsNumber: number, index = SOURCE_DATA_VIEW) {
const mockMessages = Array.from({ length: docsNumber }, (_, i) => `msg-${i}`);
const dateNow = new Date();
const dateToSet = new Date(dateNow);
dateToSet.setMinutes(dateNow.getMinutes() - 10);
for (const message of mockMessages) {
await es.transport.request({
path: `/${SOURCE_DATA_VIEW}/_doc`,
method: 'POST',
body: {
'@timestamp': dateToSet.toISOString(),
message,
},
});
try {
await Promise.all(
mockMessages.map((message) =>
es.transport.request({
path: `/${index}/_doc`,
method: 'POST',
body: {
'@timestamp': dateToSet.toISOString(),
message,
},
})
)
);
} catch (e) {
log.error(`Failed to generate new docs in "${index}" with error "${e.message}"`);
}
};

const createOutputDataIndex = () =>
es.index({
index: OUTPUT_DATA_VIEW,
body: {
settings: {
number_of_shards: 1,
},
mappings: {
properties: {
rule_id: { type: 'text' },
rule_name: { type: 'text' },
alert_id: { type: 'text' },
context_link: { type: 'text' },
},
},
},
});
}

const deleteAlerts = (alertIds: string[]) =>
asyncForEach(alertIds, async (alertId: string) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,53 +48,59 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
let connectorId: string;

const createSourceIndex = () =>
es.index({
index: SOURCE_DATA_VIEW,
body: {
settings: { number_of_shards: 1 },
mappings: {
properties: {
'@timestamp': { type: 'date' },
message: { type: 'keyword' },
},
retry.try(() =>
createIndex(SOURCE_DATA_VIEW, {
'@timestamp': { type: 'date' },
message: { type: 'keyword' },
})
);

const createOutputDataIndex = () =>
retry.try(() =>
createIndex(OUTPUT_DATA_VIEW, {
rule_id: { type: 'text' },
rule_name: { type: 'text' },
alert_id: { type: 'text' },
context_link: { type: 'text' },
})
);

async function createIndex(index: string, properties: unknown) {
try {
await es.index({
index,
body: {
settings: { number_of_shards: 1 },
mappings: { properties },
},
},
});
});
} catch (e) {
log.error(`Failed to create index "${index}" with error "${e.message}"`);
}
}

const generateNewDocs = async (docsNumber: number) => {
async function generateNewDocs(docsNumber: number, index = SOURCE_DATA_VIEW) {
const mockMessages = Array.from({ length: docsNumber }, (_, i) => `msg-${i}`);
const dateNow = new Date();
const dateToSet = new Date(dateNow);
dateToSet.setMinutes(dateNow.getMinutes() - 10);
for (const message of mockMessages) {
await es.transport.request({
path: `/${SOURCE_DATA_VIEW}/_doc`,
method: 'POST',
body: {
'@timestamp': dateToSet.toISOString(),
message,
},
});
try {
await Promise.all(
mockMessages.map((message) =>
es.transport.request({
path: `/${index}/_doc`,
method: 'POST',
body: {
'@timestamp': dateToSet.toISOString(),
message,
},
})
)
);
} catch (e) {
log.error(`Failed to generate new docs in "${index}" with error "${e.message}"`);
}
};

const createOutputDataIndex = () =>
es.index({
index: OUTPUT_DATA_VIEW,
body: {
settings: {
number_of_shards: 1,
},
mappings: {
properties: {
rule_id: { type: 'text' },
rule_name: { type: 'text' },
alert_id: { type: 'text' },
context_link: { type: 'text' },
},
},
},
});
}

const deleteAlerts = (alertIds: string[]) =>
asyncForEach(alertIds, async (alertId: string) => {
Expand Down Expand Up @@ -216,7 +222,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {

const openDiscoverAlertFlyout = async () => {
await testSubjects.click('discoverAlertsButton');
await testSubjects.click('discoverCreateAlertButton');
// Different create rule buttons in serverless
if (await testSubjects.exists('discoverCreateAlertButton')) {
await testSubjects.click('discoverCreateAlertButton');
} else {
await testSubjects.click('discoverAppMenuCustomThresholdRule');
}
};

const openManagementAlertFlyout = async () => {
Expand Down Expand Up @@ -366,8 +377,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
};

describe('Search source Alert', function () {
// see details: https://github.com/elastic/kibana/issues/193842
this.tags(['failsOnMKI', 'skipSvlOblt']);
// Failing: https://github.com/elastic/kibana/issues/203045
this.tags(['skipSvlOblt']);

before(async () => {
await security.testUser.setRoles(['discover_alert']);
await PageObjects.svlCommonPage.loginAsAdmin();
Expand Down Expand Up @@ -502,7 +514,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {

await testSubjects.click('thresholdPopover');
await testSubjects.setValue('alertThresholdInput0', '1');
await testSubjects.click('saveEditedRuleButton');

// Different save buttons in serverless
if (await testSubjects.exists('saveEditedRuleButton')) {
await testSubjects.click('saveEditedRuleButton');
} else {
await testSubjects.click('rulePageFooterSaveButton');
}
await PageObjects.header.waitUntilLoadingHasFinished();

await openAlertResults(RULE_NAME);
Expand Down Expand Up @@ -652,8 +670,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await PageObjects.header.waitUntilLoadingHasFinished();

await retry.waitFor('rule name value is correct', async () => {
await testSubjects.setValue('ruleNameInput', newAlert);
const ruleName = await testSubjects.getAttribute('ruleNameInput', 'value');
let ruleName;
// Rule name input is different in serverless
if (await testSubjects.exists('ruleNameInput')) {
await testSubjects.setValue('ruleNameInput', newAlert);
ruleName = await testSubjects.getAttribute('ruleNameInput', 'value');
} else {
await testSubjects.setValue('ruleDetailsNameInput', newAlert);
ruleName = await testSubjects.getAttribute('ruleDetailsNameInput', 'value');
}
return ruleName === newAlert;
});

Expand All @@ -677,7 +702,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await comboBox.set('ruleFormConsumerSelect', 'Stack Rules');
}

await testSubjects.click('saveRuleButton');
// Save rule button is different in serverless
if (await testSubjects.exists('saveRuleButton')) {
await testSubjects.click('saveRuleButton');
} else {
await testSubjects.click('rulePageFooterSaveButton');
}

await retry.waitFor('confirmation modal', async () => {
return await testSubjects.exists('confirmModalConfirmButton');
Expand Down

0 comments on commit ff5042e

Please sign in to comment.