Skip to content

Commit 96dbe49

Browse files
AWSHurneytamsiglan
andauthored
Fixed bucket monitor groupBy/aggregation display bug. (#827)
* Fixed a bug that was causing groupBy/aggregation fields from displaying in various areas of the UI. Related issues: 816, 817, 818. Signed-off-by: AWSHurneyt <[email protected]> * Fixed trigger context object bug in issue 791. Signed-off-by: AWSHurneyt <[email protected]> * Capitalized bucket column titles, and moved bucket columns to the end of the column array. Signed-off-by: AWSHurneyt <[email protected]> * Added wait steps to reduce test flakiness. Signed-off-by: AWSHurneyt <[email protected]> * Added wait step to reduce test flakiness. Adjusted test monitor trigger condition to always triggers on a healthy clusters. Signed-off-by: AWSHurneyt <[email protected]> * Removed unused imports. Signed-off-by: AWSHurneyt <[email protected]> * fixed bucket level monitor flaky cypress test Signed-off-by: Amardeepsingh Siglani <[email protected]> --------- Signed-off-by: AWSHurneyt <[email protected]> Signed-off-by: Amardeepsingh Siglani <[email protected]> Co-authored-by: Amardeepsingh Siglani <[email protected]>
1 parent 71ce4e7 commit 96dbe49

File tree

8 files changed

+68
-34
lines changed

8 files changed

+68
-34
lines changed

cypress/integration/alerts_dashboard_flyout_spec.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import React from 'react';
76
import { INDEX, PLUGIN_NAME } from '../support/constants';
87
import sampleAlertsFlyoutBucketMonitor from '../fixtures/sample_alerts_flyout_bucket_level_monitor.json';
98
import sampleAlertsFlyoutQueryMonitor from '../fixtures/sample_alerts_flyout_query_level_monitor.json';
@@ -23,12 +22,19 @@ describe('Alerts by trigger flyout', () => {
2322
// Load sample data
2423
cy.loadSampleEcommerceData();
2524

25+
// Ensure monitors have been deleted
26+
cy.visit(`${Cypress.env('opensearch_dashboards')}/app/${PLUGIN_NAME}#/monitors`);
27+
cy.contains('There are no existing monitors. Create a monitor to add triggers and actions.', {
28+
timeout: TWENTY_SECONDS,
29+
});
30+
2631
// Create the test monitors
2732
cy.createMonitor(sampleAlertsFlyoutBucketMonitor);
2833
cy.createMonitor(sampleAlertsFlyoutQueryMonitor);
2934

3035
// Visit Alerting OpenSearch Dashboards
3136
cy.visit(`${Cypress.env('opensearch_dashboards')}/app/${PLUGIN_NAME}#/monitors`);
37+
cy.reload();
3238

3339
// Confirm test monitors were created successfully
3440
cy.contains(BUCKET_MONITOR, { timeout: TWENTY_SECONDS });
@@ -41,6 +47,7 @@ describe('Alerts by trigger flyout', () => {
4147
beforeEach(() => {
4248
// Reloading the page to close any flyouts that were not closed by other tests that had failures.
4349
cy.visit(`${Cypress.env('opensearch_dashboards')}/app/${PLUGIN_NAME}#/dashboard`);
50+
cy.contains('Alerts by triggers', { timeout: TWENTY_SECONDS });
4451

4552
// Waiting 5 seconds for alerts to finish loading.
4653
// This short wait period alleviates flakiness observed during these tests.
@@ -60,9 +67,10 @@ describe('Alerts by trigger flyout', () => {
6067
timeout: TWENTY_SECONDS,
6168
}).within(() => {
6269
// Confirm flyout header contains expected text.
63-
cy.get(
64-
`[data-test-subj="alertsDashboardFlyout_header_${BUCKET_TRIGGER}"]`
65-
).contains(`Alerts by ${BUCKET_TRIGGER}`, { timeout: TWENTY_SECONDS });
70+
cy.get(`[data-test-subj="alertsDashboardFlyout_header_${BUCKET_TRIGGER}"]`).contains(
71+
`Alerts by ${BUCKET_TRIGGER}`,
72+
{ timeout: TWENTY_SECONDS }
73+
);
6674

6775
// Confirm 'Trigger name' sections renders as expected.
6876
cy.get(`[data-test-subj="alertsDashboardFlyout_triggerName_${BUCKET_TRIGGER}"]`).as(
@@ -154,9 +162,10 @@ describe('Alerts by trigger flyout', () => {
154162
timeout: TWENTY_SECONDS,
155163
}).within(() => {
156164
// Confirm flyout header contains expected text.
157-
cy.get(
158-
`[data-test-subj="alertsDashboardFlyout_header_${QUERY_TRIGGER}"]`
159-
).contains(`Alerts by ${QUERY_TRIGGER}`, { timeout: TWENTY_SECONDS });
165+
cy.get(`[data-test-subj="alertsDashboardFlyout_header_${QUERY_TRIGGER}"]`).contains(
166+
`Alerts by ${QUERY_TRIGGER}`,
167+
{ timeout: TWENTY_SECONDS }
168+
);
160169

161170
// Confirm 'Trigger name' sections renders as expected.
162171
cy.get(`[data-test-subj="alertsDashboardFlyout_triggerName_${QUERY_TRIGGER}"]`).as(

cypress/integration/bucket_level_monitor_spec.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -225,23 +225,28 @@ describe('Bucket-Level Monitors', () => {
225225
cy.get('[data-test-subj="addMetricButton"]').click({ force: true });
226226

227227
cy.get('[data-test-subj="metrics.0.aggregationTypeSelect"]').select('count', { force: true });
228+
cy.wait(1000);
228229

229-
cy.get('[data-test-subj="metrics.0.ofFieldComboBox"]').type(
230-
`${COUNT_METRIC_FIELD}{downArrow}{enter}`
231-
);
230+
cy.get('[data-test-subj="metrics.0.ofFieldComboBox"] input')
231+
.focus()
232+
.type(`${COUNT_METRIC_FIELD}{downArrow}{enter}`);
232233

233234
cy.get('button').contains('Save').click({ force: true });
235+
cy.wait(1000);
234236

235237
// Add a second metric for the query
236238
cy.get('[data-test-subj="addMetricButton"]').click({ force: true });
237239

238240
cy.get('[data-test-subj="metrics.1.aggregationTypeSelect"]').select('avg', { force: true });
241+
cy.wait(1000);
239242

240-
cy.get('[data-test-subj="metrics.1.ofFieldComboBox"]').type(
241-
`${AVERAGE_METRIC_FIELD}{downArrow}{enter}`
242-
);
243+
cy.get('[data-test-subj="metrics.1.ofFieldComboBox"] input')
244+
.focus()
245+
.type(`${AVERAGE_METRIC_FIELD}{downArrow}{enter}`);
246+
cy.wait(1000);
243247

244248
cy.get('button').contains('Save').click({ force: true });
249+
cy.wait(1000);
245250

246251
// Add data filters for the query
247252
const filters = [

cypress/integration/monitors_dashboard_spec.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const clusterHealthMonitor = {
3434
severity: '1',
3535
condition: {
3636
script: {
37-
source: 'ctx.results[0].status != "green"',
37+
source: 'ctx.results[0].status != "blue"',
3838
lang: 'painless',
3939
},
4040
},
@@ -101,6 +101,11 @@ describe('Monitors dashboard page', () => {
101101
});
102102

103103
it('Displays expected number of alerts', () => {
104+
// Wait for table to finish loading
105+
cy.get('tbody > tr', { timeout: 20000 }).should(($tr) =>
106+
expect($tr).to.have.length.greaterThan(1)
107+
);
108+
104109
// Ensure the 'Monitor name' column is sorted in ascending order by sorting another column first
105110
cy.contains('Last notification time').click({ force: true });
106111
cy.contains('Monitor name').click({ force: true });

public/pages/CreateMonitor/containers/CreateMonitor/utils/__snapshots__/formikToMonitor.test.js.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,8 @@ Object {
198198
"aggregations": Array [],
199199
"bucketUnitOfTime": "h",
200200
"bucketValue": 1,
201-
"cleanedGroupBy": Array [],
202201
"filters": Array [],
202+
"groupBy": Array [],
203203
"searchType": "graph",
204204
"timeField": "",
205205
},
@@ -322,8 +322,8 @@ Object {
322322
"aggregations": Array [],
323323
"bucketUnitOfTime": "h",
324324
"bucketValue": 1,
325-
"cleanedGroupBy": Array [],
326325
"filters": Array [],
326+
"groupBy": Array [],
327327
"searchType": "graph",
328328
"timeField": "@timestamp",
329329
}
@@ -334,8 +334,8 @@ Object {
334334
"aggregations": Array [],
335335
"bucketUnitOfTime": "h",
336336
"bucketValue": 1,
337-
"cleanedGroupBy": Array [],
338337
"filters": Array [],
338+
"groupBy": Array [],
339339
"searchType": "graph",
340340
"timeField": "@timestamp",
341341
}
@@ -346,8 +346,8 @@ Object {
346346
"aggregations": Array [],
347347
"bucketUnitOfTime": "h",
348348
"bucketValue": 1,
349-
"cleanedGroupBy": Array [],
350349
"filters": Array [],
350+
"groupBy": Array [],
351351
"searchType": "graph",
352352
"timeField": "@timestamp",
353353
}

public/pages/CreateMonitor/containers/CreateMonitor/utils/formikToMonitor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ export function formikToUiSearch(values) {
196196
searchType,
197197
timeField,
198198
aggregations,
199-
cleanedGroupBy,
199+
groupBy: cleanedGroupBy,
200200
bucketValue,
201201
bucketUnitOfTime,
202202
filters,

public/pages/CreateTrigger/containers/ConfigureActions/ConfigureActions.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import React from 'react';
77
import _ from 'lodash';
8-
import { EuiPanel, EuiText, EuiSpacer, EuiLoadingSpinner } from '@elastic/eui';
8+
import { EuiPanel, EuiText, EuiSpacer } from '@elastic/eui';
99
import Action from '../../components/Action';
1010
import ActionEmptyPrompt from '../../components/ActionEmptyPrompt';
1111
import AddActionButton from '../../components/AddActionButton';
@@ -22,12 +22,27 @@ import { formikToTrigger } from '../CreateTrigger/utils/formikToTrigger';
2222
import { getChannelOptions, toChannelType } from '../../utils/helper';
2323
import { getInitialActionValues } from '../../components/AddActionButton/utils';
2424

25-
const createActionContext = (context, action) => ({
26-
ctx: {
27-
...context,
28-
action,
29-
},
30-
});
25+
const createActionContext = (context, action) => {
26+
let trigger = context.trigger;
27+
const triggerType = Object.keys(trigger)[0];
28+
if (
29+
Object.keys(trigger).length === 1 &&
30+
!_.isEmpty(triggerType) &&
31+
Object.values(TRIGGER_TYPE).includes(triggerType)
32+
) {
33+
// If the trigger values is wrapped in the trigger type, unwrap it
34+
trigger = trigger[triggerType];
35+
} else {
36+
console.warn(`Unknown trigger type "${triggerType}".`, context);
37+
}
38+
return {
39+
ctx: {
40+
...context,
41+
trigger: { ...trigger },
42+
action,
43+
},
44+
};
45+
};
3146

3247
export const checkForError = (response, error) => {
3348
for (const trigger_name in response.resp.trigger_results) {

public/pages/Dashboard/utils/helpers.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ export const renderEmptyValue = (value) => {
7575
export function insertGroupByColumn(groupBy = []) {
7676
let result = _.cloneDeep(bucketColumns);
7777
groupBy.map((fieldName) =>
78-
result.splice(0, 0, {
78+
result.push({
7979
field: `agg_alert_content.bucket.key.${fieldName}`,
80-
name: fieldName,
80+
name: _.capitalize(fieldName),
8181
render: renderEmptyValue,
8282
sortable: false,
8383
truncateText: false,

public/pages/Dashboard/utils/helpers.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -575,24 +575,24 @@ describe('Dashboard/utils/helpers', () => {
575575
test('with valid groupBy list', () => {
576576
const groupBy = ['keyword1', 'keyword2', 'keyword3'];
577577
const expectedOutput = _.cloneDeep(bucketColumns);
578-
expectedOutput.unshift(
578+
expectedOutput.push(
579579
{
580-
field: 'agg_alert_content.bucket.key.keyword3',
581-
name: 'keyword3',
580+
field: 'agg_alert_content.bucket.key.keyword1',
581+
name: 'Keyword1',
582582
render: renderEmptyValue,
583583
sortable: false,
584584
truncateText: false,
585585
},
586586
{
587587
field: 'agg_alert_content.bucket.key.keyword2',
588-
name: 'keyword2',
588+
name: 'Keyword2',
589589
render: renderEmptyValue,
590590
sortable: false,
591591
truncateText: false,
592592
},
593593
{
594-
field: 'agg_alert_content.bucket.key.keyword1',
595-
name: 'keyword1',
594+
field: 'agg_alert_content.bucket.key.keyword3',
595+
name: 'Keyword3',
596596
render: renderEmptyValue,
597597
sortable: false,
598598
truncateText: false,

0 commit comments

Comments
 (0)