From 0776bf7a3ebb6f5639b32a145887d22f31393f9e Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 1 Oct 2020 07:40:27 +0200 Subject: [PATCH 01/64] [UX] Improve page responsive (#78759) * WIP * add resizeable panel * Improve page responsiveness * Improve page responsiveness * fix types Co-authored-by: Elastic Machine --- .../RumDashboard/Charts/PageLoadDistChart.tsx | 5 +- .../RumDashboard/Charts/PageViewsChart.tsx | 2 +- .../Charts/VisitorBreakdownChart.tsx | 7 ++- .../app/RumDashboard/CoreVitals/index.tsx | 8 +-- .../ImpactfulMetrics/JSErrors.tsx | 10 ++-- .../PercentileAnnotations.tsx | 12 ++-- .../PageLoadDistribution/index.tsx | 3 +- .../app/RumDashboard/PageViewsTrend/index.tsx | 3 +- .../RumDashboard/Panels/PageLoadAndViews.tsx | 39 +++++++++++++ .../RumDashboard/Panels/VisitorBreakdowns.tsx | 39 +++++++++++++ .../app/RumDashboard/RumDashboard.tsx | 55 +++++++++---------- .../components/app/RumDashboard/RumHome.tsx | 32 +++++------ .../RumDashboard/UXMetrics/KeyUXMetrics.tsx | 2 +- .../app/RumDashboard/UXMetrics/index.tsx | 4 +- .../RumDashboard/VisitorBreakdown/index.tsx | 2 +- .../app/RumDashboard/hooks/useBreakPoints.ts | 38 +++++++++++++ .../app/RumDashboard/translations.ts | 3 + .../lib/rum_client/get_visitor_breakdown.ts | 20 ++++--- 18 files changed, 203 insertions(+), 81 deletions(-) create mode 100644 x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx create mode 100644 x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx create mode 100644 x-pack/plugins/apm/public/components/app/RumDashboard/hooks/useBreakPoints.ts diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx index 79cd1c5753ae5..4a5f43dacedf4 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx @@ -89,7 +89,10 @@ export function PageLoadDistChart({ const [darkMode] = useUiSetting$('theme:darkMode'); return ( - + {(!loading || data) && ( + {(!loading || data) && ( + d.count as number} valueGetter="percent" percentFormatter={(d: number) => diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/index.tsx index cd7fd0af6d683..fcc7b214943ff 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/index.tsx @@ -25,8 +25,8 @@ export function CoreVitals({ data, loading }: Props) { const { lcp, lcpRanks, fid, fidRanks, cls, clsRanks } = data || {}; return ( - - + + - + - + 0 + ? ((data?.totalErrorPages ?? 0) / totalPageViews) * 100 + : 0; + return ( <> @@ -109,10 +114,7 @@ export function JSErrors() { title={i18n.translate('xpack.apm.rum.jsErrors.errorRateValue', { defaultMessage: '{errorRate} %', values: { - errorRate: ( - ((data?.totalErrorPages ?? 0) / totalPageViews) * - 100 - ).toFixed(0), + errorRate: errorRate.toFixed(0), }, })} description={I18LABELS.errorRate} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx index 7e81dc011bdb5..2abbcb8239aa8 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx @@ -10,9 +10,9 @@ import { LineAnnotation, LineAnnotationDatum, LineAnnotationStyle, + Position, } from '@elastic/charts'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; -import styled from 'styled-components'; import { EuiToolTip } from '@elastic/eui'; interface Props { @@ -28,11 +28,6 @@ function generateAnnotationData( })); } -const PercentileMarker = styled.span` - position: relative; - bottom: 205px; -`; - export function PercentileAnnotations({ percentiles }: Props) { const dataValues = generateAnnotationData(percentiles) ?? []; @@ -66,8 +61,9 @@ export function PercentileAnnotations({ percentiles }: Props) { dataValues={[annotation]} style={style} hideTooltips={true} + markerPosition={Position.Top} marker={ - + } content={ @@ -76,7 +72,7 @@ export function PercentileAnnotations({ percentiles }: Props) { > <>{annotation.details}th - + } /> ))} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx index 88d14a0213a96..45a40712f90fb 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx @@ -13,6 +13,7 @@ import { BreakdownFilter } from '../Breakdowns/BreakdownFilter'; import { PageLoadDistChart } from '../Charts/PageLoadDistChart'; import { BreakdownItem } from '../../../../../typings/ui_filters'; import { ResetPercentileZoom } from './ResetPercentileZoom'; +import { FULL_HEIGHT } from '../RumDashboard'; export interface PercentileRange { min?: number | null; @@ -71,7 +72,7 @@ export function PageLoadDistribution() { }; return ( -
+
diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx index 621098b6028cb..7492096b93898 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx @@ -12,6 +12,7 @@ import { I18LABELS } from '../translations'; import { BreakdownFilter } from '../Breakdowns/BreakdownFilter'; import { PageViewsChart } from '../Charts/PageViewsChart'; import { BreakdownItem } from '../../../../../typings/ui_filters'; +import { FULL_HEIGHT } from '../RumDashboard'; export function PageViewsTrend() { const { urlParams, uiFilters } = useUrlParams(); @@ -48,7 +49,7 @@ export function PageViewsTrend() { ); return ( -
+
diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx new file mode 100644 index 0000000000000..cdc52c98de971 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiPanel, EuiResizableContainer } from '@elastic/eui'; +import { FULL_HEIGHT } from '../RumDashboard'; +import { PageLoadDistribution } from '../PageLoadDistribution'; +import { PageViewsTrend } from '../PageViewsTrend'; +import { useBreakPoints } from '../hooks/useBreakPoints'; + +export function PageLoadAndViews() { + const { isLarge } = useBreakPoints(); + + return ( + + {(EuiResizablePanel, EuiResizableButton) => ( + <> + + + + + + + + + + + + + )} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx new file mode 100644 index 0000000000000..87ffacbf56f96 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiPanel, EuiResizableContainer } from '@elastic/eui'; +import { VisitorBreakdown } from '../VisitorBreakdown'; +import { VisitorBreakdownMap } from '../VisitorBreakdownMap'; +import { FULL_HEIGHT } from '../RumDashboard'; +import { useBreakPoints } from '../hooks/useBreakPoints'; + +export function VisitorBreakdownsPanel() { + const { isLarge } = useBreakPoints(); + + return ( + + {(EuiResizablePanel, EuiResizableButton) => ( + <> + + + + + + + + + + + + + )} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx index 37522b06970c1..0004599b1821b 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx @@ -10,20 +10,24 @@ import { EuiTitle, EuiSpacer, EuiPanel, + EuiResizableContainer, } from '@elastic/eui'; import React from 'react'; import { ClientMetrics } from './ClientMetrics'; -import { PageViewsTrend } from './PageViewsTrend'; -import { PageLoadDistribution } from './PageLoadDistribution'; import { I18LABELS } from './translations'; -import { VisitorBreakdown } from './VisitorBreakdown'; import { UXMetrics } from './UXMetrics'; -import { VisitorBreakdownMap } from './VisitorBreakdownMap'; import { ImpactfulMetrics } from './ImpactfulMetrics'; +import { PageLoadAndViews } from './Panels/PageLoadAndViews'; +import { VisitorBreakdownsPanel } from './Panels/VisitorBreakdowns'; +import { useBreakPoints } from './hooks/useBreakPoints'; + +export const FULL_HEIGHT = { height: '100%' }; export function RumDashboard() { + const { isLarge, isSmall } = useBreakPoints(); + return ( - + @@ -41,31 +45,22 @@ export function RumDashboard() { - - - - - - - - - - - - - - - - - - - - - - - - - + + {(EuiResizablePanel, EuiResizableButton) => ( + <> + + + + + + + + + )} + diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 71a992ae4df82..f30f9ba5af257 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -18,22 +18,20 @@ export const UX_LABEL = i18n.translate('xpack.apm.ux.title', { export function RumHome() { return ( -
- - - - - -

{UX_LABEL}

-
-
- - - -
-
- -
-
+ + + + + +

{UX_LABEL}

+
+
+ + + +
+
+ +
); } diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx index 37836a2c47d64..53722658cafef 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx @@ -57,7 +57,7 @@ export function KeyUXMetrics({ data, loading }: Props) { // Note: FCP value is in ms unit return ( - + - +

{I18LABELS.userExperienceMetrics}

@@ -70,7 +70,7 @@ export function UXMetrics() {
- +

diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx index 092c416303bb5..67127f9c2fd81 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx @@ -44,7 +44,7 @@ export function VisitorBreakdown() {

{VisitorBreakdownLabel}

- +

{I18LABELS.browser}

diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/hooks/useBreakPoints.ts b/x-pack/plugins/apm/public/components/app/RumDashboard/hooks/useBreakPoints.ts new file mode 100644 index 0000000000000..ea7b155045fdc --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/hooks/useBreakPoints.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useState } from 'react'; +import useWindowSize from 'react-use/lib/useWindowSize'; +import useDebounce from 'react-use/lib/useDebounce'; +import { isWithinMaxBreakpoint } from '@elastic/eui'; + +export function useBreakPoints() { + const [screenSizes, setScreenSizes] = useState({ + isSmall: false, + isMedium: false, + isLarge: false, + isXl: false, + }); + + const { width } = useWindowSize(); + + useDebounce( + () => { + const windowWidth = window.innerWidth; + + setScreenSizes({ + isSmall: isWithinMaxBreakpoint(windowWidth, 's'), + isMedium: isWithinMaxBreakpoint(windowWidth, 'm'), + isLarge: isWithinMaxBreakpoint(windowWidth, 'l'), + isXl: isWithinMaxBreakpoint(windowWidth, 'xl'), + }); + }, + 50, + [width] + ); + + return screenSizes; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts b/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts index dd7721d9f7129..fd118096526d7 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts @@ -150,6 +150,9 @@ export const I18LABELS = { percentile99th: i18n.translate('xpack.apm.ux.percentile.99th', { defaultMessage: '99th', }), + noData: i18n.translate('xpack.apm.ux.visitorBreakdown.noData', { + defaultMessage: 'No data.', + }), }; export const VisitorBreakdownLabel = i18n.translate( diff --git a/x-pack/plugins/apm/server/lib/rum_client/get_visitor_breakdown.ts b/x-pack/plugins/apm/server/lib/rum_client/get_visitor_breakdown.ts index 7345d6acc0f82..52d089e4e29c9 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/get_visitor_breakdown.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/get_visitor_breakdown.ts @@ -74,20 +74,24 @@ export async function getVisitorBreakdown({ name: bucket.key as string, })); - browserItems.push({ - count: totalItems - browserTotal, - name: 'Others', - }); + if (totalItems > 0) { + browserItems.push({ + count: totalItems - browserTotal, + name: 'Others', + }); + } const osItems = os.buckets.map((bucket) => ({ count: bucket.doc_count, name: bucket.key as string, })); - osItems.push({ - count: totalItems - osTotal, - name: 'Others', - }); + if (totalItems > 0) { + osItems.push({ + count: totalItems - osTotal, + name: 'Others', + }); + } return { os: osItems, From 42b5d787e654bca0c1e0b789cd7f6f27065b7109 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Thu, 1 Oct 2020 07:46:07 +0200 Subject: [PATCH 02/64] [ML] Functional tests - stabilize calendar edit tests (#78950) This PR stabilizes the calendar edit test by making sure the correct calendar form is displayed on the edit page. --- .../__snapshots__/calendar_form.test.js.snap | 9 +++++++-- .../calendars/edit/calendar_form/calendar_form.js | 4 ++-- .../functional/apps/ml/settings/calendar_edit.ts | 11 ++++++++--- x-pack/test/functional/apps/ml/settings/index.ts | 2 +- .../functional/services/ml/settings_calendar.ts | 15 ++++++++++++--- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap b/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap index ad76bb9115617..49caddfd29f82 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap @@ -1,9 +1,12 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`CalendarForm CalendarId shown as title when editing 1`] = ` - +

+

- +

+ {isEdit === true ? ( ) : ( diff --git a/x-pack/test/functional/apps/ml/settings/calendar_edit.ts b/x-pack/test/functional/apps/ml/settings/calendar_edit.ts index e738b50a2fe05..f9ba8fccd3c1c 100644 --- a/x-pack/test/functional/apps/ml/settings/calendar_edit.ts +++ b/x-pack/test/functional/apps/ml/settings/calendar_edit.ts @@ -20,8 +20,7 @@ export default function ({ getService }: FtrProviderContext) { const jobConfigs = [createJobConfig('test_calendar_ad_1'), createJobConfig('test_calendar_ad_2')]; const newJobGroups = ['farequote']; - // FLAKY: https://github.com/elastic/kibana/issues/78288 - describe.skip('calendar edit', function () { + describe('calendar edit', function () { before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); @@ -56,6 +55,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep('calendar edit opens existing calendar'); await ml.settingsCalendar.openCalendarEditForm(calendarId); + await ml.settingsCalendar.assertCalendarTitleValue(calendarId); await ml.testExecution.logTestStep( 'calendar edit deselects previous job selection and assigns new job groups' @@ -85,14 +85,19 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep('calendar edit re-opens the updated calendar'); await ml.settingsCalendar.openCalendarEditForm(calendarId); + await ml.settingsCalendar.assertCalendarTitleValue(calendarId); + await ml.testExecution.logTestStep('calendar edit verifies the job selection is empty'); await ml.settingsCalendar.assertJobSelection([]); + await ml.testExecution.logTestStep( 'calendar edit verifies the job group selection was updated' ); await ml.settingsCalendar.assertJobGroupSelection(newJobGroups); - await ml.testExecution.logTestStep('calendar edit verifies calendar updated correctly'); + await ml.testExecution.logTestStep( + 'calendar edit verifies calendar events updated correctly' + ); await asyncForEach(testEvents, async ({ description }) => { await ml.settingsCalendar.assertEventRowMissing(description); }); diff --git a/x-pack/test/functional/apps/ml/settings/index.ts b/x-pack/test/functional/apps/ml/settings/index.ts index 5b2c7d15e1959..eb91e005ebd71 100644 --- a/x-pack/test/functional/apps/ml/settings/index.ts +++ b/x-pack/test/functional/apps/ml/settings/index.ts @@ -7,7 +7,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('settings', function () { - this.tags(['quynh', 'skipFirefox']); + this.tags(['mlqa', 'skipFirefox']); loadTestFile(require.resolve('./calendar_creation')); loadTestFile(require.resolve('./calendar_edit')); diff --git a/x-pack/test/functional/services/ml/settings_calendar.ts b/x-pack/test/functional/services/ml/settings_calendar.ts index c269636522923..3a2c9149a0634 100644 --- a/x-pack/test/functional/services/ml/settings_calendar.ts +++ b/x-pack/test/functional/services/ml/settings_calendar.ts @@ -121,7 +121,7 @@ export function MachineLearningSettingsCalendarProvider( async openCalendarEditForm(calendarId: string) { await testSubjects.click(this.rowSelector(calendarId, 'mlEditCalendarLink')); - await testSubjects.existOrFail('mlPageCalendarEdit'); + await testSubjects.existOrFail('mlPageCalendarEdit > mlCalendarFormEdit', { timeout: 5000 }); }, async assertApplyToAllJobsSwitchEnabled(expectedValue: boolean) { @@ -224,6 +224,15 @@ export function MachineLearningSettingsCalendarProvider( ); }, + async assertCalendarTitleValue(expectedCalendarId: string) { + const actualValue = await testSubjects.getVisibleText('mlCalendarTitle'); + const expectedValue = `Calendar ${expectedCalendarId}`; + expect(actualValue).to.eql( + expectedValue, + `Calendar title should be '${expectedValue}' (got '${actualValue}')` + ); + }, + async setCalendarId(calendarId: string) { await mlCommonUI.setValueWithChecks('mlCalendarIdInput', calendarId, { clearWithKeyboard: true, @@ -271,13 +280,13 @@ export function MachineLearningSettingsCalendarProvider( async navigateToCalendarCreationPage() { await testSubjects.existOrFail('mlCalendarButtonCreate'); await testSubjects.click('mlCalendarButtonCreate'); - await testSubjects.existOrFail('mlPageCalendarEdit'); + await testSubjects.existOrFail('mlPageCalendarEdit > mlCalendarFormNew', { timeout: 5000 }); }, async openNewCalendarEventForm() { await testSubjects.existOrFail('mlCalendarNewEventButton'); await testSubjects.click('mlCalendarNewEventButton'); - await testSubjects.existOrFail('mlPageCalendarEdit'); + await testSubjects.existOrFail('mlCalendarEventForm'); }, async assertCalendarEventDescriptionValue(expectedValue: string) { From ec9d220b3c22d45a8a71b10920eedae122053b81 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Thu, 1 Oct 2020 08:23:07 +0200 Subject: [PATCH 03/64] [Discover] Unskip doc link functional test (#78600) * Flaky test runner confirmed it's not flaky --- test/functional/apps/discover/_doc_navigation.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/functional/apps/discover/_doc_navigation.js b/test/functional/apps/discover/_doc_navigation.js index 31aef96918ffa..87a150c7d6961 100644 --- a/test/functional/apps/discover/_doc_navigation.js +++ b/test/functional/apps/discover/_doc_navigation.js @@ -28,8 +28,7 @@ export default function ({ getService, getPageObjects }) { const esArchiver = getService('esArchiver'); const retry = getService('retry'); - // FLAKY: https://github.com/elastic/kibana/issues/78373 - describe.skip('doc link in discover', function contextSize() { + describe('doc link in discover', function contextSize() { beforeEach(async function () { log.debug('load kibana index with default index pattern'); await esArchiver.loadIfNeeded('discover'); From 3d9ea52803f433d3103ba62464b8157ac5541a24 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Thu, 1 Oct 2020 09:34:25 +0300 Subject: [PATCH 04/64] [Actions][Jira] Set parent issue for Sub-task issue type (#78772) --- docs/user/alerting/action-types/jira.asciidoc | 2 + x-pack/plugins/actions/README.md | 25 ++-- .../builtin_action_types/jira/api.test.ts | 32 +++++ .../server/builtin_action_types/jira/api.ts | 20 +++- .../server/builtin_action_types/jira/index.ts | 26 ++++- .../server/builtin_action_types/jira/mocks.ts | 13 +++ .../builtin_action_types/jira/schema.ts | 11 ++ .../builtin_action_types/jira/service.test.ts | 109 ++++++++++++++++++ .../builtin_action_types/jira/service.ts | 67 +++++++++++ .../server/builtin_action_types/jira/types.ts | 35 +++++- .../builtin_action_types/jira/api.ts | 38 ++++++ .../jira/jira_params.test.tsx | 3 + .../builtin_action_types/jira/jira_params.tsx | 32 ++++- .../jira/search_issues.tsx | 104 +++++++++++++++++ .../builtin_action_types/jira/translations.ts | 37 ++++++ .../builtin_action_types/jira/types.ts | 1 + .../jira/use_get_issues.tsx | 94 +++++++++++++++ .../jira/use_get_single_issue.tsx | 96 +++++++++++++++ .../actions/builtin_action_types/jira.ts | 12 +- 19 files changed, 733 insertions(+), 24 deletions(-) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx diff --git a/docs/user/alerting/action-types/jira.asciidoc b/docs/user/alerting/action-types/jira.asciidoc index 48bd6c8501b9f..65e5ee4fc4a01 100644 --- a/docs/user/alerting/action-types/jira.asciidoc +++ b/docs/user/alerting/action-types/jira.asciidoc @@ -69,6 +69,8 @@ Priority:: The priority of the incident. Labels:: The labels of the incident. Title:: A title for the issue, used for searching the contents of the knowledge base. Description:: The details about the incident. +Parent:: The parent issue id or key. Only for `Sub-task` issue types. +Priority:: The priority of the incident. Additional comments:: Additional information for the client, such as how to troubleshoot the issue. [[configuring-jira]] diff --git a/x-pack/plugins/actions/README.md b/x-pack/plugins/actions/README.md index af29a1d537499..02e8e91c987d8 100644 --- a/x-pack/plugins/actions/README.md +++ b/x-pack/plugins/actions/README.md @@ -274,12 +274,12 @@ Running the action by scheduling a task means that we will no longer have a user The following table describes the properties of the `options` object. -| Property | Description | Type | -| -------- | ------------------------------------------------------------------------------------------------------ | ------ | -| id | The id of the action you want to execute. | string | -| params | The `params` value to give the action type executor. | object | -| spaceId | The space id the action is within. | string | -| apiKey | The Elasticsearch API key to use for context. (Note: only required and used when security is enabled). | string | +| Property | Description | Type | +| -------- | ------------------------------------------------------------------------------------------------------ | ---------------- | +| id | The id of the action you want to execute. | string | +| params | The `params` value to give the action type executor. | object | +| spaceId | The space id the action is within. | string | +| apiKey | The Elasticsearch API key to use for context. (Note: only required and used when security is enabled). | string | | source | The source of the execution, either an HTTP request or a reference to a Saved Object. | object, optional | ## Example @@ -308,11 +308,11 @@ This api runs the action and asynchronously returns the result of running the ac The following table describes the properties of the `options` object. -| Property | Description | Type | -| -------- | ------------------------------------------------------------------------------------ | ------ | -| id | The id of the action you want to execute. | string | -| params | The `params` value to give the action type executor. | object | -| source | The source of the execution, either an HTTP request or a reference to a Saved Object.| object, optional | +| Property | Description | Type | +| -------- | ------------------------------------------------------------------------------------- | ---------------- | +| id | The id of the action you want to execute. | string | +| params | The `params` value to give the action type executor. | object | +| source | The source of the execution, either an HTTP request or a reference to a Saved Object. | object, optional | ## Example @@ -330,7 +330,7 @@ const result = await actionsClient.execute({ }, source: asSavedObjectExecutionSource({ id: '573891ae-8c48-49cb-a197-0cd5ec34a88b', - type: 'alert' + type: 'alert', }), }); ``` @@ -620,6 +620,7 @@ The Jira action uses the [V2 API](https://developer.atlassian.com/cloud/jira/pla | issueType | The id of the issue type in Jira. | string _(optional)_ | | priority | The name of the priority in Jira. Example: `Medium`. | string _(optional)_ | | labels | An array of labels. | string[] _(optional)_ | +| parent | The parent issue id or key. Only for `Sub-task` issue types. | string _(optional)_ | | comments | The comments of the case. A comment is of the form `{ commentId: string, version: string, comment: string }` | object[] _(optional)_ | #### `subActionParams (issueTypes)` diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/api.test.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/api.test.ts index 4495c37f758ee..3948a19d40dae 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/api.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/api.test.ts @@ -93,6 +93,7 @@ describe('api', () => { issueType: '10006', labels: ['kibana', 'elastic'], priority: 'High', + parent: null, }, }); expect(externalService.updateIncident).not.toHaveBeenCalled(); @@ -252,6 +253,7 @@ describe('api', () => { issueType: '10006', labels: ['kibana', 'elastic'], priority: 'High', + parent: null, }, }); expect(externalService.createIncident).not.toHaveBeenCalled(); @@ -380,6 +382,36 @@ describe('api', () => { }); }); + describe('getIssues', () => { + test('it returns the issues correctly', async () => { + const res = await api.issues({ + externalService, + params: { title: 'Title test' }, + }); + expect(res).toEqual([ + { + id: '10267', + key: 'RJ-107', + title: 'Test title', + }, + ]); + }); + }); + + describe('getIssue', () => { + test('it returns the issue correctly', async () => { + const res = await api.issue({ + externalService, + params: { id: 'RJ-107' }, + }); + expect(res).toEqual({ + id: '10267', + key: 'RJ-107', + title: 'Test title', + }); + }); + }); + describe('mapping variations', () => { test('overwrite & append', async () => { mapping.set('title', { diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/api.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/api.ts index a64eb7a2036ca..559bbc047b134 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/api.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/api.ts @@ -13,8 +13,10 @@ import { Incident, GetFieldsByIssueTypeHandlerArgs, GetIssueTypesHandlerArgs, + GetIssuesHandlerArgs, PushToServiceApiParams, PushToServiceResponse, + GetIssueHandlerArgs, } from './types'; // TODO: to remove, need to support Case @@ -46,6 +48,18 @@ const getFieldsByIssueTypeHandler = async ({ return res; }; +const getIssuesHandler = async ({ externalService, params }: GetIssuesHandlerArgs) => { + const { title } = params; + const res = await externalService.getIssues(title); + return res; +}; + +const getIssueHandler = async ({ externalService, params }: GetIssueHandlerArgs) => { + const { id } = params; + const res = await externalService.getIssue(id); + return res; +}; + const pushToServiceHandler = async ({ externalService, mapping, @@ -83,8 +97,8 @@ const pushToServiceHandler = async ({ currentIncident, }); } else { - const { title, description, priority, labels, issueType } = params; - incident = { summary: title, description, priority, labels, issueType }; + const { title, description, priority, labels, issueType, parent } = params; + incident = { summary: title, description, priority, labels, issueType, parent }; } if (externalId != null) { @@ -134,4 +148,6 @@ export const api: ExternalServiceApi = { getIncident: getIncidentHandler, issueTypes: getIssueTypesHandler, fieldsByIssueType: getFieldsByIssueTypeHandler, + issues: getIssuesHandler, + issue: getIssueHandler, }; diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts index d3346557f3684..9d6ff90c33700 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts @@ -25,6 +25,8 @@ import { JiraExecutorResultData, ExecutorSubActionGetFieldsByIssueTypeParams, ExecutorSubActionGetIssueTypesParams, + ExecutorSubActionGetIssuesParams, + ExecutorSubActionGetIssueParams, } from './types'; import * as i18n from './translations'; import { Logger } from '../../../../../../src/core/server'; @@ -37,7 +39,13 @@ interface GetActionTypeParams { configurationUtilities: ActionsConfigurationUtilities; } -const supportedSubActions: string[] = ['pushToService', 'issueTypes', 'fieldsByIssueType']; +const supportedSubActions: string[] = [ + 'pushToService', + 'issueTypes', + 'fieldsByIssueType', + 'issues', + 'issue', +]; // action type definition export function getActionType( @@ -137,5 +145,21 @@ async function executor( }); } + if (subAction === 'issues') { + const getIssuesParams = subActionParams as ExecutorSubActionGetIssuesParams; + data = await api.issues({ + externalService, + params: getIssuesParams, + }); + } + + if (subAction === 'issue') { + const getIssueParams = subActionParams as ExecutorSubActionGetIssueParams; + data = await api.issue({ + externalService, + params: getIssueParams, + }); + } + return { status: 'ok', data: data ?? {}, actionId }; } diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/mocks.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/mocks.ts index 53f8d43ebc2d8..b98eda799e3aa 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/mocks.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/mocks.ts @@ -61,6 +61,18 @@ const createMock = (): jest.Mocked => { defaultValue: { name: 'Medium', id: '3' }, }, })), + getIssues: jest.fn().mockImplementation(() => [ + { + id: '10267', + key: 'RJ-107', + title: 'Test title', + }, + ]), + getIssue: jest.fn().mockImplementation(() => ({ + id: '10267', + key: 'RJ-107', + title: 'Test title', + })), }; service.createComment.mockImplementationOnce(() => @@ -120,6 +132,7 @@ const executorParams: ExecutorSubActionPushParams = { labels: ['kibana', 'elastic'], priority: 'High', issueType: '10006', + parent: null, comments: [ { commentId: 'case-comment-1', diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/schema.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/schema.ts index 9fee465e72efc..4c31691280c2c 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/schema.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/schema.ts @@ -44,6 +44,7 @@ export const ExecutorSubActionPushParamsSchema = schema.object({ issueType: schema.nullable(schema.string()), priority: schema.nullable(schema.string()), labels: schema.nullable(schema.arrayOf(schema.string())), + parent: schema.nullable(schema.string()), // TODO: modify later to string[] - need for support Case schema comments: schema.nullable(schema.arrayOf(CommentSchema)), ...EntityInformation, @@ -60,6 +61,8 @@ export const ExecutorSubActionGetIssueTypesParamsSchema = schema.object({}); export const ExecutorSubActionGetFieldsByIssueTypeParamsSchema = schema.object({ id: schema.string(), }); +export const ExecutorSubActionGetIssuesParamsSchema = schema.object({ title: schema.string() }); +export const ExecutorSubActionGetIssueParamsSchema = schema.object({ id: schema.string() }); export const ExecutorParamsSchema = schema.oneOf([ schema.object({ @@ -82,4 +85,12 @@ export const ExecutorParamsSchema = schema.oneOf([ subAction: schema.literal('fieldsByIssueType'), subActionParams: ExecutorSubActionGetFieldsByIssueTypeParamsSchema, }), + schema.object({ + subAction: schema.literal('issues'), + subActionParams: ExecutorSubActionGetIssuesParamsSchema, + }), + schema.object({ + subAction: schema.literal('issue'), + subActionParams: ExecutorSubActionGetIssueParamsSchema, + }), ]); diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts index 2439c507c3328..605c05e2a9f25 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts @@ -95,6 +95,14 @@ const fieldsResponse = { }, }; +const issueResponse = { + id: '10267', + key: 'RJ-107', + fields: { summary: 'Test title' }, +}; + +const issuesResponse = [issueResponse]; + describe('Jira service', () => { let service: ExternalService; @@ -219,6 +227,7 @@ describe('Jira service', () => { labels: [], issueType: '10006', priority: 'High', + parent: null, }, }); @@ -264,6 +273,7 @@ describe('Jira service', () => { labels: [], priority: 'High', issueType: null, + parent: null, }, }); @@ -308,6 +318,7 @@ describe('Jira service', () => { labels: [], issueType: '10006', priority: 'High', + parent: 'RJ-107', }, }); @@ -324,6 +335,7 @@ describe('Jira service', () => { issuetype: { id: '10006' }, labels: [], priority: { name: 'High' }, + parent: { key: 'RJ-107' }, }, }, }); @@ -344,6 +356,7 @@ describe('Jira service', () => { labels: [], issueType: '10006', priority: 'High', + parent: null, }, }) ).rejects.toThrow( @@ -370,6 +383,7 @@ describe('Jira service', () => { labels: [], issueType: '10006', priority: 'High', + parent: null, }, }); @@ -398,6 +412,7 @@ describe('Jira service', () => { labels: [], issueType: '10006', priority: 'High', + parent: 'RJ-107', }, }); @@ -414,6 +429,7 @@ describe('Jira service', () => { priority: { name: 'High' }, issuetype: { id: '10006' }, project: { key: 'CK' }, + parent: { key: 'RJ-107' }, }, }, }); @@ -435,6 +451,7 @@ describe('Jira service', () => { labels: [], issueType: '10006', priority: 'High', + parent: null, }, }) ).rejects.toThrow( @@ -916,4 +933,96 @@ describe('Jira service', () => { }); }); }); + + describe('getIssues', () => { + test('it should return the issues', async () => { + requestMock.mockImplementation(() => ({ + data: { + issues: issuesResponse, + }, + })); + + const res = await service.getIssues('Test title'); + + expect(res).toEqual([ + { + id: '10267', + key: 'RJ-107', + title: 'Test title', + }, + ]); + }); + + test('it should call request with correct arguments', async () => { + requestMock.mockImplementation(() => ({ + data: { + issues: issuesResponse, + }, + })); + + await service.getIssues('Test title'); + expect(requestMock).toHaveBeenLastCalledWith({ + axios, + logger, + method: 'get', + url: `https://siem-kibana.atlassian.net/rest/api/2/search?jql=project=CK and summary ~"Test title"`, + }); + }); + + test('it should throw an error', async () => { + requestMock.mockImplementation(() => { + const error: ResponseError = new Error('An error has occurred'); + error.response = { data: { errors: { issuetypes: 'Could not get issue types' } } }; + throw error; + }); + + expect(service.getIssues('Test title')).rejects.toThrow( + '[Action][Jira]: Unable to get issues. Error: An error has occurred. Reason: Could not get issue types' + ); + }); + }); + + describe('getIssue', () => { + test('it should return a single issue', async () => { + requestMock.mockImplementation(() => ({ + data: issueResponse, + })); + + const res = await service.getIssue('RJ-107'); + + expect(res).toEqual({ + id: '10267', + key: 'RJ-107', + title: 'Test title', + }); + }); + + test('it should call request with correct arguments', async () => { + requestMock.mockImplementation(() => ({ + data: { + issues: issuesResponse, + }, + })); + + await service.getIssue('RJ-107'); + expect(requestMock).toHaveBeenLastCalledWith({ + axios, + logger, + method: 'get', + url: `https://siem-kibana.atlassian.net/rest/api/2/issue/RJ-107`, + }); + }); + + test('it should throw an error', async () => { + requestMock.mockImplementation(() => { + const error: ResponseError = new Error('An error has occurred'); + error.response = { data: { errors: { issuetypes: 'Could not get issue types' } } }; + throw error; + }); + + expect(service.getIssue('RJ-107')).rejects.toThrow( + '[Action][Jira]: Unable to get issue with id RJ-107. Error: An error has occurred. Reason: Could not get issue types' + ); + }); + }); }); diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts index 84b6e70d2a100..7429c3d36d7b0 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts @@ -53,6 +53,8 @@ export const createExternalService = ( const getIssueTypeFieldsOldAPIURL = `${url}/${BASE_URL}/issue/createmeta?projectKeys=${projectKey}&issuetypeIds={issueTypeId}&expand=projects.issuetypes.fields`; const getIssueTypesUrl = `${url}/${BASE_URL}/issue/createmeta/${projectKey}/issuetypes`; const getIssueTypeFieldsUrl = `${url}/${BASE_URL}/issue/createmeta/${projectKey}/issuetypes/{issueTypeId}`; + const searchUrl = `${url}/${BASE_URL}/search`; + const axiosInstance = axios.create({ auth: { username: email, password: apiToken }, }); @@ -90,6 +92,10 @@ export const createExternalService = ( fields = { ...fields, priority: { name: incident.priority } }; } + if (incident.parent) { + fields = { ...fields, parent: { key: incident.parent } }; + } + return fields; }; @@ -119,6 +125,17 @@ export const createExternalService = ( }; }, {}); + const normalizeSearchResults = ( + issues: Array<{ id: string; key: string; fields: { summary: string } }> + ) => + issues.map((issue) => ({ id: issue.id, key: issue.key, title: issue.fields?.summary ?? null })); + + const normalizeIssue = (issue: { id: string; key: string; fields: { summary: string } }) => ({ + id: issue.id, + key: issue.key, + title: issue.fields?.summary ?? null, + }); + const getIncident = async (id: string) => { try { const res = await request({ @@ -378,6 +395,54 @@ export const createExternalService = ( } }; + const getIssues = async (title: string) => { + const query = `${searchUrl}?jql=project=${projectKey} and summary ~"${title}"`; + try { + const res = await request({ + axios: axiosInstance, + method: 'get', + url: query, + logger, + proxySettings, + }); + + return normalizeSearchResults(res.data?.issues ?? []); + } catch (error) { + throw new Error( + getErrorMessage( + i18n.NAME, + `Unable to get issues. Error: ${error.message}. Reason: ${createErrorMessage( + error.response?.data?.errors ?? {} + )}` + ) + ); + } + }; + + const getIssue = async (id: string) => { + const getIssueUrl = `${incidentUrl}/${id}`; + try { + const res = await request({ + axios: axiosInstance, + method: 'get', + url: getIssueUrl, + logger, + proxySettings, + }); + + return normalizeIssue(res.data ?? {}); + } catch (error) { + throw new Error( + getErrorMessage( + i18n.NAME, + `Unable to get issue with id ${id}. Error: ${error.message}. Reason: ${createErrorMessage( + error.response?.data?.errors ?? {} + )}` + ) + ); + } + }; + return { getIncident, createIncident, @@ -386,5 +451,7 @@ export const createExternalService = ( getCapabilities, getIssueTypes, getFieldsByIssueType, + getIssues, + getIssue, }; }; diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/types.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/types.ts index 6fe7c62976f22..050ec195d74c1 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/types.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/types.ts @@ -17,6 +17,8 @@ import { ExecutorSubActionGetCapabilitiesParamsSchema, ExecutorSubActionGetIssueTypesParamsSchema, ExecutorSubActionGetFieldsByIssueTypeParamsSchema, + ExecutorSubActionGetIssuesParamsSchema, + ExecutorSubActionGetIssueParamsSchema, } from './schema'; import { ActionsConfigurationUtilities } from '../../actions_config'; import { IncidentConfigurationSchema } from '../case/schema'; @@ -60,7 +62,7 @@ export type ExternalServiceParams = Record; export type Incident = Pick< ExecutorSubActionPushParams, - 'description' | 'priority' | 'labels' | 'issueType' + 'description' | 'priority' | 'labels' | 'issueType' | 'parent' > & { summary: string }; export interface CreateIncidentParams { @@ -83,6 +85,13 @@ export type GetFieldsByIssueTypeResponse = Record< { allowedValues: Array<{}>; defaultValue: {} } >; +export type GetIssuesResponse = Array<{ id: string; key: string; title: string }>; +export interface GetIssueResponse { + id: string; + key: string; + title: string; +} + export interface ExternalService { getIncident: (id: string) => Promise; createIncident: (params: CreateIncidentParams) => Promise; @@ -91,6 +100,8 @@ export interface ExternalService { getCapabilities: () => Promise; getIssueTypes: () => Promise; getFieldsByIssueType: (issueTypeId: string) => Promise; + getIssues: (title: string) => Promise; + getIssue: (id: string) => Promise; } export interface PushToServiceApiParams extends ExecutorSubActionPushParams { @@ -117,6 +128,12 @@ export type ExecutorSubActionGetFieldsByIssueTypeParams = TypeOf< typeof ExecutorSubActionGetFieldsByIssueTypeParamsSchema >; +export type ExecutorSubActionGetIssuesParams = TypeOf< + typeof ExecutorSubActionGetIssuesParamsSchema +>; + +export type ExecutorSubActionGetIssueParams = TypeOf; + export interface ExternalServiceApiHandlerArgs { externalService: ExternalService; mapping: Map | null; @@ -149,6 +166,16 @@ export interface PushToServiceResponse extends ExternalServiceIncidentResponse { comments?: ExternalServiceCommentResponse[]; } +export interface GetIssuesHandlerArgs { + externalService: ExternalService; + params: ExecutorSubActionGetIssuesParams; +} + +export interface GetIssueHandlerArgs { + externalService: ExternalService; + params: ExecutorSubActionGetIssueParams; +} + export interface ExternalServiceApi { handshake: (args: HandshakeApiHandlerArgs) => Promise; pushToService: (args: PushToServiceApiHandlerArgs) => Promise; @@ -157,12 +184,16 @@ export interface ExternalServiceApi { fieldsByIssueType: ( args: GetFieldsByIssueTypeHandlerArgs ) => Promise; + issues: (args: GetIssuesHandlerArgs) => Promise; + issue: (args: GetIssueHandlerArgs) => Promise; } export type JiraExecutorResultData = | PushToServiceResponse | GetIssueTypesResponse - | GetFieldsByIssueTypeResponse; + | GetFieldsByIssueTypeResponse + | GetIssuesResponse + | GetIssueResponse; export interface Fields { [key: string]: string | string[] | { name: string } | { key: string } | { id: string }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts index 86893e5b87ddf..bc9fee042a9a6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts @@ -42,3 +42,41 @@ export async function getFieldsByIssueType({ signal, }); } + +export async function getIssues({ + http, + signal, + connectorId, + title, +}: { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; + title: string; +}): Promise> { + return await http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { + body: JSON.stringify({ + params: { subAction: 'issues', subActionParams: { title } }, + }), + signal, + }); +} + +export async function getIssue({ + http, + signal, + connectorId, + id, +}: { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; + id: string; +}): Promise> { + return await http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { + body: JSON.stringify({ + params: { subAction: 'getIncident', subActionParams: { id } }, + }), + signal, + }); +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx index d96657f8ca407..416f6f7b18755 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx @@ -31,8 +31,10 @@ const actionParams = { priority: 'High', savedObjectId: '123', externalId: null, + parent: null, }, }; + const connector = { secrets: {}, config: {}, @@ -237,5 +239,6 @@ describe('JiraParamsFields renders', () => { expect(wrapper.find('[data-test-subj="prioritySelect"]').exists()).toBeFalsy(); expect(wrapper.find('[data-test-subj="descriptionTextArea"]').exists()).toBeFalsy(); expect(wrapper.find('[data-test-subj="labelsComboBox"]').exists()).toBeFalsy(); + expect(wrapper.find('[data-test-subj="search-parent-issues"]').exists()).toBeFalsy(); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.tsx index b457dcc60a43f..c19d2c4048665 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.tsx @@ -19,6 +19,7 @@ import { TextFieldWithMessageVariables } from '../../text_field_with_message_var import { JiraActionParams } from './types'; import { useGetIssueTypes } from './use_get_issue_types'; import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; +import { SearchIssues } from './search_issues'; const JiraParamsFields: React.FunctionComponent> = ({ actionParams, @@ -30,7 +31,7 @@ const JiraParamsFields: React.FunctionComponent { - const { title, description, comments, issueType, priority, labels, savedObjectId } = + const { title, description, comments, issueType, priority, labels, parent, savedObjectId } = actionParams.subActionParams || {}; const [issueTypesSelectOptions, setIssueTypesSelectOptions] = useState([]); @@ -62,6 +63,7 @@ const JiraParamsFields: React.FunctionComponent Object.prototype.hasOwnProperty.call(fields, 'priority'), [ fields, ]); + const hasParent = useMemo(() => Object.prototype.hasOwnProperty.call(fields, 'parent'), [fields]); useEffect(() => { const options = issueTypes.map((type) => ({ @@ -179,6 +181,34 @@ const JiraParamsFields: React.FunctionComponent + {hasParent && ( + <> + + + + { + editSubActionProperty('parent', parentIssueKey); + }} + /> + + + + + + )} <> {hasPriority && ( <> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx new file mode 100644 index 0000000000000..fff606982677a --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../../types'; +import { useGetIssues } from './use_get_issues'; +import { useGetSingleIssue } from './use_get_single_issue'; +import * as i18n from './translations'; + +interface Props { + selectedValue: string | null; + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + actionConnector?: ActionConnector; + onChange: (parentIssueKey: string) => void; +} + +const SearchIssuesComponent: React.FC = ({ + selectedValue, + http, + toastNotifications, + actionConnector, + onChange, +}) => { + const [query, setQuery] = useState(null); + const [selectedOptions, setSelectedOptions] = useState>>( + [] + ); + const [options, setOptions] = useState>>([]); + + const { isLoading: isLoadingIssues, issues } = useGetIssues({ + http, + toastNotifications, + actionConnector, + query, + }); + + const { isLoading: isLoadingSingleIssue, issue: singleIssue } = useGetSingleIssue({ + http, + toastNotifications, + actionConnector, + id: selectedValue, + }); + + useEffect(() => setOptions(issues.map((issue) => ({ label: issue.title, value: issue.key }))), [ + issues, + ]); + + useEffect(() => { + if (isLoadingSingleIssue || singleIssue == null) { + return; + } + + const singleIssueAsOptions = [{ label: singleIssue.title, value: singleIssue.key }]; + setOptions(singleIssueAsOptions); + setSelectedOptions(singleIssueAsOptions); + }, [singleIssue, isLoadingSingleIssue]); + + const onSearchChange = useCallback((searchVal: string) => { + setQuery(searchVal); + }, []); + + const onChangeComboBox = useCallback( + (changedOptions) => { + setSelectedOptions(changedOptions); + onChange(changedOptions[0].value); + }, + [onChange] + ); + + const inputPlaceholder = useMemo( + (): string => + isLoadingIssues || isLoadingSingleIssue + ? i18n.SEARCH_ISSUES_LOADING + : i18n.SEARCH_ISSUES_PLACEHOLDER, + [isLoadingIssues, isLoadingSingleIssue] + ); + + return ( + + ); +}; + +export const SearchIssues = memo(SearchIssuesComponent); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/translations.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/translations.ts index bfcb72d1cb977..2517552304d8d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/translations.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/translations.ts @@ -131,3 +131,40 @@ export const FIELDS_API_ERROR = i18n.translate( defaultMessage: 'Unable to get fields', } ); + +export const ISSUES_API_ERROR = i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.jira.unableToGetIssuesMessage', + { + defaultMessage: 'Unable to get issues', + } +); + +export const GET_ISSUE_API_ERROR = (id: string) => + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.jira.unableToGetIssueMessage', + { + defaultMessage: 'Unable to get issue with id {id}', + values: { id }, + } + ); + +export const SEARCH_ISSUES_COMBO_BOX_ARIA_LABEL = i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.jira.searchIssuesComboBoxAriaLabel', + { + defaultMessage: 'Select parent issue', + } +); + +export const SEARCH_ISSUES_PLACEHOLDER = i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.jira.searchIssuesComboBoxPlaceholder', + { + defaultMessage: 'Select parent issue', + } +); + +export const SEARCH_ISSUES_LOADING = i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.jira.searchIssuesLoading', + { + defaultMessage: 'Loading...', + } +); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts index ff11199f35fea..4c13d067913f2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts @@ -22,6 +22,7 @@ export interface JiraActionParams { issueType: string; priority: string; labels: string[]; + parent: string | null; }; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx new file mode 100644 index 0000000000000..d6590b8c70939 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { isEmpty, debounce } from 'lodash/fp'; +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../../types'; +import { getIssues } from './api'; +import * as i18n from './translations'; + +type Issues = Array<{ id: string; key: string; title: string }>; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + actionConnector?: ActionConnector; + query: string | null; +} + +export interface UseGetIssues { + issues: Issues; + isLoading: boolean; +} + +export const useGetIssues = ({ + http, + actionConnector, + toastNotifications, + query, +}: Props): UseGetIssues => { + const [isLoading, setIsLoading] = useState(false); + const [issues, setIssues] = useState([]); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + let didCancel = false; + const fetchData = debounce(500, async () => { + if (!actionConnector || isEmpty(query)) { + setIsLoading(false); + return; + } + + abortCtrl.current = new AbortController(); + setIsLoading(true); + + try { + const res = await getIssues({ + http, + signal: abortCtrl.current.signal, + connectorId: actionConnector.id, + title: query ?? '', + }); + + if (!didCancel) { + setIsLoading(false); + setIssues(res.data ?? []); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.ISSUES_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel) { + toastNotifications.addDanger({ + title: i18n.ISSUES_API_ERROR, + text: error.message, + }); + } + } + }); + + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel = true; + setIsLoading(false); + abortCtrl.current.abort(); + }; + }, [http, actionConnector, toastNotifications, query]); + + return { + issues, + isLoading, + }; +}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx new file mode 100644 index 0000000000000..7df9834f1bd85 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../../types'; +import { getIssue } from './api'; +import * as i18n from './translations'; + +interface Issue { + id: string; + key: string; + title: string; +} + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + id: string | null; + actionConnector?: ActionConnector; +} + +export interface UseGetSingleIssue { + issue: Issue | null; + isLoading: boolean; +} + +export const useGetSingleIssue = ({ + http, + toastNotifications, + actionConnector, + id, +}: Props): UseGetSingleIssue => { + const [isLoading, setIsLoading] = useState(false); + const [issue, setIssue] = useState(null); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + let didCancel = false; + const fetchData = async () => { + if (!actionConnector || !id) { + setIsLoading(false); + return; + } + + abortCtrl.current = new AbortController(); + setIsLoading(true); + try { + const res = await getIssue({ + http, + signal: abortCtrl.current.signal, + connectorId: actionConnector.id, + id, + }); + + if (!didCancel) { + setIsLoading(false); + setIssue(res.data ?? {}); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.GET_ISSUE_API_ERROR(id), + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel) { + toastNotifications.addDanger({ + title: i18n.GET_ISSUE_API_ERROR(id), + text: error.message, + }); + } + } + }; + + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel = true; + setIsLoading(false); + abortCtrl.current.abort(); + }; + }, [http, actionConnector, id, toastNotifications]); + + return { + isLoading, + issue, + }; +}; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/jira.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/jira.ts index 84fad699525a9..1a56a9dfcb4db 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/jira.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/jira.ts @@ -333,7 +333,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { status: 'error', retry: false, message: - 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subAction]: expected value to equal [pushToService]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]', + 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subAction]: expected value to equal [pushToService]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]\n- [5.subAction]: expected value to equal [issues]\n- [6.subAction]: expected value to equal [issue]', }); }); }); @@ -351,7 +351,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { status: 'error', retry: false, message: - 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.savedObjectId]: expected value of type [string] but got [undefined]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]', + 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.savedObjectId]: expected value of type [string] but got [undefined]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]\n- [5.subAction]: expected value to equal [issues]\n- [6.subAction]: expected value to equal [issue]', }); }); }); @@ -369,7 +369,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { status: 'error', retry: false, message: - 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.savedObjectId]: expected value of type [string] but got [undefined]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]', + 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.savedObjectId]: expected value of type [string] but got [undefined]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]\n- [5.subAction]: expected value to equal [issues]\n- [6.subAction]: expected value to equal [issue]', }); }); }); @@ -392,7 +392,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { status: 'error', retry: false, message: - 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.title]: expected value of type [string] but got [undefined]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]', + 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.title]: expected value of type [string] but got [undefined]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]\n- [5.subAction]: expected value to equal [issues]\n- [6.subAction]: expected value to equal [issue]', }); }); }); @@ -420,7 +420,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { status: 'error', retry: false, message: - 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]', + 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]\n- [5.subAction]: expected value to equal [issues]\n- [6.subAction]: expected value to equal [issue]', }); }); }); @@ -448,7 +448,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { status: 'error', retry: false, message: - 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]', + 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getIncident]\n- [1.subAction]: expected value to equal [handshake]\n- [2.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [3.subAction]: expected value to equal [issueTypes]\n- [4.subAction]: expected value to equal [fieldsByIssueType]\n- [5.subAction]: expected value to equal [issues]\n- [6.subAction]: expected value to equal [issue]', }); }); }); From 4c9a7bdf4872b6cb73e4bf8524bab0816279cdb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 1 Oct 2020 08:22:51 +0100 Subject: [PATCH 05/64] [Usage Collection] [schema] `ui_metric` (#78827) --- .telemetryrc.json | 3 +- .../server/collectors/ui_metric/schema.ts | 103 +++ .../telemetry_ui_metric_collector.ts | 13 +- src/plugins/telemetry/schema/oss_plugins.json | 745 ++++++++++++++++++ 4 files changed, 860 insertions(+), 4 deletions(-) create mode 100644 src/plugins/kibana_usage_collection/server/collectors/ui_metric/schema.ts diff --git a/.telemetryrc.json b/.telemetryrc.json index d3446b45033ee..3d1b0df1d8f93 100644 --- a/.telemetryrc.json +++ b/.telemetryrc.json @@ -5,8 +5,7 @@ "exclude": [ "src/plugins/kibana_react/", "src/plugins/testbed/", - "src/plugins/kibana_utils/", - "src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts" + "src/plugins/kibana_utils/" ] } ] diff --git a/src/plugins/kibana_usage_collection/server/collectors/ui_metric/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/schema.ts new file mode 100644 index 0000000000000..53bb1f9b93949 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/schema.ts @@ -0,0 +1,103 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { MakeSchemaFrom } from 'src/plugins/usage_collection/server'; +import { UIMetricUsage } from './telemetry_ui_metric_collector'; + +const commonSchema: MakeSchemaFrom[string] = { + type: 'array', + items: { + key: { type: 'keyword' }, + value: { type: 'long' }, + }, +}; + +// TODO: Find a way to retrieve it automatically +// plugin `data` registers all UI Metric for each appId where searches are performed (keys below are copy-pasted from application_usage) +const uiMetricFromDataPluginSchema: MakeSchemaFrom = { + // OSS + dashboards: commonSchema, + dev_tools: commonSchema, + discover: commonSchema, + home: commonSchema, + kibana: commonSchema, // It's a forward app so we'll likely never report it + management: commonSchema, + short_url_redirect: commonSchema, // It's a forward app so we'll likely never report it + timelion: commonSchema, + visualize: commonSchema, + + // X-Pack + apm: commonSchema, + csm: commonSchema, + canvas: commonSchema, + dashboard_mode: commonSchema, // It's a forward app so we'll likely never report it + enterpriseSearch: commonSchema, + appSearch: commonSchema, + workplaceSearch: commonSchema, + graph: commonSchema, + logs: commonSchema, + metrics: commonSchema, + infra: commonSchema, // It's a forward app so we'll likely never report it + ingestManager: commonSchema, + lens: commonSchema, + maps: commonSchema, + ml: commonSchema, + monitoring: commonSchema, + 'observability-overview': commonSchema, + security_account: commonSchema, + security_access_agreement: commonSchema, + security_capture_url: commonSchema, // It's a forward app so we'll likely never report it + security_logged_out: commonSchema, + security_login: commonSchema, + security_logout: commonSchema, + security_overwritten_session: commonSchema, + securitySolution: commonSchema, + 'securitySolution:overview': commonSchema, + 'securitySolution:detections': commonSchema, + 'securitySolution:hosts': commonSchema, + 'securitySolution:network': commonSchema, + 'securitySolution:timelines': commonSchema, + 'securitySolution:case': commonSchema, + 'securitySolution:administration': commonSchema, + siem: commonSchema, + space_selector: commonSchema, + uptime: commonSchema, +}; + +// TODO: Find a way to retrieve it automatically +// Searching `reportUiStats` across Kibana +export const uiMetricSchema: MakeSchemaFrom = { + console: commonSchema, + DashboardPanelVersionInUrl: commonSchema, + Kibana_home: commonSchema, // eslint-disable-line @typescript-eslint/naming-convention + visualize: commonSchema, + canvas: commonSchema, + cross_cluster_replication: commonSchema, + index_lifecycle_management: commonSchema, + index_management: commonSchema, + ingest_pipelines: commonSchema, + apm: commonSchema, + infra_logs: commonSchema, + infra_metrics: commonSchema, + stack_monitoring: commonSchema, + remote_clusters: commonSchema, + rollup_jobs: commonSchema, + securitySolution: commonSchema, + snapshot_restore: commonSchema, + ...uiMetricFromDataPluginSchema, +}; diff --git a/src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts index 9c02a9cbf3204..4cae892d30b5d 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/telemetry_ui_metric_collector.ts @@ -23,11 +23,19 @@ import { SavedObjectsServiceSetup, } from 'kibana/server'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import { uiMetricSchema } from './schema'; interface UIMetricsSavedObjects extends SavedObjectAttributes { count: number; } +interface UIMetricElement { + key: string; + value: number; +} + +export type UIMetricUsage = Record; + export function registerUiMetricUsageCollector( usageCollection: UsageCollectionSetup, registerType: SavedObjectsServiceSetup['registerType'], @@ -46,8 +54,9 @@ export function registerUiMetricUsageCollector( }, }); - const collector = usageCollection.makeUsageCollector({ + const collector = usageCollection.makeUsageCollector({ type: 'ui_metric', + schema: uiMetricSchema, fetch: async () => { const savedObjectsClient = getSavedObjectsClient(); if (typeof savedObjectsClient === 'undefined') { @@ -73,7 +82,7 @@ export function registerUiMetricUsageCollector( ...accum, [appName]: [...(accum[appName] || []), pair], }; - }, {} as Record>); + }, {} as UIMetricUsage); return uiMetricsByAppName; }, diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 6531262b6f1da..1f474dcbb8ff4 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -1623,6 +1623,751 @@ } } }, + "ui_metric": { + "properties": { + "console": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "DashboardPanelVersionInUrl": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "Kibana_home": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "visualize": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "canvas": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "cross_cluster_replication": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "index_lifecycle_management": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "index_management": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "ingest_pipelines": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "apm": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "infra_logs": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "infra_metrics": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "stack_monitoring": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "remote_clusters": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "rollup_jobs": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "snapshot_restore": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "dashboards": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "dev_tools": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "discover": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "home": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "kibana": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "management": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "short_url_redirect": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "timelion": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "csm": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "dashboard_mode": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "enterpriseSearch": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "appSearch": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "workplaceSearch": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "graph": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "logs": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "metrics": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "infra": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "ingestManager": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "lens": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "maps": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "ml": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "monitoring": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "observability-overview": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_account": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_access_agreement": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_capture_url": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_logged_out": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_login": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_logout": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "security_overwritten_session": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:overview": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:detections": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:hosts": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:network": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:timelines": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:case": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "securitySolution:administration": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "siem": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "space_selector": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + }, + "uptime": { + "type": "array", + "items": { + "properties": { + "key": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + } + } + } + }, "telemetry": { "properties": { "opt_in_status": { From 9fdb23769bbe8ac621df7e335a55d4a91e74465d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 1 Oct 2020 08:25:05 +0100 Subject: [PATCH 06/64] [Loggers] Rename "telemetry" to "usage" (#78130) Co-authored-by: Elastic Machine --- .../home/server/services/sample_data/sample_data_registry.ts | 2 +- x-pack/plugins/actions/server/plugin.ts | 2 +- x-pack/plugins/alerts/server/plugin.ts | 2 +- x-pack/plugins/lens/server/plugin.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/home/server/services/sample_data/sample_data_registry.ts b/src/plugins/home/server/services/sample_data/sample_data_registry.ts index 356c886436413..c9e65b292a00d 100644 --- a/src/plugins/home/server/services/sample_data/sample_data_registry.ts +++ b/src/plugins/home/server/services/sample_data/sample_data_registry.ts @@ -52,7 +52,7 @@ export class SampleDataRegistry { } const usageTracker = usage( core.getStartServices().then(([coreStart]) => coreStart.savedObjects), - this.initContext.logger.get('sample_data', 'telemetry') + this.initContext.logger.get('sample_data', 'usage') ); const router = core.http.createRouter(); createListRoute(router, this.sampleDatasets); diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index dca1114f0ae44..1a15a5a815195 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -151,7 +151,7 @@ export class ActionsPlugin implements Plugin, Plugi .toPromise(); this.logger = initContext.logger.get('actions'); - this.telemetryLogger = initContext.logger.get('telemetry'); + this.telemetryLogger = initContext.logger.get('usage'); this.preconfiguredActions = []; } diff --git a/x-pack/plugins/alerts/server/plugin.ts b/x-pack/plugins/alerts/server/plugin.ts index 8f09d55c9a0e0..e9caf4b78e627 100644 --- a/x-pack/plugins/alerts/server/plugin.ts +++ b/x-pack/plugins/alerts/server/plugin.ts @@ -117,7 +117,7 @@ export class AlertingPlugin { this.logger = initializerContext.logger.get('plugins', 'alerting'); this.taskRunnerFactory = new TaskRunnerFactory(); this.alertsClientFactory = new AlertsClientFactory(); - this.telemetryLogger = initializerContext.logger.get('telemetry'); + this.telemetryLogger = initializerContext.logger.get('usage'); this.kibanaIndex = initializerContext.config.legacy.globalConfig$ .pipe( first(), diff --git a/x-pack/plugins/lens/server/plugin.tsx b/x-pack/plugins/lens/server/plugin.tsx index 3611658fbbcd9..b801d30f5ba9b 100644 --- a/x-pack/plugins/lens/server/plugin.tsx +++ b/x-pack/plugins/lens/server/plugin.tsx @@ -31,7 +31,7 @@ export class LensServerPlugin implements Plugin<{}, {}, {}, {}> { constructor(initializerContext: PluginInitializerContext) { this.kibanaIndexConfig = initializerContext.config.legacy.globalConfig$; - this.telemetryLogger = initializerContext.logger.get('telemetry'); + this.telemetryLogger = initializerContext.logger.get('usage'); } setup(core: CoreSetup, plugins: PluginSetupContract) { setupSavedObjects(core); From 65cf6393c770af89567685980313e464e69745d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 1 Oct 2020 08:26:14 +0100 Subject: [PATCH 07/64] [Task names in TaskManager] Rename "telemetry" to "usage" (#78129) * [Task names in TaskManager] Rename "telemetry" to "usage" * Revert task IDs but leaving renamed titles Co-authored-by: Elastic Machine --- x-pack/plugins/actions/server/usage/task.ts | 2 +- x-pack/plugins/alerts/server/usage/task.ts | 2 +- x-pack/plugins/apm/server/lib/apm_telemetry/index.ts | 2 +- x-pack/plugins/lens/server/usage/task.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/actions/server/usage/task.ts b/x-pack/plugins/actions/server/usage/task.ts index 050f0021a32c1..efa695cdc2667 100644 --- a/x-pack/plugins/actions/server/usage/task.ts +++ b/x-pack/plugins/actions/server/usage/task.ts @@ -38,7 +38,7 @@ function registerActionsTelemetryTask( ) { taskManager.registerTaskDefinitions({ [TELEMETRY_TASK_TYPE]: { - title: 'Actions telemetry fetch task', + title: 'Actions usage fetch task', type: TELEMETRY_TASK_TYPE, timeout: '5m', createTaskRunner: telemetryTaskRunner(logger, core, kibanaIndex), diff --git a/x-pack/plugins/alerts/server/usage/task.ts b/x-pack/plugins/alerts/server/usage/task.ts index 5909351321385..daf3ac246adad 100644 --- a/x-pack/plugins/alerts/server/usage/task.ts +++ b/x-pack/plugins/alerts/server/usage/task.ts @@ -41,7 +41,7 @@ function registerAlertingTelemetryTask( ) { taskManager.registerTaskDefinitions({ [TELEMETRY_TASK_TYPE]: { - title: 'Alerting telemetry fetch task', + title: 'Alerting usage fetch task', type: TELEMETRY_TASK_TYPE, timeout: '5m', createTaskRunner: telemetryTaskRunner(logger, core, kibanaIndex), diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts index 3463865d326b0..f78280aa7428e 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts @@ -49,7 +49,7 @@ export async function createApmTelemetry({ }) { taskManager.registerTaskDefinitions({ [APM_TELEMETRY_TASK_NAME]: { - title: 'Collect APM telemetry', + title: 'Collect APM usage', type: APM_TELEMETRY_TASK_NAME, createTaskRunner: () => { return { diff --git a/x-pack/plugins/lens/server/usage/task.ts b/x-pack/plugins/lens/server/usage/task.ts index edc5a778749af..9fee72b59b44c 100644 --- a/x-pack/plugins/lens/server/usage/task.ts +++ b/x-pack/plugins/lens/server/usage/task.ts @@ -47,7 +47,7 @@ function registerLensTelemetryTask( ) { taskManager.registerTaskDefinitions({ [TELEMETRY_TASK_TYPE]: { - title: 'Lens telemetry fetch task', + title: 'Lens usage fetch task', type: TELEMETRY_TASK_TYPE, timeout: '1m', createTaskRunner: telemetryTaskRunner(logger, core, config), From ad134b296b4fd1f62f93f6719caec7d83b256dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 1 Oct 2020 08:42:23 +0100 Subject: [PATCH 08/64] fixing api test (#78964) --- .../tests/transaction_groups/distribution.ts | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/x-pack/test/apm_api_integration/basic/tests/transaction_groups/distribution.ts b/x-pack/test/apm_api_integration/basic/tests/transaction_groups/distribution.ts index bd669600afc14..c72d48094ca8d 100644 --- a/x-pack/test/apm_api_integration/basic/tests/transaction_groups/distribution.ts +++ b/x-pack/test/apm_api_integration/basic/tests/transaction_groups/distribution.ts @@ -37,8 +37,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - // SKIP FAILING TEST to unblock CI: https://github.com/elastic/kibana/issues/78942 - describe.skip('when data is loaded', () => { + describe('when data is loaded', () => { let response: any; before(async () => { await esArchiver.load(archiveName); @@ -61,7 +60,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns the correct number of buckets', () => { - expectSnapshot(response.body.buckets.length).toMatchInline(`19`); + expectSnapshot(response.body.buckets.length).toMatchInline(`45`); }); it('returns the correct bucket size', () => { @@ -73,18 +72,14 @@ export default function ApiTest({ getService }: FtrProviderContext) { (bucket: any) => !isEmpty(bucket.samples) ); - expectSnapshot(bucketWithSamples.count).toMatchInline(`2`); + expectSnapshot(bucketWithSamples.count).toMatchInline(`1`); expectSnapshot(bucketWithSamples.samples.sort((sample: any) => sample.traceId)) .toMatchInline(` Array [ Object { - "traceId": "a1333547d1257c636154290cddd38c3a", - "transactionId": "3e656b390989133d", - }, - Object { - "traceId": "c799c34f4ee2b0f9998745ea7354d599", - "transactionId": "69b6251b239abb46", + "traceId": "3dd90c5c2035f5bcb2728a34cb48d796", + "transactionId": "69f3ff7d35056f63", }, ] `); From 4bd0d3bf8724db1e197eb8ff7604c24a9cd7a662 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 1 Oct 2020 10:54:37 +0300 Subject: [PATCH 09/64] [TSVB] Request validation error: [panels.0.series.0.metrics.0.percentiles.1.value] (#79009) Closes: #79006 --- src/plugins/vis_type_timeseries/common/vis_schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_type_timeseries/common/vis_schema.ts b/src/plugins/vis_type_timeseries/common/vis_schema.ts index d3d863df8617f..b33215934c5df 100644 --- a/src/plugins/vis_type_timeseries/common/vis_schema.ts +++ b/src/plugins/vis_type_timeseries/common/vis_schema.ts @@ -111,7 +111,7 @@ export const metricsItems = schema.object({ field: stringOptionalNullable, mode: schema.oneOf([schema.literal('line'), schema.literal('band')]), shade: schema.oneOf([numberOptional, stringOptionalNullable]), - value: schema.oneOf([numberOptional, stringOptionalNullable]), + value: schema.maybe(schema.oneOf([numberOptional, stringOptionalNullable])), percentile: stringOptionalNullable, }) ) From 09226db99c8823a0fec5fe5fa87e33909f95621a Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Thu, 1 Oct 2020 10:56:17 +0300 Subject: [PATCH 10/64] Data plugin README (#78750) * data readme * Delete old readme (other folders don't have a README of their own. * generate asciidoc * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update README.md * Update plugin-list.asciidoc * gen plugin list * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update src/plugins/data/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Elastic Machine Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- docs/developer/plugin-list.asciidoc | 2 +- src/plugins/data/README.md | 140 ++++++++++++++++++++++- src/plugins/data/public/search/README.md | 23 ---- 3 files changed, 135 insertions(+), 30 deletions(-) delete mode 100644 src/plugins/data/public/search/README.md diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index e314e55c34085..ed58e77427d47 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -48,7 +48,7 @@ NOTE: |{kib-repo}blob/{branch}/src/plugins/data/README.md[data] -|data plugin provides common data access services. +|The data plugin provides common data access services, such as search and query, for solutions and application developers. |{kib-repo}blob/{branch}/src/plugins/dev_tools/README.md[devTools] diff --git a/src/plugins/data/README.md b/src/plugins/data/README.md index da0b71122fd9e..33c07078c5348 100644 --- a/src/plugins/data/README.md +++ b/src/plugins/data/README.md @@ -1,9 +1,137 @@ # data -`data` plugin provides common data access services. +The data plugin provides common data access services, such as `search` and `query`, for solutions and application developers. -- `expressions` — run pipeline functions and render results. -- `filter` -- `index_patterns` -- `query` -- `search`: Elasticsearch API service and strategies \ No newline at end of file +## Autocomplete + +The autocomplete service provides suggestions for field names and values. + +It is wired into the `TopNavMenu` component, but can be used independently. + +### Fetch Query Suggestions + +The `getQuerySuggestions` function helps to construct a query. +KQL suggestion functions are registered in X-Pack, so this API does not return results in OSS. + +```.ts + + // `inputValue` is the user input + const querySuggestions = await autocomplete.getQuerySuggestions({ + language: 'kuery', + indexPatterns: [indexPattern], + query: inputValue, + }); + +``` + +### Fetch Value Suggestions + +The `getValueSuggestions` function returns suggestions for field values. +This is helpful when you want to provide a user with options, for example when constructing a filter. + +```.ts + + // `inputValue` is the user input + const valueSuggestions = await autocomplete.getValueSuggestions({ + indexPattern, + field, + query: inputValue, + }); + +``` + +## Field Formats + +Coming soon. + +## Index Patterns + +Coming soon. + +## Query + +The query service is responsible for managing the configuration of a search query (`QueryState`): filters, time range, query string, and settings such as the auto refresh behavior and saved queries. + +It contains sub-services for each of those configurations: + - `data.query.filterManager` - Manages the `filters` component of a `QueryState`. The global filter state (filters that are persisted between applications) are owned by this service. + - `data.query.timefilter` - Responsible for the time range filter and the auto refresh behavior settings. + - `data.query.queryString` - Responsible for the query string and query language settings. + - `data.query.savedQueries` - Responsible for persisting a `QueryState` into a `SavedObject`, so it can be restored and used by other applications. + + Any changes to the `QueryState` are published on the `data.query.state$`, which is useful when wanting to persist global state or run a search upon data changes. + + A simple use case is: + + ```.ts + function searchOnChange(indexPattern: IndexPattern, aggConfigs: AggConfigs) { + data.query.state$.subscribe(() => { + + // Constuct the query portion of the search request + const query = data.query.getEsQuery(indexPattern); + + // Construct a request + const request = { + params: { + index: indexPattern.title, + body: { + aggs: aggConfigs.toDsl(), + query, + }, + }, + }; + + // Search with the `data.query` config + const search$ = data.search.search(request); + + ... + }); + } + + ``` + +## Search + +Provides access to Elasticsearch using the high-level `SearchSource` API or low-level `Search Strategies`. + +### SearchSource + +The `SearchSource` API is a convenient way to construct and run an Elasticsearch search query. + +```.tsx + + const searchSource = await data.search.searchSource.create(); + const searchResponse = await searchSource + .setParent(undefined) + .setField('index', indexPattern) + .setField('filter', filters) + .fetch(); + +``` + +### Low-level search + +#### Default Search Strategy + +One benefit of using the low-level search API, is partial response support in X-Pack, allowing for a better and more responsive user experience. +In OSS only the final result is returned. + +```.ts + import { isCompleteResponse } from '../plugins/data/public'; + + const search$ = data.search.search(request) + .subscribe({ + next: (response) => { + if (isCompleteResponse(response)) { + // Final result + search$.unsubscribe(); + } else { + // Partial result - you can update the UI, but data is still loading + } + }, + error: (e: Error) => { + // Show customized toast notifications. + // You may choose to handle errors differently if you prefer. + data.search.showError(e); + }, + }); +``` diff --git a/src/plugins/data/public/search/README.md b/src/plugins/data/public/search/README.md deleted file mode 100644 index 0a123ffa3f1e9..0000000000000 --- a/src/plugins/data/public/search/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# search - -The `search` service provides you with APIs to query Elasticsearch. - -The services are split into two parts: (1) low-level API; and (2) high-level API. - -## Low-level API - -With low level API you work directly with elasticsearch DSL - -```typescript -const results = await data.search.search(request, params); -``` - -## High-level API - -Using high-level API you work with Kibana abstractions around Elasticsearch DSL: filters, queries, and aggregations. Provided by the *Search Source* service. - -```typescript -const search = data.search.searchSource.createEmpty(); -search.setField('query', data.query.queryString); -const results = await search.fetch(); -``` From 29da04551dea22179a9771b0bd9c7e848118cbd1 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Thu, 1 Oct 2020 04:09:06 -0400 Subject: [PATCH 11/64] [SECURITY SOLUTIONS] Map embeddable working with index patterns selection (#78610) * map working with sourcerer * clean up * fix types * fix unit tests * fix incorrect hight for map * show prompt when no index exists * update unit test * fix update with no index available * fixup * unit test * add unit test Co-authored-by: Angela Chuang Co-authored-by: Elastic Machine --- .../__snapshots__/embedded_map.test.tsx.snap | 42 ++--- .../embeddables/embedded_map.test.tsx | 155 ++++++++++++++++-- .../components/embeddables/embedded_map.tsx | 108 ++++++++---- .../components/embeddables/selector.test.tsx | 24 +++ .../components/embeddables/selector.tsx | 35 ++++ 5 files changed, 289 insertions(+), 75 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/network/components/embeddables/selector.test.tsx create mode 100644 x-pack/plugins/security_solution/public/network/components/embeddables/selector.tsx diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/__snapshots__/embedded_map.test.tsx.snap b/x-pack/plugins/security_solution/public/network/components/embeddables/__snapshots__/embedded_map.test.tsx.snap index 456e07cf9cd15..4c3cbecc7593d 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/__snapshots__/embedded_map.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/__snapshots__/embedded_map.test.tsx.snap @@ -1,34 +1,16 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`EmbeddedMapComponent renders correctly against snapshot 1`] = ` - - - - - Map configuration help - - - - } - > - - - - - - + `; diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.test.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.test.tsx index ae0d3c2256e07..219409b10be6c 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.test.tsx @@ -4,36 +4,169 @@ * you may not use this file except in compliance with the Elastic License. */ -import { shallow } from 'enzyme'; +import { mount, ReactWrapper, shallow } from 'enzyme'; import React from 'react'; +import * as redux from 'react-redux'; +import { act } from 'react-dom/test-utils'; import '../../../common/mock/match_media'; import { useIndexPatterns } from '../../../common/hooks/use_index_patterns'; +import { TestProviders } from '../../../common/mock'; + import { EmbeddedMapComponent } from './embedded_map'; +import { createEmbeddable } from './embedded_map_helpers'; const mockUseIndexPatterns = useIndexPatterns as jest.Mock; jest.mock('../../../common/hooks/use_index_patterns'); mockUseIndexPatterns.mockImplementation(() => [true, []]); jest.mock('../../../common/lib/kibana'); +jest.mock('./embedded_map_helpers', () => ({ + createEmbeddable: jest.fn(), +})); +jest.mock('../../../common/lib/kibana', () => { + return { + useKibana: jest.fn().mockReturnValue({ + services: { + embeddable: { + EmbeddablePanel: jest.fn(() =>
), + }, + docLinks: { ELASTIC_WEBSITE_URL: 'ELASTIC_WEBSITE_URL' }, + }, + }), + }; +}); + +jest.mock('./index_patterns_missing_prompt', () => { + return { + IndexPatternsMissingPrompt: jest.fn(() =>
), + }; +}); describe('EmbeddedMapComponent', () => { - let setQuery: jest.Mock; + const setQuery: jest.Mock = jest.fn(); + const mockSelector = { + kibanaIndexPatterns: [ + { id: '6f1eeb50-023d-11eb-bcb6-6ba0578012a9', title: 'filebeat-*' }, + { id: '28995490-023d-11eb-bcb6-6ba0578012a9', title: 'auditbeat-*' }, + ], + sourcererScope: { selectedPatterns: ['filebeat-*', 'packetbeat-*'] }, + }; + const mockCreateEmbeddable = { + destroyed: false, + enhancements: { dynamicActions: {} }, + getActionContext: jest.fn(), + getFilterActions: jest.fn(), + id: '70969ddc-4d01-4048-8073-4ea63d595638', + input: { + viewMode: 'view', + title: 'Source -> Destination Point-to-Point Map', + id: '70969ddc-4d01-4048-8073-4ea63d595638', + filters: Array(0), + hidePanelTitles: true, + }, + input$: {}, + isContainer: false, + output: {}, + output$: {}, + parent: undefined, + parentSubscription: undefined, + renderComplete: {}, + runtimeId: 1, + reload: jest.fn(), + setLayerList: jest.fn(), + setEventHandlers: jest.fn(), + setRenderTooltipContent: jest.fn(), + type: 'map', + updateInput: jest.fn(), + }; + const testProps = { + endDate: '2019-08-28T05:50:57.877Z', + filters: [], + query: { query: '', language: 'kuery' }, + setQuery, + startDate: '2019-08-28T05:50:47.877Z', + }; beforeEach(() => { - setQuery = jest.fn(); + setQuery.mockClear(); }); test('renders correctly against snapshot', () => { const wrapper = shallow( - + + + ); - expect(wrapper).toMatchSnapshot(); + expect(wrapper.find('EmbeddedMapComponent')).toMatchSnapshot(); + }); + + test('renders services.embeddable.EmbeddablePanel', async () => { + const spy = jest.spyOn(redux, 'useSelector'); + spy.mockReturnValue(mockSelector); + + (createEmbeddable as jest.Mock).mockResolvedValue(mockCreateEmbeddable); + + let wrapper: ReactWrapper; + await act(async () => { + wrapper = mount( + + + + ); + }); + + wrapper!.update(); + + expect(wrapper!.find('[data-test-subj="EmbeddablePanel"]').exists()).toEqual(true); + expect(wrapper!.find('[data-test-subj="IndexPatternsMissingPrompt"]').exists()).toEqual(false); + expect(wrapper!.find('[data-test-subj="loading-panel"]').exists()).toEqual(false); + }); + + test('renders IndexPatternsMissingPrompt', async () => { + const spy = jest.spyOn(redux, 'useSelector'); + spy.mockReturnValue({ + ...mockSelector, + kibanaIndexPatterns: [], + }); + + (createEmbeddable as jest.Mock).mockResolvedValue(mockCreateEmbeddable); + + let wrapper: ReactWrapper; + await act(async () => { + wrapper = mount( + + + + ); + }); + + wrapper!.update(); + + expect(wrapper!.find('[data-test-subj="EmbeddablePanel"]').exists()).toEqual(false); + expect(wrapper!.find('[data-test-subj="IndexPatternsMissingPrompt"]').exists()).toEqual(true); + expect(wrapper!.find('[data-test-subj="loading-panel"]').exists()).toEqual(false); + }); + + test('renders Loader', async () => { + const spy = jest.spyOn(redux, 'useSelector'); + spy.mockReturnValue(mockSelector); + + (createEmbeddable as jest.Mock).mockResolvedValue(null); + + let wrapper: ReactWrapper; + await act(async () => { + wrapper = mount( + + + + ); + }); + + wrapper!.update(); + + expect(wrapper!.find('[data-test-subj="EmbeddablePanel"]').exists()).toEqual(false); + expect(wrapper!.find('[data-test-subj="IndexPatternsMissingPrompt"]').exists()).toEqual(false); + expect(wrapper!.find('[data-test-subj="loading-panel"]').exists()).toEqual(true); }); }); diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx index 4d96c213818aa..7ae8aecdab606 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx @@ -5,27 +5,31 @@ */ import { EuiLink, EuiText } from '@elastic/eui'; -import React, { useEffect, useState } from 'react'; +import deepEqual from 'fast-deep-equal'; +import React, { useEffect, useState, useMemo } from 'react'; import { createPortalNode, InPortal } from 'react-reverse-portal'; import styled, { css } from 'styled-components'; -import { ErrorEmbeddable } from '../../../../../../../src/plugins/embeddable/public'; -import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; -import { getIndexPatternTitleIdMapping } from '../../../common/hooks/api/helpers'; -import { useIndexPatterns } from '../../../common/hooks/use_index_patterns'; +import { useSelector } from 'react-redux'; +import { + ErrorEmbeddable, + isErrorEmbeddable, +} from '../../../../../../../src/plugins/embeddable/public'; import { Loader } from '../../../common/components/loader'; import { displayErrorToast, useStateToaster } from '../../../common/components/toasters'; import { GlobalTimeArgs } from '../../../common/containers/use_global_time'; import { Embeddable } from './embeddable'; import { EmbeddableHeader } from './embeddable_header'; -import { createEmbeddable, findMatchingIndexPatterns } from './embedded_map_helpers'; +import { createEmbeddable } from './embedded_map_helpers'; import { IndexPatternsMissingPrompt } from './index_patterns_missing_prompt'; import { MapToolTip } from './map_tool_tip/map_tool_tip'; import * as i18n from './translations'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { MapEmbeddable } from '../../../../../../plugins/maps/public/embeddable'; import { Query, Filter } from '../../../../../../../src/plugins/data/public'; -import { useKibana, useUiSetting$ } from '../../../common/lib/kibana'; +import { useKibana } from '../../../common/lib/kibana'; +import { getDefaultSourcererSelector } from './selector'; +import { getLayerList } from './map_config'; interface EmbeddableMapProps { maintainRatio?: boolean; @@ -86,13 +90,19 @@ export const EmbeddedMapComponent = ({ const [embeddable, setEmbeddable] = React.useState( undefined ); - const [isLoading, setIsLoading] = useState(true); const [isError, setIsError] = useState(false); const [isIndexError, setIsIndexError] = useState(false); const [, dispatchToaster] = useStateToaster(); - const [loadingKibanaIndexPatterns, kibanaIndexPatterns] = useIndexPatterns(); - const [siemDefaultIndices] = useUiSetting$(DEFAULT_INDEX_KEY); + const defaultSourcererScopeSelector = useMemo(getDefaultSourcererSelector, []); + const { kibanaIndexPatterns, sourcererScope } = useSelector( + defaultSourcererScopeSelector, + deepEqual + ); + + const [mapIndexPatterns, setMapIndexPatterns] = useState( + kibanaIndexPatterns.filter((kip) => sourcererScope.selectedPatterns.includes(kip.title)) + ); // This portalNode provided by react-reverse-portal allows us re-parent the MapToolTip within our // own component tree instead of the embeddables (default). This is necessary to have access to @@ -102,27 +112,30 @@ export const EmbeddedMapComponent = ({ const { services } = useKibana(); + useEffect(() => { + setMapIndexPatterns((prevMapIndexPatterns) => { + const newIndexPatterns = kibanaIndexPatterns.filter((kip) => + sourcererScope.selectedPatterns.includes(kip.title) + ); + if (!deepEqual(newIndexPatterns, prevMapIndexPatterns)) { + if (newIndexPatterns.length === 0) { + setIsError(true); + } + return newIndexPatterns; + } + return prevMapIndexPatterns; + }); + }, [kibanaIndexPatterns, sourcererScope.selectedPatterns]); + // Initial Load useEffect useEffect(() => { let isSubscribed = true; async function setupEmbeddable() { - // Ensure at least one `securitySolution:defaultIndex` kibana index pattern exists before creating embeddable - const matchingIndexPatterns = findMatchingIndexPatterns({ - kibanaIndexPatterns, - siemDefaultIndices, - }); - - if (matchingIndexPatterns.length === 0 && isSubscribed) { - setIsLoading(false); - setIsIndexError(true); - return; - } - // Create & set Embeddable try { const embeddableObject = await createEmbeddable( filters, - getIndexPatternTitleIdMapping(matchingIndexPatterns), + mapIndexPatterns, query, startDate, endDate, @@ -131,7 +144,12 @@ export const EmbeddedMapComponent = ({ services.embeddable ); if (isSubscribed) { - setEmbeddable(embeddableObject); + if (mapIndexPatterns.length === 0) { + setIsIndexError(true); + } else { + setEmbeddable(embeddableObject); + setIsIndexError(false); + } } } catch (e) { if (isSubscribed) { @@ -139,19 +157,41 @@ export const EmbeddedMapComponent = ({ setIsError(true); } } - if (isSubscribed) { - setIsLoading(false); - } } - - if (!loadingKibanaIndexPatterns) { + if (embeddable == null && sourcererScope.selectedPatterns.length > 0) { setupEmbeddable(); } + return () => { isSubscribed = false; }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [loadingKibanaIndexPatterns, kibanaIndexPatterns]); + }, [ + dispatchToaster, + endDate, + embeddable, + filters, + mapIndexPatterns, + query, + portalNode, + services.embeddable, + sourcererScope.selectedPatterns, + setQuery, + startDate, + ]); + + // update layer with new index patterns + useEffect(() => { + const setLayerList = async () => { + if (embeddable != null) { + // @ts-expect-error + await embeddable.setLayerList(getLayerList(mapIndexPatterns)); + embeddable.reload(); + } + }; + if (embeddable != null && !isErrorEmbeddable(embeddable)) { + setLayerList(); + } + }, [embeddable, mapIndexPatterns]); // queryExpression updated useEffect useEffect(() => { @@ -198,10 +238,10 @@ export const EmbeddedMapComponent = ({ - {embeddable != null ? ( - - ) : !isLoading && isIndexError ? ( + {isIndexError ? ( + ) : embeddable != null ? ( + ) : ( )} diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/selector.test.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/selector.test.tsx new file mode 100644 index 0000000000000..d5b105dd32798 --- /dev/null +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/selector.test.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { State } from '../../../common/store'; + +import { getDefaultSourcererSelector } from './selector'; + +jest.mock('../../../common/store/sourcerer', () => ({ + sourcererSelectors: { + kibanaIndexPatternsSelector: jest.fn().mockReturnValue(jest.fn()), + scopesSelector: jest.fn().mockReturnValue(jest.fn().mockReturnValue({ default: '' })), + }, +})); + +describe('getDefaultSourcererSelector', () => { + test('Returns correct format', () => { + const mockMapStateToProps = getDefaultSourcererSelector(); + const result = mockMapStateToProps({} as State); + expect(result).toHaveProperty('kibanaIndexPatterns'); + expect(result).toHaveProperty('sourcererScope'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/selector.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/selector.tsx new file mode 100644 index 0000000000000..2d0bc970f0a51 --- /dev/null +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/selector.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { State } from '../../../common/store'; +import { sourcererSelectors } from '../../../common/store/sourcerer'; +import { + KibanaIndexPatterns, + ManageScope, + SourcererScopeName, +} from '../../../common/store/sourcerer/model'; + +export interface DefaultSourcererSelector { + kibanaIndexPatterns: KibanaIndexPatterns; + sourcererScope: ManageScope; +} + +export const getDefaultSourcererSelector = () => { + const getKibanaIndexPatternsSelector = sourcererSelectors.kibanaIndexPatternsSelector(); + const getScopesSelector = sourcererSelectors.scopesSelector(); + + const mapStateToProps = (state: State): DefaultSourcererSelector => { + const kibanaIndexPatterns = getKibanaIndexPatternsSelector(state); + const scope = getScopesSelector(state)[SourcererScopeName.default]; + + return { + kibanaIndexPatterns, + sourcererScope: scope, + }; + }; + + return mapStateToProps; +}; From 07ebb81a79d323445e089d43e9bef04b4578f44d Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 1 Oct 2020 10:16:30 +0200 Subject: [PATCH 12/64] [UX] Improve page-load axis (#78392) Co-authored-by: Elastic Machine --- .../step_definitions/csm/breakdown_filter.ts | 2 +- .../step_definitions/csm/csm_dashboard.ts | 2 +- .../step_definitions/csm/csm_filters.ts | 2 +- .../step_definitions/csm/percentile_select.ts | 2 +- .../csm/service_name_filter.ts | 2 +- .../RumDashboard/Charts/PageLoadDistChart.tsx | 20 +- .../RumDashboard/Charts/PageViewsChart.tsx | 17 +- .../app/RumDashboard/ClientMetrics/index.tsx | 19 +- .../PageLoadDistribution/BreakdownSeries.tsx | 20 +- .../RumDashboard/UXMetrics/KeyUXMetrics.tsx | 3 +- .../__snapshots__/queries.test.ts.snap | 210 +++++++++++++++++- .../lib/rum_client/get_client_metrics.ts | 6 +- .../rum_client/get_page_load_distribution.ts | 110 ++++++--- .../lib/rum_client/get_pl_dist_breakdown.ts | 12 +- .../plugins/apm/server/routes/rum_client.ts | 4 +- 15 files changed, 357 insertions(+), 74 deletions(-) diff --git a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/breakdown_filter.ts b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/breakdown_filter.ts index acfbe6e0a4e78..342f3e0aa5267 100644 --- a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/breakdown_filter.ts +++ b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/breakdown_filter.ts @@ -36,7 +36,7 @@ Then(`breakdown series should appear in chart`, () => { cy.get('div.echLegendItem__label', DEFAULT_TIMEOUT).should( 'have.text', - 'ChromeChrome Mobile WebViewSafariFirefoxMobile SafariChrome MobileChrome Mobile iOSOverall' + 'OverallChromeChrome Mobile WebViewSafariFirefoxMobile SafariChrome MobileChrome Mobile iOS' ); }); }); diff --git a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_dashboard.ts b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_dashboard.ts index 28af4fd5d8a56..a8edf862ab256 100644 --- a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_dashboard.ts +++ b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_dashboard.ts @@ -26,7 +26,7 @@ Given(`a user browses the APM UI application for RUM Data`, () => { }); Then(`should have correct client metrics`, () => { - const metrics = ['4 ms', '0.06 s', '55 ']; + const metrics = ['4 ms', '58 ms', '55']; verifyClientMetrics(metrics, true); }); diff --git a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_filters.ts b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_filters.ts index 75974ef9c202c..5c2109bb518c2 100644 --- a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_filters.ts +++ b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/csm_filters.ts @@ -56,7 +56,7 @@ Then(/^it filters the client metrics "([^"]*)"$/, (filterName) => { cy.get('.euiStat__title-isLoading').should('not.be.visible'); const data = - filterName === 'os' ? ['5 ms', '0.06 s', '8 '] : ['4 ms', '0.05 s', '28 ']; + filterName === 'os' ? ['5 ms', '64 ms', '8'] : ['4 ms', '55 ms', '28']; verifyClientMetrics(data, true); diff --git a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/percentile_select.ts b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/percentile_select.ts index 4d2ba4d01ae6c..55c980d5edeb4 100644 --- a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/percentile_select.ts +++ b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/percentile_select.ts @@ -18,7 +18,7 @@ When('the user changes the selected percentile', () => { }); Then(`it displays client metric related to that percentile`, () => { - const metrics = ['14 ms', '0.13 s', '55 ']; + const metrics = ['14 ms', '131 ms', '55']; verifyClientMetrics(metrics, false); diff --git a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/service_name_filter.ts b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/service_name_filter.ts index b3899a5649b72..20c6a3fb72aa9 100644 --- a/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/service_name_filter.ts +++ b/x-pack/plugins/apm/e2e/cypress/support/step_definitions/csm/service_name_filter.ts @@ -15,7 +15,7 @@ When('the user changes the selected service name', () => { }); Then(`it displays relevant client metrics`, () => { - const metrics = ['4 ms', '0.06 s', '55 ']; + const metrics = ['4 ms', '58 ms', '55']; verifyClientMetrics(metrics, false); }); diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx index 4a5f43dacedf4..4eb24f8c80b9a 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx @@ -88,6 +88,10 @@ export function PageLoadDistChart({ const [darkMode] = useUiSetting$('theme:darkMode'); + const euiChartTheme = darkMode + ? EUI_CHARTS_THEME_DARK + : EUI_CHARTS_THEME_LIGHT; + return ( numeral(d).format('0.0') + '%'} + labelFormat={(d) => d + ' %'} /> numeral(d).format('0.0') + ' %'} /> {breakdown && ( ('theme:darkMode'); @@ -83,17 +85,17 @@ export function PageViewsChart({ data, loading }: Props) { return yAccessor; }; + const euiChartTheme = darkMode + ? EUI_CHARTS_THEME_DARK + : EUI_CHARTS_THEME_LIGHT; + return ( {(!loading || data) && ( )} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/ClientMetrics/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/ClientMetrics/index.tsx index 03f2f31f35817..310c01291aea4 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/ClientMetrics/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/ClientMetrics/index.tsx @@ -11,6 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiStat, EuiToolTip } from '@elastic/eui'; import { useFetcher } from '../../../../hooks/useFetcher'; import { I18LABELS } from '../translations'; import { useUxQuery } from '../hooks/useUxQuery'; +import { formatToSec } from '../UXMetrics/KeyUXMetrics'; import { CsmSharedContext } from '../CsmSharedContext'; const ClFlexGroup = styled(EuiFlexGroup)` @@ -49,14 +50,14 @@ export function ClientMetrics() { const STAT_STYLE = { width: '240px' }; + const pageViewsTotal = data?.pageViews?.value ?? 0; + return ( @@ -64,7 +65,7 @@ export function ClientMetrics() { @@ -73,9 +74,13 @@ export function ClientMetrics() { - <>{numeral(data?.pageViews?.value).format('0 a') ?? '-'} - + pageViewsTotal < 10000 ? ( + numeral(pageViewsTotal).format('0,0') + ) : ( + + <>{numeral(pageViewsTotal).format('0 a')} + + ) } description={I18LABELS.pageViews} isLoading={status !== 'success'} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx index 3463327441b7b..f348aca495c71 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx @@ -6,8 +6,13 @@ import { CurveType, Fit, LineSeries, ScaleType } from '@elastic/charts'; import React, { useEffect } from 'react'; +import { + EUI_CHARTS_THEME_DARK, + EUI_CHARTS_THEME_LIGHT, +} from '@elastic/eui/dist/eui_charts_theme'; import { PercentileRange } from './index'; import { useBreakdowns } from './use_breakdowns'; +import { useUiSetting$ } from '../../../../../../../../src/plugins/kibana_react/public'; interface Props { field: string; @@ -22,6 +27,12 @@ export function BreakdownSeries({ percentileRange, onLoadingChange, }: Props) { + const [darkMode] = useUiSetting$('theme:darkMode'); + + const euiChartTheme = darkMode + ? EUI_CHARTS_THEME_DARK + : EUI_CHARTS_THEME_LIGHT; + const { data, status } = useBreakdowns({ field, value, @@ -32,9 +43,11 @@ export function BreakdownSeries({ onLoadingChange(status !== 'success'); }, [status, onLoadingChange]); + // sort index 1 color vizColors1 is already used for overall, + // so don't user that here return ( <> - {data?.map(({ data: seriesData, name }) => ( + {data?.map(({ data: seriesData, name }, sortIndex) => ( ))} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx index 53722658cafef..5b0e9709d4fa3 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/UXMetrics/KeyUXMetrics.tsx @@ -6,6 +6,7 @@ import React from 'react'; import { EuiFlexItem, EuiStat, EuiFlexGroup } from '@elastic/eui'; +import numeral from '@elastic/numeral'; import { UXMetrics } from './index'; import { FCP_LABEL, @@ -77,7 +78,7 @@ export function KeyUXMetrics({ data, loading }: Props) { diff --git a/x-pack/plugins/apm/server/lib/rum_client/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/rum_client/__snapshots__/queries.test.ts.snap index 66cfa954965d2..1c724efac37b2 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/rum_client/__snapshots__/queries.test.ts.snap @@ -245,10 +245,214 @@ Object { ], }, }, - "minDuration": Object { - "min": Object { + "loadDistribution": Object { + "percentile_ranks": Object { "field": "transaction.duration.us", - "missing": 0, + "hdr": Object { + "number_of_significant_value_digits": 3, + }, + "keyed": false, + "values": Array [ + 0, + 500000, + 1000000, + 1500000, + 2000000, + 2500000, + 3000000, + 3500000, + 4000000, + 4500000, + 5000000, + 5500000, + 6000000, + 6500000, + 7000000, + 7500000, + 8000000, + 8500000, + 9000000, + 9500000, + 10000000, + 10500000, + 11000000, + 11500000, + 12000000, + 12500000, + 13000000, + 13500000, + 14000000, + 14500000, + 15000000, + 15500000, + 16000000, + 16500000, + 17000000, + 17500000, + 18000000, + 18500000, + 19000000, + 19500000, + 20000000, + 20500000, + 21000000, + 21500000, + 22000000, + 22500000, + 23000000, + 23500000, + 24000000, + 24500000, + 25000000, + 25500000, + 26000000, + 26500000, + 27000000, + 27500000, + 28000000, + 28500000, + 29000000, + 29500000, + 30000000, + 30500000, + 31000000, + 31500000, + 32000000, + 32500000, + 33000000, + 33500000, + 34000000, + 34500000, + 35000000, + 35500000, + 36000000, + 36500000, + 37000000, + 37500000, + 38000000, + 38500000, + 39000000, + 39500000, + 40000000, + 40500000, + 41000000, + 41500000, + 42000000, + 42500000, + 43000000, + 43500000, + 44000000, + 44500000, + 45000000, + 45500000, + 46000000, + 46500000, + 47000000, + 47500000, + 48000000, + 48500000, + 49000000, + 49500000, + 50000000, + 50500000, + 51000000, + 51500000, + 52000000, + 52500000, + 53000000, + 53500000, + 54000000, + 54500000, + 55000000, + 55500000, + 56000000, + 56500000, + 57000000, + 57500000, + 58000000, + 58500000, + 59000000, + 59500000, + 60000000, + 60500000, + 61000000, + 61500000, + 62000000, + 62500000, + 63000000, + 63500000, + 64000000, + 64500000, + 65000000, + 65500000, + 66000000, + 66500000, + 67000000, + 67500000, + 68000000, + 68500000, + 69000000, + 69500000, + 70000000, + 70500000, + 71000000, + 71500000, + 72000000, + 72500000, + 73000000, + 73500000, + 74000000, + 74500000, + 75000000, + 75500000, + 76000000, + 76500000, + 77000000, + 77500000, + 78000000, + 78500000, + 79000000, + 79500000, + 80000000, + 80500000, + 81000000, + 81500000, + 82000000, + 82500000, + 83000000, + 83500000, + 84000000, + 84500000, + 85000000, + 85500000, + 86000000, + 86500000, + 87000000, + 87500000, + 88000000, + 88500000, + 89000000, + 89500000, + 90000000, + 90500000, + 91000000, + 91500000, + 92000000, + 92500000, + 93000000, + 93500000, + 94000000, + 94500000, + 95000000, + 95500000, + 96000000, + 96500000, + 97000000, + 97500000, + 98000000, + 98500000, + 99000000, + ], }, }, }, diff --git a/x-pack/plugins/apm/server/lib/rum_client/get_client_metrics.ts b/x-pack/plugins/apm/server/lib/rum_client/get_client_metrics.ts index a210c32ceb44e..6566ea4f5e29b 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/get_client_metrics.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/get_client_metrics.ts @@ -72,11 +72,9 @@ export async function getClientMetrics({ // Divide by 1000 to convert ms into seconds return { pageViews, - backEnd: { value: (backEnd.values[pkey] || 0) / 1000 }, + backEnd: { value: backEnd.values[pkey] || 0 }, frontEnd: { - value: - ((domInteractive.values[pkey] || 0) - (backEnd.values[pkey] || 0)) / - 1000, + value: (domInteractive.values[pkey] || 0) - (backEnd.values[pkey] || 0), }, }; } diff --git a/x-pack/plugins/apm/server/lib/rum_client/get_page_load_distribution.ts b/x-pack/plugins/apm/server/lib/rum_client/get_page_load_distribution.ts index 25de9f06fefc4..5f666feb8a18f 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/get_page_load_distribution.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/get_page_load_distribution.ts @@ -15,8 +15,6 @@ import { export const MICRO_TO_SEC = 1000000; -const NUMBER_OF_PLD_STEPS = 100; - export function microToSec(val: number) { return Math.round((val / MICRO_TO_SEC + Number.EPSILON) * 100) / 100; } @@ -24,15 +22,31 @@ export function microToSec(val: number) { export const getPLDChartSteps = ({ maxDuration, minDuration, + initStepValue, }: { maxDuration: number; minDuration: number; + initStepValue?: number; }) => { - const stepValue = (maxDuration - minDuration) / NUMBER_OF_PLD_STEPS; - const stepValues = []; - for (let i = 1; i < NUMBER_OF_PLD_STEPS + 1; i++) { - stepValues.push((stepValue * i + minDuration).toFixed(2)); + let stepValue = 0.5; + // if diff is too low, let's lower + // down the steps value to increase steps + if (maxDuration - minDuration <= 5 * MICRO_TO_SEC) { + stepValue = 0.1; + } + + if (initStepValue) { + stepValue = initStepValue; + } + + let initValue = minDuration; + const stepValues = [initValue]; + + while (initValue < maxDuration) { + initValue += stepValue * MICRO_TO_SEC; + stepValues.push(initValue); } + return stepValues; }; @@ -52,16 +66,21 @@ export async function getPageLoadDistribution({ urlQuery, }); + // we will first get 100 steps using 0sec and 50sec duration, + // most web apps will cover this use case + // if 99th percentile is greater than 50sec, + // we will fetch additional 5 steps beyond 99th percentile + let maxDuration = (maxPercentile ? +maxPercentile : 50) * MICRO_TO_SEC; + const minDuration = minPercentile ? +minPercentile * MICRO_TO_SEC : 0; + const stepValues = getPLDChartSteps({ + maxDuration, + minDuration, + }); + const params = mergeProjection(projection, { body: { size: 0, aggs: { - minDuration: { - min: { - field: TRANSACTION_DURATION, - missing: 0, - }, - }, durPercentiles: { percentiles: { field: TRANSACTION_DURATION, @@ -71,6 +90,16 @@ export async function getPageLoadDistribution({ }, }, }, + loadDistribution: { + percentile_ranks: { + field: TRANSACTION_DURATION, + values: stepValues, + keyed: false, + hdr: { + number_of_significant_value_digits: 3, + }, + }, + }, }, }, }); @@ -86,22 +115,40 @@ export async function getPageLoadDistribution({ return null; } - const { durPercentiles, minDuration } = aggregations ?? {}; + const { durPercentiles, loadDistribution } = aggregations ?? {}; - const minPerc = minPercentile - ? +minPercentile * MICRO_TO_SEC - : minDuration?.value ?? 0; + let pageDistVals = loadDistribution?.values ?? []; - const maxPercQuery = durPercentiles?.values['99.0'] ?? 10000; + const maxPercQuery = durPercentiles?.values['99.0'] ?? 0; - const maxPerc = maxPercentile ? +maxPercentile * MICRO_TO_SEC : maxPercQuery; + // we assumed that page load will never exceed 50secs, if 99th percentile is + // greater then let's fetch additional 10 steps, to cover that on the chart + if (maxPercQuery > maxDuration && !maxPercentile) { + const additionalStepsPageVals = await getPercentilesDistribution({ + setup, + maxDuration: maxPercQuery, + // we pass 50sec as min to get next steps + minDuration: maxDuration, + }); - const pageDist = await getPercentilesDistribution({ - setup, - minDuration: minPerc, - maxDuration: maxPerc, + pageDistVals = pageDistVals.concat(additionalStepsPageVals); + maxDuration = maxPercQuery; + } + + // calculate the diff to get actual page load on specific duration value + const pageDist = pageDistVals.map(({ key, value }, index: number, arr) => { + return { + x: microToSec(key), + y: index === 0 ? value : value - arr[index - 1].value, + }; }); + if (pageDist.length > 0) { + while (pageDist[pageDist.length - 1].y === 0) { + pageDist.pop(); + } + } + Object.entries(durPercentiles?.values ?? {}).forEach(([key, val]) => { if (durPercentiles?.values?.[key]) { durPercentiles.values[key] = microToSec(val as number); @@ -111,8 +158,8 @@ export async function getPageLoadDistribution({ return { pageLoadDistribution: pageDist, percentiles: durPercentiles?.values, - minDuration: microToSec(minPerc), - maxDuration: microToSec(maxPerc), + minDuration: microToSec(minDuration), + maxDuration: microToSec(maxDuration), }; } @@ -125,7 +172,11 @@ const getPercentilesDistribution = async ({ minDuration: number; maxDuration: number; }) => { - const stepValues = getPLDChartSteps({ maxDuration, minDuration }); + const stepValues = getPLDChartSteps({ + minDuration: minDuration + 0.5 * MICRO_TO_SEC, + maxDuration, + initStepValue: 0.5, + }); const projection = getRumPageLoadTransactionsProjection({ setup, @@ -153,12 +204,5 @@ const getPercentilesDistribution = async ({ const { aggregations } = await apmEventClient.search(params); - const pageDist = aggregations?.loadDistribution.values ?? []; - - return pageDist.map(({ key, value }, index: number, arr) => { - return { - x: microToSec(key), - y: index === 0 ? value : value - arr[index - 1].value, - }; - }); + return aggregations?.loadDistribution.values ?? []; }; diff --git a/x-pack/plugins/apm/server/lib/rum_client/get_pl_dist_breakdown.ts b/x-pack/plugins/apm/server/lib/rum_client/get_pl_dist_breakdown.ts index d59817cc682a9..bebf9c0bc99c9 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/get_pl_dist_breakdown.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/get_pl_dist_breakdown.ts @@ -41,21 +41,21 @@ export const getBreakdownField = (breakdown: string) => { export const getPageLoadDistBreakdown = async ({ setup, - minDuration, - maxDuration, + minPercentile, + maxPercentile, breakdown, urlQuery, }: { setup: Setup & SetupTimeRange & SetupUIFilters; - minDuration: number; - maxDuration: number; + minPercentile: number; + maxPercentile: number; breakdown: string; urlQuery?: string; }) => { // convert secs to micros const stepValues = getPLDChartSteps({ - minDuration: minDuration * MICRO_TO_SEC, - maxDuration: maxDuration * MICRO_TO_SEC, + maxDuration: (maxPercentile ? +maxPercentile : 50) * MICRO_TO_SEC, + minDuration: minPercentile ? +minPercentile * MICRO_TO_SEC : 0, }); const projection = getRumPageLoadTransactionsProjection({ diff --git a/x-pack/plugins/apm/server/routes/rum_client.ts b/x-pack/plugins/apm/server/routes/rum_client.ts index d86069a3ec27a..2bdfaa1421eea 100644 --- a/x-pack/plugins/apm/server/routes/rum_client.ts +++ b/x-pack/plugins/apm/server/routes/rum_client.ts @@ -89,8 +89,8 @@ export const rumPageLoadDistBreakdownRoute = createRoute(() => ({ return getPageLoadDistBreakdown({ setup, - minDuration: Number(minPercentile), - maxDuration: Number(maxPercentile), + minPercentile: Number(minPercentile), + maxPercentile: Number(maxPercentile), breakdown, urlQuery, }); From addbdf7cb608ef1b1aeda1d31d0341f6ace02c98 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Thu, 1 Oct 2020 10:29:51 +0200 Subject: [PATCH 13/64] [Drilldowns][Docs] Communicate the visualization types that support drilldowns (#78761) --- .../dashboard/dashboard-drilldown.asciidoc | 21 +++++++++++++++++++ docs/user/dashboard/url-drilldown.asciidoc | 16 ++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/docs/user/dashboard/dashboard-drilldown.asciidoc b/docs/user/dashboard/dashboard-drilldown.asciidoc index 84701cae2ecc6..e50c1281beede 100644 --- a/docs/user/dashboard/dashboard-drilldown.asciidoc +++ b/docs/user/dashboard/dashboard-drilldown.asciidoc @@ -11,6 +11,26 @@ This example shows a dashboard panel that contains a pie chart with a configured [role="screenshot"] image::images/drilldown_on_piechart.gif[Drilldown on pie chart that navigates to another dashboard] +[float] +[[dashboard-drilldown-supported-panels]] +==== Supported panels + +The following panels support dashboard drilldowns: + +* Lens +* Area +* Data table +* Heat map +* Horizontal bar +* Line +* Maps +* Pie +* TSVB +* Tag cloud +* Timelion +* Vega +* Vertical bar + [float] [[drilldowns-example]] ==== Try it: Create a dashboard drilldown @@ -74,3 +94,4 @@ image::images/drilldown_on_panel.png[Drilldown on pie chart that navigates to an + You are navigated to your destination dashboard. Verify that the search query, filters, and time range are carried over. + diff --git a/docs/user/dashboard/url-drilldown.asciidoc b/docs/user/dashboard/url-drilldown.asciidoc index ee879256a1fae..620a2d2056bf1 100644 --- a/docs/user/dashboard/url-drilldown.asciidoc +++ b/docs/user/dashboard/url-drilldown.asciidoc @@ -14,6 +14,22 @@ image:images/url_drilldown_go_to_github.gif[Drilldown on pie chart that navigate NOTE: URL drilldown is available with the https://www.elastic.co/subscriptions[Gold subscription] and higher. +[float] +[[url-drilldown-supported-panels]] +==== Supported panels + +The following panels support URL drilldowns: + +* Lens +* Area +* Data table +* Heat map +* Horizontal bar +* Line +* Pie +* Tag cloud +* Vertical bar + [float] [[try-it]] ==== Try it: Create a URL drilldown From d8ded4df6cc173dae624da2408b4657b541f7f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Thu, 1 Oct 2020 10:56:52 +0200 Subject: [PATCH 14/64] Fix ML conditionals links Cypress tests (#78568) --- .../integration/ml_conditional_links.spec.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts b/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts index 3b89163392626..7bdc461a7c73d 100644 --- a/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts @@ -24,20 +24,7 @@ import { mlNetworkSingleIpNullKqlQuery, } from '../urls/ml_conditional_links'; -// FLAKY: https://github.com/elastic/kibana/issues/78512 -// FLAKY: https://github.com/elastic/kibana/issues/78511 -// FLAKY: https://github.com/elastic/kibana/issues/78510 -// FLAKY: https://github.com/elastic/kibana/issues/78509 -// FLAKY: https://github.com/elastic/kibana/issues/78508 -// FLAKY: https://github.com/elastic/kibana/issues/78507 -// FLAKY: https://github.com/elastic/kibana/issues/78506 -// FLAKY: https://github.com/elastic/kibana/issues/78505 -// FLAKY: https://github.com/elastic/kibana/issues/78504 -// FLAKY: https://github.com/elastic/kibana/issues/78503 -// FLAKY: https://github.com/elastic/kibana/issues/78502 -// FLAKY: https://github.com/elastic/kibana/issues/78501 -// FLAKY: https://github.com/elastic/kibana/issues/78500 -describe.skip('ml conditional links', () => { +describe('ml conditional links', () => { it('sets the KQL from a single IP with a value for the query', () => { loginAndWaitForPageWithoutDateRange(mlNetworkSingleIpKqlQuery); cy.get(KQL_INPUT) From 9b187c5f81297d6d662a24266594494d7ef628ae Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 1 Oct 2020 11:10:15 +0200 Subject: [PATCH 15/64] Make the actual Vislib import async (#78949) Co-authored-by: Elastic Machine --- src/plugins/vis_type_vislib/public/vis_controller.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/vis_type_vislib/public/vis_controller.tsx b/src/plugins/vis_type_vislib/public/vis_controller.tsx index c422e9f4f3a0a..3a05030f804ca 100644 --- a/src/plugins/vis_type_vislib/public/vis_controller.tsx +++ b/src/plugins/vis_type_vislib/public/vis_controller.tsx @@ -20,8 +20,6 @@ import $ from 'jquery'; import React, { RefObject } from 'react'; -// @ts-ignore -import { Vis as Vislib } from './vislib/vis'; import { Positions } from './utils/collections'; import { VisTypeVislibDependencies } from './plugin'; import { mountReactNode } from '../../../core/public/utils'; @@ -80,6 +78,9 @@ export const createVislibVisController = (deps: VisTypeVislibDependencies) => { return resolve(); } + // @ts-expect-error + const { Vis: Vislib } = await import('./vislib/vis'); + this.vislibVis = new Vislib(this.chartEl, visParams, deps); this.vislibVis.on('brush', this.vis.API.events.brush); this.vislibVis.on('click', this.vis.API.events.filter); From e836efc3e0f89470d2d207f78b08ce74b5f995fd Mon Sep 17 00:00:00 2001 From: Bohdan Tsymbala Date: Thu, 1 Oct 2020 11:31:11 +0200 Subject: [PATCH 16/64] Changed the color of the confirm button in trusted app deletion dialog. (#78768) * Changed the color of the confirm button in trusted app deletion dialog. * Updated the snapshots. --- .../trusted_app_deletion_dialog.test.tsx.snap | 6 +++--- .../trusted_apps/view/trusted_app_deletion_dialog.tsx | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/__snapshots__/trusted_app_deletion_dialog.test.tsx.snap b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/__snapshots__/trusted_app_deletion_dialog.test.tsx.snap index fdb20f229f144..89f81948e166b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/__snapshots__/trusted_app_deletion_dialog.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/__snapshots__/trusted_app_deletion_dialog.test.tsx.snap @@ -85,7 +85,7 @@ exports[`TrustedAppDeletionDialog renders correctly when deletion failed 1`] = `
} > - + , this.el From 36814aa1ef5e8b1e593bbcbfc915075f62bc38c0 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 1 Oct 2020 13:30:10 +0300 Subject: [PATCH 21/64] Change implementation on TSVB functional when testing the indexPattern switch (#78754) Co-authored-by: Elastic Machine --- test/functional/apps/visualize/_tsvb_chart.ts | 4 ++-- test/functional/page_objects/visual_builder_page.ts | 8 ++++++++ test/functional/services/combo_box.ts | 11 +++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/test/functional/apps/visualize/_tsvb_chart.ts b/test/functional/apps/visualize/_tsvb_chart.ts index bfe0da7a5b24f..3e325d5e6b907 100644 --- a/test/functional/apps/visualize/_tsvb_chart.ts +++ b/test/functional/apps/visualize/_tsvb_chart.ts @@ -135,11 +135,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.visualBuilder.clickPanelOptions('metric'); const fromTime = 'Oct 22, 2018 @ 00:00:00.000'; const toTime = 'Oct 28, 2018 @ 23:59:59.999'; + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); // Sometimes popovers take some time to appear in Firefox (#71979) await retry.tryForTime(20000, async () => { - await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); await PageObjects.visualBuilder.setIndexPatternValue('kibana_sample_data_flights'); - await PageObjects.common.sleep(3000); + await PageObjects.visualBuilder.waitForIndexPatternTimeFieldOptionsLoaded(); await PageObjects.visualBuilder.selectIndexPatternTimeField('timestamp'); }); const newValue = await PageObjects.visualBuilder.getMetricValue(); diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 6e49fd3b03494..37634d0248b04 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -453,6 +453,14 @@ export function VisualBuilderPageProvider({ getService, getPageObjects }: FtrPro await PageObjects.header.waitUntilLoadingHasFinished(); } + public async waitForIndexPatternTimeFieldOptionsLoaded() { + await retry.waitFor('combobox options loaded', async () => { + const options = await comboBox.getOptions('metricsIndexPatternFieldsSelect'); + log.debug(`-- optionsCount=${options.length}`); + return options.length > 0; + }); + } + public async selectIndexPatternTimeField(timeField: string) { await retry.try(async () => { await comboBox.clearInputField('metricsIndexPatternFieldsSelect'); diff --git a/test/functional/services/combo_box.ts b/test/functional/services/combo_box.ts index ac7a40361d065..57e1857989950 100644 --- a/test/functional/services/combo_box.ts +++ b/test/functional/services/combo_box.ts @@ -58,6 +58,17 @@ export function ComboBoxProvider({ getService, getPageObjects }: FtrProviderCont return isMouseClick ? await element.clickMouseButton() : await element._webElement.click(); } + /** + * Finds combobox element options + * + * @param comboBoxSelector data-test-subj selector + */ + public async getOptions(comboBoxSelector: string) { + const comboBoxElement = await testSubjects.find(comboBoxSelector); + await this.openOptionsList(comboBoxElement); + return await find.allByCssSelector('.euiFilterSelectItem', WAIT_FOR_EXISTS_TIME); + } + /** * Sets value for specified combobox element * From d11da3275d0b829fa48f76df9864e4913fe0cf22 Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Thu, 1 Oct 2020 12:54:40 +0200 Subject: [PATCH 22/64] [Lens] Don't allow values outside of range for number of top values (#78734) --- .../{terms.tsx => terms/index.tsx} | 46 ++++----------- .../definitions/{ => terms}/terms.test.tsx | 32 +++++------ .../terms/values_range_input.test.tsx | 56 +++++++++++++++++++ .../definitions/terms/values_range_input.tsx | 50 +++++++++++++++++ 4 files changed, 133 insertions(+), 51 deletions(-) rename x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/{terms.tsx => terms/index.tsx} (87%) rename x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/{ => terms}/terms.test.tsx (95%) create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.test.tsx create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.tsx diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx similarity index 87% rename from x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx index c147029bbd3c7..85deb2bac25ca 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx @@ -6,24 +6,13 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiFormRow, EuiRange, EuiSelect } from '@elastic/eui'; -import { IndexPatternColumn } from '../../indexpattern'; -import { updateColumnParam } from '../../state_helpers'; -import { DataType } from '../../../types'; -import { OperationDefinition } from './index'; -import { FieldBasedIndexPatternColumn } from './column_types'; - -type PropType = C extends React.ComponentType ? P : unknown; - -// Add ticks to EuiRange component props -const FixedEuiRange = (EuiRange as unknown) as React.ComponentType< - PropType & { - ticks?: Array<{ - label: string; - value: number; - }>; - } ->; +import { EuiFormRow, EuiSelect } from '@elastic/eui'; +import { IndexPatternColumn } from '../../../indexpattern'; +import { updateColumnParam } from '../../../state_helpers'; +import { DataType } from '../../../../types'; +import { OperationDefinition } from '../index'; +import { FieldBasedIndexPatternColumn } from '../column_types'; +import { ValuesRangeInput } from './values_range_input'; function ofName(name: string) { return i18n.translate('xpack.lens.indexPattern.termsOf', { @@ -182,30 +171,19 @@ export const termsOperation: OperationDefinition - | React.MouseEvent - ) => + onChange={(value) => { setState( updateColumnParam({ state, layerId, currentColumn, paramName: 'size', - value: Number((e.target as HTMLInputElement).value), + value, }) - ) - } - aria-label={i18n.translate('xpack.lens.indexPattern.terms.size', { - defaultMessage: 'Number of values', - })} + ); + }} /> { it('should render current size value', () => { const setStateSpy = jest.fn(); - const instance = shallow( + const instance = mount( { /> ); - expect(instance.find(EuiRange).prop('value')).toEqual(3); + expect(instance.find(EuiRange).prop('value')).toEqual('3'); }); it('should update state with the size value', () => { const setStateSpy = jest.fn(); - const instance = shallow( + const instance = mount( { /> ); - instance.find(EuiRange).prop('onChange')!( - { - target: { - value: '7', - }, - } as React.ChangeEvent, - true - ); + act(() => { + instance.find(ValuesRangeInput).prop('onChange')!(7); + }); + expect(setStateSpy).toHaveBeenCalledWith({ ...state, layers: { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.test.tsx new file mode 100644 index 0000000000000..c1620dd316a60 --- /dev/null +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.test.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { act } from 'react-dom/test-utils'; +import { shallow } from 'enzyme'; +import { EuiRange } from '@elastic/eui'; +import { ValuesRangeInput } from './values_range_input'; + +jest.mock('react-use', () => ({ + useDebounce: (fn: () => void) => fn(), +})); + +describe('ValuesRangeInput', () => { + it('should render EuiRange correctly', () => { + const onChangeSpy = jest.fn(); + const instance = shallow(); + + expect(instance.find(EuiRange).prop('value')).toEqual('5'); + }); + + it('should run onChange function on update', () => { + const onChangeSpy = jest.fn(); + const instance = shallow(); + act(() => { + instance.find(EuiRange).prop('onChange')!( + { currentTarget: { value: '7' } } as React.ChangeEvent, + true + ); + }); + expect(instance.find(EuiRange).prop('value')).toEqual('7'); + // useDebounce runs on initialization and on change + expect(onChangeSpy.mock.calls.length).toBe(2); + expect(onChangeSpy.mock.calls[0][0]).toBe(5); + expect(onChangeSpy.mock.calls[1][0]).toBe(7); + }); + it('should not run onChange function on update when value is out of 1-100 range', () => { + const onChangeSpy = jest.fn(); + const instance = shallow(); + act(() => { + instance.find(EuiRange).prop('onChange')!( + { currentTarget: { value: '107' } } as React.ChangeEvent, + true + ); + }); + instance.update(); + expect(instance.find(EuiRange).prop('value')).toEqual('107'); + // useDebounce only runs on initialization + expect(onChangeSpy.mock.calls.length).toBe(2); + expect(onChangeSpy.mock.calls[0][0]).toBe(5); + expect(onChangeSpy.mock.calls[1][0]).toBe(100); + }); +}); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.tsx new file mode 100644 index 0000000000000..6bfde4b652571 --- /dev/null +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/values_range_input.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { useDebounce } from 'react-use'; +import { i18n } from '@kbn/i18n'; +import { EuiRange } from '@elastic/eui'; + +export const ValuesRangeInput = ({ + value, + onChange, +}: { + value: number; + onChange: (value: number) => void; +}) => { + const MIN_NUMBER_OF_VALUES = 1; + const MAX_NUMBER_OF_VALUES = 100; + + const [inputValue, setInputValue] = useState(String(value)); + useDebounce( + () => { + if (inputValue === '') { + return; + } + const inputNumber = Number(inputValue); + onChange(Math.min(MAX_NUMBER_OF_VALUES, Math.max(inputNumber, MIN_NUMBER_OF_VALUES))); + }, + 256, + [inputValue] + ); + + return ( + setInputValue(currentTarget.value)} + aria-label={i18n.translate('xpack.lens.indexPattern.terms.size', { + defaultMessage: 'Number of values', + })} + /> + ); +}; From 8948811c634ba2e4c7a4c9881b6834f7577440a0 Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Thu, 1 Oct 2020 12:54:48 +0200 Subject: [PATCH 23/64] fix: add EuiOutsideClickDetector (#78733) Co-authored-by: Elastic Machine --- .../config_panel/dimension_container.tsx | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx index d6b395ac74cce..a415eb44cf196 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx @@ -13,6 +13,7 @@ import { EuiButtonEmpty, EuiFlexItem, EuiFocusTrap, + EuiOutsideClickDetector, } from '@elastic/eui'; import classNames from 'classnames'; @@ -91,37 +92,39 @@ export function DimensionContainer({ const flyout = flyoutIsVisible && ( -
- - - - {panelTitle} + +
+ + + + {panelTitle} + + + + + {panel} + + + + {i18n.translate('xpack.lens.dimensionContainer.close', { + defaultMessage: 'Close', + })} - - - - {panel} - - - - {i18n.translate('xpack.lens.dimensionContainer.close', { - defaultMessage: 'Close', - })} - - -
+ +
+
); From 3024513e107a7411a0a6b4aadc5ba362f13ce0e2 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Thu, 1 Oct 2020 14:05:59 +0300 Subject: [PATCH 24/64] [KP] instrument platform server-side code with apm agent (#70919) * instrument platform server-side code with apm agent: setup, start lifecycles and SO migration * add span type * span should have name: saved_objects.migration * remove migration reports * put migration span back --- src/core/server/server.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/server/server.ts b/src/core/server/server.ts index 5935636d54f9d..4e5a7a328bed4 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ - +import apm from 'elastic-apm-node'; import { config as pathConfig } from '@kbn/utils'; import { mapToObject } from '@kbn/std'; import { ConfigService, Env, RawConfigurationProvider, coreDeprecationProvider } from './config'; @@ -106,6 +106,7 @@ export class Server { public async setup() { this.log.debug('setting up server'); + const setupTransaction = apm.startTransaction('server_setup', 'kibana_platform'); const environmentSetup = await this.environment.setup(); @@ -207,20 +208,25 @@ export class Server { this.registerCoreContext(coreSetup); this.coreApp.setup(coreSetup); + setupTransaction?.end(); return coreSetup; } public async start() { this.log.debug('starting server'); + const startTransaction = apm.startTransaction('server_start', 'kibana_platform'); + const auditTrailStart = this.auditTrail.start(); const elasticsearchStart = await this.elasticsearch.start({ auditTrail: auditTrailStart, }); + const soStartSpan = startTransaction?.startSpan('saved_objects.migration', 'migration'); const savedObjectsStart = await this.savedObjects.start({ elasticsearch: elasticsearchStart, pluginsInitialized: this.#pluginsInitialized, }); + soStartSpan?.end(); const capabilitiesStart = this.capabilities.start(); const uiSettingsStart = await this.uiSettings.start(); const metricsStart = await this.metrics.start(); @@ -248,6 +254,7 @@ export class Server { await this.http.start(); + startTransaction?.end(); return this.coreStart; } From cbc83003d35a3b0016d241100fb12d357c4bbc09 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Thu, 1 Oct 2020 14:21:34 +0300 Subject: [PATCH 25/64] [Actions][Jira] Fix bug with Jira sub-task (#79070) --- .../builtin_action_types/jira/service.test.ts | 2 +- .../builtin_action_types/jira/service.ts | 5 +- .../builtin_action_types/jira/api.test.ts | 159 ++++++++++++++++++ .../builtin_action_types/jira/api.ts | 2 +- .../jira/use_get_fields_by_issue_type.tsx | 1 + .../jira/use_get_issue_types.tsx | 1 + .../jira/use_get_issues.tsx | 1 + .../jira/use_get_single_issue.tsx | 3 +- .../resilient/use_get_incident_types.tsx | 1 + .../resilient/use_get_severity.tsx | 1 + 10 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts index 605c05e2a9f25..fe4e135c76fc3 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts @@ -965,7 +965,7 @@ describe('Jira service', () => { axios, logger, method: 'get', - url: `https://siem-kibana.atlassian.net/rest/api/2/search?jql=project=CK and summary ~"Test title"`, + url: `https://siem-kibana.atlassian.net/rest/api/2/search?jql=project%3D%22CK%22%20and%20summary%20~%22Test%20title%22`, }); }); diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts index 7429c3d36d7b0..f52d3fa2efd37 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts @@ -396,7 +396,10 @@ export const createExternalService = ( }; const getIssues = async (title: string) => { - const query = `${searchUrl}?jql=project=${projectKey} and summary ~"${title}"`; + const query = `${searchUrl}?jql=${encodeURIComponent( + `project="${projectKey}" and summary ~"${title}"` + )}`; + try { const res = await request({ axios: axiosInstance, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts new file mode 100644 index 0000000000000..d5474aaceaa48 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { getIssueTypes, getFieldsByIssueType, getIssues, getIssue } from './api'; + +const issueTypesResponse = { + data: { + projects: [ + { + issuetypes: [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, + ], + }, + ], + }, +}; + +const fieldsResponse = { + data: { + projects: [ + { + issuetypes: [ + { + id: '10006', + name: 'Task', + fields: { + summary: { fieldId: 'summary' }, + priority: { + fieldId: 'priority', + allowedValues: [ + { + name: 'Highest', + id: '1', + }, + { + name: 'High', + id: '2', + }, + { + name: 'Medium', + id: '3', + }, + { + name: 'Low', + id: '4', + }, + { + name: 'Lowest', + id: '5', + }, + ], + defaultValue: { + name: 'Medium', + id: '3', + }, + }, + }, + }, + ], + }, + ], + }, +}; + +const issueResponse = { + id: '10267', + key: 'RJ-107', + fields: { summary: 'Test title' }, +}; + +const issuesResponse = [issueResponse]; + +describe('Jira API', () => { + const http = httpServiceMock.createStartContract(); + + beforeEach(() => jest.resetAllMocks()); + + describe('getIssueTypes', () => { + test('should call get issue types API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(issueTypesResponse); + const res = await getIssueTypes({ http, signal: abortCtrl.signal, connectorId: 'test' }); + + expect(res).toEqual(issueTypesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"issueTypes","subActionParams":{}}}', + signal: abortCtrl.signal, + }); + }); + }); + + describe('getFieldsByIssueType', () => { + test('should call get fields API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(fieldsResponse); + const res = await getFieldsByIssueType({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + id: '10006', + }); + + expect(res).toEqual(fieldsResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"fieldsByIssueType","subActionParams":{"id":"10006"}}}', + signal: abortCtrl.signal, + }); + }); + }); + + describe('getIssues', () => { + test('should call get fields API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(issuesResponse); + const res = await getIssues({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + title: 'test issue', + }); + + expect(res).toEqual(issuesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"issues","subActionParams":{"title":"test issue"}}}', + signal: abortCtrl.signal, + }); + }); + }); + + describe('getIssue', () => { + test('should call get fields API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(issuesResponse); + const res = await getIssue({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + id: 'RJ-107', + }); + + expect(res).toEqual(issuesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"issue","subActionParams":{"id":"RJ-107"}}}', + signal: abortCtrl.signal, + }); + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts index bc9fee042a9a6..c209244c64404 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts @@ -75,7 +75,7 @@ export async function getIssue({ }): Promise> { return await http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { body: JSON.stringify({ - params: { subAction: 'getIncident', subActionParams: { id } }, + params: { subAction: 'issue', subActionParams: { id } }, }), signal, }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx index 08715822e5277..8685ee1e615b0 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx @@ -72,6 +72,7 @@ export const useGetFieldsByIssueType = ({ } } catch (error) { if (!didCancel) { + setIsLoading(false); toastNotifications.addDanger({ title: i18n.FIELDS_API_ERROR, text: error.message, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx index 9ebaf5882d9b9..bdc9a57507441 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx @@ -65,6 +65,7 @@ export const useGetIssueTypes = ({ } } catch (error) { if (!didCancel) { + setIsLoading(false); toastNotifications.addDanger({ title: i18n.ISSUE_TYPES_API_ERROR, text: error.message, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx index d6590b8c70939..8015390d29e3c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx @@ -69,6 +69,7 @@ export const useGetIssues = ({ } } catch (error) { if (!didCancel) { + setIsLoading(false); toastNotifications.addDanger({ title: i18n.ISSUES_API_ERROR, text: error.message, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx index 7df9834f1bd85..c0d2eae14bead 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx @@ -61,7 +61,7 @@ export const useGetSingleIssue = ({ if (!didCancel) { setIsLoading(false); - setIssue(res.data ?? {}); + setIssue(res.data ?? null); if (res.status && res.status === 'error') { toastNotifications.addDanger({ title: i18n.GET_ISSUE_API_ERROR(id), @@ -71,6 +71,7 @@ export const useGetSingleIssue = ({ } } catch (error) { if (!didCancel) { + setIsLoading(false); toastNotifications.addDanger({ title: i18n.GET_ISSUE_API_ERROR(id), text: error.message, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_incident_types.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_incident_types.tsx index 219c6ac77d08d..c2a2268ddb736 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_incident_types.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_incident_types.tsx @@ -65,6 +65,7 @@ export const useGetIncidentTypes = ({ } } catch (error) { if (!didCancel) { + setIsLoading(false); toastNotifications.addDanger({ title: i18n.INCIDENT_TYPES_API_ERROR, text: error.message, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_severity.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_severity.tsx index 83689254f000f..a06fafcf8c10e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_severity.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/use_get_severity.tsx @@ -66,6 +66,7 @@ export const useGetSeverity = ({ } } catch (error) { if (!didCancel) { + setIsLoading(false); toastNotifications.addDanger({ title: i18n.SEVERITY_API_ERROR, text: error.message, From 8d7f2d0828e463b2dadaf10bdff23910401fb134 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 1 Oct 2020 13:39:10 +0200 Subject: [PATCH 26/64] [Lens] Handle missing fields gracefully (#78173) --- .../dimension_panel/bucket_nesting_editor.tsx | 9 +- .../dimension_panel/dimension_editor.tsx | 210 ++++++++++-------- .../dimension_panel/dimension_panel.test.tsx | 30 +++ .../dimension_panel/dimension_panel.tsx | 61 ++++- .../dimension_panel/field_select.tsx | 8 +- .../indexpattern_suggestions.test.tsx | 42 +++- .../indexpattern_suggestions.ts | 4 +- .../public/indexpattern_datasource/utils.ts | 36 +++ 8 files changed, 295 insertions(+), 105 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/bucket_nesting_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/bucket_nesting_editor.tsx index 3d692b1f7f5a8..962abd8d943db 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/bucket_nesting_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/bucket_nesting_editor.tsx @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiHorizontalRule, EuiRadio, EuiSelect, htmlIdGenerator } from '@elastic/eui'; import { IndexPatternLayer, IndexPatternField } from '../types'; import { hasField } from '../utils'; +import { IndexPatternColumn } from '../operations'; const generator = htmlIdGenerator('lens-nesting'); @@ -21,6 +22,10 @@ function nestColumn(columnOrder: string[], outer: string, inner: string) { return result; } +function getFieldName(fieldMap: Record, column: IndexPatternColumn) { + return hasField(column) ? fieldMap[column.sourceField]?.displayName || column.sourceField : ''; +} + export function BucketNestingEditor({ columnId, layer, @@ -39,7 +44,7 @@ export function BucketNestingEditor({ .map(([value, c]) => ({ value, text: c.label, - fieldName: hasField(c) ? fieldMap[c.sourceField].displayName : '', + fieldName: getFieldName(fieldMap, c), operationType: c.operationType, })); @@ -47,7 +52,7 @@ export function BucketNestingEditor({ return null; } - const fieldName = hasField(column) ? fieldMap[column.sourceField].displayName : ''; + const fieldName = getFieldName(fieldMap, column); const prevColumn = layer.columnOrder[layer.columnOrder.indexOf(columnId) - 1]; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx index bd99bd16a63a8..b0d24928b794e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx @@ -26,7 +26,7 @@ import { } from '../operations'; import { deleteColumn, changeColumn, updateColumnParam } from '../state_helpers'; import { FieldSelect } from './field_select'; -import { hasField } from '../utils'; +import { hasField, fieldIsInvalid } from '../utils'; import { BucketNestingEditor } from './bucket_nesting_editor'; import { IndexPattern, IndexPatternField } from '../types'; import { trackUiEvent } from '../../lens_ui_telemetry'; @@ -132,6 +132,15 @@ export function DimensionEditor(props: DimensionEditorProps) { }; }); + const selectedColumnSourceField = + selectedColumn && 'sourceField' in selectedColumn ? selectedColumn.sourceField : undefined; + + const currentFieldIsInvalid = useMemo( + () => + fieldIsInvalid(selectedColumnSourceField, selectedColumn?.operationType, currentIndexPattern), + [selectedColumnSourceField, selectedColumn?.operationType, currentIndexPattern] + ); + const sideNavItems: EuiListGroupItemProps[] = operationsWithCompatibility.map( ({ operationType, compatibleWithCurrentField }) => { const isActive = Boolean( @@ -271,20 +280,16 @@ export function DimensionEditor(props: DimensionEditorProps) { defaultMessage: 'Choose a field', })} fullWidth - isInvalid={Boolean(incompatibleSelectedOperationType)} - error={ - selectedColumn && incompatibleSelectedOperationType - ? selectedOperationDefinition?.input === 'field' - ? i18n.translate('xpack.lens.indexPattern.invalidOperationLabel', { - defaultMessage: 'To use this function, select a different field.', - }) - : i18n.translate('xpack.lens.indexPattern.chooseFieldLabel', { - defaultMessage: 'To use this function, select a field.', - }) - : undefined - } + isInvalid={Boolean(incompatibleSelectedOperationType || currentFieldIsInvalid)} + error={getErrorMessage( + selectedColumn, + Boolean(incompatibleSelectedOperationType), + selectedOperationDefinition?.input, + currentFieldIsInvalid + )} > ) : null} - {!incompatibleSelectedOperationType && selectedColumn && ParamEditor && ( - <> - - - )} + {!currentFieldIsInvalid && + !incompatibleSelectedOperationType && + selectedColumn && + ParamEditor && ( + <> + + + )}
-
- {!incompatibleSelectedOperationType && selectedColumn && ( - { - setState({ - ...state, - layers: { - ...state.layers, - [layerId]: { - ...state.layers[layerId], - columns: { - ...state.layers[layerId].columns, - [columnId]: { - ...selectedColumn, - label: value, - customLabel: true, + {!currentFieldIsInvalid && ( +
+ {!incompatibleSelectedOperationType && selectedColumn && ( + { + setState({ + ...state, + layers: { + ...state.layers, + [layerId]: { + ...state.layers[layerId], + columns: { + ...state.layers[layerId].columns, + [columnId]: { + ...selectedColumn, + label: value, + customLabel: true, + }, }, }, }, - }, - }); - }} - /> - )} - - {!hideGrouping && ( - { - setState({ - ...state, - layers: { - ...state.layers, - [props.layerId]: { - ...state.layers[props.layerId], - columnOrder, + }); + }} + /> + )} + + {!hideGrouping && ( + { + setState({ + ...state, + layers: { + ...state.layers, + [props.layerId]: { + ...state.layers[props.layerId], + columnOrder, + }, }, - }, - }); - }} - /> - )} - - {selectedColumn && selectedColumn.dataType === 'number' ? ( - { - setState( - updateColumnParam({ - state, - layerId, - currentColumn: selectedColumn, - paramName: 'format', - value: newFormat, - }) - ); - }} - /> - ) : null} -
+ }); + }} + /> + )} + + {selectedColumn && selectedColumn.dataType === 'number' ? ( + { + setState( + updateColumnParam({ + state, + layerId, + currentColumn: selectedColumn, + paramName: 'format', + value: newFormat, + }) + ); + }} + /> + ) : null} +
+ )}

); } +function getErrorMessage( + selectedColumn: IndexPatternColumn | undefined, + incompatibleSelectedOperationType: boolean, + input: 'none' | 'field' | undefined, + fieldInvalid: boolean +) { + if (selectedColumn && incompatibleSelectedOperationType) { + if (input === 'field') { + return i18n.translate('xpack.lens.indexPattern.invalidOperationLabel', { + defaultMessage: 'To use this function, select a different field.', + }); + } + return i18n.translate('xpack.lens.indexPattern.chooseFieldLabel', { + defaultMessage: 'To use this function, select a field.', + }); + } + if (fieldInvalid) { + return i18n.translate('xpack.lens.indexPattern.invalidFieldLabel', { + defaultMessage: 'Invalid field. Check your index pattern or pick another field.', + }); + } +} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx index 270f9d9f67063..d15825718682c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx @@ -25,6 +25,7 @@ import { IndexPatternPrivateState } from '../types'; import { IndexPatternColumn } from '../operations'; import { documentField } from '../document_field'; import { OperationMetadata } from '../../types'; +import { DateHistogramIndexPatternColumn } from '../operations/definitions/date_histogram'; jest.mock('../loader'); jest.mock('../state_helpers'); @@ -801,6 +802,35 @@ describe('IndexPatternDimensionEditorPanel', () => { }); }); + it('should render invalid field if field reference is broken', () => { + wrapper = mount( + + ); + + expect(wrapper.find(EuiComboBox).prop('selectedOptions')).toEqual([ + { + label: 'nonexistent', + value: { type: 'field', field: 'nonexistent' }, + }, + ]); + }); + it('should support selecting the operation before the field', () => { wrapper = mount(); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx index c4d8300722f83..6f0a9c2a86acd 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx @@ -5,9 +5,9 @@ */ import _ from 'lodash'; -import React, { memo } from 'react'; +import React, { memo, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiLink } from '@elastic/eui'; +import { EuiLink, EuiIcon, EuiToolTip, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { @@ -22,7 +22,7 @@ import { IndexPatternColumn, OperationType } from '../indexpattern'; import { getAvailableOperationsByMetadata, buildColumn, changeField } from '../operations'; import { DimensionEditor } from './dimension_editor'; import { changeColumn } from '../state_helpers'; -import { isDraggedField, hasField } from '../utils'; +import { isDraggedField, hasField, fieldIsInvalid } from '../utils'; import { IndexPatternPrivateState, IndexPatternField } from '../types'; import { trackUiEvent } from '../../lens_ui_telemetry'; import { DateRange } from '../../../common'; @@ -233,14 +233,63 @@ export const IndexPatternDimensionTriggerComponent = function IndexPatternDimens props: IndexPatternDimensionTriggerProps ) { const layerId = props.layerId; - - const selectedColumn: IndexPatternColumn | null = - props.state.layers[layerId].columns[props.columnId] || null; + const layer = props.state.layers[layerId]; + const selectedColumn: IndexPatternColumn | null = layer.columns[props.columnId] || null; + const currentIndexPattern = props.state.indexPatterns[layer.indexPatternId]; + + const selectedColumnSourceField = + selectedColumn && 'sourceField' in selectedColumn ? selectedColumn.sourceField : undefined; + const currentFieldIsInvalid = useMemo( + () => + fieldIsInvalid(selectedColumnSourceField, selectedColumn?.operationType, currentIndexPattern), + [selectedColumnSourceField, selectedColumn?.operationType, currentIndexPattern] + ); const { columnId, uniqueLabel } = props; if (!selectedColumn) { return null; } + + if (currentFieldIsInvalid) { + return ( + + {i18n.translate('xpack.lens.configure.invalidConfigTooltip', { + defaultMessage: 'Invalid configuration.', + })} +
+ {i18n.translate('xpack.lens.configure.invalidConfigTooltipClick', { + defaultMessage: 'Click for more details.', + })} +

+ } + anchorClassName="lnsLayerPanel__anchor" + > + + + + + + {selectedColumn.label} + + +
+ ); + } + return ( { onChoose: (choice: FieldChoice) => void; onDeleteColumn: () => void; existingFields: IndexPatternPrivateState['existingFields']; + fieldIsInvalid: boolean; } export function FieldSelect({ @@ -53,6 +54,7 @@ export function FieldSelect({ onChoose, onDeleteColumn, existingFields, + fieldIsInvalid, ...rest }: FieldSelectProps) { const { operationByField } = operationSupportMatrix; @@ -171,12 +173,14 @@ export function FieldSelect({ defaultMessage: 'Field', })} options={(memoizedFieldOptions as unknown) as EuiComboBoxOptionOption[]} - isInvalid={Boolean(incompatibleSelectedOperationType)} + isInvalid={Boolean(incompatibleSelectedOperationType || fieldIsInvalid)} selectedOptions={ ((selectedColumnOperationType && selectedColumnSourceField ? [ { - label: fieldMap[selectedColumnSourceField].displayName, + label: fieldIsInvalid + ? selectedColumnSourceField + : fieldMap[selectedColumnSourceField]?.displayName, value: { type: 'field', field: selectedColumnSourceField }, }, ] diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx index 663d7c18bb370..80765627c1fc2 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx @@ -147,7 +147,7 @@ function testInitialState(): IndexPatternPrivateState { // Private operationType: 'terms', - sourceField: 'op', + sourceField: 'dest', params: { size: 5, orderBy: { type: 'alphabetical' }, @@ -1115,7 +1115,7 @@ describe('IndexPattern Data Source suggestions', () => { // Private operationType: 'terms', - sourceField: 'op', + sourceField: 'dest', params: { size: 5, orderBy: { type: 'alphabetical' }, @@ -1615,7 +1615,7 @@ describe('IndexPattern Data Source suggestions', () => { isBucketed: true, operationType: 'date_histogram', - sourceField: 'field2', + sourceField: 'timestamp', params: { interval: 'd', }, @@ -1626,7 +1626,7 @@ describe('IndexPattern Data Source suggestions', () => { isBucketed: true, operationType: 'terms', - sourceField: 'field1', + sourceField: 'dest', params: { size: 5, orderBy: { type: 'alphabetical' }, orderDirection: 'asc' }, }, id3: { @@ -1635,7 +1635,7 @@ describe('IndexPattern Data Source suggestions', () => { isBucketed: false, operationType: 'avg', - sourceField: 'field1', + sourceField: 'bytes', }, }, columnOrder: ['id1', 'id2', 'id3'], @@ -1652,6 +1652,38 @@ describe('IndexPattern Data Source suggestions', () => { }) ); }); + + it('does not generate suggestions if invalid fields are referenced', () => { + const initialState = testInitialState(); + const state: IndexPatternPrivateState = { + indexPatternRefs: [], + existingFields: {}, + currentIndexPatternId: '1', + indexPatterns: expectedIndexPatterns, + isFirstExistenceFetch: false, + layers: { + first: { + ...initialState.layers.first, + columns: { + ...initialState.layers.first.columns, + col2: { + label: 'Top 5', + dataType: 'string', + isBucketed: true, + + operationType: 'terms', + sourceField: 'nonExistingField', + params: { size: 5, orderBy: { type: 'alphabetical' }, orderDirection: 'asc' }, + }, + }, + columnOrder: ['col1', 'col2'], + }, + }, + }; + + const suggestions = getDatasourceSuggestionsFromCurrentState(state); + expect(suggestions).toEqual([]); + }); }); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts index f5e64149c2c76..75945529ffb34 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts @@ -18,7 +18,7 @@ import { } from './operations'; import { operationDefinitions } from './operations/definitions'; import { TermsIndexPatternColumn } from './operations/definitions/terms'; -import { hasField } from './utils'; +import { hasField, hasInvalidReference } from './utils'; import { IndexPattern, IndexPatternPrivateState, @@ -90,6 +90,7 @@ export function getDatasourceSuggestionsForField( indexPatternId: string, field: IndexPatternField ): IndexPatternSugestion[] { + if (hasInvalidReference(state)) return []; const layers = Object.keys(state.layers); const layerIds = layers.filter((id) => state.layers[id].indexPatternId === indexPatternId); @@ -380,6 +381,7 @@ function createNewLayerWithMetricAggregation( export function getDatasourceSuggestionsFromCurrentState( state: IndexPatternPrivateState ): Array> { + if (hasInvalidReference(state)) return []; const layers = Object.entries(state.layers || {}); if (layers.length > 1) { // Return suggestions that reduce the data to each layer individually diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/utils.ts b/x-pack/plugins/lens/public/indexpattern_datasource/utils.ts index 374dbe77b4ca3..f1d2e7765d99f 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/utils.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/utils.ts @@ -5,11 +5,13 @@ */ import { DataType } from '../types'; +import { IndexPatternPrivateState, IndexPattern } from './types'; import { DraggedField } from './indexpattern'; import { BaseIndexPatternColumn, FieldBasedIndexPatternColumn, } from './operations/definitions/column_types'; +import { operationDefinitionMap, OperationType } from './operations'; /** * Normalizes the specified operation type. (e.g. document operations @@ -40,3 +42,37 @@ export function isDraggedField(fieldCandidate: unknown): fieldCandidate is Dragg 'indexPatternId' in fieldCandidate ); } + +export function hasInvalidReference(state: IndexPatternPrivateState) { + return Object.values(state.layers).some((layer) => { + return layer.columnOrder.some((columnId) => { + const column = layer.columns[columnId]; + return ( + hasField(column) && + fieldIsInvalid( + column.sourceField, + column.operationType, + state.indexPatterns[layer.indexPatternId] + ) + ); + }); + }); +} + +export function fieldIsInvalid( + sourceField: string | undefined, + operationType: OperationType | undefined, + indexPattern: IndexPattern +) { + const operationDefinition = operationType && operationDefinitionMap[operationType]; + return Boolean( + sourceField && + operationDefinition && + !indexPattern.fields.some( + (field) => + field.name === sourceField && + operationDefinition.input === 'field' && + operationDefinition.getPossibleOperationForField(field) !== undefined + ) + ); +} From 4d5a9df76c8aa37b19ace411d72d1cbf941fcb9a Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Thu, 1 Oct 2020 13:49:05 +0200 Subject: [PATCH 27/64] @testing-library remove "pure" hack (#78742) Co-authored-by: Elastic Machine --- src/dev/jest/setup/react_testing_library.js | 11 +++++------ .../lib/embeddables/embeddable_renderer.test.tsx | 4 +--- .../public/lib/embeddables/error_embeddable.test.tsx | 5 +---- .../public/markdown_vis_controller.test.tsx | 5 +---- .../actions/flyout_edit_drilldown/menu_item.test.tsx | 4 +--- .../components/action_wizard/action_wizard.test.tsx | 6 +----- .../connected_flyout_manage_drilldowns.test.tsx | 5 +---- .../components/flyout_frame/flyout_frame.test.tsx | 4 +--- .../form_drilldown_wizard.test.tsx | 4 +--- .../list_manage_drilldowns.test.tsx | 6 +----- .../url_drilldown_collect_config.test.tsx | 4 +--- 11 files changed, 15 insertions(+), 43 deletions(-) diff --git a/src/dev/jest/setup/react_testing_library.js b/src/dev/jest/setup/react_testing_library.js index 84b5b6096e79b..90f73b04dc210 100644 --- a/src/dev/jest/setup/react_testing_library.js +++ b/src/dev/jest/setup/react_testing_library.js @@ -19,14 +19,13 @@ import '@testing-library/jest-dom'; /** - * Have to import "/pure" here to not register afterEach() hook clean up - * in the very beginning. There are couple tests which fail with clean up hook. - * On CI they run before first test which imports '@testing-library/react' - * and registers afterEach hook so the whole suite is passing. - * This have to be fixed as we depend on test order execution + * PLEASE NOTE: + * Importing '@testing-library/react' registers an `afterEach(cleanup)` side effect. + * It has tricky code that flushes pending promises, that previously led to unpredictable test failures * https://github.com/elastic/kibana/issues/59469 + * But since newer versions it has stabilised itself */ -import { configure } from '@testing-library/react/pure'; +import { configure } from '@testing-library/react'; // instead of default 'data-testid', use kibana's 'data-test-subj' configure({ testIdAttribute: 'data-test-subj', asyncUtilTimeout: 4500 }); diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx index 51213288e47a7..f9be9d5bfade7 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { wait } from '@testing-library/dom'; -import { cleanup, render } from '@testing-library/react/pure'; +import { render } from '@testing-library/react'; import { HelloWorldEmbeddable, HelloWorldEmbeddableFactoryDefinition, @@ -29,8 +29,6 @@ import { EmbeddableRenderer } from './embeddable_renderer'; import { embeddablePluginMock } from '../../mocks'; describe('', () => { - afterEach(cleanup); - test('Render embeddable', () => { const embeddable = new HelloWorldEmbeddable({ id: 'hello' }); const { getByTestId } = render(); diff --git a/src/plugins/embeddable/public/lib/embeddables/error_embeddable.test.tsx b/src/plugins/embeddable/public/lib/embeddables/error_embeddable.test.tsx index 17a2ac3b2a32b..cb14d7ed11dc9 100644 --- a/src/plugins/embeddable/public/lib/embeddables/error_embeddable.test.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/error_embeddable.test.tsx @@ -17,13 +17,10 @@ * under the License. */ import React from 'react'; -import { wait } from '@testing-library/dom'; -import { cleanup, render } from '@testing-library/react/pure'; +import { wait, render } from '@testing-library/react'; import { ErrorEmbeddable } from './error_embeddable'; import { EmbeddableRoot } from './embeddable_root'; -afterEach(cleanup); - test('ErrorEmbeddable renders an embeddable', async () => { const embeddable = new ErrorEmbeddable('some error occurred', { id: '123', title: 'Error' }); const { getByTestId, getByText } = render(); diff --git a/src/plugins/vis_type_markdown/public/markdown_vis_controller.test.tsx b/src/plugins/vis_type_markdown/public/markdown_vis_controller.test.tsx index 36850fc820ded..7bc8cdbd14170 100644 --- a/src/plugins/vis_type_markdown/public/markdown_vis_controller.test.tsx +++ b/src/plugins/vis_type_markdown/public/markdown_vis_controller.test.tsx @@ -18,12 +18,9 @@ */ import React from 'react'; -import { wait } from '@testing-library/dom'; -import { render, cleanup } from '@testing-library/react/pure'; +import { wait, render } from '@testing-library/react'; import MarkdownVisComponent from './markdown_vis_controller'; -afterEach(cleanup); - describe('markdown vis controller', () => { it('should set html from markdown params', async () => { const vis = { diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx index 771b15e46ad25..27a8d73f32944 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx @@ -5,14 +5,12 @@ */ import React from 'react'; -import { render, cleanup, act } from '@testing-library/react/pure'; +import { render, act } from '@testing-library/react'; import { MenuItem } from './menu_item'; import { createStateContainer } from '../../../../../../../../src/plugins/kibana_utils/public'; import { UiActionsEnhancedDynamicActionManager as DynamicActionManager } from '../../../../../../ui_actions_enhanced/public'; import { EnhancedEmbeddable } from '../../../../../../embeddable_enhanced/public'; -afterEach(cleanup); - test('', () => { const state = createStateContainer<{ events: object[] }>({ events: [] }); const { getByText, queryByText } = render( diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.test.tsx index 26033b7f020ad..11ccb0d5f0c2d 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.test.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { cleanup, fireEvent, render } from '@testing-library/react/pure'; +import { fireEvent, render } from '@testing-library/react'; import { TEST_SUBJ_ACTION_FACTORY_ITEM, TEST_SUBJ_SELECTED_ACTION_FACTORY } from './action_wizard'; import { dashboardFactory, @@ -17,10 +17,6 @@ import { import { ActionFactory } from '../../dynamic_actions'; import { licensingMock } from '../../../../licensing/public/mocks'; -// TODO: afterEach is not available for it globally during setup -// https://github.com/elastic/kibana/issues/59469 -afterEach(cleanup); - test('Pick and configure action', () => { const screen = render(); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx index a546fabfbbc01..48dbd5a864170 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { cleanup, fireEvent, render, wait } from '@testing-library/react/pure'; +import { fireEvent, render, wait, cleanup } from '@testing-library/react'; import { createFlyoutManageDrilldowns } from './connected_flyout_manage_drilldowns'; import { mockGetTriggerInfo, @@ -30,9 +30,6 @@ const FlyoutManageDrilldowns = createFlyoutManageDrilldowns({ getTrigger: mockGetTriggerInfo, }); -// https://github.com/elastic/kibana/issues/59469 -afterEach(cleanup); - beforeEach(() => { storage.clear(); mockDynamicActionManager.state.set({ ...mockDynamicActionManager.state.get(), events: [] }); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.test.tsx index cdbf36d81de33..86679d393b17f 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.test.tsx @@ -6,11 +6,9 @@ import React from 'react'; import { render } from 'react-dom'; -import { render as renderTestingLibrary, fireEvent, cleanup } from '@testing-library/react/pure'; +import { render as renderTestingLibrary, fireEvent } from '@testing-library/react'; import { FlyoutFrame } from './index'; -afterEach(cleanup); - describe('', () => { test('renders without crashing', () => { const div = document.createElement('div'); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx index 0dcca84ede3bf..614679ed02a41 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx @@ -7,12 +7,10 @@ import React from 'react'; import { render } from 'react-dom'; import { FormDrilldownWizard } from './form_drilldown_wizard'; -import { render as renderTestingLibrary, fireEvent, cleanup } from '@testing-library/react/pure'; +import { render as renderTestingLibrary, fireEvent } from '@testing-library/react'; import { txtNameOfDrilldown } from './i18n'; import { Trigger, TriggerId } from '../../../../../../../src/plugins/ui_actions/public'; -afterEach(cleanup); - const otherProps = { actionFactoryContext: { triggers: [] as TriggerId[] }, supportedTriggers: [ diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx index 889f8983254d5..5bf11e31aee89 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx @@ -5,17 +5,13 @@ */ import React from 'react'; -import { cleanup, fireEvent, render } from '@testing-library/react/pure'; +import { fireEvent, render } from '@testing-library/react'; import { DrilldownListItem, ListManageDrilldowns, TEST_SUBJ_DRILLDOWN_ITEM, } from './list_manage_drilldowns'; -// TODO: for some reason global cleanup from RTL doesn't work -// afterEach is not available for it globally during setup -afterEach(cleanup); - const drilldowns: DrilldownListItem[] = [ { id: '1', actionName: 'Dashboard', drilldownName: 'Drilldown 1' }, { id: '2', actionName: 'Dashboard', drilldownName: 'Drilldown 2' }, diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/url_drilldown_collect_config.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/url_drilldown_collect_config.test.tsx index f55818379ef3f..a30c880c3d430 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/url_drilldown_collect_config.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/url_drilldown_collect_config.test.tsx @@ -5,11 +5,9 @@ */ import { Demo } from './test_samples/demo'; -import { cleanup, fireEvent, render } from '@testing-library/react/pure'; +import { fireEvent, render } from '@testing-library/react'; import React from 'react'; -afterEach(cleanup); - test('configure valid URL template', () => { const screen = render(); From d793040082040c02a30a12c6fcdc27d740467001 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Thu, 1 Oct 2020 14:25:59 +0200 Subject: [PATCH 28/64] [Lens] Histogram/range operation new copy (#78328) * :speech_balloon: New copy revision for histogram/range operation in lens * :ok_hand: Updated panel copy * :ok_hand: Change copy based on feedback --- .../dimension_panel/dimension_editor.tsx | 4 +-- .../definitions/ranges/advanced_editor.tsx | 12 ++++----- .../definitions/ranges/range_editor.tsx | 25 ++++++++++++++++--- .../operations/definitions/ranges/ranges.tsx | 4 +-- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx index b0d24928b794e..0e33c20faff7e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx @@ -257,7 +257,7 @@ export function DimensionEditor(props: DimensionEditorProps) {
{i18n.translate('xpack.lens.indexPattern.functionsLabel', { - defaultMessage: 'Choose a function', + defaultMessage: 'Select a function', })} @@ -277,7 +277,7 @@ export function DimensionEditor(props: DimensionEditorProps) { {' '} - {i18n.translate('xpack.lens.indexPattern.ranges.customIntervalsRemoval', { - defaultMessage: 'Remove custom intervals', + {i18n.translate('xpack.lens.indexPattern.ranges.customRangesRemoval', { + defaultMessage: 'Remove custom ranges', })} @@ -286,8 +286,8 @@ export const AdvancedRangeEditor = ({ addNewRange(); setIsOpenByCreation(true); }} - label={i18n.translate('xpack.lens.indexPattern.ranges.addInterval', { - defaultMessage: 'Add interval', + label={i18n.translate('xpack.lens.indexPattern.ranges.addRange', { + defaultMessage: 'Add range', })} /> diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx index 5d5acf7778973..8ed17a813e7fd 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx @@ -15,6 +15,7 @@ import { EuiFlexGroup, EuiButtonIcon, EuiToolTip, + EuiIconTip, } from '@elastic/eui'; import { IFieldFormat } from 'src/plugins/data/public'; import { RangeColumnParams, UpdateParamsFnType, MODES_TYPES } from './ranges'; @@ -45,8 +46,14 @@ const BaseRangeEditor = ({ ); const granularityLabel = i18n.translate('xpack.lens.indexPattern.ranges.granularity', { - defaultMessage: 'Granularity', + defaultMessage: 'Intervals granularity', }); + const granularityLabelDescription = i18n.translate( + 'xpack.lens.indexPattern.ranges.granularityDescription', + { + defaultMessage: 'Divides the field into evenly spaced intervals.', + } + ); const decreaseButtonLabel = i18n.translate('xpack.lens.indexPattern.ranges.decreaseButtonLabel', { defaultMessage: 'Decrease granularity', }); @@ -57,7 +64,17 @@ const BaseRangeEditor = ({ return ( <> + {granularityLabel}{' '} + + + } data-test-subj="indexPattern-ranges-section-label" labelType="legend" fullWidth @@ -91,7 +108,7 @@ const BaseRangeEditor = ({ /> - + onToggleEditor()}> {i18n.translate('xpack.lens.indexPattern.ranges.customIntervalsToggle', { - defaultMessage: 'Create custom intervals', + defaultMessage: 'Create custom ranges', })} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx index 1971fb2875bed..a59780ef59939 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx @@ -78,8 +78,8 @@ function getEsAggsParams({ sourceField, params }: RangeIndexPatternColumn) { export const rangeOperation: OperationDefinition = { type: 'range', - displayName: i18n.translate('xpack.lens.indexPattern.ranges', { - defaultMessage: 'Ranges', + displayName: i18n.translate('xpack.lens.indexPattern.intervals', { + defaultMessage: 'Intervals', }), priority: 4, // Higher than terms, so numbers get histogram input: 'field', From 4525f0cfab2045ee9e54bff813a9614f31313602 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Thu, 1 Oct 2020 08:26:26 -0400 Subject: [PATCH 29/64] Omit runtime fields from FLS suggestions (#78330) Co-authored-by: Aleh Zasypkin Co-authored-by: Elastic Machine --- .../server/routes/indices/get_fields.test.ts | 58 +++++++++++++++++++ .../server/routes/indices/get_fields.ts | 46 ++++++++++++--- .../apis/security/index_fields.ts | 58 +++++++++++++++++++ .../security/flstest/data/mappings.json | 7 +++ 4 files changed, 160 insertions(+), 9 deletions(-) create mode 100644 x-pack/plugins/security/server/routes/indices/get_fields.test.ts diff --git a/x-pack/plugins/security/server/routes/indices/get_fields.test.ts b/x-pack/plugins/security/server/routes/indices/get_fields.test.ts new file mode 100644 index 0000000000000..4c6182e99431d --- /dev/null +++ b/x-pack/plugins/security/server/routes/indices/get_fields.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServerMock, elasticsearchServiceMock } from '../../../../../../src/core/server/mocks'; +import { kibanaResponseFactory } from '../../../../../../src/core/server'; + +import { routeDefinitionParamsMock } from '../index.mock'; +import { defineGetFieldsRoutes } from './get_fields'; + +const createFieldMapping = (field: string, type: string) => ({ + [field]: { mapping: { [field]: { type } } }, +}); + +const createEmptyFieldMapping = (field: string) => ({ [field]: { mapping: {} } }); + +const mockFieldMappingResponse = { + foo: { + mappings: { + ...createFieldMapping('fooField', 'keyword'), + ...createFieldMapping('commonField', 'keyword'), + ...createEmptyFieldMapping('emptyField'), + }, + }, + bar: { + mappings: { + ...createFieldMapping('commonField', 'keyword'), + ...createFieldMapping('barField', 'keyword'), + ...createFieldMapping('runtimeField', 'runtime'), + }, + }, +}; + +describe('GET /internal/security/fields/{query}', () => { + it('returns a list of deduplicated fields, omitting empty and runtime fields', async () => { + const mockRouteDefinitionParams = routeDefinitionParamsMock.create(); + + const scopedClient = elasticsearchServiceMock.createLegacyScopedClusterClient(); + scopedClient.callAsCurrentUser.mockResolvedValue(mockFieldMappingResponse); + mockRouteDefinitionParams.clusterClient.asScoped.mockReturnValue(scopedClient); + + defineGetFieldsRoutes(mockRouteDefinitionParams); + + const [[, handler]] = mockRouteDefinitionParams.router.get.mock.calls; + + const headers = { authorization: 'foo' }; + const mockRequest = httpServerMock.createKibanaRequest({ + method: 'get', + path: `/internal/security/fields/foo`, + headers, + }); + const response = await handler({} as any, mockRequest, kibanaResponseFactory); + expect(response.status).toBe(200); + expect(response.payload).toEqual(['fooField', 'commonField', 'barField']); + }); +}); diff --git a/x-pack/plugins/security/server/routes/indices/get_fields.ts b/x-pack/plugins/security/server/routes/indices/get_fields.ts index 356b78aa33879..44b8804ed8d6e 100644 --- a/x-pack/plugins/security/server/routes/indices/get_fields.ts +++ b/x-pack/plugins/security/server/routes/indices/get_fields.ts @@ -8,6 +8,20 @@ import { schema } from '@kbn/config-schema'; import { RouteDefinitionParams } from '../index'; import { wrapIntoCustomErrorResponse } from '../../errors'; +interface FieldMappingResponse { + [indexName: string]: { + mappings: { + [fieldName: string]: { + mapping: { + [fieldName: string]: { + type: string; + }; + }; + }; + }; + }; +} + export function defineGetFieldsRoutes({ router, clusterClient }: RouteDefinitionParams) { router.get( { @@ -23,21 +37,35 @@ export function defineGetFieldsRoutes({ router, clusterClient }: RouteDefinition fields: '*', allowNoIndices: false, includeDefaults: true, - })) as Record }>; + })) as FieldMappingResponse; // The flow is the following (see response format at https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-field-mapping.html): // 1. Iterate over all matched indices. // 2. Extract all the field names from the `mappings` field of the particular index. - // 3. Collect and flatten the list of the field names. + // 3. Collect and flatten the list of the field names, omitting any fields without mappings, and any runtime fields // 4. Use `Set` to get only unique field names. + const fields = Array.from( + new Set( + Object.values(indexMappings).flatMap((indexMapping) => { + return Object.keys(indexMapping.mappings).filter((fieldName) => { + const mappingValues = Object.values(indexMapping.mappings[fieldName].mapping); + const hasMapping = mappingValues.length > 0; + + const isRuntimeField = hasMapping && mappingValues[0]?.type === 'runtime'; + + // fields without mappings are internal fields such as `_routing` and `_index`, + // and therefore don't make sense as autocomplete suggestions for FLS. + + // Runtime fields are not securable via FLS. + // Administrators should instead secure access to the fields which derive this information. + return hasMapping && !isRuntimeField; + }); + }) + ) + ); + return response.ok({ - body: Array.from( - new Set( - Object.values(indexMappings) - .map((indexMapping) => Object.keys(indexMapping.mappings)) - .flat() - ) - ), + body: fields, }); } catch (error) { return response.customError(wrapIntoCustomErrorResponse(error)); diff --git a/x-pack/test/api_integration/apis/security/index_fields.ts b/x-pack/test/api_integration/apis/security/index_fields.ts index 795da7dbe8835..193d0eea1590e 100644 --- a/x-pack/test/api_integration/apis/security/index_fields.ts +++ b/x-pack/test/api_integration/apis/security/index_fields.ts @@ -7,10 +7,33 @@ import expect from '@kbn/expect/expect.js'; import { FtrProviderContext } from '../../ftr_provider_context'; +interface FLSFieldMappingResponse { + flstest: { + mappings: { + [fieldName: string]: { + mapping: { + [fieldName: string]: { + type: string; + }; + }; + }; + }; + }; +} + export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + const es = getService('legacyEs'); describe('Index Fields', () => { + before(async () => { + await esArchiver.load('security/flstest/data'); + }); + after(async () => { + await esArchiver.unload('security/flstest/data'); + }); + describe('GET /internal/security/fields/{query}', () => { it('should return a list of available index mapping fields', async () => { await supertest @@ -30,6 +53,41 @@ export default function ({ getService }: FtrProviderContext) { sampleOfExpectedFields.forEach((field) => expect(response.body).to.contain(field)); }); }); + + it('should not include runtime fields', async () => { + // First, make sure the mapping actually includes a runtime field + const fieldMapping = (await es.indices.getFieldMapping({ + index: 'flstest', + fields: '*', + includeDefaults: true, + })) as FLSFieldMappingResponse; + + expect(Object.keys(fieldMapping.flstest.mappings)).to.contain('runtime_customer_ssn'); + expect( + fieldMapping.flstest.mappings.runtime_customer_ssn.mapping.runtime_customer_ssn.type + ).to.eql('runtime'); + + // Now, make sure it's not returned here + const { body: actualFields } = (await supertest + .get('/internal/security/fields/flstest') + .set('kbn-xsrf', 'xxx') + .send() + .expect(200)) as { body: string[] }; + + const expectedFields = [ + 'customer_ssn', + 'customer_ssn.keyword', + 'customer_region', + 'customer_region.keyword', + 'customer_name', + 'customer_name.keyword', + ]; + + actualFields.sort(); + expectedFields.sort(); + + expect(actualFields).to.eql(expectedFields); + }); }); }); } diff --git a/x-pack/test/functional/es_archives/security/flstest/data/mappings.json b/x-pack/test/functional/es_archives/security/flstest/data/mappings.json index c6f11ea26f647..3605533618a93 100644 --- a/x-pack/test/functional/es_archives/security/flstest/data/mappings.json +++ b/x-pack/test/functional/es_archives/security/flstest/data/mappings.json @@ -30,6 +30,13 @@ } }, "type": "text" + }, + "runtime_customer_ssn": { + "type": "runtime", + "runtime_type": "keyword", + "script": { + "source": "emit(doc['customer_ssn'].value + ' calculated at runtime')" + } } } }, From 97ac553d0319cde7abd63b8052b38a90bb0a44b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 1 Oct 2020 13:30:39 +0100 Subject: [PATCH 30/64] [Usage Collection] [schema] `infra` (#78581) --- x-pack/.telemetryrc.json | 1 - .../infra/server/usage/usage_collector.ts | 23 +++++++++++++++++- .../schema/xpack_plugins.json | 24 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/x-pack/.telemetryrc.json b/x-pack/.telemetryrc.json index 9140dbdaf00ae..d0e56bbed9f47 100644 --- a/x-pack/.telemetryrc.json +++ b/x-pack/.telemetryrc.json @@ -5,7 +5,6 @@ "plugins/actions/server/usage/actions_usage_collector.ts", "plugins/alerts/server/usage/alerts_usage_collector.ts", "plugins/apm/server/lib/apm_telemetry/index.ts", - "plugins/infra/server/usage/usage_collector.ts", "plugins/maps/server/maps_telemetry/collectors/register.ts" ] } diff --git a/x-pack/plugins/infra/server/usage/usage_collector.ts b/x-pack/plugins/infra/server/usage/usage_collector.ts index 598ee21e6f273..54f6d2f6121db 100644 --- a/x-pack/plugins/infra/server/usage/usage_collector.ts +++ b/x-pack/plugins/infra/server/usage/usage_collector.ts @@ -14,6 +14,17 @@ interface InfraopsSum { logs: number; } +interface Usage { + last_24_hours: { + hits: { + infraops_hosts: number; + infraops_docker: number; + infraops_kubernetes: number; + logs: number; + }; + }; +} + export class UsageCollector { public static registerUsageCollector(usageCollection: UsageCollectionSetup): void { const collector = UsageCollector.getUsageCollector(usageCollection); @@ -21,12 +32,22 @@ export class UsageCollector { } public static getUsageCollector(usageCollection: UsageCollectionSetup) { - return usageCollection.makeUsageCollector({ + return usageCollection.makeUsageCollector({ type: 'infraops', isReady: () => true, fetch: async () => { return this.getReport(); }, + schema: { + last_24_hours: { + hits: { + infraops_hosts: { type: 'long' }, + infraops_docker: { type: 'long' }, + infraops_kubernetes: { type: 'long' }, + logs: { type: 'long' }, + }, + }, + }, }); } diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 9acffa1f6c78e..816d6828381ee 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -242,6 +242,30 @@ } } }, + "infraops": { + "properties": { + "last_24_hours": { + "properties": { + "hits": { + "properties": { + "infraops_hosts": { + "type": "long" + }, + "infraops_docker": { + "type": "long" + }, + "infraops_kubernetes": { + "type": "long" + }, + "logs": { + "type": "long" + } + } + } + } + } + } + }, "ingest_manager": { "properties": { "fleet_enabled": { From cba458e4567d32250aa1e4d9748e7b4ecefc294a Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 1 Oct 2020 08:43:12 -0400 Subject: [PATCH 31/64] [Mappings editor] Fix bug when switching between mapping tabs (#78707) --- .../mappings_editor.test.tsx | 27 +++++++++++++++++++ .../templates_form/templates_form.tsx | 9 +++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx index 68933ddc9a935..f5fcff9f96254 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx @@ -223,6 +223,33 @@ describe('Mappings editor: core', () => { isNumericDetectionVisible = exists('advancedConfiguration.numericDetection'); expect(isNumericDetectionVisible).toBe(false); }); + + test('should keep default dynamic templates value when switching tabs', async () => { + await act(async () => { + testBed = setup({ + value: { ...defaultMappings, dynamic_templates: [] }, // by default, the UI will provide an empty array for dynamic templates + onChange: onChangeHandler, + }); + }); + testBed.component.update(); + + const { + actions: { selectTab, getJsonEditorValue }, + } = testBed; + + // Navigate to dynamic templates tab and verify empty array + await selectTab('templates'); + let templatesValue = getJsonEditorValue('dynamicTemplatesEditor'); + expect(templatesValue).toEqual([]); + + // Navigate to advanced tab + await selectTab('advanced'); + + // Navigate back to dynamic templates tab and verify empty array persists + await selectTab('templates'); + templatesValue = getJsonEditorValue('dynamicTemplatesEditor'); + expect(templatesValue).toEqual([]); + }); }); describe('component props', () => { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx index 4b813b4edbabd..46e7bbd5e094a 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx @@ -36,11 +36,10 @@ const formSerializer: SerializerFunc = (formData) // Silently swallow errors } - return Array.isArray(parsedTemplates) && parsedTemplates.length > 0 - ? { - dynamic_templates: parsedTemplates, - } - : undefined; + return { + dynamic_templates: + Array.isArray(parsedTemplates) && parsedTemplates.length > 0 ? parsedTemplates : [], + }; }; const formDeserializer = (formData: { [key: string]: any }) => { From 4fe7625f584a6d2969fa10427e5bc339b943a404 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 1 Oct 2020 08:44:29 -0400 Subject: [PATCH 32/64] [Mappings editor] Add support for version field type (#78206) --- .../datatypes/version_datatype.test.tsx | 95 +++++++++++++++++++ .../fields/field_types/index.ts | 2 + .../fields/field_types/version_type.tsx | 27 ++++++ .../constants/data_types_definition.tsx | 30 ++++++ .../mappings_editor/types/document_fields.ts | 1 + 5 files changed, 155 insertions(+) create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx new file mode 100644 index 0000000000000..61f67b04ec3cd --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { act } from 'react-dom/test-utils'; + +import { componentHelpers, MappingsEditorTestBed } from '../helpers'; + +const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor; + +// Parameters automatically added to the version datatype when saved (with the default values) +export const defaultVersionParameters = { + type: 'version', +}; + +describe('Mappings editor: version datatype', () => { + /** + * Variable to store the mappings data forwarded to the consumer component + */ + let data: any; + let onChangeHandler: jest.Mock = jest.fn(); + let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); + let testBed: MappingsEditorTestBed; + + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + beforeEach(() => { + onChangeHandler = jest.fn(); + getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); + }); + + test('supports meta parameter', async () => { + const defaultMappings = { + properties: { + myField: { + type: 'version', + }, + }, + }; + + const updatedMappings = { ...defaultMappings }; + + const metaParameter = { + meta: { + my_metadata: 'foobar', + }, + }; + + await act(async () => { + testBed = setup({ value: defaultMappings, onChange: onChangeHandler }); + }); + testBed.component.update(); + + const { + component, + actions: { + startEditField, + updateFieldAndCloseFlyout, + showAdvancedSettings, + toggleFormRow, + updateJsonEditor, + }, + } = testBed; + + // Open the flyout to edit the field + await startEditField('myField'); + await showAdvancedSettings(); + + // Enable the meta parameter and provide a valid object + toggleFormRow('metaParameter'); + await act(async () => { + updateJsonEditor('metaParameterEditor', metaParameter.meta); + }); + component.update(); + + // Save the field and close the flyout + await updateFieldAndCloseFlyout(); + + // It should have the default parameters values added, plus metadata + updatedMappings.properties.myField = { + ...defaultVersionParameters, + ...metaParameter, + }; + + ({ data } = await getMappingsEditorData(component)); + expect(data).toEqual(updatedMappings); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts index 4d36b4dd2578d..d135d1b81419c 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts @@ -34,6 +34,7 @@ import { RankFeatureType } from './rank_feature_type'; import { RuntimeType } from './runtime_type'; import { WildcardType } from './wildcard_type'; import { PointType } from './point_type'; +import { VersionType } from './version_type'; const typeToParametersFormMap: { [key in DataType]?: ComponentType } = { alias: AliasType, @@ -64,6 +65,7 @@ const typeToParametersFormMap: { [key in DataType]?: ComponentType } = { runtime: RuntimeType, wildcard: WildcardType, point: PointType, + version: VersionType, }; export const getParametersFormForType = ( diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx new file mode 100644 index 0000000000000..24ee356c5db77 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; + +import { NormalizedField, Field as FieldType, ParameterName } from '../../../../types'; +import { getFieldConfig } from '../../../../lib'; +import { MetaParameter } from '../../field_parameters'; +import { AdvancedParametersSection } from '../edit_field'; + +interface Props { + field: NormalizedField; +} + +const getDefaultToggleValue = (param: ParameterName, field: FieldType) => { + return field[param] !== undefined && field[param] !== getFieldConfig(param).defaultValue; +}; + +export const VersionType = ({ field }: Props) => { + return ( + + + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx index 7bcd8f32f1a7d..07ca0a69afefb 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx @@ -860,6 +860,35 @@ export const TYPE_DEFINITION: { [key in DataType]: DataTypeDefinition } = {

), }, + version: { + label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.versionDescription', { + defaultMessage: 'Version', + }), + value: 'version', + documentation: { + main: '/version.html', + }, + description: () => ( +

+ + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.dataType.versionLongDescription.keywordTypeLink', + { + defaultMessage: 'keyword data type', + } + )} + + ), + }} + /> +

+ ), + }, wildcard: { label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.wildcardDescription', { defaultMessage: 'Wildcard', @@ -923,6 +952,7 @@ export const MAIN_TYPES: MainType[] = [ 'histogram', 'wildcard', 'point', + 'version', 'other', ]; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts index 48282abd1d799..926b4c9d12bee 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts @@ -64,6 +64,7 @@ export type MainType = | 'point' | 'histogram' | 'constant_keyword' + | 'version' | 'wildcard' /** * 'other' is a special type that only exists inside of MappingsEditor as a placeholder From 9e5bf0f92f7a25df92372c52e9d7f1f9e39aa870 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Thu, 1 Oct 2020 09:10:02 -0400 Subject: [PATCH 33/64] [Canvas] Move Handlebars and Flot dependencies out of main bundle (#78542) * Move Handlebars and Flot dependencies out of main bundle * Fix unit test Co-authored-by: Elastic Machine --- .../functions/browser/markdown.test.js | 28 +++++++++---------- .../functions/browser/markdown.ts | 8 +++--- .../canvas_plugin_src/renderers/pie/index.tsx | 6 ++-- .../canvas_plugin_src/renderers/plot/index.ts | 6 ++-- x-pack/plugins/canvas/common/lib/index.ts | 2 -- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js index 71b6af6739408..1c75f5b7e0fbc 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js @@ -12,16 +12,16 @@ import { markdown } from './markdown'; describe('markdown', () => { const fn = functionWrapper(markdown); - it('returns a render as markdown', () => { - const result = fn(null, { content: [''], font: fontStyle }); + it('returns a render as markdown', async () => { + const result = await fn(null, { content: [''], font: fontStyle }); expect(result).toHaveProperty('type', 'render'); expect(result).toHaveProperty('as', 'markdown'); }); describe('args', () => { describe('content', () => { - it('sets the content to all strings in expression concatenated', () => { - const result = fn(null, { + it('sets the content to all strings in expression concatenated', async () => { + const result = await fn(null, { content: ['# this ', 'is ', 'some ', 'markdown'], font: fontStyle, }); @@ -29,11 +29,11 @@ describe('markdown', () => { expect(result.value).toHaveProperty('content', '# this is some markdown'); }); - it('compiles and concatenates handlebars expressions using context', () => { + it('compiles and concatenates handlebars expressions using context', async () => { let expectedContent = 'Columns:'; testTable.columns.map((col) => (expectedContent += ` ${col.name}`)); - const result = fn(testTable, { + const result = await fn(testTable, { content: ['Columns:', '{{#each columns}} {{name}}{{/each}}'], }); @@ -42,8 +42,8 @@ describe('markdown', () => { }); describe('font', () => { - it('sets the font style for the markdown', () => { - const result = fn(null, { + it('sets the font style for the markdown', async () => { + const result = await fn(null, { content: ['some ', 'markdown'], font: fontStyle, }); @@ -55,8 +55,8 @@ describe('markdown', () => { // it("defaults to the expression '{font}'", () => {}); }); describe('openLinksInNewTab', () => { - it('sets the value of openLinksInNewTab to true ', () => { - const result = fn(null, { + it('sets the value of openLinksInNewTab to true ', async () => { + const result = await fn(null, { content: ['some ', 'markdown'], openLinksInNewTab: true, }); @@ -64,8 +64,8 @@ describe('markdown', () => { expect(result.value).toHaveProperty('openLinksInNewTab', true); }); - it('sets the value of openLinksInNewTab to false ', () => { - const result = fn(null, { + it('sets the value of openLinksInNewTab to false ', async () => { + const result = await fn(null, { content: ['some ', 'markdown'], openLinksInNewTab: false, }); @@ -73,8 +73,8 @@ describe('markdown', () => { expect(result.value).toHaveProperty('openLinksInNewTab', false); }); - it('defaults the value of openLinksInNewTab to false ', () => { - const result = fn(null, { + it('defaults the value of openLinksInNewTab to false ', async () => { + const result = await fn(null, { content: ['some ', 'markdown'], }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts index 947106fd9397a..aa73eba456481 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts @@ -10,8 +10,6 @@ import { Style, ExpressionFunctionDefinition, } from 'src/plugins/expressions/common'; -// @ts-expect-error untyped local -import { Handlebars } from '../../../common/lib/handlebars'; import { getFunctionHelp } from '../../../i18n'; type Context = Datatable | null; @@ -32,7 +30,7 @@ export function markdown(): ExpressionFunctionDefinition< 'markdown', Context, Arguments, - Render + Promise> > { const { help, args: argHelp } = getFunctionHelp().markdown; @@ -61,7 +59,9 @@ export function markdown(): ExpressionFunctionDefinition< default: false, }, }, - fn: (input, args) => { + fn: async (input, args) => { + // @ts-expect-error untyped local + const { Handlebars } = await import('../../../common/lib/handlebars'); const compileFunctions = args.content.map((str) => Handlebars.compile(String(str), { knownHelpersOnly: true }) ); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx index 622e73ccf2223..29e823e0a373b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx @@ -6,7 +6,6 @@ // This bit of hackiness is required because this isn't part of the main kibana bundle import 'jquery'; -import '../../lib/flot-charts'; import { debounce, includes } from 'lodash'; import { RendererStrings } from '../../../i18n'; @@ -22,7 +21,10 @@ export const pie: RendererFactory = () => ({ displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: false, - render(domNode, config, handlers) { + render: async (domNode, config, handlers) => { + // @ts-expect-error + await import('../../lib/flot-charts'); + if (!includes($.plot.plugins, piePlugin)) { $.plot.plugins.push(piePlugin); } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts index 8c84f54f8746b..9d70ca418f491 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts @@ -6,7 +6,6 @@ // This bit of hackiness is required because this isn't part of the main kibana bundle import 'jquery'; -import '../../lib/flot-charts'; import { debounce, includes } from 'lodash'; import { RendererStrings } from '../../../i18n'; @@ -18,7 +17,10 @@ import { text } from './plugins/text'; const { plot: strings } = RendererStrings; -const render: RendererSpec['render'] = (domNode, config, handlers) => { +const render: RendererSpec['render'] = async (domNode, config, handlers) => { + // @ts-expect-error + await import('../../lib/flot-charts'); + // TODO: OH NOES if (!includes($.plot.plugins, size)) { $.plot.plugins.push(size); diff --git a/x-pack/plugins/canvas/common/lib/index.ts b/x-pack/plugins/canvas/common/lib/index.ts index 055f6ce7739b7..c8ae53917c9e4 100644 --- a/x-pack/plugins/canvas/common/lib/index.ts +++ b/x-pack/plugins/canvas/common/lib/index.ts @@ -20,8 +20,6 @@ export * from './get_colors_from_palette'; export * from './get_field_type'; // @ts-expect-error missing local definition export * from './get_legend_config'; -// @ts-expect-error missing local definition -export * from './handlebars'; export * from './hex_to_rgb'; export * from './httpurl'; export * from './missing_asset'; From 727d62611b8f6f23ac163f0a2af2ab6f96e38f00 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Thu, 1 Oct 2020 14:24:10 +0100 Subject: [PATCH 34/64] [Actions] fixes error in UI in the Edit Flyout for PreConfigured Connectors (#78994) Ensures only User Configured Connectors can be validated and edited by the UI to avoid these kinds of errors in the future. --- .../builtin_action_types/email/email.tsx | 4 +- .../es_index/es_index.tsx | 4 +- .../builtin_action_types/jira/jira.tsx | 19 ++++---- .../jira/jira_params.test.tsx | 3 +- .../builtin_action_types/jira/types.ts | 10 ++--- .../pagerduty/pagerduty.tsx | 14 +++++- .../resilient/resilient.tsx | 13 +++++- .../builtin_action_types/resilient/types.ts | 13 +++--- .../server_log/server_log.test.tsx | 7 +-- .../server_log/server_log.tsx | 2 +- .../servicenow/servicenow.tsx | 10 ++++- .../builtin_action_types/servicenow/types.ts | 13 +++--- .../builtin_action_types/slack/slack.tsx | 4 +- .../components/builtin_action_types/types.ts | 44 +++++++------------ .../builtin_action_types/webhook/webhook.tsx | 13 +++++- .../lib/action_connector_api.test.ts | 4 +- .../lib/check_action_type_enabled.test.tsx | 8 +--- .../action_connector_form.test.tsx | 9 ++-- .../action_connector_form.tsx | 14 ++++-- .../connector_edit_flyout.tsx | 10 +++-- .../triggers_actions_ui/public/types.ts | 43 ++++++++++++++---- .../apps/triggers_actions_ui/connectors.ts | 2 +- x-pack/test/functional_with_es_ssl/config.ts | 9 ++++ 23 files changed, 171 insertions(+), 101 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx index abb102c04b054..3e8e71991a594 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx @@ -6,9 +6,9 @@ import { lazy } from 'react'; import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ValidationResult } from '../../../../types'; -import { EmailActionParams, EmailActionConnector } from '../types'; +import { EmailActionParams, EmailConfig, EmailSecrets, EmailActionConnector } from '../types'; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel { const mailformat = /^[^@\s]+@[^@\s]+$/; return { id: '.email', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx index c0255650e0f37..de611d6a043a7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx @@ -6,9 +6,9 @@ import { lazy } from 'react'; import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ValidationResult } from '../../../../types'; -import { EsIndexActionConnector, IndexActionParams } from '../types'; +import { EsIndexActionConnector, EsIndexConfig, IndexActionParams } from '../types'; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel { return { id: '.index', iconClass: 'indexOpen', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira.tsx index fd36bd6aeab0a..0179cfbffdfea 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira.tsx @@ -8,19 +8,20 @@ import { lazy } from 'react'; import { ValidationResult, ActionTypeModel } from '../../../../types'; import { connectorConfiguration } from './config'; import logo from './logo.svg'; -import { JiraActionConnector, JiraActionParams } from './types'; +import { JiraActionConnector, JiraConfig, JiraSecrets, JiraActionParams } from './types'; import * as i18n from './translations'; import { isValidUrl } from '../../../lib/value_validators'; const validateConnector = (action: JiraActionConnector): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - apiUrl: new Array(), - projectKey: new Array(), - email: new Array(), - apiToken: new Array(), + const validationResult = { + errors: { + apiUrl: new Array(), + projectKey: new Array(), + email: new Array(), + apiToken: new Array(), + }, }; - validationResult.errors = errors; + const { errors } = validationResult; if (!action.config.apiUrl) { errors.apiUrl = [...errors.apiUrl, i18n.API_URL_REQUIRED]; @@ -45,7 +46,7 @@ const validateConnector = (action: JiraActionConnector): ValidationResult => { return validationResult; }; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel { return { id: connectorConfiguration.id, iconClass: logo, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx index 416f6f7b18755..a0194ed5c81e4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/jira_params.test.tsx @@ -11,6 +11,7 @@ import { coreMock } from 'src/core/public/mocks'; import { useGetIssueTypes } from './use_get_issue_types'; import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; +import { ActionConnector } from '../../../../types'; jest.mock('./use_get_issue_types'); jest.mock('./use_get_fields_by_issue_type'); @@ -35,7 +36,7 @@ const actionParams = { }, }; -const connector = { +const connector: ActionConnector = { secrets: {}, config: {}, id: 'test', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts index 4c13d067913f2..e72aa1f7fc037 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts @@ -5,11 +5,9 @@ */ import { CasesConfigurationMapping } from '../case_mappings'; +import { UserConfiguredActionConnector } from '../../../../types'; -export interface JiraActionConnector { - config: JiraConfig; - secrets: JiraSecrets; -} +export type JiraActionConnector = UserConfiguredActionConnector; export interface JiraActionParams { subAction: string; @@ -30,14 +28,14 @@ interface IncidentConfiguration { mapping: CasesConfigurationMapping[]; } -interface JiraConfig { +export interface JiraConfig { apiUrl: string; projectKey: string; incidentConfiguration?: IncidentConfiguration; isCaseOwned?: boolean; } -interface JiraSecrets { +export interface JiraSecrets { email: string; apiToken: string; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx index 03bfbb38da6f2..ed2bd39d88dc4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx @@ -7,11 +7,20 @@ import { lazy } from 'react'; import { i18n } from '@kbn/i18n'; import moment from 'moment'; import { ActionTypeModel, ValidationResult } from '../../../../types'; -import { PagerDutyActionParams, PagerDutyActionConnector } from '.././types'; +import { + PagerDutyActionConnector, + PagerDutyConfig, + PagerDutySecrets, + PagerDutyActionParams, +} from '.././types'; import pagerDutySvg from './pagerduty.svg'; import { hasMustacheTokens } from '../../../lib/has_mustache_tokens'; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel< + PagerDutyConfig, + PagerDutySecrets, + PagerDutyActionParams +> { return { id: '.pagerduty', iconClass: pagerDutySvg, @@ -33,6 +42,7 @@ export function getActionType(): ActionTypeModel { routingKey: new Array(), }; validationResult.errors = errors; + if (!action.secrets.routingKey) { errors.routingKey.push( i18n.translate( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/resilient.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/resilient.tsx index cda6935f3b73d..1b27968c04fd3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/resilient.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/resilient.tsx @@ -8,7 +8,12 @@ import { lazy } from 'react'; import { ValidationResult, ActionTypeModel } from '../../../../types'; import { connectorConfiguration } from './config'; import logo from './logo.svg'; -import { ResilientActionConnector, ResilientActionParams } from './types'; +import { + ResilientActionConnector, + ResilientConfig, + ResilientSecrets, + ResilientActionParams, +} from './types'; import * as i18n from './translations'; import { isValidUrl } from '../../../lib/value_validators'; @@ -45,7 +50,11 @@ const validateConnector = (action: ResilientActionConnector): ValidationResult = return validationResult; }; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel< + ResilientConfig, + ResilientSecrets, + ResilientActionParams +> { return { id: connectorConfiguration.id, iconClass: logo, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/types.ts index 37516f5bac372..38019205fbfc9 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/types.ts @@ -5,11 +5,12 @@ */ import { CasesConfigurationMapping } from '../case_mappings'; +import { UserConfiguredActionConnector } from '../../../../types'; -export interface ResilientActionConnector { - config: ResilientConfig; - secrets: ResilientSecrets; -} +export type ResilientActionConnector = UserConfiguredActionConnector< + ResilientConfig, + ResilientSecrets +>; export interface ResilientActionParams { subAction: string; @@ -28,14 +29,14 @@ interface IncidentConfiguration { mapping: CasesConfigurationMapping[]; } -interface ResilientConfig { +export interface ResilientConfig { apiUrl: string; orgId: string; incidentConfiguration?: IncidentConfiguration; isCaseOwned?: boolean; } -interface ResilientSecrets { +export interface ResilientSecrets { apiKeyId: string; apiKeySecret: string; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx index 3bb5ea68a3040..15143eb6513eb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx @@ -5,7 +5,7 @@ */ import { TypeRegistry } from '../../../type_registry'; import { registerBuiltInActionTypes } from '.././index'; -import { ActionTypeModel, ActionConnector } from '../../../../types'; +import { ActionTypeModel, UserConfiguredActionConnector } from '../../../../types'; const ACTION_TYPE_ID = '.server-log'; let actionTypeModel: ActionTypeModel; @@ -28,13 +28,14 @@ describe('actionTypeRegistry.get() works', () => { describe('server-log connector validation', () => { test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { + const actionConnector: UserConfiguredActionConnector<{}, {}> = { secrets: {}, id: 'test', actionTypeId: '.server-log', name: 'server-log', config: {}, - } as ActionConnector; + isPreconfigured: false, + }; expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ errors: {}, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx index 390ccf6a494e9..057e9cf375f96 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ValidationResult } from '../../../../types'; import { ServerLogActionParams } from '../types'; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel { return { id: '.server-log', iconClass: 'logsApp', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx index 0f7b83ed84fb4..8396497a6e284 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx @@ -8,7 +8,12 @@ import { lazy } from 'react'; import { ValidationResult, ActionTypeModel } from '../../../../types'; import { connectorConfiguration } from './config'; import logo from './logo.svg'; -import { ServiceNowActionConnector, ServiceNowActionParams } from './types'; +import { + ServiceNowActionConnector, + ServiceNowConfig, + ServiceNowSecrets, + ServiceNowActionParams, +} from './types'; import * as i18n from './translations'; import { isValidUrl } from '../../../lib/value_validators'; @@ -41,7 +46,8 @@ const validateConnector = (action: ServiceNowActionConnector): ValidationResult }; export function getActionType(): ActionTypeModel< - ServiceNowActionConnector, + ServiceNowConfig, + ServiceNowSecrets, ServiceNowActionParams > { return { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts index a4f1ff2be0f69..92753dfcba76c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts @@ -5,11 +5,12 @@ */ import { CasesConfigurationMapping } from '../case_mappings'; +import { UserConfiguredActionConnector } from '../../../../types'; -export interface ServiceNowActionConnector { - config: ServiceNowConfig; - secrets: ServiceNowSecrets; -} +export type ServiceNowActionConnector = UserConfiguredActionConnector< + ServiceNowConfig, + ServiceNowSecrets +>; export interface ServiceNowActionParams { subAction: string; @@ -29,13 +30,13 @@ interface IncidentConfiguration { mapping: CasesConfigurationMapping[]; } -interface ServiceNowConfig { +export interface ServiceNowConfig { apiUrl: string; incidentConfiguration?: IncidentConfiguration; isCaseOwned?: boolean; } -interface ServiceNowSecrets { +export interface ServiceNowSecrets { username: string; password: string; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx index 5d39cdb5ac387..23c76f327008b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx @@ -6,9 +6,9 @@ import { lazy } from 'react'; import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ValidationResult } from '../../../../types'; -import { SlackActionParams, SlackActionConnector } from '../types'; +import { SlackActionParams, SlackSecrets, SlackActionConnector } from '../types'; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel { return { id: '.slack', iconClass: 'logoSlack', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/types.ts index 84d8b6e8caede..f6bb08148b3cb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/types.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { ActionConnector } from '../../../types'; +import { UserConfiguredActionConnector } from '../../../types'; export interface EmailActionParams { to: string[]; @@ -64,66 +64,56 @@ export interface WebhookActionParams { body?: string; } -interface EmailConfig { +export interface EmailConfig { from: string; host: string; port: number; secure?: boolean; } -interface EmailSecrets { +export interface EmailSecrets { user: string | null; password: string | null; } -export interface EmailActionConnector extends ActionConnector { - config: EmailConfig; - secrets: EmailSecrets; -} +export type EmailActionConnector = UserConfiguredActionConnector; -interface EsIndexConfig { +export interface EsIndexConfig { index: string; executionTimeField?: string | null; refresh?: boolean; } -export interface EsIndexActionConnector extends ActionConnector { - config: EsIndexConfig; -} +export type EsIndexActionConnector = UserConfiguredActionConnector; -interface PagerDutyConfig { +export interface PagerDutyConfig { apiUrl?: string; } -interface PagerDutySecrets { +export interface PagerDutySecrets { routingKey: string; } -export interface PagerDutyActionConnector extends ActionConnector { - config: PagerDutyConfig; - secrets: PagerDutySecrets; -} +export type PagerDutyActionConnector = UserConfiguredActionConnector< + PagerDutyConfig, + PagerDutySecrets +>; -interface SlackSecrets { +export interface SlackSecrets { webhookUrl: string; } -export interface SlackActionConnector extends ActionConnector { - secrets: SlackSecrets; -} +export type SlackActionConnector = UserConfiguredActionConnector; -interface WebhookConfig { +export interface WebhookConfig { method: string; url: string; headers: Record; } -interface WebhookSecrets { +export interface WebhookSecrets { user: string; password: string; } -export interface WebhookActionConnector extends ActionConnector { - config: WebhookConfig; - secrets: WebhookSecrets; -} +export type WebhookActionConnector = UserConfiguredActionConnector; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx index 2c51b21d70034..04077738e6015 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx @@ -6,10 +6,19 @@ import { lazy } from 'react'; import { i18n } from '@kbn/i18n'; import { ActionTypeModel, ValidationResult } from '../../../../types'; -import { WebhookActionParams, WebhookActionConnector } from '../types'; +import { + WebhookActionParams, + WebhookConfig, + WebhookSecrets, + WebhookActionConnector, +} from '../types'; import { isValidUrl } from '../../../lib/value_validators'; -export function getActionType(): ActionTypeModel { +export function getActionType(): ActionTypeModel< + WebhookConfig, + WebhookSecrets, + WebhookActionParams +> { return { id: '.webhook', iconClass: 'logoWebhook', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts index ad3a5b40bd00d..c4a09b6b8f46d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.test.ts @@ -59,7 +59,7 @@ describe('loadAllActions', () => { describe('createActionConnector', () => { test('should call create action API', async () => { - const connector: ActionConnectorWithoutId = { + const connector: ActionConnectorWithoutId<{}, {}> = { actionTypeId: 'test', isPreconfigured: false, name: 'My test', @@ -85,7 +85,7 @@ describe('createActionConnector', () => { describe('updateActionConnector', () => { test('should call the update API', async () => { const id = '123'; - const connector: ActionConnectorWithoutId = { + const connector: ActionConnectorWithoutId<{}, {}> = { actionTypeId: 'test', isPreconfigured: false, name: 'My test', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx index 2917be943d276..ab44520d2954a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ActionType, ActionConnector } from '../../types'; +import { ActionType, PreConfiguredActionConnector } from '../../types'; import { checkActionTypeEnabled, checkActionFormActionTypeEnabled, @@ -93,23 +93,19 @@ describe('checkActionTypeEnabled', () => { }); describe('checkActionFormActionTypeEnabled', () => { - const preconfiguredConnectors: ActionConnector[] = [ + const preconfiguredConnectors: PreConfiguredActionConnector[] = [ { actionTypeId: '1', - config: {}, id: 'test1', isPreconfigured: true, name: 'test', - secrets: {}, referencedByCount: 0, }, { actionTypeId: '2', - config: {}, id: 'test2', isPreconfigured: true, name: 'test', - secrets: {}, referencedByCount: 0, }, ]; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx index b7c9865cbd9d0..60ec8004983a3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx @@ -7,7 +7,7 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; -import { ValidationResult, ActionConnector } from '../../../types'; +import { ValidationResult, UserConfiguredActionConnector } from '../../../types'; import { ActionConnectorForm } from './action_connector_form'; const actionTypeRegistry = actionTypeRegistryMock.create(); @@ -46,11 +46,14 @@ describe('action_connector_form', () => { actionTypeRegistry.get.mockReturnValue(actionType); actionTypeRegistry.has.mockReturnValue(true); - const initialConnector = { + const initialConnector: UserConfiguredActionConnector<{}, {}> = { + id: '123', + name: '', actionTypeId: actionType.id, config: {}, secrets: {}, - } as ActionConnector; + isPreconfigured: false, + }; let wrapper; if (deps) { wrapper = mountWithIntl( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx index ed4edb0229c2b..ef6621f98fac2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx @@ -20,7 +20,12 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { HttpSetup, ApplicationStart, DocLinksStart } from 'kibana/public'; import { ReducerAction } from './connector_reducer'; -import { ActionConnector, IErrorObject, ActionTypeModel } from '../../../types'; +import { + ActionConnector, + IErrorObject, + ActionTypeModel, + UserConfiguredActionConnector, +} from '../../../types'; import { TypeRegistry } from '../../type_registry'; import { hasSaveActionsCapability } from '../../lib/capabilities'; @@ -43,8 +48,11 @@ export function validateBaseProperties(actionObject: ActionConnector) { return validationResult; } -interface ActionConnectorProps { - connector: ActionConnector; +interface ActionConnectorProps< + ConnectorConfig = Record, + ConnectorSecrets = Record +> { + connector: UserConfiguredActionConnector; dispatch: React.Dispatch; actionTypeName: string; serverError?: { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx index 7b985ab85cd4e..6c7a1cbdc3c70 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx @@ -96,10 +96,12 @@ export const ConnectorEditFlyout = ({ } const actionTypeModel = actionTypeRegistry.get(connector.actionTypeId); - const errorsInConnectorConfig = { - ...actionTypeModel?.validateConnector(connector).errors, - ...validateBaseProperties(connector).errors, - } as IErrorObject; + const errorsInConnectorConfig = (!connector.isPreconfigured + ? { + ...actionTypeModel?.validateConnector(connector).errors, + ...validateBaseProperties(connector).errors, + } + : {}) as IErrorObject; const hasErrorsInConnectorConfig = !!Object.keys(errorsInConnectorConfig).find( (errorKey) => errorsInConnectorConfig[errorKey].length >= 1 ); diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index e147f035fbb86..c551746fdec0c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -64,15 +64,19 @@ export interface Pagination { size: number; } -export interface ActionTypeModel { +export interface ActionTypeModel { id: string; iconClass: string; selectMessage: string; actionTypeTitle?: string; - validateConnector: (connector: any) => ValidationResult; + validateConnector: ( + connector: UserConfiguredActionConnector + ) => ValidationResult; validateParams: (actionParams: any) => ValidationResult; actionConnectorFields: React.LazyExoticComponent< - ComponentType> + ComponentType< + ActionConnectorFieldsProps> + > > | null; actionParamsFields: React.LazyExoticComponent< ComponentType> @@ -83,21 +87,42 @@ export interface ValidationResult { errors: Record; } -export interface ActionConnector { - secrets: Record; +interface ActionConnectorProps { + secrets: Secrets; id: string; actionTypeId: string; name: string; referencedByCount?: number; - config: Record; + config: Config; isPreconfigured: boolean; } -export type ActionConnectorWithoutId = Omit; +export type PreConfiguredActionConnector = Omit< + ActionConnectorProps, + 'config' | 'secrets' +> & { + isPreconfigured: true; +}; + +export type UserConfiguredActionConnector = ActionConnectorProps< + Config, + Secrets +> & { + isPreconfigured: false; +}; + +export type ActionConnector, Secrets = Record> = + | PreConfiguredActionConnector + | UserConfiguredActionConnector; -export interface ActionConnectorTableItem extends ActionConnector { +export type ActionConnectorWithoutId< + Config = Record, + Secrets = Record +> = Omit, 'id'>; + +export type ActionConnectorTableItem = ActionConnector & { actionType: ActionType['name']; -} +}; export interface ActionVariable { name: string; diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts index 151c837640228..f56e0e2629d40 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts @@ -245,7 +245,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should not be able to edit a preconfigured connector', async () => { - const preconfiguredConnectorName = 'xyztest'; + const preconfiguredConnectorName = 'test-preconfigured-email'; await pageObjects.triggersActionsUI.searchConnectors(preconfiguredConnectorName); diff --git a/x-pack/test/functional_with_es_ssl/config.ts b/x-pack/test/functional_with_es_ssl/config.ts index 5df5a4155efd3..eedc39b09a8e4 100644 --- a/x-pack/test/functional_with_es_ssl/config.ts +++ b/x-pack/test/functional_with_es_ssl/config.ts @@ -76,6 +76,15 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { actionTypeId: '.server-log', name: 'Serverlog#xyz', }, + 'my-email-connector': { + actionTypeId: '.email', + name: 'Email#test-preconfigured-email', + config: { + from: 'me@example.com', + host: 'localhost', + port: '1025', + }, + }, })}`, ], }, From af517a078a03160caa4f3498eca654d9f49e5147 Mon Sep 17 00:00:00 2001 From: Brandon Kobel Date: Thu, 1 Oct 2020 06:39:41 -0700 Subject: [PATCH 35/64] core route handler context is now lazy (#78957) * Core route handler context is now lazy * Removing `coreStart` intermediate variable * Adding unit tests for CoreRouteHandlerContext Co-authored-by: Elastic Machine --- .../server/core_route_handler_context.test.ts | 239 ++++++++++++++++++ src/core/server/core_route_handler_context.ts | 132 ++++++++++ src/core/server/server.ts | 21 +- 3 files changed, 373 insertions(+), 19 deletions(-) create mode 100644 src/core/server/core_route_handler_context.test.ts create mode 100644 src/core/server/core_route_handler_context.ts diff --git a/src/core/server/core_route_handler_context.test.ts b/src/core/server/core_route_handler_context.test.ts new file mode 100644 index 0000000000000..563e337e6c7e0 --- /dev/null +++ b/src/core/server/core_route_handler_context.test.ts @@ -0,0 +1,239 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { CoreRouteHandlerContext } from './core_route_handler_context'; +import { coreMock, httpServerMock } from './mocks'; + +describe('#auditor', () => { + test('returns the results of coreStart.audiTrail.asScoped', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const auditor = context.auditor; + expect(auditor).toBe(coreStart.auditTrail.asScoped.mock.results[0].value); + }); + + test('lazily created', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + expect(coreStart.auditTrail.asScoped).not.toHaveBeenCalled(); + const auditor = context.auditor; + expect(coreStart.auditTrail.asScoped).toHaveBeenCalled(); + expect(auditor).toBeDefined(); + }); + + test('only creates one instance', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const auditor1 = context.auditor; + const auditor2 = context.auditor; + expect(coreStart.auditTrail.asScoped.mock.calls.length).toBe(1); + const mockResult = coreStart.auditTrail.asScoped.mock.results[0].value; + expect(auditor1).toBe(mockResult); + expect(auditor2).toBe(mockResult); + }); +}); + +describe('#elasticsearch', () => { + describe('#client', () => { + test('returns the results of coreStart.elasticsearch.client.asScoped', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client = context.elasticsearch.client; + expect(client).toBe(coreStart.elasticsearch.client.asScoped.mock.results[0].value); + }); + + test('lazily created', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + expect(coreStart.elasticsearch.client.asScoped).not.toHaveBeenCalled(); + const client = context.elasticsearch.client; + expect(coreStart.elasticsearch.client.asScoped).toHaveBeenCalled(); + expect(client).toBeDefined(); + }); + + test('only creates one instance', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client1 = context.elasticsearch.client; + const client2 = context.elasticsearch.client; + expect(coreStart.elasticsearch.client.asScoped.mock.calls.length).toBe(1); + const mockResult = coreStart.elasticsearch.client.asScoped.mock.results[0].value; + expect(client1).toBe(mockResult); + expect(client2).toBe(mockResult); + }); + }); + + describe('#legacy', () => { + describe('#client', () => { + test('returns the results of coreStart.elasticsearch.legacy.client.asScoped', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client = context.elasticsearch.legacy.client; + expect(client).toBe(coreStart.elasticsearch.legacy.client.asScoped.mock.results[0].value); + }); + + test('lazily created', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + expect(coreStart.elasticsearch.legacy.client.asScoped).not.toHaveBeenCalled(); + const client = context.elasticsearch.legacy.client; + expect(coreStart.elasticsearch.legacy.client.asScoped).toHaveBeenCalled(); + expect(client).toBeDefined(); + }); + + test('only creates one instance', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client1 = context.elasticsearch.legacy.client; + const client2 = context.elasticsearch.legacy.client; + expect(coreStart.elasticsearch.legacy.client.asScoped.mock.calls.length).toBe(1); + const mockResult = coreStart.elasticsearch.legacy.client.asScoped.mock.results[0].value; + expect(client1).toBe(mockResult); + expect(client2).toBe(mockResult); + }); + }); + }); +}); + +describe('#savedObjects', () => { + describe('#client', () => { + test('returns the results of coreStart.savedObjects.getScopedClient', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client = context.savedObjects.client; + expect(client).toBe(coreStart.savedObjects.getScopedClient.mock.results[0].value); + }); + + test('lazily created', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const savedObjects = context.savedObjects; + expect(coreStart.savedObjects.getScopedClient).not.toHaveBeenCalled(); + const client = savedObjects.client; + expect(coreStart.savedObjects.getScopedClient).toHaveBeenCalled(); + expect(client).toBeDefined(); + }); + + test('only creates one instance', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client1 = context.savedObjects.client; + const client2 = context.savedObjects.client; + expect(coreStart.savedObjects.getScopedClient.mock.calls.length).toBe(1); + const mockResult = coreStart.savedObjects.getScopedClient.mock.results[0].value; + expect(client1).toBe(mockResult); + expect(client2).toBe(mockResult); + }); + }); + + describe('#typeRegistry', () => { + test('returns the results of coreStart.savedObjects.getTypeRegistry', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const typeRegistry = context.savedObjects.typeRegistry; + expect(typeRegistry).toBe(coreStart.savedObjects.getTypeRegistry.mock.results[0].value); + }); + + test('lazily created', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + expect(coreStart.savedObjects.getTypeRegistry).not.toHaveBeenCalled(); + const typeRegistry = context.savedObjects.typeRegistry; + expect(coreStart.savedObjects.getTypeRegistry).toHaveBeenCalled(); + expect(typeRegistry).toBeDefined(); + }); + + test('only creates one instance', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const typeRegistry1 = context.savedObjects.typeRegistry; + const typeRegistry2 = context.savedObjects.typeRegistry; + expect(coreStart.savedObjects.getTypeRegistry.mock.calls.length).toBe(1); + const mockResult = coreStart.savedObjects.getTypeRegistry.mock.results[0].value; + expect(typeRegistry1).toBe(mockResult); + expect(typeRegistry2).toBe(mockResult); + }); + }); +}); + +describe('#uiSettings', () => { + describe('#client', () => { + test('returns the results of coreStart.uiSettings.asScopedToClient', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client = context.uiSettings.client; + expect(client).toBe(coreStart.uiSettings.asScopedToClient.mock.results[0].value); + }); + + test('lazily created', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + expect(coreStart.uiSettings.asScopedToClient).not.toHaveBeenCalled(); + const client = context.uiSettings.client; + expect(coreStart.uiSettings.asScopedToClient).toHaveBeenCalled(); + expect(client).toBeDefined(); + }); + + test('only creates one instance', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = coreMock.createInternalStart(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const client1 = context.uiSettings.client; + const client2 = context.uiSettings.client; + expect(coreStart.uiSettings.asScopedToClient.mock.calls.length).toBe(1); + const mockResult = coreStart.uiSettings.asScopedToClient.mock.results[0].value; + expect(client1).toBe(mockResult); + expect(client2).toBe(mockResult); + }); + }); +}); diff --git a/src/core/server/core_route_handler_context.ts b/src/core/server/core_route_handler_context.ts new file mode 100644 index 0000000000000..8a182a523f52c --- /dev/null +++ b/src/core/server/core_route_handler_context.ts @@ -0,0 +1,132 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// eslint-disable-next-line max-classes-per-file +import { InternalCoreStart } from './internal_types'; +import { KibanaRequest } from './http/router'; +import { SavedObjectsClientContract } from './saved_objects/types'; +import { InternalSavedObjectsServiceStart, ISavedObjectTypeRegistry } from './saved_objects'; +import { + InternalElasticsearchServiceStart, + IScopedClusterClient, + LegacyScopedClusterClient, +} from './elasticsearch'; +import { Auditor } from './audit_trail'; +import { InternalUiSettingsServiceStart, IUiSettingsClient } from './ui_settings'; + +class CoreElasticsearchRouteHandlerContext { + #client?: IScopedClusterClient; + #legacy?: { + client: Pick; + }; + + constructor( + private readonly elasticsearchStart: InternalElasticsearchServiceStart, + private readonly request: KibanaRequest + ) {} + + public get client() { + if (this.#client == null) { + this.#client = this.elasticsearchStart.client.asScoped(this.request); + } + return this.#client; + } + + public get legacy() { + if (this.#legacy == null) { + this.#legacy = { + client: this.elasticsearchStart.legacy.client.asScoped(this.request), + }; + } + return this.#legacy; + } +} + +class CoreSavedObjectsRouteHandlerContext { + constructor( + private readonly savedObjectsStart: InternalSavedObjectsServiceStart, + private readonly request: KibanaRequest + ) {} + #scopedSavedObjectsClient?: SavedObjectsClientContract; + #typeRegistry?: ISavedObjectTypeRegistry; + + public get client() { + if (this.#scopedSavedObjectsClient == null) { + this.#scopedSavedObjectsClient = this.savedObjectsStart.getScopedClient(this.request); + } + return this.#scopedSavedObjectsClient; + } + + public get typeRegistry() { + if (this.#typeRegistry == null) { + this.#typeRegistry = this.savedObjectsStart.getTypeRegistry(); + } + return this.#typeRegistry; + } +} + +class CoreUiSettingsRouteHandlerContext { + #client?: IUiSettingsClient; + constructor( + private readonly uiSettingsStart: InternalUiSettingsServiceStart, + private readonly savedObjectsRouterHandlerContext: CoreSavedObjectsRouteHandlerContext + ) {} + + public get client() { + if (this.#client == null) { + this.#client = this.uiSettingsStart.asScopedToClient( + this.savedObjectsRouterHandlerContext.client + ); + } + return this.#client; + } +} + +export class CoreRouteHandlerContext { + #auditor?: Auditor; + + readonly elasticsearch: CoreElasticsearchRouteHandlerContext; + readonly savedObjects: CoreSavedObjectsRouteHandlerContext; + readonly uiSettings: CoreUiSettingsRouteHandlerContext; + + constructor( + private readonly coreStart: InternalCoreStart, + private readonly request: KibanaRequest + ) { + this.elasticsearch = new CoreElasticsearchRouteHandlerContext( + this.coreStart.elasticsearch, + this.request + ); + this.savedObjects = new CoreSavedObjectsRouteHandlerContext( + this.coreStart.savedObjects, + this.request + ); + this.uiSettings = new CoreUiSettingsRouteHandlerContext( + this.coreStart.uiSettings, + this.savedObjects + ); + } + + public get auditor() { + if (this.#auditor == null) { + this.#auditor = this.coreStart.auditTrail.asScoped(this.request); + } + return this.#auditor; + } +} diff --git a/src/core/server/server.ts b/src/core/server/server.ts index 4e5a7a328bed4..ece10db41962d 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -48,6 +48,7 @@ import { config as statusConfig } from './status'; import { ContextService } from './context'; import { RequestHandlerContext } from '.'; import { InternalCoreSetup, InternalCoreStart, ServiceConfigDescriptor } from './internal_types'; +import { CoreRouteHandlerContext } from './core_route_handler_context'; const coreId = Symbol('core'); const rootConfigPath = ''; @@ -279,25 +280,7 @@ export class Server { coreId, 'core', async (context, req, res): Promise => { - const coreStart = this.coreStart!; - const savedObjectsClient = coreStart.savedObjects.getScopedClient(req); - - return { - savedObjects: { - client: savedObjectsClient, - typeRegistry: coreStart.savedObjects.getTypeRegistry(), - }, - elasticsearch: { - client: coreStart.elasticsearch.client.asScoped(req), - legacy: { - client: coreStart.elasticsearch.legacy.client.asScoped(req), - }, - }, - uiSettings: { - client: coreStart.uiSettings.asScopedToClient(savedObjectsClient), - }, - auditor: coreStart.auditTrail.asScoped(req), - }; + return new CoreRouteHandlerContext(this.coreStart!, req); } ); } From 9f5033354d2a8d8cb264827a7ab6d38b36a8a532 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Thu, 1 Oct 2020 08:57:52 -0500 Subject: [PATCH 36/64] Remove APM-specific loading indicator (#79042) Kibana now has its own loading indicator. Remove the one we were using. Also remove the old service map loading indicator that was used back when we had background jobs. Fixes #78769. --- .../plugins/apm/public/application/csmApp.tsx | 5 +- .../plugins/apm/public/application/index.tsx | 9 +- .../app/ServiceMap/LoadingOverlay.tsx | 61 ------------ .../Delayed/index.test.tsx | 96 ------------------- .../useDelayedVisibility/Delayed/index.ts | 66 ------------- .../useDelayedVisibility/index.test.tsx | 86 ----------------- .../shared/useDelayedVisibility/index.ts | 48 ---------- .../context/LoadingIndicatorContext.tsx | 65 ------------- .../plugins/apm/public/hooks/useFetcher.tsx | 14 +-- .../apm/public/hooks/useLoadingIndicator.ts | 28 ------ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 12 files changed, 5 insertions(+), 475 deletions(-) delete mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx delete mode 100644 x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.test.tsx delete mode 100644 x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.ts delete mode 100644 x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.test.tsx delete mode 100644 x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.ts delete mode 100644 x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx delete mode 100644 x-pack/plugins/apm/public/hooks/useLoadingIndicator.ts diff --git a/x-pack/plugins/apm/public/application/csmApp.tsx b/x-pack/plugins/apm/public/application/csmApp.tsx index 5ebe14b663f56..2baddbe572a52 100644 --- a/x-pack/plugins/apm/public/application/csmApp.tsx +++ b/x-pack/plugins/apm/public/application/csmApp.tsx @@ -22,7 +22,6 @@ import { renderAsRedirectTo } from '../components/app/Main/route_config'; import { ScrollToTopOnPathChange } from '../components/app/Main/ScrollToTopOnPathChange'; import { RumHome, UX_LABEL } from '../components/app/RumDashboard/RumHome'; import { ApmPluginContext } from '../context/ApmPluginContext'; -import { LoadingIndicatorProvider } from '../context/LoadingIndicatorContext'; import { UrlParamsProvider } from '../context/UrlParamsContext'; import { useBreadcrumbs } from '../hooks/use_breadcrumbs'; import { ConfigSchema } from '../index'; @@ -92,9 +91,7 @@ export function CsmAppRoot({ - - - + diff --git a/x-pack/plugins/apm/public/application/index.tsx b/x-pack/plugins/apm/public/application/index.tsx index 9843f73dafdbb..24505951c9d71 100644 --- a/x-pack/plugins/apm/public/application/index.tsx +++ b/x-pack/plugins/apm/public/application/index.tsx @@ -24,7 +24,6 @@ import { routes } from '../components/app/Main/route_config'; import { ScrollToTopOnPathChange } from '../components/app/Main/ScrollToTopOnPathChange'; import { ApmPluginContext } from '../context/ApmPluginContext'; import { LicenseProvider } from '../context/LicenseContext'; -import { LoadingIndicatorProvider } from '../context/LoadingIndicatorContext'; import { UrlParamsProvider } from '../context/UrlParamsContext'; import { useBreadcrumbs } from '../hooks/use_breadcrumbs'; import { ApmPluginSetupDeps } from '../plugin'; @@ -99,11 +98,9 @@ export function ApmAppRoot({ - - - - - + + + diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx deleted file mode 100644 index 8557c3f0c0798..0000000000000 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { EuiProgress, EuiText, EuiSpacer } from '@elastic/eui'; -import styled from 'styled-components'; -import { i18n } from '@kbn/i18n'; - -const Container = styled.div` - position: relative; -`; - -const Overlay = styled.div` - position: absolute; - top: 0; - z-index: 1; - display: flex; - flex-direction: column; - align-items: center; - width: 100%; - padding: ${({ theme }) => theme.eui.gutterTypes.gutterMedium}; -`; - -const ProgressBarContainer = styled.div` - width: 50%; - max-width: 600px; -`; - -interface Props { - isLoading: boolean; - percentageLoaded: number; -} - -export function LoadingOverlay({ isLoading, percentageLoaded }: Props) { - return ( - - {isLoading && ( - - - - - - - {i18n.translate('xpack.apm.loadingServiceMap', { - defaultMessage: - 'Loading service map... This might take a short while.', - })} - - - )} - - ); -} diff --git a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.test.tsx b/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.test.tsx deleted file mode 100644 index 47c439bdd746d..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.test.tsx +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Delayed } from './index'; - -// Advanced time like setTimeout and mocks Date.now() to stay in sync -class AdvanceTimer { - public nowTime = 0; - public advance(ms: number) { - this.nowTime += ms; - jest.spyOn(Date, 'now').mockReturnValue(this.nowTime); - jest.advanceTimersByTime(ms); - } -} - -describe('Delayed', () => { - it('should not flicker between show/hide when the hide interval is very short', async () => { - jest.useFakeTimers(); - const visibilityChanges: boolean[] = []; - const advanceTimer = new AdvanceTimer(); - const delayed = new Delayed(); - - delayed.onChange((isVisible) => visibilityChanges.push(isVisible)); - - for (let i = 1; i < 100; i += 2) { - delayed.show(); - advanceTimer.advance(1000); - delayed.hide(); - advanceTimer.advance(20); - } - advanceTimer.advance(100); - - expect(visibilityChanges).toEqual([true, false]); - }); - - it('should not be shown at all when the duration is very short', async () => { - jest.useFakeTimers(); - const advanceTimer = new AdvanceTimer(); - const visibilityChanges: boolean[] = []; - const delayed = new Delayed(); - - delayed.onChange((isVisible) => visibilityChanges.push(isVisible)); - - delayed.show(); - advanceTimer.advance(30); - delayed.hide(); - advanceTimer.advance(1000); - - expect(visibilityChanges).toEqual([]); - }); - - it('should be displayed for minimum 1000ms', async () => { - jest.useFakeTimers(); - const visibilityChanges: boolean[] = []; - const advanceTimer = new AdvanceTimer(); - const delayed = new Delayed(); - - delayed.onChange((isVisible) => visibilityChanges.push(isVisible)); - - delayed.show(); - advanceTimer.advance(200); - delayed.hide(); - advanceTimer.advance(950); - expect(visibilityChanges).toEqual([true]); - advanceTimer.advance(100); - expect(visibilityChanges).toEqual([true, false]); - delayed.show(); - advanceTimer.advance(50); - expect(visibilityChanges).toEqual([true, false, true]); - delayed.hide(); - advanceTimer.advance(950); - expect(visibilityChanges).toEqual([true, false, true]); - advanceTimer.advance(100); - expect(visibilityChanges).toEqual([true, false, true, false]); - }); - - it('should be displayed for minimum 2000ms', async () => { - jest.useFakeTimers(); - const visibilityChanges: boolean[] = []; - const advanceTimer = new AdvanceTimer(); - const delayed = new Delayed({ minimumVisibleDuration: 2000 }); - - delayed.onChange((isVisible) => visibilityChanges.push(isVisible)); - - delayed.show(); - advanceTimer.advance(200); - delayed.hide(); - advanceTimer.advance(1950); - expect(visibilityChanges).toEqual([true]); - advanceTimer.advance(100); - expect(visibilityChanges).toEqual([true, false]); - }); -}); diff --git a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.ts b/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.ts deleted file mode 100644 index daab721f64b1a..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/Delayed/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -type Callback = (isVisible: boolean) => void; - -export class Delayed { - private displayedAt = 0; - private hideDelayMs: number; - private isVisible = false; - private minimumVisibleDuration: number; - private showDelayMs: number; - private timeoutId?: number; - - constructor({ - minimumVisibleDuration = 1000, - showDelayMs = 50, - hideDelayMs = 50, - } = {}) { - this.minimumVisibleDuration = minimumVisibleDuration; - this.hideDelayMs = hideDelayMs; - this.showDelayMs = showDelayMs; - } - - private onChangeCallback: Callback = () => null; - - private updateState(isVisible: boolean) { - window.clearTimeout(this.timeoutId); - const ms = !isVisible - ? Math.max( - this.displayedAt + this.minimumVisibleDuration - Date.now(), - this.hideDelayMs - ) - : this.showDelayMs; - - this.timeoutId = window.setTimeout(() => { - if (this.isVisible !== isVisible) { - this.isVisible = isVisible; - this.onChangeCallback(isVisible); - if (isVisible) { - this.displayedAt = Date.now(); - } - } - }, ms); - } - - public show() { - this.updateState(true); - } - - public hide() { - this.updateState(false); - } - - public onChange(onChangeCallback: Callback) { - this.onChangeCallback = onChangeCallback; - } - - public destroy() { - if (this.timeoutId) { - window.clearTimeout(this.timeoutId); - } - } -} diff --git a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.test.tsx b/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.test.tsx deleted file mode 100644 index 447e11eab5e41..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.test.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - renderHook, - act, - RenderHookResult, -} from '@testing-library/react-hooks'; -import { useDelayedVisibility } from '.'; - -// Failing: See https://github.com/elastic/kibana/issues/66389 -describe.skip('useFetcher', () => { - let hook: RenderHookResult; - - beforeEach(() => { - jest.useFakeTimers(); - }); - - it('is initially false', () => { - hook = renderHook((isLoading) => useDelayedVisibility(isLoading), { - initialProps: false, - }); - expect(hook.result.current).toEqual(false); - }); - - it('does not change to true immediately', () => { - hook = renderHook((isLoading) => useDelayedVisibility(isLoading), { - initialProps: false, - }); - - hook.rerender(true); - act(() => { - jest.advanceTimersByTime(10); - }); - - expect(hook.result.current).toEqual(false); - act(() => { - jest.advanceTimersByTime(50); - }); - - expect(hook.result.current).toEqual(true); - }); - - it('does not change to false immediately', () => { - hook = renderHook((isLoading) => useDelayedVisibility(isLoading), { - initialProps: false, - }); - - hook.rerender(true); - act(() => { - jest.advanceTimersByTime(100); - }); - hook.rerender(false); - - expect(hook.result.current).toEqual(true); - }); - - // Disabled because it's flaky: https://github.com/elastic/kibana/issues/66389 - // it('is true for minimum 1000ms', () => { - // hook = renderHook((isLoading) => useDelayedVisibility(isLoading), { - // initialProps: false, - // }); - - // hook.rerender(true); - - // act(() => { - // jest.advanceTimersByTime(100); - // }); - - // hook.rerender(false); - // act(() => { - // jest.advanceTimersByTime(900); - // }); - - // expect(hook.result.current).toEqual(true); - - // act(() => { - // jest.advanceTimersByTime(100); - // }); - - // expect(hook.result.current).toEqual(false); - // }); -}); diff --git a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.ts b/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.ts deleted file mode 100644 index bd5708494d641..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/useDelayedVisibility/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { useEffect, useRef, useState } from 'react'; -import { Delayed } from './Delayed'; - -export function useDelayedVisibility( - visible: boolean, - hideDelayMs?: number, - showDelayMs?: number, - minimumVisibleDuration?: number -) { - const [isVisible, setIsVisible] = useState(false); - const delayedRef = useRef(null); - - useEffect(() => { - const delayed = new Delayed({ - hideDelayMs, - showDelayMs, - minimumVisibleDuration, - }); - delayed.onChange((visibility) => { - setIsVisible(visibility); - }); - delayedRef.current = delayed; - - return () => { - delayed.destroy(); - }; - }, [hideDelayMs, showDelayMs, minimumVisibleDuration]); - - useEffect(() => { - if (!delayedRef.current) { - return; - } - - if (visible) { - delayedRef.current.show(); - } else { - delayedRef.current.hide(); - } - }, [visible]); - - return isVisible; -} diff --git a/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx b/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx deleted file mode 100644 index 99822c0bbc5ca..0000000000000 --- a/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { EuiPortal, EuiProgress } from '@elastic/eui'; -import { pickBy } from 'lodash'; -import React, { Fragment, useMemo, useReducer } from 'react'; -import { useDelayedVisibility } from '../components/shared/useDelayedVisibility'; - -export const LoadingIndicatorContext = React.createContext({ - statuses: {}, - dispatchStatus: (_action: Action) => {}, -}); - -interface State { - [key: string]: boolean; -} - -interface Action { - isLoading: boolean; - id: number; -} - -function reducer(statuses: State, action: Action) { - // Return an object with only the ids with `true` as their value, so that ids - // that previously had `false` are removed and do not remain hanging around in - // the object. - return pickBy( - { ...statuses, [action.id.toString()]: action.isLoading }, - Boolean - ); -} - -function getIsAnyLoading(statuses: State) { - return Object.values(statuses).some((isLoading) => isLoading); -} - -export function LoadingIndicatorProvider({ - children, -}: { - children: React.ReactNode; -}) { - const [statuses, dispatchStatus] = useReducer(reducer, {}); - const isLoading = useMemo(() => getIsAnyLoading(statuses), [statuses]); - const shouldShowLoadingIndicator = useDelayedVisibility(isLoading); - const contextValue = React.useMemo(() => ({ statuses, dispatchStatus }), [ - statuses, - ]); - - return ( - - {shouldShowLoadingIndicator && ( - - - - )} - - - - ); -} diff --git a/x-pack/plugins/apm/public/hooks/useFetcher.tsx b/x-pack/plugins/apm/public/hooks/useFetcher.tsx index 68b197c46e888..5d65424844c5a 100644 --- a/x-pack/plugins/apm/public/hooks/useFetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/useFetcher.tsx @@ -4,14 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useContext, useEffect, useState, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; +import React, { useEffect, useMemo, useState } from 'react'; import { IHttpFetchError } from 'src/core/public'; import { toMountPoint } from '../../../../../src/plugins/kibana_react/public'; -import { LoadingIndicatorContext } from '../context/LoadingIndicatorContext'; import { APMClient, callApmApi } from '../services/rest/createCallApmApi'; import { useApmPluginContext } from './useApmPluginContext'; -import { useLoadingIndicator } from './useLoadingIndicator'; export enum FETCH_STATUS { LOADING = 'loading', @@ -44,9 +42,6 @@ export function useFetcher( ): FetcherResult> & { refetch: () => void } { const { notifications } = useApmPluginContext().core; const { preservePreviousData = true, showToastOnError = true } = options; - const { setIsLoading } = useLoadingIndicator(); - - const { dispatchStatus } = useContext(LoadingIndicatorContext); const [result, setResult] = useState< FetcherResult> >({ @@ -67,8 +62,6 @@ export function useFetcher( return; } - setIsLoading(true); - setResult((prevResult) => ({ data: preservePreviousData ? prevResult.data : undefined, // preserve data from previous state while loading next state status: FETCH_STATUS.LOADING, @@ -78,7 +71,6 @@ export function useFetcher( try { const data = await promise; if (!didCancel) { - setIsLoading(false); setResult({ data, status: FETCH_STATUS.SUCCESS, @@ -122,7 +114,6 @@ export function useFetcher( ), }); } - setIsLoading(false); setResult({ data: undefined, status: FETCH_STATUS.FAILURE, @@ -135,7 +126,6 @@ export function useFetcher( doFetch(); return () => { - setIsLoading(false); didCancel = true; }; /* eslint-disable react-hooks/exhaustive-deps */ @@ -143,8 +133,6 @@ export function useFetcher( counter, preservePreviousData, showToastOnError, - dispatchStatus, - setIsLoading, ...fnDeps, /* eslint-enable react-hooks/exhaustive-deps */ ]); diff --git a/x-pack/plugins/apm/public/hooks/useLoadingIndicator.ts b/x-pack/plugins/apm/public/hooks/useLoadingIndicator.ts deleted file mode 100644 index 6742efb0ffbae..0000000000000 --- a/x-pack/plugins/apm/public/hooks/useLoadingIndicator.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { useContext, useMemo, useEffect } from 'react'; -import { LoadingIndicatorContext } from '../context/LoadingIndicatorContext'; -import { useComponentId } from './useComponentId'; - -export function useLoadingIndicator() { - const { dispatchStatus } = useContext(LoadingIndicatorContext); - const id = useComponentId(); - - useEffect(() => { - return () => { - dispatchStatus({ id, isLoading: false }); - }; - }, [dispatchStatus, id]); - - return useMemo(() => { - return { - setIsLoading: (loading: boolean) => { - dispatchStatus({ id, isLoading: loading }); - }, - }; - }, [dispatchStatus, id]); -} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 34ff32244035a..0ebb10d30c010 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4712,7 +4712,6 @@ "xpack.apm.license.betaTooltipMessage": "現在、この機能はベータです。不具合を見つけた場合やご意見がある場合、サポートに問い合わせるか、またはディスカッションフォーラムにご報告ください。", "xpack.apm.license.button": "トライアルを開始", "xpack.apm.license.title": "無料の 30 日トライアルを開始", - "xpack.apm.loadingServiceMap": "サービスマップを読み込み中...多少時間がかかる場合があります。", "xpack.apm.localFilters.titles.agentName": "エージェント名", "xpack.apm.localFilters.titles.browser": "ブラウザー", "xpack.apm.localFilters.titles.containerId": "コンテナー ID", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index db59493002987..acd6db3b758b1 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4714,7 +4714,6 @@ "xpack.apm.license.betaTooltipMessage": "此功能当前为公测版。如果遇到任何错误或有任何反馈,请报告问题或访问我们的论坛。", "xpack.apm.license.button": "开始试用", "xpack.apm.license.title": "开始为期 30 天的免费试用", - "xpack.apm.loadingServiceMap": "正在加载服务地图......这可能需要一会儿时间。", "xpack.apm.localFilters.titles.agentName": "代理名称", "xpack.apm.localFilters.titles.browser": "浏览器", "xpack.apm.localFilters.titles.containerId": "容器 ID", From b692c374a2b0240b27d8077b3a14de435d492851 Mon Sep 17 00:00:00 2001 From: Daniil Suleiman <31325372+sulemanof@users.noreply.github.com> Date: Thu, 1 Oct 2020 17:08:12 +0300 Subject: [PATCH 37/64] Timelion visualization renderer (#78540) * Update styles * Implement toExpressionAst fn * Implement renderer * Update unit tests * Add unit tests * Update types * Remove unused vars * Fix types * Update types * Show error message when no data * Update ExpressionRenderDefinition api * Update renderer when there is no data * Make options component lazy Co-authored-by: Elastic Machine --- ....expressionrenderdefinition.displayname.md | 2 +- ....expressionrenderdefinition.displayname.md | 2 +- .../common/expression_renderers/types.ts | 2 +- src/plugins/expressions/public/public.api.md | 2 +- src/plugins/expressions/server/server.api.md | 2 +- src/plugins/timelion/public/index.scss | 6 ++ .../public/tag_cloud_vis_renderer.tsx | 1 - .../public/__snapshots__/to_ast.test.ts.snap | 21 ++++++ .../public/_timelion_editor.scss | 15 ----- .../public/_timelion_vis.scss | 12 ---- .../{_panel.scss => _timelion_vis.scss} | 8 +++ .../components/{_index.scss => index.scss} | 2 +- .../public/components/index.ts | 1 - .../public/components/timelion_vis.tsx | 50 -------------- .../{panel.tsx => timelion_vis_component.tsx} | 57 ++++++++++------ .../helpers/timelion_request_handler.ts | 4 +- .../vis_type_timelion/public/index.scss | 3 - .../vis_type_timelion/public/plugin.ts | 5 +- .../public/timelion_options.tsx | 47 +++++++++----- .../public/timelion_vis_fn.ts | 26 +++++--- .../public/timelion_vis_renderer.tsx | 65 +++++++++++++++++++ .../public/timelion_vis_type.tsx | 19 ++---- .../{components/chart.tsx => to_ast.test.ts} | 37 +++++------ .../vis_type_timelion/public/to_ast.ts | 37 +++++++++++ .../__snapshots__/build_pipeline.test.ts.snap | 2 - .../public/legacy/build_pipeline.test.ts | 6 -- .../public/legacy/build_pipeline.ts | 5 -- 27 files changed, 258 insertions(+), 181 deletions(-) create mode 100644 src/plugins/vis_type_timelion/public/__snapshots__/to_ast.test.ts.snap delete mode 100644 src/plugins/vis_type_timelion/public/_timelion_editor.scss delete mode 100644 src/plugins/vis_type_timelion/public/_timelion_vis.scss rename src/plugins/vis_type_timelion/public/components/{_panel.scss => _timelion_vis.scss} (88%) rename src/plugins/vis_type_timelion/public/components/{_index.scss => index.scss} (60%) delete mode 100644 src/plugins/vis_type_timelion/public/components/timelion_vis.tsx rename src/plugins/vis_type_timelion/public/components/{panel.tsx => timelion_vis_component.tsx} (90%) delete mode 100644 src/plugins/vis_type_timelion/public/index.scss create mode 100644 src/plugins/vis_type_timelion/public/timelion_vis_renderer.tsx rename src/plugins/vis_type_timelion/public/{components/chart.tsx => to_ast.test.ts} (60%) create mode 100644 src/plugins/vis_type_timelion/public/to_ast.ts diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrenderdefinition.displayname.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrenderdefinition.displayname.md index 9d5f7609ee6cd..a957ecd63f043 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrenderdefinition.displayname.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrenderdefinition.displayname.md @@ -9,5 +9,5 @@ A user friendly name of the renderer as will be displayed to user in UI. Signature: ```typescript -displayName: string; +displayName?: string; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionrenderdefinition.displayname.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionrenderdefinition.displayname.md index e936e25cee6ca..8ae5aa2f1790e 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionrenderdefinition.displayname.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionrenderdefinition.displayname.md @@ -9,5 +9,5 @@ A user friendly name of the renderer as will be displayed to user in UI. Signature: ```typescript -displayName: string; +displayName?: string; ``` diff --git a/src/plugins/expressions/common/expression_renderers/types.ts b/src/plugins/expressions/common/expression_renderers/types.ts index 7b3e812eafedd..b760e7b32a7d2 100644 --- a/src/plugins/expressions/common/expression_renderers/types.ts +++ b/src/plugins/expressions/common/expression_renderers/types.ts @@ -28,7 +28,7 @@ export interface ExpressionRenderDefinition { /** * A user friendly name of the renderer as will be displayed to user in UI. */ - displayName: string; + displayName?: string; /** * Help text as will be displayed to user. A sentence or few about what this diff --git a/src/plugins/expressions/public/public.api.md b/src/plugins/expressions/public/public.api.md index 162f0ef6824f5..5c0fd8ab1a572 100644 --- a/src/plugins/expressions/public/public.api.md +++ b/src/plugins/expressions/public/public.api.md @@ -429,7 +429,7 @@ export interface ExpressionImage { // // @public (undocumented) export interface ExpressionRenderDefinition { - displayName: string; + displayName?: string; help?: string; name: string; render: (domNode: HTMLElement, config: Config, handlers: IInterpreterRenderHandlers) => void | Promise; diff --git a/src/plugins/expressions/server/server.api.md b/src/plugins/expressions/server/server.api.md index 6ac251ea005b4..d8872ee416017 100644 --- a/src/plugins/expressions/server/server.api.md +++ b/src/plugins/expressions/server/server.api.md @@ -401,7 +401,7 @@ export interface ExpressionImage { // // @public (undocumented) export interface ExpressionRenderDefinition { - displayName: string; + displayName?: string; help?: string; name: string; render: (domNode: HTMLElement, config: Config, handlers: IInterpreterRenderHandlers) => void | Promise; diff --git a/src/plugins/timelion/public/index.scss b/src/plugins/timelion/public/index.scss index 6bf7133287c51..f39e0c18a2870 100644 --- a/src/plugins/timelion/public/index.scss +++ b/src/plugins/timelion/public/index.scss @@ -10,3 +10,9 @@ @import './app'; @import './base'; @import './directives/index'; + +// these styles is needed to be loaded here explicitly if the timelion visualization was not opened in browser +// styles for timelion visualization are lazy loaded only while a vis is opened +// this will duplicate styles only if both Timelion app and timelion visualization are loaded +// could be left here as it is since the Timelion app is deprecated +@import '../../vis_type_timelion/public/components/index.scss'; diff --git a/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx b/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx index d37aa5f6fe409..b433ed9cbed21 100644 --- a/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx +++ b/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx @@ -25,7 +25,6 @@ import { ExpressionRenderDefinition } from '../../expressions/common/expression_ import { TagCloudVisDependencies } from './plugin'; import { TagCloudVisRenderValue } from './tag_cloud_fn'; -// @ts-ignore const TagCloudChart = lazy(() => import('./components/tag_cloud_chart')); export const getTagCloudVisRenderer: ( diff --git a/src/plugins/vis_type_timelion/public/__snapshots__/to_ast.test.ts.snap b/src/plugins/vis_type_timelion/public/__snapshots__/to_ast.test.ts.snap new file mode 100644 index 0000000000000..9e32a6c4ae17c --- /dev/null +++ b/src/plugins/vis_type_timelion/public/__snapshots__/to_ast.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`timelion vis toExpressionAst function should match basic snapshot 1`] = ` +Object { + "chain": Array [ + Object { + "arguments": Object { + "expression": Array [ + ".es(*)", + ], + "interval": Array [ + "auto", + ], + }, + "function": "timelion_vis", + "type": "function", + }, + ], + "type": "expression", +} +`; diff --git a/src/plugins/vis_type_timelion/public/_timelion_editor.scss b/src/plugins/vis_type_timelion/public/_timelion_editor.scss deleted file mode 100644 index a9331930a86ff..0000000000000 --- a/src/plugins/vis_type_timelion/public/_timelion_editor.scss +++ /dev/null @@ -1,15 +0,0 @@ -.visEditor--timelion { - vis-options-react-wrapper, - .visEditorSidebar__options, - .visEditorSidebar__timelionOptions { - flex: 1 1 auto; - display: flex; - flex-direction: column; - } - - .visEditor__sidebar { - @include euiBreakpoint('xs', 's', 'm') { - width: 100%; - } - } -} diff --git a/src/plugins/vis_type_timelion/public/_timelion_vis.scss b/src/plugins/vis_type_timelion/public/_timelion_vis.scss deleted file mode 100644 index e7175bf3c0c2a..0000000000000 --- a/src/plugins/vis_type_timelion/public/_timelion_vis.scss +++ /dev/null @@ -1,12 +0,0 @@ -.timVis { - min-width: 100%; - display: flex; - flex-direction: column; - - .timChart { - min-width: 100%; - flex: 1; - display: flex; - flex-direction: column; - } -} diff --git a/src/plugins/vis_type_timelion/public/components/_panel.scss b/src/plugins/vis_type_timelion/public/components/_timelion_vis.scss similarity index 88% rename from src/plugins/vis_type_timelion/public/components/_panel.scss rename to src/plugins/vis_type_timelion/public/components/_timelion_vis.scss index c4d591bc82cad..6729d400523cd 100644 --- a/src/plugins/vis_type_timelion/public/components/_panel.scss +++ b/src/plugins/vis_type_timelion/public/components/_timelion_vis.scss @@ -58,3 +58,11 @@ white-space: nowrap; font-weight: $euiFontWeightBold; } + +.visEditor--timelion { + .visEditorSidebar__timelionOptions { + flex: 1 1 auto; + display: flex; + flex-direction: column; + } +} diff --git a/src/plugins/vis_type_timelion/public/components/_index.scss b/src/plugins/vis_type_timelion/public/components/index.scss similarity index 60% rename from src/plugins/vis_type_timelion/public/components/_index.scss rename to src/plugins/vis_type_timelion/public/components/index.scss index 707c9dafebe2b..a541c66e6e913 100644 --- a/src/plugins/vis_type_timelion/public/components/_index.scss +++ b/src/plugins/vis_type_timelion/public/components/index.scss @@ -1,2 +1,2 @@ -@import 'panel'; +@import 'timelion_vis'; @import 'timelion_expression_input'; diff --git a/src/plugins/vis_type_timelion/public/components/index.ts b/src/plugins/vis_type_timelion/public/components/index.ts index c70caab8dd70c..8d7d32a3ba262 100644 --- a/src/plugins/vis_type_timelion/public/components/index.ts +++ b/src/plugins/vis_type_timelion/public/components/index.ts @@ -19,4 +19,3 @@ export * from './timelion_expression_input'; export * from './timelion_interval'; -export * from './timelion_vis'; diff --git a/src/plugins/vis_type_timelion/public/components/timelion_vis.tsx b/src/plugins/vis_type_timelion/public/components/timelion_vis.tsx deleted file mode 100644 index aa594c749b600..0000000000000 --- a/src/plugins/vis_type_timelion/public/components/timelion_vis.tsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; - -import { IUiSettingsClient } from 'kibana/public'; -import { ChartComponent } from './chart'; -import { VisParams } from '../timelion_vis_fn'; -import { TimelionSuccessResponse } from '../helpers/timelion_request_handler'; -import { ExprVis } from '../../../visualizations/public'; - -export interface TimelionVisComponentProp { - config: IUiSettingsClient; - renderComplete(): void; - updateStatus: object; - vis: ExprVis; - visData: TimelionSuccessResponse; - visParams: VisParams; -} - -function TimelionVisComponent(props: TimelionVisComponentProp) { - return ( -
- -
- ); -} - -export { TimelionVisComponent }; diff --git a/src/plugins/vis_type_timelion/public/components/panel.tsx b/src/plugins/vis_type_timelion/public/components/timelion_vis_component.tsx similarity index 90% rename from src/plugins/vis_type_timelion/public/components/panel.tsx rename to src/plugins/vis_type_timelion/public/components/timelion_vis_component.tsx index 9c30a6b75d6db..a7b623ac8680c 100644 --- a/src/plugins/vis_type_timelion/public/components/panel.tsx +++ b/src/plugins/vis_type_timelion/public/components/timelion_vis_component.tsx @@ -21,7 +21,9 @@ import React, { useState, useEffect, useMemo, useCallback } from 'react'; import $ from 'jquery'; import moment from 'moment-timezone'; import { debounce, compact, get, each, cloneDeep, last, map } from 'lodash'; +import { useResizeObserver } from '@elastic/eui'; +import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; import { useKibana } from '../../../kibana_react/public'; import '../flot'; import { DEFAULT_TIME_FORMAT } from '../../common/lib'; @@ -38,18 +40,19 @@ import { Series, Sheet } from '../helpers/timelion_request_handler'; import { tickFormatters } from '../helpers/tick_formatters'; import { generateTicksProvider } from '../helpers/tick_generator'; import { TimelionVisDependencies } from '../plugin'; -import { ExprVisAPIEvents } from '../../../visualizations/public'; + +import './index.scss'; interface CrosshairPlot extends jquery.flot.plot { setCrosshair: (pos: Position) => void; clearCrosshair: () => void; } -interface PanelProps { - applyFilter: ExprVisAPIEvents['applyFilter']; +interface TimelionVisComponentProps { + fireEvent: IInterpreterRenderHandlers['event']; interval: string; seriesList: Sheet; - renderComplete(): void; + renderComplete: IInterpreterRenderHandlers['done']; } interface Position { @@ -75,11 +78,16 @@ const DEBOUNCE_DELAY = 50; // ensure legend is the same height with or without a caption so legend items do not move around const emptyCaption = '
'; -function Panel({ interval, seriesList, renderComplete, applyFilter }: PanelProps) { +function TimelionVisComponent({ + interval, + seriesList, + renderComplete, + fireEvent, +}: TimelionVisComponentProps) { const kibana = useKibana(); const [chart, setChart] = useState(() => cloneDeep(seriesList.list)); const [canvasElem, setCanvasElem] = useState(); - const [chartElem, setChartElem] = useState(); + const [chartElem, setChartElem] = useState(null); const [originalColorMap, setOriginalColorMap] = useState(() => new Map()); @@ -191,7 +199,7 @@ function Panel({ interval, seriesList, renderComplete, applyFilter }: PanelProps interval, kibana.services.timefilter, kibana.services.uiSettings, - chartElem && chartElem.clientWidth, + chartElem?.clientWidth, grid ); const updatedSeries = buildSeriesData(chartValue, options); @@ -216,12 +224,14 @@ function Panel({ interval, seriesList, renderComplete, applyFilter }: PanelProps updateCaption(newPlot.getData()); } }, - [canvasElem, chartElem, renderComplete, kibana.services, interval, updateCaption] + [canvasElem, chartElem?.clientWidth, renderComplete, kibana.services, interval, updateCaption] ); + const dimensions = useResizeObserver(chartElem); + useEffect(() => { updatePlot(chart, seriesList.render && seriesList.render.grid); - }, [chart, updatePlot, seriesList.render]); + }, [chart, updatePlot, seriesList.render, dimensions]); useEffect(() => { const colorsSet: Array<[Series, string]> = []; @@ -349,21 +359,24 @@ function Panel({ interval, seriesList, renderComplete, applyFilter }: PanelProps const plotSelectedHandler = useCallback( (event: JQuery.TriggeredEvent, ranges: Ranges) => { - applyFilter({ - timeFieldName: '*', - filters: [ - { - range: { - '*': { - gte: ranges.xaxis.from, - lte: ranges.xaxis.to, + fireEvent({ + name: 'applyFilter', + data: { + timeFieldName: '*', + filters: [ + { + range: { + '*': { + gte: ranges.xaxis.from, + lte: ranges.xaxis.to, + }, }, }, - }, - ], + ], + }, }); }, - [applyFilter] + [fireEvent] ); useEffect(() => { @@ -396,4 +409,6 @@ function Panel({ interval, seriesList, renderComplete, applyFilter }: PanelProps ); } -export { Panel }; +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { TimelionVisComponent as default }; diff --git a/src/plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts b/src/plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts index 3442f84599fb8..975d12a152d89 100644 --- a/src/plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts +++ b/src/plugins/vis_type_timelion/public/helpers/timelion_request_handler.ts @@ -19,10 +19,10 @@ import { i18n } from '@kbn/i18n'; import { KIBANA_CONTEXT_NAME } from 'src/plugins/expressions/public'; -import { VisParams } from '../../../visualizations/public'; import { TimeRange, Filter, esQuery, Query } from '../../../data/public'; import { TimelionVisDependencies } from '../plugin'; import { getTimezone } from './get_timezone'; +import { TimelionVisParams } from '../timelion_vis_fn'; interface Stats { cacheCount: number; @@ -77,7 +77,7 @@ export function getTimelionRequestHandler({ timeRange: TimeRange; filters: Filter[]; query: Query; - visParams: VisParams; + visParams: TimelionVisParams; }): Promise { const expression = visParams.expression; diff --git a/src/plugins/vis_type_timelion/public/index.scss b/src/plugins/vis_type_timelion/public/index.scss deleted file mode 100644 index 00e9a88520961..0000000000000 --- a/src/plugins/vis_type_timelion/public/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import './timelion_vis'; -@import './timelion_editor'; -@import './components/index'; diff --git a/src/plugins/vis_type_timelion/public/plugin.ts b/src/plugins/vis_type_timelion/public/plugin.ts index e2c7efec34c7f..bb8fb6b298a07 100644 --- a/src/plugins/vis_type_timelion/public/plugin.ts +++ b/src/plugins/vis_type_timelion/public/plugin.ts @@ -39,8 +39,8 @@ import { getTimelionVisDefinition } from './timelion_vis_type'; import { setIndexPatterns, setSavedObjectsClient } from './helpers/plugin_services'; import { ConfigSchema } from '../config'; -import './index.scss'; import { getArgValueSuggestions } from './helpers/arg_value_suggestions'; +import { getTimelionVisRenderer } from './timelion_vis_renderer'; /** @internal */ export interface TimelionVisDependencies extends Partial { @@ -93,7 +93,8 @@ export class TimelionVisPlugin }; expressions.registerFunction(() => getTimelionVisualizationConfig(dependencies)); - visualizations.createReactVisualization(getTimelionVisDefinition(dependencies)); + expressions.registerRenderer(getTimelionVisRenderer(dependencies)); + visualizations.createBaseVisualization(getTimelionVisDefinition(dependencies)); return { isUiEnabled: this.initializerContext.config.get().ui.enabled, diff --git a/src/plugins/vis_type_timelion/public/timelion_options.tsx b/src/plugins/vis_type_timelion/public/timelion_options.tsx index dfe017d3a273f..1ef8088c7a714 100644 --- a/src/plugins/vis_type_timelion/public/timelion_options.tsx +++ b/src/plugins/vis_type_timelion/public/timelion_options.tsx @@ -21,30 +21,45 @@ import React, { useCallback } from 'react'; import { EuiPanel } from '@elastic/eui'; import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; -import { VisParams } from './timelion_vis_fn'; +import { KibanaContextProvider } from '../../kibana_react/public'; + +import { TimelionVisParams } from './timelion_vis_fn'; import { TimelionInterval, TimelionExpressionInput } from './components'; +import { TimelionVisDependencies } from './plugin'; -export type TimelionOptionsProps = VisOptionsProps; +export type TimelionOptionsProps = VisOptionsProps; -function TimelionOptions({ stateParams, setValue, setValidity }: TimelionOptionsProps) { - const setInterval = useCallback((value: VisParams['interval']) => setValue('interval', value), [ - setValue, - ]); +function TimelionOptions({ + services, + stateParams, + setValue, + setValidity, +}: TimelionOptionsProps & { + services: TimelionVisDependencies; +}) { + const setInterval = useCallback( + (value: TimelionVisParams['interval']) => setValue('interval', value), + [setValue] + ); const setExpressionInput = useCallback( - (value: VisParams['expression']) => setValue('expression', value), + (value: TimelionVisParams['expression']) => setValue('expression', value), [setValue] ); return ( - - - - + + + + + + ); } -export { TimelionOptions }; +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { TimelionOptions as default }; diff --git a/src/plugins/vis_type_timelion/public/timelion_vis_fn.ts b/src/plugins/vis_type_timelion/public/timelion_vis_fn.ts index d3c6ca5d90371..a0cd410e197ff 100644 --- a/src/plugins/vis_type_timelion/public/timelion_vis_fn.ts +++ b/src/plugins/vis_type_timelion/public/timelion_vis_fn.ts @@ -24,29 +24,39 @@ import { KibanaContext, Render, } from 'src/plugins/expressions/public'; -import { getTimelionRequestHandler } from './helpers/timelion_request_handler'; +import { + getTimelionRequestHandler, + TimelionSuccessResponse, +} from './helpers/timelion_request_handler'; import { TIMELION_VIS_NAME } from './timelion_vis_type'; import { TimelionVisDependencies } from './plugin'; import { Filter, Query, TimeRange } from '../../data/common'; type Input = KibanaContext | null; -type Output = Promise>; +type Output = Promise>; interface Arguments { expression: string; interval: string; } -interface RenderValue { - visData: Input; +export interface TimelionRenderValue { + visData: TimelionSuccessResponse; visType: 'timelion'; - visParams: VisParams; + visParams: TimelionVisParams; } -export type VisParams = Arguments; +export type TimelionVisParams = Arguments; + +export type TimelionExpressionFunctionDefinition = ExpressionFunctionDefinition< + 'timelion_vis', + Input, + Arguments, + Output +>; export const getTimelionVisualizationConfig = ( dependencies: TimelionVisDependencies -): ExpressionFunctionDefinition<'timelion_vis', Input, Arguments, Output> => ({ +): TimelionExpressionFunctionDefinition => ({ name: 'timelion_vis', type: 'render', inputTypes: ['kibana_context', 'null'], @@ -82,7 +92,7 @@ export const getTimelionVisualizationConfig = ( return { type: 'render', - as: 'visualization', + as: 'timelion_vis', value: { visParams, visType: TIMELION_VIS_NAME, diff --git a/src/plugins/vis_type_timelion/public/timelion_vis_renderer.tsx b/src/plugins/vis_type_timelion/public/timelion_vis_renderer.tsx new file mode 100644 index 0000000000000..13a279138a8e4 --- /dev/null +++ b/src/plugins/vis_type_timelion/public/timelion_vis_renderer.tsx @@ -0,0 +1,65 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { lazy } from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; + +import { ExpressionRenderDefinition } from 'src/plugins/expressions'; +import { KibanaContextProvider } from '../../kibana_react/public'; +import { VisualizationContainer } from '../../visualizations/public'; +import { TimelionVisDependencies } from './plugin'; +import { TimelionRenderValue } from './timelion_vis_fn'; +// @ts-ignore +const TimelionVisComponent = lazy(() => import('./components/timelion_vis_component')); + +export const getTimelionVisRenderer: ( + deps: TimelionVisDependencies +) => ExpressionRenderDefinition = (deps) => ({ + name: 'timelion_vis', + displayName: 'Timelion visualization', + reuseDomNode: true, + render: (domNode, { visData, visParams }, handlers) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); + + const [seriesList] = visData.sheet; + const showNoResult = !seriesList || !seriesList.list.length; + + if (showNoResult) { + // send the render complete event when there is no data to show + // to notify that a chart is updated + handlers.done(); + } + + render( + + + + + , + domNode + ); + }, +}); diff --git a/src/plugins/vis_type_timelion/public/timelion_vis_type.tsx b/src/plugins/vis_type_timelion/public/timelion_vis_type.tsx index 8fdde175708e0..a5425478e46ac 100644 --- a/src/plugins/vis_type_timelion/public/timelion_vis_type.tsx +++ b/src/plugins/vis_type_timelion/public/timelion_vis_type.tsx @@ -17,18 +17,19 @@ * under the License. */ -import React from 'react'; +import React, { lazy } from 'react'; import { i18n } from '@kbn/i18n'; -import { KibanaContextProvider } from '../../kibana_react/public'; import { DefaultEditorSize } from '../../vis_default_editor/public'; import { getTimelionRequestHandler } from './helpers/timelion_request_handler'; -import { TimelionVisComponent, TimelionVisComponentProp } from './components'; -import { TimelionOptions, TimelionOptionsProps } from './timelion_options'; +import { TimelionOptionsProps } from './timelion_options'; import { TimelionVisDependencies } from './plugin'; +import { toExpressionAst } from './to_ast'; import { VIS_EVENT_TO_TRIGGER } from '../../visualizations/public'; +const TimelionOptions = lazy(() => import('./timelion_options')); + export const TIMELION_VIS_NAME = 'timelion'; export function getTimelionVisDefinition(dependencies: TimelionVisDependencies) { @@ -48,21 +49,15 @@ export function getTimelionVisDefinition(dependencies: TimelionVisDependencies) expression: '.es(*)', interval: 'auto', }, - component: (props: TimelionVisComponentProp) => ( - - - - ), }, editorConfig: { optionsTemplate: (props: TimelionOptionsProps) => ( - - - + ), defaultSize: DefaultEditorSize.MEDIUM, }, requestHandler: timelionRequestHandler, + toExpressionAst, responseHandler: 'none', inspectorAdapters: {}, getSupportedTriggers: () => { diff --git a/src/plugins/vis_type_timelion/public/components/chart.tsx b/src/plugins/vis_type_timelion/public/to_ast.test.ts similarity index 60% rename from src/plugins/vis_type_timelion/public/components/chart.tsx rename to src/plugins/vis_type_timelion/public/to_ast.test.ts index 15a376d4e9638..8a9d4b83f94d2 100644 --- a/src/plugins/vis_type_timelion/public/components/chart.tsx +++ b/src/plugins/vis_type_timelion/public/to_ast.test.ts @@ -17,25 +17,24 @@ * under the License. */ -import React from 'react'; +import { Vis } from 'src/plugins/visualizations/public'; +import { TimelionVisParams } from './timelion_vis_fn'; +import { toExpressionAst } from './to_ast'; -import { Sheet } from '../helpers/timelion_request_handler'; -import { Panel } from './panel'; -import { ExprVisAPIEvents } from '../../../visualizations/public'; +describe('timelion vis toExpressionAst function', () => { + let vis: Vis; -interface ChartComponentProp { - applyFilter: ExprVisAPIEvents['applyFilter']; - interval: string; - renderComplete(): void; - seriesList: Sheet; -} + beforeEach(() => { + vis = { + params: { + expression: '.es(*)', + interval: 'auto', + }, + } as any; + }); -function ChartComponent(props: ChartComponentProp) { - if (!props.seriesList) { - return null; - } - - return ; -} - -export { ChartComponent }; + it('should match basic snapshot', () => { + const actual = toExpressionAst(vis); + expect(actual).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/vis_type_timelion/public/to_ast.ts b/src/plugins/vis_type_timelion/public/to_ast.ts new file mode 100644 index 0000000000000..7044bbf4e5831 --- /dev/null +++ b/src/plugins/vis_type_timelion/public/to_ast.ts @@ -0,0 +1,37 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { buildExpression, buildExpressionFunction } from '../../expressions/public'; +import { Vis } from '../../visualizations/public'; +import { TimelionExpressionFunctionDefinition, TimelionVisParams } from './timelion_vis_fn'; + +const escapeString = (data: string): string => { + return data.replace(/\\/g, `\\\\`).replace(/'/g, `\\'`); +}; + +export const toExpressionAst = (vis: Vis) => { + const timelion = buildExpressionFunction('timelion_vis', { + expression: escapeString(vis.params.expression), + interval: escapeString(vis.params.interval), + }); + + const ast = buildExpression([timelion]); + + return ast.toAst(); +}; diff --git a/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap index 654ac78cdaa02..c0c37e2262f9c 100644 --- a/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap +++ b/src/plugins/visualizations/public/legacy/__snapshots__/build_pipeline.test.ts.snap @@ -24,6 +24,4 @@ exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunct exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles tile_map function 1`] = `"tilemap visConfig='{\\"metric\\":{},\\"dimensions\\":{\\"metric\\":{\\"accessor\\":0,\\"label\\":\\"\\",\\"format\\":{},\\"params\\":{},\\"aggType\\":\\"\\"},\\"geohash\\":1,\\"geocentroid\\":3}}' "`; -exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles timelion function 1`] = `"timelion_vis expression='foo' interval='bar' "`; - exports[`visualize loader pipeline helpers: build pipeline buildPipelineVisFunction handles vega function 1`] = `"vega spec='this is a test' "`; diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.test.ts b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts index 8cac76726b13b..a1fea45f51781 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.test.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.test.ts @@ -117,12 +117,6 @@ describe('visualize loader pipeline helpers: build pipeline', () => { expect(actual).toMatchSnapshot(); }); - it('handles timelion function', () => { - const params = { expression: 'foo', interval: 'bar' }; - const actual = buildPipelineVisFunction.timelion(params, schemasDef, uiState); - expect(actual).toMatchSnapshot(); - }); - describe('handles table function', () => { it('without splits or buckets', () => { const params = { foo: 'bar' }; diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index dcc384a191858..79e1c1cca2155 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -263,11 +263,6 @@ export const buildPipelineVisFunction: BuildPipelineVisFunction = { const paramsArray = [paramsJson, uiStateJson].filter((param) => Boolean(param)); return `tsvb ${paramsArray.join(' ')}`; }, - timelion: (params) => { - const expression = prepareString('expression', params.expression); - const interval = prepareString('interval', params.interval); - return `timelion_vis ${expression}${interval}`; - }, table: (params, schemas) => { const visConfig = { ...params, From 21353403b8bc84bf84971c5b92fb2fcaa09b2f59 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Thu, 1 Oct 2020 15:16:17 +0100 Subject: [PATCH 38/64] [ML] Improve calendar ics file parsing (#78986) --- .../settings/calendars/edit/import_modal/utils.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/import_modal/utils.js b/x-pack/plugins/ml/public/application/settings/calendars/edit/import_modal/utils.js index 07bf49ea6d7db..e93abc8eb67b5 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/import_modal/utils.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/import_modal/utils.js @@ -42,7 +42,10 @@ export function filterEvents(events) { } export function parseICSFile(data) { - const cal = icalendar.parse_calendar(data); + // force a new line char on the end of the data + // icalendar must split on new lines and so parsing fails + // if there isn't at least one new line at the end. + const cal = icalendar.parse_calendar(data + '\n'); return createEvents(cal); } From bad59f4fb4cc1c2c2420b6f81cc1fde18ae44721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 1 Oct 2020 15:16:49 +0100 Subject: [PATCH 39/64] [Usage Collection] [schema] `maps` (#78952) --- x-pack/.telemetryrc.json | 3 +- .../maps_telemetry/collectors/register.ts | 34 ++++++- .../collectors/register_collector.test.js | 1 + .../server/maps_telemetry/maps_telemetry.ts | 82 ++++++++++------ .../schema/xpack_plugins.json | 93 +++++++++++++++++++ 5 files changed, 180 insertions(+), 33 deletions(-) diff --git a/x-pack/.telemetryrc.json b/x-pack/.telemetryrc.json index d0e56bbed9f47..c7430666c538f 100644 --- a/x-pack/.telemetryrc.json +++ b/x-pack/.telemetryrc.json @@ -4,7 +4,6 @@ "exclude": [ "plugins/actions/server/usage/actions_usage_collector.ts", "plugins/alerts/server/usage/alerts_usage_collector.ts", - "plugins/apm/server/lib/apm_telemetry/index.ts", - "plugins/maps/server/maps_telemetry/collectors/register.ts" + "plugins/apm/server/lib/apm_telemetry/index.ts" ] } diff --git a/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts b/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts index f54776f5ab629..e0ab2cf77f084 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts @@ -5,7 +5,7 @@ */ import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; -import { getMapsTelemetry } from '../maps_telemetry'; +import { getMapsTelemetry, MapsUsage } from '../maps_telemetry'; import { MapsConfigType } from '../../../config'; export function registerMapsUsageCollector( @@ -16,10 +16,40 @@ export function registerMapsUsageCollector( return; } - const mapsUsageCollector = usageCollection.makeUsageCollector({ + const mapsUsageCollector = usageCollection.makeUsageCollector({ type: 'maps', isReady: () => true, fetch: async () => await getMapsTelemetry(config), + schema: { + settings: { + showMapVisualizationTypes: { type: 'boolean' }, + }, + indexPatternsWithGeoFieldCount: { type: 'long' }, + indexPatternsWithGeoPointFieldCount: { type: 'long' }, + indexPatternsWithGeoShapeFieldCount: { type: 'long' }, + geoShapeAggLayersCount: { type: 'long' }, + mapsTotalCount: { type: 'long' }, + timeCaptured: { type: 'date' }, + attributesPerMap: { + dataSourcesCount: { + min: { type: 'long' }, + max: { type: 'long' }, + avg: { type: 'float' }, + }, + layersCount: { + min: { type: 'long' }, + max: { type: 'long' }, + avg: { type: 'float' }, + }, + // TODO: Find out all the possible values for DYNAMIC_KEY or reformat into an array + layerTypesCount: { + DYNAMIC_KEY: { min: { type: 'long' }, max: { type: 'long' }, avg: { type: 'float' } }, + }, + emsVectorLayersCount: { + DYNAMIC_KEY: { min: { type: 'long' }, max: { type: 'long' }, avg: { type: 'float' } }, + }, + }, + }, }); usageCollection.registerCollector(mapsUsageCollector); diff --git a/x-pack/plugins/maps/server/maps_telemetry/collectors/register_collector.test.js b/x-pack/plugins/maps/server/maps_telemetry/collectors/register_collector.test.js index 33eb33100acdf..61f4629b00712 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/collectors/register_collector.test.js +++ b/x-pack/plugins/maps/server/maps_telemetry/collectors/register_collector.test.js @@ -33,6 +33,7 @@ describe('buildCollectorObj#fetch', () => { type: expect.any(String), isReady: expect.any(Function), fetch: expect.any(Function), + schema: expect.any(Object), }); }); }); diff --git a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts index 2af6413da039b..56ccc7baea283 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts @@ -5,12 +5,7 @@ */ import _ from 'lodash'; -import { - SavedObject, - SavedObjectAttribute, - SavedObjectAttributes, - SavedObjectsClientContract, -} from 'kibana/server'; +import { ISavedObjectsRepository, SavedObject, SavedObjectsClientContract } from 'kibana/server'; import { IFieldType, IndexPatternAttributes } from 'src/plugins/data/public'; import { ES_GEO_FIELD_TYPE, @@ -25,11 +20,14 @@ import { ESSearchSourceDescriptor, LayerDescriptor, } from '../../common/descriptor_types'; -import { MapSavedObject } from '../../common/map_saved_object_type'; -// @ts-ignore +import { MapSavedObject, MapSavedObjectAttributes } from '../../common/map_saved_object_type'; import { getInternalRepository } from '../kibana_server_services'; import { MapsConfigType } from '../../config'; +interface Settings { + showMapVisualizationTypes: boolean; +} + interface IStats { [key: string]: { min: number; @@ -42,6 +40,30 @@ interface ILayerTypeCount { [key: string]: number; } +export interface MapsUsage { + settings: Settings; + indexPatternsWithGeoFieldCount: number; + indexPatternsWithGeoPointFieldCount: number; + indexPatternsWithGeoShapeFieldCount: number; + geoShapeAggLayersCount: number; + mapsTotalCount: number; + timeCaptured: string; + attributesPerMap: { + dataSourcesCount: { + min: number; + max: number; + avg: number; + }; + layersCount: { + min: number; + max: number; + avg: number; + }; + layerTypesCount: IStats; + emsVectorLayersCount: IStats; + }; +} + function getUniqueLayerCounts(layerCountsList: ILayerTypeCount[], mapsCount: number) { const uniqueLayerTypes = _.uniq(_.flatten(layerCountsList.map((lTypes) => Object.keys(lTypes)))); @@ -213,8 +235,8 @@ export function buildMapsTelemetry({ }: { mapSavedObjects: MapSavedObject[]; indexPatternSavedObjects: Array>; - settings: SavedObjectAttribute; -}): SavedObjectAttributes { + settings: Settings; +}): MapsUsage { const layerLists: LayerDescriptor[][] = getLayerLists(mapSavedObjects); const mapsCount = layerLists.length; @@ -256,14 +278,14 @@ export function buildMapsTelemetry({ attributesPerMap: { // Count of data sources per map dataSourcesCount: { - min: dataSourcesCount.length ? _.min(dataSourcesCount) : 0, - max: dataSourcesCount.length ? _.max(dataSourcesCount) : 0, + min: dataSourcesCount.length ? _.min(dataSourcesCount)! : 0, + max: dataSourcesCount.length ? _.max(dataSourcesCount)! : 0, avg: dataSourcesCountSum ? layersCountSum / mapsCount : 0, }, // Total count of layers per map layersCount: { - min: layersCount.length ? _.min(layersCount) : 0, - max: layersCount.length ? _.max(layersCount) : 0, + min: layersCount.length ? _.min(layersCount)! : 0, + max: layersCount.length ? _.max(layersCount)! : 0, avg: layersCountSum ? layersCountSum / mapsCount : 0, }, // Count of layers by type @@ -277,27 +299,29 @@ export function buildMapsTelemetry({ }, }; } -async function getMapSavedObjects(savedObjectsClient: SavedObjectsClientContract) { - const mapsSavedObjects = await savedObjectsClient.find({ type: MAP_SAVED_OBJECT_TYPE }); - return _.get(mapsSavedObjects, 'saved_objects', []); +async function getMapSavedObjects( + savedObjectsClient: SavedObjectsClientContract | ISavedObjectsRepository +) { + const mapsSavedObjects = await savedObjectsClient.find({ + type: MAP_SAVED_OBJECT_TYPE, + }); + return mapsSavedObjects.saved_objects; } -async function getIndexPatternSavedObjects(savedObjectsClient: SavedObjectsClientContract) { - const indexPatternSavedObjects = await savedObjectsClient.find({ type: 'index-pattern' }); - return _.get(indexPatternSavedObjects, 'saved_objects', []); +async function getIndexPatternSavedObjects( + savedObjectsClient: SavedObjectsClientContract | ISavedObjectsRepository +) { + const indexPatternSavedObjects = await savedObjectsClient.find({ + type: 'index-pattern', + }); + return indexPatternSavedObjects.saved_objects; } export async function getMapsTelemetry(config: MapsConfigType) { const savedObjectsClient = getInternalRepository(); - // @ts-ignore - const mapSavedObjects: MapSavedObject[] = await getMapSavedObjects(savedObjectsClient); - const indexPatternSavedObjects: Array> = (await getIndexPatternSavedObjects( - // @ts-ignore - savedObjectsClient - )) as Array>; - const settings: SavedObjectAttribute = { + const mapSavedObjects = await getMapSavedObjects(savedObjectsClient); + const indexPatternSavedObjects = await getIndexPatternSavedObjects(savedObjectsClient); + const settings = { showMapVisualizationTypes: config.showMapVisualizationTypes, }; return buildMapsTelemetry({ mapSavedObjects, indexPatternSavedObjects, settings }); diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 816d6828381ee..b08585066f100 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -679,6 +679,99 @@ } } }, + "maps": { + "properties": { + "settings": { + "properties": { + "showMapVisualizationTypes": { + "type": "boolean" + } + } + }, + "indexPatternsWithGeoFieldCount": { + "type": "long" + }, + "indexPatternsWithGeoPointFieldCount": { + "type": "long" + }, + "indexPatternsWithGeoShapeFieldCount": { + "type": "long" + }, + "geoShapeAggLayersCount": { + "type": "long" + }, + "mapsTotalCount": { + "type": "long" + }, + "timeCaptured": { + "type": "date" + }, + "attributesPerMap": { + "properties": { + "dataSourcesCount": { + "properties": { + "min": { + "type": "long" + }, + "max": { + "type": "long" + }, + "avg": { + "type": "float" + } + } + }, + "layersCount": { + "properties": { + "min": { + "type": "long" + }, + "max": { + "type": "long" + }, + "avg": { + "type": "float" + } + } + }, + "layerTypesCount": { + "properties": { + "DYNAMIC_KEY": { + "properties": { + "min": { + "type": "long" + }, + "max": { + "type": "long" + }, + "avg": { + "type": "float" + } + } + } + } + }, + "emsVectorLayersCount": { + "properties": { + "DYNAMIC_KEY": { + "properties": { + "min": { + "type": "long" + }, + "max": { + "type": "long" + }, + "avg": { + "type": "float" + } + } + } + } + } + } + } + } + }, "mlTelemetry": { "properties": { "file_data_visualizer": { From 31efa1ab5b4d68b681a6342708a39b2359c589e8 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Thu, 1 Oct 2020 09:39:17 -0500 Subject: [PATCH 40/64] [ML] Add feature importance summary charts (#78238) Co-authored-by: Elastic Machine --- .../ml/common/types/feature_importance.ts | 39 +++ x-pack/plugins/ml/common/types/inference.ts | 2 + .../decision_path_chart.tsx | 12 +- .../decision_path_classification.tsx | 1 + .../common/use_results_view_config.ts | 37 +++ .../classification_exploration.tsx | 3 +- .../exploration_page_wrapper.tsx | 12 + .../regression_exploration.tsx | 2 + .../feature_importance_summary.tsx | 264 ++++++++++++++++++ .../services/ml_api_service/inference.ts | 1 + .../server/routes/schemas/inference_schema.ts | 1 + 11 files changed, 370 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx diff --git a/x-pack/plugins/ml/common/types/feature_importance.ts b/x-pack/plugins/ml/common/types/feature_importance.ts index d2ab9f6c58608..4f5619cf3ab7b 100644 --- a/x-pack/plugins/ml/common/types/feature_importance.ts +++ b/x-pack/plugins/ml/common/types/feature_importance.ts @@ -21,3 +21,42 @@ export interface TopClass { } export type TopClasses = TopClass[]; + +export interface ClassFeatureImportanceSummary { + class_name: string; + importance: { + max: number; + min: number; + mean_magnitude: number; + }; +} +export interface ClassificationTotalFeatureImportance { + feature_name: string; + classes: ClassFeatureImportanceSummary[]; +} + +export interface RegressionFeatureImportanceSummary { + max: number; + min: number; + mean_magnitude: number; +} + +export interface RegressionTotalFeatureImportance { + feature_name: string; + importance: RegressionFeatureImportanceSummary; +} +export type TotalFeatureImportance = + | ClassificationTotalFeatureImportance + | RegressionTotalFeatureImportance; + +export function isClassificationTotalFeatureImportance( + summary: ClassificationTotalFeatureImportance | RegressionTotalFeatureImportance +): summary is ClassificationTotalFeatureImportance { + return (summary as ClassificationTotalFeatureImportance).classes !== undefined; +} + +export function isRegressionTotalFeatureImportance( + summary: ClassificationTotalFeatureImportance | RegressionTotalFeatureImportance +): summary is RegressionTotalFeatureImportance { + return (summary as RegressionTotalFeatureImportance).importance !== undefined; +} diff --git a/x-pack/plugins/ml/common/types/inference.ts b/x-pack/plugins/ml/common/types/inference.ts index c70ee264e6fc8..ce2cfb1f78fd9 100644 --- a/x-pack/plugins/ml/common/types/inference.ts +++ b/x-pack/plugins/ml/common/types/inference.ts @@ -5,6 +5,7 @@ */ import { DataFrameAnalyticsConfig } from './data_frame_analytics'; +import { TotalFeatureImportance } from './feature_importance'; export interface IngestStats { count: number; @@ -54,6 +55,7 @@ export interface ModelConfigResponse { | { analytics_config: DataFrameAnalyticsConfig; input: any; + total_feature_importance?: TotalFeatureImportance[]; } | Record; model_id: string; diff --git a/x-pack/plugins/ml/public/application/components/data_grid/feature_importance/decision_path_chart.tsx b/x-pack/plugins/ml/public/application/components/data_grid/feature_importance/decision_path_chart.tsx index b546ac1db57dd..e3ab0abc18e71 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/feature_importance/decision_path_chart.tsx +++ b/x-pack/plugins/ml/public/application/components/data_grid/feature_importance/decision_path_chart.tsx @@ -74,6 +74,7 @@ interface DecisionPathChartProps { baseline?: number; minDomain: number | undefined; maxDomain: number | undefined; + showValues?: boolean; } const DECISION_PATH_MARGIN = 125; @@ -87,6 +88,7 @@ export const DecisionPathChart = ({ minDomain, maxDomain, baseline, + showValues, }: DecisionPathChartProps) => { // adjust the height so it's compact for items with more features const baselineData: LineAnnotationDatum[] = useMemo( @@ -105,9 +107,12 @@ export const DecisionPathChart = ({ ], [baseline] ); - // guarantee up to num_precision significant digits - // without having it in scientific notation - const tickFormatter = useCallback((d) => Number(d.toPrecision(NUM_PRECISION)).toString(), []); + // if regression, guarantee up to num_precision significant digits without having it in scientific notation + // if classification, hide the numeric values since we only want to show the path + const tickFormatter = useCallback( + (d) => (showValues === false ? '' : Number(d.toPrecision(NUM_PRECISION)).toString()), + [] + ); return ( = ( predictionFieldName={predictionFieldName} minDomain={domain.minDomain} maxDomain={domain.maxDomain} + showValues={false} /> ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts index b0e73edff7476..82f431c50fb66 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts @@ -19,9 +19,18 @@ import { DataFrameAnalyticsConfig } from '../common'; import { isGetDataFrameAnalyticsStatsResponseOk } from '../pages/analytics_management/services/analytics_service/get_analytics'; import { DATA_FRAME_TASK_STATE } from '../pages/analytics_management/components/analytics_list/common'; +import { useInferenceApiService } from '../../services/ml_api_service/inference'; +import { TotalFeatureImportance } from '../../../../common/types/feature_importance'; +import { getToastNotificationService } from '../../services/toast_notification_service'; +import { + isClassificationAnalysis, + isRegressionAnalysis, +} from '../../../../common/util/analytics_utils'; export const useResultsViewConfig = (jobId: string) => { const mlContext = useMlContext(); + const inferenceApiService = useInferenceApiService(); + const [indexPattern, setIndexPattern] = useState(undefined); const [isInitialized, setIsInitialized] = useState(false); const [needsDestIndexPattern, setNeedsDestIndexPattern] = useState(false); @@ -33,6 +42,10 @@ export const useResultsViewConfig = (jobId: string) => { const [jobConfigErrorMessage, setJobConfigErrorMessage] = useState(undefined); const [jobStatus, setJobStatus] = useState(undefined); + const [totalFeatureImportance, setTotalFeatureImportance] = useState< + TotalFeatureImportance[] | undefined + >(undefined); + // get analytics configuration, index pattern and field caps useEffect(() => { (async function () { @@ -40,6 +53,7 @@ export const useResultsViewConfig = (jobId: string) => { try { const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); + const analyticsStats = await ml.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); const stats = isGetDataFrameAnalyticsStatsResponseOk(analyticsStats) ? analyticsStats.data_frame_analytics[0] @@ -54,6 +68,28 @@ export const useResultsViewConfig = (jobId: string) => { analyticsConfigs.data_frame_analytics.length > 0 ) { const jobConfigUpdate = analyticsConfigs.data_frame_analytics[0]; + // don't fetch the total feature importance if it's outlier_detection + if ( + isClassificationAnalysis(jobConfigUpdate.analysis) || + isRegressionAnalysis(jobConfigUpdate.analysis) + ) { + try { + const inferenceModels = await inferenceApiService.getInferenceModel(`${jobId}*`, { + include: 'total_feature_importance', + }); + const inferenceModel = inferenceModels.find( + (model) => model.metadata?.analytics_config?.id === jobId + ); + if ( + Array.isArray(inferenceModel?.metadata?.total_feature_importance) === true && + inferenceModel?.metadata?.total_feature_importance.length > 0 + ) { + setTotalFeatureImportance(inferenceModel?.metadata?.total_feature_importance); + } + } catch (e) { + getToastNotificationService().displayErrorToast(e); + } + } try { const destIndex = Array.isArray(jobConfigUpdate.dest.index) @@ -103,5 +139,6 @@ export const useResultsViewConfig = (jobId: string) => { jobConfigErrorMessage, jobStatus, needsDestIndexPattern, + totalFeatureImportance, }; }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx index 28ef3898cde97..833b4a78178d4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { ExplorationPageWrapper } from '../exploration_page_wrapper'; import { EvaluatePanel } from './evaluate_panel'; - +import { FeatureImportanceSummaryPanel } from '../total_feature_importance_summary/feature_importance_summary'; interface Props { jobId: string; defaultIsTraining?: boolean; @@ -27,6 +27,7 @@ export const ClassificationExploration: FC = ({ jobId, defaultIsTraining } )} EvaluatePanel={EvaluatePanel} + FeatureImportanceSummaryPanel={FeatureImportanceSummaryPanel} defaultIsTraining={defaultIsTraining} /> ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx index f3fc65d264e62..6b1b3fc1bb47f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx @@ -16,6 +16,7 @@ import { DATA_FRAME_TASK_STATE } from '../../../analytics_management/components/ import { ExplorationResultsTable } from '../exploration_results_table'; import { JobConfigErrorCallout } from '../job_config_error_callout'; import { LoadingPanel } from '../loading_panel'; +import { FeatureImportanceSummaryPanelProps } from '../total_feature_importance_summary/feature_importance_summary'; export interface EvaluatePanelProps { jobConfig: DataFrameAnalyticsConfig; @@ -27,6 +28,7 @@ interface Props { jobId: string; title: string; EvaluatePanel: FC; + FeatureImportanceSummaryPanel: FC; defaultIsTraining?: boolean; } @@ -34,6 +36,7 @@ export const ExplorationPageWrapper: FC = ({ jobId, title, EvaluatePanel, + FeatureImportanceSummaryPanel, defaultIsTraining, }) => { const { @@ -45,6 +48,7 @@ export const ExplorationPageWrapper: FC = ({ jobConfigErrorMessage, jobStatus, needsDestIndexPattern, + totalFeatureImportance, } = useResultsViewConfig(jobId); const [searchQuery, setSearchQuery] = useState(defaultSearchQuery); @@ -63,6 +67,14 @@ export const ExplorationPageWrapper: FC = ({ {isLoadingJobConfig === false && jobConfig !== undefined && isInitialized === true && ( )} + {isLoadingJobConfig === true && totalFeatureImportance === undefined && } + {isLoadingJobConfig === false && totalFeatureImportance !== undefined && ( + <> + + + + )} + {isLoadingJobConfig === true && jobConfig === undefined && } {isLoadingJobConfig === false && diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/regression_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/regression_exploration.tsx index 40279ecc6ffa4..6118207c83fcb 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/regression_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/regression_exploration.tsx @@ -11,6 +11,7 @@ import { i18n } from '@kbn/i18n'; import { ExplorationPageWrapper } from '../exploration_page_wrapper'; import { EvaluatePanel } from './evaluate_panel'; +import { FeatureImportanceSummaryPanel } from '../total_feature_importance_summary/feature_importance_summary'; interface Props { jobId: string; @@ -25,6 +26,7 @@ export const RegressionExploration: FC = ({ jobId, defaultIsTraining }) = values: { jobId }, })} EvaluatePanel={EvaluatePanel} + FeatureImportanceSummaryPanel={FeatureImportanceSummaryPanel} defaultIsTraining={defaultIsTraining} /> ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx new file mode 100644 index 0000000000000..f7ac717caef2f --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/total_feature_importance_summary/feature_importance_summary.tsx @@ -0,0 +1,264 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC, useCallback, useMemo } from 'react'; +import { + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiIconTip, + EuiPanel, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + Chart, + Settings, + Axis, + ScaleType, + Position, + BarSeries, + RecursivePartial, + AxisStyle, + PartialTheme, + BarSeriesSpec, +} from '@elastic/charts'; +import { i18n } from '@kbn/i18n'; +import euiVars from '@elastic/eui/dist/eui_theme_light.json'; +import { + TotalFeatureImportance, + isClassificationTotalFeatureImportance, + isRegressionTotalFeatureImportance, + RegressionTotalFeatureImportance, + ClassificationTotalFeatureImportance, +} from '../../../../../../../common/types/feature_importance'; + +import { useMlKibana } from '../../../../../contexts/kibana'; +const { euiColorMediumShade } = euiVars; +const axisColor = euiColorMediumShade; + +const axes: RecursivePartial = { + axisLine: { + stroke: axisColor, + }, + tickLabel: { + fontSize: 12, + fill: axisColor, + }, + tickLine: { + stroke: axisColor, + }, + gridLine: { + horizontal: { + dash: [1, 2], + }, + vertical: { + strokeWidth: 0, + }, + }, +}; +const theme: PartialTheme = { + axes, + legend: { + /** + * Added buffer between label and value. + * Smaller values render a more compact legend + */ + spacingBuffer: 100, + }, +}; + +export interface FeatureImportanceSummaryPanelProps { + totalFeatureImportance: TotalFeatureImportance[]; +} + +const tooltipContent = i18n.translate( + 'xpack.ml.dataframe.analytics.exploration.featureImportanceSummaryTooltipContent', + { + defaultMessage: + 'Total feature importance values indicate how significantly a field affects the predictions across all the training data.', + } +); + +const calculateTotalMeanImportance = (featureClass: ClassificationTotalFeatureImportance) => { + return featureClass.classes.reduce( + (runningSum, fc) => runningSum + fc.importance.mean_magnitude, + 0 + ); +}; + +export const FeatureImportanceSummaryPanel: FC = ({ + totalFeatureImportance, +}) => { + const { + services: { docLinks }, + } = useMlKibana(); + + const [plotData, barSeriesSpec, showLegend, chartHeight] = useMemo(() => { + let sortedData: Array<{ + featureName: string; + meanImportance: number; + className?: string; + }> = []; + let _barSeriesSpec: Partial = { + xAccessor: 'featureName', + yAccessors: ['meanImportance'], + name: i18n.translate( + 'xpack.ml.dataframe.analytics.exploration.featureImportanceYSeriesName', + { + defaultMessage: 'magnitude', + } + ) as string, + }; + let classificationType: + | 'binary_classification' + | 'multiclass_classification' + | 'regression' + | '' = ''; + if (totalFeatureImportance.length < 1) { + return [sortedData, _barSeriesSpec]; + } + + if (isClassificationTotalFeatureImportance(totalFeatureImportance[0])) { + // if binary classification + if (totalFeatureImportance[0].classes.length === 2) { + classificationType = 'binary_classification'; + sortedData = (totalFeatureImportance as ClassificationTotalFeatureImportance[]) + .map((d) => { + return { + featureName: d.feature_name, + // in case of binary classification, both classes will have the same mean importance + meanImportance: d.classes[0].importance.mean_magnitude, + }; + }) + .sort((a, b) => b.meanImportance - a.meanImportance); + } + + // if multiclass classification + // stack them in order of increasing importance + // so for each feature, biggest importance on the left to smallest importance on the right + if (totalFeatureImportance[0].classes.length > 2) { + classificationType = 'multiclass_classification'; + + (totalFeatureImportance as ClassificationTotalFeatureImportance[]) + .sort( + (prevFeature, currentFeature) => + calculateTotalMeanImportance(currentFeature) - + calculateTotalMeanImportance(prevFeature) + ) + .forEach((feature) => { + const sortedFeatureClass = feature.classes.sort( + (a, b) => b.importance.mean_magnitude - a.importance.mean_magnitude + ); + sortedData.push( + ...sortedFeatureClass.map((featureClass) => ({ + featureName: feature.feature_name, + meanImportance: featureClass.importance.mean_magnitude, + className: featureClass.class_name, + })) + ); + }); + + _barSeriesSpec = { + xAccessor: 'featureName', + yAccessors: ['meanImportance'], + splitSeriesAccessors: ['className'], + stackAccessors: ['featureName'], + }; + } + } + // if regression + if (isRegressionTotalFeatureImportance(totalFeatureImportance[0])) { + classificationType = 'regression'; + + sortedData = (totalFeatureImportance as RegressionTotalFeatureImportance[]) + .map((d: RegressionTotalFeatureImportance) => ({ + featureName: d.feature_name, + meanImportance: d.importance.mean_magnitude, + })) + .sort((a, b) => b.meanImportance - a.meanImportance); + } + + // only show legend if it's a multiclass + const _showLegend = classificationType === 'multiclass_classification'; + const _chartHeight = + totalFeatureImportance.length * (totalFeatureImportance.length < 5 ? 40 : 20) + 50; + return [sortedData, _barSeriesSpec, _showLegend, _chartHeight]; + }, [totalFeatureImportance]); + + const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = docLinks; + const tickFormatter = useCallback((d) => Number(d.toPrecision(3)).toString(), []); + + return ( + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/inference.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/inference.ts index 0206037b680bb..ce211612fba66 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/inference.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/inference.ts @@ -23,6 +23,7 @@ export interface InferenceQueryParams { tags?: string; // Custom kibana endpoint query params with_pipelines?: boolean; + include?: 'total_feature_importance'; } export interface InferenceStatsQueryParams { diff --git a/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts b/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts index 896449be7896a..04cc60bf5493c 100644 --- a/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts @@ -23,4 +23,5 @@ export const optionalModelIdSchema = schema.object({ export const getInferenceQuerySchema = schema.object({ size: schema.maybe(schema.string()), with_pipelines: schema.maybe(schema.string()), + include: schema.maybe(schema.string()), }); From 3599edbea93da33a3a72c84d41239f48b74156a9 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Thu, 1 Oct 2020 09:42:18 -0500 Subject: [PATCH 41/64] [Logs UI] Move alerting components to public/alerting (#79035) Co-authored-by: Elastic Machine --- .../criterion_preview_chart.tsx | 4 ++-- .../group_by_expression/group_by_expression.tsx | 0 .../common}/group_by_expression/selector.tsx | 0 .../log_threshold/components}/alert_dropdown.tsx | 2 +- .../log_threshold/components}/alert_flyout.tsx | 8 ++++---- .../components}/expression_editor/criteria.tsx | 4 ++-- .../components}/expression_editor/criterion.tsx | 4 ++-- .../criterion_preview_chart.tsx | 10 +++++----- .../components}/expression_editor/editor.tsx | 16 +++++++--------- .../hooks/use_chart_preview_data.tsx | 8 ++++---- .../components}/expression_editor/index.tsx | 0 .../components}/expression_editor/threshold.tsx | 4 ++-- .../expression_editor/type_switcher.tsx | 2 +- .../infra/public/alerting/log_threshold/index.ts | 8 ++++++++ .../log_threshold/log_threshold_alert_type.ts | 7 +++---- .../log_threshold/validation.ts | 5 ++--- .../infra/public/pages/logs/page_content.tsx | 2 +- x-pack/plugins/infra/public/plugin.ts | 2 +- .../plugins/triggers_actions_ui/public/index.ts | 2 +- 19 files changed, 46 insertions(+), 42 deletions(-) rename x-pack/plugins/infra/public/{components/alerting/shared => alerting/common}/criterion_preview_chart/criterion_preview_chart.tsx (97%) rename x-pack/plugins/infra/public/{components/alerting/shared => alerting/common}/group_by_expression/group_by_expression.tsx (100%) rename x-pack/plugins/infra/public/{components/alerting/shared => alerting/common}/group_by_expression/selector.tsx (100%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/alert_dropdown.tsx (97%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/alert_flyout.tsx (84%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/criteria.tsx (98%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/criterion.tsx (98%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/criterion_preview_chart.tsx (96%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/editor.tsx (93%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/hooks/use_chart_preview_data.tsx (90%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/index.tsx (100%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/threshold.tsx (95%) rename x-pack/plugins/infra/public/{components/alerting/logs/log_threshold => alerting/log_threshold/components}/expression_editor/type_switcher.tsx (97%) create mode 100644 x-pack/plugins/infra/public/alerting/log_threshold/index.ts rename x-pack/plugins/infra/public/{components/alerting/logs => alerting}/log_threshold/log_threshold_alert_type.ts (80%) rename x-pack/plugins/infra/public/{components/alerting/logs => alerting}/log_threshold/validation.ts (94%) diff --git a/x-pack/plugins/infra/public/components/alerting/shared/criterion_preview_chart/criterion_preview_chart.tsx b/x-pack/plugins/infra/public/alerting/common/criterion_preview_chart/criterion_preview_chart.tsx similarity index 97% rename from x-pack/plugins/infra/public/components/alerting/shared/criterion_preview_chart/criterion_preview_chart.tsx rename to x-pack/plugins/infra/public/alerting/common/criterion_preview_chart/criterion_preview_chart.tsx index 239afd93a7a1f..9003e13869e60 100644 --- a/x-pack/plugins/infra/public/components/alerting/shared/criterion_preview_chart/criterion_preview_chart.tsx +++ b/x-pack/plugins/infra/public/alerting/common/criterion_preview_chart/criterion_preview_chart.tsx @@ -11,8 +11,8 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; import { EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { formatNumber } from '../../../../../common/formatters/number'; -import { GetLogAlertsChartPreviewDataSuccessResponsePayload } from '../../../../../common/http_api'; +import { formatNumber } from '../../../../common/formatters/number'; +import { GetLogAlertsChartPreviewDataSuccessResponsePayload } from '../../../../common/http_api'; type Series = GetLogAlertsChartPreviewDataSuccessResponsePayload['data']['series']; diff --git a/x-pack/plugins/infra/public/components/alerting/shared/group_by_expression/group_by_expression.tsx b/x-pack/plugins/infra/public/alerting/common/group_by_expression/group_by_expression.tsx similarity index 100% rename from x-pack/plugins/infra/public/components/alerting/shared/group_by_expression/group_by_expression.tsx rename to x-pack/plugins/infra/public/alerting/common/group_by_expression/group_by_expression.tsx diff --git a/x-pack/plugins/infra/public/components/alerting/shared/group_by_expression/selector.tsx b/x-pack/plugins/infra/public/alerting/common/group_by_expression/selector.tsx similarity index 100% rename from x-pack/plugins/infra/public/components/alerting/shared/group_by_expression/selector.tsx rename to x-pack/plugins/infra/public/alerting/common/group_by_expression/selector.tsx diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/alert_dropdown.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_dropdown.tsx similarity index 97% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/alert_dropdown.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/alert_dropdown.tsx index 74634bbd5d290..b8eb73b99f45e 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/alert_dropdown.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_dropdown.tsx @@ -8,7 +8,7 @@ import React, { useState, useCallback, useMemo } from 'react'; import { EuiPopover, EuiButtonEmpty, EuiContextMenuItem, EuiContextMenuPanel } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { AlertFlyout } from './alert_flyout'; -import { useLinkProps } from '../../../../hooks/use_link_props'; +import { useLinkProps } from '../../../hooks/use_link_props'; export const AlertDropdown = () => { const [popoverOpen, setPopoverOpen] = useState(false); diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/alert_flyout.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx similarity index 84% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/alert_flyout.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx index c6e16dcc9aaef..cd69fe02c5846 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/alert_flyout.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/alert_flyout.tsx @@ -6,10 +6,10 @@ import React, { useContext } from 'react'; import { ApplicationStart, DocLinksStart, HttpStart, NotificationsStart } from 'src/core/public'; -import { AlertsContextProvider, AlertAdd } from '../../../../../../triggers_actions_ui/public'; -import { TriggerActionsContext } from '../../../../utils/triggers_actions_context'; -import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; -import { LOG_DOCUMENT_COUNT_ALERT_TYPE_ID } from '../../../../../common/alerting/logs/log_threshold/types'; +import { AlertsContextProvider, AlertAdd } from '../../../../../triggers_actions_ui/public'; +import { TriggerActionsContext } from '../../../utils/triggers_actions_context'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; +import { LOG_DOCUMENT_COUNT_ALERT_TYPE_ID } from '../../../../common/alerting/logs/log_threshold/types'; interface Props { visible?: boolean; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criteria.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criteria.tsx similarity index 98% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criteria.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criteria.tsx index a607b5ebf9975..c35e7141efc9d 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criteria.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criteria.tsx @@ -20,10 +20,10 @@ import { isRatioAlert, getNumerator, getDenominator, -} from '../../../../../../common/alerting/logs/log_threshold/types'; +} from '../../../../../common/alerting/logs/log_threshold/types'; +import { Errors, CriterionErrors } from '../../validation'; import { AlertsContext, ExpressionLike } from './editor'; import { CriterionPreview } from './criterion_preview_chart'; -import { Errors, CriterionErrors } from '../validation'; const DEFAULT_CRITERIA = { field: 'log.level', comparator: Comparator.EQ, value: 'error' }; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criterion.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx similarity index 98% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criterion.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx index 8ecd172c08d24..b2992ead3ea1b 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criterion.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx @@ -21,12 +21,12 @@ import { i18n } from '@kbn/i18n'; import { isNumber, isFinite } from 'lodash'; import { IFieldType } from 'src/plugins/data/public'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { IErrorObject } from '../../../../../../../triggers_actions_ui/public/types'; +import { IErrorObject } from '../../../../../../triggers_actions_ui/public/types'; import { Comparator, Criterion as CriterionType, ComparatorToi18nMap, -} from '../../../../../../common/alerting/logs/log_threshold/types'; +} from '../../../../../common/alerting/logs/log_threshold/types'; const firstCriterionFieldPrefix = i18n.translate( 'xpack.infra.logs.alertFlyout.firstCriterionFieldPrefix', diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criterion_preview_chart.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion_preview_chart.tsx similarity index 96% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criterion_preview_chart.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion_preview_chart.tsx index 675900499e793..478d4b879a7e1 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/criterion_preview_chart.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion_preview_chart.tsx @@ -31,21 +31,21 @@ import { getChartTheme, yAxisFormatter, NUM_BUCKETS, -} from '../../../shared/criterion_preview_chart/criterion_preview_chart'; +} from '../../../common/criterion_preview_chart/criterion_preview_chart'; import { AlertParams, Threshold, Criterion, Comparator, -} from '../../../../../../common/alerting/logs/log_threshold/types'; -import { Color, colorTransformer } from '../../../../../../common/color_palette'; +} from '../../../../../common/alerting/logs/log_threshold/types'; +import { Color, colorTransformer } from '../../../../../common/color_palette'; import { GetLogAlertsChartPreviewDataAlertParamsSubset, getLogAlertsChartPreviewDataAlertParamsSubsetRT, -} from '../../../../../../common/http_api/log_alerts/'; +} from '../../../../../common/http_api/log_alerts/'; import { AlertsContext } from './editor'; import { useChartPreviewData } from './hooks/use_chart_preview_data'; -import { decodeOrThrow } from '../../../../../../common/runtime_types'; +import { decodeOrThrow } from '../../../../../common/runtime_types'; const GROUP_LIMIT = 5; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/editor.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx similarity index 93% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/editor.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx index 0af96a7e06a2b..c5b0ed5844852 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/editor.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx @@ -8,25 +8,23 @@ import React, { useCallback, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiLoadingSpinner, EuiSpacer, EuiButton, EuiCallOut } from '@elastic/eui'; import { useMount } from 'react-use'; +import { GroupByExpression } from '../../../common/group_by_expression/group_by_expression'; import { ForLastExpression, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../../../triggers_actions_ui/public/common'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { AlertsContextValue } from '../../../../../../../triggers_actions_ui/public/application/context/alerts_context'; + AlertsContextValue, +} from '../../../../../../triggers_actions_ui/public'; import { AlertParams, Comparator, ThresholdType, isRatioAlert, -} from '../../../../../../common/alerting/logs/log_threshold/types'; +} from '../../../../../common/alerting/logs/log_threshold/types'; import { Threshold } from './threshold'; import { Criteria } from './criteria'; import { TypeSwitcher } from './type_switcher'; -import { useSourceId } from '../../../../../containers/source_id'; -import { LogSourceProvider, useLogSourceContext } from '../../../../../containers/logs/log_source'; -import { GroupByExpression } from '../../../shared/group_by_expression/group_by_expression'; -import { Errors } from '../validation'; +import { useSourceId } from '../../../../containers/source_id'; +import { LogSourceProvider, useLogSourceContext } from '../../../../containers/logs/log_source'; +import { Errors } from '../../validation'; export interface ExpressionCriteria { field?: string; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/hooks/use_chart_preview_data.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx similarity index 90% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/hooks/use_chart_preview_data.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx index d43e291f900f2..d5ba730026b12 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/hooks/use_chart_preview_data.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx @@ -5,15 +5,15 @@ */ import { useState, useMemo } from 'react'; import { AlertsContext } from '../editor'; -import { useTrackedPromise } from '../../../../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../../../utils/use_tracked_promise'; import { GetLogAlertsChartPreviewDataSuccessResponsePayload, getLogAlertsChartPreviewDataSuccessResponsePayloadRT, getLogAlertsChartPreviewDataRequestPayloadRT, LOG_ALERTS_CHART_PREVIEW_DATA_PATH, -} from '../../../../../../../common/http_api'; -import { decodeOrThrow } from '../../../../../../../common/runtime_types'; -import { GetLogAlertsChartPreviewDataAlertParamsSubset } from '../../../../../../../common/http_api/log_alerts/'; +} from '../../../../../../common/http_api'; +import { decodeOrThrow } from '../../../../../../common/runtime_types'; +import { GetLogAlertsChartPreviewDataAlertParamsSubset } from '../../../../../../common/http_api/log_alerts/'; interface Options { sourceId: string; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/index.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/index.tsx similarity index 100% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/index.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/index.tsx diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/threshold.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/threshold.tsx similarity index 95% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/threshold.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/threshold.tsx index e2065ca25cb6f..da0c987bac85f 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/threshold.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/threshold.tsx @@ -18,12 +18,12 @@ import { EuiFormRow, } from '@elastic/eui'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { IErrorObject } from '../../../../../../../triggers_actions_ui/public/types'; +import { IErrorObject } from '../../../../../../triggers_actions_ui/public/types'; import { Comparator, ComparatorToi18nMap, AlertParams, -} from '../../../../../../common/alerting/logs/log_threshold/types'; +} from '../../../../../common/alerting/logs/log_threshold/types'; const thresholdPrefix = i18n.translate('xpack.infra.logs.alertFlyout.thresholdPrefix', { defaultMessage: 'is', diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/type_switcher.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/type_switcher.tsx similarity index 97% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/type_switcher.tsx rename to x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/type_switcher.tsx index 03c895dcd0f2d..5f5078f8aa6e1 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/expression_editor/type_switcher.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/type_switcher.tsx @@ -11,7 +11,7 @@ import { AlertParams, ThresholdType, isRatioAlert, -} from '../../../../../../common/alerting/logs/log_threshold/types'; +} from '../../../../../common/alerting/logs/log_threshold/types'; import { ExpressionLike } from './editor'; const typePrefix = i18n.translate('xpack.infra.logs.alertFlyout.thresholdTypePrefix', { diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/index.ts b/x-pack/plugins/infra/public/alerting/log_threshold/index.ts new file mode 100644 index 0000000000000..0974d00c4dffb --- /dev/null +++ b/x-pack/plugins/infra/public/alerting/log_threshold/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getAlertType } from './log_threshold_alert_type'; +export { AlertDropdown } from './components/alert_dropdown'; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/log_threshold_alert_type.ts b/x-pack/plugins/infra/public/alerting/log_threshold/log_threshold_alert_type.ts similarity index 80% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/log_threshold_alert_type.ts rename to x-pack/plugins/infra/public/alerting/log_threshold/log_threshold_alert_type.ts index 15ff5844c1236..29a58fc95f2be 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/log_threshold_alert_type.ts +++ b/x-pack/plugins/infra/public/alerting/log_threshold/log_threshold_alert_type.ts @@ -5,9 +5,8 @@ */ import { i18n } from '@kbn/i18n'; import React from 'react'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { AlertTypeModel } from '../../../../../../triggers_actions_ui/public/types'; -import { LOG_DOCUMENT_COUNT_ALERT_TYPE_ID } from '../../../../../common/alerting/logs/log_threshold/types'; +import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; +import { LOG_DOCUMENT_COUNT_ALERT_TYPE_ID } from '../../../common/alerting/logs/log_threshold/types'; import { validateExpression } from './validation'; export function getAlertType(): AlertTypeModel { @@ -17,7 +16,7 @@ export function getAlertType(): AlertTypeModel { defaultMessage: 'Log threshold', }), iconClass: 'bell', - alertParamsExpression: React.lazy(() => import('./expression_editor/editor')), + alertParamsExpression: React.lazy(() => import('./components/expression_editor/editor')), validate: validateExpression, defaultActionMessage: i18n.translate( 'xpack.infra.logs.alerting.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/validation.ts b/x-pack/plugins/infra/public/alerting/log_threshold/validation.ts similarity index 94% rename from x-pack/plugins/infra/public/components/alerting/logs/log_threshold/validation.ts rename to x-pack/plugins/infra/public/alerting/log_threshold/validation.ts index a7f773c08d2b3..6630b3d079141 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold/validation.ts +++ b/x-pack/plugins/infra/public/alerting/log_threshold/validation.ts @@ -6,8 +6,7 @@ import { i18n } from '@kbn/i18n'; import { isNumber, isFinite } from 'lodash'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ValidationResult } from '../../../../../../triggers_actions_ui/public/types'; +import { ValidationResult } from '../../../../triggers_actions_ui/public'; import { AlertParams, Criteria, @@ -15,7 +14,7 @@ import { isRatioAlert, getNumerator, getDenominator, -} from '../../../../../common/alerting/logs/log_threshold/types'; +} from '../../../common/alerting/logs/log_threshold/types'; export interface CriterionErrors { [id: string]: { diff --git a/x-pack/plugins/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/page_content.tsx index 973037af499e5..e85f0d9bf446b 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_content.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { Route, Switch } from 'react-router-dom'; import { useMount } from 'react-use'; +import { AlertDropdown } from '../../alerting/log_threshold'; import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; import { DocumentTitle } from '../../components/document_title'; import { Header } from '../../components/header'; @@ -23,7 +24,6 @@ import { LogEntryCategoriesPage } from './log_entry_categories'; import { LogEntryRatePage } from './log_entry_rate'; import { LogsSettingsPage } from './settings'; import { StreamPage } from './stream'; -import { AlertDropdown } from '../../components/alerting/logs/log_threshold/alert_dropdown'; export const LogsPageContent: React.FunctionComponent = () => { const uiCapabilities = useKibana().services.application?.capabilities; diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index b409c32603ffc..3c6b1a14cfd47 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -8,7 +8,7 @@ import { AppMountParameters, PluginInitializerContext } from 'kibana/public'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; import { createMetricThresholdAlertType } from './alerting/metric_threshold'; import { createInventoryMetricAlertType } from './alerting/inventory'; -import { getAlertType as getLogsAlertType } from './components/alerting/logs/log_threshold/log_threshold_alert_type'; +import { getAlertType as getLogsAlertType } from './alerting/log_threshold'; import { registerStartSingleton } from './legacy_singletons'; import { registerFeatures } from './register_feature'; import { diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index f73fac2259067..a28b10683c28f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -7,7 +7,7 @@ import { PluginInitializerContext } from 'src/core/public'; import { Plugin } from './plugin'; -export { AlertsContextProvider } from './application/context/alerts_context'; +export { AlertsContextProvider, AlertsContextValue } from './application/context/alerts_context'; export { ActionsConnectorsContextProvider } from './application/context/actions_connectors_context'; export { AlertAdd } from './application/sections/alert_form'; export { AlertEdit } from './application/sections'; From 41318801d3d0b856133fcb787ec355c773f2b55e Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:04:23 -0400 Subject: [PATCH 42/64] [SECURITY_SOLUTION][ENDPOINT] Add ability to view Trusted Apps from Ingest Integration Policy Edit page (#78854) * Refactor Callout shown in Ingest Edit Endpoint Integration Policy that display actions menu * Add `backComponent` to `` to allow for custom back buttons * Back button displayed on Trusted Apps List when route state is defined --- .../common/endpoint/types/trusted_apps.ts | 13 ++ .../common/components/header_page/index.tsx | 5 + .../components/administration_list_page.tsx | 4 +- .../configure_package_policy.tsx | 206 +++++++++++++----- .../trusted_apps/view/trusted_apps_page.tsx | 61 +++++- .../apps/endpoint/policy_details.ts | 44 +++- ...gest_manager_create_package_policy_page.ts | 35 +++ .../page_objects/trusted_apps_page.ts | 19 +- 8 files changed, 325 insertions(+), 62 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts b/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts index 62793388e34a6..c0afe3b612d82 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts @@ -5,6 +5,7 @@ */ import { TypeOf } from '@kbn/config-schema'; +import { ApplicationStart } from 'kibana/public'; import { DeleteTrustedAppsRequestSchema, GetTrustedAppsRequestSchema, @@ -65,3 +66,15 @@ export type TrustedApp = NewTrustedApp & { created_at: string; created_by: string; }; + +/** + * Supported React-Router state for the Trusted Apps List page + */ +export interface TrustedAppsListPageRouteState { + /** Where the user should be redirected to when the `Back` button is clicked */ + onBackButtonNavigateTo: Parameters; + /** The URL for the `Back` button */ + backButtonUrl?: string; + /** The label for the button */ + backButtonLabel?: string; +} diff --git a/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx b/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx index 0cb721bb5382f..4a5a55f30f94f 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx @@ -71,6 +71,8 @@ interface BackOptions { export interface HeaderPageProps extends HeaderProps { backOptions?: BackOptions; + /** A component to be displayed as the back button. Used only if `backOption` is not defined */ + backComponent?: React.ReactNode; badgeOptions?: BadgeOptions; children?: React.ReactNode; draggableArguments?: DraggableArguments; @@ -83,6 +85,7 @@ export interface HeaderPageProps extends HeaderProps { const HeaderPageComponent: React.FC = ({ backOptions, + backComponent, badgeOptions, border, children, @@ -123,6 +126,8 @@ const HeaderPageComponent: React.FC = ({ )} + {!backOptions && backComponent && <>{backComponent}} + {titleNode || ( = memo( - ({ beta, title, subtitle, actions, children, ...otherProps }) => { + ({ beta, title, subtitle, actions, children, headerBackComponent, ...otherProps }) => { const badgeOptions = !beta ? undefined : { beta: true, text: BETA_BADGE_LABEL }; return ( @@ -39,6 +40,7 @@ export const AdministrationListPage: FC<AdministrationListPageProps & CommonProp hideSourcerer={true} title={title} subtitle={subtitle} + backComponent={headerBackComponent} badgeOptions={badgeOptions} > {actions} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_policy.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_policy.tsx index b03069a739e35..3cca2d9c26599 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_policy.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_policy.tsx @@ -4,17 +4,34 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { memo, useMemo } from 'react'; +import React, { memo, useCallback, useMemo, useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiCallOut, EuiText, EuiSpacer } from '@elastic/eui'; -import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app'; +import { + EuiCallOut, + EuiText, + EuiSpacer, + EuiFlexGroup, + EuiFlexItem, + EuiContextMenuPanel, + EuiPopover, + EuiButton, + EuiContextMenuItem, + EuiContextMenuPanelProps, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { CustomConfigurePackagePolicyContent, CustomConfigurePackagePolicyProps, + pagePathGetters, } from '../../../../../../../ingest_manager/public'; -import { getPolicyDetailPath } from '../../../../common/routing'; +import { getPolicyDetailPath, getTrustedAppsListPath } from '../../../../common/routing'; import { MANAGEMENT_APP_ID } from '../../../../common/constants'; -import { PolicyDetailsRouteState } from '../../../../../../common/endpoint/types'; +import { + PolicyDetailsRouteState, + TrustedAppsListPageRouteState, +} from '../../../../../../common/endpoint/types'; +import { useKibana } from '../../../../../common/lib/kibana'; +import { useNavigateToAppEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; /** * Exports Endpoint-specific package policy instructions @@ -26,27 +43,6 @@ export const ConfigureEndpointPackagePolicy = memo<CustomConfigurePackagePolicyC packagePolicyId, packagePolicy: { policy_id: agentPolicyId }, }: CustomConfigurePackagePolicyProps) => { - let policyUrl = ''; - if (from === 'edit' && packagePolicyId) { - // Cannot use formalUrl here since the code is called in Ingest, which does not use redux - policyUrl = getPolicyDetailPath(packagePolicyId); - } - - const policyDetailRouteState = useMemo((): undefined | PolicyDetailsRouteState => { - if (from !== 'edit') { - return undefined; - } - const navigateTo: PolicyDetailsRouteState['onSaveNavigateTo'] & - PolicyDetailsRouteState['onCancelNavigateTo'] = [ - 'ingestManager', - { path: `#/policies/${agentPolicyId}/edit-integration/${packagePolicyId}` }, - ]; - return { - onSaveNavigateTo: navigateTo, - onCancelNavigateTo: navigateTo, - }; - }, [agentPolicyId, from, packagePolicyId]); - return ( <> <EuiSpacer size="m" /> @@ -55,39 +51,149 @@ export const ConfigureEndpointPackagePolicy = memo<CustomConfigurePackagePolicyC iconType="iInCircle" > <EuiText size="s"> - <p> - {from === 'edit' ? ( - <FormattedMessage - id="xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.endpointConfiguration" - defaultMessage="Click {advancedConfigOptionsLink} to edit advanced configuration options." - values={{ - advancedConfigOptionsLink: ( - <LinkToApp - data-test-subj="editLinkToPolicyDetails" - appId={MANAGEMENT_APP_ID} - appPath={policyUrl} - appState={policyDetailRouteState} - > - <FormattedMessage - id="xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.endpointConfigurationLink" - defaultMessage="here" - /> - </LinkToApp> - ), - }} + {from === 'edit' ? ( + <> + <EditFlowMessage + agentPolicyId={agentPolicyId} + integrationPolicyId={packagePolicyId!} /> - ) : ( + </> + ) : ( + <p> <FormattedMessage id="xpack.securitySolution.endpoint.ingestManager.createPackagePolicy.endpointConfiguration" defaultMessage="We'll save your integration with our recommended defaults. You can change this later by editing the Endpoint Security integration within your agent policy." /> - )} - </p> + </p> + )} </EuiText> </EuiCallOut> </> ); } ); - ConfigureEndpointPackagePolicy.displayName = 'ConfigureEndpointPackagePolicy'; + +const EditFlowMessage = memo<{ + agentPolicyId: string; + integrationPolicyId: string; +}>(({ agentPolicyId, integrationPolicyId }) => { + const { + services: { + application: { getUrlForApp }, + }, + } = useKibana(); + + const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false); + + const navigateBackToIngest = useMemo< + PolicyDetailsRouteState['onSaveNavigateTo'] & + PolicyDetailsRouteState['onCancelNavigateTo'] & + TrustedAppsListPageRouteState['onBackButtonNavigateTo'] + >(() => { + return [ + 'ingestManager', + { + path: `#${pagePathGetters.edit_integration({ + policyId: agentPolicyId, + packagePolicyId: integrationPolicyId!, + })}`, + }, + ]; + }, [agentPolicyId, integrationPolicyId]); + + const handleClosePopup = useCallback(() => setIsMenuOpen(false), []); + + const handleSecurityPolicyAction = useNavigateToAppEventHandler<PolicyDetailsRouteState>( + MANAGEMENT_APP_ID, + { + path: getPolicyDetailPath(integrationPolicyId), + state: { + onSaveNavigateTo: navigateBackToIngest, + onCancelNavigateTo: navigateBackToIngest, + }, + } + ); + + const handleTrustedAppsAction = useNavigateToAppEventHandler<TrustedAppsListPageRouteState>( + MANAGEMENT_APP_ID, + { + path: getTrustedAppsListPath(), + state: { + backButtonUrl: navigateBackToIngest[1]?.path + ? `${getUrlForApp('ingestManager')}${navigateBackToIngest[1].path}` + : undefined, + onBackButtonNavigateTo: navigateBackToIngest, + backButtonLabel: i18n.translate( + 'xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.trustedAppsMessageReturnBackLabel', + { defaultMessage: 'Back to Edit Integration' } + ), + }, + } + ); + + const menuButton = useMemo(() => { + return ( + <EuiButton + size="s" + iconType="arrowDown" + iconSide="right" + onClick={() => setIsMenuOpen((prevState) => !prevState)} + data-test-subj="endpointActions" + > + <FormattedMessage + id="xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.menuButton" + defaultMessage="Actions" + /> + </EuiButton> + ); + }, []); + + const actionItems = useMemo<EuiContextMenuPanelProps['items']>(() => { + return [ + <EuiContextMenuItem + key="policyDetails" + onClick={handleSecurityPolicyAction} + data-test-subj="securityPolicy" + > + <FormattedMessage + id="xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.actionSecurityPolicy" + defaultMessage="Edit Security Policy" + /> + </EuiContextMenuItem>, + <EuiContextMenuItem + key="trustedApps" + onClick={handleTrustedAppsAction} + data-test-subj="trustedAppsAction" + > + <FormattedMessage + id="xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.actionTrustedApps" + defaultMessage="View Trusted Applications" + /> + </EuiContextMenuItem>, + ]; + }, [handleSecurityPolicyAction, handleTrustedAppsAction]); + + return ( + <EuiFlexGroup> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.endpoint.ingestManager.editPackagePolicy.message" + defaultMessage="More advanced configuration options can be found by selecting an action from the menu" + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiPopover + button={menuButton} + isOpen={isMenuOpen} + closePopover={handleClosePopup} + anchorPosition="downRight" + panelPaddingSize="s" + > + <EuiContextMenuPanel data-test-subj="endpointActionsMenuPanel" items={actionItems} /> + </EuiPopover> + </EuiFlexItem> + </EuiFlexGroup> + ); +}); +EditFlowMessage.displayName = 'EditFlowMessage'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx index c1c23a3960962..878818d9b77fe 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx @@ -3,10 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { memo, useCallback } from 'react'; +import React, { memo, useCallback, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiButton } from '@elastic/eui'; -import { useHistory } from 'react-router-dom'; +import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { useHistory, useLocation } from 'react-router-dom'; +import styled from 'styled-components'; import { AdministrationListPage } from '../../../components/administration_list_page'; import { TrustedAppsList } from './trusted_apps_list'; import { TrustedAppDeletionDialog } from './trusted_app_deletion_dialog'; @@ -15,9 +16,12 @@ import { CreateTrustedAppFlyout } from './components/create_trusted_app_flyout'; import { getTrustedAppsListPath } from '../../../common/routing'; import { useTrustedAppsSelector } from './hooks'; import { getListCurrentShowValue, getListUrlSearchParams } from '../store/selectors'; +import { TrustedAppsListPageRouteState } from '../../../../../common/endpoint/types'; +import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; export const TrustedAppsPage = memo(() => { const history = useHistory(); + const { state: routeState } = useLocation<TrustedAppsListPageRouteState | undefined>(); const urlParams = useTrustedAppsSelector(getListUrlSearchParams); const showAddFlout = useTrustedAppsSelector(getListCurrentShowValue) === 'create'; const handleAddButtonClick = useCallback(() => { @@ -33,6 +37,15 @@ export const TrustedAppsPage = memo(() => { history.push(getTrustedAppsListPath(paginationParamsOnly)); }, [history, urlParams]); + const backButton = useMemo(() => { + if (routeState && routeState.onBackButtonNavigateTo) { + return <BackToExternalAppButton {...routeState} />; + } + return null; + // FIXME: Route state is being deleted by some parent component + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const addButton = ( <EuiButton fill @@ -50,6 +63,7 @@ export const TrustedAppsPage = memo(() => { return ( <AdministrationListPage + data-test-subj="trustedAppsListPage" beta={true} title={ <FormattedMessage @@ -57,6 +71,7 @@ export const TrustedAppsPage = memo(() => { defaultMessage="Trusted Applications" /> } + headerBackComponent={backButton} subtitle={ <FormattedMessage id="xpack.securitySolution.trustedapps.list.pageSubTitle" @@ -80,3 +95,43 @@ export const TrustedAppsPage = memo(() => { }); TrustedAppsPage.displayName = 'TrustedAppsPage'; + +const EuiButtonEmptyStyled = styled(EuiButtonEmpty)` + margin-bottom: ${({ theme }) => theme.eui.euiSizeS}; + + .euiIcon { + width: ${({ theme }) => theme.eui.euiIconSizes.small}; + height: ${({ theme }) => theme.eui.euiIconSizes.small}; + } + + .text { + font-size: ${({ theme }) => theme.eui.euiFontSizeXS}; + } +`; + +const BackToExternalAppButton = memo<TrustedAppsListPageRouteState>( + ({ backButtonLabel, backButtonUrl, onBackButtonNavigateTo }) => { + const handleBackOnClick = useNavigateToAppEventHandler(...onBackButtonNavigateTo!); + + return ( + <EuiButtonEmptyStyled + flush="left" + size="xs" + iconType="arrowLeft" + href={backButtonUrl!} + onClick={handleBackOnClick} + textProps={{ className: 'text' }} + data-test-subj="backToOrigin" + > + {backButtonLabel || ( + <FormattedMessage + id="xpack.securitySolution.trustedapps.list.backButton" + defaultMessage="Back" + /> + )} + </EuiButtonEmptyStyled> + ); + } +); + +BackToExternalAppButton.displayName = 'BackToExternalAppButton'; diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 9610144d3846d..137f24432976a 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -16,6 +16,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'policy', 'endpointPageUtils', 'ingestManagerCreatePackagePolicy', + 'trustedApps', ]); const testSubjects = getService('testSubjects'); const policyTestResources = getService('policyTestResources'); @@ -250,6 +251,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); }); + describe('when on Ingest Policy Edit Package Policy page', async () => { let policyInfo: PolicyTestResourceInfo; beforeEach(async () => { @@ -265,16 +267,31 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await policyInfo.cleanup(); } }); - it('should show a link to Policy Details', async () => { - await testSubjects.existOrFail('editLinkToPolicyDetails'); + + it('should show callout', async () => { + await testSubjects.existOrFail('endpointPackagePolicy_edit'); }); - it('should navigate to Policy Details when the link is clicked', async () => { - const linkToPolicy = await testSubjects.find('editLinkToPolicyDetails'); - await linkToPolicy.click(); + + it('should show actions button with expected action items', async () => { + const actionsButton = await pageObjects.ingestManagerCreatePackagePolicy.findEndpointActionsButton(); + await actionsButton.click(); + const menuPanel = await testSubjects.find('endpointActionsMenuPanel'); + const actionItems = await menuPanel.findAllByTagName<'button'>('button'); + const expectedItems = ['Edit Security Policy', 'View Trusted Applications']; + + for (const action of actionItems) { + const buttonText = await action.getVisibleText(); + expect(buttonText).to.be(expectedItems.find((item) => item === buttonText)); + } + }); + + it('should navigate to Policy Details when the edit security policy action is clicked', async () => { + await pageObjects.ingestManagerCreatePackagePolicy.selectEndpointAction('policy'); await pageObjects.policy.ensureIsOnDetailsPage(); }); + it('should allow the user to navigate, edit, save Policy Details and be redirected back to ingest', async () => { - await (await testSubjects.find('editLinkToPolicyDetails')).click(); + await pageObjects.ingestManagerCreatePackagePolicy.selectEndpointAction('policy'); await pageObjects.policy.ensureIsOnDetailsPage(); await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); await pageObjects.policy.confirmAndSave(); @@ -282,11 +299,24 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.existOrFail('policyDetailsSuccessMessage'); await pageObjects.ingestManagerCreatePackagePolicy.ensureOnEditPageOrFail(); }); + it('should navigate back to Ingest Policy Edit package page on click of cancel button', async () => { - await (await testSubjects.find('editLinkToPolicyDetails')).click(); + await pageObjects.ingestManagerCreatePackagePolicy.selectEndpointAction('policy'); await (await pageObjects.policy.findCancelButton()).click(); await pageObjects.ingestManagerCreatePackagePolicy.ensureOnEditPageOrFail(); }); + + it('should navigate to Trusted Apps', async () => { + await pageObjects.ingestManagerCreatePackagePolicy.selectEndpointAction('trustedApps'); + await pageObjects.trustedApps.ensureIsOnTrustedAppsListPage(); + }); + + it('should show the back button on Trusted Apps Page and navigate back to fleet', async () => { + await pageObjects.ingestManagerCreatePackagePolicy.selectEndpointAction('trustedApps'); + const backButton = await pageObjects.trustedApps.findTrustedAppsListPageBackButton(); + await backButton.click(); + await pageObjects.ingestManagerCreatePackagePolicy.ensureOnEditPageOrFail(); + }); }); }); } diff --git a/x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts b/x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts index 523b327b8de1c..38ba50b08d507 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/ingest_manager_create_package_policy_page.ts @@ -5,6 +5,7 @@ */ import { FtrProviderContext } from '../ftr_provider_context'; +import { WebElementWrapper } from '../../../../test/functional/services/lib/web_element_wrapper'; export function IngestManagerCreatePackagePolicy({ getService, @@ -13,6 +14,7 @@ export function IngestManagerCreatePackagePolicy({ const testSubjects = getService('testSubjects'); const find = getService('find'); const pageObjects = getPageObjects(['common']); + const browser = getService('browser'); return { /** @@ -101,5 +103,38 @@ export function IngestManagerCreatePackagePolicy({ }); await this.ensureOnEditPageOrFail(); }, + + /** + * Returns the Endpoint Callout that is displayed on the Integration Policy create/edit pages + */ + async findEndpointActionsButton() { + const button = await testSubjects.find('endpointActions'); + await this.scrollToCenterOfWindow(button); + return button; + }, + + /** + * Center a given Element on the Window viewport + * @param element + */ + async scrollToCenterOfWindow(element: WebElementWrapper) { + const [elementPosition, windowSize] = await Promise.all([ + element.getPosition(), + browser.getWindowSize(), + ]); + await browser.execute( + `document.scrollingElement.scrollTop = ${elementPosition.y - windowSize.height / 2}` + ); + }, + + /** + * Will click on the given Endpoint Action (from the Actions dropdown) + * @param action + */ + async selectEndpointAction(action: 'policy' | 'trustedApps') { + await (await this.findEndpointActionsButton()).click(); + const testSubjId = action === 'policy' ? 'securityPolicy' : 'trustedAppsAction'; + await (await testSubjects.find(testSubjId)).click(); + }, }; } diff --git a/x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts b/x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts index c02ac0ca9ffe0..aac516942ad24 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/trusted_apps_page.ts @@ -5,8 +5,9 @@ */ import { FtrProviderContext } from '../ftr_provider_context'; -export function TrustedAppsPageProvider({ getPageObjects }: FtrProviderContext) { +export function TrustedAppsPageProvider({ getService, getPageObjects }: FtrProviderContext) { const pageObjects = getPageObjects(['common', 'header', 'endpointPageUtils']); + const testSubjects = getService('testSubjects'); return { async navigateToTrustedAppsList(searchParams?: string) { @@ -16,5 +17,21 @@ export function TrustedAppsPageProvider({ getPageObjects }: FtrProviderContext) ); await pageObjects.header.waitUntilLoadingHasFinished(); }, + + /** + * ensures that the Policy Page is the currently display view + */ + async ensureIsOnTrustedAppsListPage() { + await testSubjects.existOrFail('trustedAppsListPage'); + }, + + /** + * Returns the Back button displayed on the Trusted Apps list page when page is loaded + * with route state that triggers return button to be displayed + */ + async findTrustedAppsListPageBackButton() { + await this.ensureIsOnTrustedAppsListPage(); + return testSubjects.find('backToOrigin'); + }, }; } From 513b17ef4f4b2399d00082e3de838ca3b5a2bdad Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:06:24 -0400 Subject: [PATCH 43/64] [SECURITY_SOLUTION][ENDPOINT] Additional Trusted Apps Create API Validations (#78977) * Added validations to trusted apps create schema --- .../endpoint/schema/trusted_apps.test.ts | 72 ++++++++++++++++++- .../common/endpoint/schema/trusted_apps.ts | 28 +++++++- 2 files changed, 97 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.test.ts b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.test.ts index c0fbebf73ed8a..13a3fb96e10f7 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.test.ts @@ -160,6 +160,11 @@ describe('When invoking Trusted Apps Schema', () => { }); describe('when `entries` are defined', () => { + // Some static hashes for use in validation. Some chr. are in UPPERcase on purpose + const VALID_HASH_MD5 = '741462ab431a22233C787BAAB9B653C7'; + const VALID_HASH_SHA1 = 'aedb279e378BED6C2DB3C9DC9e12ba635e0b391c'; + const VALID_HASH_SHA256 = 'A4370C0CF81686C0B696FA6261c9d3e0d810ae704ab8301839dffd5d5112f476'; + const getTrustedAppItemEntryItem = () => getCreateTrustedAppItem().entries[0]; it('should validate `entry.field` is required', () => { @@ -194,13 +199,19 @@ describe('When invoking Trusted Apps Schema', () => { }; expect(() => body.validate(bodyMsg2)).toThrow(); - ['process.hash.*', 'process.path.text'].forEach((field) => { + [ + { + field: 'process.hash.*', + value: 'A4370C0CF81686C0B696FA6261c9d3e0d810ae704ab8301839dffd5d5112f476', + }, + { field: 'process.path.text', value: '/tmp/dir1' }, + ].forEach((partialEntry) => { const bodyMsg3 = { ...getCreateTrustedAppItem(), entries: [ { ...getTrustedAppItemEntryItem(), - field, + ...partialEntry, }, ], }; @@ -280,6 +291,63 @@ describe('When invoking Trusted Apps Schema', () => { }; expect(() => body.validate(bodyMsg)).toThrow(); }); + + it('should validate that `entry.field` is used only once', () => { + const bodyMsg = { + ...getCreateTrustedAppItem(), + entries: [getTrustedAppItemEntryItem(), getTrustedAppItemEntryItem()], + }; + expect(() => body.validate(bodyMsg)).toThrow(); + }); + + it('should validate Hash field valid value', () => { + [VALID_HASH_MD5, VALID_HASH_SHA1, VALID_HASH_SHA256].forEach((value) => { + expect(() => { + body.validate({ + ...getCreateTrustedAppItem(), + entries: [ + { + ...getTrustedAppItemEntryItem(), + field: 'process.hash.*', + value, + }, + ], + }); + }).not.toThrow(); + }); + }); + + it('should validate Hash value with invalid length', () => { + ['xyz', VALID_HASH_SHA256 + VALID_HASH_MD5].forEach((value) => { + expect(() => { + body.validate({ + ...getCreateTrustedAppItem(), + entries: [ + { + ...getTrustedAppItemEntryItem(), + field: 'process.hash.*', + value, + }, + ], + }); + }).toThrow(); + }); + }); + + it('should validate Hash value with invalid characters', () => { + expect(() => { + body.validate({ + ...getCreateTrustedAppItem(), + entries: [ + { + ...getTrustedAppItemEntryItem(), + field: 'process.hash.*', + value: `G${VALID_HASH_MD5.substr(1)}`, + }, + ], + }); + }).toThrow(); + }); }); }); }); diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts index 3b3bec4a47804..912468b52adc0 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts @@ -6,6 +6,13 @@ import { schema } from '@kbn/config-schema'; +const hashLengths: readonly number[] = [ + 32, // MD5 + 40, // SHA1 + 64, // SHA256 +]; +const hasInvalidCharacters = /[^0-9a-f]/i; + export const DeleteTrustedAppsRequestSchema = { params: schema.object({ id: schema.string(), @@ -34,7 +41,26 @@ export const PostTrustedAppCreateRequestSchema = { operator: schema.literal('included'), value: schema.string({ minLength: 1 }), }), - { minSize: 1 } + { + minSize: 1, + validate(entries) { + const usedFields: string[] = []; + for (const { field, value } of entries) { + if (usedFields.includes(field)) { + return `[Hash] field can only be used once`; + } + + usedFields.push(field); + + if ( + field === 'process.hash.*' && + (!hashLengths.includes(value.length) || hasInvalidCharacters.test(value)) + ) { + return `Invalid hash value [${value}]`; + } + } + }, + } ), }), }; From 4ee3677898e443e5cbd7a0640063fe80123369bb Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet <pierre.gayvallet@elastic.co> Date: Thu, 1 Oct 2020 17:10:09 +0200 Subject: [PATCH 44/64] Add relative path handling to `application.navigateToUrl` (#78565) * split application utilities and associated tests to distinct files * do not match app if path does not start with the basePath * add relative paths support to `navigateToUrl` * add null-check error * update generated doc * nits on doc --- ...re-public.applicationstart.geturlforapp.md | 6 +- ...ana-plugin-core-public.applicationstart.md | 4 +- ...e-public.applicationstart.navigatetourl.md | 11 +- packages/kbn-std/src/index.ts | 2 +- packages/kbn-std/src/url.test.ts | 26 +- packages/kbn-std/src/url.ts | 11 + src/core/public/application/types.ts | 26 +- src/core/public/application/utils.ts | 128 -------- .../application/utils/append_app_path.test.ts | 40 +++ .../application/utils/append_app_path.ts | 32 ++ .../application/utils/get_app_info.test.ts | 75 +++++ .../public/application/utils/get_app_info.ts | 36 +++ src/core/public/application/utils/index.ts | 24 ++ .../parse_app_url.test.ts} | 295 ++++++++---------- .../public/application/utils/parse_app_url.ts | 83 +++++ .../utils/relative_to_absolute.test.ts | 29 ++ .../application/utils/relative_to_absolute.ts | 35 +++ .../application/utils/remove_slashes.test.ts | 53 ++++ .../application/utils/remove_slashes.ts | 42 +++ src/core/public/http/base_path.ts | 18 -- 20 files changed, 649 insertions(+), 327 deletions(-) delete mode 100644 src/core/public/application/utils.ts create mode 100644 src/core/public/application/utils/append_app_path.test.ts create mode 100644 src/core/public/application/utils/append_app_path.ts create mode 100644 src/core/public/application/utils/get_app_info.test.ts create mode 100644 src/core/public/application/utils/get_app_info.ts create mode 100644 src/core/public/application/utils/index.ts rename src/core/public/application/{utils.test.ts => utils/parse_app_url.test.ts} (58%) create mode 100644 src/core/public/application/utils/parse_app_url.ts create mode 100644 src/core/public/application/utils/relative_to_absolute.test.ts create mode 100644 src/core/public/application/utils/relative_to_absolute.ts create mode 100644 src/core/public/application/utils/remove_slashes.test.ts create mode 100644 src/core/public/application/utils/remove_slashes.ts diff --git a/docs/development/core/public/kibana-plugin-core-public.applicationstart.geturlforapp.md b/docs/development/core/public/kibana-plugin-core-public.applicationstart.geturlforapp.md index 055ad9f37e654..1eaf00c7a678d 100644 --- a/docs/development/core/public/kibana-plugin-core-public.applicationstart.geturlforapp.md +++ b/docs/development/core/public/kibana-plugin-core-public.applicationstart.geturlforapp.md @@ -4,9 +4,11 @@ ## ApplicationStart.getUrlForApp() method -Returns an URL to a given app, including the global base path. By default, the URL is relative (/basePath/app/my-app). Use the `absolute` option to generate an absolute url (http://host:port/basePath/app/my-app) +Returns the absolute path (or URL) to a given app, including the global base path. -Note that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's location. +By default, it returns the absolute path of the application (e.g `/basePath/app/my-app`<!-- -->). Use the `absolute` option to generate an absolute url instead (e.g `http://host:port/basePath/app/my-app`<!-- -->) + +Note that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's current location. <b>Signature:</b> diff --git a/docs/development/core/public/kibana-plugin-core-public.applicationstart.md b/docs/development/core/public/kibana-plugin-core-public.applicationstart.md index 00318f32984e9..ae62a7767a0e9 100644 --- a/docs/development/core/public/kibana-plugin-core-public.applicationstart.md +++ b/docs/development/core/public/kibana-plugin-core-public.applicationstart.md @@ -23,8 +23,8 @@ export interface ApplicationStart | Method | Description | | --- | --- | -| [getUrlForApp(appId, options)](./kibana-plugin-core-public.applicationstart.geturlforapp.md) | Returns an URL to a given app, including the global base path. By default, the URL is relative (/basePath/app/my-app). Use the <code>absolute</code> option to generate an absolute url (http://host:port/basePath/app/my-app)<!-- -->Note that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's location. | +| [getUrlForApp(appId, options)](./kibana-plugin-core-public.applicationstart.geturlforapp.md) | Returns the absolute path (or URL) to a given app, including the global base path.<!-- -->By default, it returns the absolute path of the application (e.g <code>/basePath/app/my-app</code>). Use the <code>absolute</code> option to generate an absolute url instead (e.g <code>http://host:port/basePath/app/my-app</code>)<!-- -->Note that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's current location. | | [navigateToApp(appId, options)](./kibana-plugin-core-public.applicationstart.navigatetoapp.md) | Navigate to a given app | -| [navigateToUrl(url)](./kibana-plugin-core-public.applicationstart.navigatetourl.md) | Navigate to given url, which can either be an absolute url or a relative path, in a SPA friendly way when possible.<!-- -->If all these criteria are true for the given url: - (only for absolute URLs) The origin of the URL matches the origin of the browser's current location - The pathname of the URL starts with the current basePath (eg. /mybasepath/s/my-space) - The pathname segment after the basePath matches any known application route (eg. /app/<id>/ or any application's <code>appRoute</code> configuration)<!-- -->Then a SPA navigation will be performed using <code>navigateToApp</code> using the corresponding application and path. Otherwise, fallback to a full page reload to navigate to the url using <code>window.location.assign</code> | +| [navigateToUrl(url)](./kibana-plugin-core-public.applicationstart.navigatetourl.md) | Navigate to given URL in a SPA friendly way when possible (when the URL will redirect to a valid application within the current basePath).<!-- -->The method resolves pathnames the same way browsers do when resolving a <code><a href></code> value. The provided <code>url</code> can be: - an absolute URL - an absolute path - a path relative to the current URL (window.location.href)<!-- -->If all these criteria are true for the given URL: - (only for absolute URLs) The origin of the URL matches the origin of the browser's current location - The resolved pathname of the provided URL/path starts with the current basePath (eg. /mybasepath/s/my-space) - The pathname segment after the basePath matches any known application route (eg. /app/<id>/ or any application's <code>appRoute</code> configuration)<!-- -->Then a SPA navigation will be performed using <code>navigateToApp</code> using the corresponding application and path. Otherwise, fallback to a full page reload to navigate to the url using <code>window.location.assign</code> | | [registerMountContext(contextName, provider)](./kibana-plugin-core-public.applicationstart.registermountcontext.md) | Register a context provider for application mounting. Will only be available to applications that depend on the plugin that registered this context. Deprecated, use [CoreSetup.getStartServices](./kibana-plugin-core-public.coresetup.getstartservices.md)<!-- -->. | diff --git a/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetourl.md b/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetourl.md index 86b86776b0b12..8639394cbc421 100644 --- a/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetourl.md +++ b/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetourl.md @@ -4,9 +4,11 @@ ## ApplicationStart.navigateToUrl() method -Navigate to given url, which can either be an absolute url or a relative path, in a SPA friendly way when possible. +Navigate to given URL in a SPA friendly way when possible (when the URL will redirect to a valid application within the current basePath). -If all these criteria are true for the given url: - (only for absolute URLs) The origin of the URL matches the origin of the browser's current location - The pathname of the URL starts with the current basePath (eg. /mybasepath/s/my-space) - The pathname segment after the basePath matches any known application route (eg. /app/<id>/ or any application's `appRoute` configuration) +The method resolves pathnames the same way browsers do when resolving a `<a href>` value. The provided `url` can be: - an absolute URL - an absolute path - a path relative to the current URL (window.location.href) + +If all these criteria are true for the given URL: - (only for absolute URLs) The origin of the URL matches the origin of the browser's current location - The resolved pathname of the provided URL/path starts with the current basePath (eg. /mybasepath/s/my-space) - The pathname segment after the basePath matches any known application route (eg. /app/<id>/ or any application's `appRoute` configuration) Then a SPA navigation will be performed using `navigateToApp` using the corresponding application and path. Otherwise, fallback to a full page reload to navigate to the url using `window.location.assign` @@ -20,7 +22,7 @@ navigateToUrl(url: string): Promise<void>; | Parameter | Type | Description | | --- | --- | --- | -| url | <code>string</code> | an absolute url, or a relative path, to navigate to. | +| url | <code>string</code> | an absolute URL, an absolute path or a relative path, to navigate to. | <b>Returns:</b> @@ -35,11 +37,14 @@ navigateToUrl(url: string): Promise<void>; // will call `application.navigateToApp('discover', { path: '/some-path?foo=bar'})` application.navigateToUrl('https://kibana:8080/base-path/s/my-space/app/discover/some-path?foo=bar') application.navigateToUrl('/base-path/s/my-space/app/discover/some-path?foo=bar') +application.navigateToUrl('./discover/some-path?foo=bar') // will perform a full page reload using `window.location.assign` application.navigateToUrl('https://elsewhere:8080/base-path/s/my-space/app/discover/some-path') // origin does not match application.navigateToUrl('/app/discover/some-path') // does not include the current basePath application.navigateToUrl('/base-path/s/my-space/app/unknown-app/some-path') // unknown application +application.navigateToUrl('../discover') // resolve to `/base-path/s/my-space/discover` which is not a path of a known app. +application.navigateToUrl('../../other-space/discover') // resolve to `/base-path/s/other-space/discover` which is not within the current basePath. ``` diff --git a/packages/kbn-std/src/index.ts b/packages/kbn-std/src/index.ts index 7cf70a0e28e2c..d9d3ec4b0d52b 100644 --- a/packages/kbn-std/src/index.ts +++ b/packages/kbn-std/src/index.ts @@ -24,6 +24,6 @@ export { mapToObject } from './map_to_object'; export { merge } from './merge'; export { pick } from './pick'; export { withTimeout } from './promise'; -export { isRelativeUrl, modifyUrl, URLMeaningfulParts } from './url'; +export { isRelativeUrl, modifyUrl, getUrlOrigin, URLMeaningfulParts } from './url'; export { unset } from './unset'; export { getFlattenedObject } from './get_flattened_object'; diff --git a/packages/kbn-std/src/url.test.ts b/packages/kbn-std/src/url.test.ts index 7e9b6adfd3f49..4d5c5a1808c55 100644 --- a/packages/kbn-std/src/url.test.ts +++ b/packages/kbn-std/src/url.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { modifyUrl, isRelativeUrl } from './url'; +import { modifyUrl, isRelativeUrl, getUrlOrigin } from './url'; describe('modifyUrl()', () => { test('throws an error with invalid input', () => { @@ -83,3 +83,27 @@ describe('isRelativeUrl()', () => { expect(isRelativeUrl(' //evil.com')).toBe(false); }); }); + +describe('getOrigin', () => { + describe('when passing an absolute url', () => { + it('return origin without port when the url does not have a port', () => { + expect(getUrlOrigin('https://example.com/file/to/path?example')).toEqual( + 'https://example.com' + ); + }); + it('return origin with port when the url does have a port', () => { + expect(getUrlOrigin('http://example.com:80/path/to/file')).toEqual('http://example.com:80'); + }); + }); + describe('when passing a non absolute url', () => { + it('returns null for relative url', () => { + expect(getUrlOrigin('./path/to/file')).toBeNull(); + }); + it('returns null for absolute path', () => { + expect(getUrlOrigin('/path/to/file')).toBeNull(); + }); + it('returns null for empty url', () => { + expect(getUrlOrigin('')).toBeNull(); + }); + }); +}); diff --git a/packages/kbn-std/src/url.ts b/packages/kbn-std/src/url.ts index edcdebbd2bc81..745ed05751b10 100644 --- a/packages/kbn-std/src/url.ts +++ b/packages/kbn-std/src/url.ts @@ -125,3 +125,14 @@ export function isRelativeUrl(candidatePath: string) { } return true; } + +/** + * Returns the origin (protocol + host + port) from given `url` if `url` is a valid absolute url, or null otherwise + */ +export function getUrlOrigin(url: string): string | null { + const obj = parseUrl(url); + if (!obj.protocol && !obj.hostname) { + return null; + } + return `${obj.protocol}//${obj.hostname}${obj.port ? `:${obj.port}` : ''}`; +} diff --git a/src/core/public/application/types.ts b/src/core/public/application/types.ts index df83b6e932aad..02d2d3a52a01a 100644 --- a/src/core/public/application/types.ts +++ b/src/core/public/application/types.ts @@ -710,11 +710,17 @@ export interface ApplicationStart { navigateToApp(appId: string, options?: NavigateToAppOptions): Promise<void>; /** - * Navigate to given url, which can either be an absolute url or a relative path, in a SPA friendly way when possible. + * Navigate to given URL in a SPA friendly way when possible (when the URL will redirect to a valid application + * within the current basePath). * - * If all these criteria are true for the given url: + * The method resolves pathnames the same way browsers do when resolving a `<a href>` value. The provided `url` can be: + * - an absolute URL + * - an absolute path + * - a path relative to the current URL (window.location.href) + * + * If all these criteria are true for the given URL: * - (only for absolute URLs) The origin of the URL matches the origin of the browser's current location - * - The pathname of the URL starts with the current basePath (eg. /mybasepath/s/my-space) + * - The resolved pathname of the provided URL/path starts with the current basePath (eg. /mybasepath/s/my-space) * - The pathname segment after the basePath matches any known application route (eg. /app/<id>/ or any application's `appRoute` configuration) * * Then a SPA navigation will be performed using `navigateToApp` using the corresponding application and path. @@ -727,23 +733,27 @@ export interface ApplicationStart { * // will call `application.navigateToApp('discover', { path: '/some-path?foo=bar'})` * application.navigateToUrl('https://kibana:8080/base-path/s/my-space/app/discover/some-path?foo=bar') * application.navigateToUrl('/base-path/s/my-space/app/discover/some-path?foo=bar') + * application.navigateToUrl('./discover/some-path?foo=bar') * * // will perform a full page reload using `window.location.assign` * application.navigateToUrl('https://elsewhere:8080/base-path/s/my-space/app/discover/some-path') // origin does not match * application.navigateToUrl('/app/discover/some-path') // does not include the current basePath * application.navigateToUrl('/base-path/s/my-space/app/unknown-app/some-path') // unknown application + * application.navigateToUrl('../discover') // resolve to `/base-path/s/my-space/discover` which is not a path of a known app. + * application.navigateToUrl('../../other-space/discover') // resolve to `/base-path/s/other-space/discover` which is not within the current basePath. * ``` * - * @param url - an absolute url, or a relative path, to navigate to. + * @param url - an absolute URL, an absolute path or a relative path, to navigate to. */ navigateToUrl(url: string): Promise<void>; /** - * Returns an URL to a given app, including the global base path. - * By default, the URL is relative (/basePath/app/my-app). - * Use the `absolute` option to generate an absolute url (http://host:port/basePath/app/my-app) + * Returns the absolute path (or URL) to a given app, including the global base path. + * + * By default, it returns the absolute path of the application (e.g `/basePath/app/my-app`). + * Use the `absolute` option to generate an absolute url instead (e.g `http://host:port/basePath/app/my-app`) * - * Note that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's location. + * Note that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's current location. * * @param appId * @param options.path - optional path inside application to deep link to diff --git a/src/core/public/application/utils.ts b/src/core/public/application/utils.ts deleted file mode 100644 index 85760526bf544..0000000000000 --- a/src/core/public/application/utils.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IBasePath } from '../http'; -import { App, AppNavLinkStatus, AppStatus, ParsedAppUrl, PublicAppInfo } from './types'; - -/** - * Utility to remove trailing, leading or duplicate slashes. - * By default will only remove duplicates. - */ -export const removeSlashes = ( - url: string, - { - trailing = false, - leading = false, - duplicates = true, - }: { trailing?: boolean; leading?: boolean; duplicates?: boolean } = {} -): string => { - if (duplicates) { - url = url.replace(/\/{2,}/g, '/'); - } - if (trailing) { - url = url.replace(/\/$/, ''); - } - if (leading) { - url = url.replace(/^\//, ''); - } - return url; -}; - -export const appendAppPath = (appBasePath: string, path: string = '') => { - // Only prepend slash if not a hash or query path - path = path === '' || path.startsWith('#') || path.startsWith('?') ? path : `/${path}`; - // Do not remove trailing slash when in hashbang or basePath - const removeTrailing = path.indexOf('#') === -1 && appBasePath.indexOf('#') === -1; - return removeSlashes(`${appBasePath}${path}`, { - trailing: removeTrailing, - duplicates: true, - leading: false, - }); -}; - -/** - * Converts a relative path to an absolute url. - * Implementation is based on a specified behavior of the browser to automatically convert - * a relative url to an absolute one when setting the `href` attribute of a `<a>` html element. - * - * @example - * ```ts - * // current url: `https://kibana:8000/base-path/app/my-app` - * relativeToAbsolute('/base-path/app/another-app') => `https://kibana:8000/base-path/app/another-app` - * ``` - */ -export const relativeToAbsolute = (url: string): string => { - const a = document.createElement('a'); - a.setAttribute('href', url); - return a.href; -}; - -/** - * Parse given url and return the associated app id and path if any app matches. - * Input can either be: - * - a path containing the basePath, ie `/base-path/app/my-app/some-path` - * - an absolute url matching the `origin` of the kibana instance (as seen by the browser), - * i.e `https://kibana:8080/base-path/app/my-app/some-path` - */ -export const parseAppUrl = ( - url: string, - basePath: IBasePath, - apps: Map<string, App<unknown>>, - getOrigin: () => string = () => window.location.origin -): ParsedAppUrl | undefined => { - url = removeBasePath(url, basePath, getOrigin()); - if (!url.startsWith('/')) { - return undefined; - } - - for (const app of apps.values()) { - const appPath = app.appRoute || `/app/${app.id}`; - - if (url.startsWith(appPath)) { - const path = url.substr(appPath.length); - return { - app: app.id, - path: path.length ? path : undefined, - }; - } - } -}; - -const removeBasePath = (url: string, basePath: IBasePath, origin: string): string => { - if (url.startsWith(origin)) { - url = url.substring(origin.length); - } - return basePath.remove(url); -}; - -export function getAppInfo(app: App<unknown>): PublicAppInfo { - const navLinkStatus = - app.navLinkStatus === AppNavLinkStatus.default - ? app.status === AppStatus.inaccessible - ? AppNavLinkStatus.hidden - : AppNavLinkStatus.visible - : app.navLinkStatus!; - const { updater$, mount, ...infos } = app; - return { - ...infos, - status: app.status!, - navLinkStatus, - appRoute: app.appRoute!, - }; -} diff --git a/src/core/public/application/utils/append_app_path.test.ts b/src/core/public/application/utils/append_app_path.test.ts new file mode 100644 index 0000000000000..a153b5753bbe2 --- /dev/null +++ b/src/core/public/application/utils/append_app_path.test.ts @@ -0,0 +1,40 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { appendAppPath } from './append_app_path'; + +describe('appendAppPath', () => { + it('appends the appBasePath with given path', () => { + expect(appendAppPath('/app/my-app', '/some-path')).toEqual('/app/my-app/some-path'); + expect(appendAppPath('/app/my-app/', 'some-path')).toEqual('/app/my-app/some-path'); + expect(appendAppPath('/app/my-app', 'some-path')).toEqual('/app/my-app/some-path'); + expect(appendAppPath('/app/my-app', '')).toEqual('/app/my-app'); + }); + + it('preserves the trailing slash only if included in the hash or appPath', () => { + expect(appendAppPath('/app/my-app', '/some-path/')).toEqual('/app/my-app/some-path'); + expect(appendAppPath('/app/my-app', '/some-path#/')).toEqual('/app/my-app/some-path#/'); + expect(appendAppPath('/app/my-app#/', '')).toEqual('/app/my-app#/'); + expect(appendAppPath('/app/my-app#', '/')).toEqual('/app/my-app#/'); + expect(appendAppPath('/app/my-app', '/some-path#/hash/')).toEqual( + '/app/my-app/some-path#/hash/' + ); + expect(appendAppPath('/app/my-app', '/some-path#/hash')).toEqual('/app/my-app/some-path#/hash'); + }); +}); diff --git a/src/core/public/application/utils/append_app_path.ts b/src/core/public/application/utils/append_app_path.ts new file mode 100644 index 0000000000000..70cb4a44c648e --- /dev/null +++ b/src/core/public/application/utils/append_app_path.ts @@ -0,0 +1,32 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { removeSlashes } from './remove_slashes'; + +export const appendAppPath = (appBasePath: string, path: string = '') => { + // Only prepend slash if not a hash or query path + path = path === '' || path.startsWith('#') || path.startsWith('?') ? path : `/${path}`; + // Do not remove trailing slash when in hashbang or basePath + const removeTrailing = path.indexOf('#') === -1 && appBasePath.indexOf('#') === -1; + return removeSlashes(`${appBasePath}${path}`, { + trailing: removeTrailing, + duplicates: true, + leading: false, + }); +}; diff --git a/src/core/public/application/utils/get_app_info.test.ts b/src/core/public/application/utils/get_app_info.test.ts new file mode 100644 index 0000000000000..055f7d1a5ada9 --- /dev/null +++ b/src/core/public/application/utils/get_app_info.test.ts @@ -0,0 +1,75 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { of } from 'rxjs'; +import { App, AppNavLinkStatus, AppStatus } from '../types'; +import { getAppInfo } from './get_app_info'; + +describe('getAppInfo', () => { + const createApp = (props: Partial<App> = {}): App => ({ + mount: () => () => undefined, + updater$: of(() => undefined), + id: 'some-id', + title: 'some-title', + status: AppStatus.accessible, + navLinkStatus: AppNavLinkStatus.default, + appRoute: `/app/some-id`, + ...props, + }); + + it('converts an application and remove sensitive properties', () => { + const app = createApp(); + const info = getAppInfo(app); + + expect(info).toEqual({ + id: 'some-id', + title: 'some-title', + status: AppStatus.accessible, + navLinkStatus: AppNavLinkStatus.visible, + appRoute: `/app/some-id`, + }); + }); + + it('computes the navLinkStatus depending on the app status', () => { + expect( + getAppInfo( + createApp({ + navLinkStatus: AppNavLinkStatus.default, + status: AppStatus.inaccessible, + }) + ) + ).toEqual( + expect.objectContaining({ + navLinkStatus: AppNavLinkStatus.hidden, + }) + ); + expect( + getAppInfo( + createApp({ + navLinkStatus: AppNavLinkStatus.default, + status: AppStatus.accessible, + }) + ) + ).toEqual( + expect.objectContaining({ + navLinkStatus: AppNavLinkStatus.visible, + }) + ); + }); +}); diff --git a/src/core/public/application/utils/get_app_info.ts b/src/core/public/application/utils/get_app_info.ts new file mode 100644 index 0000000000000..71cd8a3e14929 --- /dev/null +++ b/src/core/public/application/utils/get_app_info.ts @@ -0,0 +1,36 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { App, AppNavLinkStatus, AppStatus, PublicAppInfo } from '../types'; + +export function getAppInfo(app: App<unknown>): PublicAppInfo { + const navLinkStatus = + app.navLinkStatus === AppNavLinkStatus.default + ? app.status === AppStatus.inaccessible + ? AppNavLinkStatus.hidden + : AppNavLinkStatus.visible + : app.navLinkStatus!; + const { updater$, mount, ...infos } = app; + return { + ...infos, + status: app.status!, + navLinkStatus, + appRoute: app.appRoute!, + }; +} diff --git a/src/core/public/application/utils/index.ts b/src/core/public/application/utils/index.ts new file mode 100644 index 0000000000000..3b8a34df8c50d --- /dev/null +++ b/src/core/public/application/utils/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { appendAppPath } from './append_app_path'; +export { getAppInfo } from './get_app_info'; +export { parseAppUrl } from './parse_app_url'; +export { relativeToAbsolute } from './relative_to_absolute'; +export { removeSlashes } from './remove_slashes'; diff --git a/src/core/public/application/utils.test.ts b/src/core/public/application/utils/parse_app_url.test.ts similarity index 58% rename from src/core/public/application/utils.test.ts rename to src/core/public/application/utils/parse_app_url.test.ts index ee1d82a7a872e..bf7e0a88a0742 100644 --- a/src/core/public/application/utils.test.ts +++ b/src/core/public/application/utils/parse_app_url.test.ts @@ -17,78 +17,16 @@ * under the License. */ -import { of } from 'rxjs'; -import { App, AppNavLinkStatus, AppStatus } from './types'; -import { BasePath } from '../http/base_path'; -import { appendAppPath, getAppInfo, parseAppUrl, relativeToAbsolute, removeSlashes } from './utils'; - -describe('removeSlashes', () => { - it('only removes duplicates by default', () => { - expect(removeSlashes('/some//url//to//')).toEqual('/some/url/to/'); - expect(removeSlashes('some/////other//url')).toEqual('some/other/url'); - }); - - it('remove trailing slash when `trailing` is true', () => { - expect(removeSlashes('/some//url//to//', { trailing: true })).toEqual('/some/url/to'); - }); - - it('remove leading slash when `leading` is true', () => { - expect(removeSlashes('/some//url//to//', { leading: true })).toEqual('some/url/to/'); - }); - - it('does not removes duplicates when `duplicates` is false', () => { - expect(removeSlashes('/some//url//to/', { leading: true, duplicates: false })).toEqual( - 'some//url//to/' - ); - expect(removeSlashes('/some//url//to/', { trailing: true, duplicates: false })).toEqual( - '/some//url//to' - ); - }); - - it('accept mixed options', () => { - expect( - removeSlashes('/some//url//to/', { leading: true, duplicates: false, trailing: true }) - ).toEqual('some//url//to'); - expect( - removeSlashes('/some//url//to/', { leading: true, duplicates: true, trailing: true }) - ).toEqual('some/url/to'); - }); -}); - -describe('appendAppPath', () => { - it('appends the appBasePath with given path', () => { - expect(appendAppPath('/app/my-app', '/some-path')).toEqual('/app/my-app/some-path'); - expect(appendAppPath('/app/my-app/', 'some-path')).toEqual('/app/my-app/some-path'); - expect(appendAppPath('/app/my-app', 'some-path')).toEqual('/app/my-app/some-path'); - expect(appendAppPath('/app/my-app', '')).toEqual('/app/my-app'); - }); - - it('preserves the trailing slash only if included in the hash or appPath', () => { - expect(appendAppPath('/app/my-app', '/some-path/')).toEqual('/app/my-app/some-path'); - expect(appendAppPath('/app/my-app', '/some-path#/')).toEqual('/app/my-app/some-path#/'); - expect(appendAppPath('/app/my-app#/', '')).toEqual('/app/my-app#/'); - expect(appendAppPath('/app/my-app#', '/')).toEqual('/app/my-app#/'); - expect(appendAppPath('/app/my-app', '/some-path#/hash/')).toEqual( - '/app/my-app/some-path#/hash/' - ); - expect(appendAppPath('/app/my-app', '/some-path#/hash')).toEqual('/app/my-app/some-path#/hash'); - }); -}); - -describe('relativeToAbsolute', () => { - it('converts a relative path to an absolute url', () => { - const origin = window.location.origin; - expect(relativeToAbsolute('path')).toEqual(`${origin}/path`); - expect(relativeToAbsolute('/path#hash')).toEqual(`${origin}/path#hash`); - expect(relativeToAbsolute('/path?query=foo')).toEqual(`${origin}/path?query=foo`); - }); -}); +import { App } from '../types'; +import { BasePath } from '../../http/base_path'; +import { parseAppUrl } from './parse_app_url'; describe('parseAppUrl', () => { let apps: Map<string, App<any>>; let basePath: BasePath; - const getOrigin = () => 'https://kibana.local:8080'; + const currentUrl = + 'https://kibana.local:8080/base-path/app/current/current-path?current-query=true'; const createApp = (props: Partial<App>): App => { const app: App = { @@ -114,101 +52,178 @@ describe('parseAppUrl', () => { }); }); - describe('with relative paths', () => { + describe('with absolute paths', () => { it('parses the app id', () => { - expect(parseAppUrl('/base-path/app/foo', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/app/foo', basePath, apps, currentUrl)).toEqual({ app: 'foo', path: undefined, }); - expect(parseAppUrl('/base-path/custom-bar', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/custom-bar', basePath, apps, currentUrl)).toEqual({ app: 'bar', path: undefined, }); }); it('parses the path', () => { - expect(parseAppUrl('/base-path/app/foo/some/path', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/app/foo/some/path', basePath, apps, currentUrl)).toEqual({ app: 'foo', path: '/some/path', }); - expect(parseAppUrl('/base-path/custom-bar/another/path/', basePath, apps, getOrigin)).toEqual( - { - app: 'bar', - path: '/another/path/', - } - ); + expect( + parseAppUrl('/base-path/custom-bar/another/path/', basePath, apps, currentUrl) + ).toEqual({ + app: 'bar', + path: '/another/path/', + }); }); it('includes query and hash in the path for default app route', () => { - expect(parseAppUrl('/base-path/app/foo#hash/bang', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/app/foo#hash/bang', basePath, apps, currentUrl)).toEqual({ app: 'foo', path: '#hash/bang', }); - expect(parseAppUrl('/base-path/app/foo?hello=dolly', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/app/foo?hello=dolly', basePath, apps, currentUrl)).toEqual({ app: 'foo', path: '?hello=dolly', }); - expect(parseAppUrl('/base-path/app/foo/path?hello=dolly', basePath, apps, getOrigin)).toEqual( - { - app: 'foo', - path: '/path?hello=dolly', - } - ); - expect(parseAppUrl('/base-path/app/foo/path#hash/bang', basePath, apps, getOrigin)).toEqual({ + expect( + parseAppUrl('/base-path/app/foo/path?hello=dolly', basePath, apps, currentUrl) + ).toEqual({ + app: 'foo', + path: '/path?hello=dolly', + }); + expect(parseAppUrl('/base-path/app/foo/path#hash/bang', basePath, apps, currentUrl)).toEqual({ app: 'foo', path: '/path#hash/bang', }); expect( - parseAppUrl('/base-path/app/foo/path#hash/bang?hello=dolly', basePath, apps, getOrigin) + parseAppUrl('/base-path/app/foo/path#hash/bang?hello=dolly', basePath, apps, currentUrl) ).toEqual({ app: 'foo', path: '/path#hash/bang?hello=dolly', }); }); it('includes query and hash in the path for custom app route', () => { - expect(parseAppUrl('/base-path/custom-bar#hash/bang', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/custom-bar#hash/bang', basePath, apps, currentUrl)).toEqual({ app: 'bar', path: '#hash/bang', }); - expect(parseAppUrl('/base-path/custom-bar?hello=dolly', basePath, apps, getOrigin)).toEqual({ + expect(parseAppUrl('/base-path/custom-bar?hello=dolly', basePath, apps, currentUrl)).toEqual({ app: 'bar', path: '?hello=dolly', }); expect( - parseAppUrl('/base-path/custom-bar/path?hello=dolly', basePath, apps, getOrigin) + parseAppUrl('/base-path/custom-bar/path?hello=dolly', basePath, apps, currentUrl) ).toEqual({ app: 'bar', path: '/path?hello=dolly', }); expect( - parseAppUrl('/base-path/custom-bar/path#hash/bang', basePath, apps, getOrigin) + parseAppUrl('/base-path/custom-bar/path#hash/bang', basePath, apps, currentUrl) ).toEqual({ app: 'bar', path: '/path#hash/bang', }); expect( - parseAppUrl('/base-path/custom-bar/path#hash/bang?hello=dolly', basePath, apps, getOrigin) + parseAppUrl('/base-path/custom-bar/path#hash/bang?hello=dolly', basePath, apps, currentUrl) ).toEqual({ app: 'bar', path: '/path#hash/bang?hello=dolly', }); }); it('returns undefined when the app is not known', () => { - expect(parseAppUrl('/base-path/app/non-registered', basePath, apps, getOrigin)).toEqual( + expect(parseAppUrl('/base-path/app/non-registered', basePath, apps, currentUrl)).toEqual( undefined ); - expect(parseAppUrl('/base-path/unknown-path', basePath, apps, getOrigin)).toEqual(undefined); + expect(parseAppUrl('/base-path/unknown-path', basePath, apps, currentUrl)).toEqual(undefined); + }); + it('returns undefined when the path does not start with the base path', () => { + expect(parseAppUrl('/app/foo', basePath, apps, currentUrl)).toBeUndefined(); + }); + }); + + describe('with relative paths', () => { + it('works with sibling relative urls', () => { + expect( + parseAppUrl('./foo', basePath, apps, 'https://kibana.local:8080/base-path/app/current') + ).toEqual({ + app: 'foo', + path: undefined, + }); + }); + it('works with parent relative urls', () => { + expect( + parseAppUrl( + '../custom-bar', + basePath, + apps, + 'https://kibana.local:8080/base-path/app/current' + ) + ).toEqual({ + app: 'bar', + path: undefined, + }); + }); + it('works with nested parents', () => { + expect( + parseAppUrl( + '../../custom-bar', + basePath, + apps, + 'https://kibana.local:8080/base-path/app/current/some-path' + ) + ).toEqual({ + app: 'bar', + path: undefined, + }); + }); + it('parses the path', () => { + expect( + parseAppUrl( + './foo/path?hello=dolly', + basePath, + apps, + 'https://kibana.local:8080/base-path/app/current' + ) + ).toEqual({ + app: 'foo', + path: '/path?hello=dolly', + }); + }); + it('parses the path with query and hash', () => { + expect( + parseAppUrl( + '../custom-bar/path#hash?hello=dolly', + basePath, + apps, + 'https://kibana.local:8080/base-path/app/current' + ) + ).toEqual({ + app: 'bar', + path: '/path#hash?hello=dolly', + }); + }); + + it('returns undefined if the relative path redirect outside of the basePath', () => { + expect( + parseAppUrl( + '../../custom-bar', + basePath, + apps, + 'https://kibana.local:8080/base-path/app/current' + ) + ).toBeUndefined(); }); }); describe('with absolute urls', () => { it('parses the app id', () => { expect( - parseAppUrl('https://kibana.local:8080/base-path/app/foo', basePath, apps, getOrigin) + parseAppUrl('https://kibana.local:8080/base-path/app/foo', basePath, apps, currentUrl) ).toEqual({ app: 'foo', path: undefined, }); expect( - parseAppUrl('https://kibana.local:8080/base-path/custom-bar', basePath, apps, getOrigin) + parseAppUrl('https://kibana.local:8080/base-path/custom-bar', basePath, apps, currentUrl) ).toEqual({ app: 'bar', path: undefined, @@ -220,7 +235,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/foo/some/path', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'foo', @@ -231,7 +246,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/custom-bar/another/path/', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'bar', @@ -244,7 +259,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/foo#hash/bang', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'foo', @@ -255,7 +270,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/foo?hello=dolly', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'foo', @@ -266,7 +281,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/foo/path?hello=dolly', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'foo', @@ -277,7 +292,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/foo/path#hash/bang', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'foo', @@ -288,7 +303,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/foo/path#hash/bang?hello=dolly', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'foo', @@ -301,7 +316,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/custom-bar#hash/bang', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'bar', @@ -312,7 +327,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/custom-bar?hello=dolly', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'bar', @@ -323,7 +338,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/custom-bar/path?hello=dolly', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'bar', @@ -334,7 +349,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/custom-bar/path#hash/bang', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'bar', @@ -345,7 +360,7 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/custom-bar/path#hash/bang?hello=dolly', basePath, apps, - getOrigin + currentUrl ) ).toEqual({ app: 'bar', @@ -358,11 +373,11 @@ describe('parseAppUrl', () => { 'https://kibana.local:8080/base-path/app/non-registered', basePath, apps, - getOrigin + currentUrl ) ).toEqual(undefined); expect( - parseAppUrl('https://kibana.local:8080/base-path/unknown-path', basePath, apps, getOrigin) + parseAppUrl('https://kibana.local:8080/base-path/unknown-path', basePath, apps, currentUrl) ).toEqual(undefined); }); it('returns undefined when origin does not match', () => { @@ -371,7 +386,7 @@ describe('parseAppUrl', () => { 'https://other-kibana.external:8080/base-path/app/foo', basePath, apps, - getOrigin + currentUrl ) ).toEqual(undefined); expect( @@ -379,62 +394,14 @@ describe('parseAppUrl', () => { 'https://other-kibana.external:8080/base-path/custom-bar', basePath, apps, - getOrigin + currentUrl ) ).toEqual(undefined); }); - }); -}); - -describe('getAppInfo', () => { - const createApp = (props: Partial<App> = {}): App => ({ - mount: () => () => undefined, - updater$: of(() => undefined), - id: 'some-id', - title: 'some-title', - status: AppStatus.accessible, - navLinkStatus: AppNavLinkStatus.default, - appRoute: `/app/some-id`, - ...props, - }); - - it('converts an application and remove sensitive properties', () => { - const app = createApp(); - const info = getAppInfo(app); - - expect(info).toEqual({ - id: 'some-id', - title: 'some-title', - status: AppStatus.accessible, - navLinkStatus: AppNavLinkStatus.visible, - appRoute: `/app/some-id`, + it('returns undefined when the path does not contain the base path', () => { + expect(parseAppUrl('https://kibana.local:8080/app/foo', basePath, apps, currentUrl)).toEqual( + undefined + ); }); }); - - it('computes the navLinkStatus depending on the app status', () => { - expect( - getAppInfo( - createApp({ - navLinkStatus: AppNavLinkStatus.default, - status: AppStatus.inaccessible, - }) - ) - ).toEqual( - expect.objectContaining({ - navLinkStatus: AppNavLinkStatus.hidden, - }) - ); - expect( - getAppInfo( - createApp({ - navLinkStatus: AppNavLinkStatus.default, - status: AppStatus.accessible, - }) - ) - ).toEqual( - expect.objectContaining({ - navLinkStatus: AppNavLinkStatus.visible, - }) - ); - }); }); diff --git a/src/core/public/application/utils/parse_app_url.ts b/src/core/public/application/utils/parse_app_url.ts new file mode 100644 index 0000000000000..d253129a63ae4 --- /dev/null +++ b/src/core/public/application/utils/parse_app_url.ts @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getUrlOrigin } from '@kbn/std'; +import { resolve } from 'url'; +import { IBasePath } from '../../http'; +import { App, ParsedAppUrl } from '../types'; + +/** + * Parse given URL and return the associated app id and path if any app matches, or undefined if none do. + * Input can either be: + * + * - an absolute path containing the basePath, + * e.g `/base-path/app/my-app/some-path` + * + * - an absolute URL matching the `origin` of the Kibana instance (as seen by the browser), + * e.g `https://kibana:8080/base-path/app/my-app/some-path` + * + * - a path relative to the provided `currentUrl`. + * e.g with `currentUrl` being `https://kibana:8080/base-path/app/current-app/some-path` + * `../other-app/other-path` will be converted to `/base-path/app/other-app/other-path` + */ +export const parseAppUrl = ( + url: string, + basePath: IBasePath, + apps: Map<string, App<unknown>>, + currentUrl: string = window.location.href +): ParsedAppUrl | undefined => { + const currentOrigin = getUrlOrigin(currentUrl); + if (!currentOrigin) { + throw new Error('when manually provided, currentUrl must be valid url with an origin'); + } + const currentPath = currentUrl.substring(currentOrigin.length); + + // remove the origin from the given url + if (url.startsWith(currentOrigin)) { + url = url.substring(currentOrigin.length); + } + + // if the path is relative (i.e `../../to/somewhere`), we convert it to absolute + if (!url.startsWith('/')) { + url = resolve(currentPath, url); + } + + // if using a basePath and the absolute path does not starts with it, it can't be a match + const basePathValue = basePath.get(); + if (basePathValue && !url.startsWith(basePathValue)) { + return undefined; + } + + url = basePath.remove(url); + if (!url.startsWith('/')) { + return undefined; + } + + for (const app of apps.values()) { + const appPath = app.appRoute || `/app/${app.id}`; + + if (url.startsWith(appPath)) { + const path = url.substr(appPath.length); + return { + app: app.id, + path: path.length ? path : undefined, + }; + } + } +}; diff --git a/src/core/public/application/utils/relative_to_absolute.test.ts b/src/core/public/application/utils/relative_to_absolute.test.ts new file mode 100644 index 0000000000000..56a33450ce902 --- /dev/null +++ b/src/core/public/application/utils/relative_to_absolute.test.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { relativeToAbsolute } from './relative_to_absolute'; + +describe('relativeToAbsolute', () => { + it('converts a relative path to an absolute url', () => { + const origin = window.location.origin; + expect(relativeToAbsolute('path')).toEqual(`${origin}/path`); + expect(relativeToAbsolute('/path#hash')).toEqual(`${origin}/path#hash`); + expect(relativeToAbsolute('/path?query=foo')).toEqual(`${origin}/path?query=foo`); + }); +}); diff --git a/src/core/public/application/utils/relative_to_absolute.ts b/src/core/public/application/utils/relative_to_absolute.ts new file mode 100644 index 0000000000000..0f24f754f56cd --- /dev/null +++ b/src/core/public/application/utils/relative_to_absolute.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Converts a relative path to an absolute url. + * Implementation is based on a specified behavior of the browser to automatically convert + * a relative url to an absolute one when setting the `href` attribute of a `<a>` html element. + * + * @example + * ```ts + * // current url: `https://kibana:8000/base-path/app/my-app` + * relativeToAbsolute('/base-path/app/another-app') => `https://kibana:8000/base-path/app/another-app` + * ``` + */ +export const relativeToAbsolute = (url: string): string => { + const a = document.createElement('a'); + a.setAttribute('href', url); + return a.href; +}; diff --git a/src/core/public/application/utils/remove_slashes.test.ts b/src/core/public/application/utils/remove_slashes.test.ts new file mode 100644 index 0000000000000..719e1ea08d109 --- /dev/null +++ b/src/core/public/application/utils/remove_slashes.test.ts @@ -0,0 +1,53 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { removeSlashes } from './remove_slashes'; + +describe('removeSlashes', () => { + it('only removes duplicates by default', () => { + expect(removeSlashes('/some//url//to//')).toEqual('/some/url/to/'); + expect(removeSlashes('some/////other//url')).toEqual('some/other/url'); + }); + + it('remove trailing slash when `trailing` is true', () => { + expect(removeSlashes('/some//url//to//', { trailing: true })).toEqual('/some/url/to'); + }); + + it('remove leading slash when `leading` is true', () => { + expect(removeSlashes('/some//url//to//', { leading: true })).toEqual('some/url/to/'); + }); + + it('does not removes duplicates when `duplicates` is false', () => { + expect(removeSlashes('/some//url//to/', { leading: true, duplicates: false })).toEqual( + 'some//url//to/' + ); + expect(removeSlashes('/some//url//to/', { trailing: true, duplicates: false })).toEqual( + '/some//url//to' + ); + }); + + it('accept mixed options', () => { + expect( + removeSlashes('/some//url//to/', { leading: true, duplicates: false, trailing: true }) + ).toEqual('some//url//to'); + expect( + removeSlashes('/some//url//to/', { leading: true, duplicates: true, trailing: true }) + ).toEqual('some/url/to'); + }); +}); diff --git a/src/core/public/application/utils/remove_slashes.ts b/src/core/public/application/utils/remove_slashes.ts new file mode 100644 index 0000000000000..641d7bc4164f4 --- /dev/null +++ b/src/core/public/application/utils/remove_slashes.ts @@ -0,0 +1,42 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Utility to remove trailing, leading or duplicate slashes. + * By default will only remove duplicates. + */ +export const removeSlashes = ( + url: string, + { + trailing = false, + leading = false, + duplicates = true, + }: { trailing?: boolean; leading?: boolean; duplicates?: boolean } = {} +): string => { + if (duplicates) { + url = url.replace(/\/{2,}/g, '/'); + } + if (trailing) { + url = url.replace(/\/$/, ''); + } + if (leading) { + url = url.replace(/^\//, ''); + } + return url; +}; diff --git a/src/core/public/http/base_path.ts b/src/core/public/http/base_path.ts index 5d9eb51023b78..78e9cf75ff806 100644 --- a/src/core/public/http/base_path.ts +++ b/src/core/public/http/base_path.ts @@ -16,24 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ import { modifyUrl } from '@kbn/std'; From e4b2b610a6d10df5239a9830c8fdec66456e9175 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2020 18:20:19 +0300 Subject: [PATCH 45/64] Update dependency vega to ^5.17.0 (#79088) Co-authored-by: Renovate Bot <bot@renovateapp.com> --- package.json | 2 +- yarn.lock | 32 ++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index e70b0386bf5e7..864954e63f7e1 100644 --- a/package.json +++ b/package.json @@ -478,7 +478,7 @@ "tree-kill": "^1.2.2", "typescript": "4.0.2", "ui-select": "0.19.8", - "vega": "^5.16.1", + "vega": "^5.17.0", "vega-lite": "^4.16.8", "vega-schema-url-parser": "^2.1.0", "vega-tooltip": "^0.24.2", diff --git a/yarn.lock b/yarn.lock index c84e43942e3cd..399cc80a557d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30355,7 +30355,7 @@ vega-lite@^4.16.8: vega-util "~1.15.3" yargs "~16.0.3" -vega-loader@^4.3.2, vega-loader@^4.3.3, vega-loader@~4.3.3: +vega-loader@^4.3.2, vega-loader@^4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.3.3.tgz#1432dabae4dd7ab344f84c5ae6e250234e9c1005" integrity sha512-ZcAMi6C7yfbA3gpxDnFe3PvsP/jcDwUjgPIpZ2IYsaQS+JijZAj5g3i4mpQCao0Atc+C/g7htg0Ir3twFLPjkQ== @@ -30366,6 +30366,17 @@ vega-loader@^4.3.2, vega-loader@^4.3.3, vega-loader@~4.3.3: vega-format "^1.0.4" vega-util "^1.15.2" +vega-loader@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.4.0.tgz#fc515b7368c46b2be8df1fcf3c35c696c13c453d" + integrity sha512-e5enQECdau7rJob0NFB5pGumh3RaaSWWm90+boxMy3ay2b4Ki/3XIvo+C4F1Lx04qSxvQF7tO2LJcklRm6nqRA== + dependencies: + d3-dsv "^2.0.0" + node-fetch "^2.6.1" + topojson-client "^3.1.0" + vega-format "^1.0.4" + vega-util "^1.16.0" + vega-parser@~6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-6.1.0.tgz#485fb6fcd79d14b09efee340e2b55fb510e57e20" @@ -30485,11 +30496,16 @@ vega-typings@~0.19.0: dependencies: vega-util "^1.15.2" -vega-util@^1.15.2, vega-util@~1.15.2, vega-util@~1.15.3: +vega-util@^1.15.2, vega-util@~1.15.3: version "1.15.3" resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.15.3.tgz#b42b4fb11f32fbb57fb5cd116d4d3e1827d177aa" integrity sha512-NCbfCPMVgdP4geLrFtCDN9PTEXrgZgJBBLvpyos7HGv2xSe9bGjDCysv6qcueHrc1myEeCQzrHDFaShny6wXDg== +vega-util@^1.16.0, vega-util@~1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.16.0.tgz#77405d8df0a94944d106bdc36015f0d43aa2caa3" + integrity sha512-6mmz6mI+oU4zDMeKjgvE2Fjz0Oh6zo6WGATcvCfxH2gXBzhBHmy5d25uW5Zjnkc6QBXSWPLV9Xa6SiqMsrsKog== + vega-view-transforms@~4.5.8: version "4.5.8" resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.5.8.tgz#c8dc42c3c7d4aa725d40b8775180c9f23bc98f4e" @@ -30533,10 +30549,10 @@ vega-wordcloud@~4.1.3: vega-statistics "^1.7.9" vega-util "^1.15.2" -vega@^5.16.1: - version "5.16.1" - resolved "https://registry.yarnpkg.com/vega/-/vega-5.16.1.tgz#76a794c28118b685e8578a8f9944c5e239dbe1cd" - integrity sha512-bqovD23iKvIgFnTkP9WqapJbaejhgdED6YjAVWIwG8hsDq5Lf/ZNstJJWPiSDu3j785GQU/o6ZU3RXywdH4dJA== +vega@^5.17.0: + version "5.17.0" + resolved "https://registry.yarnpkg.com/vega/-/vega-5.17.0.tgz#2b33296e257c97b79ee6501d4d1905fb1414d080" + integrity sha512-2Rm9aS3cSMXE55YgjfkuOmvSBMtiM/85/qX/WHLc+YiJacKGiwY9yzeC+w2Ft50JUs3nKZc1KB90ePgf5mfo0Q== dependencies: vega-crossfilter "~4.0.5" vega-dataflow "~5.7.3" @@ -30549,7 +30565,7 @@ vega@^5.16.1: vega-geo "~4.3.7" vega-hierarchy "~4.0.9" vega-label "~1.0.0" - vega-loader "~4.3.3" + vega-loader "~4.4.0" vega-parser "~6.1.0" vega-projection "~1.4.5" vega-regression "~1.0.9" @@ -30560,7 +30576,7 @@ vega@^5.16.1: vega-time "~2.0.4" vega-transforms "~4.9.3" vega-typings "~0.19.0" - vega-util "~1.15.2" + vega-util "~1.16.0" vega-view "~5.9.0" vega-view-transforms "~4.5.8" vega-voronoi "~4.1.5" From 72a41ab03d19f885792b874706589819f2f73f73 Mon Sep 17 00:00:00 2001 From: Nick Peihl <nick.peihl@elastic.co> Date: Thu, 1 Oct 2020 08:20:45 -0700 Subject: [PATCH 46/64] Update EMS landing page link (#78515) Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- src/plugins/maps_legacy/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/maps_legacy/config.ts b/src/plugins/maps_legacy/config.ts index 46d4a8fb6cb90..f49d56dedd45f 100644 --- a/src/plugins/maps_legacy/config.ts +++ b/src/plugins/maps_legacy/config.ts @@ -29,7 +29,7 @@ export const configSchema = schema.object({ manifestServiceUrl: schema.string({ defaultValue: '' }), emsFileApiUrl: schema.string({ defaultValue: 'https://vector.maps.elastic.co' }), emsTileApiUrl: schema.string({ defaultValue: 'https://tiles.maps.elastic.co' }), - emsLandingPageUrl: schema.string({ defaultValue: 'https://maps.elastic.co/v7.7' }), + emsLandingPageUrl: schema.string({ defaultValue: 'https://maps.elastic.co/v7.10' }), emsFontLibraryUrl: schema.string({ defaultValue: 'https://tiles.maps.elastic.co/fonts/{fontstack}/{range}.pbf', }), From e83144ee405517ae089b785ea0a351ee66b8cf56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= <mikecote@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:22:08 -0400 Subject: [PATCH 47/64] Fix alert add and edit flyout to not close when user clicks outside (#78860) --- .../public/application/sections/alert_form/alert_add.tsx | 1 - .../public/application/sections/alert_form/alert_edit.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx index 97dcfec5ed3c6..7b81298e8e4b6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx @@ -138,7 +138,6 @@ export const AlertAdd = ({ aria-labelledby="flyoutAlertAddTitle" size="m" maxWidth={620} - ownFocus > <EuiFlyoutHeader hasBorder> <EuiTitle size="s" data-test-subj="addAlertFlyoutTitle"> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx index f991cea9c009c..999873a650f07 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx @@ -107,7 +107,6 @@ export const AlertEdit = ({ initialAlert, onClose }: AlertEditProps) => { aria-labelledby="flyoutAlertEditTitle" size="m" maxWidth={620} - ownFocus > <EuiFlyoutHeader hasBorder> <EuiTitle size="s" data-test-subj="editAlertFlyoutTitle"> From 758f537708d96a870286850f526a5e94e9e68eee Mon Sep 17 00:00:00 2001 From: Tyler Smalley <tyler.smalley@elastic.co> Date: Thu, 1 Oct 2020 08:24:31 -0700 Subject: [PATCH 48/64] [docs] Fixes wording in backport policy (#79132) Signed-off-by: Tyler Smalley <tyler.smalley@elastic.co> --- docs/developer/contributing/development-github.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/contributing/development-github.asciidoc b/docs/developer/contributing/development-github.asciidoc index 84f51843098a7..c5a3d942f2af3 100644 --- a/docs/developer/contributing/development-github.asciidoc +++ b/docs/developer/contributing/development-github.asciidoc @@ -25,7 +25,7 @@ Pull requests are made into the `master` branch and then backported when it is s * Breaking changes do not get backported and only go into `master`. * All non-breaking changes can be backported to the `<major>.x` branch. * Features should not be backported to a `<major>.<minor>` branch. -* Bugs can be backported to a `<major>.<minor>` branch if the changes are safe and appropriate. Safety is a judgment call you make based on factors like the bug's severity, test coverage, confidence in the changes, etc. Your reasoning should be included in the pull request description. +* Bug fixes can be backported to a `<major>.<minor>` branch if the changes are safe and appropriate. Safety is a judgment call you make based on factors like the bug's severity, test coverage, confidence in the changes, etc. Your reasoning should be included in the pull request description. * Documentation changes can be backported to any branch at any time. [discrete] From e59c78c2b1f13058821a3f565359f5f3b7c9c73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= <mikecote@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:24:54 -0400 Subject: [PATCH 49/64] Fix scenario where orphaned API keys can exist when SO operations fail (#78843) * Fix scenario where orphaned API keys can exist * Add test for enable API --- .../alerts/server/alerts_client.test.ts | 67 +++++++++- x-pack/plugins/alerts/server/alerts_client.ts | 125 ++++++++++-------- 2 files changed, 135 insertions(+), 57 deletions(-) diff --git a/x-pack/plugins/alerts/server/alerts_client.test.ts b/x-pack/plugins/alerts/server/alerts_client.test.ts index d4817eab64acb..a5846cd1060c5 100644 --- a/x-pack/plugins/alerts/server/alerts_client.test.ts +++ b/x-pack/plugins/alerts/server/alerts_client.test.ts @@ -778,8 +778,12 @@ describe('create()', () => { expect(taskManager.schedule).not.toHaveBeenCalled(); }); - test('throws error if create saved object fails', async () => { + test('throws error and invalidates API key when create saved object fails', async () => { const data = getMockData(); + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ saved_objects: [ { @@ -798,6 +802,7 @@ describe('create()', () => { `"Test failure"` ); expect(taskManager.schedule).not.toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); }); test('attempts to remove saved object if scheduling failed', async () => { @@ -1422,6 +1427,10 @@ describe('enable()', () => { }); test('throws error when failing to update the first time', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); unsecuredSavedObjectsClient.update.mockReset(); unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Fail to update')); @@ -1430,6 +1439,7 @@ describe('enable()', () => { ); expect(alertsClientParams.getUserName).toHaveBeenCalled(); expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(1); expect(taskManager.schedule).not.toHaveBeenCalled(); }); @@ -3926,6 +3936,52 @@ describe('update()', () => { ); }); + test('throws when unsecuredSavedObjectsClient update fails and invalidates newly created API key', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '234', name: '234', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockRejectedValue(new Error('Fail')); + await expect( + alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Fail"`); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalledWith({ id: '123' }); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '234' }); + }); + describe('updating an alert schedule', () => { function mockApiCalls( alertId: string, @@ -4360,13 +4416,18 @@ describe('updateApiKey()', () => { expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); }); - test('throws when unsecuredSavedObjectsClient update fails', async () => { + test('throws when unsecuredSavedObjectsClient update fails and invalidates newly created API key', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '234', name: '234', api_key: 'abc' }, + }); unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Fail')); await expect(alertsClient.updateApiKey({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( `"Fail"` ); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalledWith({ id: '123' }); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '234' }); }); describe('authorization', () => { diff --git a/x-pack/plugins/alerts/server/alerts_client.ts b/x-pack/plugins/alerts/server/alerts_client.ts index 033fdd752c695..bcc3c9bcf7e55 100644 --- a/x-pack/plugins/alerts/server/alerts_client.ts +++ b/x-pack/plugins/alerts/server/alerts_client.ts @@ -229,14 +229,21 @@ export class AlertsClient { muteAll: false, mutedInstanceIds: [], }; - const createdAlert = await this.unsecuredSavedObjectsClient.create( - 'alert', - this.updateMeta(rawAlert), - { - ...options, - references, - } - ); + let createdAlert: SavedObject<RawAlert>; + try { + createdAlert = await this.unsecuredSavedObjectsClient.create( + 'alert', + this.updateMeta(rawAlert), + { + ...options, + references, + } + ); + } catch (e) { + // Avoid unused API key + this.invalidateApiKey({ apiKey: rawAlert.apiKey }); + throw e; + } if (data.enabled) { let scheduledTask; try { @@ -498,23 +505,31 @@ export class AlertsClient { : null; const apiKeyAttributes = this.apiKeyAsAlertAttributes(createdAPIKey, username); - const updatedObject = await this.unsecuredSavedObjectsClient.create<RawAlert>( - 'alert', - this.updateMeta({ - ...attributes, - ...data, - ...apiKeyAttributes, - params: validatedAlertTypeParams as RawAlert['params'], - actions, - updatedBy: username, - }), - { - id, - overwrite: true, - version, - references, - } - ); + let updatedObject: SavedObject<RawAlert>; + const createAttributes = this.updateMeta({ + ...attributes, + ...data, + ...apiKeyAttributes, + params: validatedAlertTypeParams as RawAlert['params'], + actions, + updatedBy: username, + }); + try { + updatedObject = await this.unsecuredSavedObjectsClient.create<RawAlert>( + 'alert', + createAttributes, + { + id, + overwrite: true, + version, + references, + } + ); + } catch (e) { + // Avoid unused API key + this.invalidateApiKey({ apiKey: createAttributes.apiKey }); + throw e; + } return this.getPartialAlertFromRaw( id, @@ -580,19 +595,21 @@ export class AlertsClient { } const username = await this.getUserName(); - await this.unsecuredSavedObjectsClient.update( - 'alert', - id, - this.updateMeta({ - ...attributes, - ...this.apiKeyAsAlertAttributes( - await this.createAPIKey(this.generateAPIKeyName(attributes.alertTypeId, attributes.name)), - username - ), - updatedBy: username, - }), - { version } - ); + const updateAttributes = this.updateMeta({ + ...attributes, + ...this.apiKeyAsAlertAttributes( + await this.createAPIKey(this.generateAPIKeyName(attributes.alertTypeId, attributes.name)), + username + ), + updatedBy: username, + }); + try { + await this.unsecuredSavedObjectsClient.update('alert', id, updateAttributes, { version }); + } catch (e) { + // Avoid unused API key + this.invalidateApiKey({ apiKey: updateAttributes.apiKey }); + throw e; + } if (apiKeyToInvalidate) { await this.invalidateApiKey({ apiKey: apiKeyToInvalidate }); @@ -658,22 +675,22 @@ export class AlertsClient { if (attributes.enabled === false) { const username = await this.getUserName(); - await this.unsecuredSavedObjectsClient.update( - 'alert', - id, - this.updateMeta({ - ...attributes, - enabled: true, - ...this.apiKeyAsAlertAttributes( - await this.createAPIKey( - this.generateAPIKeyName(attributes.alertTypeId, attributes.name) - ), - username - ), - updatedBy: username, - }), - { version } - ); + const updateAttributes = this.updateMeta({ + ...attributes, + enabled: true, + ...this.apiKeyAsAlertAttributes( + await this.createAPIKey(this.generateAPIKeyName(attributes.alertTypeId, attributes.name)), + username + ), + updatedBy: username, + }); + try { + await this.unsecuredSavedObjectsClient.update('alert', id, updateAttributes, { version }); + } catch (e) { + // Avoid unused API key + this.invalidateApiKey({ apiKey: updateAttributes.apiKey }); + throw e; + } const scheduledTask = await this.scheduleAlert(id, attributes.alertTypeId); await this.unsecuredSavedObjectsClient.update('alert', id, { scheduledTaskId: scheduledTask.id, From d4a9b4bc0b806655f5299e065550564ef91015c8 Mon Sep 17 00:00:00 2001 From: Wylie Conlon <william.conlon@elastic.co> Date: Thu, 1 Oct 2020 11:30:21 -0400 Subject: [PATCH 50/64] [Vega] Fix unexpected change in autosizing behavior post upgrade (#77408) * [Vega] Fix unexpected change in autosizing behavior post upgrade * Add docs * Fix type issues * Fix i18n and snapshot * Fix snapshot? * Fix time in snapshot * Update style of sizing function --- docs/user/dashboard/vega-reference.asciidoc | 35 ++++- .../vega_visualization.test.js.snap | 4 +- .../vis_type_vega/public/data_model/types.ts | 19 ++- .../public/data_model/vega_parser.test.js | 100 ++++++++++--- .../public/data_model/vega_parser.ts | 141 ++++++++++-------- .../public/vega_view/vega_base_view.js | 5 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 8 files changed, 199 insertions(+), 107 deletions(-) diff --git a/docs/user/dashboard/vega-reference.asciidoc b/docs/user/dashboard/vega-reference.asciidoc index eed8d9a35b874..0bc77ab0a417e 100644 --- a/docs/user/dashboard/vega-reference.asciidoc +++ b/docs/user/dashboard/vega-reference.asciidoc @@ -11,7 +11,7 @@ For additional *Vega* and *Vega-Lite* information, refer to the reference sectio {kib} has extended Vega and Vega-Lite with extensions that support: -* Default height and width +* Automatic sizing * Default theme to match {kib} * Writing {es} queries using the time range and filters from dashboards * Using the Elastic Map Service in Vega maps @@ -22,12 +22,35 @@ For additional *Vega* and *Vega-Lite* information, refer to the reference sectio [float] [[vega-sizing-and-positioning]] -==== Default height and width +==== Automatic sizing -By default, Vega visualizations use the `autosize = { type: 'fit', contains: 'padding' }` layout. -`fit` uses all available space, ignores `width` and `height` values, -and respects the padding values. To override this behavior, change the -`autosize` value. +Most users will want their Vega visualizations to take the full available space, so unlike +Vega examples, `width` and `height` are not required parameters in {kib}. To set the width +or height manually, set `autosize: none`. For example, to set the height to a specific pixel value: + +``` +autosize: none +width: container +height: 200 +``` + +The default {kib} settings which are inherited by your visualizations are: + +``` +autosize: { + type: fit + contains: padding +} +width: container +height: container +``` + +{kib} is able to merge your custom `autosize` settings with the defaults. The options `fit-x` +and `fit-y` are supported but not recommended over the default `fit` setting. + +To learn more, read about +https://vega.github.io/vega/docs/specification/#autosize[autosize] +in the Vega documentation. [float] [[vega-theme]] diff --git a/src/plugins/vis_type_vega/public/__snapshots__/vega_visualization.test.js.snap b/src/plugins/vis_type_vega/public/__snapshots__/vega_visualization.test.js.snap index 0d38d9775a4cd..8b813ee06b1b3 100644 --- a/src/plugins/vis_type_vega/public/__snapshots__/vega_visualization.test.js.snap +++ b/src/plugins/vis_type_vega/public/__snapshots__/vega_visualization.test.js.snap @@ -4,6 +4,6 @@ exports[`VegaVisualizations VegaVisualization - basics should show vega blank re exports[`VegaVisualizations VegaVisualization - basics should show vega graph (may fail in dev env) 1`] = `"<div class=\\"vgaVis__view\\" style=\\"height: 100%; cursor: default;\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"512\\" height=\\"512\\" viewBox=\\"0 0 512 512\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(0,0)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h512v512h-512Z\\"></path><g><g class=\\"mark-group role-scope\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h0v0h0Z\\"></path><g><g class=\\"mark-area role-mark\\" role=\\"graphics-symbol\\" aria-roledescription=\\"area mark container\\"><path d=\\"M0,512C18.962962962962962,512,37.925925925925924,512,56.888888888888886,512C75.85185185185185,512,94.81481481481481,512,113.77777777777777,512C132.74074074074073,512,151.7037037037037,512,170.66666666666666,512C189.62962962962962,512,208.59259259259258,512,227.55555555555554,512C246.5185185185185,512,265.48148148148147,512,284.44444444444446,512C303.4074074074074,512,322.3703703703704,512,341.3333333333333,512C360.29629629629625,512,379.25925925925924,512,398.2222222222222,512C417.18518518518516,512,436.1481481481481,512,455.1111111111111,512C474.0740740740741,512,493.037037037037,512,512,512L512,355.2C493.037037037037,324.79999999999995,474.0740740740741,294.4,455.1111111111111,294.4C436.1481481481481,294.4,417.18518518518516,457.6,398.2222222222222,457.6C379.25925925925924,457.6,360.29629629629625,233.60000000000002,341.3333333333333,233.60000000000002C322.3703703703704,233.60000000000002,303.4074074074074,435.2,284.44444444444446,435.2C265.48148148148147,435.2,246.5185185185185,345.6,227.55555555555554,345.6C208.59259259259258,345.6,189.62962962962962,451.2,170.66666666666666,451.2C151.7037037037037,451.2,132.74074074074073,252.8,113.77777777777777,252.8C94.81481481481481,252.8,75.85185185185185,346.1333333333333,56.888888888888886,374.4C37.925925925925924,402.66666666666663,18.962962962962962,412.5333333333333,0,422.4Z\\" fill=\\"#54B399\\" fill-opacity=\\"1\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0,0h0v0h0Z\\"></path><g><g class=\\"mark-area role-mark\\" role=\\"graphics-symbol\\" aria-roledescription=\\"area mark container\\"><path d=\\"M0,422.4C18.962962962962962,412.5333333333333,37.925925925925924,402.66666666666663,56.888888888888886,374.4C75.85185185185185,346.1333333333333,94.81481481481481,252.8,113.77777777777777,252.8C132.74074074074073,252.8,151.7037037037037,451.2,170.66666666666666,451.2C189.62962962962962,451.2,208.59259259259258,345.6,227.55555555555554,345.6C246.5185185185185,345.6,265.48148148148147,435.2,284.44444444444446,435.2C303.4074074074074,435.2,322.3703703703704,233.60000000000002,341.3333333333333,233.60000000000002C360.29629629629625,233.60000000000002,379.25925925925924,457.6,398.2222222222222,457.6C417.18518518518516,457.6,436.1481481481481,294.4,455.1111111111111,294.4C474.0740740740741,294.4,493.037037037037,324.79999999999995,512,355.2L512,307.2C493.037037037037,275.2,474.0740740740741,243.2,455.1111111111111,243.2C436.1481481481481,243.2,417.18518518518516,371.2,398.2222222222222,371.2C379.25925925925924,371.2,360.29629629629625,22.399999999999977,341.3333333333333,22.399999999999977C322.3703703703704,22.399999999999977,303.4074074074074,278.4,284.44444444444446,278.4C265.48148148148147,278.4,246.5185185185185,204.8,227.55555555555554,192C208.59259259259258,179.20000000000002,189.62962962962962,185.6,170.66666666666666,172.8C151.7037037037037,160.00000000000003,132.74074074074073,83.19999999999999,113.77777777777777,83.19999999999999C94.81481481481481,83.19999999999999,75.85185185185185,83.19999999999999,56.888888888888886,83.19999999999999C37.925925925925924,83.19999999999999,18.962962962962962,164.79999999999998,0,246.39999999999998Z\\" fill=\\"#6092C0\\" fill-opacity=\\"1\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; -exports[`VegaVisualizations VegaVisualization - basics should show vegalite graph and update on resize (may fail in dev env) 1`] = `"<div class=\\"vgaVis__view\\" style=\\"height: 100%; cursor: default;\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"512\\" height=\\"506\\" viewBox=\\"0 0 512 506\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(7,5)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0.5,0.5h498v494h-498Z\\" fill=\\"transparent\\" stroke=\\"#ddd\\"></path><g><g class=\\"mark-line role-mark marks\\" role=\\"graphics-object\\" aria-roledescription=\\"line mark container\\"><path aria-label=\\"key: Dec 11, 2017; doc_count: 0\\" role=\\"graphics-symbol\\" aria-roledescription=\\"line mark\\" d=\\"M0,494L55.33333333333333,494L110.66666666666666,494L166,44.953999999999986L221.33333333333331,32.9004L276.6666666666667,33.59199999999998L332,480.8596L387.3333333333333,494L442.66666666666663,494L498,494\\" stroke=\\"#54B399\\" stroke-width=\\"2\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; +exports[`VegaVisualizations VegaVisualization - basics should show vegalite graph and update on resize (may fail in dev env) 1`] = `"<ul class=\\"vgaVis__messages\\"><li class=\\"vgaVis__message vgaVis__message--warn\\"><pre class=\\"vgaVis__messageCode\\">\\"width\\" and \\"height\\" params are ignored because \\"autosize\\" is enabled. Set \\"autosize\\": \\"none\\" to disable</pre></li></ul><div class=\\"vgaVis__view\\" style=\\"height: 100%; cursor: default;\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"0\\" height=\\"0\\" viewBox=\\"0 0 0 0\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(7,7)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0.5,0.5h0v0h0Z\\" fill=\\"transparent\\" stroke=\\"#ddd\\"></path><g><g class=\\"mark-line role-mark marks\\" role=\\"graphics-object\\" aria-roledescription=\\"line mark container\\"><path aria-label=\\"key: Dec 11, 2017; doc_count: 0\\" role=\\"graphics-symbol\\" aria-roledescription=\\"line mark\\" d=\\"M0,0L0,0L0,0L0,0L0,0L0,0L0,0L0,0L0,0L0,0\\" stroke=\\"#54B399\\" stroke-width=\\"2\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; -exports[`VegaVisualizations VegaVisualization - basics should show vegalite graph and update on resize (may fail in dev env) 2`] = `"<div class=\\"vgaVis__view\\" style=\\"height: 100%; cursor: default;\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"256\\" height=\\"250\\" viewBox=\\"0 0 256 250\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(7,5)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0.5,0.5h242v238h-242Z\\" fill=\\"transparent\\" stroke=\\"#ddd\\"></path><g><g class=\\"mark-line role-mark marks\\" role=\\"graphics-object\\" aria-roledescription=\\"line mark container\\"><path aria-label=\\"key: Dec 11, 2017; doc_count: 0\\" role=\\"graphics-symbol\\" aria-roledescription=\\"line mark\\" d=\\"M0,238L26.888888888888886,238L53.77777777777777,238L80.66666666666666,21.657999999999994L107.55555555555554,15.850799999999998L134.44444444444446,16.183999999999987L161.33333333333331,231.66920000000002L188.22222222222223,238L215.1111111111111,238L242,238\\" stroke=\\"#54B399\\" stroke-width=\\"2\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; +exports[`VegaVisualizations VegaVisualization - basics should show vegalite graph and update on resize (may fail in dev env) 2`] = `"<ul class=\\"vgaVis__messages\\"><li class=\\"vgaVis__message vgaVis__message--warn\\"><pre class=\\"vgaVis__messageCode\\">\\"width\\" and \\"height\\" params are ignored because \\"autosize\\" is enabled. Set \\"autosize\\": \\"none\\" to disable</pre></li></ul><div class=\\"vgaVis__view\\" style=\\"height: 100%; cursor: default;\\" role=\\"graphics-document\\" aria-roledescription=\\"visualization\\" aria-label=\\"Vega visualization\\"><svg xmlns=\\"http://www.w3.org/2000/svg\\" xmlns:xlink=\\"http://www.w3.org/1999/xlink\\" version=\\"1.1\\" class=\\"marks\\" width=\\"256\\" height=\\"250\\" viewBox=\\"0 0 256 250\\" style=\\"background-color: transparent;\\"><g fill=\\"none\\" stroke-miterlimit=\\"10\\" transform=\\"translate(7,5)\\"><g class=\\"mark-group role-frame root\\" role=\\"graphics-object\\" aria-roledescription=\\"group mark container\\"><g transform=\\"translate(0,0)\\"><path class=\\"background\\" aria-hidden=\\"true\\" d=\\"M0.5,0.5h242v238h-242Z\\" fill=\\"transparent\\" stroke=\\"#ddd\\"></path><g><g class=\\"mark-line role-mark marks\\" role=\\"graphics-object\\" aria-roledescription=\\"line mark container\\"><path aria-label=\\"key: Dec 11, 2017; doc_count: 0\\" role=\\"graphics-symbol\\" aria-roledescription=\\"line mark\\" d=\\"M0,238L26.888888888888886,238L53.77777777777777,238L80.66666666666666,21.657999999999994L107.55555555555554,15.850799999999998L134.44444444444446,16.183999999999987L161.33333333333331,231.66920000000002L188.22222222222223,238L215.1111111111111,238L242,238\\" stroke=\\"#54B399\\" stroke-width=\\"2\\"></path></g></g><path class=\\"foreground\\" aria-hidden=\\"true\\" d=\\"\\" display=\\"none\\"></path></g></g></g></svg></div><div class=\\"vgaVis__controls vgaVis__controls--column\\"></div>"`; diff --git a/src/plugins/vis_type_vega/public/data_model/types.ts b/src/plugins/vis_type_vega/public/data_model/types.ts index 14848bf5e8739..11bdf4f064023 100644 --- a/src/plugins/vis_type_vega/public/data_model/types.ts +++ b/src/plugins/vis_type_vega/public/data_model/types.ts @@ -43,10 +43,17 @@ interface Encoding { y: Coordinate; } -interface AutoSize { - type: string; - contains: string; -} +type AutoSize = + | 'pad' + | 'fit' + | 'fit-x' + | 'fit-y' + | 'none' + | { + type: string; + contains: string; + } + | { signal: string }; interface Padding { left: number; @@ -105,8 +112,8 @@ export interface VegaSpec { title?: string; autosize?: AutoSize; projections?: Projection[]; - width?: number; - height?: number; + width?: number | 'container'; + height?: number | 'container'; padding?: number | Padding; _hostConfig?: KibanaConfig; config: VegaSpecConfig; diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 5c7656efe925b..c9f8e0a4394ec 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -371,43 +371,95 @@ describe('VegaParser._parseConfig', () => { test('_hostConfig', check({ _hostConfig: { a: 1 } }, { a: 1 }, {}, 1)); }); -describe('VegaParser._calcSizing', () => { - function check( - spec, - useResize, - paddingWidth, - paddingHeight, - isVegaLite, - expectedSpec, - warnCount - ) { +describe('VegaParser._compileWithAutosize', () => { + function check(spec, useResize, expectedSpec, warnCount) { return async () => { expectedSpec = expectedSpec || cloneDeep(spec); const vp = new VegaParser(spec); - vp.isVegaLite = !!isVegaLite; - vp._calcSizing(); + vp._compileWithAutosize(); expect(vp.useResize).toEqual(useResize); - expect(vp.paddingWidth).toEqual(paddingWidth); - expect(vp.paddingHeight).toEqual(paddingHeight); expect(vp.spec).toEqual(expectedSpec); expect(vp.warnings).toHaveLength(warnCount || 0); }; } - test('no size', check({ autosize: {} }, false, 0, 0)); - test('fit', check({ autosize: 'fit' }, true, 0, 0)); - test('fit obj', check({ autosize: { type: 'fit' } }, true, 0, 0)); - test('padding const', check({ autosize: 'fit', padding: 10 }, true, 20, 20)); test( - 'padding obj', - check({ autosize: 'fit', padding: { left: 5, bottom: 7, right: 6, top: 8 } }, true, 11, 15) + 'empty config', + check({}, true, { + autosize: { type: 'fit', contains: 'padding' }, + width: 'container', + height: 'container', + }) + ); + test( + 'no warnings for default config', + check({ width: 'container', height: 'container' }, true, { + autosize: { type: 'fit', contains: 'padding' }, + width: 'container', + height: 'container', + }) + ); + test( + 'warning when attempting to use invalid setting', + check( + { width: '300', height: '300' }, + true, + { + autosize: { type: 'fit', contains: 'padding' }, + width: 'container', + height: 'container', + }, + 1 + ) ); test( - 'width height', - check({ autosize: 'fit', width: 1, height: 2 }, true, 0, 0, false, false, 1) + 'autosize none', + check({ autosize: 'none' }, false, { autosize: { type: 'none', contains: 'padding' } }) + ); + test( + 'autosize=fit', + check({ autosize: 'fit' }, true, { + autosize: { type: 'fit', contains: 'padding' }, + width: 'container', + height: 'container', + }) ); test( - 'VL width height', - check({ autosize: 'fit', width: 1, height: 2 }, true, 0, 0, true, { autosize: 'fit' }, 0) + 'autosize=pad', + check({ autosize: 'pad' }, true, { + autosize: { type: 'pad', contains: 'padding' }, + width: 'container', + height: 'container', + }) + ); + test( + 'empty autosize object', + check({ autosize: {} }, true, { + autosize: { type: 'fit', contains: 'padding' }, + height: 'container', + width: 'container', + }) + ); + test( + 'warning on falsy arguments', + check( + { autosize: false }, + true, + { + autosize: { type: 'fit', contains: 'padding' }, + height: 'container', + width: 'container', + }, + 1 + ) + ); + test( + 'partial autosize object', + check({ autosize: { contains: 'content' } }, true, { + autosize: { contains: 'content', type: 'fit' }, + height: 'container', + width: 'container', + }) ); + test('autosize signals are ignored', check({ autosize: { signal: 'asdf' } }, undefined)); }); diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts index ccb89207e222f..894c34c494c16 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts @@ -75,8 +75,6 @@ export class VegaParser { mapConfig?: object; vlspec?: VegaSpec; useResize?: boolean; - paddingWidth?: number; - paddingHeight?: number; containerDir?: ControlsLocation | ControlsDirection; controlsDir?: ControlsLocation; searchAPI: SearchAPI; @@ -157,9 +155,9 @@ The URL is an identifier only. Kibana and your browser will never access this UR this._parseControlPlacement(); if (this.useMap) { this.mapConfig = this._parseMapConfig(); - } else if (this.spec && this.spec.autosize === undefined) { - // Default autosize should be fit, unless it's a map (leaflet-vega handles that) - this.spec.autosize = { type: 'fit', contains: 'padding' }; + this.useResize = false; + } else if (this.spec) { + this._compileWithAutosize(); } await this._resolveDataUrls(); @@ -167,15 +165,86 @@ The URL is an identifier only. Kibana and your browser will never access this UR if (this.isVegaLite) { this._compileVegaLite(); } + } + + /** + * Ensure that Vega and Vega-Lite will take the full width of the container unless + * the user has explicitly disabled this setting by setting it to "none". + * Also sets the default width to include the padding. This creates the least configuration + * needed for most cases, with the option to do more. + */ + private _compileWithAutosize() { + const defaultAutosize = { + type: 'fit', + contains: 'padding', + }; + + let autosize = this.spec.autosize; + let useResize = true; + + if (!this.isVegaLite && autosize && typeof autosize === 'object' && 'signal' in autosize) { + // Vega supports dynamic autosize information, so we ignore it + return; + } + + if (!autosize && typeof autosize !== 'undefined') { + this._onWarning( + i18n.translate('visTypeVega.vegaParser.autoSizeDoesNotAllowFalse', { + defaultMessage: + '{autoSizeParam} is enabled, it can only be disabled by setting {autoSizeParam} to {noneParam}', + values: { + autoSizeParam: '"autosize"', + noneParam: '"none"', + }, + }) + ); + } + + if (typeof autosize === 'string') { + useResize = autosize !== 'none'; + autosize = { ...defaultAutosize, type: autosize }; + } else if (typeof autosize === 'object') { + autosize = { ...defaultAutosize, ...autosize } as { + type: string; + contains: string; + }; + useResize = Boolean(autosize?.type && autosize?.type !== 'none'); + } else { + autosize = defaultAutosize; + } + + if ( + useResize && + ((this.spec.width && this.spec.width !== 'container') || + (this.spec.height && this.spec.height !== 'container')) + ) { + this._onWarning( + i18n.translate('visTypeVega.vegaParser.widthAndHeightParamsAreIgnored', { + defaultMessage: + '{widthParam} and {heightParam} params are ignored because {autoSizeParam} is enabled. Set {autoSizeParam}: {noneParam} to disable', + values: { + widthParam: '"width"', + heightParam: '"height"', + autoSizeParam: '"autosize"', + noneParam: '"none"', + }, + }) + ); + } - this._calcSizing(); + if (useResize) { + this.spec.width = 'container'; + this.spec.height = 'container'; + } + + this.spec.autosize = autosize; + this.useResize = useResize; } /** * Convert VegaLite to Vega spec - * @private */ - _compileVegaLite() { + private _compileVegaLite() { this.vlspec = this.spec; const logger = vega.logger(vega.Warn); // note: eslint has a false positive here logger.warn = this._onWarning.bind(this); @@ -226,62 +295,6 @@ The URL is an identifier only. Kibana and your browser will never access this UR } } - /** - * Process graph size and padding - * @private - */ - _calcSizing() { - this.useResize = false; - - // Padding is not included in the width/height by default - this.paddingWidth = 0; - this.paddingHeight = 0; - if (this.spec) { - if (!this.useMap) { - // when useResize is true, vega's canvas size will be set based on the size of the container, - // and will be automatically updated on resize events. - // We delete width & height if the autosize is set to "fit" - // We also set useResize=true in case autosize=none, and width & height are not set - const autosize = this.spec.autosize?.type || this.spec.autosize; - if (autosize === 'fit' || (autosize === 'none' && !this.spec.width && !this.spec.height)) { - this.useResize = true; - } - } - - if (this.useResize && this.spec.padding && this.spec.autosize?.contains !== 'padding') { - if (typeof this.spec.padding === 'object') { - this.paddingWidth += (+this.spec.padding.left || 0) + (+this.spec.padding.right || 0); - this.paddingHeight += (+this.spec.padding.top || 0) + (+this.spec.padding.bottom || 0); - } else { - this.paddingWidth += 2 * (+this.spec.padding || 0); - this.paddingHeight += 2 * (+this.spec.padding || 0); - } - } - - if (this.useResize && (this.spec.width || this.spec.height)) { - if (this.isVegaLite) { - delete this.spec.width; - delete this.spec.height; - } else { - this._onWarning( - i18n.translate( - 'visTypeVega.vegaParser.widthAndHeightParamsAreIgnoredWithAutosizeFitWarningMessage', - { - defaultMessage: - 'The {widthParam} and {heightParam} params are ignored with {autosizeParam}', - values: { - autosizeParam: 'autosize=fit', - widthParam: '"width"', - heightParam: '"height"', - }, - } - ) - ); - } - } - } - } - /** * Calculate container-direction CSS property for binding placement * @private diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index 9b51b68e93bb4..979432b2aed2a 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -193,9 +193,8 @@ export class VegaBaseView { // This might be due to https://github.com/jquery/jquery/issues/3808 // Which is being fixed as part of jQuery 3.3.0 const heightExtraPadding = 6; - const width = Math.max(0, this._$container.width() - this._parser.paddingWidth); - const height = - Math.max(0, this._$container.height() - this._parser.paddingHeight) - heightExtraPadding; + const width = Math.max(0, this._$container.width()); + const height = Math.max(0, this._$container.height()) - heightExtraPadding; if (view.width() !== width || view.height() !== height) { view.width(width).height(height); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 0ebb10d30c010..ba9d8e364bd17 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4145,7 +4145,6 @@ "visTypeVega.vegaParser.unrecognizedControlsLocationValueErrorMessage": "認識されない {controlsLocationParam} 値[{locToDirMap}] のいずれかである必要があります", "visTypeVega.vegaParser.unrecognizedDirValueErrorMessage": "認識されない {dirParam} 値[{expectedValues}] のいずれかである必要があります", "visTypeVega.vegaParser.VLCompilerShouldHaveGeneratedSingleProtectionObjectErrorMessage": "内部エラー:Vega-Lite コンパイラーがシングルプロジェクションオブジェクトを生成したはずです", - "visTypeVega.vegaParser.widthAndHeightParamsAreIgnoredWithAutosizeFitWarningMessage": "{widthParam} と {heightParam} パラメーターは {autosizeParam} で無視されます", "visTypeVega.visualization.indexNotFoundErrorMessage": "インデックス {index} が見つかりません", "visTypeVega.visualization.renderErrorTitle": "Vega エラー", "visTypeVega.visualization.unableToFindDefaultIndexErrorMessage": "デフォルトのインデックスが見つかりません", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index acd6db3b758b1..5d44e0c635bee 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4146,7 +4146,6 @@ "visTypeVega.vegaParser.unrecognizedControlsLocationValueErrorMessage": "无法识别的 {controlsLocationParam} 值。应为 [{locToDirMap}] 之一", "visTypeVega.vegaParser.unrecognizedDirValueErrorMessage": "{dirParam} 值无法识别。应为 [{expectedValues}] 之一", "visTypeVega.vegaParser.VLCompilerShouldHaveGeneratedSingleProtectionObjectErrorMessage": "内部错误:Vega-Lite 编译器应已生成单个投影对象", - "visTypeVega.vegaParser.widthAndHeightParamsAreIgnoredWithAutosizeFitWarningMessage": "使用 {autosizeParam} 时,将忽略 {widthParam} 和 {heightParam} 参数", "visTypeVega.visualization.indexNotFoundErrorMessage": "找不到索引 {index}", "visTypeVega.visualization.renderErrorTitle": "Vega 错误", "visTypeVega.visualization.unableToFindDefaultIndexErrorMessage": "找不到默认索引", From c1a3002c1656a7e21f6719ea4066a0c599ee69a1 Mon Sep 17 00:00:00 2001 From: Shahzad <shahzad.muhammad@elastic.co> Date: Thu, 1 Oct 2020 17:37:02 +0200 Subject: [PATCH 51/64] update rum agent version which contains longtasks (#79105) --- package.json | 2 +- x-pack/package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 864954e63f7e1..26a7fef9cfc18 100644 --- a/package.json +++ b/package.json @@ -229,7 +229,7 @@ "devDependencies": { "@babel/parser": "^7.11.2", "@babel/types": "^7.11.0", - "@elastic/apm-rum": "^5.6.0", + "@elastic/apm-rum": "^5.6.1", "@elastic/charts": "21.1.2", "@elastic/ems-client": "7.10.0", "@elastic/eslint-config-kibana": "0.15.0", diff --git a/x-pack/package.json b/x-pack/package.json index 97d673290abd1..6c18902c77366 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@cypress/webpack-preprocessor": "^4.1.0", - "@elastic/apm-rum-react": "^1.2.4", + "@elastic/apm-rum-react": "^1.2.5", "@elastic/maki": "6.3.0", "@kbn/dev-utils": "1.0.0", "@kbn/es": "1.0.0", diff --git a/yarn.lock b/yarn.lock index 399cc80a557d1..608207400ec71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1190,29 +1190,29 @@ enabled "2.0.x" kuler "^2.0.0" -"@elastic/apm-rum-core@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@elastic/apm-rum-core/-/apm-rum-core-5.6.1.tgz#0870e654e84e1f2ffea7c8a247a2da1b72918bcd" - integrity sha512-UtWj8UNN1sfSjav1kQK2NFhHtrH++4FzhtY0g80aSfHrDdBKVXaecWswoGmK3aiGJ9LAVlAXNfF3tPMT6JN23g== +"@elastic/apm-rum-core@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@elastic/apm-rum-core/-/apm-rum-core-5.7.0.tgz#2213987285324781e2ebeca607f3a71245da5a84" + integrity sha512-YxfyDwlPDRy05ERb8h79eXq2ebDamlyII3sdc8zsfL6Hc1wOHK3uBGelDQjQzkUkRJqJL1Sy6LJqok2mpxQJyw== dependencies: error-stack-parser "^1.3.5" opentracing "^0.14.3" promise-polyfill "^8.1.3" -"@elastic/apm-rum-react@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@elastic/apm-rum-react/-/apm-rum-react-1.2.4.tgz#f5b908f69f2696af10d19250226559ceb33dc1e9" - integrity sha512-zjig55n4/maU+kAEePS+DxgD12t4J0X9t3tB9YuO0gUIJhgT7KTL1Nv93ZmJ3u2tCJSpdYVfKQ0GBgSfjt1vVQ== +"@elastic/apm-rum-react@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@elastic/apm-rum-react/-/apm-rum-react-1.2.5.tgz#ac715a192808e14e62e537e41b70cc8296854051" + integrity sha512-5+5Q2ztOQT0EbWFZqV2N78tcuA9qPuO5QAtSTQIYgb5lH27Sfa9G4xlTgCbJs9DzCKmhuu27E4DTArrU3tyNzA== dependencies: - "@elastic/apm-rum" "^5.6.0" + "@elastic/apm-rum" "^5.6.1" hoist-non-react-statics "^3.3.0" -"@elastic/apm-rum@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@elastic/apm-rum/-/apm-rum-5.6.0.tgz#0af2acb55091b9eb315cf38c6422a83cddfecb6f" - integrity sha512-6CuODbt7dBXoqsKoqhshQQC4GyqsGMPOR1FXZCWbnq55UZq1TWqra6zNCtEEFinz8rPaww7bzmNciXKRvGjIzQ== +"@elastic/apm-rum@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@elastic/apm-rum/-/apm-rum-5.6.1.tgz#0d1bbef774866064795f7a9c6db0c951a900de35" + integrity sha512-q6ZkDb+m2z29h6/JKqBL/nBf6/x5yYmW1vUpdW3zy03jTQp+A7LpVaPI1HNquyGryqqT/BQl4QivFcNC28pr4w== dependencies: - "@elastic/apm-rum-core" "^5.6.1" + "@elastic/apm-rum-core" "^5.7.0" "@elastic/charts@21.1.2": version "21.1.2" From f4c5ebca9d3c7de2b6788ec133267a4d94e03cc9 Mon Sep 17 00:00:00 2001 From: Jeffrey Chu <56368296+achuguy@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:47:56 -0400 Subject: [PATCH 52/64] [Security Solution]Fix basepath used by endpoint telemetry tests (#79027) * Fix basepath used by endpoint telemetry tests * Linting --- .../services/endpoint_telemetry.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts b/x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts index 0f158da5d2f8c..6098404201966 100644 --- a/x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts +++ b/x-pack/test/security_solution_endpoint/services/endpoint_telemetry.ts @@ -5,10 +5,14 @@ */ import fs from 'fs'; import Path from 'path'; +import { KIBANA_ROOT } from '@kbn/test'; import { FtrProviderContext } from '../ftr_provider_context'; const TELEMETRY_API_ROOT = '/api/stats?extended=true'; -const TELEMETRY_DATA_ROOT = 'test/functional/es_archives/endpoint/telemetry/'; +const TELEMETRY_DATA_ROOT = Path.join( + KIBANA_ROOT, + 'x-pack/test/functional/es_archives/endpoint/telemetry/' +); interface EndpointTelemetry { total_installed: number; From ee7672aaf074dc4ebaf0ffb88d95d5f1bf9e1d18 Mon Sep 17 00:00:00 2001 From: Phillip Burch <phillip.burch@live.com> Date: Thu, 1 Oct 2020 10:51:55 -0500 Subject: [PATCH 53/64] [Metrics UI] Add ability to override datafeeds and job config for partition field (#78875) * Add ability to override datafeeds and job config for partition field * Remove debug * UX cleanup * Fix types, delete dead code --- .../containers/ml/infra_ml_module_types.ts | 4 +- .../containers/ml/infra_ml_setup_state.ts | 289 ------------------ .../metrics_hosts/module_descriptor.ts | 135 +++++--- .../modules/metrics_k8s/module_descriptor.ts | 143 ++++++--- .../anomoly_detection_flyout.tsx | 4 +- .../ml/anomaly_detection/flyout_home.tsx | 113 +++---- .../ml/anomaly_detection/job_setup_screen.tsx | 3 +- 7 files changed, 247 insertions(+), 444 deletions(-) delete mode 100644 x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts index a9f2671de8259..e36f38add641a 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts @@ -33,11 +33,11 @@ export interface ModuleDescriptor<JobType extends string> { partitionField?: string ) => Promise<SetupMlModuleResponsePayload>; cleanUpModule: (spaceId: string, sourceId: string) => Promise<DeleteJobsResponsePayload>; - validateSetupIndices: ( + validateSetupIndices?: ( indices: string[], timestampField: string ) => Promise<ValidationIndicesResponsePayload>; - validateSetupDatasets: ( + validateSetupDatasets?: ( indices: string[], timestampField: string, startTime: number, diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts b/x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts deleted file mode 100644 index 0dfe3b301f240..0000000000000 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { isEqual } from 'lodash'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { usePrevious } from 'react-use'; -import { - combineDatasetFilters, - DatasetFilter, - filterDatasetFilter, - isExampleDataIndex, -} from '../../../common/infra_ml'; -import { - AvailableIndex, - ValidationIndicesError, - ValidationUIError, -} from '../../components/logging/log_analysis_setup/initial_configuration_step'; -import { useTrackedPromise } from '../../utils/use_tracked_promise'; -import { ModuleDescriptor, ModuleSourceConfiguration } from './infra_ml_module_types'; - -type SetupHandler = ( - indices: string[], - startTime: number | undefined, - endTime: number | undefined, - datasetFilter: DatasetFilter -) => void; - -interface AnalysisSetupStateArguments<JobType extends string> { - cleanUpAndSetUpModule: SetupHandler; - moduleDescriptor: ModuleDescriptor<JobType>; - setUpModule: SetupHandler; - sourceConfiguration: ModuleSourceConfiguration; -} - -const fourWeeksInMs = 86400000 * 7 * 4; - -export const useAnalysisSetupState = <JobType extends string>({ - cleanUpAndSetUpModule, - moduleDescriptor: { validateSetupDatasets, validateSetupIndices }, - setUpModule, - sourceConfiguration, -}: AnalysisSetupStateArguments<JobType>) => { - const [startTime, setStartTime] = useState<number | undefined>(Date.now() - fourWeeksInMs); - const [endTime, setEndTime] = useState<number | undefined>(undefined); - - const isTimeRangeValid = useMemo( - () => (startTime != null && endTime != null ? startTime < endTime : true), - [endTime, startTime] - ); - - const [validatedIndices, setValidatedIndices] = useState<AvailableIndex[]>( - sourceConfiguration.indices.map((indexName) => ({ - name: indexName, - validity: 'unknown' as const, - })) - ); - - const updateIndicesWithValidationErrors = useCallback( - (validationErrors: ValidationIndicesError[]) => - setValidatedIndices((availableIndices) => - availableIndices.map((previousAvailableIndex) => { - const indexValiationErrors = validationErrors.filter( - ({ index }) => index === previousAvailableIndex.name - ); - - if (indexValiationErrors.length > 0) { - return { - validity: 'invalid', - name: previousAvailableIndex.name, - errors: indexValiationErrors, - }; - } else if (previousAvailableIndex.validity === 'valid') { - return { - ...previousAvailableIndex, - validity: 'valid', - errors: [], - }; - } else { - return { - validity: 'valid', - name: previousAvailableIndex.name, - isSelected: !isExampleDataIndex(previousAvailableIndex.name), - availableDatasets: [], - datasetFilter: { - type: 'includeAll' as const, - }, - }; - } - }) - ), - [] - ); - - const updateIndicesWithAvailableDatasets = useCallback( - (availableDatasets: Array<{ indexName: string; datasets: string[] }>) => - setValidatedIndices((availableIndices) => - availableIndices.map((previousAvailableIndex) => { - if (previousAvailableIndex.validity !== 'valid') { - return previousAvailableIndex; - } - - const availableDatasetsForIndex = availableDatasets.filter( - ({ indexName }) => indexName === previousAvailableIndex.name - ); - const newAvailableDatasets = availableDatasetsForIndex.flatMap( - ({ datasets }) => datasets - ); - - // filter out datasets that have disappeared if this index' datasets were updated - const newDatasetFilter: DatasetFilter = - availableDatasetsForIndex.length > 0 - ? filterDatasetFilter(previousAvailableIndex.datasetFilter, (dataset) => - newAvailableDatasets.includes(dataset) - ) - : previousAvailableIndex.datasetFilter; - - return { - ...previousAvailableIndex, - availableDatasets: newAvailableDatasets, - datasetFilter: newDatasetFilter, - }; - }) - ), - [] - ); - - const validIndexNames = useMemo( - () => validatedIndices.filter((index) => index.validity === 'valid').map((index) => index.name), - [validatedIndices] - ); - - const selectedIndexNames = useMemo( - () => - validatedIndices - .filter((index) => index.validity === 'valid' && index.isSelected) - .map((i) => i.name), - [validatedIndices] - ); - - const datasetFilter = useMemo( - () => - validatedIndices - .flatMap((validatedIndex) => - validatedIndex.validity === 'valid' - ? validatedIndex.datasetFilter - : { type: 'includeAll' as const } - ) - .reduce(combineDatasetFilters, { type: 'includeAll' as const }), - [validatedIndices] - ); - - const [validateIndicesRequest, validateIndices] = useTrackedPromise( - { - cancelPreviousOn: 'resolution', - createPromise: async () => { - return await validateSetupIndices( - sourceConfiguration.indices, - sourceConfiguration.timestampField - ); - }, - onResolve: ({ data: { errors } }) => { - updateIndicesWithValidationErrors(errors); - }, - onReject: () => { - setValidatedIndices([]); - }, - }, - [sourceConfiguration.indices, sourceConfiguration.timestampField] - ); - - const [validateDatasetsRequest, validateDatasets] = useTrackedPromise( - { - cancelPreviousOn: 'resolution', - createPromise: async () => { - if (validIndexNames.length === 0) { - return { data: { datasets: [] } }; - } - - return await validateSetupDatasets( - validIndexNames, - sourceConfiguration.timestampField, - startTime ?? 0, - endTime ?? Date.now() - ); - }, - onResolve: ({ data: { datasets } }) => { - updateIndicesWithAvailableDatasets(datasets); - }, - }, - [validIndexNames, sourceConfiguration.timestampField, startTime, endTime] - ); - - const setUp = useCallback(() => { - return setUpModule(selectedIndexNames, startTime, endTime, datasetFilter); - }, [setUpModule, selectedIndexNames, startTime, endTime, datasetFilter]); - - const cleanUpAndSetUp = useCallback(() => { - return cleanUpAndSetUpModule(selectedIndexNames, startTime, endTime, datasetFilter); - }, [cleanUpAndSetUpModule, selectedIndexNames, startTime, endTime, datasetFilter]); - - const isValidating = useMemo( - () => validateIndicesRequest.state === 'pending' || validateDatasetsRequest.state === 'pending', - [validateDatasetsRequest.state, validateIndicesRequest.state] - ); - - const validationErrors = useMemo<ValidationUIError[]>(() => { - if (isValidating) { - return []; - } - - return [ - // validate request status - ...(validateIndicesRequest.state === 'rejected' || - validateDatasetsRequest.state === 'rejected' - ? [{ error: 'NETWORK_ERROR' as const }] - : []), - // validation request results - ...validatedIndices.reduce<ValidationUIError[]>((errors, index) => { - return index.validity === 'invalid' && selectedIndexNames.includes(index.name) - ? [...errors, ...index.errors] - : errors; - }, []), - // index count - ...(selectedIndexNames.length === 0 ? [{ error: 'TOO_FEW_SELECTED_INDICES' as const }] : []), - // time range - ...(!isTimeRangeValid ? [{ error: 'INVALID_TIME_RANGE' as const }] : []), - ]; - }, [ - isValidating, - validateIndicesRequest.state, - validateDatasetsRequest.state, - validatedIndices, - selectedIndexNames, - isTimeRangeValid, - ]); - - const prevStartTime = usePrevious(startTime); - const prevEndTime = usePrevious(endTime); - const prevValidIndexNames = usePrevious(validIndexNames); - - useEffect(() => { - if (!isTimeRangeValid) { - return; - } - - validateIndices(); - }, [isTimeRangeValid, validateIndices]); - - useEffect(() => { - if (!isTimeRangeValid) { - return; - } - - if ( - startTime !== prevStartTime || - endTime !== prevEndTime || - !isEqual(validIndexNames, prevValidIndexNames) - ) { - validateDatasets(); - } - }, [ - endTime, - isTimeRangeValid, - prevEndTime, - prevStartTime, - prevValidIndexNames, - startTime, - validIndexNames, - validateDatasets, - ]); - - return { - cleanUpAndSetUp, - datasetFilter, - endTime, - isValidating, - selectedIndexNames, - setEndTime, - setStartTime, - setUp, - startTime, - validatedIndices, - setValidatedIndices, - validationErrors, - }; -}; diff --git a/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts b/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts index cec87fb1144e3..711ee76d42a64 100644 --- a/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts +++ b/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts @@ -10,17 +10,27 @@ import { cleanUpJobsAndDatafeeds } from '../../infra_ml_cleanup'; import { callJobsSummaryAPI } from '../../api/ml_get_jobs_summary_api'; import { callGetMlModuleAPI } from '../../api/ml_get_module'; import { callSetupMlModuleAPI } from '../../api/ml_setup_module_api'; -import { callValidateIndicesAPI } from '../../../logs/log_analysis/api/validate_indices'; -import { callValidateDatasetsAPI } from '../../../logs/log_analysis/api/validate_datasets'; import { metricsHostsJobTypes, getJobId, MetricsHostsJobType, DatasetFilter, bucketSpan, - partitionField, } from '../../../../../common/infra_ml'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import MemoryJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/hosts_memory_usage.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import MemoryDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/datafeed_hosts_memory_usage.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkInJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/hosts_network_in.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkInDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/datafeed_hosts_network_in.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkOutJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/hosts_network_out.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkOutDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/datafeed_hosts_network_out.json'; +type JobType = 'hosts_memory_usage' | 'hosts_network_in' | 'hosts_network_out'; const moduleId = 'metrics_ui_hosts'; const moduleName = i18n.translate('xpack.infra.ml.metricsModuleName', { defaultMessage: 'Metrics anomanly detection', @@ -54,23 +64,68 @@ const setUpModule = async ( end: number | undefined, datasetFilter: DatasetFilter, { spaceId, sourceId, indices, timestampField }: ModuleSourceConfiguration, - pField?: string + partitionField?: string ) => { const indexNamePattern = indices.join(','); - const jobIds = ['hosts_memory_usage', 'hosts_network_in', 'hosts_network_out']; - const jobOverrides = jobIds.map((id) => ({ - job_id: id, - data_description: { - time_field: timestampField, - }, - custom_settings: { - metrics_source_config: { - indexPattern: indexNamePattern, - timestampField, - bucketSpan, + const jobIds: JobType[] = ['hosts_memory_usage', 'hosts_network_in', 'hosts_network_out']; + + const jobOverrides = jobIds.map((id) => { + const { job: defaultJobConfig } = getDefaultJobConfigs(id); + + // eslint-disable-next-line @typescript-eslint/naming-convention + const analysis_config = { + ...defaultJobConfig.analysis_config, + }; + + if (partitionField) { + analysis_config.detectors[0].partition_field_name = partitionField; + if (analysis_config.influencers.indexOf(partitionField) === -1) { + analysis_config.influencers.push(partitionField); + } + } + + return { + job_id: id, + data_description: { + time_field: timestampField, + }, + analysis_config, + custom_settings: { + metrics_source_config: { + indexPattern: indexNamePattern, + timestampField, + bucketSpan, + }, + }, + }; + }); + + const datafeedOverrides = jobIds.map((id) => { + const { datafeed: defaultDatafeedConfig } = getDefaultJobConfigs(id); + + if (!partitionField || id === 'hosts_memory_usage') { + // Since the host memory usage doesn't have custom aggs, we don't need to do anything to add a partition field + return defaultDatafeedConfig; + } + + // If we have a partition field, we need to change the aggregation to do a terms agg at the top level + const aggregations = { + [partitionField]: { + terms: { + field: partitionField, + }, + aggregations: { + ...defaultDatafeedConfig.aggregations, + }, }, - }, - })); + }; + + return { + ...defaultDatafeedConfig, + job_id: id, + aggregations, + }; + }); return callSetupMlModuleAPI( moduleId, @@ -80,34 +135,32 @@ const setUpModule = async ( sourceId, indexNamePattern, jobOverrides, - [] + datafeedOverrides ); }; -const cleanUpModule = async (spaceId: string, sourceId: string) => { - return await cleanUpJobsAndDatafeeds(spaceId, sourceId, metricsHostsJobTypes); -}; - -const validateSetupIndices = async (indices: string[], timestampField: string) => { - return await callValidateIndicesAPI(indices, [ - { - name: timestampField, - validTypes: ['date'], - }, - { - name: partitionField, - validTypes: ['keyword'], - }, - ]); +const getDefaultJobConfigs = (jobId: JobType) => { + switch (jobId) { + case 'hosts_memory_usage': + return { + datafeed: MemoryDatafeed, + job: MemoryJob, + }; + case 'hosts_network_in': + return { + datafeed: NetworkInDatafeed, + job: NetworkInJob, + }; + case 'hosts_network_out': + return { + datafeed: NetworkOutDatafeed, + job: NetworkOutJob, + }; + } }; -const validateSetupDatasets = async ( - indices: string[], - timestampField: string, - startTime: number, - endTime: number -) => { - return await callValidateDatasetsAPI(indices, timestampField, startTime, endTime); +const cleanUpModule = async (spaceId: string, sourceId: string) => { + return await cleanUpJobsAndDatafeeds(spaceId, sourceId, metricsHostsJobTypes); }; export const metricHostsModule: ModuleDescriptor<MetricsHostsJobType> = { @@ -121,6 +174,4 @@ export const metricHostsModule: ModuleDescriptor<MetricsHostsJobType> = { getModuleDefinition, setUpModule, cleanUpModule, - validateSetupDatasets, - validateSetupIndices, }; diff --git a/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts b/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts index cbcff1c307af6..41c6df92fb379 100644 --- a/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts +++ b/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts @@ -10,17 +10,28 @@ import { cleanUpJobsAndDatafeeds } from '../../infra_ml_cleanup'; import { callJobsSummaryAPI } from '../../api/ml_get_jobs_summary_api'; import { callGetMlModuleAPI } from '../../api/ml_get_module'; import { callSetupMlModuleAPI } from '../../api/ml_setup_module_api'; -import { callValidateIndicesAPI } from '../../../logs/log_analysis/api/validate_indices'; -import { callValidateDatasetsAPI } from '../../../logs/log_analysis/api/validate_datasets'; import { metricsK8SJobTypes, getJobId, MetricK8sJobType, DatasetFilter, bucketSpan, - partitionField, } from '../../../../../common/infra_ml'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import MemoryJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/k8s_memory_usage.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import MemoryDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/datafeed_k8s_memory_usage.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkInJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/k8s_network_in.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkInDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/datafeed_k8s_network_in.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkOutJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/k8s_network_out.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import NetworkOutDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/datafeed_k8s_network_out.json'; +type JobType = 'k8s_memory_usage' | 'k8s_network_in' | 'k8s_network_out'; +export const DEFAULT_K8S_PARTITION_FIELD = 'kubernetes.namespace'; const moduleId = 'metrics_ui_k8s'; const moduleName = i18n.translate('xpack.infra.ml.metricsModuleName', { defaultMessage: 'Metrics anomanly detection', @@ -54,26 +65,72 @@ const setUpModule = async ( end: number | undefined, datasetFilter: DatasetFilter, { spaceId, sourceId, indices, timestampField }: ModuleSourceConfiguration, - pField?: string + partitionField?: string ) => { const indexNamePattern = indices.join(','); - const jobIds = ['k8s_memory_usage', 'k8s_network_in', 'k8s_network_out']; - const jobOverrides = jobIds.map((id) => ({ - job_id: id, - analysis_config: { - bucket_span: `${bucketSpan}ms`, - }, - data_description: { - time_field: timestampField, - }, - custom_settings: { - metrics_source_config: { - indexPattern: indexNamePattern, - timestampField, - bucketSpan, + const jobIds: JobType[] = ['k8s_memory_usage', 'k8s_network_in', 'k8s_network_out']; + const jobOverrides = jobIds.map((id) => { + const { job: defaultJobConfig } = getDefaultJobConfigs(id); + + // eslint-disable-next-line @typescript-eslint/naming-convention + const analysis_config = { + ...defaultJobConfig.analysis_config, + }; + + if (partitionField) { + analysis_config.detectors[0].partition_field_name = partitionField; + if (analysis_config.influencers.indexOf(partitionField) === -1) { + analysis_config.influencers.push(partitionField); + } + } + + return { + job_id: id, + data_description: { + time_field: timestampField, + }, + analysis_config, + custom_settings: { + metrics_source_config: { + indexPattern: indexNamePattern, + timestampField, + bucketSpan, + }, + }, + }; + }); + + const datafeedOverrides = jobIds.map((id) => { + const { datafeed: defaultDatafeedConfig } = getDefaultJobConfigs(id); + + if (!partitionField || id === 'k8s_memory_usage') { + // Since the host memory usage doesn't have custom aggs, we don't need to do anything to add a partition field + return defaultDatafeedConfig; + } + + // Because the ML K8s jobs ship with a default partition field of {kubernetes.namespace}, ignore that agg and wrap it in our own agg. + const innerAggregation = + defaultDatafeedConfig.aggregations[DEFAULT_K8S_PARTITION_FIELD].aggregations; + + // If we have a partition field, we need to change the aggregation to do a terms agg to partition the data at the top level + const aggregations = { + [partitionField]: { + terms: { + field: partitionField, + size: 25, // 25 is arbitratry and only used to keep the number of buckets to a managable level in the event that the user choose a high cardinality partition field. + }, + aggregations: { + ...innerAggregation, + }, }, - }, - })); + }; + + return { + ...defaultDatafeedConfig, + job_id: id, + aggregations, + }; + }); return callSetupMlModuleAPI( moduleId, @@ -83,34 +140,32 @@ const setUpModule = async ( sourceId, indexNamePattern, jobOverrides, - [] + datafeedOverrides ); }; -const cleanUpModule = async (spaceId: string, sourceId: string) => { - return await cleanUpJobsAndDatafeeds(spaceId, sourceId, metricsK8SJobTypes); -}; - -const validateSetupIndices = async (indices: string[], timestampField: string) => { - return await callValidateIndicesAPI(indices, [ - { - name: timestampField, - validTypes: ['date'], - }, - { - name: partitionField, - validTypes: ['keyword'], - }, - ]); +const getDefaultJobConfigs = (jobId: JobType) => { + switch (jobId) { + case 'k8s_memory_usage': + return { + datafeed: MemoryDatafeed, + job: MemoryJob, + }; + case 'k8s_network_in': + return { + datafeed: NetworkInDatafeed, + job: NetworkInJob, + }; + case 'k8s_network_out': + return { + datafeed: NetworkOutDatafeed, + job: NetworkOutJob, + }; + } }; -const validateSetupDatasets = async ( - indices: string[], - timestampField: string, - startTime: number, - endTime: number -) => { - return await callValidateDatasetsAPI(indices, timestampField, startTime, endTime); +const cleanUpModule = async (spaceId: string, sourceId: string) => { + return await cleanUpJobsAndDatafeeds(spaceId, sourceId, metricsK8SJobTypes); }; export const metricHostsModule: ModuleDescriptor<MetricK8sJobType> = { @@ -124,6 +179,4 @@ export const metricHostsModule: ModuleDescriptor<MetricK8sJobType> = { getModuleDefinition, setUpModule, cleanUpModule, - validateSetupDatasets, - validateSetupIndices, }; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx index b063713fa2c97..b5d224910e819 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx @@ -50,10 +50,10 @@ export const AnomalyDetectionFlyout = () => { return ( <> - <EuiButtonEmpty iconSide={'right'} onClick={openFlyout}> + <EuiButtonEmpty iconSide={'left'} iconType={'inspect'} onClick={openFlyout}> <FormattedMessage id="xpack.infra.ml.anomalyDetectionButton" - defaultMessage="Anomaly Detection" + defaultMessage="Anomaly detection" /> </EuiButtonEmpty> {showFlyout && ( diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx index 801dff9c4a17a..5b520084ebb74 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx @@ -5,7 +5,7 @@ */ import React, { useState, useCallback, useEffect } from 'react'; -import { EuiFlyoutHeader, EuiTitle, EuiFlyoutBody, EuiTabs, EuiTab, EuiSpacer } from '@elastic/eui'; +import { EuiFlyoutHeader, EuiTitle, EuiFlyoutBody, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiText, EuiFlexGroup, EuiFlexItem, EuiCard, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -30,7 +30,7 @@ interface Props { } export const FlyoutHome = (props: Props) => { - const [tab, setTab] = useState<'jobs' | 'anomalies'>('jobs'); + const [tab] = useState<'jobs' | 'anomalies'>('jobs'); const { goToSetup } = props; const { fetchJobStatus: fetchHostJobStatus, @@ -56,18 +56,10 @@ export const FlyoutHome = (props: Props) => { goToSetup('kubernetes'); }, [goToSetup]); - const goToJobs = useCallback(() => { - setTab('jobs'); - }, []); - const jobIds = [ ...(k8sJobSummaries || []).map((k) => k.id), ...(hostJobSummaries || []).map((h) => h.id), ]; - const anomaliesUrl = useLinkProps({ - app: 'ml', - pathname: `/explorer?_g=${createResultsUrl(jobIds)}`, - }); useEffect(() => { if (hasInfraMLReadCapabilities) { @@ -105,30 +97,24 @@ export const FlyoutHome = (props: Props) => { </EuiFlyoutHeader> <EuiFlyoutBody> - <EuiTabs> - <EuiTab isSelected={tab === 'jobs'} onClick={goToJobs}> - <FormattedMessage - defaultMessage="Jobs" - id="xpack.infra.ml.anomalyFlyout.jobsTabLabel" - /> - </EuiTab> - <EuiTab - disabled={jobIds.length === 0} - isSelected={tab === 'anomalies'} - {...anomaliesUrl} - > - <FormattedMessage - defaultMessage="Anomalies" - id="xpack.infra.ml.anomalyFlyout.anomaliesTabLabel" - /> - </EuiTab> - </EuiTabs> + <div> + <EuiText> + <p> + <FormattedMessage + defaultMessage="Anomaly detection is powered by machine learning. Machine learning jobs are available for the following resource types. Enable these jobs to begin detecting anomalies in your infrastructure metrics." + id="xpack.infra.ml.anomalyFlyout.create.description" + /> + </p> + </EuiText> + </div> + <EuiSpacer size="l" /> {hostJobSummaries.length > 0 && ( <> <JobsEnabledCallout hasHostJobs={hostJobSummaries.length > 0} hasK8sJobs={k8sJobSummaries.length > 0} + jobIds={jobIds} /> <EuiSpacer size="l" /> </> @@ -151,6 +137,7 @@ export const FlyoutHome = (props: Props) => { interface CalloutProps { hasHostJobs: boolean; hasK8sJobs: boolean; + jobIds: string[]; } const JobsEnabledCallout = (props: CalloutProps) => { let target = ''; @@ -175,8 +162,34 @@ const JobsEnabledCallout = (props: CalloutProps) => { pathname: '/jobs', }); + const anomaliesUrl = useLinkProps({ + app: 'ml', + pathname: `/explorer?_g=${createResultsUrl(props.jobIds)}`, + }); + return ( <> + <EuiFlexGroup gutterSize={'s'}> + <EuiFlexItem grow={false}> + <EuiButton {...manageJobsLinkProps} style={{ marginRight: 5 }}> + <FormattedMessage + defaultMessage="Manage jobs" + id="xpack.infra.ml.anomalyFlyout.manageJobs" + /> + </EuiButton> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButton {...anomaliesUrl}> + <FormattedMessage + defaultMessage="View anomalies" + id="xpack.infra.ml.anomalyFlyout.anomaliesTabLabel" + /> + </EuiButton> + </EuiFlexItem> + </EuiFlexGroup> + + <EuiSpacer size="l" /> + <EuiCallOut size="m" color="success" @@ -189,13 +202,6 @@ const JobsEnabledCallout = (props: CalloutProps) => { } iconType="check" /> - <EuiSpacer size="l" /> - <EuiButton {...manageJobsLinkProps}> - <FormattedMessage - defaultMessage="Manage Jobs" - id="xpack.infra.ml.anomalyFlyout.manageJobs" - /> - </EuiButton> </> ); }; @@ -211,30 +217,11 @@ interface CreateJobTab { const CreateJobTab = (props: CreateJobTab) => { return ( <> - <div> - <EuiText> - <h3> - <FormattedMessage - defaultMessage="Create ML Jobs" - id="xpack.infra.ml.anomalyFlyout.create.jobsTitle" - /> - </h3> - </EuiText> - <EuiText> - <p> - <FormattedMessage - defaultMessage="Machine Learning jobs are available for the following resource types. Enable these jobs to begin detecting anomalies in your infrastructure metrics" - id="xpack.infra.ml.anomalyFlyout.create.description" - /> - </p> - </EuiText> - </div> - - <EuiSpacer size="l" /> + {/* <EuiSpacer size="l" /> */} <EuiFlexGroup gutterSize={'m'}> <EuiFlexItem> <EuiCard - // isDisabled={props.hasSetupCapabilities} + isDisabled={!props.hasSetupCapabilities} icon={<EuiIcon type={'storage'} />} // title="Hosts" title={ @@ -245,7 +232,7 @@ const CreateJobTab = (props: CreateJobTab) => { } description={ <FormattedMessage - defaultMessage="Detect anomalies for CPU usage, memory usage, network traffic, and load." + defaultMessage="Detect anomalies for memory usage and network traffic." id="xpack.infra.ml.anomalyFlyout.create.hostDescription" /> } @@ -254,7 +241,7 @@ const CreateJobTab = (props: CreateJobTab) => { {props.hasHostJobs && ( <EuiButtonEmpty onClick={props.createHosts}> <FormattedMessage - defaultMessage="Recreate Jobs" + defaultMessage="Recreate jobs" id="xpack.infra.ml.anomalyFlyout.create.recreateButton" /> </EuiButtonEmpty> @@ -262,7 +249,7 @@ const CreateJobTab = (props: CreateJobTab) => { {!props.hasHostJobs && ( <EuiButton onClick={props.createHosts}> <FormattedMessage - defaultMessage="Create Jobs" + defaultMessage="Enable" id="xpack.infra.ml.anomalyFlyout.create.createButton" /> </EuiButton> @@ -273,7 +260,7 @@ const CreateJobTab = (props: CreateJobTab) => { </EuiFlexItem> <EuiFlexItem> <EuiCard - // isDisabled={props.hasSetupCapabilities} + isDisabled={!props.hasSetupCapabilities} icon={<EuiIcon type={'logoKubernetes'} />} title={ <FormattedMessage @@ -283,7 +270,7 @@ const CreateJobTab = (props: CreateJobTab) => { } description={ <FormattedMessage - defaultMessage="Detect anomalies for CPU usage, memory usage, network traffic, and load." + defaultMessage="Detect anomalies for memory usage and network traffic." id="xpack.infra.ml.anomalyFlyout.create.k8sDescription" /> } @@ -292,7 +279,7 @@ const CreateJobTab = (props: CreateJobTab) => { {props.hasK8sJobs && ( <EuiButtonEmpty onClick={props.createK8s}> <FormattedMessage - defaultMessage="Recreate Jobs" + defaultMessage="Recreate jobs" id="xpack.infra.ml.anomalyFlyout.create.recreateButton" /> </EuiButtonEmpty> @@ -300,7 +287,7 @@ const CreateJobTab = (props: CreateJobTab) => { {!props.hasK8sJobs && ( <EuiButton onClick={props.createK8s}> <FormattedMessage - defaultMessage="Create Jobs" + defaultMessage="Enable" id="xpack.infra.ml.anomalyFlyout.create.createButton" /> </EuiButton> diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx index 428c002da6383..c327d187f6bc2 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx @@ -20,6 +20,7 @@ import { useSourceViaHttp } from '../../../../../../containers/source/use_source import { useMetricK8sModuleContext } from '../../../../../../containers/ml/modules/metrics_k8s/module'; import { useMetricHostsModuleContext } from '../../../../../../containers/ml/modules/metrics_hosts/module'; import { FixedDatePicker } from '../../../../../../components/fixed_datepicker'; +import { DEFAULT_K8S_PARTITION_FIELD } from '../../../../../../containers/ml/modules/metrics_k8s/module_descriptor'; interface Props { jobType: 'hosts' | 'kubernetes'; @@ -107,7 +108,7 @@ export const JobSetupScreen = (props: Props) => { useEffect(() => { if (props.jobType === 'kubernetes') { - setPartitionField(['kubernetes.namespace']); + setPartitionField([DEFAULT_K8S_PARTITION_FIELD]); } }, [props.jobType]); From 6caf6d5080394418fba519166dde58addb5a0bf3 Mon Sep 17 00:00:00 2001 From: Dima Arnautov <dmitrii.arnautov@elastic.co> Date: Thu, 1 Oct 2020 17:54:56 +0200 Subject: [PATCH 54/64] [ML] Model management UI fixes and enhancements (#79072) * [ML] link to edit pipeline * [ML] view training data link * [ML] format stats and configs * [ML] refactor date_utils * [ML] fix types * [ML] change "View" icon and label * [ML] revert label change --- .../util/date_utils.test.ts | 0 .../application => common}/util/date_utils.ts | 11 ++- .../annotation_description_list/index.tsx | 12 +-- .../annotations_table/annotations_table.js | 14 +-- .../anomalies_table_columns.js | 2 +- .../anomalies_table/anomaly_details.js | 2 +- .../components/anomalies_table/links_menu.js | 2 +- .../components/data_grid/common.ts | 2 +- .../components/job_messages/job_messages.tsx | 7 +- .../model_snapshots/model_snapshots_table.tsx | 11 +-- .../revert_model_snapshot_flyout.tsx | 5 +- .../analytics_list/expanded_row.tsx | 2 +- .../models_management/expanded_row.tsx | 91 +++++++++++++++++-- .../models_management/models_list.tsx | 10 +- .../explorer_chart_distribution.js | 2 +- .../explorer_chart_single_metric.js | 2 +- .../explorer/explorer_swimlane.tsx | 2 +- .../reducers/explorer_reducer/reducer.ts | 2 +- .../forecasts_table/forecasts_table.js | 14 +-- .../components/job_details/format_values.js | 5 +- .../charts/event_rate_chart/overlay_range.tsx | 8 +- .../components/analytics_panel/table.tsx | 2 +- .../anomaly_detection_panel/table.tsx | 2 +- .../application/services/job_service.js | 2 +- .../forecasting_modal/forecasts_list.js | 2 +- .../timeseries_chart/timeseries_chart.js | 2 +- x-pack/plugins/ml/public/shared.ts | 2 +- 27 files changed, 138 insertions(+), 80 deletions(-) rename x-pack/plugins/ml/{public/application => common}/util/date_utils.test.ts (100%) rename x-pack/plugins/ml/{public/application => common}/util/date_utils.ts (78%) diff --git a/x-pack/plugins/ml/public/application/util/date_utils.test.ts b/x-pack/plugins/ml/common/util/date_utils.test.ts similarity index 100% rename from x-pack/plugins/ml/public/application/util/date_utils.test.ts rename to x-pack/plugins/ml/common/util/date_utils.test.ts diff --git a/x-pack/plugins/ml/public/application/util/date_utils.ts b/x-pack/plugins/ml/common/util/date_utils.ts similarity index 78% rename from x-pack/plugins/ml/public/application/util/date_utils.ts rename to x-pack/plugins/ml/common/util/date_utils.ts index 21adc0b4b9c66..73ac68b2493f3 100644 --- a/x-pack/plugins/ml/public/application/util/date_utils.ts +++ b/x-pack/plugins/ml/common/util/date_utils.ts @@ -6,10 +6,11 @@ // utility functions for handling dates -// @ts-ignore -import { formatDate } from '@elastic/eui/lib/services/format'; import dateMath from '@elastic/datemath'; -import { TimeRange } from '../../../../../../src/plugins/data/common'; +import { formatDate } from '@elastic/eui'; +import { TimeRange } from '../../../../../src/plugins/data/common'; +import { TIME_FORMAT } from '../constants/time_format'; + export function formatHumanReadableDate(ts: number) { return formatDate(ts, 'MMMM Do YYYY'); } @@ -28,3 +29,7 @@ export function validateTimeRange(time?: TimeRange): boolean { const momentDateTo = dateMath.parse(time.to); return !!(momentDateFrom && momentDateFrom.isValid() && momentDateTo && momentDateTo.isValid()); } + +export const timeFormatter = (value: number) => { + return formatDate(value, TIME_FORMAT); +}; diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx b/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx index eee2f8dca244d..156ad72ba9f9f 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx +++ b/x-pack/plugins/ml/public/application/components/annotations/annotation_description_list/index.tsx @@ -15,7 +15,7 @@ import { EuiDescriptionList } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Annotation } from '../../../../../common/types/annotations'; -import { formatHumanReadableDateTimeSeconds } from '../../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../../common/util/date_utils'; interface Props { annotation: Annotation; @@ -61,7 +61,7 @@ export const AnnotationDescriptionList = ({ annotation, detectorDescription }: P defaultMessage: 'Created by', } ), - description: annotation.create_username, + description: annotation.create_username ?? '', }); listItems.push({ title: i18n.translate( @@ -79,7 +79,7 @@ export const AnnotationDescriptionList = ({ annotation, detectorDescription }: P defaultMessage: 'Modified by', } ), - description: annotation.modified_username, + description: annotation.modified_username ?? '', }); } if (detectorDescription !== undefined) { @@ -94,19 +94,19 @@ export const AnnotationDescriptionList = ({ annotation, detectorDescription }: P if (annotation.partition_field_name !== undefined) { listItems.push({ title: annotation.partition_field_name, - description: annotation.partition_field_value, + description: annotation.partition_field_value ?? '', }); } if (annotation.over_field_name !== undefined) { listItems.push({ title: annotation.over_field_name, - description: annotation.over_field_value, + description: annotation.over_field_value ?? '', }); } if (annotation.by_field_name !== undefined) { listItems.push({ title: annotation.by_field_name, - description: annotation.by_field_value, + description: annotation.by_field_value ?? '', }); } diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js index 0527b8f6d9f60..7eb280c6247c2 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js +++ b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js @@ -31,8 +31,6 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services'; -import { formatDate } from '@elastic/eui/lib/services/format'; - import { addItemToRecentlyAccessed } from '../../../util/recently_accessed'; import { ml } from '../../../services/ml_api_service'; import { mlJobService } from '../../../services/job_service'; @@ -42,7 +40,6 @@ import { getLatestDataOrBucketTimestamp, isTimeSeriesViewJob, } from '../../../../../common/util/job_utils'; -import { TIME_FORMAT } from '../../../../../common/constants/time_format'; import { annotation$, @@ -56,6 +53,7 @@ import { import { withKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { ML_APP_URL_GENERATOR, ML_PAGES } from '../../../../../common/constants/ml_url_generator'; import { PLUGIN_ID } from '../../../../../common/constants/app'; +import { timeFormatter } from '../../../../../common/util/date_utils'; const CURRENT_SERIES = 'current_series'; /** @@ -377,10 +375,6 @@ class AnnotationsTableUI extends Component { ); } - function renderDate(date) { - return formatDate(date, TIME_FORMAT); - } - const columns = [ { field: 'annotation', @@ -397,7 +391,7 @@ class AnnotationsTableUI extends Component { defaultMessage: 'From', }), dataType: 'date', - render: renderDate, + render: timeFormatter, sortable: true, }, { @@ -406,7 +400,7 @@ class AnnotationsTableUI extends Component { defaultMessage: 'To', }), dataType: 'date', - render: renderDate, + render: timeFormatter, sortable: true, }, { @@ -415,7 +409,7 @@ class AnnotationsTableUI extends Component { defaultMessage: 'Last modified date', }), dataType: 'date', - render: renderDate, + render: timeFormatter, sortable: true, }, { diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js index 1f8c8633afa47..d2c4122bc1b57 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js @@ -16,7 +16,7 @@ import { formatHumanReadableDate, formatHumanReadableDateTime, formatHumanReadableDateTimeSeconds, -} from '../../util/date_utils'; +} from '../../../../common/util/date_utils'; import { DescriptionCell } from './description_cell'; import { DetectorCell } from './detector_cell'; diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.js index cd3875f8cbd2a..a2a3aea5988aa 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.js @@ -26,7 +26,7 @@ import { EuiTabbedContent, EuiText, } from '@elastic/eui'; -import { formatHumanReadableDateTimeSeconds } from '../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../common/util/date_utils'; import { EntityCell } from '../entity_cell'; import { diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js index d898734f34c93..079d56da60e5e 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js @@ -26,7 +26,7 @@ import { getFieldTypeFromMapping } from '../../services/mapping_service'; import { ml } from '../../services/ml_api_service'; import { mlJobService } from '../../services/job_service'; import { getUrlForRecord, openCustomUrlWindow } from '../../util/custom_url_utils'; -import { formatHumanReadableDateTimeSeconds } from '../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../common/util/date_utils'; import { getIndexPatternIdFromName } from '../../util/index_utils'; import { replaceStringTokens } from '../../util/string_utils'; import { ML_APP_URL_GENERATOR, ML_PAGES } from '../../../../common/constants/ml_url_generator'; diff --git a/x-pack/plugins/ml/public/application/components/data_grid/common.ts b/x-pack/plugins/ml/public/application/components/data_grid/common.ts index f252729cc20cd..36b0573d609d8 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/common.ts +++ b/x-pack/plugins/ml/public/application/components/data_grid/common.ts @@ -37,7 +37,7 @@ import { OUTLIER_SCORE, TOP_CLASSES, } from '../../data_frame_analytics/common/constants'; -import { formatHumanReadableDateTimeSeconds } from '../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../common/util/date_utils'; import { getNestedProperty } from '../../util/object_utils'; import { mlFieldFormatService } from '../../services/field_format_service'; diff --git a/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx b/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx index 798ceae0f0732..f60cd61b25cd4 100644 --- a/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx +++ b/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx @@ -7,14 +7,13 @@ import React, { FC } from 'react'; import { EuiSpacer, EuiInMemoryTable, EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -// @ts-ignore -import { formatDate } from '@elastic/eui/lib/services/format'; + import { i18n } from '@kbn/i18n'; import theme from '@elastic/eui/dist/eui_theme_light.json'; import { JobMessage } from '../../../../common/types/audit_message'; -import { TIME_FORMAT } from '../../../../common/constants/time_format'; import { JobIcon } from '../job_message_icon'; +import { timeFormatter } from '../../../../common/util/date_utils'; interface JobMessagesProps { messages: JobMessage[]; @@ -55,7 +54,7 @@ export const JobMessages: FC<JobMessagesProps> = ({ messages, loading, error, re name: i18n.translate('xpack.ml.jobMessages.timeLabel', { defaultMessage: 'Time', }), - render: (timestamp: number) => formatDate(timestamp, TIME_FORMAT), + render: timeFormatter, width: '120px', sortable: true, }, diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx index 64fdd97903b60..5b175eb06a4a3 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx @@ -13,7 +13,6 @@ import { EuiInMemoryTable, EuiLoadingSpinner, EuiBasicTableColumn, - formatDate, } from '@elastic/eui'; import { checkPermission } from '../../capabilities/check_capabilities'; @@ -21,12 +20,12 @@ import { EditModelSnapshotFlyout } from './edit_model_snapshot_flyout'; import { RevertModelSnapshotFlyout } from './revert_model_snapshot_flyout'; import { ml } from '../../services/ml_api_service'; import { JOB_STATE, DATAFEED_STATE } from '../../../../common/constants/states'; -import { TIME_FORMAT } from '../../../../common/constants/time_format'; import { CloseJobConfirm } from './close_job_confirm'; import { ModelSnapshot, CombinedJobWithStats, } from '../../../../common/types/anomaly_detection_jobs'; +import { timeFormatter } from '../../../../common/util/date_utils'; interface Props { job: CombinedJobWithStats; @@ -138,7 +137,7 @@ export const ModelSnapshotTable: FC<Props> = ({ job, refreshJobList }) => { defaultMessage: 'Date created', }), dataType: 'date', - render: renderDate, + render: timeFormatter, sortable: true, }, { @@ -147,7 +146,7 @@ export const ModelSnapshotTable: FC<Props> = ({ job, refreshJobList }) => { defaultMessage: 'Latest timestamp', }), dataType: 'date', - render: renderDate, + render: timeFormatter, sortable: true, }, { @@ -246,10 +245,6 @@ export const ModelSnapshotTable: FC<Props> = ({ job, refreshJobList }) => { ); }; -function renderDate(date: number) { - return formatDate(date, TIME_FORMAT); -} - async function getCombinedJobState(jobId: string) { const jobs = await ml.jobs.jobs([jobId]); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx index e37efe60f8018..62f5623f67964 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx @@ -32,7 +32,6 @@ import { EuiHorizontalRule, EuiSuperSelect, EuiText, - formatDate, } from '@elastic/eui'; import { @@ -47,8 +46,8 @@ import { LineChartPoint } from '../../../jobs/new_job/common/chart_loader'; import { EventRateChart } from '../../../jobs/new_job/pages/components/charts/event_rate_chart/event_rate_chart'; import { Anomaly } from '../../../jobs/new_job/common/results_loader/results_loader'; import { parseInterval } from '../../../../../common/util/parse_interval'; -import { TIME_FORMAT } from '../../../../../common/constants/time_format'; import { CreateCalendar, CalendarEvent } from './create_calendar'; +import { timeFormatter } from '../../../../../common/util/date_utils'; interface Props { snapshot: ModelSnapshot; @@ -255,7 +254,7 @@ export const RevertModelSnapshotFlyout: FC<Props> = ({ snapshot, snapshots, job, <FormattedMessage id="xpack.ml.newJob.wizard.revertModelSnapshotFlyout.warningCallout.contents" defaultMessage="All anomaly detection results after {date} will be deleted." - values={{ date: formatDate(currentSnapshot.latest_record_time_stamp, TIME_FORMAT) }} + values={{ date: timeFormatter(currentSnapshot.latest_record_time_stamp) }} /> </EuiCallOut> diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx index 95204f9ba09fc..a0bd437a667a2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx @@ -11,7 +11,7 @@ import { EuiIcon, EuiLoadingSpinner, EuiTabbedContent } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { formatHumanReadableDateTimeSeconds } from '../../../../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../../../../common/util/date_utils'; import { DataFrameAnalyticsListRow } from './common'; import { ExpandedRowDetailsPane, SectionConfig, SectionItem } from './expanded_row_details_pane'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/expanded_row.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/expanded_row.tsx index 7b9329fee783b..803a2523a55e0 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/expanded_row.tsx @@ -20,16 +20,35 @@ import { EuiHorizontalRule, EuiFlexGroup, EuiTextColor, + EuiButtonEmpty, + EuiBadge, } from '@elastic/eui'; -// @ts-ignore -import { formatDate } from '@elastic/eui/lib/services/format'; +import { EuiDescriptionListProps } from '@elastic/eui/src/components/description_list/description_list'; import { ModelItemFull } from './models_list'; -import { TIME_FORMAT } from '../../../../../../../common/constants/time_format'; +import { useMlKibana } from '../../../../../contexts/kibana'; +import { timeFormatter } from '../../../../../../../common/util/date_utils'; interface ExpandedRowProps { item: ModelItemFull; } +const formatterDictionary: Record<string, (value: any) => JSX.Element | string | undefined> = { + tags: (tags: string[]) => { + if (tags.length === 0) return; + return ( + <div> + {tags.map((tag) => ( + <EuiBadge key={tag} color="hollow"> + {tag} + </EuiBadge> + ))} + </div> + ); + }, + create_time: timeFormatter, + timestamp: timeFormatter, +}; + export const ExpandedRow: FC<ExpandedRowProps> = ({ item }) => { const { inference_config: inferenceConfig, @@ -57,19 +76,45 @@ export const ExpandedRow: FC<ExpandedRowProps> = ({ item }) => { license_level, }; - function formatToListItems(items: Record<string, any>) { + function formatToListItems(items: Record<string, any>): EuiDescriptionListProps['listItems'] { return Object.entries(items) .map(([title, value]) => { - if (title.includes('timestamp')) { - value = formatDate(value, TIME_FORMAT); + if (title in formatterDictionary) { + return { + title, + description: formatterDictionary[title](value), + }; } - return { title, description: typeof value === 'object' ? JSON.stringify(value) : value }; + return { + title, + description: + typeof value === 'object' ? ( + <EuiCodeBlock + language="json" + fontSize="s" + paddingSize="s" + overflowHeight={300} + isCopyable={false} + > + {JSON.stringify(value, null, 2)} + </EuiCodeBlock> + ) : ( + value + ), + }; }) .filter(({ description }) => { return description !== undefined; }); } + const { + services: { + share, + application: { navigateToUrl }, + }, + } = useMlKibana(); + const tabs = [ { id: 'details', @@ -323,9 +368,35 @@ export const ExpandedRow: FC<ExpandedRowProps> = ({ item }) => { return ( <EuiFlexItem key={pipelineName}> <EuiPanel> - <EuiTitle size={'xs'}> - <h5>{pipelineName}</h5> - </EuiTitle> + <EuiFlexGroup alignItems="center" justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <EuiTitle size={'xs'}> + <h5>{pipelineName}</h5> + </EuiTitle> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + onClick={async () => { + const ingestPipelinesAppUrlGenerator = share.urlGenerators.getUrlGenerator( + 'INGEST_PIPELINES_APP_URL_GENERATOR' + ); + await navigateToUrl( + await ingestPipelinesAppUrlGenerator.createUrl({ + page: 'pipeline_edit', + pipelineId: pipelineName, + absolute: true, + }) + ); + }} + > + <FormattedMessage + id="xpack.ml.inference.modelsList.expandedRow.editPipelineLabel" + defaultMessage="Edit" + /> + </EuiButtonEmpty> + </EuiFlexItem> + </EuiFlexGroup> + {description && <EuiText>{description}</EuiText>} <EuiSpacer size={'m'} /> <EuiTitle size={'xxs'}> diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/models_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/models_list.tsx index dbc7a23f2258b..d5a7ca6e96c06 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/models_management/models_list.tsx @@ -19,15 +19,13 @@ import { EuiBadge, SearchFilterConfig, } from '@elastic/eui'; -// @ts-ignore -import { formatDate } from '@elastic/eui/lib/services/format'; + import { EuiBasicTableColumn } from '@elastic/eui/src/components/basic_table/basic_table'; import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; import { Action } from '@elastic/eui/src/components/basic_table/action_types'; import { StatsBar, ModelsBarStats } from '../../../../../components/stats_bar'; import { useInferenceApiService } from '../../../../../services/ml_api_service/inference'; import { ModelsTableToConfigMapping } from './index'; -import { TIME_FORMAT } from '../../../../../../../common/constants/time_format'; import { DeleteModelsModal } from './delete_models_modal'; import { useMlKibana, useMlUrlGenerator, useNotifications } from '../../../../../contexts/kibana'; import { ExpandedRow } from './expanded_row'; @@ -46,6 +44,7 @@ import { useTableSettings } from '../analytics_list/use_table_settings'; import { filterAnalyticsModels, AnalyticsSearchBar } from '../analytics_search_bar'; import { ML_PAGES } from '../../../../../../../common/constants/ml_url_generator'; import { DataFrameAnalysisConfigType } from '../../../../../../../common/types/data_frame_analytics'; +import { timeFormatter } from '../../../../../../../common/util/date_utils'; type Stats = Omit<TrainedModelStat, 'model_id'>; @@ -277,7 +276,7 @@ export const ModelsList: FC = () => { description: i18n.translate('xpack.ml.inference.modelsList.viewTrainingDataActionLabel', { defaultMessage: 'View training data', }), - icon: 'list', + icon: 'visTable', type: 'icon', available: (item) => item.metadata?.analytics_config?.id, onClick: async (item) => { @@ -290,6 +289,7 @@ export const ModelsList: FC = () => { analysisType: getAnalysisType( item.metadata?.analytics_config.analysis ) as DataFrameAnalysisConfigType, + defaultIsTraining: true, }, }); @@ -375,7 +375,7 @@ export const ModelsList: FC = () => { defaultMessage: 'Created at', }), dataType: 'date', - render: (date: string) => formatDate(date, TIME_FORMAT), + render: timeFormatter, sortable: true, }, { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js index 00aca5d43be85..994975912cd6f 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js @@ -17,7 +17,7 @@ import d3 from 'd3'; import $ from 'jquery'; import moment from 'moment'; -import { formatHumanReadableDateTime } from '../../util/date_utils'; +import { formatHumanReadableDateTime } from '../../../../common/util/date_utils'; import { formatValue } from '../../formatters/format_value'; import { getSeverityColor, getSeverityWithLow } from '../../../../common/util/anomaly_utils'; import { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js index 0a76211f2e330..606d1c0690422 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js @@ -17,7 +17,7 @@ import $ from 'jquery'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; -import { formatHumanReadableDateTime } from '../../util/date_utils'; +import { formatHumanReadableDateTime } from '../../../../common/util/date_utils'; import { formatValue } from '../../formatters/format_value'; import { getSeverityColor, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx index 359dc11ca08d1..569709d648b3c 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { Subject, Subscription } from 'rxjs'; import { TooltipValue } from '@elastic/charts'; import { htmlIdGenerator } from '@elastic/eui'; -import { formatHumanReadableDateTime } from '../util/date_utils'; +import { formatHumanReadableDateTime } from '../../../common/util/date_utils'; import { numTicksForDateFormat } from '../util/chart_utils'; import { getSeverityColor } from '../../../common/util/anomaly_utils'; import { mlEscape } from '../util/string_utils'; diff --git a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts index a38044a8b3425..c5fb0175c54e9 100644 --- a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts +++ b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/reducer.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { formatHumanReadableDateTime } from '../../../util/date_utils'; +import { formatHumanReadableDateTime } from '../../../../../common/util/date_utils'; import { getDefaultChartsData } from '../../explorer_charts/explorer_charts_container_service'; import { EXPLORER_ACTION, VIEW_BY_JOB_LABEL } from '../../explorer_constants'; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js index b32070fff73aa..44ebde634714c 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/forecasts_table/forecasts_table.js @@ -16,10 +16,9 @@ import { EuiLink, EuiLoadingSpinner, } from '@elastic/eui'; -import { formatDate, formatNumber } from '@elastic/eui/lib/services/format'; +import { formatNumber } from '@elastic/eui/lib/services/format'; import { FORECAST_REQUEST_STATE } from '../../../../../../../common/constants/states'; -import { TIME_FORMAT } from '../../../../../../../common/constants/time_format'; import { addItemToRecentlyAccessed } from '../../../../../util/recently_accessed'; import { mlForecastService } from '../../../../../services/forecast_service'; import { i18n } from '@kbn/i18n'; @@ -34,6 +33,7 @@ import { ML_PAGES, } from '../../../../../../../common/constants/ml_url_generator'; import { PLUGIN_ID } from '../../../../../../../common/constants/app'; +import { timeFormatter } from '../../../../../../../common/util/date_utils'; const MAX_FORECASTS = 500; @@ -218,7 +218,7 @@ export class ForecastsTableUI extends Component { defaultMessage: 'Created', }), dataType: 'date', - render: (date) => formatDate(date, TIME_FORMAT), + render: timeFormatter, textOnly: true, sortable: true, scope: 'row', @@ -229,7 +229,7 @@ export class ForecastsTableUI extends Component { defaultMessage: 'From', }), dataType: 'date', - render: (date) => formatDate(date, TIME_FORMAT), + render: timeFormatter, textOnly: true, sortable: true, }, @@ -239,7 +239,7 @@ export class ForecastsTableUI extends Component { defaultMessage: 'To', }), dataType: 'date', - render: (date) => formatDate(date, TIME_FORMAT), + render: timeFormatter, textOnly: true, sortable: true, }, @@ -277,7 +277,7 @@ export class ForecastsTableUI extends Component { name: i18n.translate('xpack.ml.jobsList.jobDetails.forecastsTable.expiresLabel', { defaultMessage: 'Expires', }), - render: (date) => formatDate(date, TIME_FORMAT), + render: timeFormatter, textOnly: true, sortable: true, }, @@ -309,7 +309,7 @@ export class ForecastsTableUI extends Component { { defaultMessage: 'View forecast created at {createdDate}', values: { - createdDate: formatDate(forecast.forecast_create_timestamp, TIME_FORMAT), + createdDate: timeFormatter(forecast.forecast_create_timestamp), }, } ); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js index 3fe4f0e5477a2..eff407a41fb0d 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js @@ -5,10 +5,9 @@ */ import numeral from '@elastic/numeral'; -import { formatDate } from '@elastic/eui/lib/services/format'; import { roundToDecimalPlace } from '../../../../formatters/round_to_decimal_place'; import { toLocaleString } from '../../../../util/string_utils'; -import { TIME_FORMAT } from '../../../../../../common/constants/time_format'; +import { timeFormatter } from '../../../../../../common/util/date_utils'; const DATA_FORMAT = '0.0 b'; @@ -29,7 +28,7 @@ export function formatValues([key, value]) { case 'latest_empty_bucket_timestamp': case 'latest_sparse_bucket_timestamp': case 'latest_bucket_timestamp': - value = formatDate(value, TIME_FORMAT); + value = timeFormatter(value); break; // data diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/overlay_range.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/overlay_range.tsx index a35c2d9c833a8..8ad359251b029 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/overlay_range.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/event_rate_chart/overlay_range.tsx @@ -5,12 +5,10 @@ */ import React, { FC } from 'react'; -// @ts-ignore -import { formatDate } from '@elastic/eui/lib/services/format'; import { EuiIcon } from '@elastic/eui'; import { RectAnnotation, LineAnnotation, AnnotationDomainTypes } from '@elastic/charts'; import { LineChartPoint } from '../../../../common/chart_loader'; -import { TIME_FORMAT } from '../../../../../../../../common/constants/time_format'; +import { timeFormatter } from '../../../../../../../../common/util/date_utils'; interface Props { overlayKey: number; @@ -70,9 +68,7 @@ export const OverlayRange: FC<Props> = ({ <div style={{ textAlign: 'center' }}> <EuiIcon type="arrowUp" /> </div> - <div style={{ fontWeight: 'normal', color: '#343741' }}> - {formatDate(start, TIME_FORMAT)} - </div> + <div style={{ fontWeight: 'normal', color: '#343741' }}>{timeFormatter(start)}</div> </div> </> ) : undefined diff --git a/x-pack/plugins/ml/public/application/overview/components/analytics_panel/table.tsx b/x-pack/plugins/ml/public/application/overview/components/analytics_panel/table.tsx index fc0645a0e9498..4b469a0f5874d 100644 --- a/x-pack/plugins/ml/public/application/overview/components/analytics_panel/table.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/analytics_panel/table.tsx @@ -23,7 +23,7 @@ import { getTaskStateBadge, progressColumn, } from '../../../data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns'; -import { formatHumanReadableDateTimeSeconds } from '../../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../../common/util/date_utils'; import { ViewLink } from './actions'; diff --git a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/table.tsx b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/table.tsx index 8515431d49b17..b95aed01ebae8 100644 --- a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/table.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/table.tsx @@ -20,7 +20,7 @@ import { EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { formatHumanReadableDateTimeSeconds } from '../../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../../common/util/date_utils'; import { ExplorerLink } from './actions'; import { getJobsFromGroup } from './utils'; import { GroupsDictionary, Group } from './anomaly_detection_panel'; diff --git a/x-pack/plugins/ml/public/application/services/job_service.js b/x-pack/plugins/ml/public/application/services/job_service.js index 939ad34e77a39..0971b47605135 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.js +++ b/x-pack/plugins/ml/public/application/services/job_service.js @@ -15,7 +15,7 @@ import { isWebUrl } from '../util/url_utils'; import { ML_DATA_PREVIEW_COUNT } from '../../../common/util/job_utils'; import { TIME_FORMAT } from '../../../common/constants/time_format'; import { parseInterval } from '../../../common/util/parse_interval'; -import { validateTimeRange } from '../util/date_utils'; +import { validateTimeRange } from '../../../common/util/date_utils'; let jobs = []; let datafeedIds = {}; diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js index cbc2c324a8bc6..2378d8c835ce9 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js @@ -13,7 +13,7 @@ import React from 'react'; import { EuiButtonIcon, EuiIcon, EuiInMemoryTable, EuiText, EuiToolTip } from '@elastic/eui'; -import { formatHumanReadableDateTimeSeconds } from '../../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../../common/util/date_utils'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 1d166b7be9bc1..4c87c3b374ff3 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -33,7 +33,7 @@ import { showMultiBucketAnomalyMarker, showMultiBucketAnomalyTooltip, } from '../../../util/chart_utils'; -import { formatHumanReadableDateTimeSeconds } from '../../../util/date_utils'; +import { formatHumanReadableDateTimeSeconds } from '../../../../../common/util/date_utils'; import { getTimeBucketsFromCache } from '../../../util/time_buckets'; import { mlTableService } from '../../../services/table_service'; import { ContextChartMask } from '../context_chart_mask'; diff --git a/x-pack/plugins/ml/public/shared.ts b/x-pack/plugins/ml/public/shared.ts index ec884bfac5351..62b8179c9d5b2 100644 --- a/x-pack/plugins/ml/public/shared.ts +++ b/x-pack/plugins/ml/public/shared.ts @@ -20,4 +20,4 @@ export * from '../common/util/validators'; export * from './application/formatters/metric_change_description'; export * from './application/components/data_grid'; export * from './application/data_frame_analytics/common'; -export * from './application/util/date_utils'; +export * from '../common/util/date_utils'; From e248f32111626e0909d3fad4339f3b625bd71493 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:58:23 -0400 Subject: [PATCH 55/64] [Lens] Consistent Drag and Drop styles (#78674) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove wrapping div of DragDrop and pass props to child * Using EuiHighlight * Basic styles in for all DnD states * Fixing dimension button styles * Fix FieldButton to accept `…rest` props * A few other minor fixes * Fixed horizontal scroll of error message * Quick fix for invalid link --- .../public/field_button/field_button.tsx | 37 ++- x-pack/plugins/lens/public/_mixins.scss | 36 +++ .../__snapshots__/drag_drop.test.tsx.snap | 18 +- .../lens/public/drag_drop/drag_drop.scss | 55 +++- .../lens/public/drag_drop/drag_drop.test.tsx | 30 +- .../lens/public/drag_drop/drag_drop.tsx | 65 ++-- .../config_panel/config_panel.scss | 2 +- .../config_panel/config_panel.tsx | 6 +- .../config_panel/dimension_container.tsx | 2 +- .../config_panel/layer_panel.scss | 37 ++- .../editor_frame/config_panel/layer_panel.tsx | 302 ++++++++++-------- .../editor_frame/frame_layout.scss | 2 +- .../workspace_panel/workspace_panel.tsx | 12 +- .../workspace_panel_wrapper.scss | 27 +- .../indexpattern_datasource/datapanel.scss | 2 +- .../dimension_panel/dimension_panel.tsx | 22 +- .../indexpattern_datasource/field_item.scss | 20 +- .../indexpattern_datasource/field_item.tsx | 37 +-- .../definitions/shared_components/buckets.tsx | 10 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 21 files changed, 431 insertions(+), 293 deletions(-) diff --git a/src/plugins/kibana_react/public/field_button/field_button.tsx b/src/plugins/kibana_react/public/field_button/field_button.tsx index 97d1b32746120..4c0298a65ba5d 100644 --- a/src/plugins/kibana_react/public/field_button/field_button.tsx +++ b/src/plugins/kibana_react/public/field_button/field_button.tsx @@ -19,7 +19,8 @@ import './field_button.scss'; import classNames from 'classnames'; -import React, { ReactNode, HTMLAttributes } from 'react'; +import React, { ReactNode, HTMLAttributes, ButtonHTMLAttributes } from 'react'; +import { CommonProps } from '@elastic/eui'; export interface FieldButtonProps extends HTMLAttributes<HTMLDivElement> { /** @@ -56,7 +57,14 @@ export interface FieldButtonProps extends HTMLAttributes<HTMLDivElement> { * The component will render a `<button>` when provided an `onClick` */ onClick?: () => void; + /** + * Applies to the inner `<button>` or `<div>` + */ dataTestSubj?: string; + /** + * Pass more button props to the `<button>` element + */ + buttonProps?: ButtonHTMLAttributes<HTMLButtonElement> & CommonProps; } const sizeToClassNameMap = { @@ -79,6 +87,8 @@ export function FieldButton({ isDraggable = false, onClick, dataTestSubj, + buttonProps, + ...rest }: FieldButtonProps) { const classes = classNames( 'kbnFieldButton', @@ -88,8 +98,18 @@ export function FieldButton({ className ); + const contentClasses = classNames('kbn-resetFocusState', 'kbnFieldButton__button'); + + const innerContent = ( + <> + {fieldIcon && <span className="kbnFieldButton__fieldIcon">{fieldIcon}</span>} + {fieldName && <span className="kbnFieldButton__name">{fieldName}</span>} + {fieldInfoIcon && <div className="kbnFieldButton__infoIcon">{fieldInfoIcon}</div>} + </> + ); + return ( - <div className={classes}> + <div className={classes} {...rest}> {onClick ? ( <button onClick={(e) => { @@ -99,17 +119,14 @@ export function FieldButton({ onClick(); }} data-test-subj={dataTestSubj} - className={'kbn-resetFocusState kbnFieldButton__button'} + className={contentClasses} + {...buttonProps} > - {fieldIcon && <span className="kbnFieldButton__fieldIcon">{fieldIcon}</span>} - {fieldName && <span className="kbnFieldButton__name">{fieldName}</span>} - {fieldInfoIcon && <div className="kbnFieldButton__infoIcon">{fieldInfoIcon}</div>} + {innerContent} </button> ) : ( - <div className={'kbn-resetFocusState kbnFieldButton__button'} data-test-subj={dataTestSubj}> - {fieldIcon && <span className="kbnFieldButton__fieldIcon">{fieldIcon}</span>} - {fieldName && <span className="kbnFieldButton__name">{fieldName}</span>} - {fieldInfoIcon && <div className="kbnFieldButton__infoIcon">{fieldInfoIcon}</div>} + <div className={contentClasses} data-test-subj={dataTestSubj}> + {innerContent} </div> )} diff --git a/x-pack/plugins/lens/public/_mixins.scss b/x-pack/plugins/lens/public/_mixins.scss index a3cf6caa5a429..0db72d118cef1 100644 --- a/x-pack/plugins/lens/public/_mixins.scss +++ b/x-pack/plugins/lens/public/_mixins.scss @@ -11,3 +11,39 @@ transparentize(red, .9) 100% ); } + +// Static styles for a draggable item +@mixin lnsDraggable { + @include euiSlightShadow; + background: lightOrDarkTheme($euiColorEmptyShade, $euiColorLightestShade); + border: $euiBorderWidthThin dashed transparent; + cursor: grab; +} + +// Static styles for a drop area +@mixin lnsDroppable { + border: $euiBorderWidthThin dashed $euiBorderColor; +} + +// Hovering state for drag item and drop area +@mixin lnsDragDropHover { + &:hover { + border: $euiBorderWidthThin dashed $euiColorMediumShade; + } +} + +// Style for drop area when there's an item being dragged +@mixin lnsDroppableActive { + background-color: transparentize($euiColorVis0, .9); +} + +// Style for drop area while hovering with item +@mixin lnsDroppableActiveHover { + background-color: transparentize($euiColorVis0, .75); + border: $euiBorderWidthThin dashed $euiColorVis0; +} + +// Style for drop area that is not allowed for current item +@mixin lnsDroppableNotAllowed { + opacity: .5; +} diff --git a/x-pack/plugins/lens/public/drag_drop/__snapshots__/drag_drop.test.tsx.snap b/x-pack/plugins/lens/public/drag_drop/__snapshots__/drag_drop.test.tsx.snap index 3581151dd5f76..dc53f3a2bc2a7 100644 --- a/x-pack/plugins/lens/public/drag_drop/__snapshots__/drag_drop.test.tsx.snap +++ b/x-pack/plugins/lens/public/drag_drop/__snapshots__/drag_drop.test.tsx.snap @@ -1,17 +1,17 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`DragDrop droppable is reflected in the className 1`] = ` -<div - class="lnsDragDrop lnsDragDrop-isDropTarget" +<button + class="lnsDragDrop lnsDragDrop-isDroppable lnsDragDrop-isDropTarget" data-test-subj="lnsDragDrop" > Hello! -</div> +</button> `; exports[`DragDrop items that have droppable=false get special styling when another item is dragged 1`] = ` -<div - className="lnsDragDrop lnsDragDrop-isNotDroppable" +<button + className="lnsDragDrop lnsDragDrop-isDroppable lnsDragDrop-isNotDroppable" data-test-subj="lnsDragDrop" onDragEnd={[Function]} onDragLeave={[Function]} @@ -20,15 +20,15 @@ exports[`DragDrop items that have droppable=false get special styling when anoth onDrop={[Function]} > Hello! -</div> +</button> `; exports[`DragDrop renders if nothing is being dragged 1`] = ` -<div - class="lnsDragDrop" +<button + class="lnsDragDrop lnsDragDrop-isDraggable" data-test-subj="lnsDragDrop" draggable="true" > Hello! -</div> +</button> `; diff --git a/x-pack/plugins/lens/public/drag_drop/drag_drop.scss b/x-pack/plugins/lens/public/drag_drop/drag_drop.scss index c971540e165c1..410aaef9a5195 100644 --- a/x-pack/plugins/lens/public/drag_drop/drag_drop.scss +++ b/x-pack/plugins/lens/public/drag_drop/drag_drop.scss @@ -1,13 +1,54 @@ -.lnsDragDrop-isNotDroppable { - opacity: .5; +@import '../variables'; +@import '../mixins'; + +.lnsDragDrop { + transition: background-color $euiAnimSpeedFast ease-in-out, border-color $euiAnimSpeedFast ease-in-out; +} + +// Draggable item +.lnsDragDrop-isDraggable { + @include lnsDraggable; + @include lnsDragDropHover; + + // Include a possible nested button like when using FieldButton + > .kbnFieldButton__button { + cursor: grab; + } + + &:focus { + @include euiFocusRing; + } +} + +// Draggable item when it is moving +.lnsDragDrop-isHidden { + opacity: 0; +} + +// Drop area +.lnsDragDrop-isDroppable { + @include lnsDroppable; } -// Fix specificity by chaining classes +// Drop area when there's an item being dragged +.lnsDragDrop-isDropTarget { + @include lnsDroppableActive; +} -.lnsDragDrop.lnsDragDrop-isDropTarget { - background-color: transparentize($euiColorSecondary, .9); +// Drop area while hovering with item +.lnsDragDrop-isActiveDropTarget { + @include lnsDroppableActiveHover; +} + +// Drop area that is not allowed for current item +.lnsDragDrop-isNotDroppable { + @include lnsDroppableNotAllowed; } -.lnsDragDrop.lnsDragDrop-isActiveDropTarget { - background-color: transparentize($euiColorSecondary, .75); +// Drop area will be replacing existing content +.lnsDragDrop-isReplacing { + &, + .lnsLayerPanel__triggerLink { + text-decoration: line-through; + } } diff --git a/x-pack/plugins/lens/public/drag_drop/drag_drop.test.tsx b/x-pack/plugins/lens/public/drag_drop/drag_drop.test.tsx index 3240357c254ea..b1cc4c06c2165 100644 --- a/x-pack/plugins/lens/public/drag_drop/drag_drop.test.tsx +++ b/x-pack/plugins/lens/public/drag_drop/drag_drop.test.tsx @@ -15,7 +15,7 @@ describe('DragDrop', () => { test('renders if nothing is being dragged', () => { const component = render( <DragDrop value="hello" draggable label="dragging"> - Hello! + <button>Hello!</button> </DragDrop> ); @@ -24,7 +24,11 @@ describe('DragDrop', () => { test('dragover calls preventDefault if droppable is true', () => { const preventDefault = jest.fn(); - const component = mount(<DragDrop droppable>Hello!</DragDrop>); + const component = mount( + <DragDrop droppable> + <button>Hello!</button> + </DragDrop> + ); component.find('[data-test-subj="lnsDragDrop"]').simulate('dragover', { preventDefault }); @@ -33,7 +37,11 @@ describe('DragDrop', () => { test('dragover does not call preventDefault if droppable is false', () => { const preventDefault = jest.fn(); - const component = mount(<DragDrop>Hello!</DragDrop>); + const component = mount( + <DragDrop> + <button>Hello!</button> + </DragDrop> + ); component.find('[data-test-subj="lnsDragDrop"]').simulate('dragover', { preventDefault }); @@ -51,7 +59,7 @@ describe('DragDrop', () => { const component = mount( <ChildDragDropProvider dragging={value} setDragging={setDragging}> <DragDrop value={value} draggable={true} label="drag label"> - Hello! + <button>Hello!</button> </DragDrop> </ChildDragDropProvider> ); @@ -74,7 +82,7 @@ describe('DragDrop', () => { const component = mount( <ChildDragDropProvider dragging="hola" setDragging={setDragging}> <DragDrop onDrop={onDrop} droppable={true} value={value}> - Hello! + <button>Hello!</button> </DragDrop> </ChildDragDropProvider> ); @@ -98,7 +106,7 @@ describe('DragDrop', () => { const component = mount( <ChildDragDropProvider dragging="hola" setDragging={setDragging}> <DragDrop onDrop={onDrop} droppable={false} value={{}}> - Hello! + <button>Hello!</button> </DragDrop> </ChildDragDropProvider> ); @@ -121,7 +129,7 @@ describe('DragDrop', () => { }} droppable > - Hello! + <button>Hello!</button> </DragDrop> ); @@ -132,10 +140,10 @@ describe('DragDrop', () => { const component = mount( <ChildDragDropProvider dragging={'ignored'} setDragging={() => {}}> <DragDrop value="ignored" draggable={true} label="a"> - Ignored + <button>Hello!</button> </DragDrop> <DragDrop onDrop={(x: unknown) => {}} droppable={false}> - Hello! + <button>Hello!</button> </DragDrop> </ChildDragDropProvider> ); @@ -154,14 +162,14 @@ describe('DragDrop', () => { }} > <DragDrop value="ignored" draggable={true} label="a"> - Ignored + <button>Hello!</button> </DragDrop> <DragDrop onDrop={(x: unknown) => {}} droppable getAdditionalClassesOnEnter={getAdditionalClasses} > - Hello! + <button>Hello!</button> </DragDrop> </ChildDragDropProvider> ); diff --git a/x-pack/plugins/lens/public/drag_drop/drag_drop.tsx b/x-pack/plugins/lens/public/drag_drop/drag_drop.tsx index 6941974a63cd3..b36415fee5b15 100644 --- a/x-pack/plugins/lens/public/drag_drop/drag_drop.tsx +++ b/x-pack/plugins/lens/public/drag_drop/drag_drop.tsx @@ -41,9 +41,14 @@ interface BaseProps { value?: unknown; /** - * The React children. + * Optional comparison function to check whether a value is the dragged one */ - children: React.ReactNode; + isValueEqual?: (value1: unknown, value2: unknown) => boolean; + + /** + * The React element which will be passed the draggable handlers + */ + children: React.ReactElement; /** * Indicates whether or not the currently dragged item @@ -60,6 +65,18 @@ interface BaseProps { * The optional test subject associated with this DOM element. */ 'data-test-subj'?: string; + + /** + * Indicates to the user whether the currently dragged item + * will be moved or copied + */ + dragType?: 'copy' | 'move'; + + /** + * Indicates to the user whether the drop action will + * replace something that is existing or add a new one + */ + dropType?: 'add' | 'replace'; } /** @@ -98,12 +115,14 @@ type Props = DraggableProps | NonDraggableProps; export const DragDrop = (props: Props) => { const { dragging, setDragging } = useContext(DragContext); - const { value, draggable, droppable } = props; + const { value, draggable, droppable, isValueEqual } = props; return ( <DragDropInner {...props} dragging={droppable ? dragging : undefined} - isDragging={!!(draggable && value === dragging)} + isDragging={ + !!(draggable && ((isValueEqual && isValueEqual(value, dragging)) || value === dragging)) + } isNotDroppable={ // If the configuration has provided a droppable flag, but this particular item is not // droppable, then it should be less prominent. Ignores items that are both @@ -138,17 +157,25 @@ const DragDropInner = React.memo(function DragDropInner( setDragging, isDragging, isNotDroppable, + dragType = 'copy', + dropType = 'add', } = props; + const isMoveDragging = isDragging && dragType === 'move'; + const classes = classNames( 'lnsDragDrop', - className, { + 'lnsDragDrop-isDraggable': draggable, + 'lnsDragDrop-isDragging': isDragging, + 'lnsDragDrop-isHidden': isMoveDragging, + 'lnsDragDrop-isDroppable': !draggable, 'lnsDragDrop-isDropTarget': droppable, 'lnsDragDrop-isActiveDropTarget': droppable && state.isActive, - 'lnsDragDrop-isDragging': isDragging, - 'lnsDragDrop-isNotDroppable': isNotDroppable, + 'lnsDragDrop-isNotDroppable': !isMoveDragging && isNotDroppable, + 'lnsDragDrop-isReplacing': droppable && state.isActive && dropType === 'replace', }, + className, state.dragEnterClassNames ); @@ -210,18 +237,14 @@ const DragDropInner = React.memo(function DragDropInner( } }; - return ( - <div - data-test-subj={props['data-test-subj'] || 'lnsDragDrop'} - className={classes} - onDragOver={dragOver} - onDragLeave={dragLeave} - onDrop={drop} - draggable={draggable} - onDragEnd={dragEnd} - onDragStart={dragStart} - > - {children} - </div> - ); + return React.cloneElement(children, { + 'data-test-subj': props['data-test-subj'] || 'lnsDragDrop', + className: classNames(children.props.className, classes), + onDragOver: dragOver, + onDragLeave: dragLeave, + onDrop: drop, + draggable, + onDragEnd: dragEnd, + onDragStart: dragStart, + }); }); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss index 1965b51f97034..a58b5c21e7724 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss @@ -3,5 +3,5 @@ // Remove EuiButton's default shadow to make button more subtle // sass-lint:disable-block no-important box-shadow: none !important; - border: 1px dashed currentColor; + border-color: $euiColorLightShade; } diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index ad16038f44911..6b7e5ba8ea89d 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -121,6 +121,9 @@ function LayerPanels( <EuiFlexItem grow={true}> <EuiToolTip className="eui-fullWidth" + title={i18n.translate('xpack.lens.xyChart.addLayer', { + defaultMessage: 'Add a layer', + })} content={i18n.translate('xpack.lens.xyChart.addLayerTooltip', { defaultMessage: 'Use multiple layers to combine chart types or visualize different index patterns.', @@ -135,9 +138,6 @@ function LayerPanels( aria-label={i18n.translate('xpack.lens.xyChart.addLayerButton', { defaultMessage: 'Add layer', })} - title={i18n.translate('xpack.lens.xyChart.addLayerButton', { - defaultMessage: 'Add layer', - })} onClick={() => { dispatch({ type: 'UPDATE_STATE', diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx index a415eb44cf196..19f4c0428260e 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx @@ -130,7 +130,7 @@ export function DimensionContainer({ return ( <> - <div className="lnsDimensionContainer__trigger">{trigger}</div> + {trigger} {flyout} </> ); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss index b85c3e843613d..c77db2e65ce2d 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss @@ -27,36 +27,41 @@ .lnsLayerPanel__dimension { @include euiFontSizeS; - background: lightOrDarkTheme($euiColorEmptyShade, $euiColorLightestShade); border-radius: $euiBorderRadius; display: flex; align-items: center; margin-top: $euiSizeXS; overflow: hidden; -} + width: 100%; + min-height: $euiSizeXXL; -.lnsLayerPanel__dimension-isHidden { - opacity: 0; -} + // NativeRenderer is messing this up + > div { + flex-grow: 1; + } -.lnsLayerPanel__dimension-isReplacing { - text-decoration: line-through; + &:focus, + &:focus-within { + @include euiFocusRing; + } } .lnsLayerPanel__triggerLink { - padding: $euiSizeS; width: 100%; - display: flex; - align-items: center; - min-height: $euiSizeXXL; -} + padding: $euiSizeS; + min-height: $euiSizeXXL - 2; -.lnsLayerPanel__anchor { - width: 100%; + &:focus { + background-color: transparent !important; // sass-lint:disable-line no-important + outline: none !important; // sass-lint:disable-line no-important + } } -.lnsLayerPanel__dndGrab { - padding: $euiSizeS; +.lnsLayerPanel__triggerLinkContent { + // Make EUI button content not centered + justify-content: flex-start; + padding: 0 !important; // sass-lint:disable-line no-important + color: $euiTextSubduedColor; } .lnsLayerPanel__styleEditor { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index 46cd0292f2459..ce2955da890d7 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -17,7 +17,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import classNames from 'classnames'; import { NativeRenderer } from '../../../native_renderer'; import { StateSetter, isDraggedOperation } from '../../../types'; import { DragContext, DragDrop, ChildDragDropProvider } from '../../../drag_drop'; @@ -33,6 +32,28 @@ const initialDimensionContainerState = { addingToGroupId: null, }; +function isConfiguration( + value: unknown +): value is { columnId: string; groupId: string; layerId: string } { + return ( + value && + typeof value === 'object' && + 'columnId' in value && + 'groupId' in value && + 'layerId' in value + ); +} + +function isSameConfiguration(config1: unknown, config2: unknown) { + return ( + isConfiguration(config1) && + isConfiguration(config2) && + config1.columnId === config2.columnId && + config1.groupId === config2.groupId && + config1.layerId === config2.layerId + ); +} + export function LayerPanel( props: Exclude<ConfigPanelWrapperProps, 'state' | 'setState'> & { layerId: string; @@ -203,25 +224,22 @@ export function LayerPanel( return ( <DragDrop key={accessor} - className={classNames('lnsLayerPanel__dimension', { - // eslint-disable-next-line @typescript-eslint/naming-convention - 'lnsLayerPanel__dimension-isHidden': - isDraggedOperation(dragDropContext.dragging) && - accessor === dragDropContext.dragging.columnId, - })} - getAdditionalClassesOnEnter={() => { - // If we are dragging another column, add an indication that the behavior will be a replacement' - if ( - isDraggedOperation(dragDropContext.dragging) && - group.groupId !== dragDropContext.dragging.groupId - ) { - return 'lnsLayerPanel__dimension-isReplacing'; - } - return ''; - }} + dragType={ + isDraggedOperation(dragDropContext.dragging) && + accessor === dragDropContext.dragging.columnId + ? 'move' + : 'copy' + } + dropType={ + isDraggedOperation(dragDropContext.dragging) && + group.groupId !== dragDropContext.dragging.groupId + ? 'replace' + : 'add' + } data-test-subj={group.dataTestSubj} draggable={!dimensionContainerState.isOpen} value={{ columnId: accessor, groupId: group.groupId, layerId }} + isValueEqual={isSameConfiguration} label={group.groupLabel} droppable={ Boolean(dragDropContext.dragging) && @@ -254,83 +272,84 @@ export function LayerPanel( } }} > - <DimensionContainer - dimensionContainerState={dimensionContainerState} - setDimensionContainerState={setDimensionContainerState} - groups={groups} - accessor={accessor} - groupId={group.groupId} - trigger={ - <NativeRenderer - render={props.datasourceMap[datasourceId].renderDimensionTrigger} - nativeProps={{ - ...layerDatasourceConfigProps, - columnId: accessor, - filterOperations: group.filterOperations, - suggestedPriority: group.suggestedPriority, - onClick: () => { - if (dimensionContainerState.isOpen) { - setDimensionContainerState(initialDimensionContainerState); - } else { - setDimensionContainerState({ - isOpen: true, - openId: accessor, - addingToGroupId: null, // not set for existing dimension - }); - } - }, - }} - /> - } - panel={ - <> - {datasourceDimensionEditor} - {visDimensionEditor} - </> - } - panelTitle={i18n.translate('xpack.lens.configure.configurePanelTitle', { - defaultMessage: '{groupLabel} configuration', - values: { - groupLabel: group.groupLabel, - }, - })} - /> + <div className="lnsLayerPanel__dimension"> + <DimensionContainer + dimensionContainerState={dimensionContainerState} + setDimensionContainerState={setDimensionContainerState} + groups={groups} + accessor={accessor} + groupId={group.groupId} + trigger={ + <NativeRenderer + render={props.datasourceMap[datasourceId].renderDimensionTrigger} + nativeProps={{ + ...layerDatasourceConfigProps, + columnId: accessor, + filterOperations: group.filterOperations, + suggestedPriority: group.suggestedPriority, + onClick: () => { + if (dimensionContainerState.isOpen) { + setDimensionContainerState(initialDimensionContainerState); + } else { + setDimensionContainerState({ + isOpen: true, + openId: accessor, + addingToGroupId: null, // not set for existing dimension + }); + } + }, + }} + /> + } + panel={ + <> + {datasourceDimensionEditor} + {visDimensionEditor} + </> + } + panelTitle={i18n.translate('xpack.lens.configure.configurePanelTitle', { + defaultMessage: '{groupLabel} configuration', + values: { + groupLabel: group.groupLabel, + }, + })} + /> - <EuiButtonIcon - data-test-subj="indexPattern-dimension-remove" - iconType="cross" - iconSize="s" - size="s" - color="danger" - aria-label={i18n.translate('xpack.lens.indexPattern.removeColumnLabel', { - defaultMessage: 'Remove configuration', - })} - title={i18n.translate('xpack.lens.indexPattern.removeColumnLabel', { - defaultMessage: 'Remove configuration', - })} - onClick={() => { - trackUiEvent('indexpattern_dimension_removed'); - props.updateAll( - datasourceId, - layerDatasource.removeColumn({ - layerId, - columnId: accessor, - prevState: layerDatasourceState, - }), - activeVisualization.removeDimension({ - layerId, - columnId: accessor, - prevState: props.visualizationState, - }) - ); - }} - /> + <EuiButtonIcon + data-test-subj="indexPattern-dimension-remove" + iconType="cross" + iconSize="s" + size="s" + color="danger" + aria-label={i18n.translate('xpack.lens.indexPattern.removeColumnLabel', { + defaultMessage: 'Remove configuration', + })} + title={i18n.translate('xpack.lens.indexPattern.removeColumnLabel', { + defaultMessage: 'Remove configuration', + })} + onClick={() => { + trackUiEvent('indexpattern_dimension_removed'); + props.updateAll( + datasourceId, + layerDatasource.removeColumn({ + layerId, + columnId: accessor, + prevState: layerDatasourceState, + }), + activeVisualization.removeDimension({ + layerId, + columnId: accessor, + prevState: props.visualizationState, + }) + ); + }} + /> + </div> </DragDrop> ); })} {group.supportsMoreColumns ? ( <DragDrop - className="lnsLayerPanel__dimension" data-test-subj={group.dataTestSubj} droppable={ Boolean(dragDropContext.dragging) && @@ -374,23 +393,23 @@ export function LayerPanel( } }} > - <DimensionContainer - dimensionContainerState={dimensionContainerState} - setDimensionContainerState={setDimensionContainerState} - groups={groups} - accessor={newId} - groupId={group.groupId} - trigger={ - <div className="lnsLayerPanel__triggerLink"> + <div className="lnsLayerPanel__dimension"> + <DimensionContainer + dimensionContainerState={dimensionContainerState} + setDimensionContainerState={setDimensionContainerState} + groups={groups} + accessor={newId} + groupId={group.groupId} + trigger={ <EuiButtonEmpty + className="lnsLayerPanel__triggerLink" + color="text" + size="xs" iconType="plusInCircleFilled" + contentProps={{ + className: 'lnsLayerPanel__triggerLinkContent', + }} data-test-subj="lns-empty-dimension" - aria-label={i18n.translate('xpack.lens.configure.addConfig', { - defaultMessage: 'Add a configuration', - })} - title={i18n.translate('xpack.lens.configure.addConfig', { - defaultMessage: 'Add a configuration', - })} onClick={() => { if (dimensionContainerState.isOpen) { setDimensionContainerState(initialDimensionContainerState); @@ -402,52 +421,51 @@ export function LayerPanel( }); } }} - size="xs" > <FormattedMessage id="xpack.lens.configure.emptyConfig" - defaultMessage="Drop a field here" + defaultMessage="Drop a field or click to add" /> </EuiButtonEmpty> - </div> - } - panelTitle={i18n.translate('xpack.lens.configure.configurePanelTitle', { - defaultMessage: '{groupLabel} configuration', - values: { - groupLabel: group.groupLabel, - }, - })} - panel={ - <NativeRenderer - render={props.datasourceMap[datasourceId].renderDimensionEditor} - nativeProps={{ - ...layerDatasourceConfigProps, - core: props.core, - columnId: newId, - filterOperations: group.filterOperations, - suggestedPriority: group.suggestedPriority, + } + panelTitle={i18n.translate('xpack.lens.configure.configurePanelTitle', { + defaultMessage: '{groupLabel} configuration', + values: { + groupLabel: group.groupLabel, + }, + })} + panel={ + <NativeRenderer + render={props.datasourceMap[datasourceId].renderDimensionEditor} + nativeProps={{ + ...layerDatasourceConfigProps, + core: props.core, + columnId: newId, + filterOperations: group.filterOperations, + suggestedPriority: group.suggestedPriority, - setState: (newState: unknown) => { - props.updateAll( - datasourceId, - newState, - activeVisualization.setDimension({ - layerId, - groupId: group.groupId, - columnId: newId, - prevState: props.visualizationState, - }) - ); - setDimensionContainerState({ - isOpen: true, - openId: newId, - addingToGroupId: null, // clear now that dimension exists - }); - }, - }} - /> - } - /> + setState: (newState: unknown) => { + props.updateAll( + datasourceId, + newState, + activeVisualization.setDimension({ + layerId, + groupId: group.groupId, + columnId: newId, + prevState: props.visualizationState, + }) + ); + setDimensionContainerState({ + isOpen: true, + openId: newId, + addingToGroupId: null, // clear now that dimension exists + }); + }, + }} + /> + } + /> + </div> </DragDrop> ) : null} </> diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss index bad0563f16f1f..ac52190dc7b0d 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss @@ -20,7 +20,7 @@ .lnsFrameLayout__pageBody { @include euiScrollBar; min-width: $lnsPanelMinWidth + $euiSizeXL; - overflow: hidden; + overflow: hidden auto; // Leave out bottom padding so the suggestions scrollbar stays flush to window edge // Leave out left padding so the left sidebar's focus states are visible outside of content bounds // This also means needing to add same amount of margin to page content and suggestion items diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx index e56e55fdd5d6c..2a5798ac6a70c 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx @@ -221,7 +221,7 @@ export function InnerWorkspacePanel({ )} </strong> </h2> - <DropIllustration className="lnsWorkspacePanel__dropIllustration" /> + <DropIllustration aria-hidden={true} className="lnsWorkspacePanel__dropIllustration" /> {expression === null && ( <> <p> @@ -257,7 +257,7 @@ export function InnerWorkspacePanel({ if (localState.expressionBuildError) { return ( - <EuiFlexGroup direction="column" alignItems="center"> + <EuiFlexGroup style={{ maxWidth: '100%' }} direction="column" alignItems="center"> <EuiFlexItem> <EuiIcon type="alert" size="xl" color="danger" /> </EuiFlexItem> @@ -283,7 +283,7 @@ export function InnerWorkspacePanel({ onEvent={onEvent} renderError={(errorMessage?: string | null) => { return ( - <EuiFlexGroup direction="column" alignItems="center"> + <EuiFlexGroup style={{ maxWidth: '100%' }} direction="column" alignItems="center"> <EuiFlexItem> <EuiIcon type="alert" size="xl" color="danger" /> </EuiFlexItem> @@ -338,8 +338,10 @@ export function InnerWorkspacePanel({ droppable={Boolean(suggestionForDraggedField)} onDrop={onDrop} > - {renderVisualization()} - {Boolean(suggestionForDraggedField) && expression !== null && renderEmptyWorkspace()} + <div> + {renderVisualization()} + {Boolean(suggestionForDraggedField) && expression !== null && renderEmptyWorkspace()} + </div> </DragDrop> </WorkspacePanelWrapper> ); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss index 7f7385f029ed4..33b9b2fe1dbf0 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss @@ -1,3 +1,5 @@ +@import '../../../mixins'; + .lnsWorkspacePanelWrapper { @include euiScrollBar; overflow: hidden; @@ -7,6 +9,7 @@ display: flex; flex-direction: column; position: relative; // For positioning the dnd overlay + min-height: $euiSizeXXL * 10; .lnsWorkspacePanelWrapper__pageContentHeader { @include euiTitle('xs'); @@ -25,7 +28,7 @@ display: flex; align-items: stretch; justify-content: stretch; - overflow: hidden; + overflow: auto; > * { flex: 1 1 100%; @@ -41,6 +44,7 @@ // Disable the coloring of the DnD for this element as we'll // Color the whole panel instead background-color: transparent !important; // sass-lint:disable-line no-important + border: none !important; // sass-lint:disable-line no-important } .lnsExpressionRenderer { @@ -60,28 +64,25 @@ display: flex; justify-content: center; align-items: center; - transition: background-color $euiAnimSpeedNormal ease-in-out; + transition: background-color $euiAnimSpeedFast ease-in-out; .lnsDragDrop-isDropTarget & { - background-color: transparentize($euiColorSecondary, .9); + @include lnsDroppable; + @include lnsDroppableActive; p { - transition: filter $euiAnimSpeedNormal ease-in-out; + transition: filter $euiAnimSpeedFast ease-in-out; filter: blur(5px); } } .lnsDragDrop-isActiveDropTarget & { - background-color: transparentize($euiColorSecondary, .75); + @include lnsDroppableActiveHover; .lnsDropIllustration__hand { - animation: pulseArrowContinuous 1.5s ease-in-out 0s infinite normal forwards; + animation: lnsWorkspacePanel__illustrationPulseContinuous 1.5s ease-in-out 0s infinite normal forwards; } } - - &.lnsWorkspacePanel__emptyContent-onTop p { - display: none; - } } .lnsWorkspacePanelWrapper__toolbar { @@ -106,10 +107,10 @@ } .lnsDropIllustration__hand { - animation: pulseArrow 5s ease-in-out 0s infinite normal forwards; + animation: lnsWorkspacePanel__illustrationPulseArrow 5s ease-in-out 0s infinite normal forwards; } -@keyframes pulseArrow { +@keyframes lnsWorkspacePanel__illustrationPulseArrow { 0% { transform: translateY(0%); } 65% { transform: translateY(0%); } 72% { transform: translateY(10%); } @@ -118,7 +119,7 @@ 95% { transform: translateY(0); } } -@keyframes pulseArrowContinuous { +@keyframes lnsWorkspacePanel__illustrationPulseContinuous { 0% { transform: translateY(10%); } 25% { transform: translateY(15%); } 50% { transform: translateY(10%); } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.scss b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.scss index 155b954e9cf17..df73789eadedf 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.scss +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.scss @@ -12,7 +12,7 @@ .lnsInnerIndexPatternDataPanel__fieldItems { // Quick fix for making sure the shadow and focus rings are visible outside the accordion bounds - padding: $euiSizeXS $euiSizeXS 0; + padding: $euiSizeXS; } .lnsInnerIndexPatternDataPanel__textField { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx index 6f0a9c2a86acd..12b8d91c35ade 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx @@ -250,6 +250,10 @@ export const IndexPatternDimensionTriggerComponent = function IndexPatternDimens return null; } + const triggerLinkA11yText = i18n.translate('xpack.lens.configure.editConfig', { + defaultMessage: 'Click to edit configuration or drag to move', + }); + if (currentFieldIsInvalid) { return ( <EuiToolTip @@ -264,7 +268,7 @@ export const IndexPatternDimensionTriggerComponent = function IndexPatternDimens })} </p> } - anchorClassName="lnsLayerPanel__anchor" + anchorClassName="eui-displayBlock" > <EuiLink color="danger" @@ -272,12 +276,8 @@ export const IndexPatternDimensionTriggerComponent = function IndexPatternDimens className="lnsLayerPanel__triggerLink" onClick={props.onClick} data-test-subj="lns-dimensionTrigger" - aria-label={i18n.translate('xpack.lens.configure.editConfig', { - defaultMessage: 'Edit configuration', - })} - title={i18n.translate('xpack.lens.configure.editConfig', { - defaultMessage: 'Edit configuration', - })} + aria-label={triggerLinkA11yText} + title={triggerLinkA11yText} > <EuiFlexGroup gutterSize="s" alignItems="center" responsive={false}> <EuiFlexItem grow={false}> @@ -296,12 +296,8 @@ export const IndexPatternDimensionTriggerComponent = function IndexPatternDimens className="lnsLayerPanel__triggerLink" onClick={props.onClick} data-test-subj="lns-dimensionTrigger" - aria-label={i18n.translate('xpack.lens.configure.editConfig', { - defaultMessage: 'Edit configuration', - })} - title={i18n.translate('xpack.lens.configure.editConfig', { - defaultMessage: 'Edit configuration', - })} + aria-label={triggerLinkA11yText} + title={triggerLinkA11yText} > {uniqueLabel} </EuiLink> diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss index d74c332dd42e5..1b55d9623e223 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss @@ -1,25 +1,25 @@ -.lnsFieldItem--missing { - .lnsFieldItem__info { - background: lightOrDarkTheme(transparentize($euiColorMediumShade, .9), $euiColorEmptyShade); - color: $euiColorDarkShade; - } -} - -.lnsFieldItem__info { +.lnsFieldItem { .lnsFieldItem__infoIcon { visibility: hidden; + opacity: 0; } - &:hover, - &:focus { + &:hover:not([class*='isActive']) { cursor: grab; .lnsFieldItem__infoIcon { visibility: visible; + opacity: 1; + transition: opacity $euiAnimSpeedFast ease-in-out 1s; } } } +.lnsFieldItem--missing { + background: lightOrDarkTheme(transparentize($euiColorMediumShade, .9), $euiColorEmptyShade); + color: $euiColorDarkShade; +} + .lnsFieldItem__topValue { margin-bottom: $euiSizeS; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx index 7377d15bca6d7..2fbe23f9085f2 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -33,6 +33,7 @@ import { } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { DataPublicPluginStart } from 'src/plugins/data/public'; +import { EuiHighlight } from '@elastic/eui'; import { Query, KBN_FIELD_TYPES, @@ -102,22 +103,6 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { isLoading: false, }); - const wrappableName = wrapOnDot(field.displayName)!; - const wrappableHighlight = wrapOnDot(highlight); - const highlightIndex = wrappableHighlight - ? wrappableName.toLowerCase().indexOf(wrappableHighlight.toLowerCase()) - : -1; - const wrappableHighlightableFieldName = - highlightIndex < 0 ? ( - wrappableName - ) : ( - <span> - <span>{wrappableName.substr(0, highlightIndex)}</span> - <strong>{wrappableName.substr(highlightIndex, wrappableHighlight.length)}</strong> - <span>{wrappableName.substr(highlightIndex + wrappableHighlight.length)}</span> - </span> - ); - function fetchData() { if (state.isLoading) { return; @@ -200,22 +185,20 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { ownFocus className="lnsFieldItem__popoverAnchor" display="block" + data-test-subj="lnsFieldListPanelField" container={document.querySelector<HTMLElement>('.application') || undefined} button={ <DragDrop label={field.displayName} value={value} - data-test-subj="lnsFieldListPanelField" + data-test-subj={`lnsFieldListPanelField-${field.name}`} draggable - className={`lnsFieldItem lnsFieldItem--${field.type} lnsFieldItem--${ - exists ? 'exists' : 'missing' - }`} > <FieldButton - className="lnsFieldItem__info" - isDraggable + className={`lnsFieldItem lnsFieldItem--${field.type} lnsFieldItem--${ + exists ? 'exists' : 'missing' + }`} isActive={infoIsOpen} - data-test-subj={`lnsFieldListPanelField-${field.name}`} onClick={togglePopover} aria-label={i18n.translate('xpack.lens.indexPattern.fieldStatsButtonAriaLabel', { defaultMessage: '{fieldName}: {fieldType}. Hit enter for a field preview.', @@ -225,7 +208,11 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { }, })} fieldIcon={lensFieldIcon} - fieldName={wrappableHighlightableFieldName} + fieldName={ + <EuiHighlight search={wrapOnDot(highlight)}> + {wrapOnDot(field.displayName)} + </EuiHighlight> + } fieldInfoIcon={lensInfoIcon} /> </DragDrop> @@ -527,7 +514,7 @@ function FieldItemPopoverContents(props: State & FieldItemProps) { </EuiFlexItem> <EuiFlexItem grow={false} className="eui-textTruncate"> - <EuiText size="s" color="subdued"> + <EuiText size="xs" color="subdued"> {Math.round((otherCount / props.sampledValues!) * 100)}% </EuiText> </EuiFlexItem> diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx index 47380f7865578..50471ca84c0d8 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx @@ -96,7 +96,13 @@ export const DraggableBucketContainer = ({ children: React.ReactNode; } & BucketContainerProps) => { return ( - <EuiDraggable spacing="m" index={idx} draggableId={id} disableInteractiveElementBlocking> + <EuiDraggable + style={{ marginBottom: 4 }} + spacing="none" + index={idx} + draggableId={id} + disableInteractiveElementBlocking + > {(provided) => <BucketContainer {...bucketContainerProps}>{children}</BucketContainer>} </EuiDraggable> ); @@ -134,7 +140,7 @@ export const DragDropBuckets = ({ }; return ( <EuiDragDropContext onDragEnd={handleDragEnd} onDragStart={onDragStart}> - <EuiDroppable droppableId={droppableId} spacing="s"> + <EuiDroppable droppableId={droppableId} spacing="none"> {children} </EuiDroppable> </EuiDragDropContext> diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ba9d8e364bd17..34c339023171e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9464,7 +9464,6 @@ "xpack.lens.configPanel.color.tooltip.custom": "[自動]モードに戻すには、カスタム色をオフにしてください。", "xpack.lens.configPanel.color.tooltip.disabled": "レイヤーに「内訳条件」が含まれている場合は、個別の系列をカスタム色にできません。", "xpack.lens.configPanel.selectVisualization": "ビジュアライゼーションを選択してください", - "xpack.lens.configure.addConfig": "構成を追加", "xpack.lens.configure.editConfig": "構成の編集", "xpack.lens.configure.emptyConfig": "ここにフィールドをドロップ", "xpack.lens.dataPanelWrapper.switchDatasource": "データソースに切り替える", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5d44e0c635bee..f32b49fd4f2f0 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9470,7 +9470,6 @@ "xpack.lens.configPanel.color.tooltip.custom": "清除定制颜色以返回到“自动”模式。", "xpack.lens.configPanel.color.tooltip.disabled": "当图层包括“细分依据”,各个系列无法定制颜色。", "xpack.lens.configPanel.selectVisualization": "选择可视化", - "xpack.lens.configure.addConfig": "添加配置", "xpack.lens.configure.editConfig": "编辑配置", "xpack.lens.configure.emptyConfig": "将字段拖放到此处", "xpack.lens.dataPanelWrapper.switchDatasource": "切换到数据源", From 198c5d998816e940e4c8d92979504c86116bcd2d Mon Sep 17 00:00:00 2001 From: Marco Liberati <dej611@users.noreply.github.com> Date: Thu, 1 Oct 2020 18:02:37 +0200 Subject: [PATCH 56/64] [Lens] Fix embeddable title and description for reporting and dashboard tooltip (#78767) Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- .../lib/panel/panel_header/panel_header.tsx | 9 ++- .../public/embeddable/visualize_embeddable.ts | 2 +- .../__snapshots__/expression.test.tsx.snap | 4 +- .../datatable_visualization/expression.tsx | 10 ++- .../datatable_visualization/visualization.tsx | 4 +- .../editor_frame/expression_helpers.ts | 9 ++- .../editor_frame/state_helpers.ts | 4 ++ .../embeddable/embeddable.tsx | 6 ++ .../metric_visualization/expression.test.tsx | 69 +++++++++++++++++-- .../metric_visualization/expression.tsx | 24 +++++-- .../lens/public/metric_visualization/types.ts | 2 + .../visualization.test.ts | 8 ++- .../metric_visualization/visualization.tsx | 10 +-- .../public/pie_visualization/expression.tsx | 8 +++ .../pie_visualization/render_function.tsx | 7 +- .../public/pie_visualization/to_expression.ts | 13 ++-- .../lens/public/pie_visualization/types.ts | 2 + x-pack/plugins/lens/public/types.ts | 3 +- .../public/visualization_container.test.tsx | 7 +- .../lens/public/visualization_container.tsx | 11 ++- .../__snapshots__/to_expression.test.ts.snap | 6 ++ .../public/xy_visualization/expression.tsx | 15 +++- .../public/xy_visualization/to_expression.ts | 10 ++- .../lens/public/xy_visualization/types.ts | 2 + 24 files changed, 206 insertions(+), 39 deletions(-) diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx index 7dde84e510535..dea483efb349f 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx @@ -109,12 +109,11 @@ function renderTooltip(description: string) { ); } -const VISUALIZE_EMBEDDABLE_TYPE = 'visualization'; -type VisualizeEmbeddable = any; +type EmbeddableWithDescription = IEmbeddable & { getDescription: () => string }; -function getViewDescription(embeddable: IEmbeddable | VisualizeEmbeddable) { - if (embeddable.type === VISUALIZE_EMBEDDABLE_TYPE) { - const description = embeddable.getVisualizationDescription(); +function getViewDescription(embeddable: IEmbeddable | EmbeddableWithDescription) { + if ('getDescription' in embeddable) { + const description = embeddable.getDescription(); if (description) { return description; diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index c091d396b4924..fe8a9adff4052 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -167,7 +167,7 @@ export class VisualizeEmbeddable typeof inspectorAdapters === 'function' ? inspectorAdapters() : inspectorAdapters; } } - public getVisualizationDescription() { + public getDescription() { return this.vis.description; } diff --git a/x-pack/plugins/lens/public/datatable_visualization/__snapshots__/expression.test.tsx.snap b/x-pack/plugins/lens/public/datatable_visualization/__snapshots__/expression.test.tsx.snap index c0210c3915ce8..9c7bdc3397f9c 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/__snapshots__/expression.test.tsx.snap +++ b/x-pack/plugins/lens/public/datatable_visualization/__snapshots__/expression.test.tsx.snap @@ -1,7 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`datatable_expression DatatableComponent it renders the title and value 1`] = ` -<VisualizationContainer> +<VisualizationContainer + reportTitle="My fanci metric chart" +> <EuiBasicTable className="lnsDataTable" columns={ diff --git a/x-pack/plugins/lens/public/datatable_visualization/expression.tsx b/x-pack/plugins/lens/public/datatable_visualization/expression.tsx index 5ed693d2ead86..af1773b413599 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/expression.tsx @@ -33,6 +33,7 @@ export interface DatatableColumns { interface Args { title: string; + description?: string; columns: DatatableColumns & { type: 'lens_datatable_columns' }; } @@ -72,6 +73,10 @@ export const datatable: ExpressionFunctionDefinition< defaultMessage: 'Title', }), }, + description: { + types: ['string'], + help: '', + }, columns: { types: ['lens_datatable_columns'], help: '', @@ -207,7 +212,10 @@ export function DatatableComponent(props: DatatableRenderProps) { } return ( - <VisualizationContainer> + <VisualizationContainer + reportTitle={props.args.title} + reportDescription={props.args.description} + > <EuiBasicTable className="lnsDataTable" data-test-subj="lnsDataTable" diff --git a/x-pack/plugins/lens/public/datatable_visualization/visualization.tsx b/x-pack/plugins/lens/public/datatable_visualization/visualization.tsx index 5b462f44b3dd5..1464ae6988a2d 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/visualization.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/visualization.tsx @@ -194,7 +194,7 @@ export const datatableVisualization: Visualization<DatatableVisualizationState> }; }, - toExpression(state, datasourceLayers): Ast { + toExpression(state, datasourceLayers, { title, description } = {}): Ast { const layer = state.layers[0]; const datasource = datasourceLayers[layer.layerId]; const originalOrder = datasource.getTableSpec().map(({ columnId }) => columnId); @@ -211,6 +211,8 @@ export const datatableVisualization: Visualization<DatatableVisualizationState> type: 'function', function: 'lens_datatable', arguments: { + title: [title || ''], + description: [description || ''], columns: [ { type: 'expression', diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/expression_helpers.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/expression_helpers.ts index 952718e13c8cf..e7568147dc568 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/expression_helpers.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/expression_helpers.ts @@ -73,7 +73,11 @@ export function buildExpression({ datasourceMap, datasourceStates, datasourceLayers, + title, + description, }: { + title?: string; + description?: string; visualization: Visualization | null; visualizationState: unknown; datasourceMap: Record<string, Datasource>; @@ -89,7 +93,10 @@ export function buildExpression({ if (visualization === null) { return null; } - const visualizationExpression = visualization.toExpression(visualizationState, datasourceLayers); + const visualizationExpression = visualization.toExpression(visualizationState, datasourceLayers, { + title, + description, + }); const completeExpression = prependDatasourceExpression( visualizationExpression, diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts index 6deb9ffd37a06..1fe5224d0b1b4 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts @@ -61,6 +61,8 @@ export async function persistedStateToExpression( state: { visualization: visualizationState, datasourceStates: persistedDatasourceStates }, visualizationType, references, + title, + description, } = doc; if (!visualizationType) return null; const visualization = visualizations[visualizationType!]; @@ -78,6 +80,8 @@ export async function persistedStateToExpression( const datasourceLayers = createDatasourceLayers(datasources, datasourceStates); return buildExpression({ + title, + description, visualization, visualizationState, datasourceMap: datasources, diff --git a/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx index 61a5d8cacdc4f..16b19ca0af849 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx @@ -295,6 +295,12 @@ export class Embeddable return this.deps.attributeService.getInputAsValueType(input); }; + // same API as Visualize + public getDescription() { + // mind that savedViz is loaded in async way here + return this.savedVis && this.savedVis.description; + } + destroy() { super.destroy(); if (this.domNode) { diff --git a/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx b/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx index 0c92cdb2c31fc..77a8ce64b21a2 100644 --- a/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx @@ -32,10 +32,21 @@ function sampleArgs() { accessor: 'a', layerId: 'l1', title: 'My fanci metric chart', + description: 'Fancy chart description', + metricTitle: 'My fanci metric chart', mode: 'full', }; - return { data, args }; + const noAttributesArgs: MetricConfig = { + accessor: 'a', + layerId: 'l1', + title: '', + description: '', + metricTitle: 'My fanci metric chart', + mode: 'full', + }; + + return { data, args, noAttributesArgs }; } describe('metric_expression', () => { @@ -53,7 +64,7 @@ describe('metric_expression', () => { }); describe('MetricChart component', () => { - test('it renders the title and value', () => { + test('it renders the all attributes when passed (title, description, metricTitle, value)', () => { const { data, args } = sampleArgs(); expect( @@ -61,6 +72,7 @@ describe('metric_expression', () => { ).toMatchInlineSnapshot(` <VisualizationContainer className="lnsMetricExpression__container" + reportDescription="Fancy chart description" reportTitle="My fanci metric chart" > <AutoScale> @@ -90,21 +102,66 @@ describe('metric_expression', () => { `); }); - test('it does not render title in reduced mode', () => { - const { data, args } = sampleArgs(); + test('it renders only chart content when title and description are empty strings', () => { + const { data, noAttributesArgs } = sampleArgs(); expect( shallow( <MetricChart data={data} - args={{ ...args, mode: 'reduced' }} + args={noAttributesArgs} formatFactory={(x) => x as IFieldFormat} /> ) ).toMatchInlineSnapshot(` <VisualizationContainer className="lnsMetricExpression__container" - reportTitle="My fanci metric chart" + reportDescription="" + reportTitle="" + > + <AutoScale> + <div + data-test-subj="lns_metric_value" + style={ + Object { + "fontSize": "60pt", + "fontWeight": 600, + } + } + > + 10110 + </div> + <div + data-test-subj="lns_metric_title" + style={ + Object { + "fontSize": "24pt", + } + } + > + My fanci metric chart + </div> + </AutoScale> + </VisualizationContainer> + `); + }); + + test('it does not render metricTitle in reduced mode', () => { + const { data, noAttributesArgs } = sampleArgs(); + + expect( + shallow( + <MetricChart + data={data} + args={{ ...noAttributesArgs, mode: 'reduced' }} + formatFactory={(x) => x as IFieldFormat} + /> + ) + ).toMatchInlineSnapshot(` + <VisualizationContainer + className="lnsMetricExpression__container" + reportDescription="" + reportTitle="" > <AutoScale> <div diff --git a/x-pack/plugins/lens/public/metric_visualization/expression.tsx b/x-pack/plugins/lens/public/metric_visualization/expression.tsx index 7eeef13240f72..29c9cc3e454c7 100644 --- a/x-pack/plugins/lens/public/metric_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/expression.tsx @@ -43,6 +43,14 @@ export const metricChart: ExpressionFunctionDefinition< types: ['string'], help: 'The chart title.', }, + description: { + types: ['string'], + help: '', + }, + metricTitle: { + types: ['string'], + help: 'The title of the metric shown.', + }, accessor: { types: ['string'], help: 'The column whose value is being displayed', @@ -98,12 +106,16 @@ export function MetricChart({ args, formatFactory, }: MetricChartProps & { formatFactory: FormatFactory }) { - const { title, accessor, mode } = args; + const { metricTitle, title, description, accessor, mode } = args; let value = '-'; const firstTable = Object.values(data.tables)[0]; if (!accessor) { return ( - <VisualizationContainer reportTitle={title} className="lnsMetricExpression__container" /> + <VisualizationContainer + reportTitle={title} + reportDescription={description} + className="lnsMetricExpression__container" + /> ); } @@ -119,14 +131,18 @@ export function MetricChart({ } return ( - <VisualizationContainer reportTitle={title} className="lnsMetricExpression__container"> + <VisualizationContainer + reportTitle={title} + reportDescription={description} + className="lnsMetricExpression__container" + > <AutoScale> <div data-test-subj="lns_metric_value" style={{ fontSize: '60pt', fontWeight: 600 }}> {value} </div> {mode === 'full' && ( <div data-test-subj="lns_metric_title" style={{ fontSize: '24pt' }}> - {title} + {metricTitle} </div> )} </AutoScale> diff --git a/x-pack/plugins/lens/public/metric_visualization/types.ts b/x-pack/plugins/lens/public/metric_visualization/types.ts index 86a781716b345..c4a3fd094abe6 100644 --- a/x-pack/plugins/lens/public/metric_visualization/types.ts +++ b/x-pack/plugins/lens/public/metric_visualization/types.ts @@ -11,5 +11,7 @@ export interface State { export interface MetricConfig extends State { title: string; + description: string; + metricTitle: string; mode: 'reduced' | 'full'; } diff --git a/x-pack/plugins/lens/public/metric_visualization/visualization.test.ts b/x-pack/plugins/lens/public/metric_visualization/visualization.test.ts index aa3de93013e66..80c7a174b3264 100644 --- a/x-pack/plugins/lens/public/metric_visualization/visualization.test.ts +++ b/x-pack/plugins/lens/public/metric_visualization/visualization.test.ts @@ -171,11 +171,17 @@ describe('metric_visualization', () => { "accessor": Array [ "a", ], + "description": Array [ + "", + ], + "metricTitle": Array [ + "shazm", + ], "mode": Array [ "full", ], "title": Array [ - "shazm", + "", ], }, "function": "lens_metric_chart", diff --git a/x-pack/plugins/lens/public/metric_visualization/visualization.tsx b/x-pack/plugins/lens/public/metric_visualization/visualization.tsx index 72c07bed1acb2..77d189ce53d01 100644 --- a/x-pack/plugins/lens/public/metric_visualization/visualization.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/visualization.tsx @@ -14,7 +14,7 @@ import { State } from './types'; const toExpression = ( state: State, datasourceLayers: Record<string, DatasourcePublicAPI>, - mode: 'reduced' | 'full' = 'full' + attributes?: { mode?: 'reduced' | 'full'; title?: string; description?: string } ): Ast | null => { if (!state.accessor) { return null; @@ -30,9 +30,11 @@ const toExpression = ( type: 'function', function: 'lens_metric_chart', arguments: { - title: [(operation && operation.label) || ''], + title: [attributes?.title || ''], + description: [attributes?.description || ''], + metricTitle: [(operation && operation.label) || ''], accessor: [state.accessor], - mode: [mode], + mode: [attributes?.mode || 'full'], }, }, ], @@ -104,7 +106,7 @@ export const metricVisualization: Visualization<State> = { toExpression, toPreviewExpression: (state, datasourceLayers) => - toExpression(state, datasourceLayers, 'reduced'), + toExpression(state, datasourceLayers, { mode: 'reduced' }), setDimension({ prevState, columnId }) { return { ...prevState, accessor: columnId }; diff --git a/x-pack/plugins/lens/public/pie_visualization/expression.tsx b/x-pack/plugins/lens/public/pie_visualization/expression.tsx index 89d93ab79233f..d93145f29aa89 100644 --- a/x-pack/plugins/lens/public/pie_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/expression.tsx @@ -37,6 +37,14 @@ export const pie: ExpressionFunctionDefinition< defaultMessage: 'Pie renderer', }), args: { + title: { + types: ['string'], + help: 'The chart title.', + }, + description: { + types: ['string'], + help: '', + }, groups: { types: ['string'], multi: true, diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx index d97ab146e000d..8de810f9aa5d3 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx @@ -228,7 +228,12 @@ export function PieComponent( ); } return ( - <VisualizationContainer className="lnsPieExpression__container" isReady={state.isReady}> + <VisualizationContainer + reportTitle={props.args.title} + reportDescription={props.args.description} + className="lnsPieExpression__container" + isReady={state.isReady} + > <Chart> <Settings // Legend is hidden in many scenarios diff --git a/x-pack/plugins/lens/public/pie_visualization/to_expression.ts b/x-pack/plugins/lens/public/pie_visualization/to_expression.ts index f36b9efb930a9..d721a578a3788 100644 --- a/x-pack/plugins/lens/public/pie_visualization/to_expression.ts +++ b/x-pack/plugins/lens/public/pie_visualization/to_expression.ts @@ -11,15 +11,16 @@ import { PieVisualizationState } from './types'; export function toExpression( state: PieVisualizationState, - datasourceLayers: Record<string, DatasourcePublicAPI> + datasourceLayers: Record<string, DatasourcePublicAPI>, + attributes: Partial<{ title: string; description: string }> = {} ) { - return expressionHelper(state, datasourceLayers, false); + return expressionHelper(state, datasourceLayers, { ...attributes, isPreview: false }); } function expressionHelper( state: PieVisualizationState, datasourceLayers: Record<string, DatasourcePublicAPI>, - isPreview: boolean + attributes: { isPreview: boolean; title?: string; description?: string } = { isPreview: false } ): Ast | null { const layer = state.layers[0]; const datasource = datasourceLayers[layer.layerId]; @@ -37,8 +38,10 @@ function expressionHelper( type: 'function', function: 'lens_pie', arguments: { + title: [attributes.title || ''], + description: [attributes.description || ''], shape: [state.shape], - hideLabels: [isPreview], + hideLabels: [attributes.isPreview], groups: operations.map((o) => o.columnId), metric: [layer.metric], numberDisplay: [layer.numberDisplay], @@ -57,5 +60,5 @@ export function toPreviewExpression( state: PieVisualizationState, datasourceLayers: Record<string, DatasourcePublicAPI> ) { - return expressionHelper(state, datasourceLayers, true); + return expressionHelper(state, datasourceLayers, { isPreview: true }); } diff --git a/x-pack/plugins/lens/public/pie_visualization/types.ts b/x-pack/plugins/lens/public/pie_visualization/types.ts index 74156bce2ea70..603c80aa00066 100644 --- a/x-pack/plugins/lens/public/pie_visualization/types.ts +++ b/x-pack/plugins/lens/public/pie_visualization/types.ts @@ -28,6 +28,8 @@ export interface PieVisualizationState { } export type PieExpressionArgs = SharedLayerState & { + title?: string; + description?: string; shape: 'pie' | 'donut' | 'treemap'; hideLabels: boolean; }; diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index e97e0d612a2ee..e5e8a645dd0e8 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -519,7 +519,8 @@ export interface Visualization<T = unknown> { toExpression: ( state: T, - datasourceLayers: Record<string, DatasourcePublicAPI> + datasourceLayers: Record<string, DatasourcePublicAPI>, + attributes?: Partial<{ title: string; description: string }> ) => Ast | string | null; /** * Expression to render a preview version of the chart in very constrained space. diff --git a/x-pack/plugins/lens/public/visualization_container.test.tsx b/x-pack/plugins/lens/public/visualization_container.test.tsx index 454399ec90121..7fc3541c63072 100644 --- a/x-pack/plugins/lens/public/visualization_container.test.tsx +++ b/x-pack/plugins/lens/public/visualization_container.test.tsx @@ -43,13 +43,16 @@ describe('VisualizationContainer', () => { expect(reportingEl.prop('data-shared-item')).toBeTruthy(); }); - test('renders title for reporting, if provided', () => { + test('renders title and description for reporting, if provided', () => { const component = mount( - <VisualizationContainer reportTitle="shazam!">Hello!</VisualizationContainer> + <VisualizationContainer reportTitle="shazam!" reportDescription="Description"> + Hello! + </VisualizationContainer> ); const reportingEl = component.find('[data-shared-item]').first(); expect(reportingEl.prop('data-title')).toEqual('shazam!'); + expect(reportingEl.prop('data-description')).toEqual('Description'); }); test('renders style', () => { diff --git a/x-pack/plugins/lens/public/visualization_container.tsx b/x-pack/plugins/lens/public/visualization_container.tsx index 521d41b6f8d94..429dc63231cbe 100644 --- a/x-pack/plugins/lens/public/visualization_container.tsx +++ b/x-pack/plugins/lens/public/visualization_container.tsx @@ -12,6 +12,7 @@ import classNames from 'classnames'; interface Props extends React.HTMLAttributes<HTMLDivElement> { isReady?: boolean; reportTitle?: string; + reportDescription?: string; } /** @@ -21,16 +22,24 @@ interface Props extends React.HTMLAttributes<HTMLDivElement> { export function VisualizationContainer({ isReady = true, reportTitle, + reportDescription, children, className, ...rest }: Props) { + const attributes: Partial<{ 'data-title': string; 'data-description': string }> = {}; + if (reportTitle) { + attributes['data-title'] = reportTitle; + } + if (reportDescription) { + attributes['data-description'] = reportDescription; + } return ( <div data-shared-item data-render-complete={isReady} className={classNames(className, 'lnsVisualizationContainer')} - data-title={reportTitle} + {...attributes} {...rest} > {children} diff --git a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap index dd8c6377cacdc..b35f915336eee 100644 --- a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap +++ b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap @@ -27,6 +27,9 @@ Object { "type": "expression", }, ], + "description": Array [ + "", + ], "fittingFunction": Array [ "Carry", ], @@ -139,6 +142,9 @@ Object { "type": "expression", }, ], + "title": Array [ + "", + ], "xTitle": Array [ "", ], diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.tsx index 64e0a3670a9aa..f36525a9a0b14 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.tsx @@ -85,6 +85,14 @@ export const xyChart: ExpressionFunctionDefinition< defaultMessage: 'An X/Y chart', }), args: { + title: { + types: ['string'], + help: 'The chart title.', + }, + description: { + types: ['string'], + help: '', + }, xTitle: { types: ['string'], help: i18n.translate('xpack.lens.xyChart.xTitle.help', { @@ -215,7 +223,12 @@ export function XYChartReportable(props: XYChartRenderProps) { }, [setState]); return ( - <VisualizationContainer className="lnsXyExpression__container" isReady={state.isReady}> + <VisualizationContainer + className="lnsXyExpression__container" + isReady={state.isReady} + reportTitle={props.args.title} + reportDescription={props.args.description} + > <MemoizedChart {...props} /> </VisualizationContainer> ); diff --git a/x-pack/plugins/lens/public/xy_visualization/to_expression.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts index df8d571a1fdf8..5a3c8faa2d476 100644 --- a/x-pack/plugins/lens/public/xy_visualization/to_expression.ts +++ b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts @@ -15,7 +15,8 @@ interface ValidLayer extends LayerConfig { export const toExpression = ( state: State, - datasourceLayers: Record<string, DatasourcePublicAPI> + datasourceLayers: Record<string, DatasourcePublicAPI>, + attributes: Partial<{ title: string; description: string }> = {} ): Ast | null => { if (!state || !state.layers.length) { return null; @@ -31,7 +32,7 @@ export const toExpression = ( }); }); - return buildExpression(state, metadata, datasourceLayers); + return buildExpression(state, metadata, datasourceLayers, attributes); }; export function toPreviewExpression( @@ -81,7 +82,8 @@ export function getScaleType(metadata: OperationMetadata | null, defaultScale: S export const buildExpression = ( state: State, metadata: Record<string, Record<string, OperationMetadata | null>>, - datasourceLayers?: Record<string, DatasourcePublicAPI> + datasourceLayers?: Record<string, DatasourcePublicAPI>, + attributes: Partial<{ title: string; description: string }> = {} ): Ast | null => { const validLayers = state.layers.filter((layer): layer is ValidLayer => Boolean(layer.accessors.length) @@ -97,6 +99,8 @@ export const buildExpression = ( type: 'function', function: 'lens_xy_chart', arguments: { + title: [attributes?.title || ''], + description: [attributes?.description || ''], xTitle: [state.xTitle || ''], yTitle: [state.yTitle || ''], yRightTitle: [state.yRightTitle || ''], diff --git a/x-pack/plugins/lens/public/xy_visualization/types.ts b/x-pack/plugins/lens/public/xy_visualization/types.ts index 185fa20f169ee..cac982f852c7a 100644 --- a/x-pack/plugins/lens/public/xy_visualization/types.ts +++ b/x-pack/plugins/lens/public/xy_visualization/types.ts @@ -383,6 +383,8 @@ export type LayerArgs = LayerConfig & { // Arguments to XY chart expression, with computed properties export interface XYArgs { + title?: string; + description?: string; xTitle: string; yTitle: string; yRightTitle: string; From a61f4d4cbfd08dfe2502cebd059464bf3df75707 Mon Sep 17 00:00:00 2001 From: Chris Roberson <chrisronline@gmail.com> Date: Thu, 1 Oct 2020 12:28:34 -0400 Subject: [PATCH 57/64] [Monitoring] Missing data alert (#78208) * WIP for alert * Surface alert most places * Fix up alert placement * Fix tests * Type fix * Update copy * Add alert presence to APM in the UI * Fetch data a little differently * We don't need moment * Add tests * PR feedback * Update copy * Fix up bug around grabbing old data * PR feedback * PR feedback * Fix tests --- x-pack/plugins/monitoring/common/constants.ts | 2 + x-pack/plugins/monitoring/common/types.ts | 6 +- .../monitoring/public/alerts/badge.tsx | 15 +- .../monitoring/public/alerts/callout.tsx | 11 +- .../public/alerts/filter_alert_states.ts | 23 + .../expression.tsx | 61 +++ .../missing_monitoring_data_alert/index.ts | 7 + .../missing_monitoring_data_alert.tsx | 28 + .../validation.tsx | 35 ++ .../monitoring/public/alerts/panel.tsx | 10 +- .../monitoring/public/alerts/status.tsx | 15 +- .../components/apm/instance/instance.js | 14 +- .../public/components/apm/instance/status.js | 3 +- .../components/apm/instances/instances.js | 32 +- .../public/components/apm/instances/status.js | 3 +- .../public/components/apm/overview/index.js | 4 +- .../public/components/beats/beat/beat.js | 18 +- .../components/beats/listing/listing.js | 29 +- .../components/beats/overview/overview.js | 3 +- .../public/components/beats/stats.js | 4 +- .../components/cluster/overview/apm_panel.js | 29 +- .../cluster/overview/beats_panel.js | 25 +- .../cluster/overview/elasticsearch_panel.js | 2 + .../components/cluster/overview/index.js | 54 +- .../cluster/overview/kibana_panel.js | 8 +- .../cluster/overview/logstash_panel.js | 3 +- .../components/elasticsearch/node/node.js | 15 +- .../components/elasticsearch/nodes/nodes.js | 10 +- .../components/kibana/instances/instances.js | 13 +- .../components/logstash/listing/listing.js | 13 +- x-pack/plugins/monitoring/public/plugin.ts | 2 + .../public/views/apm/instance/index.js | 18 +- .../public/views/apm/instances/index.js | 18 +- .../public/views/apm/overview/index.js | 24 +- .../public/views/beats/beat/index.js | 18 +- .../public/views/beats/listing/index.js | 18 +- .../public/views/beats/overview/index.js | 24 +- .../elasticsearch/node/advanced/index.js | 3 +- .../public/views/elasticsearch/node/index.js | 3 +- .../public/views/elasticsearch/nodes/index.js | 8 +- .../public/views/kibana/instance/index.js | 24 +- .../public/views/kibana/instances/index.js | 8 +- .../views/logstash/node/advanced/index.js | 28 +- .../public/views/logstash/node/index.js | 24 +- .../public/views/logstash/nodes/index.js | 8 +- .../server/alerts/alerts_factory.test.ts | 2 +- .../server/alerts/alerts_factory.ts | 3 + .../monitoring/server/alerts/base_alert.ts | 41 +- .../server/alerts/cpu_usage_alert.ts | 4 +- .../plugins/monitoring/server/alerts/index.ts | 1 + .../missing_monitoring_data_alert.test.ts | 459 ++++++++++++++++ .../alerts/missing_monitoring_data_alert.ts | 504 ++++++++++++++++++ .../monitoring/server/alerts/types.d.ts | 16 + .../server/lib/alerts/fetch_clusters.ts | 19 +- .../fetch_missing_monitoring_data.test.ts | 249 +++++++++ .../alerts/fetch_missing_monitoring_data.ts | 275 ++++++++++ .../get_listing_link_for_stack_product.ts | 28 + .../lib/alerts/get_stack_product_label.ts | 17 + .../get_type_label_for_stack_product.ts | 51 ++ 59 files changed, 2303 insertions(+), 89 deletions(-) create mode 100644 x-pack/plugins/monitoring/public/alerts/filter_alert_states.ts create mode 100644 x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/expression.tsx create mode 100644 x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/index.ts create mode 100644 x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/missing_monitoring_data_alert.tsx create mode 100644 x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/validation.tsx create mode 100644 x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts create mode 100644 x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts create mode 100644 x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.test.ts create mode 100644 x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.ts create mode 100644 x-pack/plugins/monitoring/server/lib/alerts/get_listing_link_for_stack_product.ts create mode 100644 x-pack/plugins/monitoring/server/lib/alerts/get_stack_product_label.ts create mode 100644 x-pack/plugins/monitoring/server/lib/alerts/get_type_label_for_stack_product.ts diff --git a/x-pack/plugins/monitoring/common/constants.ts b/x-pack/plugins/monitoring/common/constants.ts index 6eb0d6e93d58a..860f6439f3fdf 100644 --- a/x-pack/plugins/monitoring/common/constants.ts +++ b/x-pack/plugins/monitoring/common/constants.ts @@ -236,6 +236,7 @@ export const ALERT_NODES_CHANGED = `${ALERT_PREFIX}alert_nodes_changed`; export const ALERT_ELASTICSEARCH_VERSION_MISMATCH = `${ALERT_PREFIX}alert_elasticsearch_version_mismatch`; export const ALERT_KIBANA_VERSION_MISMATCH = `${ALERT_PREFIX}alert_kibana_version_mismatch`; export const ALERT_LOGSTASH_VERSION_MISMATCH = `${ALERT_PREFIX}alert_logstash_version_mismatch`; +export const ALERT_MISSING_MONITORING_DATA = `${ALERT_PREFIX}alert_missing_monitoring_data`; /** * A listing of all alert types @@ -249,6 +250,7 @@ export const ALERTS = [ ALERT_ELASTICSEARCH_VERSION_MISMATCH, ALERT_KIBANA_VERSION_MISMATCH, ALERT_LOGSTASH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, ]; /** diff --git a/x-pack/plugins/monitoring/common/types.ts b/x-pack/plugins/monitoring/common/types.ts index 4216a046fef9f..825d2e454b3bb 100644 --- a/x-pack/plugins/monitoring/common/types.ts +++ b/x-pack/plugins/monitoring/common/types.ts @@ -31,10 +31,14 @@ export interface CommonAlertFilter { nodeUuid?: string; } -export interface CommonAlertCpuUsageFilter extends CommonAlertFilter { +export interface CommonAlertNodeUuidFilter extends CommonAlertFilter { nodeUuid: string; } +export interface CommonAlertStackProductFilter extends CommonAlertFilter { + stackProduct: string; +} + export interface CommonAlertParamDetail { label: string; type: AlertParamType; diff --git a/x-pack/plugins/monitoring/public/alerts/badge.tsx b/x-pack/plugins/monitoring/public/alerts/badge.tsx index 1d67eebb1705c..cf75939b14efc 100644 --- a/x-pack/plugins/monitoring/public/alerts/badge.tsx +++ b/x-pack/plugins/monitoring/public/alerts/badge.tsx @@ -18,7 +18,7 @@ import { CommonAlertStatus, CommonAlertState } from '../../common/types'; import { AlertSeverity } from '../../common/enums'; // @ts-ignore import { formatDateTimeLocal } from '../../common/formatting'; -import { AlertState } from '../../server/alerts/types'; +import { AlertMessage, AlertState } from '../../server/alerts/types'; import { AlertPanel } from './panel'; import { Legacy } from '../legacy_shims'; import { isInSetupMode } from '../lib/setup_mode'; @@ -39,9 +39,10 @@ interface AlertInPanel { interface Props { alerts: { [alertTypeId: string]: CommonAlertStatus }; stateFilter: (state: AlertState) => boolean; + nextStepsFilter: (nextStep: AlertMessage) => boolean; } export const AlertsBadge: React.FC<Props> = (props: Props) => { - const { stateFilter = () => true } = props; + const { stateFilter = () => true, nextStepsFilter = () => true } = props; const [showPopover, setShowPopover] = React.useState<AlertSeverity | boolean | null>(null); const inSetupMode = isInSetupMode(); const alerts = Object.values(props.alerts).filter(Boolean); @@ -80,7 +81,7 @@ export const AlertsBadge: React.FC<Props> = (props: Props) => { id: index + 1, title: alertStatus.alert.label, width: 400, - content: <AlertPanel alert={alertStatus} />, + content: <AlertPanel alert={alertStatus} nextStepsFilter={nextStepsFilter} />, }; }), ]; @@ -158,7 +159,13 @@ export const AlertsBadge: React.FC<Props> = (props: Props) => { id: index + 1, title: getDateFromState(alertStatus.alertState), width: 400, - content: <AlertPanel alert={alertStatus.alert} alertState={alertStatus.alertState} />, + content: ( + <AlertPanel + alert={alertStatus.alert} + alertState={alertStatus.alertState} + nextStepsFilter={nextStepsFilter} + /> + ), }; }), ]; diff --git a/x-pack/plugins/monitoring/public/alerts/callout.tsx b/x-pack/plugins/monitoring/public/alerts/callout.tsx index cad98dd1e6aec..1ddd41c268456 100644 --- a/x-pack/plugins/monitoring/public/alerts/callout.tsx +++ b/x-pack/plugins/monitoring/public/alerts/callout.tsx @@ -32,9 +32,10 @@ const TYPES = [ interface Props { alerts: { [alertTypeId: string]: CommonAlertStatus }; stateFilter: (state: AlertState) => boolean; + nextStepsFilter: (nextStep: AlertMessage) => boolean; } export const AlertsCallout: React.FC<Props> = (props: Props) => { - const { alerts, stateFilter = () => true } = props; + const { alerts, stateFilter = () => true, nextStepsFilter = () => true } = props; const callouts = TYPES.map((type) => { const list = []; @@ -56,11 +57,11 @@ export const AlertsCallout: React.FC<Props> = (props: Props) => { const nextStepsUi = state.ui.message.nextSteps && state.ui.message.nextSteps.length ? ( <ul> - {state.ui.message.nextSteps.map( - (step: AlertMessage, nextStepIndex: number) => ( + {state.ui.message.nextSteps + .filter(nextStepsFilter) + .map((step: AlertMessage, nextStepIndex: number) => ( <li key={nextStepIndex}>{replaceTokens(step)}</li> - ) - )} + ))} </ul> ) : null; diff --git a/x-pack/plugins/monitoring/public/alerts/filter_alert_states.ts b/x-pack/plugins/monitoring/public/alerts/filter_alert_states.ts new file mode 100644 index 0000000000000..63714a6921e3f --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/filter_alert_states.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CommonAlertState, CommonAlertStatus } from '../../common/types'; + +export function filterAlertStates( + alerts: { [type: string]: CommonAlertStatus }, + filter: (type: string, state: CommonAlertState) => boolean +) { + return Object.keys(alerts).reduce( + (accum: { [type: string]: CommonAlertStatus }, type: string) => { + accum[type] = { + ...alerts[type], + states: alerts[type].states.filter((state) => filter(type, state)), + }; + return accum; + }, + {} + ); +} diff --git a/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/expression.tsx b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/expression.tsx new file mode 100644 index 0000000000000..7dc6155de529e --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/expression.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { Fragment } from 'react'; +import { EuiForm, EuiSpacer } from '@elastic/eui'; +import { CommonAlertParamDetails } from '../../../common/types'; +import { AlertParamDuration } from '../flyout_expressions/alert_param_duration'; +import { AlertParamType } from '../../../common/enums'; +import { AlertParamPercentage } from '../flyout_expressions/alert_param_percentage'; + +export interface Props { + alertParams: { [property: string]: any }; + setAlertParams: (property: string, value: any) => void; + setAlertProperty: (property: string, value: any) => void; + errors: { [key: string]: string[] }; + paramDetails: CommonAlertParamDetails; +} + +export const Expression: React.FC<Props> = (props) => { + const { alertParams, paramDetails, setAlertParams, errors } = props; + + const alertParamsUi = Object.keys(alertParams).map((alertParamName) => { + const details = paramDetails[alertParamName]; + const value = alertParams[alertParamName]; + + switch (details.type) { + case AlertParamType.Duration: + return ( + <AlertParamDuration + key={alertParamName} + name={alertParamName} + duration={value} + label={details.label} + errors={errors[alertParamName]} + setAlertParams={setAlertParams} + /> + ); + case AlertParamType.Percentage: + return ( + <AlertParamPercentage + key={alertParamName} + name={alertParamName} + label={details.label} + percentage={value} + errors={errors[alertParamName]} + setAlertParams={setAlertParams} + /> + ); + } + }); + + return ( + <Fragment> + <EuiForm component="form">{alertParamsUi}</EuiForm> + <EuiSpacer /> + </Fragment> + ); +}; diff --git a/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/index.ts b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/index.ts new file mode 100644 index 0000000000000..5169601c0e6e3 --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { createMissingMonitoringDataAlertType } from './missing_monitoring_data_alert'; diff --git a/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/missing_monitoring_data_alert.tsx b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/missing_monitoring_data_alert.tsx new file mode 100644 index 0000000000000..bcea98592adb2 --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/missing_monitoring_data_alert.tsx @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { AlertTypeModel } from '../../../../triggers_actions_ui/public/types'; +import { validate } from './validation'; +import { ALERT_MISSING_MONITORING_DATA } from '../../../common/constants'; +import { Expression } from './expression'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { MissingMonitoringDataAlert } from '../../../server/alerts'; + +export function createMissingMonitoringDataAlertType(): AlertTypeModel { + const alert = new MissingMonitoringDataAlert(); + return { + id: ALERT_MISSING_MONITORING_DATA, + name: alert.label, + iconClass: 'bell', + alertParamsExpression: (props: any) => ( + <Expression {...props} paramDetails={MissingMonitoringDataAlert.paramDetails} /> + ), + validate, + defaultActionMessage: '{{context.internalFullMessage}}', + requiresAppContext: true, + }; +} diff --git a/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/validation.tsx b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/validation.tsx new file mode 100644 index 0000000000000..fe84de9bd00ea --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/missing_monitoring_data_alert/validation.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ValidationResult } from '../../../../triggers_actions_ui/public/types'; + +export function validate(opts: any): ValidationResult { + const validationResult = { errors: {} }; + + const errors: { [key: string]: string[] } = { + duration: [], + limit: [], + }; + if (!opts.duration) { + errors.duration.push( + i18n.translate('xpack.monitoring.alerts.missingData.validation.duration', { + defaultMessage: 'A valid duration is required.', + }) + ); + } + if (!opts.limit) { + errors.limit.push( + i18n.translate('xpack.monitoring.alerts.missingData.validation.limit', { + defaultMessage: 'A valid limit is required.', + }) + ); + } + + validationResult.errors = errors; + return validationResult; +} diff --git a/x-pack/plugins/monitoring/public/alerts/panel.tsx b/x-pack/plugins/monitoring/public/alerts/panel.tsx index 91604acf115fa..ee605592e9408 100644 --- a/x-pack/plugins/monitoring/public/alerts/panel.tsx +++ b/x-pack/plugins/monitoring/public/alerts/panel.tsx @@ -30,11 +30,13 @@ import { BASE_ALERT_API_PATH } from '../../../alerts/common'; interface Props { alert: CommonAlertStatus; alertState?: CommonAlertState; + nextStepsFilter: (nextStep: AlertMessage) => boolean; } export const AlertPanel: React.FC<Props> = (props: Props) => { const { alert: { alert }, alertState, + nextStepsFilter = () => true, } = props; const [showFlyout, setShowFlyout] = React.useState(false); const [isEnabled, setIsEnabled] = React.useState(alert.rawAlert.enabled); @@ -198,9 +200,11 @@ export const AlertPanel: React.FC<Props> = (props: Props) => { const nextStepsUi = alertState.state.ui.message.nextSteps && alertState.state.ui.message.nextSteps.length ? ( <EuiListGroup> - {alertState.state.ui.message.nextSteps.map((step: AlertMessage, index: number) => ( - <EuiListGroupItem size="s" key={index} label={replaceTokens(step)} /> - ))} + {alertState.state.ui.message.nextSteps + .filter(nextStepsFilter) + .map((step: AlertMessage, index: number) => ( + <EuiListGroupItem size="s" key={index} label={replaceTokens(step)} /> + ))} </EuiListGroup> ) : null; diff --git a/x-pack/plugins/monitoring/public/alerts/status.tsx b/x-pack/plugins/monitoring/public/alerts/status.tsx index 0407ddfecf5e9..dba66df0e4474 100644 --- a/x-pack/plugins/monitoring/public/alerts/status.tsx +++ b/x-pack/plugins/monitoring/public/alerts/status.tsx @@ -9,7 +9,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { CommonAlertStatus } from '../../common/types'; import { AlertSeverity } from '../../common/enums'; -import { AlertState } from '../../server/alerts/types'; +import { AlertMessage, AlertState } from '../../server/alerts/types'; import { AlertsBadge } from './badge'; import { isInSetupMode } from '../lib/setup_mode'; @@ -18,9 +18,16 @@ interface Props { showBadge: boolean; showOnlyCount: boolean; stateFilter: (state: AlertState) => boolean; + nextStepsFilter: (nextStep: AlertMessage) => boolean; } export const AlertsStatus: React.FC<Props> = (props: Props) => { - const { alerts, showBadge = false, showOnlyCount = false, stateFilter = () => true } = props; + const { + alerts, + showBadge = false, + showOnlyCount = false, + stateFilter = () => true, + nextStepsFilter = () => true, + } = props; const inSetupMode = isInSetupMode(); if (!alerts) { @@ -71,7 +78,9 @@ export const AlertsStatus: React.FC<Props> = (props: Props) => { } if (showBadge || inSetupMode) { - return <AlertsBadge alerts={alerts} stateFilter={stateFilter} />; + return ( + <AlertsBadge alerts={alerts} stateFilter={stateFilter} nextStepsFilter={nextStepsFilter} /> + ); } const severity = atLeastOneDanger ? AlertSeverity.Danger : AlertSeverity.Warning; diff --git a/x-pack/plugins/monitoring/public/components/apm/instance/instance.js b/x-pack/plugins/monitoring/public/components/apm/instance/instance.js index eec24e741ac41..8934bbc41f5f6 100644 --- a/x-pack/plugins/monitoring/public/components/apm/instance/instance.js +++ b/x-pack/plugins/monitoring/public/components/apm/instance/instance.js @@ -18,8 +18,9 @@ import { } from '@elastic/eui'; import { Status } from './status'; import { FormattedMessage } from '@kbn/i18n/react'; +import { AlertsCallout } from '../../../alerts/callout'; -export function ApmServerInstance({ summary, metrics, ...props }) { +export function ApmServerInstance({ summary, metrics, alerts, ...props }) { const seriesToShow = [ metrics.apm_requests, metrics.apm_responses_valid, @@ -58,9 +59,18 @@ export function ApmServerInstance({ summary, metrics, ...props }) { </h1> </EuiScreenReaderOnly> <EuiPanel> - <Status stats={summary} /> + <Status stats={summary} alerts={alerts} /> </EuiPanel> <EuiSpacer size="m" /> + <AlertsCallout + alerts={alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('APM servers')) { + return false; + } + return true; + }} + /> <EuiPageContent> <EuiFlexGroup wrap>{charts}</EuiFlexGroup> </EuiPageContent> diff --git a/x-pack/plugins/monitoring/public/components/apm/instance/status.js b/x-pack/plugins/monitoring/public/components/apm/instance/status.js index 9b78db54a2aa7..02a15d214ab9b 100644 --- a/x-pack/plugins/monitoring/public/components/apm/instance/status.js +++ b/x-pack/plugins/monitoring/public/components/apm/instance/status.js @@ -14,7 +14,7 @@ import { CALCULATE_DURATION_SINCE } from '../../../../common/constants'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -export function Status({ stats }) { +export function Status({ alerts, stats }) { const { name, output, version, uptime, timeOfLastEvent } = stats; const metrics = [ @@ -78,6 +78,7 @@ export function Status({ stats }) { return ( <SummaryStatus metrics={metrics} + alerts={alerts} IconComponent={IconComponent} data-test-subj="apmDetailStatus" /> diff --git a/x-pack/plugins/monitoring/public/components/apm/instances/instances.js b/x-pack/plugins/monitoring/public/components/apm/instances/instances.js index e05ba1878caed..4932fb9068fcc 100644 --- a/x-pack/plugins/monitoring/public/components/apm/instances/instances.js +++ b/x-pack/plugins/monitoring/public/components/apm/instances/instances.js @@ -28,8 +28,9 @@ import { SetupModeBadge } from '../../setup_mode/badge'; import { FormattedMessage } from '@kbn/i18n/react'; import { isSetupModeFeatureEnabled } from '../../../lib/setup_mode'; import { SetupModeFeature } from '../../../../common/enums'; +import { AlertsStatus } from '../../../alerts/status'; -function getColumns(setupMode) { +function getColumns(alerts, setupMode) { return [ { name: i18n.translate('xpack.monitoring.apm.instances.nameTitle', { @@ -71,6 +72,29 @@ function getColumns(setupMode) { ); }, }, + { + name: i18n.translate('xpack.monitoring.beats.instances.alertsColumnTitle', { + defaultMessage: 'Alerts', + }), + field: 'alerts', + width: '175px', + sortable: true, + render: (_field, beat) => { + return ( + <AlertsStatus + showBadge={true} + alerts={alerts} + stateFilter={(state) => state.stackProductUuid === beat.uuid} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('APM servers')) { + return false; + } + return true; + }} + /> + ); + }, + }, { name: i18n.translate('xpack.monitoring.apm.instances.outputEnabledTitle', { defaultMessage: 'Output Enabled', @@ -127,7 +151,7 @@ function getColumns(setupMode) { ]; } -export function ApmServerInstances({ apms, setupMode }) { +export function ApmServerInstances({ apms, alerts, setupMode }) { const { pagination, sorting, onTableChange, data } = apms; let setupModeCallout = null; @@ -157,7 +181,7 @@ export function ApmServerInstances({ apms, setupMode }) { </h1> </EuiScreenReaderOnly> <EuiPanel> - <Status stats={data.stats} /> + <Status stats={data.stats} alerts={alerts} /> </EuiPanel> <EuiSpacer size="m" /> <EuiPageContent> @@ -165,7 +189,7 @@ export function ApmServerInstances({ apms, setupMode }) { <EuiMonitoringTable className="apmInstancesTable" rows={data.apms} - columns={getColumns(setupMode)} + columns={getColumns(alerts, setupMode)} sorting={sorting} pagination={pagination} setupMode={setupMode} diff --git a/x-pack/plugins/monitoring/public/components/apm/instances/status.js b/x-pack/plugins/monitoring/public/components/apm/instances/status.js index 818671626ec06..c15e22029d9de 100644 --- a/x-pack/plugins/monitoring/public/components/apm/instances/status.js +++ b/x-pack/plugins/monitoring/public/components/apm/instances/status.js @@ -14,7 +14,7 @@ import { CALCULATE_DURATION_SINCE } from '../../../../common/constants'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -export function Status({ stats }) { +export function Status({ alerts, stats }) { const { apms: { total }, totalEvents, @@ -68,6 +68,7 @@ export function Status({ stats }) { return ( <SummaryStatus metrics={metrics} + alerts={alerts} IconComponent={IconComponent} data-test-subj="apmDetailStatus" /> diff --git a/x-pack/plugins/monitoring/public/components/apm/overview/index.js b/x-pack/plugins/monitoring/public/components/apm/overview/index.js index 35efa6ac67ea8..b10592c2a49d2 100644 --- a/x-pack/plugins/monitoring/public/components/apm/overview/index.js +++ b/x-pack/plugins/monitoring/public/components/apm/overview/index.js @@ -19,7 +19,7 @@ import { import { Status } from '../instances/status'; import { FormattedMessage } from '@kbn/i18n/react'; -export function ApmOverview({ stats, metrics, ...props }) { +export function ApmOverview({ stats, metrics, alerts, ...props }) { const seriesToShow = [ metrics.apm_responses_valid, metrics.apm_responses_errors, @@ -54,7 +54,7 @@ export function ApmOverview({ stats, metrics, ...props }) { </h1> </EuiScreenReaderOnly> <EuiPanel> - <Status stats={stats} /> + <Status stats={stats} alerts={alerts} /> </EuiPanel> <EuiSpacer size="m" /> <EuiPageContent> diff --git a/x-pack/plugins/monitoring/public/components/beats/beat/beat.js b/x-pack/plugins/monitoring/public/components/beats/beat/beat.js index f489271659bfe..470cdf588ca3d 100644 --- a/x-pack/plugins/monitoring/public/components/beats/beat/beat.js +++ b/x-pack/plugins/monitoring/public/components/beats/beat/beat.js @@ -20,8 +20,9 @@ import { import { i18n } from '@kbn/i18n'; import { SummaryStatus } from '../../summary_status'; import { FormattedMessage } from '@kbn/i18n/react'; +import { AlertsCallout } from '../../../alerts/callout'; -export function Beat({ summary, metrics, ...props }) { +export function Beat({ summary, metrics, alerts, ...props }) { const metricsToShow = [ metrics.beat_event_rates, metrics.beat_fail_rates, @@ -134,13 +135,26 @@ export function Beat({ summary, metrics, ...props }) { <EuiPage> <EuiPageBody> <EuiPanel> - <SummaryStatus metrics={summarytStatsTop} data-test-subj="beatSummaryStatus01" /> + <SummaryStatus + metrics={summarytStatsTop} + alerts={alerts} + data-test-subj="beatSummaryStatus01" + /> </EuiPanel> <EuiSpacer size="m" /> <EuiPanel> <SummaryStatus metrics={summarytStatsBot} data-test-subj="beatSummaryStatus02" /> </EuiPanel> <EuiSpacer size="m" /> + <AlertsCallout + alerts={alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Beat instances')) { + return false; + } + return true; + }} + /> <EuiPageContent> <EuiScreenReaderOnly> <h1> diff --git a/x-pack/plugins/monitoring/public/components/beats/listing/listing.js b/x-pack/plugins/monitoring/public/components/beats/listing/listing.js index 60a35e00a4c63..dc65cd38aac53 100644 --- a/x-pack/plugins/monitoring/public/components/beats/listing/listing.js +++ b/x-pack/plugins/monitoring/public/components/beats/listing/listing.js @@ -26,10 +26,12 @@ import { SetupModeBadge } from '../../setup_mode/badge'; import { FormattedMessage } from '@kbn/i18n/react'; import { isSetupModeFeatureEnabled } from '../../../lib/setup_mode'; import { SetupModeFeature } from '../../../../common/enums'; +import { AlertsStatus } from '../../../alerts/status'; export class Listing extends PureComponent { getColumns() { const setupMode = this.props.setupMode; + const alerts = this.props.alerts; return [ { @@ -72,6 +74,29 @@ export class Listing extends PureComponent { ); }, }, + { + name: i18n.translate('xpack.monitoring.beats.instances.alertsColumnTitle', { + defaultMessage: 'Alerts', + }), + field: 'alerts', + width: '175px', + sortable: true, + render: (_field, beat) => { + return ( + <AlertsStatus + showBadge={true} + alerts={alerts} + stateFilter={(state) => state.stackProductUuid === beat.uuid} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Beat instances')) { + return false; + } + return true; + }} + /> + ); + }, + }, { name: i18n.translate('xpack.monitoring.beats.instances.typeTitle', { defaultMessage: 'Type', @@ -122,7 +147,7 @@ export class Listing extends PureComponent { } render() { - const { stats, data, sorting, pagination, onTableChange, setupMode } = this.props; + const { stats, data, sorting, pagination, onTableChange, setupMode, alerts } = this.props; let setupModeCallOut = null; if (isSetupModeFeatureEnabled(SetupModeFeature.MetricbeatMigration)) { @@ -155,7 +180,7 @@ export class Listing extends PureComponent { </h1> </EuiScreenReaderOnly> <EuiPanel> - <Stats stats={stats} /> + <Stats stats={stats} alerts={alerts} /> </EuiPanel> <EuiSpacer size="m" /> <EuiPageContent> diff --git a/x-pack/plugins/monitoring/public/components/beats/overview/overview.js b/x-pack/plugins/monitoring/public/components/beats/overview/overview.js index 897f017f44f41..aa09da31504d3 100644 --- a/x-pack/plugins/monitoring/public/components/beats/overview/overview.js +++ b/x-pack/plugins/monitoring/public/components/beats/overview/overview.js @@ -84,6 +84,7 @@ export function BeatsOverview({ latestVersions, stats, metrics, + alerts, ...props }) { const seriesToShow = [ @@ -113,7 +114,7 @@ export function BeatsOverview({ </h1> </EuiScreenReaderOnly> <EuiPanel> - <Stats stats={stats} /> + <Stats stats={stats} alerts={alerts} /> </EuiPanel> <EuiSpacer size="m" /> <EuiPanel>{renderLatestActive(latestActive, latestTypes, latestVersions)}</EuiPanel> diff --git a/x-pack/plugins/monitoring/public/components/beats/stats.js b/x-pack/plugins/monitoring/public/components/beats/stats.js index 89ec10bbaf1bb..c1f06af14a453 100644 --- a/x-pack/plugins/monitoring/public/components/beats/stats.js +++ b/x-pack/plugins/monitoring/public/components/beats/stats.js @@ -9,7 +9,7 @@ import { formatMetric } from '../../lib/format_number'; import { SummaryStatus } from '../summary_status'; import { i18n } from '@kbn/i18n'; -export function Stats({ stats }) { +export function Stats({ stats, alerts }) { const { total, types, @@ -51,5 +51,5 @@ export function Stats({ stats }) { 'data-test-subj': 'bytesSent', }); - return <SummaryStatus metrics={metrics} data-test-subj="beatsSummaryStatus" />; + return <SummaryStatus metrics={metrics} alerts={alerts} data-test-subj="beatsSummaryStatus" />; } diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/apm_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/apm_panel.js index 4bf07710393ea..d0d5a36c3829b 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/apm_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/apm_panel.js @@ -24,14 +24,22 @@ import { EuiFlexGroup, } from '@elastic/eui'; import { formatTimestampToDuration } from '../../../../common'; -import { CALCULATE_DURATION_SINCE, APM_SYSTEM_ID } from '../../../../common/constants'; +import { + CALCULATE_DURATION_SINCE, + APM_SYSTEM_ID, + ALERT_MISSING_MONITORING_DATA, +} from '../../../../common/constants'; import { SetupModeTooltip } from '../../setup_mode/tooltip'; import { getSafeForExternalLink } from '../../../lib/get_safe_for_external_link'; import { isSetupModeFeatureEnabled } from '../../../lib/setup_mode'; import { SetupModeFeature } from '../../../../common/enums'; +import { shouldShowAlertBadge } from '../../../alerts/lib/should_show_alert_badge'; +import { AlertsBadge } from '../../../alerts/badge'; + +const SERVERS_PANEL_ALERTS = [ALERT_MISSING_MONITORING_DATA]; export function ApmPanel(props) { - const { setupMode } = props; + const { setupMode, alerts } = props; const apmsTotal = get(props, 'apms.total') || 0; // Do not show if we are not in setup mode if (apmsTotal === 0 && !setupMode.enabled) { @@ -50,6 +58,16 @@ export function ApmPanel(props) { /> ) : null; + let apmServersAlertStatus = null; + if (shouldShowAlertBadge(alerts, SERVERS_PANEL_ALERTS)) { + const alertsList = SERVERS_PANEL_ALERTS.map((alertType) => alerts[alertType]); + apmServersAlertStatus = ( + <EuiFlexItem grow={false}> + <AlertsBadge alerts={alertsList} /> + </EuiFlexItem> + ); + } + return ( <ClusterItemContainer {...props} @@ -140,7 +158,12 @@ export function ApmPanel(props) { </h3> </EuiTitle> </EuiFlexItem> - {setupModeMetricbeatMigrationTooltip} + <EuiFlexItem grow={false}> + <EuiFlexGroup gutterSize="s" alignItems="center"> + {setupModeMetricbeatMigrationTooltip} + {apmServersAlertStatus} + </EuiFlexGroup> + </EuiFlexItem> </EuiFlexGroup> <EuiHorizontalRule margin="m" /> <EuiDescriptionList type="column"> diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/beats_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/beats_panel.js index 3d9b455787a96..628f57a0ffde3 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/beats_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/beats_panel.js @@ -23,13 +23,17 @@ import { ClusterItemContainer, DisabledIfNoDataAndInSetupModeLink } from './help import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { SetupModeTooltip } from '../../setup_mode/tooltip'; -import { BEATS_SYSTEM_ID } from '../../../../common/constants'; +import { ALERT_MISSING_MONITORING_DATA, BEATS_SYSTEM_ID } from '../../../../common/constants'; import { getSafeForExternalLink } from '../../../lib/get_safe_for_external_link'; import { isSetupModeFeatureEnabled } from '../../../lib/setup_mode'; import { SetupModeFeature } from '../../../../common/enums'; +import { shouldShowAlertBadge } from '../../../alerts/lib/should_show_alert_badge'; +import { AlertsBadge } from '../../../alerts/badge'; + +const BEATS_PANEL_ALERTS = [ALERT_MISSING_MONITORING_DATA]; export function BeatsPanel(props) { - const { setupMode } = props; + const { setupMode, alerts } = props; const beatsTotal = get(props, 'beats.total') || 0; // Do not show if we are not in setup mode if (beatsTotal === 0 && !setupMode.enabled) { @@ -47,6 +51,16 @@ export function BeatsPanel(props) { /> ) : null; + let beatsAlertsStatus = null; + if (shouldShowAlertBadge(alerts, BEATS_PANEL_ALERTS)) { + const alertsList = BEATS_PANEL_ALERTS.map((alertType) => alerts[alertType]); + beatsAlertsStatus = ( + <EuiFlexItem grow={false}> + <AlertsBadge alerts={alertsList} /> + </EuiFlexItem> + ); + } + const beatTypes = props.beats.types.map((beat, index) => { return [ <EuiDescriptionListTitle @@ -145,7 +159,12 @@ export function BeatsPanel(props) { </h3> </EuiTitle> </EuiFlexItem> - {setupModeMetricbeatMigrationTooltip} + <EuiFlexItem grow={false}> + <EuiFlexGroup gutterSize="s" alignItems="center"> + {setupModeMetricbeatMigrationTooltip} + {beatsAlertsStatus} + </EuiFlexGroup> + </EuiFlexItem> </EuiFlexGroup> <EuiHorizontalRule margin="m" /> <EuiDescriptionList type="column">{beatTypes}</EuiDescriptionList> diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js index 61a24f31ca89a..667f64458b8f9 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js @@ -43,6 +43,7 @@ import { ALERT_DISK_USAGE, ALERT_NODES_CHANGED, ALERT_ELASTICSEARCH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, } from '../../../../common/constants'; import { AlertsBadge } from '../../../alerts/badge'; import { shouldShowAlertBadge } from '../../../alerts/lib/should_show_alert_badge'; @@ -161,6 +162,7 @@ const NODES_PANEL_ALERTS = [ ALERT_DISK_USAGE, ALERT_NODES_CHANGED, ALERT_ELASTICSEARCH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, ]; export function ElasticsearchPanel(props) { diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/index.js b/x-pack/plugins/monitoring/public/components/cluster/overview/index.js index 66701c1dfd95a..aebd1cee5f0be 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/index.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/index.js @@ -12,7 +12,16 @@ import { BeatsPanel } from './beats_panel'; import { EuiPage, EuiPageBody, EuiScreenReaderOnly } from '@elastic/eui'; import { ApmPanel } from './apm_panel'; import { FormattedMessage } from '@kbn/i18n/react'; -import { STANDALONE_CLUSTER_CLUSTER_UUID } from '../../../../common/constants'; +import { + STANDALONE_CLUSTER_CLUSTER_UUID, + ALERT_MISSING_MONITORING_DATA, + ELASTICSEARCH_SYSTEM_ID, + KIBANA_SYSTEM_ID, + LOGSTASH_SYSTEM_ID, + BEATS_SYSTEM_ID, + APM_SYSTEM_ID, +} from '../../../../common/constants'; +import { filterAlertStates } from '../../../alerts/filter_alert_states'; export function Overview(props) { const isFromStandaloneCluster = props.cluster.cluster_uuid === STANDALONE_CLUSTER_CLUSTER_UUID; @@ -37,12 +46,22 @@ export function Overview(props) { license={props.cluster.license} setupMode={props.setupMode} showLicenseExpiration={props.showLicenseExpiration} - alerts={props.alerts} + alerts={filterAlertStates(props.alerts, (type, { state }) => { + if (type === ALERT_MISSING_MONITORING_DATA) { + return state.stackProduct === ELASTICSEARCH_SYSTEM_ID; + } + return true; + })} /> <KibanaPanel {...props.cluster.kibana} setupMode={props.setupMode} - alerts={props.alerts} + alerts={filterAlertStates(props.alerts, (type, { state }) => { + if (type === ALERT_MISSING_MONITORING_DATA) { + return state.stackProduct === KIBANA_SYSTEM_ID; + } + return true; + })} /> </Fragment> ) : null} @@ -50,12 +69,35 @@ export function Overview(props) { <LogstashPanel {...props.cluster.logstash} setupMode={props.setupMode} - alerts={props.alerts} + alerts={filterAlertStates(props.alerts, (type, { state }) => { + if (type === ALERT_MISSING_MONITORING_DATA) { + return state.stackProduct === LOGSTASH_SYSTEM_ID; + } + return true; + })} /> - <BeatsPanel {...props.cluster.beats} setupMode={props.setupMode} /> + <BeatsPanel + {...props.cluster.beats} + setupMode={props.setupMode} + alerts={filterAlertStates(props.alerts, (type, { state }) => { + if (type === ALERT_MISSING_MONITORING_DATA) { + return state.stackProduct === BEATS_SYSTEM_ID; + } + return true; + })} + /> - <ApmPanel {...props.cluster.apm} setupMode={props.setupMode} /> + <ApmPanel + {...props.cluster.apm} + setupMode={props.setupMode} + alerts={filterAlertStates(props.alerts, (type, { state }) => { + if (type === ALERT_MISSING_MONITORING_DATA) { + return state.stackProduct === APM_SYSTEM_ID; + } + return true; + })} + /> </EuiPageBody> </EuiPage> ); diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/kibana_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/kibana_panel.js index 7df0a3ca7138e..1f20684bd97d7 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/kibana_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/kibana_panel.js @@ -28,14 +28,18 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { SetupModeTooltip } from '../../setup_mode/tooltip'; -import { KIBANA_SYSTEM_ID, ALERT_KIBANA_VERSION_MISMATCH } from '../../../../common/constants'; +import { + KIBANA_SYSTEM_ID, + ALERT_KIBANA_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, +} from '../../../../common/constants'; import { getSafeForExternalLink } from '../../../lib/get_safe_for_external_link'; import { AlertsBadge } from '../../../alerts/badge'; import { shouldShowAlertBadge } from '../../../alerts/lib/should_show_alert_badge'; import { isSetupModeFeatureEnabled } from '../../../lib/setup_mode'; import { SetupModeFeature } from '../../../../common/enums'; -const INSTANCES_PANEL_ALERTS = [ALERT_KIBANA_VERSION_MISMATCH]; +const INSTANCES_PANEL_ALERTS = [ALERT_KIBANA_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA]; export function KibanaPanel(props) { const setupMode = props.setupMode; diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js index 2c61438dca17c..7c0e04ab5d615 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js @@ -15,6 +15,7 @@ import { LOGSTASH, LOGSTASH_SYSTEM_ID, ALERT_LOGSTASH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, } from '../../../../common/constants'; import { @@ -40,7 +41,7 @@ import { shouldShowAlertBadge } from '../../../alerts/lib/should_show_alert_badg import { isSetupModeFeatureEnabled } from '../../../lib/setup_mode'; import { SetupModeFeature } from '../../../../common/enums'; -const NODES_PANEL_ALERTS = [ALERT_LOGSTASH_VERSION_MISMATCH]; +const NODES_PANEL_ALERTS = [ALERT_LOGSTASH_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA]; export function LogstashPanel(props) { const { setupMode } = props; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js index ac1a5212a8d26..47e30b71e03d0 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js @@ -73,11 +73,22 @@ export const Node = ({ <NodeDetailStatus stats={nodeSummary} alerts={alerts} - alertsStateFilter={(state) => state.nodeId === nodeId} + alertsStateFilter={(state) => + state.nodeId === nodeId || state.stackProductUuid === nodeId + } /> </EuiPanel> <EuiSpacer size="m" /> - <AlertsCallout alerts={alerts} stateFilter={(state) => state.nodeId === nodeId} /> + <AlertsCallout + alerts={alerts} + stateFilter={(state) => state.nodeId === nodeId || state.stackProductUuid === nodeId} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Elasticsearch nodes')) { + return false; + } + return true; + }} + /> <EuiPageContent> <EuiFlexGrid columns={2} gutterSize="s"> {metricsToShow.map((metric, index) => ( diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/nodes/nodes.js b/x-pack/plugins/monitoring/public/components/elasticsearch/nodes/nodes.js index f088f7c0d348a..41d3a579db5a2 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/nodes/nodes.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/nodes/nodes.js @@ -137,7 +137,15 @@ const getColumns = (showCgroupMetricsElasticsearch, setupMode, clusterUuid, aler <AlertsStatus showBadge={true} alerts={alerts} - stateFilter={(state) => state.nodeId === node.resolver} + stateFilter={(state) => + state.nodeId === node.resolver || state.stackProductUuid === node.resolver + } + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Elasticsearch nodes')) { + return false; + } + return true; + }} /> ); }, diff --git a/x-pack/plugins/monitoring/public/components/kibana/instances/instances.js b/x-pack/plugins/monitoring/public/components/kibana/instances/instances.js index 10ad1634eda86..8095337dd3796 100644 --- a/x-pack/plugins/monitoring/public/components/kibana/instances/instances.js +++ b/x-pack/plugins/monitoring/public/components/kibana/instances/instances.js @@ -91,7 +91,18 @@ const getColumns = (setupMode, alerts) => { width: '175px', sortable: true, render: () => { - return <AlertsStatus showBadge={true} alerts={alerts} />; + return ( + <AlertsStatus + showBadge={true} + alerts={alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Kibana instances')) { + return false; + } + return true; + }} + /> + ); }, }, { diff --git a/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js b/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js index 4a1137079ebb4..a5db433bbfe0a 100644 --- a/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js +++ b/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js @@ -84,7 +84,18 @@ export class Listing extends PureComponent { width: '175px', sortable: true, render: () => { - return <AlertsStatus showBadge={true} alerts={alerts} />; + return ( + <AlertsStatus + showBadge={true} + alerts={alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Logstash nodes')) { + return false; + } + return true; + }} + /> + ); }, }, { diff --git a/x-pack/plugins/monitoring/public/plugin.ts b/x-pack/plugins/monitoring/public/plugin.ts index a9c26ca7103a2..f4f66185346e8 100644 --- a/x-pack/plugins/monitoring/public/plugin.ts +++ b/x-pack/plugins/monitoring/public/plugin.ts @@ -23,6 +23,7 @@ import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; import { MonitoringStartPluginDependencies, MonitoringConfig } from './types'; import { TriggersAndActionsUIPublicPluginSetup } from '../../triggers_actions_ui/public'; import { createCpuUsageAlertType } from './alerts/cpu_usage_alert'; +import { createMissingMonitoringDataAlertType } from './alerts/missing_monitoring_data_alert'; import { createLegacyAlertTypes } from './alerts/legacy_alert'; import { createDiskUsageAlertType } from './alerts/disk_usage_alert'; @@ -72,6 +73,7 @@ export class MonitoringPlugin } plugins.triggers_actions_ui.alertTypeRegistry.register(createCpuUsageAlertType()); + plugins.triggers_actions_ui.alertTypeRegistry.register(createMissingMonitoringDataAlertType()); plugins.triggers_actions_ui.alertTypeRegistry.register(createDiskUsageAlertType()); const legacyAlertTypes = createLegacyAlertTypes(); for (const legacyAlertType of legacyAlertTypes) { diff --git a/x-pack/plugins/monitoring/public/views/apm/instance/index.js b/x-pack/plugins/monitoring/public/views/apm/instance/index.js index 752128782194e..396d4651e0c5e 100644 --- a/x-pack/plugins/monitoring/public/views/apm/instance/index.js +++ b/x-pack/plugins/monitoring/public/views/apm/instance/index.js @@ -18,7 +18,11 @@ import { routeInitProvider } from '../../../lib/route_init'; import template from './index.html'; import { MonitoringViewBaseController } from '../../base_controller'; import { ApmServerInstance } from '../../../components/apm/instance'; -import { CODE_PATH_APM } from '../../../../common/constants'; +import { + CODE_PATH_APM, + ALERT_MISSING_MONITORING_DATA, + APM_SYSTEM_ID, +} from '../../../../common/constants'; uiRoutes.when('/apm/instances/:uuid', { template, @@ -50,6 +54,17 @@ uiRoutes.when('/apm/instances/:uuid', { reactNodeId: 'apmInstanceReact', $scope, $injector, + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: APM_SYSTEM_ID, + }, + ], + }, + }, }); $scope.$watch( @@ -69,6 +84,7 @@ uiRoutes.when('/apm/instances/:uuid', { summary={data.apmSummary || {}} metrics={data.metrics || {}} onBrush={this.onBrush} + alerts={this.alerts} zoomInfo={this.zoomInfo} /> ); diff --git a/x-pack/plugins/monitoring/public/views/apm/instances/index.js b/x-pack/plugins/monitoring/public/views/apm/instances/index.js index 1f5b089ea748e..75f3ded89a595 100644 --- a/x-pack/plugins/monitoring/public/views/apm/instances/index.js +++ b/x-pack/plugins/monitoring/public/views/apm/instances/index.js @@ -13,7 +13,11 @@ import template from './index.html'; import { ApmServerInstances } from '../../../components/apm/instances'; import { MonitoringViewBaseEuiTableController } from '../..'; import { SetupModeRenderer } from '../../../components/renderers'; -import { APM_SYSTEM_ID, CODE_PATH_APM } from '../../../../common/constants'; +import { + APM_SYSTEM_ID, + CODE_PATH_APM, + ALERT_MISSING_MONITORING_DATA, +} from '../../../../common/constants'; uiRoutes.when('/apm/instances', { template, @@ -47,6 +51,17 @@ uiRoutes.when('/apm/instances', { reactNodeId: 'apmInstancesReact', $scope, $injector, + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: APM_SYSTEM_ID, + }, + ], + }, + }, }); this.scope = $scope; @@ -67,6 +82,7 @@ uiRoutes.when('/apm/instances', { {flyoutComponent} <ApmServerInstances setupMode={setupMode} + alerts={this.alerts} apms={{ pagination, sorting, diff --git a/x-pack/plugins/monitoring/public/views/apm/overview/index.js b/x-pack/plugins/monitoring/public/views/apm/overview/index.js index 544fae39ee79d..12821ec432c24 100644 --- a/x-pack/plugins/monitoring/public/views/apm/overview/index.js +++ b/x-pack/plugins/monitoring/public/views/apm/overview/index.js @@ -12,7 +12,11 @@ import { routeInitProvider } from '../../../lib/route_init'; import template from './index.html'; import { MonitoringViewBaseController } from '../../base_controller'; import { ApmOverview } from '../../../components/apm/overview'; -import { CODE_PATH_APM } from '../../../../common/constants'; +import { + CODE_PATH_APM, + ALERT_MISSING_MONITORING_DATA, + APM_SYSTEM_ID, +} from '../../../../common/constants'; uiRoutes.when('/apm', { template, @@ -42,13 +46,29 @@ uiRoutes.when('/apm', { reactNodeId: 'apmOverviewReact', $scope, $injector, + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: APM_SYSTEM_ID, + }, + ], + }, + }, }); $scope.$watch( () => this.data, (data) => { this.renderReact( - <ApmOverview {...data} onBrush={this.onBrush} zoomInfo={this.zoomInfo} /> + <ApmOverview + alerts={this.alerts} + {...data} + onBrush={this.onBrush} + zoomInfo={this.zoomInfo} + /> ); } ); diff --git a/x-pack/plugins/monitoring/public/views/beats/beat/index.js b/x-pack/plugins/monitoring/public/views/beats/beat/index.js index 6cffae2479128..3e9e4e4b0373d 100644 --- a/x-pack/plugins/monitoring/public/views/beats/beat/index.js +++ b/x-pack/plugins/monitoring/public/views/beats/beat/index.js @@ -11,7 +11,11 @@ import { routeInitProvider } from '../../../lib/route_init'; import { MonitoringViewBaseController } from '../../'; import { getPageData } from './get_page_data'; import template from './index.html'; -import { CODE_PATH_BEATS } from '../../../../common/constants'; +import { + CODE_PATH_BEATS, + ALERT_MISSING_MONITORING_DATA, + BEATS_SYSTEM_ID, +} from '../../../../common/constants'; import { Beat } from '../../../components/beats/beat'; uiRoutes.when('/beats/beat/:beatUuid', { @@ -52,6 +56,17 @@ uiRoutes.when('/beats/beat/:beatUuid', { $scope, $injector, reactNodeId: 'monitoringBeatsInstanceApp', + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: BEATS_SYSTEM_ID, + }, + ], + }, + }, }); this.data = pageData; @@ -60,6 +75,7 @@ uiRoutes.when('/beats/beat/:beatUuid', { (data) => { this.renderReact( <Beat + alerts={this.alerts} summary={data.summary} metrics={data.metrics} onBrush={$scope.onBrush} diff --git a/x-pack/plugins/monitoring/public/views/beats/listing/index.js b/x-pack/plugins/monitoring/public/views/beats/listing/index.js index a1b2231901c54..f8f0749d6d30e 100644 --- a/x-pack/plugins/monitoring/public/views/beats/listing/index.js +++ b/x-pack/plugins/monitoring/public/views/beats/listing/index.js @@ -14,7 +14,11 @@ import template from './index.html'; import React, { Fragment } from 'react'; import { Listing } from '../../../components/beats/listing/listing'; import { SetupModeRenderer } from '../../../components/renderers'; -import { CODE_PATH_BEATS, BEATS_SYSTEM_ID } from '../../../../common/constants'; +import { + CODE_PATH_BEATS, + BEATS_SYSTEM_ID, + ALERT_MISSING_MONITORING_DATA, +} from '../../../../common/constants'; uiRoutes.when('/beats/beats', { template, @@ -46,6 +50,17 @@ uiRoutes.when('/beats/beats', { reactNodeId: 'monitoringBeatsInstancesApp', $scope, $injector, + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: BEATS_SYSTEM_ID, + }, + ], + }, + }, }); this.data = $route.current.locals.pageData; @@ -71,6 +86,7 @@ uiRoutes.when('/beats/beats', { <Listing stats={this.data.stats} data={this.data.listing} + alerts={this.alerts} setupMode={setupMode} sorting={this.sorting || sorting} pagination={this.pagination || pagination} diff --git a/x-pack/plugins/monitoring/public/views/beats/overview/index.js b/x-pack/plugins/monitoring/public/views/beats/overview/index.js index 6ecdc2bfadb7d..ef80d7e77fe6e 100644 --- a/x-pack/plugins/monitoring/public/views/beats/overview/index.js +++ b/x-pack/plugins/monitoring/public/views/beats/overview/index.js @@ -11,7 +11,11 @@ import { routeInitProvider } from '../../../lib/route_init'; import { MonitoringViewBaseController } from '../../'; import { getPageData } from './get_page_data'; import template from './index.html'; -import { CODE_PATH_BEATS } from '../../../../common/constants'; +import { + CODE_PATH_BEATS, + ALERT_MISSING_MONITORING_DATA, + BEATS_SYSTEM_ID, +} from '../../../../common/constants'; import { BeatsOverview } from '../../../components/beats/overview'; uiRoutes.when('/beats', { @@ -44,6 +48,17 @@ uiRoutes.when('/beats', { $scope, $injector, reactNodeId: 'monitoringBeatsOverviewApp', + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: BEATS_SYSTEM_ID, + }, + ], + }, + }, }); this.data = $route.current.locals.pageData; @@ -51,7 +66,12 @@ uiRoutes.when('/beats', { () => this.data, (data) => { this.renderReact( - <BeatsOverview {...data} onBrush={$scope.onBrush} zoomInfo={$scope.zoomInfo} /> + <BeatsOverview + {...data} + alerts={this.alerts} + onBrush={$scope.onBrush} + zoomInfo={$scope.zoomInfo} + /> ); } ); diff --git a/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js b/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js index 8c30e4a2c1b07..ff7f29c58b2f6 100644 --- a/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js +++ b/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js @@ -20,6 +20,7 @@ import { MonitoringViewBaseController } from '../../../base_controller'; import { CODE_PATH_ELASTICSEARCH, ALERT_CPU_USAGE, + ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, } from '../../../../../common/constants'; @@ -71,7 +72,7 @@ uiRoutes.when('/elasticsearch/nodes/:node/advanced', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE], + alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE, ALERT_MISSING_MONITORING_DATA], filters: [ { nodeUuid: nodeName, diff --git a/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js b/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js index ed2603e6dfff3..15b9b7b4c0e4a 100644 --- a/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js +++ b/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js @@ -21,6 +21,7 @@ import { MonitoringViewBaseController } from '../../base_controller'; import { CODE_PATH_ELASTICSEARCH, ALERT_CPU_USAGE, + ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, } from '../../../../common/constants'; @@ -55,7 +56,7 @@ uiRoutes.when('/elasticsearch/nodes/:node', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE], + alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE, ALERT_MISSING_MONITORING_DATA], filters: [ { nodeUuid: nodeName, diff --git a/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js b/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js index 66fcac43e4fc5..ef807bf9b377d 100644 --- a/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js +++ b/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js @@ -19,6 +19,7 @@ import { ELASTICSEARCH_SYSTEM_ID, CODE_PATH_ELASTICSEARCH, ALERT_CPU_USAGE, + ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, } from '../../../../common/constants'; @@ -87,7 +88,12 @@ uiRoutes.when('/elasticsearch/nodes', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE], + alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE, ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: ELASTICSEARCH_SYSTEM_ID, + }, + ], }, }, }); diff --git a/x-pack/plugins/monitoring/public/views/kibana/instance/index.js b/x-pack/plugins/monitoring/public/views/kibana/instance/index.js index 20a1a51719415..29852501d1667 100644 --- a/x-pack/plugins/monitoring/public/views/kibana/instance/index.js +++ b/x-pack/plugins/monitoring/public/views/kibana/instance/index.js @@ -27,7 +27,12 @@ import { import { MonitoringTimeseriesContainer } from '../../../components/chart'; import { DetailStatus } from '../../../components/kibana/detail_status'; import { MonitoringViewBaseController } from '../../base_controller'; -import { CODE_PATH_KIBANA, ALERT_KIBANA_VERSION_MISMATCH } from '../../../../common/constants'; +import { + CODE_PATH_KIBANA, + ALERT_KIBANA_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, + KIBANA_SYSTEM_ID, +} from '../../../../common/constants'; import { AlertsCallout } from '../../../alerts/callout'; function getPageData($injector) { @@ -76,7 +81,12 @@ uiRoutes.when('/kibana/instances/:uuid', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_KIBANA_VERSION_MISMATCH], + alertTypeIds: [ALERT_KIBANA_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: KIBANA_SYSTEM_ID, + }, + ], }, }, }); @@ -104,7 +114,15 @@ uiRoutes.when('/kibana/instances/:uuid', { <DetailStatus stats={data.kibanaSummary} /> </EuiPanel> <EuiSpacer size="m" /> - <AlertsCallout alerts={this.alerts} /> + <AlertsCallout + alerts={this.alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Kibana instances')) { + return false; + } + return true; + }} + /> <EuiPageContent> <EuiFlexGrid columns={2} gutterSize="s"> <EuiFlexItem grow={true}> diff --git a/x-pack/plugins/monitoring/public/views/kibana/instances/index.js b/x-pack/plugins/monitoring/public/views/kibana/instances/index.js index 765e112a23305..fcb2ee53471a1 100644 --- a/x-pack/plugins/monitoring/public/views/kibana/instances/index.js +++ b/x-pack/plugins/monitoring/public/views/kibana/instances/index.js @@ -17,6 +17,7 @@ import { KIBANA_SYSTEM_ID, CODE_PATH_KIBANA, ALERT_KIBANA_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, } from '../../../../common/constants'; uiRoutes.when('/kibana/instances', { @@ -46,7 +47,12 @@ uiRoutes.when('/kibana/instances', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_KIBANA_VERSION_MISMATCH], + alertTypeIds: [ALERT_KIBANA_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: KIBANA_SYSTEM_ID, + }, + ], }, }, }); diff --git a/x-pack/plugins/monitoring/public/views/logstash/node/advanced/index.js b/x-pack/plugins/monitoring/public/views/logstash/node/advanced/index.js index 0fc3cc47502cd..591db66b2698c 100644 --- a/x-pack/plugins/monitoring/public/views/logstash/node/advanced/index.js +++ b/x-pack/plugins/monitoring/public/views/logstash/node/advanced/index.js @@ -26,7 +26,13 @@ import { EuiFlexItem, } from '@elastic/eui'; import { MonitoringTimeseriesContainer } from '../../../../components/chart'; -import { CODE_PATH_LOGSTASH } from '../../../../../common/constants'; +import { + CODE_PATH_LOGSTASH, + ALERT_LOGSTASH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, + LOGSTASH_SYSTEM_ID, +} from '../../../../../common/constants'; +import { AlertsCallout } from '../../../../alerts/callout'; function getPageData($injector) { const $http = $injector.get('$http'); @@ -69,6 +75,17 @@ uiRoutes.when('/logstash/node/:uuid/advanced', { reactNodeId: 'monitoringLogstashNodeAdvancedApp', $scope, $injector, + alerts: { + shouldFetch: true, + options: { + alertTypeIds: [ALERT_LOGSTASH_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: LOGSTASH_SYSTEM_ID, + }, + ], + }, + }, telemetryPageViewTitle: 'logstash_node_advanced', }); @@ -112,6 +129,15 @@ uiRoutes.when('/logstash/node/:uuid/advanced', { <DetailStatus stats={data.nodeSummary} /> </EuiPanel> <EuiSpacer size="m" /> + <AlertsCallout + alerts={this.alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Logstash nodes')) { + return false; + } + return true; + }} + /> <EuiPageContent> <EuiFlexGrid columns={2} gutterSize="s"> {metricsToShow.map((metric, index) => ( diff --git a/x-pack/plugins/monitoring/public/views/logstash/node/index.js b/x-pack/plugins/monitoring/public/views/logstash/node/index.js index e2dee77133c72..cccae6913052a 100644 --- a/x-pack/plugins/monitoring/public/views/logstash/node/index.js +++ b/x-pack/plugins/monitoring/public/views/logstash/node/index.js @@ -26,7 +26,12 @@ import { } from '@elastic/eui'; import { MonitoringTimeseriesContainer } from '../../../components/chart'; import { MonitoringViewBaseController } from '../../base_controller'; -import { CODE_PATH_LOGSTASH, ALERT_LOGSTASH_VERSION_MISMATCH } from '../../../../common/constants'; +import { + CODE_PATH_LOGSTASH, + ALERT_LOGSTASH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, + LOGSTASH_SYSTEM_ID, +} from '../../../../common/constants'; import { AlertsCallout } from '../../../alerts/callout'; function getPageData($injector) { @@ -73,7 +78,12 @@ uiRoutes.when('/logstash/node/:uuid', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_LOGSTASH_VERSION_MISMATCH], + alertTypeIds: [ALERT_LOGSTASH_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: LOGSTASH_SYSTEM_ID, + }, + ], }, }, telemetryPageViewTitle: 'logstash_node', @@ -120,7 +130,15 @@ uiRoutes.when('/logstash/node/:uuid', { <DetailStatus stats={data.nodeSummary} /> </EuiPanel> <EuiSpacer size="m" /> - <AlertsCallout alerts={this.alerts} /> + <AlertsCallout + alerts={this.alerts} + nextStepsFilter={(nextStep) => { + if (nextStep.text.includes('Logstash nodes')) { + return false; + } + return true; + }} + /> <EuiPageContent> <EuiFlexGrid columns={2} gutterSize="s"> {metricsToShow.map((metric, index) => ( diff --git a/x-pack/plugins/monitoring/public/views/logstash/nodes/index.js b/x-pack/plugins/monitoring/public/views/logstash/nodes/index.js index 6f2e47eb3f918..20b2f68e2c67e 100644 --- a/x-pack/plugins/monitoring/public/views/logstash/nodes/index.js +++ b/x-pack/plugins/monitoring/public/views/logstash/nodes/index.js @@ -16,6 +16,7 @@ import { CODE_PATH_LOGSTASH, LOGSTASH_SYSTEM_ID, ALERT_LOGSTASH_VERSION_MISMATCH, + ALERT_MISSING_MONITORING_DATA, } from '../../../../common/constants'; uiRoutes.when('/logstash/nodes', { @@ -45,7 +46,12 @@ uiRoutes.when('/logstash/nodes', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_LOGSTASH_VERSION_MISMATCH], + alertTypeIds: [ALERT_LOGSTASH_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA], + filters: [ + { + stackProduct: LOGSTASH_SYSTEM_ID, + }, + ], }, }, }); diff --git a/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts b/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts index 60693eb42a30e..ddc8dcafebd21 100644 --- a/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts @@ -63,6 +63,6 @@ describe('AlertsFactory', () => { it('should get all', () => { const alerts = AlertsFactory.getAll(); - expect(alerts.length).toBe(8); + expect(alerts.length).toBe(9); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts b/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts index 6b1c0d5fffe18..05a92cea5469b 100644 --- a/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts +++ b/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts @@ -6,6 +6,7 @@ import { CpuUsageAlert, + MissingMonitoringDataAlert, DiskUsageAlert, NodesChangedAlert, ClusterHealthAlert, @@ -19,6 +20,7 @@ import { ALERT_CLUSTER_HEALTH, ALERT_LICENSE_EXPIRATION, ALERT_CPU_USAGE, + ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, ALERT_NODES_CHANGED, ALERT_LOGSTASH_VERSION_MISMATCH, @@ -31,6 +33,7 @@ export const BY_TYPE = { [ALERT_CLUSTER_HEALTH]: ClusterHealthAlert, [ALERT_LICENSE_EXPIRATION]: LicenseExpirationAlert, [ALERT_CPU_USAGE]: CpuUsageAlert, + [ALERT_MISSING_MONITORING_DATA]: MissingMonitoringDataAlert, [ALERT_DISK_USAGE]: DiskUsageAlert, [ALERT_NODES_CHANGED]: NodesChangedAlert, [ALERT_LOGSTASH_VERSION_MISMATCH]: LogstashVersionMismatchAlert, diff --git a/x-pack/plugins/monitoring/server/alerts/base_alert.ts b/x-pack/plugins/monitoring/server/alerts/base_alert.ts index aff84710d27ad..61486626040f7 100644 --- a/x-pack/plugins/monitoring/server/alerts/base_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/base_alert.ts @@ -198,6 +198,15 @@ export class BaseAlert { const alertInstance: RawAlertInstance = states.alertInstances[instanceId]; if (alertInstance && this.filterAlertInstance(alertInstance, filters)) { accum[instanceId] = alertInstance; + if (alertInstance.state) { + accum[instanceId].state = { + alertStates: (alertInstance.state as AlertInstanceState).alertStates.filter( + (alertState: AlertState) => { + return this.filterAlertState(alertState, filters); + } + ), + }; + } } return accum; }, @@ -209,6 +218,10 @@ export class BaseAlert { return true; } + protected filterAlertState(alertState: AlertState, filters: CommonAlertFilter[]) { + return true; + } + protected async execute({ services, params, state }: AlertExecutorOptions): Promise<any> { const logger = this.getLogger(this.type); logger.debug( @@ -226,13 +239,7 @@ export class BaseAlert { return await mbSafeQuery(async () => _callCluster(endpoint, clientParams, options)); }; const availableCcs = this.config.ui.ccs.enabled ? await fetchAvailableCcs(callCluster) : []; - // Support CCS use cases by querying to find available remote clusters - // and then adding those to the index pattern we are searching against - let esIndexPattern = appendMetricbeatIndex(this.config, INDEX_PATTERN_ELASTICSEARCH); - if (availableCcs) { - esIndexPattern = getCcsIndexPattern(esIndexPattern, availableCcs); - } - const clusters = await fetchClusters(callCluster, esIndexPattern); + const clusters = await this.fetchClusters(callCluster, availableCcs, params); const uiSettings = (await this.getUiSettingsService()).asScopedToClient( services.savedObjectsClient ); @@ -241,6 +248,26 @@ export class BaseAlert { return await this.processData(data, clusters, services, logger, state); } + protected async fetchClusters( + callCluster: any, + availableCcs: string[] | undefined = undefined, + params: CommonAlertParams + ) { + let ccs; + if (!availableCcs) { + ccs = this.config.ui.ccs.enabled ? await fetchAvailableCcs(callCluster) : undefined; + } else { + ccs = availableCcs; + } + // Support CCS use cases by querying to find available remote clusters + // and then adding those to the index pattern we are searching against + let esIndexPattern = appendMetricbeatIndex(this.config, INDEX_PATTERN_ELASTICSEARCH); + if (ccs) { + esIndexPattern = getCcsIndexPattern(esIndexPattern, ccs); + } + return await fetchClusters(callCluster, esIndexPattern); + } + protected async fetchData( params: CommonAlertParams, callCluster: any, diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts index 4228354f52748..ca9674c57216b 100644 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts @@ -26,7 +26,7 @@ import { RawAlertInstance } from '../../../alerts/common'; import { parseDuration } from '../../../alerts/common/parse_duration'; import { CommonAlertFilter, - CommonAlertCpuUsageFilter, + CommonAlertNodeUuidFilter, CommonAlertParams, CommonAlertParamDetail, } from '../../common/types'; @@ -129,7 +129,7 @@ export class CpuUsageAlert extends BaseAlert { const alertInstanceState = (alertInstance.state as unknown) as AlertInstanceState; if (filters && filters.length) { for (const _filter of filters) { - const filter = _filter as CommonAlertCpuUsageFilter; + const filter = _filter as CommonAlertNodeUuidFilter; if (filter && filter.nodeUuid) { let nodeExistsInStates = false; for (const state of alertInstanceState.alertStates) { diff --git a/x-pack/plugins/monitoring/server/alerts/index.ts b/x-pack/plugins/monitoring/server/alerts/index.ts index 8fdac65514477..41f6daa38d1dc 100644 --- a/x-pack/plugins/monitoring/server/alerts/index.ts +++ b/x-pack/plugins/monitoring/server/alerts/index.ts @@ -6,6 +6,7 @@ export { BaseAlert } from './base_alert'; export { CpuUsageAlert } from './cpu_usage_alert'; +export { MissingMonitoringDataAlert } from './missing_monitoring_data_alert'; export { DiskUsageAlert } from './disk_usage_alert'; export { ClusterHealthAlert } from './cluster_health_alert'; export { LicenseExpirationAlert } from './license_expiration_alert'; diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts new file mode 100644 index 0000000000000..4c06d9718c455 --- /dev/null +++ b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts @@ -0,0 +1,459 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { MissingMonitoringDataAlert } from './missing_monitoring_data_alert'; +import { ALERT_MISSING_MONITORING_DATA } from '../../common/constants'; +import { fetchMissingMonitoringData } from '../lib/alerts/fetch_missing_monitoring_data'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_missing_monitoring_data', () => ({ + fetchMissingMonitoringData: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +describe('MissingMonitoringDataAlert', () => { + it('should have defaults', () => { + const alert = new MissingMonitoringDataAlert(); + expect(alert.type).toBe(ALERT_MISSING_MONITORING_DATA); + expect(alert.label).toBe('Missing monitoring data'); + expect(alert.defaultThrottle).toBe('1d'); + // @ts-ignore + expect(alert.defaultParams).toStrictEqual({ limit: '1d', duration: '5m' }); + // @ts-ignore + expect(alert.actionVariables).toStrictEqual([ + { name: 'stackProducts', description: 'The stack products missing monitoring data.' }, + { name: 'count', description: 'The number of stack products missing monitoring data.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const stackProduct = 'elasticsearch'; + const stackProductUuid = 'esNode1'; + const stackProductName = 'esName1'; + const gapDuration = 3000001; + const missingData = [ + { + stackProduct, + stackProductUuid, + stackProductName, + clusterUuid, + gapDuration, + }, + { + stackProduct: 'kibana', + stackProductUuid: 'kibanaUuid1', + stackProductName: 'kibanaInstance1', + clusterUuid, + gapDuration: gapDuration + 10, + }, + ]; + const getUiSettingsService = () => ({ + asScopedToClient: jest.fn(), + }); + const getLogger = () => ({ + debug: jest.fn(), + }); + const monitoringCluster = null; + const config = { + ui: { + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + metricbeat: { index: 'metricbeat-*' }, + }, + }; + const kibanaUrl = 'http://localhost:5601'; + + const replaceState = jest.fn(); + const scheduleActions = jest.fn(); + const getState = jest.fn(); + const executorOptions = { + services: { + callCluster: jest.fn(), + alertInstanceFactory: jest.fn().mockImplementation(() => { + return { + replaceState, + scheduleActions, + getState, + }; + }), + }, + state: {}, + }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return missingData; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + replaceState.mockReset(); + scheduleActions.mockReset(); + getState.mockReset(); + }); + + it('should fire actions', async () => { + const alert = new MissingMonitoringDataAlert(); + alert.initializeAlertType( + getUiSettingsService as any, + monitoringCluster as any, + getLogger as any, + config as any, + kibanaUrl, + false + ); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.defaultParams, + } as any); + const count = 2; + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + ccs: undefined, + cluster: { clusterUuid, clusterName }, + gapDuration, + stackProduct, + stackProductName, + stackProductUuid, + ui: { + isFiring: true, + message: { + text: + 'For the past an hour, we have not detected any monitoring data from the Elasticsearch node: esName1, starting at #absolute', + nextSteps: [ + { + text: '#start_linkView all Elasticsearch nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes', + }, + ], + }, + { + text: 'Verify monitoring settings on the node', + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + ], + }, + severity: 'danger', + resolvedMS: 0, + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + { + ccs: undefined, + cluster: { clusterUuid, clusterName }, + gapDuration: gapDuration + 10, + stackProduct: 'kibana', + stackProductName: 'kibanaInstance1', + stackProductUuid: 'kibanaUuid1', + ui: { + isFiring: true, + message: { + text: + 'For the past an hour, we have not detected any monitoring data from the Kibana instance: kibanaInstance1, starting at #absolute', + nextSteps: [ + { + text: '#start_linkView all Kibana instances#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'kibana/instances', + }, + ], + }, + { + text: 'Verify monitoring settings on the instance', + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + ], + }, + severity: 'danger', + resolvedMS: 0, + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }); + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. [View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123))`, + internalShortMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, + action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123))`, + actionPlain: + 'Verify these stack products are up and running, then double check the monitoring settings.', + clusterName, + count, + stackProducts: 'Elasticsearch node: esName1, Kibana instance: kibanaInstance1', + state: 'firing', + }); + }); + + it('should not fire actions if under threshold', async () => { + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return [ + { + ...missingData[0], + gapDuration: 1, + }, + ]; + }); + const alert = new MissingMonitoringDataAlert(); + alert.initializeAlertType( + getUiSettingsService as any, + monitoringCluster as any, + getLogger as any, + config as any, + kibanaUrl, + false + ); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + cluster: { + clusterUuid, + clusterName, + }, + gapDuration: 1, + stackProduct, + stackProductName, + stackProductUuid, + ui: { + isFiring: false, + lastCheckedMS: 0, + message: null, + resolvedMS: 0, + severity: 'danger', + triggeredMS: 0, + }, + }, + ], + }); + expect(scheduleActions).not.toHaveBeenCalled(); + }); + + it('should resolve with a resolved message', async () => { + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return [ + { + ...missingData[0], + gapDuration: 1, + }, + ]; + }); + (getState as jest.Mock).mockImplementation(() => { + return { + alertStates: [ + { + cluster: { + clusterUuid, + clusterName, + }, + ccs: null, + gapDuration: 1, + stackProduct, + stackProductName, + stackProductUuid, + ui: { + isFiring: true, + message: null, + severity: 'danger', + resolvedMS: 0, + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }; + }); + const alert = new MissingMonitoringDataAlert(); + alert.initializeAlertType( + getUiSettingsService as any, + monitoringCluster as any, + getLogger as any, + config as any, + kibanaUrl, + false + ); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.defaultParams, + } as any); + const count = 1; + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + cluster: { clusterUuid, clusterName }, + ccs: null, + gapDuration: 1, + stackProduct, + stackProductName, + stackProductUuid, + ui: { + isFiring: false, + message: { + text: + 'We are now seeing monitoring data for the Elasticsearch node: esName1, as of #resolved', + tokens: [ + { + startToken: '#resolved', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + ], + }, + severity: 'danger', + resolvedMS: 1, + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }); + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `We are now seeing monitoring data for 1 stack product(s) in cluster testCluster.`, + internalShortMessage: `We are now seeing monitoring data for 1 stack product(s) in cluster: testCluster.`, + clusterName, + count, + stackProducts: 'Elasticsearch node: esName1', + state: 'resolved', + }); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return [ + { + ...missingData[0], + ccs, + }, + ]; + }); + const alert = new MissingMonitoringDataAlert(); + alert.initializeAlertType( + getUiSettingsService as any, + monitoringCluster as any, + getLogger as any, + config as any, + kibanaUrl, + false + ); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.defaultParams, + } as any); + const count = 1; + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `We have not detected any monitoring data for 1 stack product(s) in cluster: testCluster. [View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, + internalShortMessage: `We have not detected any monitoring data for 1 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, + action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: + 'Verify these stack products are up and running, then double check the monitoring settings.', + clusterName, + count, + stackProducts: 'Elasticsearch node: esName1', + state: 'firing', + }); + }); + + it('should fire with different messaging for cloud', async () => { + const alert = new MissingMonitoringDataAlert(); + alert.initializeAlertType( + getUiSettingsService as any, + monitoringCluster as any, + getLogger as any, + config as any, + kibanaUrl, + true + ); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.defaultParams, + } as any); + const count = 2; + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, + internalShortMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, + action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123))`, + actionPlain: + 'Verify these stack products are up and running, then double check the monitoring settings.', + clusterName, + count, + stackProducts: 'Elasticsearch node: esName1, Kibana instance: kibanaInstance1', + state: 'firing', + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts new file mode 100644 index 0000000000000..6017314f332e6 --- /dev/null +++ b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts @@ -0,0 +1,504 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { IUiSettingsClient, Logger } from 'kibana/server'; +import { i18n } from '@kbn/i18n'; +import moment from 'moment'; +import { BaseAlert } from './base_alert'; +import { + AlertData, + AlertCluster, + AlertState, + AlertMessage, + AlertMissingDataState, + AlertMissingData, + AlertMessageTimeToken, + AlertInstanceState, +} from './types'; +import { AlertInstance, AlertServices } from '../../../alerts/server'; +import { + INDEX_PATTERN, + ALERT_MISSING_MONITORING_DATA, + INDEX_PATTERN_ELASTICSEARCH, +} from '../../common/constants'; +import { getCcsIndexPattern } from '../lib/alerts/get_ccs_index_pattern'; +import { AlertMessageTokenType, AlertSeverity, AlertParamType } from '../../common/enums'; +import { RawAlertInstance } from '../../../alerts/common'; +import { parseDuration } from '../../../alerts/common/parse_duration'; +import { + CommonAlertFilter, + CommonAlertParams, + CommonAlertParamDetail, + CommonAlertStackProductFilter, + CommonAlertNodeUuidFilter, +} from '../../common/types'; +import { appendMetricbeatIndex } from '../lib/alerts/append_mb_index'; +import { fetchMissingMonitoringData } from '../lib/alerts/fetch_missing_monitoring_data'; +import { getTypeLabelForStackProduct } from '../lib/alerts/get_type_label_for_stack_product'; +import { getListingLinkForStackProduct } from '../lib/alerts/get_listing_link_for_stack_product'; +import { getStackProductLabel } from '../lib/alerts/get_stack_product_label'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { fetchAvailableCcs } from '../lib/alerts/fetch_available_ccs'; +import { AlertingDefaults, createLink } from './alerts_common'; + +const RESOLVED = i18n.translate('xpack.monitoring.alerts.missingData.resolved', { + defaultMessage: 'resolved', +}); +const FIRING = i18n.translate('xpack.monitoring.alerts.missingData.firing', { + defaultMessage: 'firing', +}); + +const DEFAULT_DURATION = '5m'; +const DEFAULT_LIMIT = '1d'; + +// Go a bit farther back because we need to detect the difference between seeing the monitoring data versus just not looking far enough back +const LIMIT_BUFFER = 3 * 60 * 1000; + +interface MissingDataParams { + duration: string; + limit: string; +} + +export class MissingMonitoringDataAlert extends BaseAlert { + public static paramDetails = { + duration: { + label: i18n.translate('xpack.monitoring.alerts.missingData.paramDetails.duration.label', { + defaultMessage: `Notify if monitoring data is missing for`, + }), + type: AlertParamType.Duration, + } as CommonAlertParamDetail, + limit: { + label: i18n.translate('xpack.monitoring.alerts.missingData.paramDetails.limit.label', { + defaultMessage: `Look this far back in time for monitoring data`, + }), + type: AlertParamType.Duration, + } as CommonAlertParamDetail, + }; + + public type = ALERT_MISSING_MONITORING_DATA; + public label = i18n.translate('xpack.monitoring.alerts.missingData.label', { + defaultMessage: 'Missing monitoring data', + }); + + protected defaultParams: MissingDataParams = { + duration: DEFAULT_DURATION, + limit: DEFAULT_LIMIT, + }; + + protected actionVariables = [ + { + name: 'stackProducts', + description: i18n.translate( + 'xpack.monitoring.alerts.missingData.actionVariables.stackProducts', + { + defaultMessage: 'The stack products missing monitoring data.', + } + ), + }, + { + name: 'count', + description: i18n.translate('xpack.monitoring.alerts.missingData.actionVariables.count', { + defaultMessage: 'The number of stack products missing monitoring data.', + }), + }, + ...Object.values(AlertingDefaults.ALERT_TYPE.context), + ]; + + protected async fetchClusters( + callCluster: any, + availableCcs: string[] | undefined = undefined, + params: CommonAlertParams + ) { + const limit = parseDuration(((params as unknown) as MissingDataParams).limit); + let ccs; + if (!availableCcs) { + ccs = this.config.ui.ccs.enabled ? await fetchAvailableCcs(callCluster) : undefined; + } else { + ccs = availableCcs; + } + // Support CCS use cases by querying to find available remote clusters + // and then adding those to the index pattern we are searching against + let esIndexPattern = appendMetricbeatIndex(this.config, INDEX_PATTERN_ELASTICSEARCH); + if (ccs) { + esIndexPattern = getCcsIndexPattern(esIndexPattern, ccs); + } + return await fetchClusters(callCluster, esIndexPattern, { + timestamp: { + format: 'epoch_millis', + gte: limit - LIMIT_BUFFER, + }, + }); + } + + protected async fetchData( + params: CommonAlertParams, + callCluster: any, + clusters: AlertCluster[], + uiSettings: IUiSettingsClient, + availableCcs: string[] + ): Promise<AlertData[]> { + let indexPattern = appendMetricbeatIndex(this.config, INDEX_PATTERN); + if (availableCcs) { + indexPattern = getCcsIndexPattern(indexPattern, availableCcs); + } + const duration = parseDuration(((params as unknown) as MissingDataParams).duration); + const limit = parseDuration(((params as unknown) as MissingDataParams).limit); + const now = +new Date(); + const missingData = await fetchMissingMonitoringData( + callCluster, + clusters, + indexPattern, + this.config.ui.max_bucket_size, + now, + now - limit - LIMIT_BUFFER + ); + return missingData.map((missing) => { + return { + instanceKey: `${missing.clusterUuid}:${missing.stackProduct}:${missing.stackProductUuid}`, + clusterUuid: missing.clusterUuid, + shouldFire: missing.gapDuration > duration, + severity: AlertSeverity.Danger, + meta: { missing, limit }, + ccs: missing.ccs, + }; + }); + } + + protected filterAlertInstance(alertInstance: RawAlertInstance, filters: CommonAlertFilter[]) { + const alertInstanceState = (alertInstance.state as unknown) as AlertInstanceState; + if (filters && filters.length) { + for (const filter of filters) { + const stackProductFilter = filter as CommonAlertStackProductFilter; + if (stackProductFilter && stackProductFilter.stackProduct) { + let existsInState = false; + for (const state of alertInstanceState.alertStates) { + if ((state as AlertMissingDataState).stackProduct === stackProductFilter.stackProduct) { + existsInState = true; + break; + } + } + if (!existsInState) { + return false; + } + } + } + } + return true; + } + + protected filterAlertState(alertState: AlertState, filters: CommonAlertFilter[]) { + const state = alertState as AlertMissingDataState; + if (filters && filters.length) { + for (const filter of filters) { + const stackProductFilter = filter as CommonAlertStackProductFilter; + if (stackProductFilter && stackProductFilter.stackProduct) { + if (state.stackProduct !== stackProductFilter.stackProduct) { + return false; + } + } + + const nodeUuidFilter = filter as CommonAlertNodeUuidFilter; + if (nodeUuidFilter && nodeUuidFilter.nodeUuid) { + if (state.stackProductUuid !== nodeUuidFilter.nodeUuid) { + return false; + } + } + } + } + return true; + } + + protected getDefaultAlertState(cluster: AlertCluster, item: AlertData): AlertState { + const base = super.getDefaultAlertState(cluster, item); + return { + ...base, + ui: { + ...base.ui, + severity: AlertSeverity.Danger, + }, + }; + } + + protected getUiMessage(alertState: AlertState, item: AlertData): AlertMessage { + const { missing, limit } = item.meta as { missing: AlertMissingData; limit: number }; + if (!alertState.ui.isFiring) { + if (missing.gapDuration > limit) { + return { + text: i18n.translate('xpack.monitoring.alerts.missingData.ui.notQuiteResolvedMessage', { + defaultMessage: `We are still not seeing monitoring data for the {stackProduct} {type}: {stackProductName} and will stop trying. To change this, configure the alert to look farther back for data.`, + values: { + stackProduct: getStackProductLabel(missing.stackProduct), + type: getTypeLabelForStackProduct(missing.stackProduct, false), + stackProductName: missing.stackProductName, + }, + }), + }; + } + return { + text: i18n.translate('xpack.monitoring.alerts.missingData.ui.resolvedMessage', { + defaultMessage: `We are now seeing monitoring data for the {stackProduct} {type}: {stackProductName}, as of #resolved`, + values: { + stackProduct: getStackProductLabel(missing.stackProduct), + type: getTypeLabelForStackProduct(missing.stackProduct, false), + stackProductName: missing.stackProductName, + }, + }), + tokens: [ + { + startToken: '#resolved', + type: AlertMessageTokenType.Time, + isAbsolute: true, + isRelative: false, + timestamp: alertState.ui.resolvedMS, + } as AlertMessageTimeToken, + ], + }; + } + return { + text: i18n.translate('xpack.monitoring.alerts.missingData.ui.firingMessage', { + defaultMessage: `For the past {gapDuration}, we have not detected any monitoring data from the {stackProduct} {type}: {stackProductName}, starting at #absolute`, + values: { + gapDuration: moment.duration(missing.gapDuration, 'milliseconds').humanize(), + stackProduct: getStackProductLabel(missing.stackProduct), + type: getTypeLabelForStackProduct(missing.stackProduct, false), + stackProductName: missing.stackProductName, + }, + }), + nextSteps: [ + createLink( + i18n.translate('xpack.monitoring.alerts.missingData.ui.nextSteps.viewAll', { + defaultMessage: `#start_linkView all {stackProduct} {type}#end_link`, + values: { + type: getTypeLabelForStackProduct(missing.stackProduct), + stackProduct: getStackProductLabel(missing.stackProduct), + }, + }), + getListingLinkForStackProduct(missing.stackProduct), + AlertMessageTokenType.Link + ), + { + text: i18n.translate('xpack.monitoring.alerts.missingData.ui.nextSteps.verifySettings', { + defaultMessage: `Verify monitoring settings on the {type}`, + values: { + type: getTypeLabelForStackProduct(missing.stackProduct, false), + }, + }), + }, + ], + tokens: [ + { + startToken: '#absolute', + type: AlertMessageTokenType.Time, + isAbsolute: true, + isRelative: false, + timestamp: alertState.ui.triggeredMS, + } as AlertMessageTimeToken, + ], + }; + } + + protected executeActions( + instance: AlertInstance, + instanceState: AlertInstanceState, + item: AlertData | null, + cluster: AlertCluster + ) { + if (instanceState.alertStates.length === 0) { + return; + } + + const ccs = instanceState.alertStates.reduce((accum: string, state): string => { + if (state.ccs) { + return state.ccs; + } + return accum; + }, ''); + + const firingCount = instanceState.alertStates.filter((alertState) => alertState.ui.isFiring) + .length; + const firingStackProducts = instanceState.alertStates + .filter((_state) => (_state as AlertMissingDataState).ui.isFiring) + .map((_state) => { + const state = _state as AlertMissingDataState; + return `${getStackProductLabel(state.stackProduct)} ${getTypeLabelForStackProduct( + state.stackProduct, + false + )}: ${state.stackProductName}`; + }) + .join(', '); + if (firingCount > 0) { + const shortActionText = i18n.translate('xpack.monitoring.alerts.missingData.shortAction', { + defaultMessage: + 'Verify these stack products are up and running, then double check the monitoring settings.', + }); + const fullActionText = i18n.translate('xpack.monitoring.alerts.missingData.fullAction', { + defaultMessage: 'View what monitoring data we do have for these stack products.', + }); + const globalState = [`cluster_uuid:${cluster.clusterUuid}`]; + if (ccs) { + globalState.push(`ccs:${ccs}`); + } + const url = `${this.kibanaUrl}/app/monitoring#overview?_g=(${globalState.join(',')})`; + const action = `[${fullActionText}](${url})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.missingData.firing.internalShortMessage', + { + defaultMessage: `We have not detected any monitoring data for {count} stack product(s) in cluster: {clusterName}. {shortActionText}`, + values: { + count: firingCount, + clusterName: cluster.clusterName, + shortActionText, + }, + } + ); + const internalFullMessage = i18n.translate( + 'xpack.monitoring.alerts.missingData.firing.internalFullMessage', + { + defaultMessage: `We have not detected any monitoring data for {count} stack product(s) in cluster: {clusterName}. {action}`, + values: { + count: firingCount, + clusterName: cluster.clusterName, + action, + }, + } + ); + instance.scheduleActions('default', { + internalShortMessage, + internalFullMessage: this.isCloud ? internalShortMessage : internalFullMessage, + state: FIRING, + stackProducts: firingStackProducts, + count: firingCount, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }); + } else { + const resolvedCount = instanceState.alertStates.filter( + (alertState) => !alertState.ui.isFiring + ).length; + const resolvedStackProducts = instanceState.alertStates + .filter((_state) => !(_state as AlertMissingDataState).ui.isFiring) + .map((_state) => { + const state = _state as AlertMissingDataState; + return `${getStackProductLabel(state.stackProduct)} ${getTypeLabelForStackProduct( + state.stackProduct, + false + )}: ${state.stackProductName}`; + }) + .join(','); + if (resolvedCount > 0) { + instance.scheduleActions('default', { + internalShortMessage: i18n.translate( + 'xpack.monitoring.alerts.missingData.resolved.internalShortMessage', + { + defaultMessage: `We are now seeing monitoring data for {count} stack product(s) in cluster: {clusterName}.`, + values: { + count: resolvedCount, + clusterName: cluster.clusterName, + }, + } + ), + internalFullMessage: i18n.translate( + 'xpack.monitoring.alerts.missingData.resolved.internalFullMessage', + { + defaultMessage: `We are now seeing monitoring data for {count} stack product(s) in cluster {clusterName}.`, + values: { + count: resolvedCount, + clusterName: cluster.clusterName, + }, + } + ), + state: RESOLVED, + stackProducts: resolvedStackProducts, + count: resolvedCount, + clusterName: cluster.clusterName, + }); + } + } + } + + protected async processData( + data: AlertData[], + clusters: AlertCluster[], + services: AlertServices, + logger: Logger + ) { + for (const cluster of clusters) { + const stackProducts = data.filter((_item) => _item.clusterUuid === cluster.clusterUuid); + if (stackProducts.length === 0) { + continue; + } + + const firingInstances = stackProducts.reduce((list: string[], stackProduct) => { + const { missing } = stackProduct.meta as { missing: AlertMissingData; limit: number }; + if (stackProduct.shouldFire) { + list.push(`${missing.stackProduct}:${missing.stackProductUuid}`); + } + return list; + }, [] as string[]); + firingInstances.sort(); // It doesn't matter how we sort, but keep the order consistent + const instanceId = `${this.type}:${cluster.clusterUuid}:${firingInstances.join(',')}`; + const instance = services.alertInstanceFactory(instanceId); + const instanceState = (instance.getState() as unknown) as AlertInstanceState; + const alertInstanceState: AlertInstanceState = { + alertStates: instanceState?.alertStates || [], + }; + let shouldExecuteActions = false; + for (const stackProduct of stackProducts) { + const { missing } = stackProduct.meta as { missing: AlertMissingData; limit: number }; + let state: AlertMissingDataState; + const indexInState = alertInstanceState.alertStates.findIndex((alertState) => { + const _alertState = alertState as AlertMissingDataState; + return ( + _alertState.cluster.clusterUuid === cluster.clusterUuid && + _alertState.stackProduct === missing.stackProduct && + _alertState.stackProductUuid === missing.stackProductUuid + ); + }); + if (indexInState > -1) { + state = alertInstanceState.alertStates[indexInState] as AlertMissingDataState; + } else { + state = this.getDefaultAlertState(cluster, stackProduct) as AlertMissingDataState; + } + + state.stackProduct = missing.stackProduct; + state.stackProductUuid = missing.stackProductUuid; + state.stackProductName = missing.stackProductName; + state.gapDuration = missing.gapDuration; + + if (stackProduct.shouldFire) { + if (!state.ui.isFiring) { + state.ui.triggeredMS = new Date().valueOf(); + } + state.ui.isFiring = true; + state.ui.message = this.getUiMessage(state, stackProduct); + state.ui.severity = stackProduct.severity; + state.ui.resolvedMS = 0; + shouldExecuteActions = true; + } else if (!stackProduct.shouldFire && state.ui.isFiring) { + state.ui.isFiring = false; + state.ui.resolvedMS = new Date().valueOf(); + state.ui.message = this.getUiMessage(state, stackProduct); + shouldExecuteActions = true; + } + + if (indexInState === -1) { + alertInstanceState.alertStates.push(state); + } else { + alertInstanceState.alertStates = [ + ...alertInstanceState.alertStates.slice(0, indexInState), + state, + ...alertInstanceState.alertStates.slice(indexInState + 1), + ]; + } + } + + instance.replaceState(alertInstanceState); + if (shouldExecuteActions) { + this.executeActions(instance, alertInstanceState, null, cluster); + } + } + } +} diff --git a/x-pack/plugins/monitoring/server/alerts/types.d.ts b/x-pack/plugins/monitoring/server/alerts/types.d.ts index b685dcaed790f..4b78bca9f47ca 100644 --- a/x-pack/plugins/monitoring/server/alerts/types.d.ts +++ b/x-pack/plugins/monitoring/server/alerts/types.d.ts @@ -28,6 +28,13 @@ export interface AlertCpuUsageState extends AlertState { nodeName: string; } +export interface AlertMissingDataState extends AlertState { + stackProduct: string; + stackProductUuid: string; + stackProductName: string; + gapDuration: number; +} + export interface AlertDiskUsageState extends AlertState { diskUsage: number; nodeId: string; @@ -93,6 +100,15 @@ export interface AlertDiskUsageNodeStats { ccs?: string; } +export interface AlertMissingData { + stackProduct: string; + stackProductUuid: string; + stackProductName: string; + clusterUuid: string; + gapDuration: number; + ccs?: string; +} + export interface AlertData { instanceKey: string; clusterUuid: string; diff --git a/x-pack/plugins/monitoring/server/lib/alerts/fetch_clusters.ts b/x-pack/plugins/monitoring/server/lib/alerts/fetch_clusters.ts index 48ad31d20a395..d474338bce922 100644 --- a/x-pack/plugins/monitoring/server/lib/alerts/fetch_clusters.ts +++ b/x-pack/plugins/monitoring/server/lib/alerts/fetch_clusters.ts @@ -6,7 +6,18 @@ import { get } from 'lodash'; import { AlertCluster } from '../../alerts/types'; -export async function fetchClusters(callCluster: any, index: string): Promise<AlertCluster[]> { +interface RangeFilter { + [field: string]: { + format?: string; + gte: string | number; + }; +} + +export async function fetchClusters( + callCluster: any, + index: string, + rangeFilter: RangeFilter = { timestamp: { gte: 'now-2m' } } +): Promise<AlertCluster[]> { const params = { index, filterPath: [ @@ -25,11 +36,7 @@ export async function fetchClusters(callCluster: any, index: string): Promise<Al }, }, { - range: { - timestamp: { - gte: 'now-2m', - }, - }, + range: rangeFilter, }, ], }, diff --git a/x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.test.ts b/x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.test.ts new file mode 100644 index 0000000000000..b09f5a88dba9c --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.test.ts @@ -0,0 +1,249 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { fetchMissingMonitoringData } from './fetch_missing_monitoring_data'; + +function getResponse( + index: string, + products: Array<{ + uuid: string; + timestamp: number; + nameSource: any; + }> +) { + return { + buckets: products.map((product) => { + return { + key: product.uuid, + most_recent: { + value: product.timestamp, + }, + document: { + hits: { + hits: [ + { + _index: index, + _source: product.nameSource, + }, + ], + }, + }, + }; + }), + }; +} + +describe('fetchMissingMonitoringData', () => { + let callCluster = jest.fn(); + const index = '.monitoring-*'; + const startMs = 100; + const size = 10; + + it('fetch as expected', async () => { + const now = 10; + const clusters = [ + { + clusterUuid: 'clusterUuid1', + clusterName: 'clusterName1', + }, + ]; + callCluster = jest.fn().mockImplementation((...args) => { + return { + aggregations: { + clusters: { + buckets: clusters.map((cluster) => ({ + key: cluster.clusterUuid, + es_uuids: getResponse('.monitoring-es-*', [ + { + uuid: 'nodeUuid1', + nameSource: { + source_node: { + name: 'nodeName1', + }, + }, + timestamp: 9, + }, + { + uuid: 'nodeUuid2', + nameSource: { + source_node: { + name: 'nodeName2', + }, + }, + timestamp: 2, + }, + ]), + kibana_uuids: getResponse('.monitoring-kibana-*', [ + { + uuid: 'kibanaUuid1', + nameSource: { + kibana_stats: { + kibana: { + name: 'kibanaName1', + }, + }, + }, + timestamp: 4, + }, + ]), + logstash_uuids: getResponse('.monitoring-logstash-*', [ + { + uuid: 'logstashUuid1', + nameSource: { + logstash_stats: { + logstash: { + host: 'logstashName1', + }, + }, + }, + timestamp: 2, + }, + ]), + beats: { + beats_uuids: getResponse('.monitoring-beats-*', [ + { + uuid: 'beatUuid1', + nameSource: { + beats_stats: { + beat: { + name: 'beatName1', + }, + }, + }, + timestamp: 0, + }, + ]), + }, + apms: { + apm_uuids: getResponse('.monitoring-beats-*', [ + { + uuid: 'apmUuid1', + nameSource: { + beats_stats: { + beat: { + name: 'apmName1', + type: 'apm-server', + }, + }, + }, + timestamp: 1, + }, + ]), + }, + })), + }, + }, + }; + }); + const result = await fetchMissingMonitoringData( + callCluster, + clusters, + index, + size, + now, + startMs + ); + expect(result).toEqual([ + { + stackProduct: 'elasticsearch', + stackProductUuid: 'nodeUuid1', + stackProductName: 'nodeName1', + clusterUuid: 'clusterUuid1', + gapDuration: 1, + ccs: null, + }, + { + stackProduct: 'elasticsearch', + stackProductUuid: 'nodeUuid2', + stackProductName: 'nodeName2', + clusterUuid: 'clusterUuid1', + gapDuration: 8, + ccs: null, + }, + { + stackProduct: 'kibana', + stackProductUuid: 'kibanaUuid1', + stackProductName: 'kibanaName1', + clusterUuid: 'clusterUuid1', + gapDuration: 6, + ccs: null, + }, + { + stackProduct: 'logstash', + stackProductUuid: 'logstashUuid1', + stackProductName: 'logstashName1', + clusterUuid: 'clusterUuid1', + gapDuration: 8, + ccs: null, + }, + { + stackProduct: 'beats', + stackProductUuid: 'beatUuid1', + stackProductName: 'beatName1', + clusterUuid: 'clusterUuid1', + gapDuration: 10, + ccs: null, + }, + { + stackProduct: 'apm', + stackProductUuid: 'apmUuid1', + stackProductName: 'apmName1', + clusterUuid: 'clusterUuid1', + gapDuration: 9, + ccs: null, + }, + ]); + }); + + it('should handle ccs', async () => { + const now = 10; + const clusters = [ + { + clusterUuid: 'clusterUuid1', + clusterName: 'clusterName1', + }, + ]; + callCluster = jest.fn().mockImplementation((...args) => { + return { + aggregations: { + clusters: { + buckets: clusters.map((cluster) => ({ + key: cluster.clusterUuid, + es_uuids: getResponse('Monitoring:.monitoring-es-*', [ + { + uuid: 'nodeUuid1', + nameSource: { + source_node: { + name: 'nodeName1', + }, + }, + timestamp: 9, + }, + ]), + })), + }, + }, + }; + }); + const result = await fetchMissingMonitoringData( + callCluster, + clusters, + index, + size, + now, + startMs + ); + expect(result).toEqual([ + { + stackProduct: 'elasticsearch', + stackProductUuid: 'nodeUuid1', + stackProductName: 'nodeName1', + clusterUuid: 'clusterUuid1', + gapDuration: 1, + ccs: 'Monitoring', + }, + ]); + }); +}); diff --git a/x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.ts b/x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.ts new file mode 100644 index 0000000000000..91fc05137a8c1 --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/alerts/fetch_missing_monitoring_data.ts @@ -0,0 +1,275 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { get } from 'lodash'; +import { AlertCluster, AlertMissingData } from '../../alerts/types'; +import { + KIBANA_SYSTEM_ID, + BEATS_SYSTEM_ID, + APM_SYSTEM_ID, + LOGSTASH_SYSTEM_ID, + ELASTICSEARCH_SYSTEM_ID, +} from '../../../common/constants'; + +interface ClusterBucketESResponse { + key: string; + kibana_uuids?: UuidResponse; + logstash_uuids?: UuidResponse; + es_uuids?: UuidResponse; + beats?: { + beats_uuids: UuidResponse; + }; + apms?: { + apm_uuids: UuidResponse; + }; +} + +interface UuidResponse { + buckets: UuidBucketESResponse[]; +} + +interface UuidBucketESResponse { + key: string; + most_recent: { + value: number; + }; + document: { + hits: { + hits: TopHitESResponse[]; + }; + }; +} + +interface TopHitESResponse { + _index: string; + _source: { + source_node?: { + name: string; + }; + kibana_stats?: { + kibana: { + name: string; + }; + }; + logstash_stats?: { + logstash: { + host: string; + }; + }; + beats_stats?: { + beat: { + name: string; + type: string; + }; + }; + }; +} + +function getStackProductFromIndex(index: string, beatType: string) { + if (index.includes('-kibana-')) { + return KIBANA_SYSTEM_ID; + } + if (index.includes('-beats-')) { + if (beatType === 'apm-server') { + return APM_SYSTEM_ID; + } + return BEATS_SYSTEM_ID; + } + if (index.includes('-logstash-')) { + return LOGSTASH_SYSTEM_ID; + } + if (index.includes('-es-')) { + return ELASTICSEARCH_SYSTEM_ID; + } + return ''; +} + +export async function fetchMissingMonitoringData( + callCluster: any, + clusters: AlertCluster[], + index: string, + size: number, + nowInMs: number, + startMs: number +): Promise<AlertMissingData[]> { + const endMs = nowInMs; + + const nameFields = [ + 'source_node.name', + 'kibana_stats.kibana.name', + 'logstash_stats.logstash.host', + 'beats_stats.beat.name', + 'beat_stats.beat.type', + ]; + const subAggs = { + most_recent: { + max: { + field: 'timestamp', + }, + }, + document: { + top_hits: { + size: 1, + sort: [ + { + timestamp: { + order: 'desc', + }, + }, + ], + _source: { + includes: ['_index', ...nameFields], + }, + }, + }, + }; + + const params = { + index, + filterPath: ['aggregations.clusters.buckets'], + body: { + size: 0, + query: { + bool: { + filter: [ + { + terms: { + cluster_uuid: clusters.map((cluster) => cluster.clusterUuid), + }, + }, + { + range: { + timestamp: { + format: 'epoch_millis', + gte: startMs, + lte: endMs, + }, + }, + }, + ], + }, + }, + aggs: { + clusters: { + terms: { + field: 'cluster_uuid', + size, + }, + aggs: { + es_uuids: { + terms: { + field: 'node_stats.node_id', + size, + }, + aggs: subAggs, + }, + kibana_uuids: { + terms: { + field: 'kibana_stats.kibana.uuid', + size, + }, + aggs: subAggs, + }, + beats: { + filter: { + bool: { + must_not: { + term: { + 'beats_stats.beat.type': 'apm-server', + }, + }, + }, + }, + aggs: { + beats_uuids: { + terms: { + field: 'beats_stats.beat.uuid', + size, + }, + aggs: subAggs, + }, + }, + }, + apms: { + filter: { + bool: { + must: { + term: { + 'beats_stats.beat.type': 'apm-server', + }, + }, + }, + }, + aggs: { + apm_uuids: { + terms: { + field: 'beats_stats.beat.uuid', + size, + }, + aggs: subAggs, + }, + }, + }, + logstash_uuids: { + terms: { + field: 'logstash_stats.logstash.uuid', + size, + }, + aggs: subAggs, + }, + }, + }, + }, + }, + }; + + const response = await callCluster('search', params); + const clusterBuckets = get( + response, + 'aggregations.clusters.buckets', + [] + ) as ClusterBucketESResponse[]; + const uniqueList: { [id: string]: AlertMissingData } = {}; + for (const clusterBucket of clusterBuckets) { + const clusterUuid = clusterBucket.key; + + const uuidBuckets = [ + ...(clusterBucket.es_uuids?.buckets || []), + ...(clusterBucket.kibana_uuids?.buckets || []), + ...(clusterBucket.logstash_uuids?.buckets || []), + ...(clusterBucket.beats?.beats_uuids.buckets || []), + ...(clusterBucket.apms?.apm_uuids.buckets || []), + ]; + + for (const uuidBucket of uuidBuckets) { + const stackProductUuid = uuidBucket.key; + const indexName = get(uuidBucket, `document.hits.hits[0]._index`); + const stackProduct = getStackProductFromIndex( + indexName, + get(uuidBucket, `document.hits.hits[0]._source.beats_stats.beat.type`) + ); + const differenceInMs = nowInMs - uuidBucket.most_recent.value; + let stackProductName = stackProductUuid; + for (const nameField of nameFields) { + stackProductName = get(uuidBucket, `document.hits.hits[0]._source.${nameField}`); + if (stackProductName) { + break; + } + } + + uniqueList[`${clusterUuid}${stackProduct}${stackProductUuid}`] = { + stackProduct, + stackProductUuid, + stackProductName, + clusterUuid, + gapDuration: differenceInMs, + ccs: indexName.includes(':') ? indexName.split(':')[0] : null, + }; + } + } + + const missingData = Object.values(uniqueList); + return missingData; +} diff --git a/x-pack/plugins/monitoring/server/lib/alerts/get_listing_link_for_stack_product.ts b/x-pack/plugins/monitoring/server/lib/alerts/get_listing_link_for_stack_product.ts new file mode 100644 index 0000000000000..1936ac1bc6183 --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/alerts/get_listing_link_for_stack_product.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + BEATS_SYSTEM_ID, + ELASTICSEARCH_SYSTEM_ID, + KIBANA_SYSTEM_ID, + LOGSTASH_SYSTEM_ID, + APM_SYSTEM_ID, +} from '../../../common/constants'; + +export function getListingLinkForStackProduct(stackProduct: string) { + switch (stackProduct) { + case ELASTICSEARCH_SYSTEM_ID: + return 'elasticsearch/nodes'; + case LOGSTASH_SYSTEM_ID: + return 'logstash/nodes'; + case KIBANA_SYSTEM_ID: + return 'kibana/instances'; + case BEATS_SYSTEM_ID: + return 'beats/beats'; + case APM_SYSTEM_ID: + return 'apm/instances'; + } + return ''; +} diff --git a/x-pack/plugins/monitoring/server/lib/alerts/get_stack_product_label.ts b/x-pack/plugins/monitoring/server/lib/alerts/get_stack_product_label.ts new file mode 100644 index 0000000000000..9dafd775bac14 --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/alerts/get_stack_product_label.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { capitalize } from 'lodash'; +import { APM_SYSTEM_ID, BEATS_SYSTEM_ID } from '../../../common/constants'; + +export function getStackProductLabel(stackProduct: string) { + switch (stackProduct) { + case APM_SYSTEM_ID: + return 'APM'; + case BEATS_SYSTEM_ID: + return 'Beat'; + } + return capitalize(stackProduct); +} diff --git a/x-pack/plugins/monitoring/server/lib/alerts/get_type_label_for_stack_product.ts b/x-pack/plugins/monitoring/server/lib/alerts/get_type_label_for_stack_product.ts new file mode 100644 index 0000000000000..74801de10438f --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/alerts/get_type_label_for_stack_product.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { i18n } from '@kbn/i18n'; +import { + BEATS_SYSTEM_ID, + ELASTICSEARCH_SYSTEM_ID, + KIBANA_SYSTEM_ID, + LOGSTASH_SYSTEM_ID, + APM_SYSTEM_ID, +} from '../../../common/constants'; + +const NODES = i18n.translate('xpack.monitoring.alerts.typeLabel.nodes', { + defaultMessage: 'nodes', +}); + +const INSTANCES = i18n.translate('xpack.monitoring.alerts.typeLabel.instances', { + defaultMessage: 'instances', +}); + +const SERVERS = i18n.translate('xpack.monitoring.alerts.typeLabel.servers', { + defaultMessage: 'servers', +}); + +const NODE = i18n.translate('xpack.monitoring.alerts.typeLabel.node', { + defaultMessage: 'node', +}); + +const INSTANCE = i18n.translate('xpack.monitoring.alerts.typeLabel.instance', { + defaultMessage: 'instance', +}); + +const SERVER = i18n.translate('xpack.monitoring.alerts.typeLabel.server', { + defaultMessage: 'server', +}); + +export function getTypeLabelForStackProduct(stackProduct: string, plural: boolean = true) { + switch (stackProduct) { + case ELASTICSEARCH_SYSTEM_ID: + case LOGSTASH_SYSTEM_ID: + return plural ? NODES : NODE; + case KIBANA_SYSTEM_ID: + case BEATS_SYSTEM_ID: + return plural ? INSTANCES : INSTANCE; + case APM_SYSTEM_ID: + return plural ? SERVERS : SERVER; + } + return 'n/a'; +} From 7836998e76e64cdc15bb3233f2a113222837a80d Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper <Zacqary@users.noreply.github.com> Date: Thu, 1 Oct 2020 11:31:39 -0500 Subject: [PATCH 58/64] [Metrics UI] Display No Data context.values as [NO DATA] (#78038) Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- .../inventory_metric_threshold_executor.ts | 6 ++++-- .../metric_threshold_executor.ts | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts index 99904f15b4606..b56ede1974393 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts @@ -148,8 +148,10 @@ export const FIRED_ACTIONS = { const formatMetric = (metric: SnapshotMetricType, value: number) => { const metricFormatter = get(METRIC_FORMATTERS, metric, METRIC_FORMATTERS.count); - if (value == null) { - return ''; + if (isNaN(value)) { + return i18n.translate('xpack.infra.metrics.alerting.inventory.noDataFormattedValue', { + defaultMessage: '[NO DATA]', + }); } const formatter = createFormatter(metricFormatter.formatter, metricFormatter.template); return formatter(value); diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index c85685b4cdca8..4dec552c5bd6c 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -131,11 +131,24 @@ const formatAlertResult = <AlertResult>( } & AlertResult ) => { const { metric, currentValue, threshold } = alertResult; - if (!metric.endsWith('.pct')) return alertResult; + const noDataValue = i18n.translate( + 'xpack.infra.metrics.alerting.threshold.noDataFormattedValue', + { + defaultMessage: '[NO DATA]', + } + ); + if (!metric.endsWith('.pct')) + return { + ...alertResult, + currentValue: currentValue ?? noDataValue, + }; const formatter = createFormatter('percent'); return { ...alertResult, - currentValue: formatter(currentValue), + currentValue: + currentValue !== null && typeof currentValue !== 'undefined' + ? formatter(currentValue) + : noDataValue, threshold: Array.isArray(threshold) ? threshold.map((v: number) => formatter(v)) : threshold, }; }; From 963fe0c1d1ceaea53666e039dbe0863dde2c5c12 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet <nicolas.chaulet@elastic.co> Date: Thu, 1 Oct 2020 13:09:02 -0400 Subject: [PATCH 59/64] [Ingest Manager] Ensure we trigger agent policy updated event when we bump revision. (#78836) --- .../server/services/agent_policy.ts | 18 +++++++-- .../apis/settings/update.ts | 40 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/services/agent_policy.ts b/x-pack/plugins/ingest_manager/server/services/agent_policy.ts index 29821a530098c..12ea8ab92f6c4 100644 --- a/x-pack/plugins/ingest_manager/server/services/agent_policy.ts +++ b/x-pack/plugins/ingest_manager/server/services/agent_policy.ts @@ -33,7 +33,7 @@ const SAVED_OBJECT_TYPE = AGENT_POLICY_SAVED_OBJECT_TYPE; class AgentPolicyService { private triggerAgentPolicyUpdatedEvent = async ( soClient: SavedObjectsClientContract, - action: string, + action: 'created' | 'updated' | 'deleted', agentPolicyId: string ) => { return agentPolicyUpdateEventHandler(soClient, action, agentPolicyId); @@ -258,7 +258,11 @@ class AgentPolicyService { id: string, options?: { user?: AuthenticatedUser } ): Promise<AgentPolicy> { - return this._update(soClient, id, {}, options?.user); + const res = await this._update(soClient, id, {}, options?.user); + + await this.triggerAgentPolicyUpdatedEvent(soClient, 'updated', id); + + return res; } public async bumpAllAgentPolicies( soClient: SavedObjectsClientContract, @@ -277,7 +281,15 @@ class AgentPolicyService { }; return policy; }); - return soClient.bulkUpdate<AgentPolicySOAttributes>(bumpedPolicies); + const res = await soClient.bulkUpdate<AgentPolicySOAttributes>(bumpedPolicies); + + await Promise.all( + currentPolicies.saved_objects.map((policy) => + this.triggerAgentPolicyUpdatedEvent(soClient, 'updated', policy.id) + ) + ); + + return res; } public async assignPackagePolicies( diff --git a/x-pack/test/ingest_manager_api_integration/apis/settings/update.ts b/x-pack/test/ingest_manager_api_integration/apis/settings/update.ts index 86292b535db2d..4340cd4832307 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/settings/update.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/settings/update.ts @@ -5,16 +5,20 @@ */ import expect from '@kbn/expect'; +import { Client } from 'elasticsearch'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { skipIfNoDockerRegistry } from '../../helpers'; +import { setupIngest } from '../fleet/agents/services'; export default function (providerContext: FtrProviderContext) { const { getService } = providerContext; const supertest = getService('supertest'); const kibanaServer = getService('kibanaServer'); + const esClient: Client = getService('legacyEs'); describe('Settings - update', async function () { skipIfNoDockerRegistry(providerContext); + setupIngest(providerContext); it("should bump all agent policy's revision", async function () { const { body: testPolicy1PostRes } = await supertest @@ -49,5 +53,41 @@ export default function (providerContext: FtrProviderContext) { expect(getTestPolicy1Res.attributes.revision).equal(2); expect(getTestPolicy2Res.attributes.revision).equal(2); }); + + it('should create agent actions', async function () { + const { body: testPolicyRes } = await supertest + .post(`/api/ingest_manager/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'test', + description: '', + namespace: 'default', + }); + + await supertest + .put(`/api/ingest_manager/settings`) + .set('kbn-xsrf', 'xxxx') + .send({ kibana_urls: ['http://localhost:1232/abc', 'http://localhost:1232/abc'] }); + + const res = await esClient.search({ + index: '.kibana', + body: { + query: { + bool: { + must: [ + { + terms: { + type: ['fleet-agent-actions'], + }, + }, + { match: { 'fleet-agent-actions.policy_id': testPolicyRes.item.id } }, + ], + }, + }, + }, + }); + + expect(res.hits.hits.length).equal(2); + }); }); } From 574205dc72b63a3c30ff159684012d8e3191ef2d Mon Sep 17 00:00:00 2001 From: Tiago Costa <tiagoffcc@hotmail.com> Date: Thu, 1 Oct 2020 18:14:59 +0100 Subject: [PATCH 60/64] chore(NA): remove non existing plugin paths from case api integration tests (#79127) * chore(NA): remove non existing plugin paths from case api integration tests config * chore(NA): remove unused import --- x-pack/test/case_api_integration/common/config.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/x-pack/test/case_api_integration/common/config.ts b/x-pack/test/case_api_integration/common/config.ts index 5d34f8b04981a..72d1bc4ec9a37 100644 --- a/x-pack/test/case_api_integration/common/config.ts +++ b/x-pack/test/case_api_integration/common/config.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import path from 'path'; - import { CA_CERT_PATH } from '@kbn/dev-utils'; import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; @@ -78,8 +76,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, '--xpack.eventLog.logEntries=true', ...disabledPlugins.map((key) => `--xpack.${key}.enabled=false`), - `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`, - `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions')}`, ...(ssl ? [ `--elasticsearch.hosts=${servers.elasticsearch.protocol}://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, From fd7dd41617a7464e6b0e61a83800c05ccf6a5189 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Thu, 1 Oct 2020 12:41:12 -0500 Subject: [PATCH 61/64] [ML] Update transform cloning to include description and new fields (#78364) --- .../public/app/common/request.test.ts | 33 +++++++++++++ .../transform/public/app/common/request.ts | 22 ++++++--- .../step_details/step_details_form.tsx | 18 +++++++ .../step_details/step_details_summary.tsx | 2 + .../test/functional/apps/transform/cloning.ts | 15 +++++- .../functional/services/transform/wizard.ts | 47 +++++++++++++++++++ 6 files changed, 129 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/transform/public/app/common/request.test.ts b/x-pack/plugins/transform/public/app/common/request.test.ts index 913ea8964eaf0..46ace2c3315a5 100644 --- a/x-pack/plugins/transform/public/app/common/request.test.ts +++ b/x-pack/plugins/transform/public/app/common/request.test.ts @@ -17,6 +17,7 @@ import { defaultQuery, getPreviewTransformRequestBody, getCreateTransformRequestBody, + getCreateTransformSettingsRequestBody, getPivotQuery, isDefaultQuery, isMatchAllQuery, @@ -159,6 +160,7 @@ describe('Transform: Common', () => { transformDescription: 'the-transform-description', transformFrequency: '1m', transformSettingsMaxPageSearchSize: 100, + transformSettingsDocsPerSecond: 400, destinationIndex: 'the-destination-index', touched: true, valid: true, @@ -180,6 +182,7 @@ describe('Transform: Common', () => { }, settings: { max_page_search_size: 100, + docs_per_second: 400, }, source: { index: ['the-index-pattern-title'], @@ -187,4 +190,34 @@ describe('Transform: Common', () => { }, }); }); + + test('getCreateTransformSettingsRequestBody() with multiple settings', () => { + const transformDetailsState: Partial<StepDetailsExposedState> = { + transformSettingsDocsPerSecond: 400, + transformSettingsMaxPageSearchSize: 100, + }; + + const request = getCreateTransformSettingsRequestBody(transformDetailsState); + + expect(request).toEqual({ + settings: { + docs_per_second: 400, + max_page_search_size: 100, + }, + }); + }); + + test('getCreateTransformSettingsRequestBody() with one setting', () => { + const transformDetailsState: Partial<StepDetailsExposedState> = { + transformSettingsDocsPerSecond: 400, + }; + + const request = getCreateTransformSettingsRequestBody(transformDetailsState); + + expect(request).toEqual({ + settings: { + docs_per_second: 400, + }, + }); + }); }); diff --git a/x-pack/plugins/transform/public/app/common/request.ts b/x-pack/plugins/transform/public/app/common/request.ts index 45160d125309d..8ee235baf7c5a 100644 --- a/x-pack/plugins/transform/public/app/common/request.ts +++ b/x-pack/plugins/transform/public/app/common/request.ts @@ -130,6 +130,20 @@ export function getPreviewTransformRequestBody( return request; } +export const getCreateTransformSettingsRequestBody = ( + transformDetailsState: Partial<StepDetailsExposedState> +): { settings?: PutTransformsRequestSchema['settings'] } => { + const settings: PutTransformsRequestSchema['settings'] = { + ...(transformDetailsState.transformSettingsMaxPageSearchSize + ? { max_page_search_size: transformDetailsState.transformSettingsMaxPageSearchSize } + : {}), + ...(transformDetailsState.transformSettingsDocsPerSecond + ? { docs_per_second: transformDetailsState.transformSettingsDocsPerSecond } + : {}), + }; + return Object.keys(settings).length > 0 ? { settings } : {}; +}; + export const getCreateTransformRequestBody = ( indexPatternTitle: IndexPattern['title'], pivotState: StepDefineExposedState, @@ -164,13 +178,7 @@ export const getCreateTransformRequestBody = ( } : {}), // conditionally add additional settings - ...(transformDetailsState.transformSettingsMaxPageSearchSize - ? { - settings: { - max_page_search_size: transformDetailsState.transformSettingsMaxPageSearchSize, - }, - } - : {}), + ...getCreateTransformSettingsRequestBody(transformDetailsState), }); export function isHttpFetchError(error: any): error is HttpFetchError { diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx index 00ab516f625fe..9b43879512e4d 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx @@ -63,6 +63,7 @@ export interface StepDetailsExposedState { transformDescription: string; transformFrequency: string; transformSettingsMaxPageSearchSize: number; + transformSettingsDocsPerSecond?: number; valid: boolean; indexPatternTimeField?: string | undefined; } @@ -100,6 +101,20 @@ export function applyTransformConfigToDetailsState( state.continuousModeDelay = time?.delay ?? defaultContinuousModeDelay; state.isContinuousModeEnabled = true; } + if (transformConfig.description !== undefined) { + state.transformDescription = transformConfig.description; + } + if (transformConfig.frequency !== undefined) { + state.transformFrequency = transformConfig.frequency; + } + if (transformConfig.settings) { + if (typeof transformConfig.settings?.max_page_search_size === 'number') { + state.transformSettingsMaxPageSearchSize = transformConfig.settings.max_page_search_size; + } + if (typeof transformConfig.settings?.docs_per_second === 'number') { + state.transformSettingsDocsPerSecond = transformConfig.settings.docs_per_second; + } + } } return state; } @@ -275,6 +290,8 @@ export const StepDetailsForm: FC<Props> = React.memo( const [transformSettingsMaxPageSearchSize, setTransformSettingsMaxPageSearchSize] = useState( defaults.transformSettingsMaxPageSearchSize ); + const [transformSettingsDocsPerSecond] = useState(defaults.transformSettingsDocsPerSecond); + const isTransformSettingsMaxPageSearchSizeValid = transformSettingsMaxPageSearchSizeValidator( transformSettingsMaxPageSearchSize ); @@ -301,6 +318,7 @@ export const StepDetailsForm: FC<Props> = React.memo( transformDescription, transformFrequency, transformSettingsMaxPageSearchSize, + transformSettingsDocsPerSecond, destinationIndex, touched: true, valid, diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_summary.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_summary.tsx index 45cd8aa465522..f5444eaf6640a 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_summary.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_summary.tsx @@ -98,6 +98,7 @@ export const StepDetailsSummary: FC<StepDetailsExposedState> = React.memo((props paddingSize="s" > <EuiFormRow + data-test-subj={'transformWizardAdvancedSettingsFrequencyLabel'} label={i18n.translate('xpack.transform.stepDetailsSummary.frequencyLabel', { defaultMessage: 'Frequency', })} @@ -105,6 +106,7 @@ export const StepDetailsSummary: FC<StepDetailsExposedState> = React.memo((props <span>{transformFrequency}</span> </EuiFormRow> <EuiFormRow + data-test-subj={'transformWizardAdvancedSettingsMaxPageSearchSizeLabel'} label={i18n.translate('xpack.transform.stepDetailsSummary.maxPageSearchSizeLabel', { defaultMessage: 'Maximum page search size', })} diff --git a/x-pack/test/functional/apps/transform/cloning.ts b/x-pack/test/functional/apps/transform/cloning.ts index a147b56d56251..421eab656f606 100644 --- a/x-pack/test/functional/apps/transform/cloning.ts +++ b/x-pack/test/functional/apps/transform/cloning.ts @@ -18,6 +18,10 @@ function getTransformConfig(): TransformPivotConfig { }, description: 'ecommerce batch transform with avg(products.base_price) grouped by terms(category.keyword)', + frequency: '3s', + settings: { + max_page_search_size: 250, + }, dest: { index: `user-ec_2_${date}` }, }; } @@ -155,7 +159,7 @@ export default function ({ getService }: FtrProviderContext) { await transform.testExecution.logTestStep('should input the transform description'); await transform.wizard.assertTransformDescriptionInputExists(); - await transform.wizard.assertTransformDescriptionValue(''); + await transform.wizard.assertTransformDescriptionValue(transformConfig.description!); await transform.wizard.setTransformDescription(testData.transformDescription); await transform.testExecution.logTestStep('should input the destination index'); @@ -173,6 +177,15 @@ export default function ({ getService }: FtrProviderContext) { await transform.wizard.assertContinuousModeSwitchExists(); await transform.wizard.assertContinuousModeSwitchCheckState(false); + await transform.testExecution.logTestStep( + 'should display the advanced settings and show pre-filled configuration' + ); + await transform.wizard.openTransformAdvancedSettingsAccordion(); + await transform.wizard.assertTransformFrequencyValue(transformConfig.frequency!); + await transform.wizard.assertTransformMaxPageSearchSizeValue( + transformConfig.settings!.max_page_search_size! + ); + await transform.testExecution.logTestStep('should load the create step'); await transform.wizard.advanceToCreateStep(); diff --git a/x-pack/test/functional/services/transform/wizard.ts b/x-pack/test/functional/services/transform/wizard.ts index 9cfdbadac8a3b..b05f1ff26199e 100644 --- a/x-pack/test/functional/services/transform/wizard.ts +++ b/x-pack/test/functional/services/transform/wizard.ts @@ -522,6 +522,53 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { ); }, + async assertTransformAdvancedSettingsAccordionExists() { + await testSubjects.existOrFail('transformWizardAccordionAdvancedSettings'); + }, + + // for now we expect this to be used only for opening the accordion + async openTransformAdvancedSettingsAccordion() { + await this.assertTransformAdvancedSettingsAccordionExists(); + await testSubjects.click('transformWizardAccordionAdvancedSettings'); + await this.assertTransformFrequencyInputExists(); + await this.assertTransformMaxPageSearchSizeInputExists(); + }, + + async assertTransformFrequencyInputExists() { + await testSubjects.existOrFail('transformFrequencyInput'); + expect(await testSubjects.isDisplayed('transformFrequencyInput')).to.eql( + true, + `Expected 'Frequency' input to be displayed` + ); + }, + + async assertTransformFrequencyValue(expectedValue: string) { + const actualValue = await testSubjects.getAttribute('transformFrequencyInput', 'value'); + expect(actualValue).to.eql( + expectedValue, + `Transform frequency input text should be '${expectedValue}' (got '${actualValue}')` + ); + }, + + async assertTransformMaxPageSearchSizeInputExists() { + await testSubjects.existOrFail('transformMaxPageSearchSizeInput'); + expect(await testSubjects.isDisplayed('transformMaxPageSearchSizeInput')).to.eql( + true, + `Expected 'Maximum page search size' input to be displayed` + ); + }, + + async assertTransformMaxPageSearchSizeValue(expectedValue: number) { + const actualValue = await testSubjects.getAttribute( + 'transformMaxPageSearchSizeInput', + 'value' + ); + expect(actualValue).to.eql( + expectedValue, + `Transform maximum page search size input text should be '${expectedValue}' (got '${actualValue}')` + ); + }, + async assertCreateAndStartButtonExists() { await testSubjects.existOrFail('transformWizardCreateAndStartButton'); expect(await testSubjects.isDisplayed('transformWizardCreateAndStartButton')).to.eql( From 085f8a17ff2a6f83e42f867c509d573fbadb968b Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski <jon@budzenski.me> Date: Thu, 1 Oct 2020 12:42:37 -0500 Subject: [PATCH 62/64] Revert "[Metrics UI] Add ability to override datafeeds and job config for partition field (#78875)" This reverts commit ee7672aaf074dc4ebaf0ffb88d95d5f1bf9e1d18. --- .../containers/ml/infra_ml_module_types.ts | 4 +- .../containers/ml/infra_ml_setup_state.ts | 289 ++++++++++++++++++ .../metrics_hosts/module_descriptor.ts | 135 +++----- .../modules/metrics_k8s/module_descriptor.ts | 143 +++------ .../anomoly_detection_flyout.tsx | 4 +- .../ml/anomaly_detection/flyout_home.tsx | 113 ++++--- .../ml/anomaly_detection/job_setup_screen.tsx | 3 +- 7 files changed, 444 insertions(+), 247 deletions(-) create mode 100644 x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts index e36f38add641a..a9f2671de8259 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_types.ts @@ -33,11 +33,11 @@ export interface ModuleDescriptor<JobType extends string> { partitionField?: string ) => Promise<SetupMlModuleResponsePayload>; cleanUpModule: (spaceId: string, sourceId: string) => Promise<DeleteJobsResponsePayload>; - validateSetupIndices?: ( + validateSetupIndices: ( indices: string[], timestampField: string ) => Promise<ValidationIndicesResponsePayload>; - validateSetupDatasets?: ( + validateSetupDatasets: ( indices: string[], timestampField: string, startTime: number, diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts b/x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts new file mode 100644 index 0000000000000..0dfe3b301f240 --- /dev/null +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_setup_state.ts @@ -0,0 +1,289 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { isEqual } from 'lodash'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { usePrevious } from 'react-use'; +import { + combineDatasetFilters, + DatasetFilter, + filterDatasetFilter, + isExampleDataIndex, +} from '../../../common/infra_ml'; +import { + AvailableIndex, + ValidationIndicesError, + ValidationUIError, +} from '../../components/logging/log_analysis_setup/initial_configuration_step'; +import { useTrackedPromise } from '../../utils/use_tracked_promise'; +import { ModuleDescriptor, ModuleSourceConfiguration } from './infra_ml_module_types'; + +type SetupHandler = ( + indices: string[], + startTime: number | undefined, + endTime: number | undefined, + datasetFilter: DatasetFilter +) => void; + +interface AnalysisSetupStateArguments<JobType extends string> { + cleanUpAndSetUpModule: SetupHandler; + moduleDescriptor: ModuleDescriptor<JobType>; + setUpModule: SetupHandler; + sourceConfiguration: ModuleSourceConfiguration; +} + +const fourWeeksInMs = 86400000 * 7 * 4; + +export const useAnalysisSetupState = <JobType extends string>({ + cleanUpAndSetUpModule, + moduleDescriptor: { validateSetupDatasets, validateSetupIndices }, + setUpModule, + sourceConfiguration, +}: AnalysisSetupStateArguments<JobType>) => { + const [startTime, setStartTime] = useState<number | undefined>(Date.now() - fourWeeksInMs); + const [endTime, setEndTime] = useState<number | undefined>(undefined); + + const isTimeRangeValid = useMemo( + () => (startTime != null && endTime != null ? startTime < endTime : true), + [endTime, startTime] + ); + + const [validatedIndices, setValidatedIndices] = useState<AvailableIndex[]>( + sourceConfiguration.indices.map((indexName) => ({ + name: indexName, + validity: 'unknown' as const, + })) + ); + + const updateIndicesWithValidationErrors = useCallback( + (validationErrors: ValidationIndicesError[]) => + setValidatedIndices((availableIndices) => + availableIndices.map((previousAvailableIndex) => { + const indexValiationErrors = validationErrors.filter( + ({ index }) => index === previousAvailableIndex.name + ); + + if (indexValiationErrors.length > 0) { + return { + validity: 'invalid', + name: previousAvailableIndex.name, + errors: indexValiationErrors, + }; + } else if (previousAvailableIndex.validity === 'valid') { + return { + ...previousAvailableIndex, + validity: 'valid', + errors: [], + }; + } else { + return { + validity: 'valid', + name: previousAvailableIndex.name, + isSelected: !isExampleDataIndex(previousAvailableIndex.name), + availableDatasets: [], + datasetFilter: { + type: 'includeAll' as const, + }, + }; + } + }) + ), + [] + ); + + const updateIndicesWithAvailableDatasets = useCallback( + (availableDatasets: Array<{ indexName: string; datasets: string[] }>) => + setValidatedIndices((availableIndices) => + availableIndices.map((previousAvailableIndex) => { + if (previousAvailableIndex.validity !== 'valid') { + return previousAvailableIndex; + } + + const availableDatasetsForIndex = availableDatasets.filter( + ({ indexName }) => indexName === previousAvailableIndex.name + ); + const newAvailableDatasets = availableDatasetsForIndex.flatMap( + ({ datasets }) => datasets + ); + + // filter out datasets that have disappeared if this index' datasets were updated + const newDatasetFilter: DatasetFilter = + availableDatasetsForIndex.length > 0 + ? filterDatasetFilter(previousAvailableIndex.datasetFilter, (dataset) => + newAvailableDatasets.includes(dataset) + ) + : previousAvailableIndex.datasetFilter; + + return { + ...previousAvailableIndex, + availableDatasets: newAvailableDatasets, + datasetFilter: newDatasetFilter, + }; + }) + ), + [] + ); + + const validIndexNames = useMemo( + () => validatedIndices.filter((index) => index.validity === 'valid').map((index) => index.name), + [validatedIndices] + ); + + const selectedIndexNames = useMemo( + () => + validatedIndices + .filter((index) => index.validity === 'valid' && index.isSelected) + .map((i) => i.name), + [validatedIndices] + ); + + const datasetFilter = useMemo( + () => + validatedIndices + .flatMap((validatedIndex) => + validatedIndex.validity === 'valid' + ? validatedIndex.datasetFilter + : { type: 'includeAll' as const } + ) + .reduce(combineDatasetFilters, { type: 'includeAll' as const }), + [validatedIndices] + ); + + const [validateIndicesRequest, validateIndices] = useTrackedPromise( + { + cancelPreviousOn: 'resolution', + createPromise: async () => { + return await validateSetupIndices( + sourceConfiguration.indices, + sourceConfiguration.timestampField + ); + }, + onResolve: ({ data: { errors } }) => { + updateIndicesWithValidationErrors(errors); + }, + onReject: () => { + setValidatedIndices([]); + }, + }, + [sourceConfiguration.indices, sourceConfiguration.timestampField] + ); + + const [validateDatasetsRequest, validateDatasets] = useTrackedPromise( + { + cancelPreviousOn: 'resolution', + createPromise: async () => { + if (validIndexNames.length === 0) { + return { data: { datasets: [] } }; + } + + return await validateSetupDatasets( + validIndexNames, + sourceConfiguration.timestampField, + startTime ?? 0, + endTime ?? Date.now() + ); + }, + onResolve: ({ data: { datasets } }) => { + updateIndicesWithAvailableDatasets(datasets); + }, + }, + [validIndexNames, sourceConfiguration.timestampField, startTime, endTime] + ); + + const setUp = useCallback(() => { + return setUpModule(selectedIndexNames, startTime, endTime, datasetFilter); + }, [setUpModule, selectedIndexNames, startTime, endTime, datasetFilter]); + + const cleanUpAndSetUp = useCallback(() => { + return cleanUpAndSetUpModule(selectedIndexNames, startTime, endTime, datasetFilter); + }, [cleanUpAndSetUpModule, selectedIndexNames, startTime, endTime, datasetFilter]); + + const isValidating = useMemo( + () => validateIndicesRequest.state === 'pending' || validateDatasetsRequest.state === 'pending', + [validateDatasetsRequest.state, validateIndicesRequest.state] + ); + + const validationErrors = useMemo<ValidationUIError[]>(() => { + if (isValidating) { + return []; + } + + return [ + // validate request status + ...(validateIndicesRequest.state === 'rejected' || + validateDatasetsRequest.state === 'rejected' + ? [{ error: 'NETWORK_ERROR' as const }] + : []), + // validation request results + ...validatedIndices.reduce<ValidationUIError[]>((errors, index) => { + return index.validity === 'invalid' && selectedIndexNames.includes(index.name) + ? [...errors, ...index.errors] + : errors; + }, []), + // index count + ...(selectedIndexNames.length === 0 ? [{ error: 'TOO_FEW_SELECTED_INDICES' as const }] : []), + // time range + ...(!isTimeRangeValid ? [{ error: 'INVALID_TIME_RANGE' as const }] : []), + ]; + }, [ + isValidating, + validateIndicesRequest.state, + validateDatasetsRequest.state, + validatedIndices, + selectedIndexNames, + isTimeRangeValid, + ]); + + const prevStartTime = usePrevious(startTime); + const prevEndTime = usePrevious(endTime); + const prevValidIndexNames = usePrevious(validIndexNames); + + useEffect(() => { + if (!isTimeRangeValid) { + return; + } + + validateIndices(); + }, [isTimeRangeValid, validateIndices]); + + useEffect(() => { + if (!isTimeRangeValid) { + return; + } + + if ( + startTime !== prevStartTime || + endTime !== prevEndTime || + !isEqual(validIndexNames, prevValidIndexNames) + ) { + validateDatasets(); + } + }, [ + endTime, + isTimeRangeValid, + prevEndTime, + prevStartTime, + prevValidIndexNames, + startTime, + validIndexNames, + validateDatasets, + ]); + + return { + cleanUpAndSetUp, + datasetFilter, + endTime, + isValidating, + selectedIndexNames, + setEndTime, + setStartTime, + setUp, + startTime, + validatedIndices, + setValidatedIndices, + validationErrors, + }; +}; diff --git a/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts b/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts index 711ee76d42a64..cec87fb1144e3 100644 --- a/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts +++ b/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module_descriptor.ts @@ -10,27 +10,17 @@ import { cleanUpJobsAndDatafeeds } from '../../infra_ml_cleanup'; import { callJobsSummaryAPI } from '../../api/ml_get_jobs_summary_api'; import { callGetMlModuleAPI } from '../../api/ml_get_module'; import { callSetupMlModuleAPI } from '../../api/ml_setup_module_api'; +import { callValidateIndicesAPI } from '../../../logs/log_analysis/api/validate_indices'; +import { callValidateDatasetsAPI } from '../../../logs/log_analysis/api/validate_datasets'; import { metricsHostsJobTypes, getJobId, MetricsHostsJobType, DatasetFilter, bucketSpan, + partitionField, } from '../../../../../common/infra_ml'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import MemoryJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/hosts_memory_usage.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import MemoryDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/datafeed_hosts_memory_usage.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkInJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/hosts_network_in.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkInDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/datafeed_hosts_network_in.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkOutJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/hosts_network_out.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkOutDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_hosts/ml/datafeed_hosts_network_out.json'; -type JobType = 'hosts_memory_usage' | 'hosts_network_in' | 'hosts_network_out'; const moduleId = 'metrics_ui_hosts'; const moduleName = i18n.translate('xpack.infra.ml.metricsModuleName', { defaultMessage: 'Metrics anomanly detection', @@ -64,68 +54,23 @@ const setUpModule = async ( end: number | undefined, datasetFilter: DatasetFilter, { spaceId, sourceId, indices, timestampField }: ModuleSourceConfiguration, - partitionField?: string + pField?: string ) => { const indexNamePattern = indices.join(','); - const jobIds: JobType[] = ['hosts_memory_usage', 'hosts_network_in', 'hosts_network_out']; - - const jobOverrides = jobIds.map((id) => { - const { job: defaultJobConfig } = getDefaultJobConfigs(id); - - // eslint-disable-next-line @typescript-eslint/naming-convention - const analysis_config = { - ...defaultJobConfig.analysis_config, - }; - - if (partitionField) { - analysis_config.detectors[0].partition_field_name = partitionField; - if (analysis_config.influencers.indexOf(partitionField) === -1) { - analysis_config.influencers.push(partitionField); - } - } - - return { - job_id: id, - data_description: { - time_field: timestampField, - }, - analysis_config, - custom_settings: { - metrics_source_config: { - indexPattern: indexNamePattern, - timestampField, - bucketSpan, - }, - }, - }; - }); - - const datafeedOverrides = jobIds.map((id) => { - const { datafeed: defaultDatafeedConfig } = getDefaultJobConfigs(id); - - if (!partitionField || id === 'hosts_memory_usage') { - // Since the host memory usage doesn't have custom aggs, we don't need to do anything to add a partition field - return defaultDatafeedConfig; - } - - // If we have a partition field, we need to change the aggregation to do a terms agg at the top level - const aggregations = { - [partitionField]: { - terms: { - field: partitionField, - }, - aggregations: { - ...defaultDatafeedConfig.aggregations, - }, + const jobIds = ['hosts_memory_usage', 'hosts_network_in', 'hosts_network_out']; + const jobOverrides = jobIds.map((id) => ({ + job_id: id, + data_description: { + time_field: timestampField, + }, + custom_settings: { + metrics_source_config: { + indexPattern: indexNamePattern, + timestampField, + bucketSpan, }, - }; - - return { - ...defaultDatafeedConfig, - job_id: id, - aggregations, - }; - }); + }, + })); return callSetupMlModuleAPI( moduleId, @@ -135,34 +80,36 @@ const setUpModule = async ( sourceId, indexNamePattern, jobOverrides, - datafeedOverrides + [] ); }; -const getDefaultJobConfigs = (jobId: JobType) => { - switch (jobId) { - case 'hosts_memory_usage': - return { - datafeed: MemoryDatafeed, - job: MemoryJob, - }; - case 'hosts_network_in': - return { - datafeed: NetworkInDatafeed, - job: NetworkInJob, - }; - case 'hosts_network_out': - return { - datafeed: NetworkOutDatafeed, - job: NetworkOutJob, - }; - } -}; - const cleanUpModule = async (spaceId: string, sourceId: string) => { return await cleanUpJobsAndDatafeeds(spaceId, sourceId, metricsHostsJobTypes); }; +const validateSetupIndices = async (indices: string[], timestampField: string) => { + return await callValidateIndicesAPI(indices, [ + { + name: timestampField, + validTypes: ['date'], + }, + { + name: partitionField, + validTypes: ['keyword'], + }, + ]); +}; + +const validateSetupDatasets = async ( + indices: string[], + timestampField: string, + startTime: number, + endTime: number +) => { + return await callValidateDatasetsAPI(indices, timestampField, startTime, endTime); +}; + export const metricHostsModule: ModuleDescriptor<MetricsHostsJobType> = { moduleId, moduleName, @@ -174,4 +121,6 @@ export const metricHostsModule: ModuleDescriptor<MetricsHostsJobType> = { getModuleDefinition, setUpModule, cleanUpModule, + validateSetupDatasets, + validateSetupIndices, }; diff --git a/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts b/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts index 41c6df92fb379..cbcff1c307af6 100644 --- a/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts +++ b/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module_descriptor.ts @@ -10,28 +10,17 @@ import { cleanUpJobsAndDatafeeds } from '../../infra_ml_cleanup'; import { callJobsSummaryAPI } from '../../api/ml_get_jobs_summary_api'; import { callGetMlModuleAPI } from '../../api/ml_get_module'; import { callSetupMlModuleAPI } from '../../api/ml_setup_module_api'; +import { callValidateIndicesAPI } from '../../../logs/log_analysis/api/validate_indices'; +import { callValidateDatasetsAPI } from '../../../logs/log_analysis/api/validate_datasets'; import { metricsK8SJobTypes, getJobId, MetricK8sJobType, DatasetFilter, bucketSpan, + partitionField, } from '../../../../../common/infra_ml'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import MemoryJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/k8s_memory_usage.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import MemoryDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/datafeed_k8s_memory_usage.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkInJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/k8s_network_in.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkInDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/datafeed_k8s_network_in.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkOutJob from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/k8s_network_out.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import NetworkOutDatafeed from '../../../../../../ml/server/models/data_recognizer/modules/metrics_ui_k8s/ml/datafeed_k8s_network_out.json'; -type JobType = 'k8s_memory_usage' | 'k8s_network_in' | 'k8s_network_out'; -export const DEFAULT_K8S_PARTITION_FIELD = 'kubernetes.namespace'; const moduleId = 'metrics_ui_k8s'; const moduleName = i18n.translate('xpack.infra.ml.metricsModuleName', { defaultMessage: 'Metrics anomanly detection', @@ -65,72 +54,26 @@ const setUpModule = async ( end: number | undefined, datasetFilter: DatasetFilter, { spaceId, sourceId, indices, timestampField }: ModuleSourceConfiguration, - partitionField?: string + pField?: string ) => { const indexNamePattern = indices.join(','); - const jobIds: JobType[] = ['k8s_memory_usage', 'k8s_network_in', 'k8s_network_out']; - const jobOverrides = jobIds.map((id) => { - const { job: defaultJobConfig } = getDefaultJobConfigs(id); - - // eslint-disable-next-line @typescript-eslint/naming-convention - const analysis_config = { - ...defaultJobConfig.analysis_config, - }; - - if (partitionField) { - analysis_config.detectors[0].partition_field_name = partitionField; - if (analysis_config.influencers.indexOf(partitionField) === -1) { - analysis_config.influencers.push(partitionField); - } - } - - return { - job_id: id, - data_description: { - time_field: timestampField, - }, - analysis_config, - custom_settings: { - metrics_source_config: { - indexPattern: indexNamePattern, - timestampField, - bucketSpan, - }, - }, - }; - }); - - const datafeedOverrides = jobIds.map((id) => { - const { datafeed: defaultDatafeedConfig } = getDefaultJobConfigs(id); - - if (!partitionField || id === 'k8s_memory_usage') { - // Since the host memory usage doesn't have custom aggs, we don't need to do anything to add a partition field - return defaultDatafeedConfig; - } - - // Because the ML K8s jobs ship with a default partition field of {kubernetes.namespace}, ignore that agg and wrap it in our own agg. - const innerAggregation = - defaultDatafeedConfig.aggregations[DEFAULT_K8S_PARTITION_FIELD].aggregations; - - // If we have a partition field, we need to change the aggregation to do a terms agg to partition the data at the top level - const aggregations = { - [partitionField]: { - terms: { - field: partitionField, - size: 25, // 25 is arbitratry and only used to keep the number of buckets to a managable level in the event that the user choose a high cardinality partition field. - }, - aggregations: { - ...innerAggregation, - }, + const jobIds = ['k8s_memory_usage', 'k8s_network_in', 'k8s_network_out']; + const jobOverrides = jobIds.map((id) => ({ + job_id: id, + analysis_config: { + bucket_span: `${bucketSpan}ms`, + }, + data_description: { + time_field: timestampField, + }, + custom_settings: { + metrics_source_config: { + indexPattern: indexNamePattern, + timestampField, + bucketSpan, }, - }; - - return { - ...defaultDatafeedConfig, - job_id: id, - aggregations, - }; - }); + }, + })); return callSetupMlModuleAPI( moduleId, @@ -140,34 +83,36 @@ const setUpModule = async ( sourceId, indexNamePattern, jobOverrides, - datafeedOverrides + [] ); }; -const getDefaultJobConfigs = (jobId: JobType) => { - switch (jobId) { - case 'k8s_memory_usage': - return { - datafeed: MemoryDatafeed, - job: MemoryJob, - }; - case 'k8s_network_in': - return { - datafeed: NetworkInDatafeed, - job: NetworkInJob, - }; - case 'k8s_network_out': - return { - datafeed: NetworkOutDatafeed, - job: NetworkOutJob, - }; - } -}; - const cleanUpModule = async (spaceId: string, sourceId: string) => { return await cleanUpJobsAndDatafeeds(spaceId, sourceId, metricsK8SJobTypes); }; +const validateSetupIndices = async (indices: string[], timestampField: string) => { + return await callValidateIndicesAPI(indices, [ + { + name: timestampField, + validTypes: ['date'], + }, + { + name: partitionField, + validTypes: ['keyword'], + }, + ]); +}; + +const validateSetupDatasets = async ( + indices: string[], + timestampField: string, + startTime: number, + endTime: number +) => { + return await callValidateDatasetsAPI(indices, timestampField, startTime, endTime); +}; + export const metricHostsModule: ModuleDescriptor<MetricK8sJobType> = { moduleId, moduleName, @@ -179,4 +124,6 @@ export const metricHostsModule: ModuleDescriptor<MetricK8sJobType> = { getModuleDefinition, setUpModule, cleanUpModule, + validateSetupDatasets, + validateSetupIndices, }; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx index b5d224910e819..b063713fa2c97 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomoly_detection_flyout.tsx @@ -50,10 +50,10 @@ export const AnomalyDetectionFlyout = () => { return ( <> - <EuiButtonEmpty iconSide={'left'} iconType={'inspect'} onClick={openFlyout}> + <EuiButtonEmpty iconSide={'right'} onClick={openFlyout}> <FormattedMessage id="xpack.infra.ml.anomalyDetectionButton" - defaultMessage="Anomaly detection" + defaultMessage="Anomaly Detection" /> </EuiButtonEmpty> {showFlyout && ( diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx index 5b520084ebb74..801dff9c4a17a 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx @@ -5,7 +5,7 @@ */ import React, { useState, useCallback, useEffect } from 'react'; -import { EuiFlyoutHeader, EuiTitle, EuiFlyoutBody, EuiSpacer } from '@elastic/eui'; +import { EuiFlyoutHeader, EuiTitle, EuiFlyoutBody, EuiTabs, EuiTab, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiText, EuiFlexGroup, EuiFlexItem, EuiCard, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -30,7 +30,7 @@ interface Props { } export const FlyoutHome = (props: Props) => { - const [tab] = useState<'jobs' | 'anomalies'>('jobs'); + const [tab, setTab] = useState<'jobs' | 'anomalies'>('jobs'); const { goToSetup } = props; const { fetchJobStatus: fetchHostJobStatus, @@ -56,10 +56,18 @@ export const FlyoutHome = (props: Props) => { goToSetup('kubernetes'); }, [goToSetup]); + const goToJobs = useCallback(() => { + setTab('jobs'); + }, []); + const jobIds = [ ...(k8sJobSummaries || []).map((k) => k.id), ...(hostJobSummaries || []).map((h) => h.id), ]; + const anomaliesUrl = useLinkProps({ + app: 'ml', + pathname: `/explorer?_g=${createResultsUrl(jobIds)}`, + }); useEffect(() => { if (hasInfraMLReadCapabilities) { @@ -97,24 +105,30 @@ export const FlyoutHome = (props: Props) => { </EuiFlyoutHeader> <EuiFlyoutBody> - <div> - <EuiText> - <p> - <FormattedMessage - defaultMessage="Anomaly detection is powered by machine learning. Machine learning jobs are available for the following resource types. Enable these jobs to begin detecting anomalies in your infrastructure metrics." - id="xpack.infra.ml.anomalyFlyout.create.description" - /> - </p> - </EuiText> - </div> - + <EuiTabs> + <EuiTab isSelected={tab === 'jobs'} onClick={goToJobs}> + <FormattedMessage + defaultMessage="Jobs" + id="xpack.infra.ml.anomalyFlyout.jobsTabLabel" + /> + </EuiTab> + <EuiTab + disabled={jobIds.length === 0} + isSelected={tab === 'anomalies'} + {...anomaliesUrl} + > + <FormattedMessage + defaultMessage="Anomalies" + id="xpack.infra.ml.anomalyFlyout.anomaliesTabLabel" + /> + </EuiTab> + </EuiTabs> <EuiSpacer size="l" /> {hostJobSummaries.length > 0 && ( <> <JobsEnabledCallout hasHostJobs={hostJobSummaries.length > 0} hasK8sJobs={k8sJobSummaries.length > 0} - jobIds={jobIds} /> <EuiSpacer size="l" /> </> @@ -137,7 +151,6 @@ export const FlyoutHome = (props: Props) => { interface CalloutProps { hasHostJobs: boolean; hasK8sJobs: boolean; - jobIds: string[]; } const JobsEnabledCallout = (props: CalloutProps) => { let target = ''; @@ -162,34 +175,8 @@ const JobsEnabledCallout = (props: CalloutProps) => { pathname: '/jobs', }); - const anomaliesUrl = useLinkProps({ - app: 'ml', - pathname: `/explorer?_g=${createResultsUrl(props.jobIds)}`, - }); - return ( <> - <EuiFlexGroup gutterSize={'s'}> - <EuiFlexItem grow={false}> - <EuiButton {...manageJobsLinkProps} style={{ marginRight: 5 }}> - <FormattedMessage - defaultMessage="Manage jobs" - id="xpack.infra.ml.anomalyFlyout.manageJobs" - /> - </EuiButton> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiButton {...anomaliesUrl}> - <FormattedMessage - defaultMessage="View anomalies" - id="xpack.infra.ml.anomalyFlyout.anomaliesTabLabel" - /> - </EuiButton> - </EuiFlexItem> - </EuiFlexGroup> - - <EuiSpacer size="l" /> - <EuiCallOut size="m" color="success" @@ -202,6 +189,13 @@ const JobsEnabledCallout = (props: CalloutProps) => { } iconType="check" /> + <EuiSpacer size="l" /> + <EuiButton {...manageJobsLinkProps}> + <FormattedMessage + defaultMessage="Manage Jobs" + id="xpack.infra.ml.anomalyFlyout.manageJobs" + /> + </EuiButton> </> ); }; @@ -217,11 +211,30 @@ interface CreateJobTab { const CreateJobTab = (props: CreateJobTab) => { return ( <> - {/* <EuiSpacer size="l" /> */} + <div> + <EuiText> + <h3> + <FormattedMessage + defaultMessage="Create ML Jobs" + id="xpack.infra.ml.anomalyFlyout.create.jobsTitle" + /> + </h3> + </EuiText> + <EuiText> + <p> + <FormattedMessage + defaultMessage="Machine Learning jobs are available for the following resource types. Enable these jobs to begin detecting anomalies in your infrastructure metrics" + id="xpack.infra.ml.anomalyFlyout.create.description" + /> + </p> + </EuiText> + </div> + + <EuiSpacer size="l" /> <EuiFlexGroup gutterSize={'m'}> <EuiFlexItem> <EuiCard - isDisabled={!props.hasSetupCapabilities} + // isDisabled={props.hasSetupCapabilities} icon={<EuiIcon type={'storage'} />} // title="Hosts" title={ @@ -232,7 +245,7 @@ const CreateJobTab = (props: CreateJobTab) => { } description={ <FormattedMessage - defaultMessage="Detect anomalies for memory usage and network traffic." + defaultMessage="Detect anomalies for CPU usage, memory usage, network traffic, and load." id="xpack.infra.ml.anomalyFlyout.create.hostDescription" /> } @@ -241,7 +254,7 @@ const CreateJobTab = (props: CreateJobTab) => { {props.hasHostJobs && ( <EuiButtonEmpty onClick={props.createHosts}> <FormattedMessage - defaultMessage="Recreate jobs" + defaultMessage="Recreate Jobs" id="xpack.infra.ml.anomalyFlyout.create.recreateButton" /> </EuiButtonEmpty> @@ -249,7 +262,7 @@ const CreateJobTab = (props: CreateJobTab) => { {!props.hasHostJobs && ( <EuiButton onClick={props.createHosts}> <FormattedMessage - defaultMessage="Enable" + defaultMessage="Create Jobs" id="xpack.infra.ml.anomalyFlyout.create.createButton" /> </EuiButton> @@ -260,7 +273,7 @@ const CreateJobTab = (props: CreateJobTab) => { </EuiFlexItem> <EuiFlexItem> <EuiCard - isDisabled={!props.hasSetupCapabilities} + // isDisabled={props.hasSetupCapabilities} icon={<EuiIcon type={'logoKubernetes'} />} title={ <FormattedMessage @@ -270,7 +283,7 @@ const CreateJobTab = (props: CreateJobTab) => { } description={ <FormattedMessage - defaultMessage="Detect anomalies for memory usage and network traffic." + defaultMessage="Detect anomalies for CPU usage, memory usage, network traffic, and load." id="xpack.infra.ml.anomalyFlyout.create.k8sDescription" /> } @@ -279,7 +292,7 @@ const CreateJobTab = (props: CreateJobTab) => { {props.hasK8sJobs && ( <EuiButtonEmpty onClick={props.createK8s}> <FormattedMessage - defaultMessage="Recreate jobs" + defaultMessage="Recreate Jobs" id="xpack.infra.ml.anomalyFlyout.create.recreateButton" /> </EuiButtonEmpty> @@ -287,7 +300,7 @@ const CreateJobTab = (props: CreateJobTab) => { {!props.hasK8sJobs && ( <EuiButton onClick={props.createK8s}> <FormattedMessage - defaultMessage="Enable" + defaultMessage="Create Jobs" id="xpack.infra.ml.anomalyFlyout.create.createButton" /> </EuiButton> diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx index c327d187f6bc2..428c002da6383 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx @@ -20,7 +20,6 @@ import { useSourceViaHttp } from '../../../../../../containers/source/use_source import { useMetricK8sModuleContext } from '../../../../../../containers/ml/modules/metrics_k8s/module'; import { useMetricHostsModuleContext } from '../../../../../../containers/ml/modules/metrics_hosts/module'; import { FixedDatePicker } from '../../../../../../components/fixed_datepicker'; -import { DEFAULT_K8S_PARTITION_FIELD } from '../../../../../../containers/ml/modules/metrics_k8s/module_descriptor'; interface Props { jobType: 'hosts' | 'kubernetes'; @@ -108,7 +107,7 @@ export const JobSetupScreen = (props: Props) => { useEffect(() => { if (props.jobType === 'kubernetes') { - setPartitionField([DEFAULT_K8S_PARTITION_FIELD]); + setPartitionField(['kubernetes.namespace']); } }, [props.jobType]); From 6d8f74a128973eb6e29a85921086f1975eb958d5 Mon Sep 17 00:00:00 2001 From: Jen Huang <its.jenetic@gmail.com> Date: Thu, 1 Oct 2020 10:57:19 -0700 Subject: [PATCH 63/64] [Ingest Manager] Match package spec `dataset`->`data_stream` and `config_templates`->`policy_templates` renaming (#78699) * Match elastic/package-spec#24 `datasets`->`data_streams` property renaming * Match elastic/package-spec#24 `datasets.name`->`data_streams.dataset` property renaming * Match elastic/package-spec#24 `/dataset`->`/data_stream` directory renaming * Match elastic/package-spec#50 `config_templates`->`policy_templates` property renaming * Update API integration test fixtures (test packages) * Temporarily skip API integration tests * Temporarily skip more API integration tests * Pin to custom docker image, unskip test suites, clean up broken icon paths in test package manifests * Skip the only (yay!) failing test suite * Revert "Skip the only (yay!) failing test suite" This reverts commit 3db32e2528f16e3a659939d4d2168b26e5f931d3. * Re-skip tests and revert docker image Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- .../common/openapi/spec_oas3.json | 6 +- .../common/services/limited_package.ts | 2 +- .../package_to_package_policy.test.ts | 48 ++++++------ .../services/package_to_package_policy.ts | 16 ++-- .../ingest_manager/common/types/models/epm.ts | 14 ++-- x-pack/plugins/ingest_manager/dev_docs/epm.md | 4 +- .../dev_docs/indexing_strategy.md | 30 ++++---- .../services/validate_package_policy.test..ts | 24 +++--- .../services/validate_package_policy.ts | 20 ++--- .../step_configure_package.tsx | 16 ++-- .../ingest_manager/types/index.ts | 2 +- .../services/epm/elasticsearch/index.test.ts | 10 +-- .../services/epm/elasticsearch/index.ts | 8 +- .../ingest_pipeline/ingest_pipelines.test.ts | 16 ++-- .../elasticsearch/ingest_pipeline/install.ts | 44 +++++------ .../epm/elasticsearch/template/install.ts | 71 +++++++++--------- .../epm/elasticsearch/template/template.ts | 24 +++--- .../elasticsearch/transform/transform.test.ts | 18 ++--- .../epm/kibana/index_pattern/install.ts | 30 ++++---- .../services/epm/packages/assets.test.ts | 16 ++-- .../server/services/epm/packages/assets.ts | 6 +- .../server/services/epm/packages/install.ts | 4 +- .../services/epm/registry/index.test.ts | 4 +- .../server/services/epm/registry/index.ts | 8 +- .../server/services/package_policy.test.ts | 20 ++--- .../server/services/package_policy.ts | 14 ++-- .../ingest_manager/server/types/index.tsx | 2 +- .../apache_0.1.4.tar.gz | Bin 581243 -> 579555 bytes .../elasticsearch/ilm_policy/all_assets.json | 0 .../elasticsearch/ingest_pipeline/default.yml | 0 .../ingest_pipeline/pipeline1.yml | 0 .../ingest_pipeline/pipeline2.yml | 0 .../test_logs/fields/ecs.yml | 0 .../test_logs/fields/fields.yml | 0 .../0.1.0/data_stream/test_logs}/manifest.yml | 0 .../test_metrics/fields/ecs.yml | 0 .../test_metrics/fields/fields.yml | 0 .../test_metrics/manifest.yml | 0 .../elasticsearch/ilm_policy/all_assets.json | 0 .../elasticsearch/ingest_pipeline/default.yml | 0 .../ingest_pipeline/pipeline1.yml | 0 .../test_logs/fields/ecs.yml | 0 .../test_logs/fields/fields.yml | 0 .../test_logs/manifest.yml | 0 .../test_logs2/fields/ecs.yml | 0 .../test_logs2/fields/fields.yml | 0 .../test_logs2/manifest.yml | 0 .../test_metrics/fields/ecs.yml | 0 .../test_metrics/fields/fields.yml | 0 .../test_metrics/manifest.yml | 0 .../elasticsearch/ilm_policy/all_assets.json | 0 .../elasticsearch/ingest_pipeline/default.yml | 0 .../test_logs/fields/ecs.yml | 0 .../test_logs/fields/fields.yml | 0 .../0.1.0/data_stream}/test_logs/manifest.yml | 0 .../test_metrics/fields/ecs.yml | 0 .../test_metrics/fields/fields.yml | 0 .../test_metrics/manifest.yml | 0 .../datastreams/0.1.0/manifest.yml | 7 +- .../elasticsearch/ilm_policy/all_assets.json | 0 .../elasticsearch/ingest_pipeline/default.yml | 0 .../test_logs/fields/ecs.yml | 0 .../test_logs/fields/fields.yml | 0 .../test_logs/manifest.yml | 0 .../test_metrics/fields/ecs.yml | 0 .../test_metrics/fields/fields.yml | 0 .../test_metrics/manifest.yml | 0 .../datastreams/0.2.0/manifest.yml | 5 -- .../test/fields/fields.yml | 0 .../data_stream}/test/manifest.yml | 0 .../multiple_versions/0.1.0/manifest.yml | 9 +-- .../test/fields/fields.yml | 0 .../data_stream}/test/manifest.yml | 0 .../multiple_versions/0.2.0/manifest.yml | 9 +-- .../test/fields/fields.yml | 0 .../0.3.0/data_stream}/test/manifest.yml | 0 .../multiple_versions/0.3.0/manifest.yml | 7 +- .../test/fields/fields.yml | 0 .../0.1.0/data_stream/test}/manifest.yml | 2 +- .../test/fields/fields.yml | 0 .../test/manifest.yml | 0 .../apis/index.js | 2 +- .../apps/endpoint/index.ts | 2 +- .../apis/index.ts | 2 +- 84 files changed, 254 insertions(+), 268 deletions(-) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_logs/elasticsearch/ilm_policy/all_assets.json (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/default.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/pipeline2.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_logs/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_logs/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/{multiple_versions/0.1.0/dataset/test => all_assets/0.1.0/data_stream/test_logs}/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_metrics/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_metrics/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/{dataset => data_stream}/test_metrics/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs/elasticsearch/ilm_policy/all_assets.json (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/default.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs2/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs2/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_logs2/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_metrics/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_metrics/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/{dataset => data_stream}/test_metrics/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_logs/elasticsearch/ilm_policy/all_assets.json (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/default.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_logs/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_logs/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/{all_assets/0.1.0/dataset => datastreams/0.1.0/data_stream}/test_logs/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_metrics/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_metrics/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/{dataset => data_stream}/test_metrics/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_logs/elasticsearch/ilm_policy/all_assets.json (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_logs/elasticsearch/ingest_pipeline/default.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_logs/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_logs/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_logs/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_metrics/fields/ecs.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_metrics/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/{dataset => data_stream}/test_metrics/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/{dataset => data_stream}/test/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/{0.2.0/dataset => 0.1.0/data_stream}/test/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/{dataset => data_stream}/test/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/{0.3.0/dataset => 0.2.0/data_stream}/test/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/{dataset => data_stream}/test/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/{overrides/0.1.0/dataset => multiple_versions/0.3.0/data_stream}/test/manifest.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/{dataset => data_stream}/test/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/{datastreams/0.1.0/dataset/test_logs => overrides/0.1.0/data_stream/test}/manifest.yml (77%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/{dataset => data_stream}/test/fields/fields.yml (100%) rename x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/{dataset => data_stream}/test/manifest.yml (100%) diff --git a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json index 28a88aa2be605..a780ae5599793 100644 --- a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json +++ b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json @@ -1543,7 +1543,7 @@ } }, "format_version": "1.0.0", - "datasets": [ + "data_streams": [ { "title": "CoreDNS logs", "name": "log", @@ -1764,7 +1764,7 @@ ] } }, - "datasets": [ + "data_streams": [ { "id": "endpoint", "title": "Endpoint Events", @@ -3961,7 +3961,7 @@ "format_version": { "type": "string" }, - "datasets": { + "data_streams": { "type": "array", "items": { "type": "object", diff --git a/x-pack/plugins/ingest_manager/common/services/limited_package.ts b/x-pack/plugins/ingest_manager/common/services/limited_package.ts index 21d1dbd1556b7..8d2a251ae015e 100644 --- a/x-pack/plugins/ingest_manager/common/services/limited_package.ts +++ b/x-pack/plugins/ingest_manager/common/services/limited_package.ts @@ -7,7 +7,7 @@ import { PackageInfo, AgentPolicy, PackagePolicy } from '../types'; // Assume packages only ever include 1 config template for now export const isPackageLimited = (packageInfo: PackageInfo): boolean => { - return packageInfo.config_templates?.[0]?.multiple === false; + return packageInfo.policy_templates?.[0]?.multiple === false; }; export const doesAgentPolicyAlreadyIncludePackage = ( diff --git a/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.test.ts b/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.test.ts index 6c3559d7cc5a0..a62fcddd16e0f 100644 --- a/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.test.ts +++ b/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.test.ts @@ -34,14 +34,14 @@ describe('Ingest Manager - packageToPackagePolicy', () => { describe('packageToPackagePolicyInputs', () => { it('returns empty array for packages with no config templates', () => { expect(packageToPackagePolicyInputs(mockPackage)).toEqual([]); - expect(packageToPackagePolicyInputs({ ...mockPackage, config_templates: [] })).toEqual([]); + expect(packageToPackagePolicyInputs({ ...mockPackage, policy_templates: [] })).toEqual([]); }); it('returns empty array for packages with a config template but no inputs', () => { expect( packageToPackagePolicyInputs(({ ...mockPackage, - config_templates: [{ inputs: [] }], + policy_templates: [{ inputs: [] }], } as unknown) as PackageInfo) ).toEqual([]); }); @@ -50,13 +50,13 @@ describe('Ingest Manager - packageToPackagePolicy', () => { expect( packageToPackagePolicyInputs(({ ...mockPackage, - config_templates: [{ inputs: [{ type: 'foo' }] }], + policy_templates: [{ inputs: [{ type: 'foo' }] }], } as unknown) as PackageInfo) ).toEqual([{ type: 'foo', enabled: true, streams: [] }]); expect( packageToPackagePolicyInputs(({ ...mockPackage, - config_templates: [{ inputs: [{ type: 'foo' }, { type: 'bar' }] }], + policy_templates: [{ inputs: [{ type: 'foo' }, { type: 'bar' }] }], } as unknown) as PackageInfo) ).toEqual([ { type: 'foo', enabled: true, streams: [] }, @@ -68,12 +68,12 @@ describe('Ingest Manager - packageToPackagePolicy', () => { expect( packageToPackagePolicyInputs(({ ...mockPackage, - datasets: [ - { type: 'logs', name: 'foo', streams: [{ input: 'foo' }] }, - { type: 'logs', name: 'bar', streams: [{ input: 'bar' }] }, - { type: 'logs', name: 'bar2', streams: [{ input: 'bar' }] }, + data_streams: [ + { type: 'logs', dataset: 'foo', streams: [{ input: 'foo' }] }, + { type: 'logs', dataset: 'bar', streams: [{ input: 'bar' }] }, + { type: 'logs', dataset: 'bar2', streams: [{ input: 'bar' }] }, ], - config_templates: [ + policy_templates: [ { inputs: [{ type: 'foo' }, { type: 'bar' }], }, @@ -102,15 +102,15 @@ describe('Ingest Manager - packageToPackagePolicy', () => { expect( packageToPackagePolicyInputs(({ ...mockPackage, - datasets: [ + data_streams: [ { type: 'logs', - name: 'foo', + dataset: 'foo', streams: [{ input: 'foo', vars: [{ default: 'foo-var-value', name: 'var-name' }] }], }, { type: 'logs', - name: 'bar', + dataset: 'bar', streams: [ { input: 'bar', @@ -120,7 +120,7 @@ describe('Ingest Manager - packageToPackagePolicy', () => { }, { type: 'logs', - name: 'bar2', + dataset: 'bar2', streams: [ { input: 'bar', @@ -129,7 +129,7 @@ describe('Ingest Manager - packageToPackagePolicy', () => { ], }, ], - config_templates: [ + policy_templates: [ { inputs: [{ type: 'foo' }, { type: 'bar' }], }, @@ -173,15 +173,15 @@ describe('Ingest Manager - packageToPackagePolicy', () => { expect( packageToPackagePolicyInputs(({ ...mockPackage, - datasets: [ + data_streams: [ { type: 'logs', - name: 'foo', + dataset: 'foo', streams: [{ input: 'foo', vars: [{ default: 'foo-var-value', name: 'var-name' }] }], }, { type: 'logs', - name: 'bar', + dataset: 'bar', streams: [ { input: 'bar', @@ -191,7 +191,7 @@ describe('Ingest Manager - packageToPackagePolicy', () => { }, { type: 'logs', - name: 'bar2', + dataset: 'bar2', streams: [ { input: 'bar', @@ -201,7 +201,7 @@ describe('Ingest Manager - packageToPackagePolicy', () => { }, { type: 'logs', - name: 'disabled', + dataset: 'disabled', streams: [ { input: 'with-disabled-streams', @@ -212,7 +212,7 @@ describe('Ingest Manager - packageToPackagePolicy', () => { }, { type: 'logs', - name: 'disabled2', + dataset: 'disabled2', streams: [ { input: 'with-disabled-streams', @@ -221,7 +221,7 @@ describe('Ingest Manager - packageToPackagePolicy', () => { ], }, ], - config_templates: [ + policy_templates: [ { inputs: [ { @@ -372,13 +372,13 @@ describe('Ingest Manager - packageToPackagePolicy', () => { }); }); it('returns package policy with inputs', () => { - const mockPackageWithConfigTemplates = ({ + const mockPackageWithPolicyTemplates = ({ ...mockPackage, - config_templates: [{ inputs: [{ type: 'foo' }] }], + policy_templates: [{ inputs: [{ type: 'foo' }] }], } as unknown) as PackageInfo; expect( - packageToPackagePolicy(mockPackageWithConfigTemplates, '1', '2', 'default', 'pkgPolicy-1') + packageToPackagePolicy(mockPackageWithPolicyTemplates, '1', '2', 'default', 'pkgPolicy-1') ).toEqual({ policy_id: '1', namespace: 'default', diff --git a/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.ts b/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.ts index eab2e8ac2d745..822747916ebc5 100644 --- a/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.ts +++ b/x-pack/plugins/ingest_manager/common/services/package_to_package_policy.ts @@ -5,7 +5,7 @@ */ import { PackageInfo, - RegistryConfigTemplate, + RegistryPolicyTemplate, RegistryVarsEntry, RegistryStream, PackagePolicy, @@ -22,14 +22,14 @@ const getStreamsForInputType = ( ): Array<RegistryStream & { data_stream: { type: string; dataset: string } }> => { const streams: Array<RegistryStream & { data_stream: { type: string; dataset: string } }> = []; - (packageInfo.datasets || []).forEach((dataset) => { - (dataset.streams || []).forEach((stream) => { + (packageInfo.data_streams || []).forEach((dataStream) => { + (dataStream.streams || []).forEach((stream) => { if (stream.input === inputType) { streams.push({ ...stream, data_stream: { - type: dataset.type, - dataset: dataset.name, + type: dataStream.type, + dataset: dataStream.dataset, }, }); } @@ -46,9 +46,9 @@ export const packageToPackagePolicyInputs = (packageInfo: PackageInfo): PackageP const inputs: PackagePolicy['inputs'] = []; // Assume package will only ever ship one package policy template for now - const packagePolicyTemplate: RegistryConfigTemplate | null = - packageInfo.config_templates && packageInfo.config_templates[0] - ? packageInfo.config_templates[0] + const packagePolicyTemplate: RegistryPolicyTemplate | null = + packageInfo.policy_templates && packageInfo.policy_templates[0] + ? packageInfo.policy_templates[0] : null; // Create package policy input property diff --git a/x-pack/plugins/ingest_manager/common/types/models/epm.ts b/x-pack/plugins/ingest_manager/common/types/models/epm.ts index 8bc5d9f7210b2..d2d1f22dda3a0 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -67,8 +67,8 @@ export interface RegistryPackage { assets?: string[]; internal?: boolean; format_version: string; - datasets?: Dataset[]; - config_templates?: RegistryConfigTemplate[]; + data_streams?: RegistryDataStream[]; + policy_templates?: RegistryPolicyTemplate[]; download: string; path: string; } @@ -80,7 +80,7 @@ interface RegistryImage { size?: string; type?: string; } -export interface RegistryConfigTemplate { +export interface RegistryPolicyTemplate { name: string; title: string; description: string; @@ -127,8 +127,8 @@ export type RegistrySearchResult = Pick< | 'internal' | 'download' | 'path' - | 'datasets' - | 'config_templates' + | 'data_streams' + | 'policy_templates' >; export type ScreenshotItem = RegistryImage; @@ -174,9 +174,9 @@ export type ElasticsearchAssetTypeToParts = Record< ElasticsearchAssetParts[] >; -export interface Dataset { +export interface RegistryDataStream { type: string; - name: string; + dataset: string; title: string; release: string; streams?: RegistryStream[]; diff --git a/x-pack/plugins/ingest_manager/dev_docs/epm.md b/x-pack/plugins/ingest_manager/dev_docs/epm.md index 20209d09e6cc2..a066b6deb3bc8 100644 --- a/x-pack/plugins/ingest_manager/dev_docs/epm.md +++ b/x-pack/plugins/ingest_manager/dev_docs/epm.md @@ -26,5 +26,5 @@ When a package is installed or upgraded, certain Kibana and Elasticsearch assets ### Generation - Index templates are generated from `YAML` files contained in the package. -- There is one index template per dataset. -- For the generation of an index template, all `yml` files contained in the package subdirectory `dataset/DATASET_NAME/fields/` are used. +- There is one index template per data stream. +- For the generation of an index template, all `yml` files contained in the package subdirectory `data_stream/DATASET_NAME/fields/` are used. diff --git a/x-pack/plugins/ingest_manager/dev_docs/indexing_strategy.md b/x-pack/plugins/ingest_manager/dev_docs/indexing_strategy.md index fd7edcb7fcca0..42a0bbc218869 100644 --- a/x-pack/plugins/ingest_manager/dev_docs/indexing_strategy.md +++ b/x-pack/plugins/ingest_manager/dev_docs/indexing_strategy.md @@ -6,48 +6,48 @@ Overall documentation of Ingest Management is now maintained in the `elastic/sta Ingest Management enforces an indexing strategy to allow the system to automatically detect indices and run queries on it. In short the indexing strategy looks as following: ``` -{dataset.type}-{dataset.name}-{dataset.namespace} +{data_stream.type}-{data_stream.dataset}-{data_stream.namespace} ``` -The `{dataset.type}` can be `logs` or `metrics`. The `{dataset.namespace}` is the part where the user can use free form. The only two requirement are that it has only characters allowed in an Elasticsearch index name and does NOT contain a `-`. The `dataset` is defined by the data that is indexed. The same requirements as for the namespace apply. It is expected that the fields for type, namespace and dataset are part of each event and are constant keywords. If there is a dataset or a namespace with a `-` inside, it is recommended to replace it either by a `.` or a `_`. +The `{data_stream.type}` can be `logs` or `metrics`. The `{data_stream.namespace}` is the part where the user can use free form. The only two requirement are that it has only characters allowed in an Elasticsearch index name and does NOT contain a `-`. The `data_stream` is defined by the data that is indexed. The same requirements as for the namespace apply. It is expected that the fields for type, dataset, and namespace are part of each event and are constant keywords. If there is a dataset or a namespace with a `-` inside, it is recommended to replace it either by a `.` or a `_`. -Note: More `{dataset.type}`s might be added in the future like `traces`. +Note: More `{data_stream.type}`s might be added in the future like `traces`. This indexing strategy has a few advantages: -* Each index contains only the fields which are relevant for the dataset. This leads to more dense indices and better field completion. -* ILM policies can be applied per namespace per dataset. -* Rollups can be specified per namespace per dataset. -* Having the namespace user configurable makes setting security permissions possible. -* Having a global metrics and logs template, allows to create new indices on demand which still follow the convention. This is common in the case of k8s as an example. -* Constant keywords allow to narrow down the indices we need to access for querying very efficiently. This is especially relevant in environments which a large number of indices or with indices on slower nodes. +- Each index contains only the fields which are relevant for the datta stream. This leads to more dense indices and better field completion. +- ILM policies can be applied per namespace per data stream. +- Rollups can be specified per namespace per data stream. +- Having the namespace user configurable makes setting security permissions possible. +- Having a global metrics and logs template, allows to create new indices on demand which still follow the convention. This is common in the case of k8s as an example. +- Constant keywords allow to narrow down the indices we need to access for querying very efficiently. This is especially relevant in environments which a large number of indices or with indices on slower nodes. Overall it creates smaller indices in size, makes querying more efficient and allows users to define their own naming parts in namespace and still benefiting from all features that can be built on top of the indexing startegy. ## Ingest Pipeline -The ingest pipelines for a specific dataset will have the following naming scheme: +The ingest pipelines for a specific data stream will have the following naming scheme: ``` -{dataset.type}-{dataset.name}-{package.version} +{data_stream.type}-{data_stream.dataset}-{package.version} ``` -As an example, the ingest pipeline for the Nginx access logs is called `logs-nginx.access-3.4.1`. The same ingest pipeline is used for all namespaces. It is possible that a dataset has multiple ingest pipelines in which case a suffix is added to the name. +As an example, the ingest pipeline for the Nginx access logs is called `logs-nginx.access-3.4.1`. The same ingest pipeline is used for all namespaces. It is possible that a data stream has multiple ingest pipelines in which case a suffix is added to the name. The version is included in each pipeline to allow upgrades. The pipeline itself is listed in the index template and is automatically applied at ingest time. ## Templates & ILM Policies -To make the above strategy possible, alias templates are required. For each type there is a basic alias template with a default ILM policy. These default templates apply to all indices which follow the indexing strategy and do not have a more specific dataset alias template. +To make the above strategy possible, alias templates are required. For each type there is a basic alias template with a default ILM policy. These default templates apply to all indices which follow the indexing strategy and do not have a more specific data stream alias template. The `metrics` and `logs` alias template contain all the basic fields from ECS. Each type template contains an ILM policy. Modifying this default ILM policy will affect all data covered by the default templates. -The templates for a dataset are called as following: +The templates for a data stream are called as following: ``` -{dataset.type}-{dataset.name} +{data_stream.type}-{data_stream.dataset} ``` The pattern used inside the index template is `{type}-{dataset}-*` to match all namespaces. diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.test..ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.test..ts index aae750cb67499..d621db615f2bd 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.test..ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.test..ts @@ -7,7 +7,7 @@ import { PackageInfo, InstallationStatus, NewPackagePolicy, - RegistryConfigTemplate, + RegistryPolicyTemplate, } from '../../../../types'; import { validatePackagePolicy, validationHasErrors } from './validate_package_policy'; @@ -32,9 +32,9 @@ describe('Ingest Manager - validatePackagePolicy()', () => { }, }, status: InstallationStatus.notInstalled, - datasets: [ + data_streams: [ { - name: 'foo', + dataset: 'foo', streams: [ { input: 'foo', @@ -44,7 +44,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { ], }, { - name: 'bar', + dataset: 'bar', streams: [ { input: 'bar', @@ -59,7 +59,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { ], }, { - name: 'bar2', + dataset: 'bar2', streams: [ { input: 'bar', @@ -69,7 +69,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { ], }, { - name: 'disabled', + dataset: 'disabled', streams: [ { input: 'with-disabled-streams', @@ -80,7 +80,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { ], }, { - name: 'disabled2', + dataset: 'disabled2', streams: [ { input: 'with-disabled-streams', @@ -90,7 +90,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { ], }, ], - config_templates: [ + policy_templates: [ { name: 'pkgPolicy1', title: 'Package policy 1', @@ -465,7 +465,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { expect( validatePackagePolicy(validPackagePolicy, { ...mockPackage, - config_templates: undefined, + policy_templates: undefined, }) ).toEqual({ name: null, @@ -476,7 +476,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { expect( validatePackagePolicy(validPackagePolicy, { ...mockPackage, - config_templates: [], + policy_templates: [], }) ).toEqual({ name: null, @@ -490,7 +490,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { expect( validatePackagePolicy(validPackagePolicy, { ...mockPackage, - config_templates: [{} as RegistryConfigTemplate], + policy_templates: [{} as RegistryPolicyTemplate], }) ).toEqual({ name: null, @@ -501,7 +501,7 @@ describe('Ingest Manager - validatePackagePolicy()', () => { expect( validatePackagePolicy(validPackagePolicy, { ...mockPackage, - config_templates: [({ inputs: [] } as unknown) as RegistryConfigTemplate], + policy_templates: [({ inputs: [] } as unknown) as RegistryPolicyTemplate], }) ).toEqual({ name: null, diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.ts index 03060c5dcb20e..04cd21884e8f2 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/services/validate_package_policy.ts @@ -65,11 +65,11 @@ export const validatePackagePolicy = ( } if ( - !packageInfo.config_templates || - packageInfo.config_templates.length === 0 || - !packageInfo.config_templates[0] || - !packageInfo.config_templates[0].inputs || - packageInfo.config_templates[0].inputs.length === 0 + !packageInfo.policy_templates || + packageInfo.policy_templates.length === 0 || + !packageInfo.policy_templates[0] || + !packageInfo.policy_templates[0].inputs || + packageInfo.policy_templates[0].inputs.length === 0 ) { validationResults.inputs = null; return validationResults; @@ -78,16 +78,16 @@ export const validatePackagePolicy = ( const registryInputsByType: Record< string, RegistryInput - > = packageInfo.config_templates[0].inputs.reduce((inputs, registryInput) => { + > = packageInfo.policy_templates[0].inputs.reduce((inputs, registryInput) => { inputs[registryInput.type] = registryInput; return inputs; }, {} as Record<string, RegistryInput>); const registryStreamsByDataset: Record<string, RegistryStream[]> = ( - packageInfo.datasets || [] - ).reduce((datasets, registryDataset) => { - datasets[registryDataset.name] = registryDataset.streams || []; - return datasets; + packageInfo.data_streams || [] + ).reduce((dataStreams, registryDataStream) => { + dataStreams[registryDataStream.dataset] = registryDataStream.streams || []; + return dataStreams; }, {} as Record<string, RegistryStream[]>); // Validate each package policy input with either its own config fields or streams diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/step_configure_package.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/step_configure_package.tsx index b77153daee2fc..d3d5e60c34e58 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/step_configure_package.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_policy/create_package_policy_page/step_configure_package.tsx @@ -17,13 +17,13 @@ const findStreamsForInputType = ( ): Array<RegistryStream & { data_stream: { dataset: string } }> => { const streams: Array<RegistryStream & { data_stream: { dataset: string } }> = []; - (packageInfo.datasets || []).forEach((dataset) => { - (dataset.streams || []).forEach((stream) => { + (packageInfo.data_streams || []).forEach((dataStream) => { + (dataStream.streams || []).forEach((stream) => { if (stream.input === inputType) { streams.push({ ...stream, data_stream: { - dataset: dataset.name, + dataset: dataStream.dataset, }, }); } @@ -53,14 +53,14 @@ export const StepConfigurePackagePolicy: React.FunctionComponent<{ // Configure inputs (and their streams) // Assume packages only export one config template for now const renderConfigureInputs = () => - packageInfo.config_templates && - packageInfo.config_templates[0] && - packageInfo.config_templates[0].inputs && - packageInfo.config_templates[0].inputs.length ? ( + packageInfo.policy_templates && + packageInfo.policy_templates[0] && + packageInfo.policy_templates[0].inputs && + packageInfo.policy_templates[0].inputs.length ? ( <> <EuiHorizontalRule margin="m" /> <EuiFlexGroup direction="column" gutterSize="none"> - {packageInfo.config_templates[0].inputs.map((packageInput) => { + {packageInfo.policy_templates[0].inputs.map((packageInput) => { const packagePolicyInput = packagePolicy.inputs.find( (input) => input.type === packageInput.type ); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts index 71a44089b8bf7..e825448f359d6 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts @@ -89,7 +89,7 @@ export { RegistryVarsEntry, RegistryInput, RegistryStream, - RegistryConfigTemplate, + RegistryPolicyTemplate, PackageList, PackageListItem, PackagesGroupedByStatus, diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.test.ts index bdd8883ea29c2..78aa17da5030c 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.test.ts @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dataset } from '../../../types'; -import { getDatasetAssetBaseName } from './index'; +import { RegistryDataStream } from '../../../types'; +import { getRegistryDataStreamAssetBaseName } from './index'; test('getBaseName', () => { - const dataset: Dataset = { - name: 'nginx.access', + const dataStream: RegistryDataStream = { + dataset: 'nginx.access', title: 'Nginx Acess Logs', release: 'beta', type: 'logs', @@ -17,6 +17,6 @@ test('getBaseName', () => { package: 'nginx', path: 'access', }; - const name = getDatasetAssetBaseName(dataset); + const name = getRegistryDataStreamAssetBaseName(dataStream); expect(name).toStrictEqual('logs-nginx.access'); }); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.ts index 0cb09ba054bf1..17cd28cc8a081 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/index.ts @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dataset } from '../../../types'; +import { RegistryDataStream } from '../../../types'; /** * Creates the base name for Elasticsearch assets in the form of - * {type}-{id} + * {type}-{dataset} */ -export function getDatasetAssetBaseName(dataset: Dataset): string { - return `${dataset.type}-${dataset.name}`; +export function getRegistryDataStreamAssetBaseName(dataStream: RegistryDataStream): string { + return `${dataStream.type}-${dataStream.dataset}`; } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/ingest_pipelines.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/ingest_pipelines.test.ts index 36a19c512a8b4..378dd271779b4 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/ingest_pipelines.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/ingest_pipelines.test.ts @@ -7,7 +7,7 @@ import { readFileSync } from 'fs'; import path from 'path'; import { rewriteIngestPipeline, getPipelineNameForInstallation } from './install'; -import { Dataset } from '../../../../types'; +import { RegistryDataStream } from '../../../../types'; test('a json-format pipeline with pipeline references is correctly rewritten', () => { const inputStandard = readFileSync( @@ -106,8 +106,8 @@ test('a yml-format pipeline with no pipeline references stays unchanged', () => }); test('getPipelineNameForInstallation gets correct name', () => { - const dataset: Dataset = { - name: 'coredns.log', + const dataStream: RegistryDataStream = { + dataset: 'coredns.log', title: 'CoreDNS logs', release: 'ga', type: 'logs', @@ -118,19 +118,19 @@ test('getPipelineNameForInstallation gets correct name', () => { const packageVersion = '1.0.1'; const pipelineRefName = 'pipeline-json'; const pipelineEntryNameForInstallation = getPipelineNameForInstallation({ - pipelineName: dataset.ingest_pipeline, - dataset, + pipelineName: dataStream.ingest_pipeline, + dataStream, packageVersion, }); const pipelineRefNameForInstallation = getPipelineNameForInstallation({ pipelineName: pipelineRefName, - dataset, + dataStream, packageVersion, }); expect(pipelineEntryNameForInstallation).toBe( - `${dataset.type}-${dataset.name}-${packageVersion}` + `${dataStream.type}-${dataStream.dataset}-${packageVersion}` ); expect(pipelineRefNameForInstallation).toBe( - `${dataset.type}-${dataset.name}-${packageVersion}-${pipelineRefName}` + `${dataStream.type}-${dataStream.dataset}-${packageVersion}-${pipelineRefName}` ); }); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts index 878c6ea8f2804..6088bcb71f878 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts @@ -7,7 +7,7 @@ import { SavedObjectsClientContract } from 'src/core/server'; import { EsAssetReference, - Dataset, + RegistryDataStream, ElasticsearchAssetType, RegistryPackage, } from '../../../../types'; @@ -30,17 +30,19 @@ export const installPipelines = async ( // unlike other ES assets, pipeline names are versioned so after a template is updated // it can be created pointing to the new template, without removing the old one and effecting data // so do not remove the currently installed pipelines here - const datasets = registryPackage.datasets; - if (!datasets?.length) return []; + const dataStreams = registryPackage.data_streams; + if (!dataStreams?.length) return []; const pipelinePaths = paths.filter((path) => isPipeline(path)); // get and save pipeline refs before installing pipelines - const pipelineRefs = datasets.reduce<EsAssetReference[]>((acc, dataset) => { - const filteredPaths = pipelinePaths.filter((path) => isDatasetPipeline(path, dataset.path)); + const pipelineRefs = dataStreams.reduce<EsAssetReference[]>((acc, dataStream) => { + const filteredPaths = pipelinePaths.filter((path) => + isDataStreamPipeline(path, dataStream.path) + ); const pipelineObjectRefs = filteredPaths.map((path) => { const { name } = getNameAndExtension(path); const nameForInstallation = getPipelineNameForInstallation({ pipelineName: name, - dataset, + dataStream, packageVersion: registryPackage.version, }); return { id: nameForInstallation, type: ElasticsearchAssetType.ingestPipeline }; @@ -49,11 +51,11 @@ export const installPipelines = async ( return acc; }, []); await saveInstalledEsRefs(savedObjectsClient, registryPackage.name, pipelineRefs); - const pipelines = datasets.reduce<Array<Promise<EsAssetReference[]>>>((acc, dataset) => { - if (dataset.ingest_pipeline) { + const pipelines = dataStreams.reduce<Array<Promise<EsAssetReference[]>>>((acc, dataStream) => { + if (dataStream.ingest_pipeline) { acc.push( - installPipelinesForDataset({ - dataset, + installPipelinesForDataStream({ + dataStream, callCluster, paths: pipelinePaths, pkgVersion: registryPackage.version, @@ -86,18 +88,18 @@ export function rewriteIngestPipeline( return pipeline; } -export async function installPipelinesForDataset({ +export async function installPipelinesForDataStream({ callCluster, pkgVersion, paths, - dataset, + dataStream, }: { callCluster: CallESAsCurrentUser; pkgVersion: string; paths: string[]; - dataset: Dataset; + dataStream: RegistryDataStream; }): Promise<EsAssetReference[]> { - const pipelinePaths = paths.filter((path) => isDatasetPipeline(path, dataset.path)); + const pipelinePaths = paths.filter((path) => isDataStreamPipeline(path, dataStream.path)); let pipelines: any[] = []; const substitutions: RewriteSubstitution[] = []; @@ -105,7 +107,7 @@ export async function installPipelinesForDataset({ const { name, extension } = getNameAndExtension(path); const nameForInstallation = getPipelineNameForInstallation({ pipelineName: name, - dataset, + dataStream, packageVersion: pkgVersion, }); const content = Registry.getAsset(path).toString('utf-8'); @@ -175,13 +177,13 @@ async function installPipeline({ const isDirectory = ({ path }: Registry.ArchiveEntry) => path.endsWith('/'); -const isDatasetPipeline = (path: string, datasetName: string) => { +const isDataStreamPipeline = (path: string, dataStreamDataset: string) => { const pathParts = Registry.pathParts(path); return ( !isDirectory({ path }) && pathParts.type === ElasticsearchAssetType.ingestPipeline && pathParts.dataset !== undefined && - datasetName === pathParts.dataset + dataStreamDataset === pathParts.dataset ); }; const isPipeline = (path: string) => { @@ -206,15 +208,15 @@ const getNameAndExtension = ( export const getPipelineNameForInstallation = ({ pipelineName, - dataset, + dataStream, packageVersion, }: { pipelineName: string; - dataset: Dataset; + dataStream: RegistryDataStream; packageVersion: string; }): string => { - const isPipelineEntry = pipelineName === dataset.ingest_pipeline; + const isPipelineEntry = pipelineName === dataStream.ingest_pipeline; const suffix = isPipelineEntry ? '' : `-${pipelineName}`; // if this is the pipeline entry, don't add a suffix - return `${dataset.type}-${dataset.name}-${packageVersion}${suffix}`; + return `${dataStream.type}-${dataStream.dataset}-${packageVersion}${suffix}`; }; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts index f4e8c3bfd99d3..8f80feb268910 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts @@ -7,7 +7,7 @@ import Boom from 'boom'; import { SavedObjectsClientContract } from 'src/core/server'; import { - Dataset, + RegistryDataStream, RegistryPackage, ElasticsearchAssetType, TemplateRef, @@ -38,29 +38,32 @@ export const installTemplates = async ( registryPackage.name, ElasticsearchAssetType.indexTemplate ); - // build templates per dataset from yml files - const datasets = registryPackage.datasets; - if (!datasets) return []; + // build templates per data stream from yml files + const dataStreams = registryPackage.data_streams; + if (!dataStreams) return []; // get template refs to save - const installedTemplateRefs = datasets.map((dataset) => ({ - id: generateTemplateName(dataset), + const installedTemplateRefs = dataStreams.map((dataStream) => ({ + id: generateTemplateName(dataStream), type: ElasticsearchAssetType.indexTemplate, })); // add package installation's references to index templates await saveInstalledEsRefs(savedObjectsClient, registryPackage.name, installedTemplateRefs); - if (datasets) { - const installTemplatePromises = datasets.reduce<Array<Promise<TemplateRef>>>((acc, dataset) => { - acc.push( - installTemplateForDataset({ - pkg: registryPackage, - callCluster, - dataset, - }) - ); - return acc; - }, []); + if (dataStreams) { + const installTemplatePromises = dataStreams.reduce<Array<Promise<TemplateRef>>>( + (acc, dataStream) => { + acc.push( + installTemplateForDataStream({ + pkg: registryPackage, + callCluster, + dataStream, + }) + ); + return acc; + }, + [] + ); const res = await Promise.all(installTemplatePromises); const installedTemplates = res.flat(); @@ -158,25 +161,25 @@ const isComponentTemplate = (path: string) => { }; /** - * installTemplatesForDataset installs one template for each dataset + * installTemplateForDataStream installs one template for each data stream * - * The template is currently loaded with the pkgey-package-dataset + * The template is currently loaded with the pkgkey-package-data_stream */ -export async function installTemplateForDataset({ +export async function installTemplateForDataStream({ pkg, callCluster, - dataset, + dataStream, }: { pkg: RegistryPackage; callCluster: CallESAsCurrentUser; - dataset: Dataset; + dataStream: RegistryDataStream; }): Promise<TemplateRef> { - const fields = await loadFieldsFromYaml(pkg, dataset.path); + const fields = await loadFieldsFromYaml(pkg, dataStream.path); return installTemplate({ callCluster, fields, - dataset, + dataStream, packageVersion: pkg.version, packageName: pkg.name, }); @@ -237,7 +240,7 @@ function buildComponentTemplates(registryElasticsearch: RegistryElasticsearch | return { settingsTemplate, mappingsTemplate }; } -async function installDatasetComponentTemplates( +async function installDataStreamComponentTemplates( templateName: string, registryElasticsearch: RegistryElasticsearch | undefined, callCluster: CallESAsCurrentUser @@ -277,35 +280,35 @@ async function installDatasetComponentTemplates( export async function installTemplate({ callCluster, fields, - dataset, + dataStream, packageVersion, packageName, }: { callCluster: CallESAsCurrentUser; fields: Field[]; - dataset: Dataset; + dataStream: RegistryDataStream; packageVersion: string; packageName: string; }): Promise<TemplateRef> { const mappings = generateMappings(processFields(fields)); - const templateName = generateTemplateName(dataset); + const templateName = generateTemplateName(dataStream); let pipelineName; - if (dataset.ingest_pipeline) { + if (dataStream.ingest_pipeline) { pipelineName = getPipelineNameForInstallation({ - pipelineName: dataset.ingest_pipeline, - dataset, + pipelineName: dataStream.ingest_pipeline, + dataStream, packageVersion, }); } - const composedOfTemplates = await installDatasetComponentTemplates( + const composedOfTemplates = await installDataStreamComponentTemplates( templateName, - dataset.elasticsearch, + dataStream.elasticsearch, callCluster ); const template = getTemplate({ - type: dataset.type, + type: dataStream.type, templateName, mappings, pipelineName, diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts index 71e49acf1766f..00c2e873ba129 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts @@ -6,13 +6,13 @@ import { Field, Fields } from '../../fields/field'; import { - Dataset, + RegistryDataStream, CallESAsCurrentUser, TemplateRef, IndexTemplate, IndexTemplateMappings, } from '../../../../types'; -import { getDatasetAssetBaseName } from '../index'; +import { getRegistryDataStreamAssetBaseName } from '../index'; interface Properties { [key: string]: any; @@ -222,22 +222,24 @@ function getDefaultProperties(field: Field): Properties { /** * Generates the template name out of the given information */ -export function generateTemplateName(dataset: Dataset): string { - return getDatasetAssetBaseName(dataset); +export function generateTemplateName(dataStream: RegistryDataStream): string { + return getRegistryDataStreamAssetBaseName(dataStream); } /** - * Returns a map of the dataset path fields to elasticsearch index pattern. - * @param datasets an array of Dataset objects + * Returns a map of the data stream path fields to elasticsearch index pattern. + * @param dataStreams an array of RegistryDataStream objects */ -export function generateESIndexPatterns(datasets: Dataset[] | undefined): Record<string, string> { - if (!datasets) { +export function generateESIndexPatterns( + dataStreams: RegistryDataStream[] | undefined +): Record<string, string> { + if (!dataStreams) { return {}; } const patterns: Record<string, string> = {}; - for (const dataset of datasets) { - patterns[dataset.path] = generateTemplateName(dataset) + '-*'; + for (const dataStream of dataStreams) { + patterns[dataStream.path] = generateTemplateName(dataStream) + '-*'; } return patterns; } @@ -389,7 +391,7 @@ const updateExistingIndex = async ({ }) => { const { settings, mappings } = indexTemplate.template; - // for now, remove from object so as not to update stream or dataset properties of the index until type and name + // for now, remove from object so as not to update stream or data stream properties of the index until type and name // are added in https://github.com/elastic/kibana/issues/66551. namespace value we will continue // to skip updating and assume the value in the index mapping is correct delete mappings.properties.stream; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/transform.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/transform.test.ts index 7cb507d15679e..768c6af1d8915 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/transform.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/transform.test.ts @@ -114,10 +114,10 @@ describe('test transform install', () => { ({ name: 'endpoint', version: '0.16.0-dev.0', - datasets: [ + data_streams: [ { type: 'metrics', - name: 'endpoint.metadata', + dataset: 'endpoint.metadata', title: 'Endpoint Metadata', release: 'experimental', package: 'endpoint', @@ -131,7 +131,7 @@ describe('test transform install', () => { }, { type: 'metrics', - name: 'endpoint.metadata_current', + dataset: 'endpoint.metadata_current', title: 'Endpoint Metadata Current', release: 'experimental', package: 'endpoint', @@ -146,7 +146,7 @@ describe('test transform install', () => { ], } as unknown) as RegistryPackage, [ - 'endpoint-0.16.0-dev.0/dataset/policy/elasticsearch/ingest_pipeline/default.json', + 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', ], @@ -302,10 +302,10 @@ describe('test transform install', () => { ({ name: 'endpoint', version: '0.16.0-dev.0', - datasets: [ + data_streams: [ { type: 'metrics', - name: 'endpoint.metadata_current', + dataset: 'endpoint.metadata_current', title: 'Endpoint Metadata', release: 'experimental', package: 'endpoint', @@ -404,10 +404,10 @@ describe('test transform install', () => { ({ name: 'endpoint', version: '0.16.0-dev.0', - datasets: [ + data_streams: [ { type: 'metrics', - name: 'endpoint.metadata', + dataset: 'endpoint.metadata', title: 'Endpoint Metadata', release: 'experimental', package: 'endpoint', @@ -421,7 +421,7 @@ describe('test transform install', () => { }, { type: 'metrics', - name: 'endpoint.metadata_current', + dataset: 'endpoint.metadata_current', title: 'Endpoint Metadata Current', release: 'experimental', package: 'endpoint', diff --git a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts index 7fe3713e186ee..bde542412f123 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts @@ -122,8 +122,8 @@ export async function installIndexPatterns( return; } - // get all dataset fields from all installed packages - const fields = await getAllDatasetFieldsByType(installedPackagesInfo, indexPatternType); + // get all data stream fields from all installed packages + const fields = await getAllDataStreamFieldsByType(installedPackagesInfo, indexPatternType); const kibanaIndexPattern = createIndexPattern(indexPatternType, fields); // create or overwrite the index pattern @@ -135,23 +135,27 @@ export async function installIndexPatterns( } // loops through all given packages and returns an array -// of all fields from all datasets matching datasetType -export const getAllDatasetFieldsByType = async ( +// of all fields from all data streams matching data stream type +export const getAllDataStreamFieldsByType = async ( packages: RegistryPackage[], - datasetType: IndexPatternType + dataStreamType: IndexPatternType ): Promise<Fields> => { - const datasetsPromises = packages.reduce<Array<Promise<Field[]>>>((acc, pkg) => { - if (pkg.datasets) { - // filter out datasets by datasetType - const matchingDatasets = pkg.datasets.filter((dataset) => dataset.type === datasetType); - matchingDatasets.forEach((dataset) => acc.push(loadFieldsFromYaml(pkg, dataset.path))); + const dataStreamsPromises = packages.reduce<Array<Promise<Field[]>>>((acc, pkg) => { + if (pkg.data_streams) { + // filter out data streams by data stream type + const matchingDataStreams = pkg.data_streams.filter( + (dataStream) => dataStream.type === dataStreamType + ); + matchingDataStreams.forEach((dataStream) => + acc.push(loadFieldsFromYaml(pkg, dataStream.path)) + ); } return acc; }, []); - // get all the datasets for each installed package into one array - const allDatasetFields: Fields[] = await Promise.all(datasetsPromises); - return allDatasetFields.flat(); + // get all the data stream fields for each installed package into one array + const allDataStreamFields: Fields[] = await Promise.all(dataStreamsPromises); + return allDataStreamFields.flat(); }; // creates or updates index pattern diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts index 6d5ca036aeb13..78b42b03be831 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts @@ -11,8 +11,8 @@ const tests = [ { package: { assets: [ - '/package/coredns/1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns/1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-json.json', + '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', ], path: '/package/coredns/1.0.1', }, @@ -21,15 +21,15 @@ const tests = [ return true; }, expected: [ - '/package/coredns/1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns/1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-json.json', + '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', ], }, { package: { assets: [ - '/package/coredns-1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns-1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-json.json', + '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', ], path: '/package/coredns/1.0.1', }, @@ -43,8 +43,8 @@ const tests = [ { package: { assets: [ - '/package/coredns-1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns-1.0.1/dataset/log/elasticsearch/ingest-pipeline/pipeline-json.json', + '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', ], }, // Filter which does not exist diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts index 19a023eb2ad4c..a8abc12917781 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts @@ -9,9 +9,9 @@ import * as Registry from '../registry'; import { ensureCachedArchiveInfo } from '../registry'; // paths from RegistryPackage are routes to the assets on EPR -// e.g. `/package/nginx/1.2.0/dataset/access/fields/fields.yml` +// e.g. `/package/nginx/1.2.0/data_stream/access/fields/fields.yml` // paths for ArchiveEntry are routes to the assets in the archive -// e.g. `nginx-1.2.0/dataset/access/fields/fields.yml` +// e.g. `nginx-1.2.0/data_stream/access/fields/fields.yml` // RegistryPackage paths have a `/package/` prefix compared to ArchiveEntry paths // and different package and version structure const EPR_PATH_PREFIX = '/package'; @@ -37,7 +37,7 @@ export function getAssets( // if dataset, filter for them if (datasetName) { - const comparePath = `${packageInfo.path}/dataset/${datasetName}/`; + const comparePath = `${packageInfo.path}/data_stream/${datasetName}/`; if (!path.includes(comparePath)) { continue; } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts index d501b05d96c1c..d7262ebb66b2e 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts @@ -259,7 +259,7 @@ export async function installPackage({ const removable = !isRequiredPackage(pkgName); const { internal = false } = registryPackageInfo; - const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.datasets); + const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.data_streams); // add the package installation to the saved object. // if some installation already exists, just update install info @@ -304,7 +304,7 @@ export async function installPackage({ // currently only the base package has an ILM policy // at some point ILM policies can be installed/modified - // per dataset and we should then save them + // per data stream and we should then save them await installILMPolicy(paths, callCluster); // installs versionized pipelines without removing currently installed ones diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts index b40638eefbae2..2fd9175549026 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts @@ -41,11 +41,11 @@ const testPaths = [ }, }, { - path: 'coredns-1.0.1/dataset/stats/fields/coredns.stats.yml', + path: 'coredns-1.0.1/data_stream/stats/fields/coredns.stats.yml', assetParts: { dataset: 'stats', file: 'coredns.stats.yml', - path: 'coredns-1.0.1/dataset/stats/fields/coredns.stats.yml', + path: 'coredns-1.0.1/data_stream/stats/fields/coredns.stats.yml', pkgkey: 'coredns-1.0.1', service: '', type: 'fields', diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts index 96f7530641390..22f1b670b2cc4 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts @@ -158,12 +158,12 @@ export function pathParts(path: string): AssetParts { let [pkgkey, service, type, file] = path.split('/'); - // if it's a dataset - if (service === 'dataset') { + // if it's a data stream + if (service === 'data_stream') { // save the dataset name dataset = type; - // drop the `dataset/dataset-name` portion & re-parse - [pkgkey, service, type, file] = path.replace(`dataset/${dataset}/`, '').split('/'); + // drop the `data_stream/dataset-name` portion & re-parse + [pkgkey, service, type, file] = path.replace(`data_stream/${dataset}/`, '').split('/'); } // This is to cover for the fields.yml files inside the "fields" directory diff --git a/x-pack/plugins/ingest_manager/server/services/package_policy.test.ts b/x-pack/plugins/ingest_manager/server/services/package_policy.test.ts index 0d89c52957632..6064e5bae0634 100644 --- a/x-pack/plugins/ingest_manager/server/services/package_policy.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/package_policy.test.ts @@ -45,14 +45,14 @@ describe('Package policy service', () => { it('should work with config variables from the stream', async () => { const inputs = await packagePolicyService.assignPackageStream( ({ - datasets: [ + data_streams: [ { type: 'logs', - name: 'package.dataset1', + dataset: 'package.dataset1', streams: [{ input: 'log', template_path: 'some_template_path.yml' }], }, ], - config_templates: [ + policy_templates: [ { inputs: [{ type: 'log' }], }, @@ -64,7 +64,7 @@ describe('Package policy service', () => { enabled: true, streams: [ { - id: 'dataset01', + id: 'datastream01', data_stream: { dataset: 'package.dataset1', type: 'logs' }, enabled: true, vars: { @@ -84,7 +84,7 @@ describe('Package policy service', () => { enabled: true, streams: [ { - id: 'dataset01', + id: 'datastream01', data_stream: { dataset: 'package.dataset1', type: 'logs' }, enabled: true, vars: { @@ -106,14 +106,14 @@ describe('Package policy service', () => { it('should work with config variables at the input level', async () => { const inputs = await packagePolicyService.assignPackageStream( ({ - datasets: [ + data_streams: [ { - name: 'package.dataset1', + dataset: 'package.dataset1', type: 'logs', streams: [{ input: 'log', template_path: 'some_template_path.yml' }], }, ], - config_templates: [ + policy_templates: [ { inputs: [{ type: 'log' }], }, @@ -130,7 +130,7 @@ describe('Package policy service', () => { }, streams: [ { - id: 'dataset01', + id: 'datastream01', data_stream: { dataset: 'package.dataset1', type: 'logs' }, enabled: true, }, @@ -150,7 +150,7 @@ describe('Package policy service', () => { }, streams: [ { - id: 'dataset01', + id: 'datastream01', data_stream: { dataset: 'package.dataset1', type: 'logs' }, enabled: true, compiled_stream: { diff --git a/x-pack/plugins/ingest_manager/server/services/package_policy.ts b/x-pack/plugins/ingest_manager/server/services/package_policy.ts index 3a02544250ff0..d91f6e8580fc3 100644 --- a/x-pack/plugins/ingest_manager/server/services/package_policy.ts +++ b/x-pack/plugins/ingest_manager/server/services/package_policy.ts @@ -375,19 +375,19 @@ async function _assignPackageStreamToStream( return { ...stream, compiled_stream: undefined }; } const datasetPath = getDataset(stream.data_stream.dataset); - const packageDatasets = pkgInfo.datasets; - if (!packageDatasets) { - throw new Error('Stream template not found, no datasets'); + const packageDataStreams = pkgInfo.data_streams; + if (!packageDataStreams) { + throw new Error('Stream template not found, no data streams'); } - const packageDataset = packageDatasets.find( - (pkgDataset) => pkgDataset.name === stream.data_stream.dataset + const packageDataStream = packageDataStreams.find( + (pkgDataStream) => pkgDataStream.dataset === stream.data_stream.dataset ); - if (!packageDataset) { + if (!packageDataStream) { throw new Error(`Stream template not found, unable to find dataset ${datasetPath}`); } - const streamFromPkg = (packageDataset.streams || []).find( + const streamFromPkg = (packageDataStream.streams || []).find( (pkgStream) => pkgStream.input === input.type ); if (!streamFromPkg) { diff --git a/x-pack/plugins/ingest_manager/server/types/index.tsx b/x-pack/plugins/ingest_manager/server/types/index.tsx index b43d6355c479a..fc5ba1af196ad 100644 --- a/x-pack/plugins/ingest_manager/server/types/index.tsx +++ b/x-pack/plugins/ingest_manager/server/types/index.tsx @@ -45,7 +45,7 @@ export { InstallationStatus, PackageInfo, RegistryVarsEntry, - Dataset, + RegistryDataStream, RegistryElasticsearch, AssetReference, EsAssetReference, diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_0.1.4.tar.gz b/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_0.1.4.tar.gz index cc983f6ac6d1aa53ac1b4a5b38b020a072a2326a..9cc4009d35c31da9e555cc98a0235f55efcf565e 100644 GIT binary patch delta 461888 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¨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%0Acucd;*@(zH6@Ggf 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ν6$7bzm2snIHKH6N~@Z(e@G$i!`CnBb0R+f=pBI9 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 N-*nG%1;Ym}1^@|_VI%+m delta 463579 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 (){+O1OWLm%-H7#Z$^0-#vaFJ_N2-j=VfQJr)@$ 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�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�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%0A7B! z-&?6uDjOIuURx20r`jQXySwG_xaRYQc7;Y)#_#nm!0p64KB;rano6805B^qsAuaK0 za&@hy!pqTAI>I&w$Dc#9$qy}JP8i>Q;m1Kt3r<N2!ABWm?>qHY%HZDGY+fp>gMNRj zr|#0eHBn|!mfF-xvKY1H=UFcpJ72J>i`8X%BfEldMlElN+-Ksr5Ld$cQ5djvjbS5$ zgwh?7tkAP{?CoWMN@9^bMPPZP@)4Gio{{)dZ8U;qbSq3Zx4r!=<|_o-7fiU!_(rYc zd)A~uMj2khmU64_OJ#z2*+RZ6il%?cm|OG@9DNCmDVl6HXvi}ar}BDM(Hvbm<KEX% z<3`0#J>gSL^QJ|r?lx%mj2UifeaeX*^t<M8ddCX0kwg}l2P%`RJV=(S3eR?r`Cfo) zSG1aav8?!J>v~^$eXX1E;I+>n8qr~O)Q`sfBMO8EbNXAV183aUWi9L;8UBB=*r&Os zJ5&Esbg-Oz?H-G0cG-MAkyXW4(i8$Pwl@3se%it#^V8T57;`iB;JZ}EZ2tNfeFWJ* z;_Vy;Hr~~|8uR_5YV)bPA5ZQ>BXB6vcQgz%gZ9TqWnwMHpb<?ghmClRXy+{QahGhW zzLP)GiL<WHS2@&0-US6>eAj<%uiW_z$Gi^_a7;geQUT;W)qh%Xx&|44vb#rc#7~wN zNrGDaFiw8vxHLQsXw>8n*HQn5npHtZ6H(9`xSt+iz$rcDd2eptb8r^?2>T8@tTDXZ z{7Yhp)<HI39BxLXHyy;wY>!b@#pa0b9pj5B0G(y1N|Zq>m*m9jAdP=~wp?VH=3%vC zOpG}!02l28!)hFw@3t=#{NfuY7=k@~B2Z~?O&2=Q9lBbN7|#XtT07(u%T)9mL+ae* zW|73RjD+2?*M@pZL=r0z9o&pl_7)q7H~18_iZ7yWFE$GLVYK;}z|x?r>kSerA$fCa z21_cJunz^4;3p8@;HZBO504@~L~BN450dSs=H)=!`W!kB_B(Fha`WMOCv;1Pj`8BC zbK|-WjU|gl6LDdwm?X3F4xqpyHnkLHDwrnfc4q7YB*bL1pekR@$#?gzEzypM?$O<@ zRlp8p>h^ijKdm6biEu(+WA5|{OO6Rw!>Lt%z3d0%yq~)^vT=XRESls6Sk$@tLWna; z_a<LaUw`on&dH{{8EWS-qo!7qo@<xMN=n*)f8za!6}Fom^ZSkM$G~#b(PEW0_-<tz zRl>m^LEIDe?1`VN*_b)Sn?I8(Q8j;1g2`@6C4|QP<HK4|zWoSGF@ZpC)=!#|u9&#J z)kd|E9$l+v3weKb;U<v(s{PeAy4u@?<lPnZ$*`HFY+W{?!dRYpjyHtauF<W-Y~4GW z(VrlS17J92e$`KSGa_ssHR8Mg%VmqinDZ2@zgDuUl={d`3+>X7+}AS0sIm2HE+tH& zdT_n4j9S|?n|>+k@OWXTSf-qNe74#mv+k*Ag{>uE$y0x~AUo>zBr!@Loo-p|RXW*a z_C`?ErMXIZ(MckY;EejlUCfTn=TJ}7?j&qMts#C@06wUn-t$6Gx+f@1PUKJNZ`9X$ z?T4X$;Wp1aS)O5WyC@eb#kim3<QI*gcQ!~%zkZa`=x?b5+?8;fFROPD=MQTbOgV~h z63?NJ`nP{VN0yT(+)WxZ`hF#oms_%tfyzXEP1m^5&3D-@h1I#^iRVA6V{=bdg?0rB zNbI1$+8IzlW1R@epS^hyWC%BF(8-}2lV@3OX1~k~Eht)K%kQyq4?z{Js$`?k0A}O9 zB3is@;9MI}{(-XQhxl9w@YWV>(zg{8vKb4s5uJZK{+gsNj2brvI_w3*U)t{7{`e6( zJt?<xbr2D%VjUl#MOBt%uMNK?BDqiCDzy^Z0>Xx~)5=y>4AfjvfAQCx^+>uGwjgBi zN#T`9CTnh1J1`>#`78om)$@~=PvUF@mO08dm&ck9Y*UN@Y(tWMoz-Vi@9oZ%M<`v+ zI8uKJ8jLfHkw~Qmm`TrN$DSe4#og+1g2_(hy0{8n6@}B~^1s|^Pvc|+yq?RI7dq6^ zifG={TU<BJY$ks;%4^sT3qN*l5cswg)WCXQr<3!$4NA!y{kZZP(dy&i1WgSdXOq=r z@ufNHw=P;%G?0ypCtqea=$-rqWxW&lFsFZ>yM&w5rcDYpEb%1&8qD)obCF~!CG`Ka zhTJ7=<KIS`TA1ejsx{rTAmUT4uGyv+#^$!<k`2#^ly7s0w(`Siu{(J{1i`~tetHdy zl<j0LF>d}})FK7oc)UQ(W;F-(r7oB5ZLP&2Pr@jHfrIu9b)NrWo%~^ZeB5cA9ut45 z2FP_S1HA`at;%LzyZyRWh_x&~tU1RcBs4G7)Yb0T9vrO=<a^b$pJLHKOqqX>VHCOR z_<HY{+)CID(vbUtSHgFr)>V`1X34gn>Pl_4Ufx>TZGE?F`y_QQ{0f2$!Bv-op;^$d zW7B4_JaX+|PRJ;)#y)q`X!eV9nJ<4SEFV`|b=S*mBkBQxRN+>gL&@qcImN8o6jYPd z(Y7LE!KBsFxF~wF;2?dSTyV-F<Jgf_Ya;cto$A6vWNaIo?<%6Mbw!Xt<I}hX8B*B+ zN~|XyY~_)f29(`Yrg!D<hTH=`ZC6s}Si|F)gh!HX6jQU=xv!Y?99*~VWuAYTZrmt0 zME`;*))<CI%Zo%1_IYr+Fi_Dg9wKwM&$W?vDxM~gO#uN8Gh73MDP$uLa}Gr|!kn7H z?XrJXFsEhXB&3S|j62>hm<g@7w13Z^91$Hz;Y>b}UrZ5LZ1VREk^SyH)^!_|12|x$ zlt8wMsGT8^EA!Pm;e7~$WBPyDE)rniQ^{*G%KtYuC6q&=m{Y@lUBkZwm$EJYcQ9v( zW_XnL6-(aa?~n`QpQ8vMG=aDGFT@anGG8np$3R<^E9URyP9D|pNFxVF{2c19tSsOw zguB0$(hl3-*(8r}K#qZ%F-{xC-{GD%l>Ll!=hA#E0k?CN$Ik<czaf8JH<^5=y`jaW z2OjXN^+vl}6U1)h-yHsds;2v?QYNpa6Z8r+X)4(NFG_2C2zUR*W;7$OziY~4KJoUH zBT;A!{I#fxYp}I970ofQ<Nbfv*!|NSJE}Iazt;>X9*|?uWGAXg^mmOl`Jbs8Ymrf` z|AKirAWvV*?a2GC{|kTS{l~c)zI1i?--FPMW_YAwho69#bc9&nfM8U8_&j+CZ(VHC z9yT7k`={<&TDr(UA>{02fniLQq^UgFQiHclzrFm@EJbZuWzlcr9UK#;@2!SkE$Yv2 z?+s4*r94_V9~QM-!8zm&PDu@CW%+-84V#>#daIdlxW2*Z+4z6SEmkKIS);dl;dgN= zrNMgY?~=d<&3|*7fE)vMZj#gsRD8_f?QO#Y14R@%*=aZ3eVcl#xOV!daQs|#J3H(n z+rdBEB*CGfW8IVMPV1}1PgLqia6(Lk2uQe*{TvmgAk75wxP!;9d@YAQ!yc1_H*m$1 zc(QjY`~|(1A0vOp1Wh`UW?tba)-{d9Y?v^Sbg?vagL#sxOZy!>%XGs6y^2{Agv4Ih zX0hnGya&)ac4wi=9TiS}sbUKS=MRzmfDQPpgsl5SQ?k`~Ti)U%1;&jkF2B3vt>`lm z;0O<4yC~1Wrr<Ur%WmJdBt@QXzK#_oFX16oGrsV>ZLEJV0`L5^b1F|b-rQ>y3bxdW z!p{WH#%WdG`ITGbcv1)m!^4(|l**L5fbHt7K0jR$fpNV=DgGnyBTt!p`})H;FdLko z!$Q7;N;;Zpda$B6EPZcId44B^CH<$-WZU)_Yp3a5S9Z*nVYMYw+YM+*j;H7~zlYuL zhi2?PG@^eL^MsX@#8S;E#OOb83J3u_r;1g|)-T#8t>iJbr7QP~7A>0aTOu#^Is_ag zMLBruZFqJ|h90ff|NIG=ex7VTr6eW>HrXsM;oPG?8jBtN1`P@R-`@fd-k+JT)U#r} z@>@57)%F}I;lC0Mdw*D&Ff*fa5hS^>HZ7eqOWuES3cgNB;qIPQ!gz&z12H}!EIg@J zNpq`i5q4<XDK9Eiu0>>L6A(;zLhI}v0tr+sYI%wo-wE4rS6%4<9)vvM;-jDlAK$2( zh}>EH_xBi63<hUjJT>=9JEGxO+j0N^|K>t==ms2_bk?xyS7)=%TmKeqR>kCe`4v1t z!_R+3OxmUYb9VSxTjk0BHZn8Z|3o0ktb6qur&G`6S9i{zQ-~{1_d)&D^DGa>;e4#E z87I~`alR;Z8G%GM0$CrTQH68WY)f-yb!jZ~6Tw<{>=^DlK|6gFS^skvZU%2~q5g}e z)wn}nP=zy<Go#K^S{qt#ZQrm=fSdhbhe3Z|vEN6OY%l+tTPLq`=dLH+`={BYxI`lO zSl$_SFRrEiZ0Os$95r<>1s(r<COfvoKy|4cuJkJ!eS9fo86%A2<AieX9ODdsqacgi zUGY0l90-Jm>*2JwNh#3)VvOmHD!cTJ%qm(m6;+&oGzGfaXtlV7%TWwx>bEy2wRwLq zwIPrV`9l*wAG&t5o9)&#g$MY5%Nu?@5!i}w$vTvsoaC=Dr<6DSpF{}@0S8QpSI;tp zA@o69Z!VQ!uMQ|v#7hrowFvGddy&k}_QKy9pVhpKbbg;2-=S&M&<LL@XX^V~$RB7M zvp!^x&c(XejVrfenP|M`kL|UcSbKl)l5guedv8SD=D5sE<boK=I{d2Ysn5ht^A6g^ zFTGxNU@?a@ptH2h=G)C(x>66TJt6G!E@<qymwoNGBoCwPu%`<a3?1f;AjWMPEvz(} zzZJ$Z%s_-8`7`4_abXxjE(`n<R5fkwNUxj2og9zN-vzU_@E9A4^TdzMpiqAb9|MVg zHK}IHg!vV=c6Kp|yVL|Zg_<Ub{gt`?el+=6l^_lp<h*scBGX%WsFEh1TfGBnRJ~hK zHkF5SVc4?Q0?dPY`!@s@1JBlxmesF2rolU58R7Z91!TnhPHX0I(PYE%;fe?m;qhP_ zJ2VmKlOm@r&}@D6hu7`rG)aHzo|&*&z={G3>vNN6zz%OX7p=?=a;J5~uuTw9M&$cX zYjJU3!TtAoNdDg&Qft2iDII)UJU_M1dr)(V&74v@;X|shiXxrHm|w$Nd>3-mA)rC4 zA`lykjn!nSETY@SzUKnIU#I$Nul#!Isin8UHjg_Foc|hB)YrG+VuXL&fg2R)$3_?v z8{KF^%@;tJYK5~Y#dRbLOL&htc1T?Op0$nj2#_Ab^ayLqHm%E~T8y3~)kCe{*U1q4 zMgvdiYc*kYg8&Nf-bz(L#%P@X*(YZNd-7VkUjgWexE+3<PJH3$Zg)W@y3_#1BPk)Y z(FzQ-9(=|u%l%;yeKmhN2!OUw@^obH9GVmdfX{3~M{wyAT=Nw<^?qN>y<3kv3~dGz zGuvsxDt(IfM={j8*jrKY{Oaw!Kj&Q}L?<`d_q>{9MD5g`+2|G{J@>TKXC1OyxKGd6 z^5^*A5Rqczc$OS<lVjuB-W$0r_^deXoD6k_@7m7vuzDb!1Dk)r_<K9nevL-9kk`2n zOCKW{8B{NuAW=Mz=#lMh7Y>VeK(shPwlkFWO%BV^9G|R<xnjp}X;+fFKl~S17nqzQ z|7>lolyGbz*sBumKH|E82%HLk#Ou}8IpwmJDU#5Y80;kLDab7ddkqfQ38^MGNRIqo z>SDsq?rhdJ1~Y%g?c5uTi5>V48`(vZQUg7x<~m?jD+^GU6KC>&Vk%X`7Oj5e501Lv zB;IoH`kv}igQD&3@wAL1e&5Mo<2mw`3(RWGhvH;{g}<&c<&5&8ZKpzm4*bZx(o&`| z&OHgwArHDNj&4?o#i~RRI|(uEPh3~o*TLF-C&y8!!a{%XPkD#gAeMQ+UwDW&8Vgbz z>tJf)rVQcy(;0t{+=ei3jJj}dw$^{ns!6bbJbERJ^Ud~$lE%&p3(J=MO_V?K=4E&1 z4{jQl^g0(wo5qZ%l2=Miw=$a+zC+6!cdrSrn9`S=UgG$T2lmjpm1rWMy8asHoL_8L zS3H$BYv6ya=^2C=_JEsiw3Xwp)}b&m$7}ht7lIO}_i?CnAw6<O5xtX{l6#BZKxif$ zL>vL%#}aj=HfMc3ro{(b0*2;%r(V^GRxthk!KQ*)+*~kWP`^^gtnCG>C-_LCj<Jl9 zn`I!0q&-t5dCG+GiS%ua!26k8KL}wc@^gYG*uH-~UJ)#Hg1kfO92y=q63&^|%Mj^l zC4F8;E!-b(!0{;uul<l#@bPQ=yAAXA?yOLUJls%xY`<7t?`uj1bV45oan()DYtq-B zAO85^x2Gi>Fv;%N2=lvFb{$8kB+<wX&|mg=!(nrSl%K7;+60&E6odvU=`}kZcq@T7 z>8^hPn(!X|-rXqb{u$w^s^>G6K1?t3dms)F@|id&kdyy6>W#9FiiE#V#7^TFcsnSZ zqh<Vpax2wRiXAh3x^=;Xp(d>UZXT_Z%b=7Ke8<u}aUv1T#=*+ngt*UFAW|qJ-XjFX z`KDxkn$iguLHdTuHVrTG8v>!h*);b&Yjb~qXMSsgrU>D2pW8C)HbEyj!^XS6+9sj% zP@Ezz_H`<f8VJrnVe+51U9D!#iSF8crfPuwJ(#3`0Yr2_F|tk{|3E1lpXRQAhQ1ZK z1SI<xxwn(=QJh-d0JOfmg|>w$7<(e%8F-tqv%iTq;)9RlooC72)=EoZErt8_NuGa8 zfv&DqK_0BKKRoFA3coYOk$sYpM-qSb*pGJG0;x^hxuhw(uBaCuiR~7N6zdqz%V@-o z^>ouif^MRvVbox}TE3!@h`iTnFagNZ4kZ+!cF93^L!4Beb%djj7_lw#qW5#v*Sa+8 z`y5-d*}SHuaBIj1Bi!Xo<X=$u@6dm`*DnoAj)t_M0>%DyY}56F4CN!3m<Z`zhQIP1 zEAy&N9wl#9pFT`Mp-8dEERE?8e2%&@L!KNpy<k8-4%xUy<<2GY!DXGl-`)ADKUa+e z=7lcU>iikn2o+qm(S;!xtsfqyPV|RBNl=VBV^GBA&b+?QyCA7zGLzbN>85|(ZW8!P z*S&=n`T+0*67#y9o~Kk0Ni2sQ7OZBfhih%35fioN6+de0R$G!ErG#bQ8ZK;fGbpbn z7pD8sesGo^@CVox2w3vCp;IC~BAWRTQLNoSEm6G37DsoCxHcMVFOhzW00iB(n<-N9 zKN2nxAw`50un{X*5Pauc3tE4^4jR8y>o@}UmNVKDEW)xPXMfvlA+@plipXg?@BD54 zGTuWV)c_PW+3$O`6xAm5!RttO!cRTRF}77TZBXkW#vN+59+rnVZ#Bu0U-E-U{V>z; z)f->F^HI>X=9bjonwY}Q2d%BNQA%y4dKUlTkYq*&86Vv1Q5zq-ad&@PrU{gDitl~> zB=+<nBXCMLof){PHOyS8!aMc?^M1;MWzYp)$m34%VJcgrcQ<|=g-RD9{Pt&xaWVgV ztEcBM$DsTkp5;dI!xMgY*In@#ZXZY5j7|1sfk0HDbL)@^EkTTJ82j{R!6q|ZY*Z4v z>3m2*IOS#9xd6;bUeJH+s5|rZogMrIfcjSF&^l5v?_--uY{eBmAB3$YP!kV>sww!T zBozQ+=O&MJ&<}3S*^lOWalpZQ4fMUyWMkmm?!_*mb@hb<Xzw@TU)if0h)wNYj0nLF zkNLq_N@0`lL`TWthSTk+u)#{??kb`W4NfX0T$d_`AJ5NW3r2rP(oCMQsY~1r)+DKb z`lP?W;mWG%p*C@Spia5zMSf;{AgeALm24+o3w0Y#>LqKhxYiLK!b^^yw?D6Z8G+4+ zrm%S^Tnnzggac6;{8U+XbzJO9_kPDZEsE;$c2VGbhA9lwDemFv@$TXCAW!{xVylN- zD0n+2XmSy>9Ke5joWc1rT`RVSdo0{ae45okv^r1wOgB5<r1Ycz+|9+QS_9Jj?h&a@ z<tzEYd_uaVPgS2%S%iK|I4F*{@4J$K4Nqz@aqsK<{-=2v56t}>o6t{SNlN~OTFT)a z7xZUacZg_!i=y}x<2YF7>Xm8misISCJ?mn?+cl<WnCpM=*P)TZP7Q`&0iYknd%w%v zvo^me`;*vZY1#HCeu9Q)_diU|+fgTi4zl^xsHhAj3wI~+GP5fOVh12jUfe1+o-&)8 z#QE>56IA&nNXC@FBgaVVJRmy$kFp}Riwo`t0`$=<3J#N-+;HZZ%sL7oKe>*zK!AFj z#O_En*QS5NmtBA;+05I(e1ldLg4>#NXDL;Q;s<wujfV$(M(|=%A(QjI_{6%uV%s}c z;EXJ&1W-2Cz0^RBz^Wg_{R|Bj{jNxS%Pc-~jS;u|^W(g?*(HfdYf~b-_o|Z3c0C6{ z=1ED{^5qv9R~MdV^)h1Eo(#_}RV1DFHKJFi+yH+pfmipZLxGRpNR>Lt+{7re)nO-x z3Vtr)O?*2b+mJyV-7uUBw&?^!qCS3<RL#L|3Jjjik!E`jihs@w?3EYbN)i0>I34ih zS!c+>V%4?eu0>pMayh#Yi{57L(7<)1a;y;T>I+8-f`)4sB+)z~9un%<lOZ5keJHIe z&JTY`;_^8aVT+1J`|XN9hx*w>^;yJ0jL-A(8*k4y!uNitV+II!|J9*pm!m1vSp)X& z*=Ml`3gH!y#Q^m<wQETPFT*JZ7!!{Z854Q)(@SG;K2_SyS*VHby5PVoilTW^8spi1 zFV0Gz5lNQt6tvTN^C;&>^!`HOq+tga5Sf2lV8D&t`<5$s+^v4-r*$Z!o+vz+HUGCU z9~Vo7dvHIQ?ZB7Hl`aIrky#23M(6GgcAD=z-2)HXzbqV2)axX4RGiG5?FIUH&DV<8 z9ew5~<8p>NHZBIoM%+e<%M_ehIYjeQ^Z`vNCFuZD%xqDKVUKA-17i5A^UeN4MO%Mq zab=QbPjeOJ&R^5&xDJ3GoyePb@=iNUzpsLCCeEh^V;ZnNN6iJxV$|A<?wmZ_Aqi&4 z)scPSEfOY2*l{aB)$%17jadCtMzLuA4phIbG3Vd&`eVZveE#e}XwrU1q>zfRne<1f zBJhR0g_hI1yKfNFhO3X?;*-^F54L}dGkBOtl2eW{QXiomM!%VTyz%xIi`@x0)05B{ zc#pR7kyBr-BOkVgx?lnjKM>p*s$zx&VHuNP?$G}bRvgfuAUR6oyq%*Z$2$7$2F2jo z51Yw|^}!-nzrTK43g}ih_`&9qv8j8+%iJ>-c9u!#JXw(uf|2ou0+lJ#cl&=xV%cd< zW%HlO%CPQ>@zUHkZI`h&tW)=M-g{R&eF@~YJv3%Y<q+(FZLa}I%0p<mjt(?2Xnrx9 zn|on(AU@6lIRs-d(SYGqty+^6uoA1Wgyy)e!omaLb9ZroE$4c$31AA6UbiUT_dDA@ zCN?MM3$RGo8`Qx-N*sZEPt|{Dj>Emfm|k}Rn@OM`zFnbH;+M?+MvP;Y8&$Qpw_~vq zXEM!G69@s(J!O5SWZEprM^1lo9T&(xGD0Pmv~vX_nnj-$NQsR8)79uZDtRrm8O;2% zZDb`Swu%#FXzDy?_F?t6<m4m1{W&4UGHXL{OfM&b2YJ5_c4$l~4?KU%<-!=-Yi$SV z7rXWxvRMHQvSotVAGs!UP`0S3`Q8<KP`mwPmp-pq=}i2vq3ig}l+)*OY(=^Pt~Edr zM*!5O38d_{_BY3knkNc<H_X_YWqltcB>cIKpX{{}`2J49w1qPp1sj05XBm}!m69d? z^Wn`H=-TI(`Q3~6eMf)gB{%rUcI+(lvx{7nM$D84g!72!Eqfs}IWSp`Ah%`oH8YHw zpEd^x-fzRAD9^X5k<=bONtB`bP2tTvl>TW@9MO)sZNA2wX_smXb_nO19u+X{t23ur zPf%?_4LLJCR*r8-w6toP#*N}@t#ze|UQU;cdGB!<&eh=U0>FPjtw5M@W_&hkUXyqO z2~H2&XgD}l8Xw(U2Jy@Vwyse;b0rd`JFe3ut|&y$Qo`#f*1!{{li!niaCug|rm0GH z0uU;meE1_Uh8I2?*J>KH4EGkpNE_8R|B$_4#w186I+ReKs;cx`?(%wm-&-}?ad4IQ z^0ysQQ&3~<pKyO@!uaQ23`@#Z$qZ_EdBBGA>8Iv1=agPCk~M6Zov?H-9(a=l($)QV z8HEk8S*pfT&C~wIPd#=qEroBMMYkNTHk;u~i+Iu3rtpBYQ!q9gM(l1zEwAf*6R^6P zEon45sL_2Rkn##7qJVpME6IhI;ty`AEVB{k;Y7TPR5E|&rI(HZt7)`xtl^rLm60nr zk`Qu<E99ia6w=oV{t4-LGn|tti#}#<#@deq%Ky2rzvb|a?HA(&9=3?PmU02$A2L+f z`Fq2nz2*-!a!!2BCi)c`H>2LvtlTz%u|E$w)M006cln?5JuWsu8$~hFDm7S7TJn^R zPLR%Sp;3RP6*Gq^W^%B{gwb*}a}_?jym}qW6htaZuh&)~_MCLX9BVuV2hhB=b3l24 z<i+L=;hr%~(Hb5O5zSkI%2>K#qa9D@H8#5?cp&;<&kvPK?33=<%px9l4<n$7=lP52 z>6j;>LtGoN!3x5BzfB!@^mlVjldZH2>1z8AfslXP<`z*=Jv%ae;mv3WoVHzg?UoaF zY3?BM-$=~XmY9&QU5*?_BKvQqjuRrs@3cy$%+i<{zb01T`_KJ}uNv-6R2{S-2g+D; zd9EqVOWp&+L>vkbO^c8_5TeQ^`t_!x!k5f(xIhvUx$mUUD2V9ne^xs2&!;nkw0L>) zEuw$ET*95ieb~$Y8M^r>baRDx;CKrpc5f43v$Jzj*l%stk&c(rI5TS8OcU%H%SdXD zC9<ZLm&54V&8T~gm-`WGY}UujN69Ve^oW9C2<evm$Bp=j-Sg5Ao{<Qy$n%@(MphH4 z_RPysQD0C>W)%cZhb8aQoh?Jpi&$sm)2e^M4B2JGm{X+UiaQ9YvG|s|<C%odvs4x( zyO|Il=B~s5c|zPY4wZuOEk{bBl*rv@*QC$@qLJ~Dnk6#7#=wq3dmTM`Ql))+@b!5g z5msm}*6mundbu!Xgh;xkcv59yXWB=<)MNW)RC#KJPKV;UKYGLEXeJj;1suq-=x%?h zEd4bUW<4z04286h^61IEq1L6^^X!5{Hlkkg>(6-(6Z$H(Qc8w>_boc;Jd)pkU`={W zgB|kdPz+jaXzu42+1+#Qn7t)tfND`G-E_~cIXbE+y4^3qvi<dCVe@2fw5I%a;50Ie zS(Pr41_>je9kF4&%-$qw4?kQNS;v1ayL6A^GS#VfOVI?gJ(x>WG0&j!;Kw&B-nUGO zs$LE+vfL<OAUQpfW^yu$$Q$G>%2w$<*^<q})PlTVdf*U@1*yP0+U<zL9$5pek8!T3 z{JdA*2*9-Y(1^Q@SY`Lf&`uPYCz!(U-H%_=VPIvZ#%ZpVCTjg7$@NG@6nKAoIh8Pe zmFw$Vnr2_~b}g`YjWDbyxqnmNcXLK*cm#+`yb@V=y|r`{QR~U>hR4qNnbuuRpOYT> z-l$oz9$alv`E7W~Y9b3gZ0e-FAmzbGbafxii=i>LuVb7jcxOK>6a0Ni<enM1w#U6d zb^3=5D}?q(%+x{p$O}lf)DnLW*#6CSSm!Ov6259l>oJ0xbKYq){0@QB;m3^96h#er zipT%FEEh`pv^pSO0laoOyiQj*c&#wHDKD&hB}=;M8_G4k=@jCqV(jaq-jxtf-uhX5 z77_jp-@e;2FqXnzLCqE**YTp}EBN9sJJqfPZ`$RBsk|4`Kjfw&bKZZb1%?T}1zG@8 zK&-#NE8IGuN?mus4+^LgK}Bgdou1bibS9*t{f=8~j1Fgn7)@Wp`0zDGxVOv47BMqT z!`-qRl~Pi(e&P9@TPCMfYxlXGPV>;%q^}0w94dqPEmny`r;gd1K2{v+Eq#Iao5@Kn z6I6>G3854j+n?1B)|IY(-p=-aDIzgSZ_(HnBa~jAS!_bnbT<{(JRrOSy$>ctbMGC3 zSNhN{&RcqND<J>*MeuX6Z}{aWo&A(iVx^rQ+w*H-RPyXK9n9r1&@$e4`93MEkAJ%4 z<`U!>Ey#f8Yq<_D@ZGv1j9KMH+tEMMnQP%fS5JFuYo{!aYN_QgRWHkb3kAPT>&@QM zg6EU~gL{Iq0dNaSkYBWQ$L3EQV_cUq>$mX|Zpn-zK_u;tE1%m4+SupCz9oboyH9M! zo~CS|DM&Pqjh9i9Jy+IasiiCE$agi<R+a|_sim%lfN>{~;rj*Me*}f8&aO`#HolO= z`ZU|%i&*T?oKc%-mypGOPMph@*rqH2%7;QCih$NzO8e!V=j{(N1|(fhbCMpPtA?d{ z->!!=4g3Y1DPUFg^VUmdXUHGuUUUA94g>xS9vOIbE!F9{9r@9BNR+B=iaT9Y>g#xe z3w_1vJC-jVtI5mS2{~1Ul^UIS1KWo9r4HZ?LUgg0(X5Wz!IHgy<(9s)cY1tMHXwbX znu-}S`$RZh3n=*<o)Aj8%n@P$ro-9UTFZ1$fFyR-qV?dvxc*?pWXt;QGt*vs+-ss~ z^*wP5+$w3T`SXE6d?SHDp<I`17@rz&HnqWftraRmFP&o`zA?wL0Q{IJ%14;U@g?`I zm9LC6!fiCGgYJBPix8{hb|Zm?L_MirMXhY8x>^^{OHBFT#^wZXahu!UKK~9lBj3Z4 z?ds@wZH7KWG(V<VULcV|J@jv0y3GQo>-%11X}`>0YW84Rq9*L!)qFcAwunVIZ>KFG z@1|#88f&ixgkhM{?O0!wt_tqNo1ioMikT9D{SDs}7^zWzLA%a?VF<}CACP0f9-EH; zs|!lja`wB{myY|fk;MNu<5bjxdi9PLBPKo?&t6nxT<(WT7doT-GgSlR7oa2j-!LZz z1o1N|bDnj1RD}_w>^6|papMEH*TkwyNB#GkplWcnHx=arT>s^gF}p}Wj=}PTVqN~< z@wOVppQ)OEa`e5|ze|=8A>94-SVaZ{S^kb{Q$F$bluJk7u>Mt|%L=vf<Ti<jg)sJa z0Iddj`dUuIJT?7SiQ^=y;n6ZXt12DUe=E+q;v(eo_jhuMSX~6;`slyA!-K-(w69F? zwvuw2ds=LFJCP~sE%`6pp66fOJ`3^xaQpxNxP8%oW=-^IyVvcI2&3MHBm3Ej)4WWL zYXgs8t7n(DNoAV8RRkCLe-gtCx%+H4?n1|lU&fefaMW4?a>P27&XKmZx*oL4(5CT> ziFAW|U@!NH8=q~$JNv3J1(hxogKl`FA-CJ)8@7^90tEv@`w{4EXyjeJM`n;D=d)lp zDzScl*=TLk!DT`F<qHfc8=LCA-C^wB6y>BuowekrK(MCeh$2C=7Q5JRB!L&*aLaZZ z`xbAv&3U>4iQST6dEPM`lK6|n*S%jG-)Y80d=-64-tr5$6iuB}ji}#6$C@d(7Te6Z z@8Lp$rst0%9aJvKm+RDwE7mrg$w0jrjApujLS(ldjZ<#0`bzYAW7;>2(NNPh(i~rJ zu>ByoBK0){j6mQPnkdj!dxk$9$Q2ab$}}pvua&EJI-(NKtcHuS%jG#p8b$;v;f2@l zi%osauhYdM+@8Viu*Et~Xt$gDy$=%N>%0%=!J3(E>f4al?>!qfjFT2Lg*N>}fzq~r z%seFgF!{%*0M#2@T{Y$~ScrtT#n&Nky}$GAKTU^iT^lehgXOhz@YO*ClG^@eeY73; zM$j=}b6l6x#q7HFu}HRHp{S~wP@*NJG%hG^IUIq^t6Gr^>|WwImn6@kZuYxdrBCg9 znCV{o8YTy}Ec@a?V5i^b7jv_@ckNn#^`&E2jTM4Yu^+11=SV|Z8h)u-Psb!(W;+Ti z113R4p~1ama^S%!j?{98H0^!>gYbFFgf%UtVB#%cq9P$fI!(!c7;Q{L{qRv-Lhcgb zwy0;HQSnHniRM7j&*Rj(NlHzy&K}_G?Ci+2hh-a)W#b~7(|a7>{phi8ZaQCom%Z)= zBEh350-RsbPXWBe9Ufme6XjY*&MZ||>zcg?c<X=XX4_8mu;Naa(aJYZn?DRzJ6(+2 zv!*unjr8givsT=0`v%{7LyHqv*vK8c%+gwuJy*TRraqaEn_Rk27CgH{Hoy$*tz!9@ zbvSHx5d^8jS|s6Gk>`q4P!NxQ@*tP;$L#|=Xyn-%aA-^58}5iTJEDfNpYu3ss3`>> z+6b__T$O74DsT5WpEqN$z*^EBxHY>$k5DLOGFRtmOjcVTWGapdKL{^k32L~Aq6CF* z_lt_d0{4(z<%nY0xh){NT(Kg`&yPn9(mC*?ge!{W3BElU{D<5h{C`Y;?#+_q=-!dw zFTW3i^GxKX*C<F#0(xkFNl(<d<In9cV##&k{Tf49lQzSyh#T=%gELN>yS?Uhp;<=H zYCDomb<eiZN$sn`>DYx)BbwIJ=vc#rI7*y9(J#Kp4l=(N_2Aw(vq_P&Vl@7so7M}R zUPF<{XX>U|nV`v9V$V8%X=3vjM6i7E)vy|GJ9K#wXECtt@I)^8;*&-B@PZcuuluCz z)&5|4Y?qAXb*v4&{2T>0J)H3gqtzT%_hG7LZcce3ixcId^F|&CNn0fy6q@<|r$vmD zZuNx+uUfjEn?c@W9<+o>xTqt}!QZt+lwcx*f+E2srho+e#pUaN%o&q7%Zrx0bUy2m zQYPd&i!m#^(E&r6eI2HpJl=lCIO4mrL$+nE6P$z=N^DLRcpVbydpls4#m^E+AVT(? z{u|l%(wZhQM6AlVA-^Jt@%HzlSrlEelGpFV;(3OGqZ6QIbcoOklHE$W5Z=pj3Zfb$ zYepnE=yF`#tGD=nmvQ*pVt0UD(R+I5)y6IaNPeqi9aFfWY`_jyb`q7nmNOIX2v=_( zGH`8IF~ahIO4;3YAkm1>45FuYc=kT6Wq-a;eDWj2POF2-M-@A}8E4<=s?700S98dI zDBqA+PNImM{7e%b#W2haFVq8liW}p57=K9p6U^@qN>Av2_lQK6!3`q@fL7)1waw6B zJOixOb=3qhI#vjB_t@YfWB%u3KOK2)*%^5lc+L>g%A2gjn%r0a0{+?2EtyEGTl72% zdwJ|gI-M)hA$sC`uDe%WlV}A70cx(OzMzU7c6$yUDF*{q(J9M_;?E)N;Q9oa*CP5J zTptYofkq>LQqiBbC_ON>l@Cs*)O-m1{LWV0N+hYJ=0<O)qqWIgdUC*aaSE`njZssd zt<rUBnvUU}vrA~A{T&Dm-XY80i<3W0rO$Cr#sdx3lIV$p#YMwdHVXlpnREmGdYM)} zpYMSmcLy5{4H6C7Q|K5qr(yQNcmxE&g6HHohGsc`=`ofqbHg;5A$(R!Gy8Ml^Fyab zr^-6Xzee25Z!?(sro<T|l&K%TP(rc*hUBX>=UJtbCy7!KRB0UFRudB%Vz+CqGm(=I z?c;B{-&ThD@1L8_&UYscI6AcI;#!DYfOv&cGQGT*;Ef>LCB<+XDa#q5NGgrsS=%V0 zzQKoothkF7KGN~FWf=O7j#nE*a-Ypy4L(zZ>|0#++_2WVNThRWi?%Sos%B~|xU(OV zk95>n%+qcIQwhSJ%HnI(!|+RCg?HcUjik=0udCplKG34emLg$#q(6er<4RtTj(tX$ z4ti-0^wNO@NqzW+`jS3j>mgRmu+}g2XGRZyxOB+YVf&9Hi0I8dzbgJO=I%PSt?u0y ze4C_UW^$OBnc6Tz!`Lu5&@d+rv(qp$qZ?*sW@ct)9=-4H>dw8R(<6;EBi%nOZQ0v< zFE6j<&-ZzJ>HS0%u(pr$M%cRL?f&7Qy3b;K@O$2Z{YLgl{?D<(g01`L)c%>%=vjMz z@NQj)TK14eiTn+Cy-uH<oto`4)lYeh#;w%EcKjfNKR-SrLPG|l5bH<PS*h;LefjR4 z)wN}WfR7{B7n!#HP5=BY{)#3Tx^MI6tS!gN3!?t>liKOXkt_)DiXyafAG6?QQPxN5 zgDWKSJ-NzTibb6;v{%-3CMZxwQQH-N7UhY6l!=Ud-3z*fX1jp4X`m1aNz`ZQlatk9 zD)@C%=kOWa2m54;-|lUOYpZ+9>u@xb)=1-g+J>j>Zafrn3G@D9Lo!{Hv`nak|CW>A zUF+txa?T3{o7ZFQ*Y$`@=6{eK->z+U9__q>fyxR*m_L6*F1r_?0+1wjul>n?ya-4z zpvt98;O96Y8hyXzX+~-mZ9!|^lvkwdZJnK;jUiSt;;C@pdnCynJG*WfYM|6sLHe@K z&UBYNa*|{H<^;t&o^&Md(H6;g^NdCwH72LP2+6B>`1>$+iW#*_-Zvi4lhW>+k(4mh zSWUN*RcCiOVM@_UA$QgIt!u-7@F9edJMuD>_b#^Se(L(46Kx7`lk!j=c}H<0k0WHF ziC0){Euxdca;4a8i8cdcWi(sFZ*74mj-0W}d(^_<rq_?3&9CX?MFt|mP`=-exUGu# z+4Q?XT)wfUlXl6Tj}*ZT*;fS`>fdMV#9Cr1k!f)RRT^xp!hd0NoPNoFwJVjET;Ox# z?zwdxAY-6|x}kyivpf4E-&b;6^C3#VPgmHLRy@Q;+(Vy2h)=AUlB>;WulV(3h3uEm zM6r{S^KVxm+Gn<1V$Uy*Yz~$_P-AM**$V_4*_(YX6g!GM>wIWSvMs}ojX&d7yd)jZ zf2UAc^T(4P6n97B3f#_rN<KRD1SDh<0MTHvgZ^EJ-ofEs|72mufi|G;y`jz8?^2<P zUep#$(-4YRZB|a^LPj`d?oZ<7ppI*6;VH&(84=xe^Efpfm0O7j(Q%V*;mW_j4D`8y z#-Bz<&2)KCcxCY*CDL~P<S6!rSzv;VQZbh{1b-5wP{{=>{G&C0aZ=9-ys3Hgk;Glk z+O+gNovmuosPrJzBTfx518S3+xl4Mv9s0y>1MQn~qtZ2q9AYu1{y!u7<^@!pr!LdS z(zTo0A9Fa|Age$;7zOl;mEUz-2*Cu^mb|f+ZiD>9Bh0rw`-bgqCw;ov9{`@jyG(|T zsB71g8=O-;Wso6%-oqAkkCS!{lEqP0NJ0}8ZpV5s2J<`08ohUD*0QAZioRGSt&Iv+ zzVP<D`E{x2;Y_#G^{7aaMtkq&!`o#FvOzP}^(tNSyyyNt=0E#4dx+Cl6{OAgw-@00 zQ-KwjgdOEBx`>3y7N#Im1eBvH(Nn89_Vu>+#ReGzO-l@a6zwm_GRq&_XK!B}Y~9R) zX$qh|Sm4$CAe2-7I@~w7&_LUol|N~hQbzmD`#qos({P6NSFVBTQ|mV(ksoik@!FZ$ z3%ij#?e1vXF0t&}ryYhCmk8Hm##4=}zhDd^D<`ig(=B3VY<pX@ys>yAI>;eO3F#jw zvkSQM*_pV1Oi8K(6{koD-NQwtadEgM#fQ^mNJ|xE4PGh8N;n#3GyzjM9SRCL2=sSx zl`jAP7`%6fas+Z{xK*%1d&iIE-GafBlu(fz!i7$34kIKl3&a5P#oQ~zJCaqD`!T)f z(<3bJ#KWWI;ts=y<|dv6`p-2UufdD75i!?CQgXF_ZR%UaGh$#JvD*QFVGd0eCqQ;O z`iIZQe110H5y-#QaSW9NFq9vHKflZ4rSL6ljOo{v3G(pZlPRw^eI{`sPrI1!sO?RL zW^|?fE$#r}oWLpVtMfKBX3kT#<T@}I20?oSP6^7+10H#@hqcTO29X@*os+F^!J(2t z--eWbgkkRgsquj`b?*F2j4<r*7M20YVfVc0xywcMz5N>{Y^e_q>7K}8yN~E;Rql$t zxE5oJ=-KUsYc^dNWdr2)CK`kn+>looWP&#If@yV)N)3zyz;G4#yDW@m7uTZS(wc&_ z@Z^%Vy`yI^2`AB)mxE)0`W_CYr$E89YL*>;&g49U-wG5^cVCH(p%{g)Xowy!h^+a! z;o|nZd+`V-WP1A7n*PKS_XX8Q)5*^Oe;;^^{p4xSCkN#Y=2B1m9#|2J?2I`;_;G$i zT+V|Pu}j;endnXUP`?~-v(+|LC~y3FH|UVg;`+6pkmRVYD*0BMN#8xY$_Z5P^0K*q z02hUt<%*7y&>sDPm>i9RU`8G{541_TLu*DRmOrD30p4@<js0o_!(lyqsSOJO52s;2 zd(rB58kZevgP(q_=0Pj`v-Hp=>l|lZv2Z?L#Upzz>*v<)psAvOC3uVEG35=aoMH_{ zXp!d&>W_j93gGS(VkD&*-t%hN!o_)iKw<rWj9=Q_ljV13fv*3FJ81UX@hf42&Gnct zId7c>`yvylUKE64uNOrmh`i;HQEs1|x+RP4O6m>Gp%w`vX*LJ?sTmlx_zSDWH3yQn zxp!ZDyrD%xTxuZck%;gP(RPjQ-U29-P|8KT1*ox6v4uChUsc#yJAW`T-Q_cXnVz9; z!XqG?lmW-_u_ck^ZBp>@wR@gFJ}ZT~J`iz*7=34pg{bOdPm3kfr>`A$<9}LHNe?01 zvdKHFc|0PHGiKIk|F+2AfYin$Gv!g$GBrdS$>8`?4O6035TC!pt#`gqrB1)up?14t zeU}0OOQCx5r)K>ZBgrl&sM2(QS0SH+tFkF3SiE2$jjmu|e=jwzysv9zfO2{VV1q=C zyUmD}>8yC_L!V)&fY_5{jU&aPqB7fabFW~qv_LY!Qe1JN_vH6XeRSvhMZEKx1K(<J zHW5E7-3MG!)hB%NU;3m}*|2s`2>xXEM$o(+t<E$5CA#+$@9JJkvL_vXjXAet+?07O zRxXh)w5DqD#K7r7e9jw!@$qp2Pz&xw!Oe0)U;|0a80B+0i_&$vY!BLv6&LoMcYpH} zp&64U=$8a`-Gs)-jUuGFxRPr_Y|(0`HK0^auXkn>!MTy%kwCAc)7@ip+RVc*S0~Lp z&(^dAeKt@b(dTT18&F7p|DwIRt+GljCaPd>?^pxYgCAlps`@{W-M@_qX^<_bPWc|c z5V!p7uAV&rPVBvwKWbl$4tUD_f}2HxSa?e{*jAI=dh|G}TbTTlV<vKH8eQACg@aQ| z2EPVa_9m<7;1Cy5vs&BnIbGBIRMsKP_<pX4Ol^u3m|g5yMQdMwqzfq%kFodW@0t7F zK%gYXs`npY-_E74pQ-+AYVg3UcXwhZUjMrH)q^GR4*B}s3)e@&_ZF7h7_u#v>ZG8# zjiz-;y+$5-LPoY`<Llz!LQHa^OpMew3ChxuGItsuP0snM%JFr|njd%HBOi@Cj^n`9 zl87FD`k;LUV{a#aZVD&8KmZ0GosCp7BWvvhY40??r4hZ*qtNxZAPCzf2e6mH@3RHC zyx%OqG>{}{o3CeM&BDc3PW^!6I;Z(*mM@rRKz+;IUd{loxZ$Xh)b;9wiYGa&ts-8) z)%D@)X%3+|bM<z0A$m=dL!q5pQ6R<uCxb4g<f)WXTwIZVST7^1;~C~1;ayUYSn9nI zw%CvxdT)-S4fjD+n*SE_?$gmqa^Y)su5<3$#0?k5#WOS9;(E?tF2rtk-ef+Wk>nO4 z7afkq^zH<8uXC>yk=r)itWXhH!7tPa^pA*7Y29?%jx$y;9QiDXM+lW0*TTwrk922g z5X$Jg`;FFr_4qs6;MuarujjCP%#*oruFZziD{NPENAz%#Vlkm*4SLKl_Mr^j>LP<l zLT`W|WW-57|3XH>fkYmha;@vyY*No;ygJ@pe@vU+bKOZ4XBBlSsieTUb~`rQ)op3n zYFd;Jw&wzqE;gYBV((;W4f^29_APS0>V2Rxb0&I!>C0kljBqvo=ZRrhF2eq$MuEg9 zMq=;prx-yuqa~@Cn+n6N_B|XgLIyE$SNvxWMtX4SMPui<n(gL6pW4Xu!L<GX0cg75 za;tnH`s<o>ITCLO2iIVy*n*Oq;Z})9s28I*4i9I=^qDr#zFu6@3FZfGw0IzCz2^Os zOeCm()5!5l6HQr#Yk*GzD@fnj3(3!h`iFFcSUOfPby0RnO`&qqpwAgWl|i{<wxFc* z?fIh3MczhT3J>ZNXZwjBj%0a?<&`#+An)9BU7|t?p=|ScPqfm;bz&$@nRVP%qd+TC zGb5e+iwjmkvS(v6C%1<aq96Ae>&rq@M&oOLOBWYP$qLvl##y6vP|UE>F8BMMJS>4D zx}d)$0_wvjFQ+?#$faky+G~0-I4Q|9Rp=UMd5IL#?z}tB)`fGNNI*RX<HijdWoMlj z>M>E;FIKb!rH*`rRY;xfXr#QV`>B@NXr|w#3Ng|*Pm)>S!EM6nmIeNz14pV(s7xDw z2<FxU4GRmJCLGs*GEMa1;~(Quv5kR5b@75oKkg;6@K&mFec-g>%;PMR9iAbVp?q>x z*xhNYdD&qKXneZ;3XAvnW%`o{ngPHS&LRV3fhg>|Qd-NS3mWYdtG(K7<G`i*ts*I! z^!9h-A?51d%v^}2AT$k!Sk_L0Ej0Rn-2mMkycYXr^0rtmEj(ltU}TTtMk~4Fl6MV5 z&>#v1vO=neWF;;kdT3Xo?AroB)ck@kG<^e6p20z=lm)tlI&9%R{D+cMwTZIrAv6Q^ zhB2o-X@jE_Xg%c8LZeXvMWo^ka(6GDEx<nAr=)5>xeeC#o2SN@$}*er2Rt=@n20C6 zMS~#xiP*JJ{uyV;VR(jF9F(Kh#%}ES!y*P?aiH`Bgk2#5^)p%-arG6&ANfI+l@4Qi zAKZy!Slz(NKF>Q`FfIq!bS53*RHJFg;<1pw!XxtLO;yihQ({%=`*_8>c+K)*hT;eO z`7>YaT2LM^>T++wlDhE;(si$YZWf+{xGnX0J>kBZC+w>s#-G+9UR8L)C|c*^sYWz! z(T;xUw^D0|jo<y_KDB=$d#2a0jp}rHXCfNZ;z}S}UTfiTS}^9c5o7iQOE15;TmTh^ zQS4{%By*b7&Z<}F2>TINZwHoJnHzE`ZG7kga8F_)hW<Fi#K9nmb%v9Fw5EJ8d}Fu{ z<)GCk)#U6zLu_!d>POI;(0o~3d0q}u5%?GzhqCzKer9sDQx0h#*_9W~c|JVToV+%b z&zUpE&NLc-Tfc8Zd%>|?TpvuFAgy3bMERdQf7DxPR=01im|!K8a03n=FT3u)wr0gJ zsHjlno6yLg@gVt=$o;l|oTr2vPVV(0R!ah~4KMbulwWOE^T7G~{US3MXnbPSStX!C z;@CyBh);#c1^UX^q-S10j5=LbCMH_zWcl@4J|LHv9-%8&m9g!`fc$!ri;TA_upaG- zgd`^JIByGvz}^U{4VO-^MXoWMlG<IZ<nH8>u*7-zkP)clee4B)1Hj1qihFL{{byT{ zq1os&N9G*1{NX@;Vr-<opWh|p#kXY?5?#pCvyPAeM`pui_%a+kJ&LGG>moB2-y=Vn z>9J;(b)r`)>`^-uJJ|ydb)dL6ny4@pWhPwlYoef^Gr#f(f0jT<74A1HN<-f%<Z$J& z3O0{;`To`ZyF;yiJtCL<(zt3~_tq2x<?!ik`b=OT_7A&|SgtnDHcBjCmd{j|>8LD| z`zj?B$P-dKqbG$z<gtb1g_p>=1R--VBZ=DV`fliOVA}-o&O}mUm~ISd`i@(rT!*Yy z6X&;OhvT`5@h6^vXvP}I8Bg33j8Hll=IoT=v=#jh7lPh@yV*PK=gG{cDp0(TJaa_7 zz_?t2H6D>-HS6*Yv!FfEO*5HB|3IZ<%Wc`r{<pUH=ay|K?dSv-ul;9D1E2P5SJc5r zH-|(CV?ti)Eyw>Lh#NfAbe8Ylo3^CuT*d>y>1)Iy8`BP7xTEpi@pJ^v(@gAIlh;ZU zDE-(YT@|2zGam_n-N&Dxz#B=gP!S~BxE;{0w<1L7fzl^|Xt3MpA7Sob@J&~0t#jS( z4O6Yaxgtv*Gn*||7A2yd_Sp`C=VdZ$z05R-9Tk3)JSb!=H!ML?PU#@E#A}CwXnUmY z$zwF1pTB})<7XL*LSAvn%P-uLMMu-i##3n!Edz6Z)L2Oz&+R1h7|VShF{ACvIV+95 z+g6jV-d56J%IId#)K5c*0?oc1Kxu=K&mKqbsub9HpY6!9*NX5;bd3p3DF}-GQ$+43 zhc4y&E)TR_Xe%suu;>#EzV&cE>Wj#oX)e^M1En8Vr>g?ia%-9MCv^D@?jzLLr45=7 ziq?*Q8WO&<_~9gVB6J)qM6BGcIv5htYN;$ir&<2R5+|rXbNL8ny$x6Vz5Ox?g!SvT z;osczGu7oP`j4Fj$CbKOmcQ!gXD**B+`ozQCk!`RxIb4XO=sG+xPNu&PXrxqh<|re zfd;6>$GcS*M()VJ!s)Ll0|Ds2gL0-0g!QX`hiywDLH}RhY-c|+5#--Ne1h?x>)D_; zg7o(){=qu|vPO@)<C{eWTa3S*i#{yG7kJFUY8RoTer9H7Fau=om%qdEYa5j9Mtg=S z)-^C%D>xS6?>BSM7HaV^Va+3O@9({|2iYL3Ux(S^by5Ew5^y2!><6FDlQW?F{g_05 zv>!Vfi8;Ie|IH<b_Dkn=JjPC&=Zp!9GH5=0g!pe>lSC<7<g*^@bTbuO)s-v`z~JvA zY7iM}-E9YHcQ}DQfrd;$SC;<I6+I)L*WcSBY!XxdrdA|UE!RW~g2(cA8&iIz*Zh+m ziLo#ZZ~ZD0G4AMmMx>Ah3ZjizF<~ozP$tuxY4iHvQ|O~GQ^J39m@YRca*ClwDp6|^ zYg?wh+g3|qPtec<J@b%PpA=4=ptQL;_h~tm56CkM^~@dDlD;|IJ!>)x^`P5-`=94P zA_%elZX=E1_{?#hpQL}_;jp?iFiGzWKU6q%bi%fz`V;%#uI-ocu(0GBOVy@-TNfA1 zAMT!><bpj(s6kN%iY1~ZRYOUWBLgt)?d`+DSsuylC#`2x9~@;0YA)AUh^MWLBgY`& z2E2=>=gx@<#d;gnUL?<i!js4P0B*0NRD(JY4{*wA+i2U`GS<#otiyD{`XCji(4fjj zjwV5I@9`<u=tQg0cJBANfkd)@qIiK%7KjHc$(o*w*C#99W(iAjN84dk$f<Tvx9*N^ zwP8=n`!{aek_wo3t_7+?J2sSU_DtXDHu1X|#<(2;ZHg2Zg-#&H^-&+cY0-C^rwdYt zAKBJm;;5paqMh&Nfj+5+gIzMdr~{MY=GHqR%=&qkh?17Wir!B)I(936ZdJos`#dTO zQpQ$hD-ITQucdt0lX$=?n4;yEY$H2DwI~#=Pk09AF2yz{##wwl_UeeRZEgeFds?l< z0nZQB&T>}yTQvWRxAUCz=8wP%p1End*G8Z=&k7PAFB7vWx+z920U|*<wr1qB52!dv ziG?X&l`$T=!N*Blf~xd?N!lIr&9)Kb86_Hh<uf|5#u|A>lM-nPmSqRDM8zkgKU+9= zhvf95wt2$gSp3WbMUImwv(UPNlFe#(XQnH48WcPZosMT|XG{y|e(km(pfCvF!}*c} z2C}+Ce?M$Fy2Ism6kEwwmLK98axCZW`W?M{C)2QXJo}pljTVD{YD`)bkD{J#M6pGW z&f_3rggXk9YUl+<u!87^;>C^*{bLo>3gQEXozVjj5r<3Dn-v^m@$?cUb4$R~ctDp< z@D+tqIX6r}<VSz3)!0?f<Q-34Zf*es`)Hvo?xHDiA@O-Yw`$Q+A5x#d&9IQuZyib$ zJ+W{N^HYI2OfX)594c=kS+H1bXKG@fy@j<S;b9H7xu>f5>+i>&r%#^*F{Q=6s#c*{ z5H^1v0M!lz6w?+j*x+~x7Ap+f5s-&bPx0)^dbPfiB)&A$*M*)OKbH>#8?e^P;|l3H zK@dN;Y%V5ySTy{>Z@*B6)@ktx<~}$bSk@LNwe6hqC!e~1zlIsKYgX*9eVx_l<t|`L zJR|m(A*u|GdPN_50eowVLUP_t!yrGVU!s(tI2<JQ{Ymkhbr@xAzLF=hiq;Bv<$YBE zi&B<O;NMQGDlCHPAuEly9u77QHa}Qqir^BT-+o04AY1nP9;Qub?;86a4-vQAVaSy> z;(lmrU_i5fDLiu?!ERijY;vyIo7g3h`Yr2Ru)96(|59En%BKN>>he!;7a#cLB6y;o z`$j|cHn211_4}rn=@wUZj{U>e3O6mXiSJV2211e~!Hj^*H&15E0oUv5gMz%`6wXO+ zd&|%m6EbC+ol#P(EE8gg?l=^Vfx^_a-B(48(;M)AjTd$MiUZSFRx|Io<@cgZ-2V(_ zRH(yuM(6FfnBrZtrhy1v_d`+!PVAhKhs|w0If|N%@9ZoC+Rjo7UYyF0%1oa6B|0gm z9#y3{9Cx;*Cqi#EM^mM@_o93HWVW~<SB#ti-hFw{TA+}u_aDPRy^V&XJVM^%wQmb9 zOi9y!dkEje@`b~-oYl>Fhl-2m!P4|qNAcr#l$mMKJy`sPAl@(@-g=RYd9eq<xLM1& zs_n%qeGl6y4I1G`++Oyt_<chMurKoSO>%p>ivo9))dyAcM^?>;v$nFly#rgBOt~|r zg}Zwla=+kA6d{l&ZjVBXeW+%JAG$q#C@Cm^ehkOcYBoDr^3i17IvDQxMcBp@Q3kLa zEG`VTnV`Ez;1+lCYi>lW-o2*Aw&+vd>e}87R`tSsAq~}i`nEu)uXeED8!F>OB=<qr z-XWv)B{xmKNT$75V*=-E{QAbh_i{~M)j|Y#^dl}!fplHNM|Tc?+Kdh<jS}>FO~Jf> zL6+Gx_03oR0Ml282o2@i;RmG#4Q4I%xd&GsHyQWmy4YamuYGlzv~C1Uq%oj4V{#Tj zcU-f&vf|ZKF^Fa@31pP6Ctqd>$Wqr%Y^!KiVWu(L2oEQwz5BDkJl8K6YAo%+zaRXE zE-B+F$XmUKcSiL}`+fpW$V-hBimcdws>~~xXg)52YPBsy+R-nJ*zwf*oxmXeq5Eqi z6a|TE^OGqMqQP~0acTb(3-3NAS!~BQb6-O!wr=oDNTV=k__AG~PE&|fBiJn^1zj4u zc?Dr-4!Q&XGR;%D5R8pZhGdYdt7vDi+n6jx8#xJr!85nYQNOdJFtB+V0$N{xDcn94 zB9)M-npS<fbr6pBp7L+xJS++edq%eP?(Y=tn4}4_)TEW;!$N3t1BNMHmr#FPv3C4` zy-QNE))gf9p?`@)7$qOL&ZDwmGp>Q`*x(h7W&BM3R5{$E=vb~izFJ8mEt5;DMI$0& zv<;bD5ndmeBg|2MJckj?jP~_^?fCsuLqU5!hTWL?6T{TD4xwNJY};_5(uTv}I28H> z_-la-haL1w4*FPh(JpT8#i^(BWR-@_5#5^4n%e)J324U(`R$s`R>V^@HhyNl^zV1U zQizCQ<5YLHX6Ww^sXvQI21Yiw1|?#%v+i>x7CF}|55u&46i2b7#^7y#tcW{`F18EV zx7f-GLEv0c?cMpKF#@AUO)jw=sOkhicX;=(pm<j&%SnAtfBRwuBru%t;%BC}YslH! zr>eU$E5Gl^gre=?y4^9Ea_bJ%t{PPL=`<{TWrMy`bGn>$pemdO&+!%DCr$RD$S;T6 z8mRZ3pSM41daTgW=4w2D=bbuD8%m#d-3AACbhy2vPEg{QKuq~;G<eS31QQF^I2Cg9 z6`#es^v|OoYK(k|d-Jk(7_dG0yaB(%00yu3$Zdot^QN!!p*9PDF~lqv^ER4$66aq5 zFHvL}RE}U$ot|rAujl#1oBOK?HoJ}h>-pBc*XdlO(2<YEhd(lZWBh<%hVV0AzM-e* zw^**VWWhx|Ty1hx$4+ZzX!wM9eHd1AMTHqk<d5c#vpL<wH=R8*R0J~~OxOz?5bi1# zF4}%v+BZ2>QujyP)tfVnrzT@c?*n2sv>8(}@XbMx)6YZ&S{*eAz>kGD$wbH7A_#TA z*O)6OV+M2yW!Ue32?=iQxyU8q)_wB3#W$>r5VgOG8y{qULmi*PS(i&wsyKoU)IEmG z1ERk-9!7<JzhQtbo*hGDt<nkEF$!YdVvJNRG{MzPB5j-&qnPA$>`K&Zx8X>Q)Q`p* zU^cvpc_{cy!Fx|K8l7r1l@hkgXx5*?%E@Z$%izC^wNM#<XzOMeXT)NO;J%sc)34V9 zXqoCd1@)Uo3_IpY(#DhdR$9ymhB(ND@&5Ex!=)Q*C)+Ww6~HE-Y9nu(Bt#F#h-3K^ za}|h;Wh~G8i2W{31r#s_biZkLx`yKgLqQhCa3{nZdwQ;UF>v#JG()X*!YGJ6g|!q+ z$zYRw@bn*lR5l^9C+;gx9}Z@rW??)K!-nY|W}%t#s|DstEXvNw8q2hX@tb_AhE}}T zzg&|X8_fgQ$v;qJEx$^yKfFf_ncL+!N*^0|m^!ai3eapM^heO~M3SosL<Vi?#rE6P z#-&J`m#Ynb;0IT}BGzd?8;0{&aBSFyghrS|IwRkI((MmR-`Kyunw>VULbT)!tH84c zJ8!E!3Cbkq)p*{s7B}~YEQNl;8-{VkjlQ~Vc4y!E(pZ6%I@<J$o;(m|^P*A93_@Y7 zg0|zJ>I87W&wAiOXw$o2?C1ark2>|+C%))UnTui*;5H*iXMq2Ak)B2UqcO7hVxmW6 z{b?wFzqL83n8MV-hgV7CAR!`FhTW*a2V}`>zCEgy8YjJhrGFOEN16H%GSe#TaKc(k zcSLok-QgPCc_F|kBx!ZD7W4QNhi6fLNYNj0Z5cFc;-p4b^-d``m%e>bT;rq22RtNS zYnA|iU@nkBR9!{PJ`dOe+B~PW$6>97@W70J-WY<|YJH&MW{NJwZ5MIBNR5(R3i8|< zA3)JGtvDBugnatX2-2UW2|y6cUC*!jke?lvp1ag8^gSOTVJ*YIJuLe*HY5$nDiHAx zon?uAwI3<H*}1P+D0I6dTXIpwCh)&$$V5Iv3#;MEA(Rmf&Il4qq&JJVMr<yI8?)?x z^2x8nAd1$!YW(5Z1C(DJf`Z5=AaD02Myohgax03q(PnQc33bv#K`qCduA;bSOJ*V^ zMoCv^?&P{3byyuBw}{LHm+gmeMyZCPzR{a`K56J8mw_2UzB~2=^^HO^Gx6T6e|FX% zQ2K5Y%+5Gje9ki7&$H2a(RyFU2~JplEG9`1@o|G4gP~yUl5bYVbH;F-8KE(@w4i#$ zeNjX~^vR6V$oQZmCu2=-xn$v3L!U+D_iHmKH@8;*S3wA@JWvx$Y12n=jcTDIA9n{d zO_HN9dhE{6({y@U>vY;Z*faqQ=%l{JZ)JRiVvzVqc4>uMvba;<g7><H?bc&|9M+>c z<lw(CGVpmIn-6_@uqhKfYy;W4k>LiCPM}LQ(coT#yoxbd&kNvpT(_hP@XmioU-CaH zeyBMat6|0ttf6uWJtGp$o(AVp%q-QsTr$y$=!_TWTh5m2W8nds2wjIPaD?~>yY?|h zb$sONht|^65u}GyLW=E9ehlV+*=ve$dpiFFxiYFF-@VEd#|gL&2<attdq46!)PYr$ zXk73Ji-->F<Iz4n8=ny&SEfh8M8O!|{u0U$tmtWeYf!<lbP}DTBDGj|B(%a3iga(u zP2ljjDv{kxwpQpwb%ooQ$?YH4g4}!Ma+l!HT}Y49PaJa9@5@&3b67`zAN!eku|00{ z)sJh<+EF#E6Xj~SX@(8#xNHsb>+>{&{S9+bxu@Cc#)@qdRlUKSh4-YTMD?5Nb556y zP93^zVtKEZwijR8j~RFX+wn>3ya|<<WTt2Xb9^7d(VWns{HsD=nES_J0JHK&Zd_Ah zakOo4M5BToj>XB^kj1Nijlt<F3o0PkrqguVJ81n3)yZkT_Sj(%EJSJ?m$`nXULo9m z=87-atk^kdGh_WgOxdDrppf8GQS`lEVmw%Sb*7kwd!x|en2)GvFl`Cd5mSfgHqVAk z?1Eyezseal&pgU60Gp(sRUBNfKtjwxWXtLWXNk#N&DCoVSS>Gq)H&xo<wX33gT3(% z#SRVq<LO9~qMxWQPg~yN`!TfJo)v`;=bHGg*pKbV3Dl<Kdy&Go&>;JA6;{{TR{>%! z1CZo)ll)`Foe3h?3w2}0r=n`$p6pMYVkw_#U#W|*%SP$-aP_|hhs;o)?_aB(97RNa zdA(g(J~S_O(7aZEqRhMD+w(th&swu%Kte=FQ8p+NH<P+IZU!cz?(SU|f1|#|Qxacw z{3K)Tbdw!0@{>_x+9fa1Do`frx7~Xa9T69_XmueQqrkxO?P-AaE~V&~8Q<G*s*3mC zY4fFS5HvvM2SWD`<+2rR27#ZS5_;*KF;@iylnOmD;;YktUxK|NHMn)EF<n%tS7pPK z9^<n^%W><=?S~Hl<)s=h8|^iOl9qSU(8jj$<UN@c9BlaKp!T3r5FTJ$0RAa^VC9Yh zy004+PZgN}pi-=`T0CZUm79wmJCyCJpt&;mV(qr5&%o!S-~J8PtDV6E!LCgoW-rsW z6dm=>M%GDx=b4oZrNQO$c{)PlV2;n_!7K2iQInFaK(R4b!%?mzsefz@C+LG(pg$hf z*A#|{<hTCa45*=SWLR;*sE+kumG^15WJ=1@`Ds2dEp3{p!ahEx`K~|J?apQK9_6y9 z?}75gF(JIO=-u|VQO>i57gP7s`fVQKFJgb0Hv*x5t^u_9>4@pWK7Nz^IP)M88C0R{ zr|RVRBq}X7+kNUU8>h;MU|u;p&`n0N!Jbiz89!jgifT)W>Jkb{H|qTImSfQV8ET0a z0b_6;Dt2s-#p7HIcEb`FDr6z3;(dJFTFT*cc*;rzo~BP=$#375p)(6FT+fKE7kPv= zxAa|qGG5syt9{2sTyntAN$gVxMy2ur@tw79EWMA9*1mOhc&b_FT%jBJydltN4U)Ea zaw75ejg3inxC~M#o=?uBX|Nb3iANVQvNZd=qe~Em_K$Fz<*d%is|fQ6y)xcP!4DL+ z_iS47ge42zw`99&xq4QqGqXidXVTl8s8D);@RE^ZTsjmP7BA#uK6|xd#q24N<lAsB zUyw0-B=AQMLbm)V_`xqWk05d*B>IQ*+8Gnk_N!g(B)azxX5D0a)R-rfT;mCrRzMp8 zG4pzG7RsK)igV`fy|d<(?sxZ(k`)`b^!71Sc2CErP&gL9gOFc&FMT&Nm52>ut;aNf zhz2!gW8cnKZ*4cf!`A)~>k?bn;kW$$=u`VKEfP<@6T7hDY@e<!GujuPgZp;#=hSa= zCYOsV@S=Woc1S1u8t0}WBpqjg4CK`;wrpgQZI8vRhjw0Et|t@OZ_s>luo^jYodo0e zc#*Vy-II9f#2DNFOtBCS)RAdYttV)I;?@~sD4ByPI1HQ_Q7U^Olv`~6@=hd8k+(g! zr`}C0%zOk~(KvW)tzz+{Q%t_nz?q^?&Y#us|2i=>lKRU9QS(XPCbEPVz<&e-VFG{% zZo=f_5DZwqEiHn*D&pR{4j8AAmb>#eXEb225msEHmVdqe@rY$~7#>Jp>+UUoRx8T2 zVDxSwO>Z>9kZE{O?*lm_DKu!eBumHC^=<DRz$Qp1(fBxnwrIB`${2nxbHWvMue!31 z1cqb!W(MzZWfWaik^k!uW|{dkPCfaqs@gY=^qgX!3iGQH+_nsKlb#OBq~?_3_faqa z-8_cB>4zdcNM}HIV8E|02M5f5EV&QHwRC)<S#Ggi9{FFG-1#_)liZsdk=J&sa#aK6 zRuto3C_f`oxL6Jv@rR7^OXfNG#IZ$qXCPy$h<mp!jp$5#BHO1?jq%yB>VJpw@|v{d z1VDgC`wfj2LVwiE*^8IBLf6IZNKFu<)~qE!c8i_rG9PNNSQ|`xrided_u`nS7Bx%F z7=6R)cPdG;<Y1>DTg~CDpE3oTMb*A2qT@2ylzhHM-whrS>=-4oBcoX$v*wlUCx;K4 zLVKLo{mL|Kb+UHrBCbo=cKnDBu>u-sU_`f9z|BnePaIEG*CTtW`(o6gStJrnE!f8I zq62f=!3B769qXS~+~`MtD;t;7mmxbGDwzk@ISubFdTTyhibl95kwv@4**6O0R=i$i z`qT|Jis|r**$qXV1HNtQjUxGGM0D<Loaz5OzAtMVG_kC-%QfDU#}&G#XokTFSrYst zSjp76Sn(kt>oFEv{!~0)g=mJ72?6e^{h(*Hcv)x0#i@^rG!~M7L8J6ndRP>Tj4Bq> z_hkBsVjU*T1?p;+tgs-~)BdgDUO9w#E4g+)aHiv|4|IPWf=ceZQQQoAc!fto5^u0w z+oVejtmaF0%%fo1>LD>GFsb1dN^1v<oZuuKWXcyBT_07}!g)11WC&n#Nlr0Ssk}Z0 zjG?Jo)<!Zv%yE@}TP_glP-jR;d2f~E2FBE~%?(@LeG{11;(o;}37lE*jo+>PwHpx? z0Q|9=kZyu_+25NnvKOGca}>j~7Pbm1qUqT(jH-IHf9GdQ$}5U2An`B};Boh-0f=hP zccaQWb<}O-)wtT6rb-UCh>uHRNszPY);7RG2UEym@3m`xN1N7aq`aZcUM*_NI@}7$ zg}Vd+Z$+SNh-vb^4<mM0AzkF{9|~H0D-%yJqqj+Ew`+>iKzYk9s3UoH0&`*B2%Y<z zC18&%UVFFqSZL4jv)97}V=aMPN^85leHQD(EYQ(I!L&jJa;~QaT2aX<Q|9`_P~X!e zwWmAy?Frt0wvEv1QBFhN8M#QB<3F=g>-mwIb7+6DQC2}aF&&Vw8kk|`!Vblc__KAf zeKukWFmd@U{1cOEp+wQx|Fw_SDMtu{V3B$tvv+d~qpEy}S9Mz2SV9z^9|qM3FQlM_ zsgq8dcP2t3aQxMv?sce&e+%b2f#Fs;XacQC<Md5`V%4c%*}_(>MO8xnF4-^bUXy)B zGwr31tM>Xq4WG3CxiWg_k2B17XcYgC>wkG%TYDEROr`bP9|wJ7T-&qBNSx}-s{1O} zF9o{qX>V|ouI@D6NuGhT1sByuZeSrRf_BTN>cZ1wR^UCR<2mcfgT$#pqmPd9a1rj( zoFylJ!j9B`e(n2%L6WgJS6%_+pC}rBEz7wnZLJazHTyBx9Gs7XRA9LT=~vgPtmzh? z7Gb<y4+l#Muq`dlsFYu<7ylQ>3!{z(+M@ghuBEibzO)#Ruo(VP-uJ+h_MLqWIZMVi zc0Qq-LS@wZCe?nVbZg8FRGyq}@x{*!sYe@s3bX6*g(1q{ID-dAOXzWLJ|1&3X6jMt zPR7Qymd-xk_5KeYS2i9NfC0>$;svr0V|2?nB|TFNp0r(!a>1VKB8^C?fICGV6J28> z#JV{<=grt+0qL%A-;;D&2TjTbe{NLajlQiOVM%mVupCbTizC|Mg1GC%p(d;t;Vcn< z`JR)q*&RMvJh2`wlqrqq{LJC#H?mNshl2@kWi}WK)S+}@PK$JpI##xP_|wy*u;74v zraz-_k|I-Nmyujyc_7aA^PioiILQx@6=s0>gL&~BEwD&Hbh?nV^fr~u7wRQLT)G?& z?B*Y4FyuZ>A`nx1EsH|A<$a(3g@1Q{Ch<GiHl#e-{(6y(pQSCNs=ZEWuk#B>o?5}| z*A^r)y<-nr#u!f(7Yg;`cSXkEeG#Mf<vi>O)o@zrLG~6cr9a!;)MCqdRCm$OoUr9u zoDN(pi_oh)-ty5d{$Kid-7OJbl0BfWsp?-XezhDr*KI%3l~iyRR44^80{fAFp&XF_ zY{n@c_o~M(Bg4dbcHj5jRtgT_Q$Aq~!uqW=*zN2k86*lT(5x@dz|Xs}^Ok9flATfO z7b}sTl)Q3mMu^{IA}3XUNDr%eM5jYyxEVoE_4clc55;zSgCPHFx%;gLYf^G`^3eMs zRMXG=ki@qCHCB%gwD)(rlgbi*QOECaXq!%0Pw<uK$vfDq8!(R-ju`t}>Fue)X3$67 z!0Gx|2I9Y0bjM-**jb3H*-8I9-!7$pBIu}ghpBS=`!R|NzoHBj$3c#NFX%RLglMX6 z^0Ev!=Mt_FR!uQ$c_jNQ^qN3)@5d>(MDt~+3*EnZ#7LqyWc-zvc|UW1`3N2WM#uif z%bgK&zw|x5TnqrJEp=^!8G|-|?YVv<CUSBo-gaMdCaV2Z?KJ_;CHgYO%meF8AOEdj zyDwkY+^%<PvhO6h`Gm%H?d`jwI_PiD_0Iz>84}qjgYWzy*@{0aR3YHWlOGovEK$uQ z2*p44R#XbMVE>*Dp!z+32jxIY2@H>f|A1)kizsZt=wJcO(Hg+}1elpL8`bHgHU9xF zRF)_{CI208@yLD)`@TEb$j$E;pNT4-)eX?<X-oAa)lJ_D(PKRX4$k-<&0Kw=|6VBP zL3Zi<_fl?ana%sN6)h^QLf^BhLwaUl`|;!XY(eA028G_&AeiKT!4bc|XAIy37$H*L z>m;k1+Lqf!=?+0NIG4)>Syj2_G}@~4c2O>mnC|R5Zv|>#(Jx-ze@|7&p$`_XNoFVz zmQ9HFu%A7t6|JT<f0F-@{<c!Gk#omk!~AD?Pv&TU58?0kM2@5eitP;;Eo6r&ZK~{u zZ8dNd;r6!e#&EHJG~R_U`Vf^nE=_#0x)l4MnZnEZcX_X;$lmKJpf0ZQ9()p*0Sofs zSm5+p3+IzN@R5^ig$L)1vSx@DIw{<qC{U9d{QYm)2kW5%$EfpMh@JT=yi)F8`CNC@ zn>%h7%eB8SycaXV?~d(!Qrq48`#9-@%Eb1QBj`XjXs-l+zB+i*awqz}615#`e*Nwf zlk}Gv=s#1XHWZu9YiiXAtdNZ^dxF<kY2pA`L_^Z@n_Py{?wH&pJvY0lgZ|$Kg>T}o z`I86_^nX7tY&Ngq9WQpHpw~>qAAZPe<u9#q0vZU}3YT~1#;ES>7`MaYaw+Lae;=$_ zl-Z`e({WONHpJ7zNuta<JH05{Rgee7#ve>E>bqN)uIP=??B=$e@qKEka+dK@3r@_` z{UmhvU__Zb1BKMPlX#}<e9}6)q+$*J0{vFHo9{#PzpP|Uz*-I7WMFl(HaE{0EtmX% z;|5qK|9#xRb06`%@ZY$>>(l=hH@GZf!WLXPT>=4rJblErjpy&2QjQN-qG`#g%^~DS zPT+P$;NO;wuwTpG=j6Nq?sDh7c6HU3-r*c%HtMq_YCiSh?0WqN?>?6g4-Kyf{ika< zzfGR{{5#atXRr{@sxS%}O8MVk)t&O|zkK;JR38=5YIyOIf1<fu$M$-ptyE#llO)!0 zFMZd4-`Be|oos8}x0#?}bCAjq>(d8<%P8@pqaGxlThEF(ksbyMCSMqIS#(&*y!ovC z<Qq4kAHnn$8LnsJo5H3Z=I$dD;f@&fJ6qWH!Dm1R+t$qz1X`UXZE47AD+f2P$%6X$ zXAQZix4J=9v0)~n)#ClIytmtoXH~<w3rt3Td_|&IL9|gt<FY=JxRMWl%q;|mC_<;b z2uzdCjx$*(ne9(ocO`Z7+uX+9{|qOO7g6~hj}%aJIJat=$~qF3oK)3ztd#;mt<L@0 zr&}raLdExAKqdVl)+^rIOLaLF(Qo)sT}>|>3U}Lc)taCkalmYc2Ez_N`zQ~1=0PNX zfScV&LIBzg@e<c9ctC_MW0Clq;)~&}&LO6I#QE97&-??_UV$w^P8T~_r<KZS@sF#Q zLBZa>HP>0KOtHe=H&}Q=>lx9yc1Wu??UQCkkW=AAnQ6wlQMdqOK%BoGOb4`%HD5tR zCbgwG^iA=}Dtj%J(DIcp3uW&X=<bPxe9z>Uf2G-S>`x<HE0?9Dr}hac9Udgdeb!4& zV-i_`j&iQ1uOkgTClNnKm%LZIFy!1k!g%cE^M@1+XA0#t+dS^RV;og30UYlEeM97u zs8uewK5!@Dzrel@#fs%ZlOHAiw5(`h<2WYTQN8i}G1DuRO3l4uD|mXGxfV;gKMTl} ze=DEE>x^ha?!?|o)Tps0?XT3+1>Dgk8zQ^s4cSr25!#~nzS`I~FUb(*0I3xjgQH^* z%ZD^rPV*}6u>=>qE^nRU>Uah#Dw9BC`hY)2unCUWu>DEt5on&a!<drYE1N&TU#j03 zYh-dYk}4eL4x)+8$%^+(8nGSd4#6|9f0o?1@;H*i0!12aFa<6}PS+gBTY!P=gLKI1 z^`(Tw>=D<b!*DpXtXt6%ycH8X$%VUtRmBJTGI^>g4H+#eM@ok9Y@woiFu{SJp(sdZ z-Qy}(7ie%)cOudIiGfZ~G12|{P-QojAN@cc8fME5fESWO?P)|j=V^7rQT}3*e=TR+ zScd=z>7V2g5P#w({c#?m>AWR88R1HE%c^+$xDk37afG!$#A@#}A~t$42T%^9=s4%8 z*06ru!Sx4*Y&WvPL>W0x;sFbB5efc4Y^8~NmY}pZN1>(psGCFS>M7@pK%Le^R%q3! z@7w?uZg&8VI|EJ5Q`H|@p@xa4e@;<~HRPYY728$+N7{hH+zR@jHZ_bV_CNC()aMe6 zI3K4#C!;HHoraJqQ7u8lF?P%^-4QoF|KUzT;2f#m8pLLdqD9j@iBlQJtzN{qnLHz= zecNq4M}Dov$#BUH)y5*|eS`Oi=-z)f##l?We#Y57l^Hdy0rZXagwvcif8!3ApkO&> z^!9qPZA8fUAvEmI5NQb&CsX7sx9`T>*62hre2?<GIo+7Ah&`6K?Y9qn0TeJpVs)T` z#y}2l9pNIFOHw+*|B$9dp=4aH#G=BS3C~>ZJOe*FVLdfpDS^dWM`^@^PIzz80iC+y z8o+h~_s^0>;-4kWx6()ce~(1yN_<gsQiB1~>nt8@31)jndQr3T>-knVIJjh1V`%kq z%_~iHQQ-Tn&}Wp!=EiP0l$D_Hh0a><nIF1bW7~`lFlo=~5@*X5hX$X7bWHCCt9rRD zenHm(^KOFERO%7ZJV<|y>r8i85tpl}`&m#{c>WUh4|tpUHN9~Ee*#gq5c&HEp9A%X zOGhAG_eY};5hJahO$-ysrxnXS`Qa=#_^j`EbvpI&S7i)Dq8bZMVms~LrdoB)5<G4) zSnekPj#4GDeOFp-LjB+oDGGw5BMAyKVcgK6i^Kq4+M#X^I8TX=kcfwNQT9^TK^Lp& zGJ?v{lV3mhk{n)Ke+O8von1GNj>F6<@VjT!%AK0K%W}Ej6GYg^q0{bF`)eoZ*t}zo z0ZRAl4Gwje1>D*{#@1mGFI13RkEo0pFZ#Feq~1-wtXC+ZN*|RYr`U=ax?X>(1wY4@ zH^^9UuV&qm*KJ_Aw-J$U=~pvotkxEj{v-ugj(v4TtKH0ve{I)dS7q2Go58%g_S=G| zHHfbaH*3Y?=He82YmPYLs@z~oY7H`!Y6O>8Ql{j0_04rnD`uK*ob^*1gpd&T6=7C{ zN3Sw(Z_bJJzBfWVc_2y7dC^i}umW@;X7Y@jcPd6RcfY6kqWdJH2E3oqiw>Tu<TIIZ zHHPg}g-sGje;zk~*T3$Ltb6(6_IMyws8FXrLj>ed*VR)>mylMeW_w4+Anr_`u&hh( zS3g^}Bh50k-lM-ob(JFnE3`ra+1D+ek?u3o15iftUn}S{=j(5ZzWegsMW-rmKi$E? zX1mvzqC!~s2rv#Pp>sJ~2ikh`Px2H;F%f{j0^7guf9s}(SdJrJB7AR!EMYpRJ$`=V z+41fvPsWP&!vP|~X7CUnNmk}#jQDb7tuG3|5>&nytgal9cJWbhIO~Try=yR>JSOIf z#xgyv_hu<;uFs4~HD-^#sC4853C6WHpeE;AcA}Z94#&cMS{dgnfw1m!8XA+{`Lsvn z!)^KXf4<b$G#Vyz<@B`Bc^hed2KD#xPw6A<z@xP=^QizQd*Cv=<9ff2D5z7;&KB_m ze7HI8U`s7HtkqF}6pviq%Ol$zW63}HR5QHzBK=7yVcli;v8B0?i*AAnkhn{Py(#%1 ze)US4DI2I?R=d$Lba2~>7P$OXFrJ%_=4^p~e_bRCzlnu>aDwU~DkF;|`<P-i=5C{h z@WU#Zo$6CY&^hyPF1Ij5v0^!2hlP34ozC8kY~*NMVA~p9-tZ%FLX}9l|C>-qt65nM z$$jKAuH*YFUO?(I{R9?%^}xjwp_=eYSv>hl74ExTMW;8`_ZqE}6j?0E2^BTr8X-uy zf3+NV2>*b+ns_$}pzsP=QM}%kWpfqs+u$YbGVlz@iye04!CQYjtZ_Z!ReJrH-gJpO z*vu+IupZa9jfZ4JV#1|4k}T-Sg$NC~++dfrM0WPXc&!Cf-uk<NuHC64(6J$Q)5V6T zznud^ncDx8D8t&V$BtJGtXt-3z|{v)fAkx5>TlOrO}N~>$VVwBVgpP9g^cVuVhk5& zu-`>)>NY)b4M*Uuo*Pt@fZo+i>+|F8O68*cHdG0&J+A&6x!8tXSm~}erGRSr(fhL{ z9KK6(#BdSxrc74!Z_jT~3X{V+*JC!tYaR%x8RyaxEflZrO$=N_sURaGadElcfBX3* zknK5Pz{sAED4qseB?V>AW;1+6sbU{7*~rLP)z38+4%~XgGDQjF^Yi*?PwFQs>9}cF zM^NN9IJ%djOXy^;OK7WFpEdQ$9zR;_yuyvnWKKI3z(S0OkjcCTk0Dbiv_5#)ap7Cv z&}EE2u+THSHBm^4j9+bgd8%0Gf1;G3UgT{{la(tOw*c8JW>JLOVwip&RZsu!+m{Di zcZ@RPcFdXMTJgISv27Gcs?(>h_)b=gX<<SA3#Ry<VN|CCd|0NEHZjn&{QLuM8XsR^ zKd4ZyDc>|2^u+PyL^ceOl!~66=!8B;71>FMcde)w<N2-*(+YkWGrQu)f3BnfXd{0} z!o{M0pup8Sm;z3~iEt7@qL^7a{OhUX>!3(t%NuH~^*3U(^cSSFjqG>%$bOKwyHaJ` z?~VCSJdxy{9Gras({&P*GN4g`O3G`Xn1}J$z!(N3&Yf6~OC4(ss(sT;YCE?{q}m*% zj!Ae=GhT%K);98Klx;Ypf24(V7>CCdTikWgB!Q{aub115+}n6+wWZQpuSXR0Y<JG` z0h7pOx7dA2c3TN2u`)ZR?NL;Gl*WJ$dO`S*LYP6`qkXf1r*V?~RXB-qA%}0{%G?ik z5^0JLTZgW9Dq~TrA0I!69q0bpu@XS_zRjUV5l0(*T9u}z<ou&#e^2cGAy>O5nc!Jk zIj+MAuBhN9hc;3NN%MH*5{+%yCu_7}f#3mt*ysaJS&=!w`yBTxFBNdbj0?{?A1_wF zx3<TFneN9ckR#I(mR$U4x4?vr4k3Ad*y1hLX}%Q1cVa)SwIVQG0bHz(z8c9q)?8|7 zWsvaBS_J30PNcjDf8p1se4enA$$4;1sM?ZZ+;&7Z$;z3aAe5&pLX$9m<6F=D4qrGA z9jfR7X{36)qWPx&)y?Y)FW5yW{3U96(ouqNUhaih!iEeG8W{q4PuOL_tup$-_v_f% zax2M6nw*gi|GhQ5k{~*pN)U*ONbz2aYu@%U)on$(dmf9kf1~gbyl>a)k5Q%w(d5&c z()igTUKoF5v`ce-9Iz49@yW4f0oBteBi@Riv39}Y7TrfPHS|6W;;O|EQDFdIsr3+x zp+%~H%8~!-WOJD2Cnvh=FsG!wl_HsYC9QMwC&P{H=(4QMF>%>lc4W)55|atfSL0ST zYdX9W{J{n#e;-{wNc|nx-wN+VK_z%sFDk;0eHUlHu6z}$A{jC6XV^6^&anQ}KGEm< z6I{A%JmGGH-Y#|ID&=)8gdSB%9m7={-bx+;a|o!u-a2<rI`d4m))MMuS7CJ|9nUft z9N-OVv-q<4;l%%XR46%^tYs;lvD_QE1q&9cJ<YTif7<G*&pJQfS_TFOn~5vS;9d9c zy#AESNFuYQH`C=OiqhrgCS|ZjDTwY7?;+;#AxB&1XUZ|X(8dmcTl;i)kL7xX`<op5 zrl;Fv$(#xAY9)*SSLKRSg{WR4A$K^cS&7tj_XJ(UBdGDHX{W-!!5%d1RVG(0+T5yk zoGUlJfBr~*<W1PI>z}5xPi8GVBty>-towkLF^lmu1g&cKGxYyr@4DlosJ1_LjRjFb z1d(wSDQ<4&-szzUp$LQ;nvmjTcd}Wt*$F$FgwVwYDn&#Do&r)MDoqeU5X7f~0!mXv z+VjywnhJu7wBP5J*=%}(kSD*F`6rvRckVs+f80~P=iIw9YkzHDdo(}m{o2!NkN#a8 z-)2VN<qNBfd*{Hh!Jl^d<g3_q9}M^-;ClS{czNxkQ(CN_db;_+xf3Vs4@`XNz8Uw7 z$aucV+e^=#29uUQGy2l$r`jt$pYfok%U<cXq1lYJiv#a1{$cXrRv!--a%{s>O-@fA ze|f{F$G#qW5&W<{b>xYeE&iA>JYoEjWnI?Ku9-4t|BU;<#+56xrHkC`y>HEY_K%N} zYSviT?AcnYZ|L$??44&LroP{->$jaZ)^;77%^%O5GPuu4(0X;34;!rSyztn76YW<G zxYfF2#8%J#DhIzif76>^?HmJo40y-Cf9#u{wR)Z2kvMth)6JLvQZ3NXdtYKOxx>$Q zN8OX+P=Ag3UT+rhzISx31M?R>^TRNu-jYDShuXgKVcZ4Bf^F3|Z2xe8Ye5J2U}EEY zs~#IVV&?moMh|)9qkp{_Q|F|2n&YK<+vY8wSWEmgZTmb94szD`X~oFJEw!zqf3v^r z=*h~Nf8xoB|9IqL*Xu|Au~EJ5hHgLHIs19Xwz$pl&u#qqaKEANDi7^xI3{Y>O<&}6 z7}G%iwddySllL$CWWk~5muW}O46FJdc<}C=VINIvbfWpLCl{XA98Z6eyLw8s%+X&S z{i)fl={;N5N|`?U=0IGc`}*JwfAuHalr=wL^yoQtA6r-7p*kO|=e@q?>8j_N_ULtZ z@Vu!bX56-QAei;_+>4X6J@<B8)8N^Tmu7#m9~}7OxqsI@+a~dC*9WT-Z<%(-uXlGa z??1TZn-3?Pytt<`zaaaDJw9~n4FhkPJ%3Bb9)ok|zUTO9q(7ncv|x>afBpKc9FV<z z!*qSq+?hY_O}lsG{HAmE4E^HC2CvpVd2_3#ky`GItP8u|jEfl2uDbuHY0n>=bYV`l z+YZ&9H9jq^)n4<t<(HbgRHth5)^*Q5*sreAxz*DLwsz?MMDth!>~4d^`g=crZoqS0 zK0P(RMb8IMId;D|Y49x@e~#rI%l<g(kwuQTx0<~JA2$A^`I;Bjo_?gS)V|KApAH+@ zAR)T>o}r1ulP0{Q|J?oQZw`*DCSP*Aa`fQjb&JomzI|4!MU(m8+CNyUzVB1>VHf;m zmwW09$HoQf|Mtj?!P)P$?Z0s6u{j^gYa2$-pY>e5+(~=a-tyeMf9Y$F-h10yy(h2Q z@>}(o>DMLC{Im1zal(nOkDdRr-fusyo>Qyu!e4&gd((5v){Z~9kbfm^)z)`c8jE+= zi`uXSz19EM)(dXgb!K~Gb<oKkgXGmq1Jjy3<UJ&hJ(U!9re<Aq-D6MJn=xqagNMaq z(&5eDeBb)>L7SJJf84lY@oU<mo(pQN8(VwwYYz14j$b~%E%wrT4^Fxd?*IMy?Ema| zNBHyRRV|lSo8jsF@mEdnPyOoAOupWMt}D8nKHj(89?P9PdrIRv@gwH->NjP$6Fl%) z-40xHXCProFgl@2!ji}Sbwl(s+h^B*=l=VS4A?fb%?A_ae}32TPv?P|YlKOBZ}I5r zYVTzqZ`Hb+yH$pj-FE$^J9GDSnA$7#+Z#qKAN@$gL!S)(@}WH)4lbY8AaL9JUub*Q z{`qFd#j|!^fBenu^&c3sqU*QE{b|A%sUQ4&`1>wvwRuPP>|Na?dcwdZ+iF!6&&_f! zdwXHy2Y=Yue^#06K60ks{s}`r95s6A%f|ZqMlW_%P5$lQb-PU5wfmP=4-9&0wE|AR z@bbJ)N70Zz4~<HE{6m+^{X%Z1L+>Q6TJ_Fu(C0*LA!6)D&Bkn5{zdOz=kC}uu>0DV zrZ?UfH}T}cmk&R3{`thkJ%-=5qvzMn4D;DU_*RwQe=qIac`+;V{)IDE`d8%+b6&_e zbH`^(57hr`c%w1v&h_p(`{7eh{r1C_T5TVAJKmgM@B2N^EgoOz-AnGi>o2xi+pFv9 zwatRs-mNpEhMoUq!00N~=Dc3-r<nte)#YCpljL7{@`3TAzIHdhzTx(*;~(2Gs~i8i zd#wMPf6ouzcI2lQlTY_pe#_@)H~n+-v_Z}@!(Dw=cYkp6jSo#8HhS^hqiW=yTeelt zXy%7g-?+`);rjI{QFlyf7Gd<*w$(r7?dKM5I`+?3zjb!IWn1pke>~n}RhMxOd5`YR z*_U#B)PY-S?|VMs_N`~8Wt{Fi_|^rZ`<`i-f7_trG->S0Znw=CwdLy%M+~3-izViM z`CRROm#%wiP4^Y4Gd~zLa_ascewdTg*!@cV?8Wl=T5WvYS8aLX=a+-$AFaBs&POA! zzogusc%Wyy3qL*&Tl_eoNv+3IH-9&4WP{J{;wB3nerfc`8=CXkCU2~ZUof^ujm}MW zf9#j`{rc-O$9MmJOT@CePcFJ~(#OL-YP@*!u}5G3X!naXswaK&eB$KP>DyO-mpJ3j z^y=NJkG*9~s~aDfeM-4?(z(~_^}2L-uOA*<`_c7tj%C#zwrj_4GdG_~_+ZGRN}s6N zZ7!Z!9W$+G*ZI>2EIIf4pLbkn`^IOVf1h2nul-Y}y5GC`@lR$ncy9fG8Gnke42geo z=jI(X(&~6yW@n6e-nIO@ZpLwL!6~8V^>dT2kNwa3+qS%s^hxST-^KU(Tqpe6a7&K` zeX8%<x9@Zp|ErVEe);O*sl8@&L@!pK^5|!6+s<nH-oL)s@vGH;>*Hy;X*caZf4FYm z(&lkpyJd}@b@zf>KiIM+qGQ_A8&9vE)O6V^2OsLu`tfhtywqXJ-JRRi9lxx>1F7+! zB_=2DjCsH6D@(RKa`e6P_g??Sfq4GlcP~v(9a^Q|iEm$=_`;B1?n=yz9M$K#$97fS zr{u;rYFu}Pvhl*47rsjRHZZl>f4xKEM~qy$@B9lr=AG<0^V0Y+kJis!e{MjJ_#{}R z>!iV%LweV|%c^FaIq_{&ha=TvAAafOjy3$+vZ)j1%PWl68~5J50)8@Y+~<ELPJA`` zt%t1k{g$Tv5;bT=o1D!TzkTh*3!VJql!Ix*zRij|yX1~T=eHlN{_c`vf61S{_`w|2 zIpv|TjvVXZhyT1=K9O~Pd%MYw9$UXOP|u_;y%WA$QS;5Jjh+N+8(xasHL$~moJ)7j z`fBOiDK9jBulDoKfp1;-V3{!BtKa_hPG+5b4L`W`wT5F8S2dI)8dsfg$I274R<9e? z{0ZNn;UhNJ*|YNHd(Q@5f7}u4de?JUUs3m|Ll1q$ui0Ef^WR-}#7#qA*?RcQss?>> z@4V;m*qPOvJ^Scgjq9(QmG<$ml_y^s{GUDbA81nleD~K{C!U)-FYTTod(Jof2yCf) zr}w6==7T$T8=E_<eX(V_adfP-W0m;tjN7v#2Y$GBb-nLut-pEDf4Cv{46M5F*1N=; zlMgId^GU0D8Q%;Y*Qmyb(TS_#>h7+&K4q7&WNq5gX^SpgnA&aBA2XhPcF3?pJ^dTc zPn!JEqEVCQ*X(rHnpGVRA3fXY_|_kn7<X;z`@{Ts13mjXjc8P3QJ>G3?pZ!`==aU0 ze|e<($r&R9RcGJae<F9{Iev4!W!j~)$A7*5*oTjF@3!luuNQar{*-%by-p9kK7P`s zd1G$aHnDckkAKkG-k0#&PkYneT>DDb;lDM>JrVWH!Si?Rj*O1qzkP4-N!{*R>-|11 zef5;Y!K25uz30T)2ku7KC*4wi|DdTxRWvVt|HzY*S1y{ff5rQ4>!(g`d_|~{kT`8e zT(6%$s<!opqzg^1+bwrmw_!-fetQC!s?FOqYwv)-J7?0Sbn;F}IR0Md-L>lu85Uh* zb7a?^uigA<wWbU29S}MA-swG}S|0lT)6I>?{&+r--*Deoqt}2|`y1tKT=7NV!QDe$ zKM(q6%jkAde`sf2P;bj7PvdnX+s=&pbjSE^?>1T)f3C*9YQJw;)xJfeDZj10Gji<N zPd&3vPfotntMfmWj{4Ue_~F)7#!Wlr$ve`xmlHeQIqr0eIs-P&e)<XPe7oi^FFo1y z_E)1`9o{`NVukZSy~v#j?Ugpa9(!cV!X1qUZQI=Wf7^QQp8tHNxmA5pV$U-VW>p<H z*K9fB=-P>^y3g&CeRs<zZ<YtgpMD=T`>ffAEvgUs^qV>x{_RbUa*tQOI(1~Fb6oS+ zZW#CMTy%3_-@^-<A6znU#0!g#jlQqXa{t(u>NMUkR(WsL-XHcf@V~ImGd8V3>#s-k z+WcbLf8rUNYM)y5<Z~x$o;y%KwX3x<&@}h4o^{?Be$Rc)_dnTJT=)Puu<^H~(e-|o z|Mfa-{_yE(E8F+^^IY`>vC`znoBdYr)_r|*6UX1ZDE8uxS7!JB*QoDWF1j%G!$}iT zo{1XMXU!8o<!pcYlgG}V-a7CttwX;X2mRRmf5EmMar}x?>-&z*t+M-;6^%D@Ym8H4 zYwi4~TAM!mo1gPn-8FFgXKx-EdvamxO>Ga2O#U_X<Xz_;|6|qL?UppyJ@kQ(PF7pf z+*|diE6sQ6{g{9D8+*s_9iMFJKl#*3&xR>UPyc*s*)MfhR==~)@|dsAw(t9xzwdtz ze{PR?sB@#8xA!<Q?tz4XvpRm2yQKfmZ~O{h?fK1+*UvX>vu5R83+7MU(7E#+y@gRj zn!Z`>qnW?Hx-H?|!Mc%iXo9!tN$`Ho)Ov$QcTMZM^`HOv;@z2lyt5OX@BPWJ9AV-0 z+M<0I)-`^$`)33G_3wvwoqT?h<5K4de|$>(?Ke&Xvv)5XmMFY?DB<WM8`GXMmpwRc zMPhQ)=qJb2Y<%bKN2forcGx2Rv0v)cQoeStuJf30(&O<d-{dZ~Zk;))U+;Im_Br3& z9=*DMhp*9vnLkV)WGP2SzVwRGtkI6zQ<g8Cd2#OQW5IP@kL~IDTh{pdXG!Xqe+h$j zxxR{ZrT;m%TK`KYUT-hMZ<Qf;&OQQC#@4)R%?PRMwi8Wu^*vba#cu7DPxl`=qkmB6 z?FY<9fB$pnQ|G?hxc}MI>Z6*!2e0dVI!U-^`UpAq=OryR98rRiDe~hp8ooE+%hyN0 zp#6ReJzeBWAG~4in6{aHzWT(jfA1f^@yYr%YUiZhbogxd*M>^L#EJF0kN?k$KQ4d! zrXx*ezx`x(_eJ||s=Bz>#Iu=W=H#qtdL-jL!}zJ@iY%$gT6ko~+h>02_eV}ZxZ~2Z zP1ZH|XVOn&w%-u3!F8tY`xo`b^5iXxj*VTubx*xl4^FwEb@OEdt!IwxfBnAdrm<VL zYW(D7)%w-{c}~aK$7UFdBES3agI8NGR`$)BH1%MQ+;11P-P$a*=d^A)yRUP9v+Kr7 zi@&aO+HH-mRkQcQ4;=XSkMsM-jNdWvLc53i|2{jqce^{I5>`hydNp%=r*5-WFO$FC zEYx`_c+-LV`>g)r#(JklfBJXStl8(*X06vY-FCzKYZ|<m+hNzo9s2j_+Mrvmc42Jm z)E+1AXti$n4++nHHL%OH;8QtCQjOLbnfKnc=Ff-Pce&$Kk5-;tON@ROc6G0{8ovBa zr}1CZ+V;xcd#BwzKtFurfP}@vS67{1wZs0WoM(jl$4;ob>$^8Te~q~Dc~`>hUT>o% zZI1rq;O?x|+edHfowI%VZ*_*G?wR<;;xE4c$MDmQ?mN)sy+N=2;}U<}W53*YTg||Y z%lNtX)mZnUC+hqP_wo1YFP-#RveohR$JU?x5~i+;>vL*b^~7g7*ZQpU<7tQPKiTqy z`cY3sj$bx)K;}HFf7zy!u8qe(KHcoiZ+v%rf1>$}YUv-n9-X?p#heZai*l>R-T%tW znzs+=yX%`nk56{5`nq?uen&5U)BX{w@zT9LC#H`1?T@&6>qo`3UN~l4!r`nV8)xk3 zT<c_~8E1NXKldygcjnOH$A{kX?3i)&JzjC$c<Y{K^rXnMe{-MUE}ZT4??suxUVC$r zI{ZAo-vc|kPOUw!*W|=iUre8LeAA)bn=%h}-*I5h(eIX|9Djn}(f_gay?+?0_IS*_ zqt3k#cxL`|gXiwo2QTO`*J^`1t+M9Q#l{i$HQ<I$?Q;H!nLXcK*I{#~4#U@6{PXsk zZjS~jH4{O%e{atJ{EU0-=Cj9hhF&<is^*%d171FG@#gCv+w;N6TSnb~|4-I~#hoK+ z`JYYG8h<gp`Orx<*8~p5{uy=Z(z|!Qn0usYs<LFvp>`LJW$(=0w<*x1Keuem!H;iz z<JBkb>OWw>u+O(nICWr9(Z?0;y6)usi@)rP@t)r{f3L;HUppM^H)PYLp<mwJJE~#* zs&7@PQl(0})}2}{Z29!?DwWsY;L<a6SE>=o0|>+@Z@MSSXL`&eN(EMy=Sqyh^E@w$ zBKgbne1X467J0D>6ci-L3a=nkg@>{P`6?WLB?d3;%Cv%dpbF0iOfy(gyVAZdIJs-& zYGP%1f4KhXKEKt}ks1tUL`OwsXJ><K0hj?#6ykY4%F6OMxNNUGnA+4KAP1Lfcs;2> z`Z>#MWVbZ?H+AqF&k2YVkfT`y$2D;qDHi^~aZP+)zo7@(26VUA@CP}syQw2g$0BtH z*B>@@AP6)b)pKzDQBwyLAy5^qo`cJQO&ziTe>7gg|DdK0!~+C{dJft-$2GBnW(H@b zq*z9<se`ZQ;4mT5W%|rOQ^zB1WKBbYBdX};0t84Xbc>?3DE<~z0BWIIT5F1mWc!vT zQTeA_HaR3yIYc6;09k@e5{d{EQDB0AiUJ@~m?Q)l$g)(NBm@M6LVRki5ig6yO-&X6 ze_4Tix5Q|O7nI^|Q6vDxLbtR+f*=)l3*-we(v=XOi-}L=0WXRnJ(2+une-F^NQ!6+ z4+2ThDuqXd=Vro#DiEM-3s05+Pv(TBCm|qew(5xx$dX)UBSb2aWmMdpG$4s;!CPb* zwN_gdD>)UYg@moODQSH)5vWQL!sZ3^f7fJZ*s|j_pzyZc$|8`V!el4P0#Kms!Jq<Q zrRFi|r7-CUB2ZOZ@gNT*&G!CK;DLk?6JDeSAXF=*N2TYnbx#1YB80@J098_L@o5N1 zvhDUFp&$c||DQ13CQ&vBY2x8hygpx3hu`!Y4lWqb{Z@(@NN?&OAANezXrMM^e<Ep; zp$Ai0`^<o^!6W&=N<#<dZtCcW1&&l6O0ts&P~|02R78b~fdYU?(_{#pJP;KDN>Gs? z2N6J;q(Dt`LLfjvhN`S`5CYPc*PIAQNRg2&%3N$dvdkkv5M_ajg$O_eB3?#L5g;fk zs-$UzO#YEERg^R+id+mtK$T=(e}K>_072jtK@&JA0ErhQ9+KgBq#!{NIVb`s3nCJs z69Prk5Q2)v#XvlUfRH9*vM4}}mu1`-2`UtjfT>VLs-lU-P>b&Zs;YowEDD8^m14ON zfJP+fM1U70MN@DO0uXo+OW%orLPir*EMkGq6bnL8a0?<GQIw!SgeLG%e-kAM5&0BB zh9Xd)BJrBy6alX&DuO)ZpafJl4FRYc<RxChJxf4UBvF+`OeSI#WiAHF03i_~QF20{ zVhxdG5%(c6=6Il~f-EVLsuo9%DXzH)WSOpYBo9QY7`(_8ql|q*#!-?+Co_%KfP^HZ zK@~bxAZrR%M~REk0PRn5f2wxZ5(jy}Q~h!(KvsBOP_Y{DfO4uh6#%L9u&j9?OJojC z3|Ps^kS>TpsG?H_P}XEoQz5Yk86inlof42WqN7+I5FnM;1VO`OSrTMTmcq?P0#tdB zh^Ydx5&=`O2_RJ@UC5AEH4!(4>^|IB<H=l|B9K*TUtCcp6<feqf1$|p3S*6q5pJvy z0*I|yA|{MS6`_o&JpLfywu(Y0LIi~EK^0Y}03c76Si=I6B&=bYQvg^!C8QxtMa1wC z);gm4m<tVPWOfqfm@=nw8juA=kVGEOgDw(;oCc^nz+xcZsxrQxr>r9)G))jx32|5t zh`P&88StzJP6YyCe*kJu8L*{@Q2|zYD9D0S26T={;&2?2@xoy}5vYD?oB||`sJG-) z096yHaWM*zm@PXMpz_%MXk#WQOeJ<G$(SmOh)1Mjm3kI|i_J&YD8B+1s{)1kJ<$ny z0EtpiGPN?5kQG%^Re{QaDYpg)_kyZ$8bC7fagtL5&~`dSe;ZBN49~?3PXrQGUcm`9 zpfK)YM4-s3sz6D@WQ0U)4V(xxm70(fsz4@sBXJTyyeP{Wk}(z9t11C8<Wv<PlNAy< zi8%{N##BDkh065C31uMR9weEI$y;|!<{1|<5GWBjp#(%4**L5XM75w3ia@g`A_GMx zfl$L_5n}!!f2RQ211~$F0959$6@chG5T*)*eF3Y6NNq@S;>gA(q5y@cgCb!nViQq- zM%6@gLYOB`74X=?kc6ocQGAV40mPA5!LbMefw(u7QvsspMtXpnfTI-dL8K0ZXpu_A z!l^(atByJ5frK5hAaN>CkSg*b?wALNX-kX>6yma}f5s8Tm+^RtsPHPJjUkS4lE@XU zov}r0J~kfWBPf|Np#TZ7IV(V=Mv0{+@z~KpY)~50Ufcnq9uzxzfdpDf=47BzO%R+a zAQO@`k&}U}5@Wy?!qAL{7h0rFKyhk7(TKMcI2k|^j(9p}>b$VJ***{QfUSOv1Z3=O z1x+E6f2Z-4lK|@gVX91+5U|cOK!8`Dr|}PW0V#OERLJ0$1R(B7P$8jGUx}&2ar0uh z{=|qt6*a615>+;;uQ;6}C_y5ciKT`#P6Q&w2}Fq*qKXl1peA6A7uYl~lp%gkCFVgi z7jXhmsQ!q=lt}o1T#Nu@QN`9KV6sBvBPRe!f3(4c40z%laK|D;2$(8pswfIF?n01= zt_YYcW3eMV9-`W&V5&xk##HPKAb~ezcs?{+>~<lxU=G<@53!pOnaB}PSa`yYil8Gw z;bIX`sG^FP45^}Vu>#O+UyL9S=xP(PNWCs5i_9`&M8K1o^Rg51w(H|?j3a=8P?`6{ ze``S^E)+2pvYEw*K(v`gJa#&G%{dWBkO~TOr>aEQT+yz$Z0_96+&KaY1KecZGy~vb z5TGnmcWw`efXHAbW{w6J0aFn*cp@X>m~ju`R9i#{hy-FHLZp%{KxBX-1_7Qdh(H9S zQrEyiz*C5WiHP_&R5URLyHjcogfFJSe+USn6-B@X!UzahyprlfSP==3AuQN|3SqU? zaERj|5E=9$jVZR`u#bhrVjw0%Itb=MVps-~WojiH1R6s#m`aD{5DWH*aG?^kq>vtL zM2`g92XZ{nSUMs*kq87tz!Qf-Ez9FD+0F`LAV37`N`x%h&@qe+oQ4S44dV5ne^^!_ zJrfs5<SE;>h-4tMFv<g!Izd@;A`Kv_DLmjQm{TR$DL|mv2?t&urZ||+auSZm%0S#B zX|B)|kW^AwA}T<veAMysKxUbR;1sZ-5tV~BfYh8wvHcV$04P!KfThR64t5zVQX;an z%ohp(g}T6L8zEyV#Z{yW$W|*xe*lOgPrBeF{NXMHp5+giN>u_=S)z%lJhP`50f;Q; z!pbNUAB9<#Lz<85^pg{SYQrN0fnqxh0jLz!Vya9`j<ludPR3Lz#DqrUxs=aq6-_Qc zWpKP`YHZO?HKqWWSPk~eRL^8cTn@<~RIX@8R5oX3*kz7<Ni~buBz@*-e-?(*CXK-~ z47Zq!Bn+$wSi)4B<pL?4$o!!M6uV3UfgRr@pfD_ji7W+`fWiVR>4442DdQ9j10jg> zBb6ogGEiv3CX-xBBpHQM0f^xkl6cw4lmZl*jgmB$IVq<Kke#n;p~416Ld+54WI@E< zjF&YGg?JVyHNf&i43O-ke^~_@%YZQC5vbvFv0>>3CNm~tNoGomHJBk8!*E8XO$eFE znACeHXu&xPPf}=&g91P-1Zw~hv@OwM0a0ov&Wos4lS+$1nRco`q8S&dEHG5#%!9v} zs!?R=%)`pG-oqS`VnY_lK@mu_$b)5XLr5qBm8Ih{P$&$ON#TRXf5Qnl<3v2gRveUU z&k?Rd7%oxF=FG!_w01(%OQ#65P}NBSb~YsfS)phUQ%Si8;kKe+qaP>%m83mH>k(y$ z)PblSIz@&zB}%1ch!b*=r6w_?l!Rvmabp_tAXyL^OK`_D`XR1pBP*MsrZ7XzL+2z7 zA;|*CSri&EuwAfPf0PPj8l*{jLp`~G^B96@RRX=K(}pzZVMRx5hb*3{0BLp&4|`4u z1XKViKqDP9H6^8iP+Eu>o`YOiK8Bc#F>Ab?L13X!rw|j$a}cH~G{|rYptUB6B#?GV zRRPqlAW0x4W@Itpd8G(=>>x;Ofu{jL#8io;e=<<)`UaE$e`J+N8Azd2Q35jcF*p$x zC}_ZFn$^c}%0u}f7+Ybfv;<VU;sq6eSpFyh*+zf_X;Z%<0g+$?sA8lo*qB2CNM?!& zRiHBHBLSXO1)&C5AmBux(n1=E2^w*FO8(?V0~!mlm`V&tAyhV;h~-XoI1D+*h(KoE zmY{D612Os*e-ue0m>dFL;bkPr7^!18ry`98QxO{l?gAl6Lr5l(R~8hAfd#2*tGpm8 zgeq$i&VxmOcvVsqg?6DL9tYD{oC82fk!c<wYfzFA<YIA7M@^c<X^mJUA<MF$NpwId zPo7Xz6sSrHB~y)+m^LYt%5<ne&!PGV3I%V0W$p@4e`s>6PytaerP|ODVHq=&f&&Pm z22XM-jV4{324uP*63MhEm?x2mm>O0UyK;`Bm_YFe(JR}{^FYeeOqt=Muu>yVAXy54 zV<}Gyb<VufGcCq48^x}aZaCz*0g~LZxJ&Aw)cKJr58ZqqRbB=`L}oxrKGv`@;V?(* z#H_4Jf5;5FK_0M71QThjA(dw8JPDP?XetR>5+`KaL*pn<V+x@XuuQ1b_z9J`Glf-} zNm`A`c6}AQGnR=!0f?k1O3K6{^(5FY(R`Bby@XsQ0t&4#5O74d4lq@-MUhu0h8V?C z-pG2;WQF)PavSM_xA#*7rj05QF||Qw-sTgLe}zWWI3F3WKP^UwJ55r~BAZX)R3Zxo zDlp5;xj~2*lGK_p>L6HyP*uCcihxWbH|c`zn2;ikL@kVn)2=~a!4WpGIGK;ZRFQ~6 zpjeZ{HX0LHjK)G{g#k>Z=@Kd2Q^j!ReI#A59F~-SSa1vryO>JxA)zvymp3xqFtV$$ ze<5YSjitOes8WB6sWO8E5T|%J;8W17*ySed3rWn(3uv@1NfI_fC2&P1)X;*2<V}Jx zQF}5Em4<6l#H3+^Q1c3&_7)(9c|0p3V0E(5k-h2)sm9S{iJ%qcZg_iplJtOxY7(R& z(ln0j$r0=;5fsaEbxf5)0K~3r;w}VMf71`E$73q3auO=-jZo=*1n|<4Nf)fx;naY} z>dUw>t9D@A9olLNnXFT@cN}HXg+#-mGtb>}d8omu0f_~7LS+sBBYu*X&<;qcQ3Ik~ zUd4k^XN&Kr-jU2Lk6nqT&y)qoBCKZbkP<CsmV)O-gN{Tro|T_9ppn{@B$EwJe~smS z8c-Q3qnpKrTN7ilHwyC7hj7coR94D>Ha>8M0uQlhO;SWjp?L|CL<HGxo~mhd=>%TG zNi0ry6b&MkW;UXXR2;8Vpox+wLz=<}lBx&@H)hoy(pX{%VbQR*Y|z*f+FxO1U>u`a zVTI)AcA9_?5J)Ksr}?z<EfA{0e+o6><pY7$$pu=Y4I{IxQo!(<)};xRNV_1FU~Srk zy-WyO5S_IEBv!-5M5clQkXRjx)K~1Ceys5n{2{?kW;kqLY`+wVfM+Fa0YJ8QfT=Rg zRd5dyt1n=(%3z*=XOF`%bRr2LI!_K`XIlEkRGICf#^mKgq%lj|1m+QWf5HWW!PpS& zLkMA|u&@d}5`oClU75iEiB!|<-6sWzcE*esiAV*JO(I&(B4isXC_ti+7-1^gt_<6O zL<oeEwy-P#A)vBtblJ{SX{CvYO$Iz~*I2O$GS^l#Spu4EN~Ka`iY6D`aWPyd0MTV6 zq7Z2!z~$|#5=&r(I~54jfAtd#%WF8pAbB6nG*nV6W;+ckkcd){Vzo@0<`oezm6hNz z3!(H3!(|o_WFXqO7D1rWWyH`rq}qAtJeDGVy3QE+vrsGoNKJy4?byb+2w+|rO=a6C zMVdbI9!;V=%_5paSy`TD5&!Ko*#FHd-}(PEZ?f*!qptKAJkRrre<T%i{-1tk=l`KB zN>z9$LPf5^NmrVYqOSk(^Z!MyzgxFblTAI~zCxN%{`Hq3k}B7~BCe9xpM4u^daTG6 z^m8lw%SgjzfoCk!U+Neo|Ne)UB(cEne~_risPgwe6>$xW;5dgK3<kW(nL)#HL~{cP zwsyD;%N6iu1ihx;e-X_&unKTg1vsxiXm|oT{)!9fio;3oOZ5hEFFgB~s#KhwWw<*h zKV!Ip9gUzK8inH=mZ1k+sc~jzz-6?L>)Z(sHZb0i;`IfMK)fTmZ-O)4k?QrN`n;ah zU<;ow-Vq%PWE#$RN54!XkQ48S9vJWN>3&b9?lIyW(eaKne@YK)5$}k140gslvW$S` zHT|rM!4AU2V8*IRCToQ;;no9b-BXQp+--{Pvy8#^EHiY!;R`kGJ22j1q$eA0x1Q`X zVoZOE*F*VA*E3q0nSQrL|4lZ7K{GumfTv<Jjz2^SK$S&=^CC$>P|##&yu(KrMZ5$A zh$PH@(9B5ke;FzHZj}|Fh)9ueswvBY7P>JK-zm!?FC%F%zB^sdh%x+3sv-{*C}@(T zA{nVNFOoy0P>~cBA}N72H+?=mP#WtRDZxonXk@7J#c`|gdHk_v157g=&y%s(C+uHO z!0T?M2X)#*D()IN;~ieIqL8d`cDy56RGsmT{_&1zf804<ZqhGVqIQ0_(Lby?A$BuT zI_c?DR|p}ACtv1iN4!G;0^qUI6tlFYvWG(K38(;js3`tWN&LYp&z}(D56X-`!f3G! z3MDa!t`LK2h(9sJpS`-GEkB5gU{5TGJ>iP8Cl#-KLQ(8VC9x-7arWdq_V@zq6)8Qr zB=)3of3p|waGAc$bU$``ed8S#@$Nu(y90)0k=}f!2l$LE!$<z3I0FGA5HJHEEWVI$ z(+$faz8$+I%M1i*uTKQM>4p{5(=$jb9I)aY38gB&QvAw^Md`g#l4#^&MU!BM3e06U z!wQ-K!x7DqFcSJE=rc(C2#c->Tnm@Wuq;mZf4ey%56*|bZ5<P5_sE8GL~}5Lg)fKK zjXNq0uaO=c>0Tz?o}rHHpdX6n(HxzLBQ!$5NHGG2-$g(|U(!Al#Odg4M4j*-nd$fT z%QPa}b+IDT^^DNyq`hBHClhDhH}8vJP6qiR%WGxoKJNg+X1*|8^q2v|$}s(w5$Q7B ze})xlrbGtKjL06{Vy%(}hJStF<bauN8G#aqL4SQ1GsD13=J!NeIabg}FL6BKua8F* zFA^(Wq?u&|BC!&eG^BXtm#{3uN>^y67M^NJ1IdL4qQI4n5W#T?#7gXM^DHT1@P8ZQ zmvogW|LbT31726ir99cadzV&`mJz^9e`E#qV5U`KGFV#v2NhHx|5F6MGXJZPtE~B7 z=PV<T<u$T7GsR8=sRD3R0V>nK%fR4yDGU-B6d@l7ij=Q@5)+TTCH;`02lRCInL(@& zinGV}XZm~?Xn6yMi-I#k8a#M#IkF*GFdO=NB}1Ww;7eME3dx1S_!EoAtVq22f5}jo zp16$^J<}JAF@0u$k$5hWgFH`q3V4zm@J`5!PDyGQ?<j+2NF~@nQL1r;6RE2?HMy|T zLsY`lu5c3eS2Cd@lf;V1gc#HaB}1XOQ=a^%Y<Q(Yk|8>FOqU*4IRT>MJZV}%+;ybS zYXz@z=0it}HFY<Pw0ydi8Y!{Ae^9#0*$^E%&SeIS{Hg8LNrvcf-OZrxW67;yMe2Tc zWLk1g&?qq#y8?L;9lb|J1>{0>s9t6ut(1(mh;*o^v98&y=zr%bD*vOH{K_2zDF6Pi zB#J`i{%=KGC9Howr%>k2-XgA2@_#7va)JCGLQ$^F|107uHveY@{1Ck1e>g`Ht>aVY zp5QF9PEav*019VQyoS%-S#3lRF9xkC0o{{s_=8E7cK`;c2#SiR3bLqR@M>DYq@eC$ z8xv13m5&VdY`7yyw@=XBhKzs_-n^970i$20H((?YT2i_mbftz$2N-o@Bpr^Ni<Al| zC<@@E2)vvnj|Of%s3%#$e}JK<1N_-Cg3<PaT?q&#Sxo*S2u}UOmfZf!abdeHq1ew> z-@*P($fp+}NYAQ8#Ep~<#TRrur2%zTi6tmqEFVfwXPH8y!bqn)i&Gd55praP9t;|R zV&RZoLjEseq0;?7+s+|-0hbpAO7s7U!WZ!WNK`7H|63tfdHjF=e{I}6olgx0GXVB| zh7|<qMljWM=Y5$O@BuU6^?3cduh1=Y$A`J2B$w%~3@+D3a48|SP=8U8p@oh}x5@Kw zrI#n%6!3FbG3byX{w5KpbpM}!gY<HefKvUxSP=gsK^7|ge??qZ!vBZP^5l_<J<yZa zgq`ZCbokf0!zXK8f06#4dL-=c|AM<O;@rpoe{Wy-D$4)oE9G8+GGO`Ze+sWCmG!@h zxJqCDqBgS1hXP88|AH(?1>(Pegv$6|Ay-+?|2VE(=q(s0a9?rcE*8!5TvupkG%p6k zbm_rmV&K3P+A9uo|C!#npdQR)U~my}!KQdE(v~r*duV(fe;DuZy7L{n$vYt9%Cv%J zdaRyo_(%)Plh4%Mq#+5{gq*L~23#4LfHuO>+j6BE={jjfYf$7~?6~QzSsu2t&zL}k zm@xVW4ZquPCnbk|U@|!0@CD9CV-Oa|(kaJ!X3(T(tG)gtx9Li9nVEhJgkS;YEQ7$G z{M@<qpplg7f3<?9C!nY2XH+P}XmJ8bWt-LH1~cF$>S3Sbwn;5>!q$LcFsUGq89r|T z4ueJj4<F8$Sf*vnv@jc`EF*1nIm;-Oi3xhfw^TOlW|zZ=TqZ_bsa~HuVED@>7Q1!Q z<;zDYA6sP<REV*1OAO<1pVtZ+ej^Yvv2gZuw>#GGe;9su-nm5G?e6YPH#+KpG@{b< zpbMp&rZ4Et$ZN~a96i+<8*|VKYwZr`*|A=~VYM`Z*@ofoVtQ!<b|*3C4AZ9vDZlgu z7-S9s-R;e^y5aC0?}*kg#mvsT({ky)LibokQA}8=dcb(9MSpMDz*ef69peqSd`37i z-86%#e}vz#+ld3R)2$rV4b7{FKPOD&+aHMJ@cOoniOatjn9+F0U`I(C1>t9GN<i}Y z&nXZ<ul|LTJw+apC=k5Ld}zGD8H$S77APnFD|Eo9EJ&~v{D)wn`i~?ar4s*D#C6T# zKU)JitbygifLHFc^Hl|tt+TKb<`^I=L!=6|e=G?t791td>$c*a3<qLY9jzs2y3&kd z;99BSHp2*Xp=Bz_vsl#82zp&si(m_%FV@I1eEH*-ncYPX1iiYio0*;OoAR!DNii$G zP8Nz@K|R@5YWOPp=w@XgtGur2RnGWd{BhqBfIw;WAA}0le`G-vE8~AfT-RLuCmI+f ze?>v*Z&U!nOmR|)@zZDOZXo^76@QA96f9j*@bV;8dXa}RP=>XFm$_J_mv|}`Z<SCT ztE_HRbaf-ldtFwMqm-Z9RKmr|t9(~E@n8PmT$OPfuoV0!^RiO#`ERlUEAd}NT-O}_ z%hSNW5&nzunU>e@;asNQZ`Tb<i0xKre-6M!?@S86^M4#7{%zn<xo~BxPH~*iG}AIO z%DVJ!zm;U)adm)Z+koyeQZjwM94^J{_gbl5zo)F+c|!Llh248~wi?^HeFo?98M?ph z((}4~MpEdWtFzbG!7ws(pEs*yRSaV)E$@cQ;Yck*_TurBV-bCJ^UL8zE0vqhe;J0K zvwUW-to)c6hChkka5)@7zEqaF8M+&LV)k={vN9H+w<U#cyDauf4-|2RpRt$W%PA{! z7QHEn-E>*3mA)eo7t{km%v;%Q&|<eFU9Jhj(xU<S*?n0V3ev`x#Y*WezL)ML0!lFh zml5f+>D@^wX5jLoePy;@(b;+!f7ZOLY`uslR8(f@mDk_tDrf#*;zLl1D+iR4|3jtF z^WPN-R_^~)$aT%-|3m{hTLZ~ca;XOXjmiO(N6J=-@POczB)ef5kU+ZLzq}_s@(ZjC z?Bq2qGef09lN8e*jH3y-%sb;9sk-0oGdh{w3@g(Yf)XVL<Kh>-P;9mte=RvWm;OMf z|AAm#PXC|x7^-so1f(?oFH1tf`Y$g^mHxjXu4~T!Qw{tZIeW@biGDScG+}?PmY<KK zkK@fOGduKwh)Lz<sv?{{Tjk62>;)c{_dnpqFZ(K|{||dMVA%seY3INALg&9kBvkJI zRmgSC`G2N?f1?1<GSkZ8f3hiCCHh^~1|(-%ms!TG+~xZ(@A8qIs`9M0*X=9MW>95~ zx1wvjwm-S70&l@b<yIn%%In&?%8dVteXCRHIIy(e|0%H0@Bfs_=RZ`;b<N?w9z+4T zc3mtkUC$`~0YHU+{g?0kmrw+nC@QL`DiW`%f`Xh9;59{-WF#eAe->ag{Ccv_2n)=` zBFH?@Q1H!oW%;?E9&mg8y3ZTTv0wgB%)o`wA_jb20*1>Q_8J^#5&U=z6ZlM*UgQpS zkzmkcn5nvzn&b)K!OMhW3W1YULl3s}W#aXL68pcS-k-e@l)R>rki7oR8M=$iKbi-S zkvo}zbnLYZ_P&d-e@?p*fD-SBMz~wA)ylB+U}iuMh6~L{U{x2>@&@fUSkQN#vR9rK ze1j^Koc4QCyW3KT!%)Y~QMkfUL}uBy+HW>>#yhe@@IAD2HiluZA!1TuhG{d@QO~fr zjDVTtbsKIjIfv^J*OtPT6g>MNY2;1UJw{XpJ0;}PbLbMpe>>>u87r7Wp;WwsE@43T zTN!$QEU7Jw@b`E?`#mG^j?4gs!KuMuh7}zZm8@Gvx}E|2L{oGh{_HWcqV#~v<F%qJ zBar2F8CDc#v%8sLMs?IPXq_smSI0Q|Dc(^uKx0pJ%*=1^g@0V>^%+U&dPeb3t>pI+ zRs>`#>d}&ae-q$V=J+4}qQi1N1hTaFk5Iw*FGzCb{%?g`*IfK>$@Gv*4j6ix+syWt z9RvJ-4eNOWXIe%eN%t83Ah<GhlcHjMc;%!xCQEt@R2Y+?ICC}myxgKnL44x1TABXL zU>P6-Wwl^2qsTC4`_;mcEyG(v{h`o%XaC3JSmkwje^;5~e{pXFE&~=QE&hwB;P1aA z1y%0<RLFJB#sAiMuSCas$kEdPe+vXq&S&+MJ-+|lHhC^5=;wdo|6c)!19$w1^`3yq zexmR<`aydUP#~;sV7e)vR#11P8T2`!e{ox+JbN8RQ8rTuZ-lRMF{q=&*TPo>0x9in z?UeweoL8CSzkiuw;KlWOBI!dk%TWj@HUBU4`)^4^mGA$lkn5U@|DA0;WDkF>ECiI6 zW1H5sQ427w%5nf_7E<r>)dh-l)0G8+%Bz^G%<<oTSzDybbQ@NrnGzW^Ga`F*i!B`p zl$!tZg`WQ>E0z2I6>?p3@xQy7!C|fAl5;p)CpoN><$pN}5PA@>%k-H6_8IX!@vo04 zty?0w6>+*EFH&0THmWGZ#5*qY>Aw|RLMZ+CWsh#L1<o&qzo_wQpSQdmL{sc5Bd;~I zP^OXrJwaJ)0ia0ikk1?}&P?Hgwy~5CM3n67E78RNqwBKce>wI5N{j!Jj0(noNveGQ ze}!DvTz~xUR=~-Xe-EIv@Gm2+wFIx_@c;jF2jS`gfXW?(^6n@Ugc^ToSD~cPQVBM$ z?v*e8r|W)iieUvoPP*?3j!|0thf;y(zd#8omGQqqE_!Y_i3PK04gwzV5m@J=IjS2G z#Q39GWQ_>5Bq|f(^STVbWkhqyy5)66grNre4u7s)-rJueuu(*FVef;EaOpwAV+Op2 z6&(@DWgE#60mEnLxJ#pdh7s`Mh@$%<0!F%-g@Z;khy7KA%k;a6XSAXtIF7;+5Mr)= zq5?F)*N?DV0mJZHsb-M$Zv|Y@T$DH6W524I{c116?}^~Jd^63*H^<@75zRparT!3V z8h>t0=VG6>&euEbHVKC;cM|)dJ^N)~QA5!mqp@G`$B}k<Luyd#4|%1iA-yg#|L~E0 zrpHXOe~Xw^c&J#@V}|+`P=5gx=-0~fJl;RuhXtJC^&|z2^bDUKq|1{}FADZd_Lp_P zo1?G=&mf;V#F##x;R+UN$E5_!bh{I;-+v0~*j-0(oY$X`86?Xa$vE_xo)oXoAfA>D zp0C&9dMcU|uiwMvKWvV<%G)dt8<<WxDsN_m#xHF$rLsWPg9{%bOAnCgV?L<pQ%x&q zvG_wd3mW}{Hi2^VWLTT@OkdE;EQV6pTgBb^h*qkZP2Sp=kIJw~H2XJ_!|EIz6-5P+ zg1rQQ5oWgE2;lEM-e78Gax`c7bSvm}MTJ?o6>0wr;J@wbDzC!V{{a91|Nk1rqhJ(_ STmT3F0RR6Xxx!HZyb1vQQ#9WI diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/pipeline2.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/pipeline2.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/pipeline2.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/pipeline2.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_logs/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_metrics/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_metrics/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_metrics/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_metrics/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_metrics/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/data_stream/test_metrics/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/elasticsearch/ingest_pipeline/pipeline1.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs2/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs2/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs2/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs2/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs2/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_logs2/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_metrics/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_metrics/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_metrics/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_metrics/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_metrics/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/data_stream/test_metrics/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_logs/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_metrics/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_metrics/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_metrics/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_metrics/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_metrics/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/data_stream/test_metrics/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml index 0ab43760b7ee8..28979cca0771b 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml @@ -1,5 +1,5 @@ format_version: 1.0.0 -name: datastreams +name: datastreams title: datastream test description: This is a test package for testing that datastreams rollover when mappings are incompatible version: 0.1.0 @@ -13,8 +13,3 @@ requirement: versions: '>7.7.0' kibana: versions: '>7.7.0' - -icons: - - src: '/img/logo_overrides_64_color.svg' - size: '16x16' - type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/elasticsearch/ilm_policy/all_assets.json diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/elasticsearch/ingest_pipeline/default.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_logs/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_metrics/fields/ecs.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/ecs.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_metrics/fields/ecs.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_metrics/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_metrics/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_metrics/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/data_stream/test_metrics/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml index 1aa1410bd0aef..b389a86702fa8 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml @@ -13,8 +13,3 @@ requirement: versions: '>7.7.0' kibana: versions: '>7.7.0' - -icons: - - src: '/img/logo_overrides_64_color.svg' - size: '16x16' - type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/data_stream/test/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/data_stream/test/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/data_stream/test/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/data_stream/test/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/manifest.yml index 32c626b115739..f4b6eccbda957 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/manifest.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/manifest.yml @@ -1,6 +1,6 @@ format_version: 1.0.0 -name: multiple_versions -title: Package install/update test +name: multiple_versions +title: Package install/update test description: This is a test package for installing or updating a package version: 0.1.0 categories: [] @@ -13,8 +13,3 @@ requirement: versions: '>7.7.0' kibana: versions: '>7.7.0' - -icons: - - src: '/img/logo_overrides_64_color.svg' - size: '16x16' - type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/data_stream/test/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/data_stream/test/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/data_stream/test/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/data_stream/test/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/manifest.yml index 773903a69e7f7..be7c93484d987 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/manifest.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/manifest.yml @@ -1,6 +1,6 @@ format_version: 1.0.0 -name: multiple_versions -title: Package install/update test +name: multiple_versions +title: Package install/update test description: This is a test package for installing or updating a packagee version: 0.2.0 categories: [] @@ -13,8 +13,3 @@ requirement: versions: '>7.7.0' kibana: versions: '>7.7.0' - -icons: - - src: '/img/logo_overrides_64_color.svg' - size: '16x16' - type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/data_stream/test/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/data_stream/test/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/data_stream/test/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/data_stream/test/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/manifest.yml index 49c85994d2c2c..630788b00fca7 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/manifest.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/manifest.yml @@ -1,6 +1,6 @@ format_version: 1.0.0 name: multiple_versions -title: Package install/update test +title: Package install/update test description: This is a test package for installing or updating a package version: 0.3.0 categories: [] @@ -13,8 +13,3 @@ requirement: versions: '>7.7.0' kibana: versions: '>7.7.0' - -icons: - - src: '/img/logo_overrides_64_color.svg' - size: '16x16' - type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/data_stream/test/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/data_stream/test/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/data_stream/test/manifest.yml similarity index 77% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/data_stream/test/manifest.yml index 8cd522e2845bb..9ac3c68a0be9e 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/data_stream/test/manifest.yml @@ -6,4 +6,4 @@ elasticsearch: index_template.mappings: dynamic: false index_template.settings: - index.lifecycle.name: reference \ No newline at end of file + index.lifecycle.name: reference diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/data_stream/test/fields/fields.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/fields/fields.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/data_stream/test/fields/fields.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/data_stream/test/manifest.yml similarity index 100% rename from x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/manifest.yml rename to x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/data_stream/test/manifest.yml diff --git a/x-pack/test/ingest_manager_api_integration/apis/index.js b/x-pack/test/ingest_manager_api_integration/apis/index.js index 7c1ebef337baa..ec509e1485a9f 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/index.js +++ b/x-pack/test/ingest_manager_api_integration/apis/index.js @@ -5,7 +5,7 @@ */ export default function ({ loadTestFile }) { - describe('Ingest Manager Endpoints', function () { + describe.skip('Ingest Manager Endpoints', function () { this.tags('ciGroup7'); // Ingest Manager setup loadTestFile(require.resolve('./setup')); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts index 654aa18fba523..c3862d130202d 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts @@ -13,7 +13,7 @@ import { export default function (providerContext: FtrProviderContext) { const { loadTestFile, getService } = providerContext; - describe('endpoint', function () { + describe.skip('endpoint', function () { this.tags('ciGroup7'); const ingestManager = getService('ingestManager'); const log = getService('log'); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts index 3d344c1b3b51b..6c5764faed631 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts @@ -10,7 +10,7 @@ import { getRegistryUrl as getRegistryUrlFromIngest } from '../../../plugins/ing export default function endpointAPIIntegrationTests(providerContext: FtrProviderContext) { const { loadTestFile, getService } = providerContext; - describe('Endpoint plugin', function () { + describe.skip('Endpoint plugin', function () { const ingestManager = getService('ingestManager'); this.tags('ciGroup7'); From b3c37cf94cc461cf04511b6acb3880439f8fd858 Mon Sep 17 00:00:00 2001 From: Jen Huang <its.jenetic@gmail.com> Date: Thu, 1 Oct 2020 11:09:59 -0700 Subject: [PATCH 64/64] [Fleet] Fix agent policy change action migration (#79046) * Fix agent policy change action migration for encrypted `data` property * Parse & re-stringify `config`->`policy` data --- .../plugins/ingest_manager/server/plugin.ts | 2 +- .../server/saved_objects/index.ts | 14 +++-- .../saved_objects/migrations/to_v7_10_0.ts | 52 ++++++++++++++----- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index f0f7bca29c99e..6237b6d9ba357 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -172,7 +172,7 @@ export class IngestManagerPlugin this.encryptedSavedObjectsSetup = deps.encryptedSavedObjects; this.cloud = deps.cloud; - registerSavedObjects(core.savedObjects); + registerSavedObjects(core.savedObjects, deps.encryptedSavedObjects); registerEncryptedSavedObjects(deps.encryptedSavedObjects); // Register feature diff --git a/x-pack/plugins/ingest_manager/server/saved_objects/index.ts b/x-pack/plugins/ingest_manager/server/saved_objects/index.ts index b3a8c7390176f..95433f896b9a3 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects/index.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects/index.ts @@ -33,7 +33,9 @@ import { * Please update typings in `/common/types` as well as * schemas in `/server/types` if mappings are updated. */ -const savedObjectTypes: { [key: string]: SavedObjectsType } = { +const getSavedObjectTypes = ( + encryptedSavedObjects: EncryptedSavedObjectsPluginSetup +): { [key: string]: SavedObjectsType } => ({ [GLOBAL_SETTINGS_SAVED_OBJECT_TYPE]: { name: GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, hidden: false, @@ -111,7 +113,7 @@ const savedObjectTypes: { [key: string]: SavedObjectsType } = { }, }, migrations: { - '7.10.0': migrateAgentActionToV7100, + '7.10.0': migrateAgentActionToV7100(encryptedSavedObjects), }, }, [AGENT_EVENT_SAVED_OBJECT_TYPE]: { @@ -304,9 +306,13 @@ const savedObjectTypes: { [key: string]: SavedObjectsType } = { }, }, }, -}; +}); -export function registerSavedObjects(savedObjects: SavedObjectsServiceSetup) { +export function registerSavedObjects( + savedObjects: SavedObjectsServiceSetup, + encryptedSavedObjects: EncryptedSavedObjectsPluginSetup +) { + const savedObjectTypes = getSavedObjectTypes(encryptedSavedObjects); Object.values(savedObjectTypes).forEach((type) => { savedObjects.registerType(type); }); diff --git a/x-pack/plugins/ingest_manager/server/saved_objects/migrations/to_v7_10_0.ts b/x-pack/plugins/ingest_manager/server/saved_objects/migrations/to_v7_10_0.ts index 53af5ae42e410..2a49c135074e5 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects/migrations/to_v7_10_0.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects/migrations/to_v7_10_0.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { SavedObjectMigrationFn } from 'kibana/server'; +import { SavedObjectMigrationFn, SavedObjectUnsanitizedDoc } from 'kibana/server'; +import { EncryptedSavedObjectsPluginSetup } from '../../../../encrypted_saved_objects/server'; import { Agent, AgentEvent, @@ -94,17 +95,42 @@ export const migrateSettingsToV7100: SavedObjectMigrationFn< return settingsDoc; }; -export const migrateAgentActionToV7100: SavedObjectMigrationFn<AgentAction, AgentAction> = ( - agentActionDoc -) => { - // @ts-expect-error - if (agentActionDoc.attributes.type === 'CONFIG_CHANGE') { - agentActionDoc.attributes.type = 'POLICY_CHANGE'; - if (agentActionDoc.attributes.data?.config) { - agentActionDoc.attributes.data.policy = agentActionDoc.attributes.data.config; - delete agentActionDoc.attributes.data.config; +export const migrateAgentActionToV7100 = ( + encryptedSavedObjects: EncryptedSavedObjectsPluginSetup +): SavedObjectMigrationFn<AgentAction, AgentAction> => { + return encryptedSavedObjects.createMigration( + (agentActionDoc): agentActionDoc is SavedObjectUnsanitizedDoc<AgentAction> => { + // @ts-expect-error + return agentActionDoc.attributes.type === 'CONFIG_CHANGE'; + }, + (agentActionDoc) => { + let agentActionData; + try { + agentActionData = agentActionDoc.attributes.data + ? JSON.parse(agentActionDoc.attributes.data) + : undefined; + } catch (e) { + // Silently swallow JSON parsing error + } + if (agentActionData && agentActionData.config) { + const { + attributes: { data, ...restOfAttributes }, + } = agentActionDoc; + const { config, ...restOfData } = agentActionData; + return { + ...agentActionDoc, + attributes: { + ...restOfAttributes, + type: 'POLICY_CHANGE', + data: JSON.stringify({ + ...restOfData, + policy: config, + }), + }, + }; + } else { + return agentActionDoc; + } } - } - - return agentActionDoc; + ); };