From 4891f7c09e23ddf20135c6d1f76c994a2dda0ad1 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Tue, 23 Feb 2021 18:43:47 +0100 Subject: [PATCH 01/45] [ML] Fix Anomaly detection alert condition validation (#92377) * [ML] config validation * [ML] validation messages * [ML] fix message * [ML] refactor resolveBucketSpanInSeconds * [ML] fix messages * [ML] change validation messages * [ML] change validation messages * [ML] double bucket span outside of resolveBucketSpanInSeconds * [ML] check only for started datafeed, update bucket span check --- .../types/guards.ts} | 10 +- .../plugins/ml/common/util/anomaly_utils.ts | 2 +- .../plugins/ml/common/util/job_utils.test.ts | 7 + x-pack/plugins/ml/common/util/job_utils.ts | 18 +- .../ml/public/alerting/config_validator.tsx | 95 ++++++++++ .../ml/public/alerting/job_selector.tsx | 22 +-- .../alerting/ml_anomaly_alert_trigger.tsx | 55 +++++- .../public/alerting/result_type_selector.tsx | 163 +++++++++--------- .../ml/server/lib/alerts/alerting_service.ts | 24 +-- 9 files changed, 274 insertions(+), 122 deletions(-) rename x-pack/plugins/ml/{server/lib/alerts/alerting_service.test.ts => common/types/guards.ts} (50%) create mode 100644 x-pack/plugins/ml/public/alerting/config_validator.tsx diff --git a/x-pack/plugins/ml/server/lib/alerts/alerting_service.test.ts b/x-pack/plugins/ml/common/types/guards.ts similarity index 50% rename from x-pack/plugins/ml/server/lib/alerts/alerting_service.test.ts rename to x-pack/plugins/ml/common/types/guards.ts index f029fa24f9607..ead91eafc2d4e 100644 --- a/x-pack/plugins/ml/server/lib/alerts/alerting_service.test.ts +++ b/x-pack/plugins/ml/common/types/guards.ts @@ -5,10 +5,6 @@ * 2.0. */ -import { resolveBucketSpanInSeconds } from './alerting_service'; - -describe('Alerting Service', () => { - test('should resolve maximum bucket interval', () => { - expect(resolveBucketSpanInSeconds(['15m', '1h', '6h', '90s'])).toBe(43200); - }); -}); +export function isDefined(argument: T | undefined | null): argument is T { + return argument !== undefined && argument !== null; +} diff --git a/x-pack/plugins/ml/common/util/anomaly_utils.ts b/x-pack/plugins/ml/common/util/anomaly_utils.ts index 68605f29c7be9..de1adfabcd7da 100644 --- a/x-pack/plugins/ml/common/util/anomaly_utils.ts +++ b/x-pack/plugins/ml/common/util/anomaly_utils.ts @@ -14,7 +14,7 @@ import { i18n } from '@kbn/i18n'; import { CONDITIONS_NOT_SUPPORTED_FUNCTIONS } from '../constants/detector_rule'; import { MULTI_BUCKET_IMPACT } from '../constants/multi_bucket_impact'; import { ANOMALY_SEVERITY, ANOMALY_THRESHOLD, SEVERITY_COLORS } from '../constants/anomalies'; -import { AnomalyRecordDoc } from '../types/anomalies'; +import type { AnomalyRecordDoc } from '../types/anomalies'; export interface SeverityType { id: ANOMALY_SEVERITY; diff --git a/x-pack/plugins/ml/common/util/job_utils.test.ts b/x-pack/plugins/ml/common/util/job_utils.test.ts index 64383ab243b8c..59f8c8a4dae3a 100644 --- a/x-pack/plugins/ml/common/util/job_utils.test.ts +++ b/x-pack/plugins/ml/common/util/job_utils.test.ts @@ -20,6 +20,7 @@ import { getSafeAggregationName, getLatestDataOrBucketTimestamp, getEarliestDatafeedStartTime, + resolveBucketSpanInSeconds, } from './job_utils'; import { CombinedJob, Job } from '../types/anomaly_detection_jobs'; import moment from 'moment'; @@ -602,4 +603,10 @@ describe('ML - job utils', () => { expect(getLatestDataOrBucketTimestamp(undefined, undefined)).toBe(undefined); }); }); + + describe('resolveBucketSpanInSeconds', () => { + test('should resolve maximum bucket interval', () => { + expect(resolveBucketSpanInSeconds(['15m', '1h', '6h', '90s'])).toBe(21600); + }); + }); }); diff --git a/x-pack/plugins/ml/common/util/job_utils.ts b/x-pack/plugins/ml/common/util/job_utils.ts index ab56726e160f7..4b80661f13c09 100644 --- a/x-pack/plugins/ml/common/util/job_utils.ts +++ b/x-pack/plugins/ml/common/util/job_utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { isEmpty, isEqual, each, pick } from 'lodash'; +import { each, isEmpty, isEqual, pick } from 'lodash'; import semverGte from 'semver/functions/gte'; import moment, { Duration } from 'moment'; // @ts-ignore @@ -16,7 +16,7 @@ import { ALLOWED_DATA_UNITS, JOB_ID_MAX_LENGTH } from '../constants/validation'; import { parseInterval } from './parse_interval'; import { maxLengthValidator } from './validators'; import { CREATED_BY_LABEL } from '../constants/new_job'; -import { CombinedJob, CustomSettings, Datafeed, JobId, Job } from '../types/anomaly_detection_jobs'; +import { CombinedJob, CustomSettings, Datafeed, Job, JobId } from '../types/anomaly_detection_jobs'; import { EntityField } from './anomaly_utils'; import { MlServerLimits } from '../types/ml_server_info'; import { JobValidationMessage, JobValidationMessageId } from '../constants/messages'; @@ -29,6 +29,7 @@ import { } from './datafeed_utils'; import { findAggField } from './validation_utils'; import { isPopulatedObject } from './object_utils'; +import { isDefined } from '../types/guards'; export interface ValidationResults { valid: boolean; @@ -801,3 +802,16 @@ export function splitIndexPatternNames(indexPatternName: string): string[] { ? indexPatternName.split(',').map((i) => i.trim()) : [indexPatternName]; } + +/** + * Resolves the longest bucket span from the list. + * @param bucketSpans Collection of bucket spans + */ +export function resolveBucketSpanInSeconds(bucketSpans: string[]): number { + return Math.max( + ...bucketSpans + .map((b) => parseInterval(b)) + .filter(isDefined) + .map((v) => v.asSeconds()) + ); +} diff --git a/x-pack/plugins/ml/public/alerting/config_validator.tsx b/x-pack/plugins/ml/public/alerting/config_validator.tsx new file mode 100644 index 0000000000000..5881a3b36dcbd --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/config_validator.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC, useMemo } from 'react'; + +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { parseInterval } from '../../common/util/parse_interval'; +import { CombinedJobWithStats } from '../../common/types/anomaly_detection_jobs'; +import { DATAFEED_STATE } from '../../common/constants/states'; +import { resolveBucketSpanInSeconds } from '../../common/util/job_utils'; + +interface ConfigValidatorProps { + alertInterval: string; + jobConfigs: CombinedJobWithStats[]; +} + +/** + * Validated alert configuration + */ +export const ConfigValidator: FC = React.memo( + ({ jobConfigs = [], alertInterval }) => { + const resultBucketSpanInSeconds = useMemo( + () => resolveBucketSpanInSeconds(jobConfigs.map((v) => v.analysis_config.bucket_span)), + [jobConfigs] + ); + + const resultBucketSpanString = + resultBucketSpanInSeconds % 60 === 0 + ? `${resultBucketSpanInSeconds / 60}m` + : `${resultBucketSpanInSeconds}s`; + + if (jobConfigs.length === 0) return null; + + const alertIntervalInSeconds = parseInterval(alertInterval)!.asSeconds(); + + const isAlertIntervalTooHigh = resultBucketSpanInSeconds < alertIntervalInSeconds; + + const jobWithoutStartedDatafeed = jobConfigs + .filter((job) => job.datafeed_config.state !== DATAFEED_STATE.STARTED) + .map((job) => job.job_id); + + const configContainsIssues = isAlertIntervalTooHigh || jobWithoutStartedDatafeed.length > 0; + + if (!configContainsIssues) return null; + + return ( + <> + + + } + color="warning" + size={'s'} + > +
    + {isAlertIntervalTooHigh ? ( +
  • + +
  • + ) : null} + + {jobWithoutStartedDatafeed.length > 0 ? ( +
  • + +
  • + ) : null} +
+
+ + + ); + } +); diff --git a/x-pack/plugins/ml/public/alerting/job_selector.tsx b/x-pack/plugins/ml/public/alerting/job_selector.tsx index 60bb7517406b8..11dd8362fd443 100644 --- a/x-pack/plugins/ml/public/alerting/job_selector.tsx +++ b/x-pack/plugins/ml/public/alerting/job_selector.tsx @@ -18,7 +18,7 @@ interface JobSelection { } export interface JobSelectorControlProps { - jobSelection?: JobSelection; + jobsAndGroupIds?: string[]; onChange: (jobSelection: JobSelection) => void; adJobsApiService: MlApiServices['jobs']; /** @@ -28,7 +28,7 @@ export interface JobSelectorControlProps { } export const JobSelectorControl: FC = ({ - jobSelection, + jobsAndGroupIds, onChange, adJobsApiService, errors, @@ -37,6 +37,14 @@ export const JobSelectorControl: FC = ({ const jobIds = useMemo(() => new Set(), []); const groupIds = useMemo(() => new Set(), []); + const selectedOptions = useMemo( + () => + (jobsAndGroupIds ?? []).map((v) => ({ + label: v, + })), + [jobsAndGroupIds] + ); + const fetchOptions = useCallback(async () => { try { const { @@ -71,10 +79,10 @@ export const JobSelectorControl: FC = ({ }, [adJobsApiService]); const onSelectionChange: EuiComboBoxProps['onChange'] = useCallback( - (selectedOptions) => { + (selectionUpdate) => { const selectedJobIds: JobId[] = []; const selectedGroupIds: string[] = []; - selectedOptions.forEach(({ label }: { label: string }) => { + selectionUpdate.forEach(({ label }: { label: string }) => { if (jobIds.has(label)) { selectedJobIds.push(label); } else if (groupIds.has(label)) { @@ -93,12 +101,6 @@ export const JobSelectorControl: FC = ({ fetchOptions(); }, []); - const selectedOptions = Object.values(jobSelection ?? {}) - .flat() - .map((v) => ({ - label: v, - })); - return ( void; setAlertProperty: (prop: string, update: Partial) => void; errors: Record; + alertInterval: string; } const MlAnomalyAlertTrigger: FC = ({ @@ -36,14 +40,18 @@ const MlAnomalyAlertTrigger: FC = ({ setAlertParams, setAlertProperty, errors, + alertInterval, }) => { const { services: { http }, + notifications: { toasts }, } = useMlKibana(); const mlHttpService = useMemo(() => new HttpService(http), [http]); const adJobsApiService = useMemo(() => jobsApiProvider(mlHttpService), [mlHttpService]); const alertingApiService = useMemo(() => alertingApiProvider(mlHttpService), [mlHttpService]); + const [jobConfigs, setJobConfigs] = useState([]); + const onAlertParamChange = useCallback( (param: T) => ( update: MlAnomalyDetectionAlertParams[T] @@ -53,6 +61,45 @@ const MlAnomalyAlertTrigger: FC = ({ [] ); + const jobsAndGroupIds: string[] = useMemo( + () => (Object.values(alertParams.jobSelection ?? {}) as string[][]).flat(), + [alertParams.jobSelection] + ); + + /** + * Extract alert related information based on the job selection + */ + const fetchJobsConfig = useCallback(async () => { + try { + const jobs = await adJobsApiService.jobs(jobsAndGroupIds); + setJobConfigs(jobs); + } catch (e) { + toasts.danger({ + title: i18n.translate('xpack.ml.anomalyDetectionAlert.errorFetchingJobs', { + defaultMessage: 'Unable to fetch jobs configuration', + }), + body: e.message, + toastLifeTimeMs: 5000, + }); + } + }, [jobsAndGroupIds]); + + const availableResultTypes = useMemo(() => { + if (jobConfigs.length === 0) return Object.values(ANOMALY_RESULT_TYPE); + + return (jobConfigs ?? []).some((v) => v.analysis_config.influencers.length > 0) + ? Object.values(ANOMALY_RESULT_TYPE) + : [ANOMALY_RESULT_TYPE.BUCKET, ANOMALY_RESULT_TYPE.RECORD]; + }, [jobConfigs]); + + useEffect( + function checkJobsConfiguration() { + if (jobsAndGroupIds.length === 0) return; + fetchJobsConfig(); + }, + [jobsAndGroupIds] + ); + useMount(function setDefaults() { const { jobSelection, ...rest } = alertParams; if (Object.keys(rest).length === 0) { @@ -70,13 +117,17 @@ const MlAnomalyAlertTrigger: FC = ({ return ( + + + void; } -export const ResultTypeSelector: FC = ({ - value: selectedResultType = [], - onChange, -}) => { - const resultTypeOptions = [ - { - value: ANOMALY_RESULT_TYPE.BUCKET, - title: , - description: ( - - ), - }, - { - value: ANOMALY_RESULT_TYPE.RECORD, - title: , - description: ( - - ), - }, - { - value: ANOMALY_RESULT_TYPE.INFLUENCER, - title: ( - - ), - description: ( - - ), - }, - ]; +export const ResultTypeSelector: FC = React.memo( + ({ value: selectedResultType = [], onChange, availableOption }) => { + const resultTypeOptions = useMemo(() => { + return [ + { + value: ANOMALY_RESULT_TYPE.BUCKET, + title: , + description: ( + + ), + }, + { + value: ANOMALY_RESULT_TYPE.RECORD, + title: , + description: ( + + ), + }, + { + value: ANOMALY_RESULT_TYPE.INFLUENCER, + title: ( + + ), + description: ( + + ), + }, + ].filter((v) => availableOption.includes(v.value)); + }, [availableOption]); - return ( - - } - > - - {resultTypeOptions.map(({ value, title, description }) => { - return ( - - {description}} - selectable={{ - onClick: () => { - if (selectedResultType === value) { - // don't allow de-select - return; - } - onChange(value); - }, - isSelected: value === selectedResultType, - }} - data-test-subj={`mlAnomalyAlertResult_${value}${ - value === selectedResultType ? '_selected' : '' - }`} - /> - - ); - })} - - - ); -}; + return ( + + } + > + + {resultTypeOptions.map(({ value, title, description }) => { + return ( + + {description}} + selectable={{ + onClick: () => { + if (selectedResultType === value) { + // don't allow de-select + return; + } + onChange(value); + }, + isSelected: value === selectedResultType, + }} + data-test-subj={`mlAnomalyAlertResult_${value}${ + value === selectedResultType ? '_selected' : '' + }`} + /> + + ); + })} + + + ); + } +); diff --git a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts index 6e7cd77e450bc..b6d0e9ae261c7 100644 --- a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts +++ b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts @@ -25,30 +25,11 @@ import { RecordAnomalyAlertDoc, TopHitsResultsKeys, } from '../../../common/types/alerts'; -import { parseInterval } from '../../../common/util/parse_interval'; import { AnomalyDetectionAlertContext } from './register_anomaly_detection_alert_type'; import { MlJobsResponse } from '../../../common/types/job_service'; import { ANOMALY_SCORE_MATCH_GROUP_ID } from '../../../common/constants/alerts'; import { getEntityFieldName, getEntityFieldValue } from '../../../common/util/anomaly_utils'; - -function isDefined(argument: T | undefined | null): argument is T { - return argument !== undefined && argument !== null; -} - -/** - * Resolves the longest bucket span from the list and multiply it by 2. - * @param bucketSpans Collection of bucket spans - */ -export function resolveBucketSpanInSeconds(bucketSpans: string[]): number { - return ( - Math.max( - ...bucketSpans - .map((b) => parseInterval(b)) - .filter(isDefined) - .map((v) => v.asSeconds()) - ) * 2 - ); -} +import { resolveBucketSpanInSeconds } from '../../../common/util/job_utils'; /** * Alerting related server-side methods @@ -313,7 +294,8 @@ export function alertingServiceProvider(mlClient: MlClient, esClient: Elasticsea * We need to check the biggest time range to make sure anomalies are not missed. */ const lookBackTimeInterval = `${Math.max( - resolveBucketSpanInSeconds(jobsResponse.map((v) => v.analysis_config.bucket_span)), + // Double the max bucket span + resolveBucketSpanInSeconds(jobsResponse.map((v) => v.analysis_config.bucket_span)) * 2, checkIntervalGap ? checkIntervalGap.asSeconds() : 0 )}s`; From 0cc3fa61ce242adc6af7ef6aa9ff9b6d855ced72 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Tue, 23 Feb 2021 18:54:12 +0100 Subject: [PATCH 02/45] =?UTF-8?q?Upgrade=20`merge-deep`=20dependency=20(`3?= =?UTF-8?q?.0.2`=20=E2=86=92=20`3.0.3`).=20(#92418)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 08bf4c8ea752c..4a3399ece1fd0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20613,9 +20613,9 @@ meow@^8.0.0: yargs-parser "^20.2.3" merge-deep@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" - integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== dependencies: arr-union "^3.1.0" clone-deep "^0.2.4" From e1166999e0f7624d083aaf7fc038d8393714ab6c Mon Sep 17 00:00:00 2001 From: Jason Stoltzfus Date: Tue, 23 Feb 2021 12:55:42 -0500 Subject: [PATCH 03/45] [Enterprise Search] Shared unsaved changes prompt component (#92277) --- .../shared/unsaved_changes_prompt/index.ts | 8 ++ .../unsaved_changes_prompt.test.tsx | 109 ++++++++++++++++++ .../unsaved_changes_prompt.tsx | 41 +++++++ 3 files changed, 158 insertions(+) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/index.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.tsx diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/index.ts new file mode 100644 index 0000000000000..487c1350cbc08 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { UnsavedChangesPrompt } from './unsaved_changes_prompt'; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx new file mode 100644 index 0000000000000..dad6ea32b81aa --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +jest.mock('react-router-dom', () => ({ + Prompt: () => null, +})); +import { Prompt } from 'react-router-dom'; + +import { shallow, mount, ReactWrapper } from 'enzyme'; + +import { UnsavedChangesPrompt } from './unsaved_changes_prompt'; + +describe('UnsavedChangesPrompt', () => { + let addEventListenerSpy: jest.SpyInstance; + let removeEventListenerSpy: jest.SpyInstance; + + beforeAll(() => { + addEventListenerSpy = jest.spyOn(window, 'addEventListener').mockImplementation(() => true); + removeEventListenerSpy = jest + .spyOn(window, 'removeEventListener') + .mockImplementation(() => true); + }); + + afterAll(() => { + addEventListenerSpy.mockRestore(); + removeEventListenerSpy.mockRestore(); + }); + + it('renders a React Router Prompt, which will show users a confirmation message when navigating within the SPA if hasUnsavedChanges is true', () => { + const wrapper = shallow(); + const prompt = wrapper.find(Prompt); + expect(prompt.exists()).toBe(true); + expect(prompt.prop('when')).toBe(true); + expect(prompt.prop('message')).toBe( + 'Your changes have not been saved. Are you sure you want to leave?' + ); + }); + + it('the message text of the prompt can be customized', () => { + const wrapper = shallow( + + ); + expect(wrapper.find(Prompt).prop('message')).toBe('Some custom text'); + }); + + describe('external navigation', () => { + let wrapper: ReactWrapper; + const getAddBeforeUnloadEventCalls = () => + addEventListenerSpy.mock.calls.filter((call) => call[0] === 'beforeunload'); + const getRemoveBeforeUnloadEventCalls = () => + removeEventListenerSpy.mock.calls.filter((call) => call[0] === 'beforeunload'); + const getLastRegisteredBeforeUnloadEventHandler = () => { + const calls = getAddBeforeUnloadEventCalls(); + return calls[calls.length - 1][1]; + }; + + beforeAll(() => { + wrapper = mount(); + }); + + it('sets up a handler for the beforeunload event', () => { + const calls = getAddBeforeUnloadEventCalls(); + expect(calls.length).toBe(1); + }); + + it('that handler will show users a confirmation message when navigating outside the SPA if hasUnsavedChanges is true', () => { + const handler = getLastRegisteredBeforeUnloadEventHandler(); + const event = { returnValue: null, preventDefault: jest.fn() }; + + handler(event); + expect(event.returnValue).toEqual(''); + expect(event.preventDefault).toHaveBeenCalled(); + }); + + it('will not register a new handler if there is a re-render and hasUnsavedChanges is still true', () => { + wrapper.setProps({ hasUnsavedChanges: true, messageText: 'custom message text' }); + const calls = getAddBeforeUnloadEventCalls(); + expect(calls.length).toBe(1); + }); + + it('when the hasUnsavedChanges prop changes to false, it will deregister the old handler and create a new one, which will not show users a confirmation', () => { + const initialHandler = getLastRegisteredBeforeUnloadEventHandler(); + + wrapper.setProps({ hasUnsavedChanges: false }); + + // The old handler is unregistered + const unregisterCalls = getRemoveBeforeUnloadEventCalls(); + expect(unregisterCalls.length).toBe(1); + expect(unregisterCalls[0][1]).toBe(initialHandler); + + // The new handler is registered + const calls = getAddBeforeUnloadEventCalls(); + expect(calls.length).toBe(2); + const newHandler = getLastRegisteredBeforeUnloadEventHandler(); + + // The new handler does not show a confirmation message + const event = { returnValue: null, preventDefault: jest.fn() }; + newHandler(event); + expect(event.returnValue).toEqual(null); + expect(event.preventDefault).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.tsx new file mode 100644 index 0000000000000..18cc4db5055d4 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/unsaved_changes_prompt/unsaved_changes_prompt.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect } from 'react'; +import { Prompt } from 'react-router-dom'; + +import { i18n } from '@kbn/i18n'; + +const DEFAULT_MESSAGE_TEXT = i18n.translate('xpack.enterpriseSearch.shared.unsavedChangesMessage', { + defaultMessage: 'Your changes have not been saved. Are you sure you want to leave?', +}); +interface Props { + hasUnsavedChanges: boolean; + messageText?: string; +} + +export const UnsavedChangesPrompt: React.FC = ({ + hasUnsavedChanges, + messageText = DEFAULT_MESSAGE_TEXT, +}) => { + useEffect(() => { + const handler = (event: BeforeUnloadEvent) => { + if (hasUnsavedChanges) { + // These 2 lines of code are the recommendation from MDN for triggering a browser prompt for confirming + // whether or not a user wants to leave the current site. + event.preventDefault(); + event.returnValue = ''; + } + }; + // Adding this handler will prompt users if they are navigating to a new page, outside of the Kibana SPA + window.addEventListener('beforeunload', handler); + return () => window.removeEventListener('beforeunload', handler); + }, [hasUnsavedChanges]); + + // Adding this Prompt will prompt users if they are navigating to a new page, within the Kibana SPA + return ; +}; From accf6b8c2ed75bba5ea9743d0bafd7eada748bb9 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Tue, 23 Feb 2021 12:22:38 -0600 Subject: [PATCH 04/45] [ML] Fix Total feature importance section not expandable when set to False (#92450) --- .../expandable_section/expandable_section.tsx | 10 +++++++--- .../hooks/use_exploration_url_state.ts | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx index 5ecc80b6ed255..135f47a959950 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx @@ -7,7 +7,7 @@ import './expandable_section.scss'; -import React, { FC, ReactNode, useCallback } from 'react'; +import React, { FC, ReactNode, useCallback, useMemo } from 'react'; import { EuiBadge, @@ -58,11 +58,15 @@ export const ExpandableSection: FC = ({ docsLink, urlStateKey, }) => { - const [pageUrlState, setPageUrlState] = useExplorationUrlState(); + const overrides = useMemo( + () => (isExpandedDefault !== undefined ? { [urlStateKey]: isExpandedDefault } : undefined), + [urlStateKey, isExpandedDefault] + ); + const [pageUrlState, setPageUrlState] = useExplorationUrlState(overrides); const isExpanded = isExpandedDefault !== undefined && - pageUrlState[urlStateKey] === getDefaultExplorationPageUrlState()[urlStateKey] + pageUrlState[urlStateKey] === getDefaultExplorationPageUrlState(overrides)[urlStateKey] ? isExpandedDefault : pageUrlState[urlStateKey]; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/hooks/use_exploration_url_state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/hooks/use_exploration_url_state.ts index 1449215dc3457..3b8d7c4f051f0 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/hooks/use_exploration_url_state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/hooks/use_exploration_url_state.ts @@ -9,8 +9,11 @@ import { usePageUrlState } from '../../../../util/url_state'; import { ML_PAGES } from '../../../../../../common/constants/ml_url_generator'; import { SEARCH_QUERY_LANGUAGE } from '../../../../../../common/constants/search'; import { ExplorationPageUrlState } from '../../../../../../common/types/ml_url_generator'; +import { isPopulatedObject } from '../../../../../../common/util/object_utils'; -export function getDefaultExplorationPageUrlState(): ExplorationPageUrlState { +export function getDefaultExplorationPageUrlState( + overrides?: Partial +): ExplorationPageUrlState { return { queryText: '', queryLanguage: SEARCH_QUERY_LANGUAGE.KUERY, @@ -21,12 +24,13 @@ export function getDefaultExplorationPageUrlState(): ExplorationPageUrlState { feature_importance: true, results: true, splom: true, + ...(isPopulatedObject(overrides) ? overrides : {}), }; } -export function useExplorationUrlState() { +export function useExplorationUrlState(overrides?: Partial) { return usePageUrlState( ML_PAGES.DATA_FRAME_ANALYTICS_EXPLORATION, - getDefaultExplorationPageUrlState() + getDefaultExplorationPageUrlState(overrides) ); } From 5ab2d2500657e2934bddb1cc9c8f9076832ffb29 Mon Sep 17 00:00:00 2001 From: Constance Date: Tue, 23 Feb 2021 10:26:27 -0800 Subject: [PATCH 05/45] [App Search] Standardize date/timestamps displayed in tables (#92287) * Add new reusable FormattedDateTime helper * Update Analytics RecentQueriesTable to use helper * Update CurationsTable to use new helper - requires adding a utility fn to convert the server-sent string to a Date-parseable string * Update EnginesTable to use FormattedDateTime - mostly to standardize/DRY out the FormattedDate display style - adds a new hasTime flag since the EnginesTable does not display time * [PR feedback] hasTime -> hideTime --- .../recent_queries_table.test.tsx | 6 ++-- .../analytics_tables/recent_queries_table.tsx | 15 ++++------ .../components/curations/utils.test.ts | 18 ++++++++++++ .../app_search/components/curations/utils.ts | 16 +++++++++++ .../curations/views/curations.test.tsx | 17 +++++++---- .../components/curations/views/curations.tsx | 3 ++ .../components/engines/engines_table.tsx | 8 ++---- .../utils/formatted_date_time/index.test.tsx | 28 +++++++++++++++++++ .../utils/formatted_date_time/index.tsx | 27 ++++++++++++++++++ 9 files changed, 114 insertions(+), 24 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.tsx diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.test.tsx index f90d86908d470..0670624492db5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.test.tsx @@ -48,9 +48,9 @@ describe('RecentQueriesTable', () => { expect(tableContent).toContain('""'); expect(tableContent).toContain('Time'); - expect(tableContent).toContain('1/3/1970'); - expect(tableContent).toContain('1/2/1970'); - expect(tableContent).toContain('1/1/1970'); + expect(tableContent).toContain('Jan 3, 1970'); + expect(tableContent).toContain('Jan 2, 1970'); + expect(tableContent).toContain('Jan 1, 1970'); expect(tableContent).toContain('Analytics tags'); expect(tableContent).toContain('tagA'); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.tsx index 7724ac5c393ec..39b0e3e7165b1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/components/analytics_tables/recent_queries_table.tsx @@ -9,8 +9,8 @@ import React from 'react'; import { EuiBasicTable, EuiBasicTableColumn, EuiEmptyPrompt } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedDate, FormattedTime } from '@kbn/i18n/react'; +import { FormattedDateTime } from '../../../../utils/formatted_date_time'; import { RecentQuery } from '../../types'; import { @@ -36,15 +36,10 @@ export const RecentQueriesTable: React.FC = ({ items }) => { name: i18n.translate('xpack.enterpriseSearch.appSearch.engine.analytics.table.timeColumn', { defaultMessage: 'Time', }), - render: (timestamp: RecentQuery['timestamp']) => { - const date = new Date(timestamp); - return ( - <> - - - ); - }, - width: '175px', + render: (timestamp: RecentQuery['timestamp']) => ( + + ), + width: '200px', }; const RESULTS_COLUMN = { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.test.ts new file mode 100644 index 0000000000000..435b76458db06 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.test.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { convertToDate } from './utils'; + +describe('convertToDate', () => { + it('converts the English-only server timestamps to a parseable Date', () => { + const serverDateString = 'January 01, 1970 at 12:00PM'; + const date = convertToDate(serverDateString); + + expect(date).toBeInstanceOf(Date); + expect(date.getFullYear()).toEqual(1970); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.ts new file mode 100644 index 0000000000000..2ef73e1de4e91 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/utils.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// The server API feels us an English datestring, but we want to convert +// it to an actual Date() instance so that we can localize date formats. +export const convertToDate = (serverDateString: string): Date => { + const readableDateString = serverDateString + .replace(' at ', ' ') + .replace('PM', ' PM') + .replace('AM', ' AM'); + return new Date(readableDateString); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx index c952de9b30a4d..fd5d5b7ea64a9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx @@ -5,12 +5,17 @@ * 2.0. */ -import { mockKibanaValues, setMockActions, setMockValues } from '../../../../__mocks__'; +import { + mountWithIntl, + mockKibanaValues, + setMockActions, + setMockValues, +} from '../../../../__mocks__'; import '../../../__mocks__/engine_logic.mock'; import React from 'react'; -import { shallow, mount, ReactWrapper } from 'enzyme'; +import { shallow, ReactWrapper } from 'enzyme'; import { EuiBasicTable, EuiEmptyPrompt } from '@elastic/eui'; @@ -71,7 +76,7 @@ describe('Curations', () => { }); it('calls loadCurations on page load', () => { - mount(); + mountWithIntl(); expect(actions.loadCurations).toHaveBeenCalledTimes(1); }); @@ -95,7 +100,7 @@ describe('Curations', () => { let wrapper: ReactWrapper; beforeAll(() => { - wrapper = mount(); + wrapper = mountWithIntl(); }); it('renders queries and last updated columns', () => { @@ -106,8 +111,8 @@ describe('Curations', () => { expect(tableContent).toContain('mountains, valleys'); expect(tableContent).toContain('Last updated'); - expect(tableContent).toContain('January 1, 1970 at 12:00PM'); - expect(tableContent).toContain('January 2, 1970 at 12:00PM'); + expect(tableContent).toContain('Jan 1, 1970 12:00 PM'); + expect(tableContent).toContain('Jan 2, 1970 12:00 PM'); }); it('renders queries with curation links', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx index d6aa3583e24a7..863920d209d5b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx @@ -25,11 +25,13 @@ import { KibanaLogic } from '../../../../shared/kibana'; import { Loading } from '../../../../shared/loading'; import { EuiButtonTo, EuiLinkTo } from '../../../../shared/react_router_helpers'; import { ENGINE_CURATIONS_NEW_PATH, ENGINE_CURATION_PATH } from '../../../routes'; +import { FormattedDateTime } from '../../../utils/formatted_date_time'; import { generateEnginePath } from '../../engine'; import { CURATIONS_OVERVIEW_TITLE, CREATE_NEW_CURATION_TITLE } from '../constants'; import { CurationsLogic } from '../curations_logic'; import { Curation } from '../types'; +import { convertToDate } from '../utils'; export const Curations: React.FC = () => { const { dataLoading, curations, meta } = useValues(CurationsLogic); @@ -101,6 +103,7 @@ export const CurationsTable: React.FC = () => { ), width: '30%', dataType: 'string', + render: (dateString: string) => , }, { width: '120px', diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx index d41c5c908c08f..85a9bb338b7f0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx @@ -11,7 +11,7 @@ import { useActions } from 'kea'; import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, FormattedDate, FormattedNumber } from '@kbn/i18n/react'; +import { FormattedMessage, FormattedNumber } from '@kbn/i18n/react'; import { ENGINES_PAGE_SIZE } from '../../../../../common/constants'; import { EuiLinkTo } from '../../../shared/react_router_helpers'; @@ -19,6 +19,7 @@ import { TelemetryLogic } from '../../../shared/telemetry'; import { UNIVERSAL_LANGUAGE } from '../../constants'; import { ENGINE_PATH } from '../../routes'; import { generateEncodedPath } from '../../utils/encode_path_params'; +import { FormattedDateTime } from '../../utils/formatted_date_time'; import { EngineDetails } from '../engine/types'; interface EnginesTablePagination { @@ -82,10 +83,7 @@ export const EnginesTable: React.FC = ({ } ), dataType: 'string', - render: (dateString: string) => ( - // e.g., Jan 1, 1970 - - ), + render: (dateString: string) => , }, { field: 'language', diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.test.tsx new file mode 100644 index 0000000000000..5137a60ffe59d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.test.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mountWithIntl } from '../../../__mocks__'; + +import React from 'react'; + +import { FormattedDateTime } from './'; + +describe('FormattedDateTime', () => { + it('renders a standard i18n-friendly combined date & time stamp', () => { + const date = new Date('1970-01-01T12:00:00'); + const wrapper = mountWithIntl(); + + expect(wrapper.text()).toEqual('Jan 1, 1970 12:00 PM'); + }); + + it('does not render time if hideTime is passed', () => { + const date = new Date('1970-01-01T12:00:00'); + const wrapper = mountWithIntl(); + + expect(wrapper.text()).toEqual('Jan 1, 1970'); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.tsx new file mode 100644 index 0000000000000..87a377dbc21b6 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/utils/formatted_date_time/index.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { FormattedDate, FormattedTime } from '@kbn/i18n/react'; + +interface Props { + date: Date; + hideTime?: boolean; +} + +export const FormattedDateTime: React.FC = ({ date, hideTime = false }) => ( + <> + + {!hideTime && ( + <> + {' '} + + + )} + +); From 50b23e217661ac2d06bd60eaba09584024d27adc Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Tue, 23 Feb 2021 12:36:43 -0600 Subject: [PATCH 06/45] [ML] Fix geo_shape not aggregetable and misaligned examples list in other_content (#92198) --- x-pack/plugins/ml/common/constants/field_types.ts | 1 + .../components/field_type_icon/field_type_icon.tsx | 1 + .../index_based/components/expanded_row/expanded_row.tsx | 1 + .../components/expanded_row/geo_point_content.tsx | 7 ++++--- .../components/search_panel/field_type_filter.tsx | 1 + .../components/field_data_expanded_row/other_content.tsx | 7 ++++++- .../ml/public/application/util/field_types_utils.ts | 4 ++++ .../ml/server/models/data_visualizer/data_visualizer.ts | 4 +++- 8 files changed, 21 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ml/common/constants/field_types.ts b/x-pack/plugins/ml/common/constants/field_types.ts index 69f5ea9c4062e..04e1100e9f776 100644 --- a/x-pack/plugins/ml/common/constants/field_types.ts +++ b/x-pack/plugins/ml/common/constants/field_types.ts @@ -9,6 +9,7 @@ export const ML_JOB_FIELD_TYPES = { BOOLEAN: 'boolean', DATE: 'date', GEO_POINT: 'geo_point', + GEO_SHAPE: 'geo_shape', IP: 'ip', KEYWORD: 'keyword', NUMBER: 'number', diff --git a/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.tsx b/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.tsx index 1ca8ef18f2ba5..79ab210ce1dfe 100644 --- a/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.tsx +++ b/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.tsx @@ -52,6 +52,7 @@ export const FieldTypeIcon: FC = ({ color = 'euiColorVis7'; break; case ML_JOB_FIELD_TYPES.GEO_POINT: + case ML_JOB_FIELD_TYPES.GEO_SHAPE: iconType = 'tokenGeo'; color = 'euiColorVis8'; break; diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/expanded_row/expanded_row.tsx b/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/expanded_row/expanded_row.tsx index 8a0656abe95cc..bd8eb09128d1d 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/expanded_row/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/expanded_row/expanded_row.tsx @@ -52,6 +52,7 @@ export const IndexBasedDataVisualizerExpandedRow = ({ return ; case ML_JOB_FIELD_TYPES.GEO_POINT: + case ML_JOB_FIELD_TYPES.GEO_SHAPE: return ( - + diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/field_type_filter.tsx b/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/field_type_filter.tsx index 2f30dd156d018..7bc7260acf544 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/field_type_filter.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/field_type_filter.tsx @@ -17,6 +17,7 @@ export const ML_JOB_FIELD_TYPES_OPTIONS = { [ML_JOB_FIELD_TYPES.BOOLEAN]: { name: 'Boolean', icon: 'tokenBoolean' }, [ML_JOB_FIELD_TYPES.DATE]: { name: 'Date', icon: 'tokenDate' }, [ML_JOB_FIELD_TYPES.GEO_POINT]: { name: 'Geo point', icon: 'tokenGeo' }, + [ML_JOB_FIELD_TYPES.GEO_SHAPE]: { name: 'Geo shape', icon: 'tokenGeo' }, [ML_JOB_FIELD_TYPES.IP]: { name: 'IP address', icon: 'tokenIP' }, [ML_JOB_FIELD_TYPES.KEYWORD]: { name: 'Keyword', icon: 'tokenKeyword' }, [ML_JOB_FIELD_TYPES.NUMBER]: { name: 'Number', icon: 'tokenNumber' }, diff --git a/x-pack/plugins/ml/public/application/datavisualizer/stats_table/components/field_data_expanded_row/other_content.tsx b/x-pack/plugins/ml/public/application/datavisualizer/stats_table/components/field_data_expanded_row/other_content.tsx index e2bb42d27d200..0734048e2bc2a 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/stats_table/components/field_data_expanded_row/other_content.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/stats_table/components/field_data_expanded_row/other_content.tsx @@ -6,6 +6,7 @@ */ import React, { FC } from 'react'; +import { EuiFlexItem } from '@elastic/eui'; import type { FieldDataRowProps } from '../../types/field_data_row'; import { ExamplesList } from '../../../index_based/components/field_data_row/examples_list'; import { DocumentStatsTable } from './document_stats'; @@ -17,7 +18,11 @@ export const OtherContent: FC = ({ config }) => { return ( - {Array.isArray(stats.examples) && } + {Array.isArray(stats.examples) && ( + + + + )} ); }; diff --git a/x-pack/plugins/ml/public/application/util/field_types_utils.ts b/x-pack/plugins/ml/public/application/util/field_types_utils.ts index a981432f116eb..0cb21fec1862f 100644 --- a/x-pack/plugins/ml/public/application/util/field_types_utils.ts +++ b/x-pack/plugins/ml/public/application/util/field_types_utils.ts @@ -35,6 +35,10 @@ export function kbnTypeToMLJobType(field: IFieldType) { case KBN_FIELD_TYPES.GEO_POINT: type = ML_JOB_FIELD_TYPES.GEO_POINT; break; + case KBN_FIELD_TYPES.GEO_SHAPE: + type = ML_JOB_FIELD_TYPES.GEO_SHAPE; + break; + default: break; } diff --git a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts index 34af9117762a7..69ebfe5f0bc11 100644 --- a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts +++ b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -19,6 +19,7 @@ import { import { AggCardinality } from '../../../common/types/fields'; import { getDatafeedAggregations } from '../../../common/util/datafeed_utils'; import { Datafeed } from '../../../common/types/anomaly_detection_jobs'; +import { isPopulatedObject } from '../../../common/util/object_utils'; const SAMPLER_TOP_TERMS_THRESHOLD = 100000; const SAMPLER_TOP_TERMS_SHARD_SIZE = 5000; @@ -638,7 +639,7 @@ export class DataVisualizer { filter: filterCriteria, }, }, - aggs: buildSamplerAggregation(aggs, samplerShardSize), + ...(isPopulatedObject(aggs) ? { aggs: buildSamplerAggregation(aggs, samplerShardSize) } : {}), ...runtimeMappings, }; @@ -648,6 +649,7 @@ export class DataVisualizer { size, body: searchBody, }); + const aggregations = body.aggregations; const totalCount = body.hits.total.value; const stats = { From 301df28a66438e70dc4578f3b600e8ef7e2c9ef0 Mon Sep 17 00:00:00 2001 From: Constance Date: Tue, 23 Feb 2021 10:41:35 -0800 Subject: [PATCH 07/45] [App Search] Standardize table pagination logic/UX (#92293) * Create table pagination helpers * Update Curations table to use new pagination helpers * Update Credentials table to use new helpers + update to use DEFAULT_META and pass page[size] customization + update useEffect to manually call fetchCredentials on current page change + update table to pass empty prompt within table (rather than instead of), and add a loading indicator - update deleteApiKey to re-fetch credentials from API rather than modify the in-memory array (which more correctly handles pagination) * Update Engines table to use new helpers Server: + update server route to take page[current] (consistent w/ other routes) and page[size] - remove custom param translation (passing as-is) - remove ENGINES_PAGE_SIZE constant, basically stored within DEFAULT_META now and page size is passed from client-side - remove misc header cruft from engines table EnginesLogic: - Update http calls to send page[current] & page[size] (same as other files) - Change individual *Total/*Page vars to store the meta obj coming back from the API (same as other logic files) - Change on*Load actions to simply pass the API response (update typing to clarify) - Add new individual enginesLoading/metaEnginesLoading vars so that tables can show individual loading indicators between pagination - Change dataLoading to a selector (should only show on initial page load, and should use table loading indicators after) EnginesTable: - Update props to more closely match EuiBasicTable (items, onChange, add loading) so users can do a simple pass-through - Reorganize tests so that language block doesn't need its own custom wrapper vars - Remove empty data test (no longer really testing anything meaningful) and add loading test EnginesOverview: - Update to use new helpers, values, props, etc. - Add new test for onPaginate handlers --- .../enterprise_search/common/constants.ts | 2 - .../credentials/credentials.test.tsx | 16 +- .../components/credentials/credentials.tsx | 10 +- .../credentials_list.test.tsx | 43 ++--- .../credentials_list/credentials_list.tsx | 57 +++--- .../credentials/credentials_logic.test.ts | 78 +++----- .../credentials/credentials_logic.ts | 37 ++-- .../components/curations/curations_logic.ts | 8 +- .../components/curations/views/curations.tsx | 11 +- .../components/engines/engines_logic.test.ts | 178 +++++++++++------- .../components/engines/engines_logic.ts | 95 +++++----- .../engines/engines_overview.test.tsx | 57 +++++- .../components/engines/engines_overview.tsx | 31 +-- .../components/engines/engines_table.test.tsx | 104 +++++----- .../components/engines/engines_table.tsx | 43 ++--- .../shared/table_pagination/index.test.ts | 53 ++++++ .../shared/table_pagination/index.ts | 39 ++++ .../routes/app_search/credentials.test.ts | 9 +- .../server/routes/app_search/credentials.ts | 1 + .../server/routes/app_search/engines.test.ts | 48 ++--- .../server/routes/app_search/engines.ts | 11 +- 21 files changed, 528 insertions(+), 403 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index cb9746ec9b92a..857f6037c53c8 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -81,5 +81,3 @@ export const JSON_HEADER = { }; export const READ_ONLY_MODE_HEADER = 'x-ent-search-read-only-mode'; - -export const ENGINES_PAGE_SIZE = 10; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.test.tsx index 48fcf4b8c5b66..3785873461f16 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.test.tsx @@ -14,6 +14,7 @@ import { shallow } from 'enzyme'; import { EuiCopy, EuiLoadingContent, EuiPageContentBody } from '@elastic/eui'; +import { DEFAULT_META } from '../../../shared/constants'; import { externalUrl } from '../../../shared/enterprise_search_url'; import { Credentials } from './credentials'; @@ -23,10 +24,12 @@ import { CredentialsFlyout } from './credentials_flyout'; describe('Credentials', () => { // Kea mocks const values = { + meta: DEFAULT_META, dataLoading: false, }; const actions = { - initializeCredentialsData: jest.fn(), + fetchCredentials: jest.fn(), + fetchDetails: jest.fn(), resetCredentials: jest.fn(), showCredentialsForm: jest.fn(), }; @@ -42,9 +45,10 @@ describe('Credentials', () => { expect(wrapper.find(EuiPageContentBody)).toHaveLength(1); }); - it('initializes data on mount', () => { + it('fetches data on mount', () => { shallow(); - expect(actions.initializeCredentialsData).toHaveBeenCalledTimes(1); + expect(actions.fetchCredentials).toHaveBeenCalledTimes(1); + expect(actions.fetchDetails).toHaveBeenCalledTimes(1); }); it('calls resetCredentials on unmount', () => { @@ -54,7 +58,7 @@ describe('Credentials', () => { }); it('renders a limited UI if data is still loading', () => { - setMockValues({ dataLoading: true }); + setMockValues({ ...values, dataLoading: true }); const wrapper = shallow(); expect(wrapper.find('[data-test-subj="CreateAPIKeyButton"]')).toHaveLength(0); expect(wrapper.find(EuiLoadingContent)).toHaveLength(1); @@ -78,13 +82,13 @@ describe('Credentials', () => { }); it('will render CredentialsFlyout if shouldShowCredentialsForm is true', () => { - setMockValues({ shouldShowCredentialsForm: true }); + setMockValues({ ...values, shouldShowCredentialsForm: true }); const wrapper = shallow(); expect(wrapper.find(CredentialsFlyout)).toHaveLength(1); }); it('will NOT render CredentialsFlyout if shouldShowCredentialsForm is false', () => { - setMockValues({ shouldShowCredentialsForm: false }); + setMockValues({ ...values, shouldShowCredentialsForm: false }); const wrapper = shallow(); expect(wrapper.find(CredentialsFlyout)).toHaveLength(0); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx index 266e9467c300d..fc411c3dff866 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx @@ -35,14 +35,18 @@ import { CredentialsList } from './credentials_list'; import { CredentialsLogic } from './credentials_logic'; export const Credentials: React.FC = () => { - const { initializeCredentialsData, resetCredentials, showCredentialsForm } = useActions( + const { fetchCredentials, fetchDetails, resetCredentials, showCredentialsForm } = useActions( CredentialsLogic ); - const { dataLoading, shouldShowCredentialsForm } = useValues(CredentialsLogic); + const { meta, dataLoading, shouldShowCredentialsForm } = useValues(CredentialsLogic); useEffect(() => { - initializeCredentialsData(); + fetchCredentials(); + }, [meta.page.current]); + + useEffect(() => { + fetchDetails(); return () => { resetCredentials(); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx index 8c52df30bfc67..09340d37fcf7b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx @@ -21,7 +21,7 @@ import { Key } from './key'; import { CredentialsList } from './'; -describe('Credentials', () => { +describe('CredentialsList', () => { const apiToken: ApiToken = { name: '', type: ApiTokenTypes.Private, @@ -42,10 +42,11 @@ describe('Credentials', () => { total_results: 1, }, }, + isCredentialsDataComplete: true, }; const actions = { deleteApiKey: jest.fn(), - fetchCredentials: jest.fn(), + onPaginate: jest.fn(), showCredentialsForm: jest.fn(), }; @@ -92,9 +93,22 @@ describe('Credentials', () => { apiTokens: [], }); + const wrapper = shallow() + .find(EuiBasicTable) + .dive(); + expect(wrapper.find(EuiEmptyPrompt)).toHaveLength(1); + }); + }); + + describe('loading state', () => { + it('renders as loading when isCredentialsDataComplete is false', () => { + setMockValues({ + ...values, + isCredentialsDataComplete: false, + }); + const wrapper = shallow(); - expect(wrapper.exists(EuiEmptyPrompt)).toBe(true); - expect(wrapper.exists(EuiBasicTable)).toBe(false); + expect(wrapper.find(EuiBasicTable).prop('loading')).toBe(true); }); }); @@ -120,24 +134,13 @@ describe('Credentials', () => { hidePerPageOptions: true, }); }); - - it('will default pagination values if `page` is not available', () => { - setMockValues({ ...values, meta: {} }); - const wrapper = shallow(); - const { pagination } = wrapper.find(EuiBasicTable).props(); - expect(pagination).toEqual({ - pageIndex: 0, - pageSize: 0, - totalItemCount: 0, - hidePerPageOptions: true, - }); - }); }); describe('columns', () => { let columns: any[]; beforeAll(() => { + setMockValues(values); const wrapper = shallow(); columns = wrapper.find(EuiBasicTable).props().columns; }); @@ -269,18 +272,16 @@ describe('Credentials', () => { }); describe('onChange', () => { - it('will handle pagination by calling `fetchCredentials`', () => { + it('will handle pagination by calling `onPaginate`', () => { const wrapper = shallow(); - const { onChange } = wrapper.find(EuiBasicTable).props(); - - onChange({ + wrapper.find(EuiBasicTable).simulate('change', { page: { size: 10, index: 2, }, }); - expect(actions.fetchCredentials).toHaveBeenCalledWith(3); + expect(actions.onPaginate).toHaveBeenCalledWith(3); }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.tsx index f23479017a680..21a428bfdf836 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.tsx @@ -10,10 +10,10 @@ import React, { useMemo } from 'react'; import { useActions, useValues } from 'kea'; import { EuiBasicTable, EuiBasicTableColumn, EuiCopy, EuiEmptyPrompt } from '@elastic/eui'; -import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; import { i18n } from '@kbn/i18n'; import { HiddenText } from '../../../../shared/hidden_text'; +import { convertMetaToPagination, handlePageChange } from '../../../../shared/table_pagination'; import { TOKEN_TYPE_DISPLAY_NAMES } from '../constants'; import { CredentialsLogic } from '../credentials_logic'; import { ApiToken } from '../types'; @@ -23,9 +23,9 @@ import { apiTokenSort } from '../utils/api_token_sort'; import { Key } from './key'; export const CredentialsList: React.FC = () => { - const { deleteApiKey, fetchCredentials, showCredentialsForm } = useActions(CredentialsLogic); + const { deleteApiKey, onPaginate, showCredentialsForm } = useActions(CredentialsLogic); - const { apiTokens, meta } = useValues(CredentialsLogic); + const { apiTokens, meta, isCredentialsDataComplete } = useValues(CredentialsLogic); const items = useMemo(() => apiTokens.slice().sort(apiTokenSort), [apiTokens]); @@ -109,38 +109,31 @@ export const CredentialsList: React.FC = () => { }, ]; - const pagination = { - pageIndex: meta.page ? meta.page.current - 1 : 0, - pageSize: meta.page ? meta.page.size : 0, - totalItemCount: meta.page ? meta.page.total_results : 0, - hidePerPageOptions: true, - }; - - const onTableChange = ({ page }: CriteriaWithPagination) => { - const { index: current } = page; - fetchCredentials(current + 1); - }; - - return items.length < 1 ? ( - - {i18n.translate('xpack.enterpriseSearch.appSearch.credentials.empty.title', { - defaultMessage: 'No API Keys have been created yet.', - })} - - } - body={i18n.translate('xpack.enterpriseSearch.appSearch.credentials.empty.body', { - defaultMessage: 'Click the "Create a key" button to make your first one.', - })} - /> - ) : ( + return ( + {i18n.translate('xpack.enterpriseSearch.appSearch.credentials.empty.title', { + defaultMessage: 'No API Keys have been created yet.', + })} + + } + body={i18n.translate('xpack.enterpriseSearch.appSearch.credentials.empty.body', { + defaultMessage: 'Click the "Create a key" button to make your first one.', + })} + /> + } + loading={!isCredentialsDataComplete} + pagination={{ + ...convertMetaToPagination(meta), + hidePerPageOptions: true, + }} + onChange={handlePageChange(onPaginate)} /> ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts index c9d6a43ebbbae..9ff540de13fe1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts @@ -7,15 +7,15 @@ import { LogicMounter, mockFlashMessageHelpers, mockHttpValues } from '../../../__mocks__'; +import { nextTick } from '@kbn/test/jest'; + +import { DEFAULT_META } from '../../../shared/constants'; + jest.mock('../../app_logic', () => ({ AppLogic: { selectors: { myRole: jest.fn(() => ({})) }, - values: { myRole: jest.fn(() => ({})) }, }, })); - -import { nextTick } from '@kbn/test/jest'; - import { AppLogic } from '../../app_logic'; import { ApiTokenTypes } from './constants'; @@ -43,7 +43,7 @@ describe('CredentialsLogic', () => { formErrors: [], isCredentialsDataComplete: false, isCredentialsDetailsComplete: false, - meta: {}, + meta: DEFAULT_META, nameInputBlurred: false, shouldShowCredentialsForm: false, fullEngineAccessChecked: false, @@ -213,39 +213,6 @@ describe('CredentialsLogic', () => { }); }); - describe('onApiKeyDelete', () => { - const values = { - ...DEFAULT_VALUES, - apiTokens: expect.any(Array), - }; - - describe('apiTokens', () => { - it('should remove specified token from apiTokens if name matches', () => { - mount({ - apiTokens: [newToken], - }); - - CredentialsLogic.actions.onApiKeyDelete(newToken.name); - expect(CredentialsLogic.values).toEqual({ - ...values, - apiTokens: [], - }); - }); - - it('should not remove specified token from apiTokens if name does not match', () => { - mount({ - apiTokens: [newToken], - }); - - CredentialsLogic.actions.onApiKeyDelete('foo'); - expect(CredentialsLogic.values).toEqual({ - ...values, - apiTokens: [newToken], - }); - }); - }); - }); - describe('onApiTokenCreateSuccess', () => { const values = { ...DEFAULT_VALUES, @@ -467,6 +434,7 @@ describe('CredentialsLogic', () => { const values = { ...DEFAULT_VALUES, + dataLoading: false, apiTokens: expect.any(Array), meta: expect.any(Object), isCredentialsDataComplete: expect.any(Boolean), @@ -514,6 +482,7 @@ describe('CredentialsLogic', () => { describe('setCredentialsDetails', () => { const values = { ...DEFAULT_VALUES, + dataLoading: false, engines: expect.any(Array), isCredentialsDetailsComplete: expect.any(Boolean), }; @@ -1038,15 +1007,20 @@ describe('CredentialsLogic', () => { }); }); - describe('initializeCredentialsData', () => { - it('should call fetchCredentials and fetchDetails', () => { - mount(); - jest.spyOn(CredentialsLogic.actions, 'fetchCredentials').mockImplementationOnce(() => {}); - jest.spyOn(CredentialsLogic.actions, 'fetchDetails').mockImplementationOnce(() => {}); + describe('onPaginate', () => { + it('should set meta.page.current', () => { + mount({ meta: DEFAULT_META }); - CredentialsLogic.actions.initializeCredentialsData(); - expect(CredentialsLogic.actions.fetchCredentials).toHaveBeenCalled(); - expect(CredentialsLogic.actions.fetchDetails).toHaveBeenCalled(); + CredentialsLogic.actions.onPaginate(5); + expect(CredentialsLogic.values).toEqual({ + ...DEFAULT_VALUES, + meta: { + page: { + ...DEFAULT_META.page, + current: 5, + }, + }, + }); }); }); @@ -1066,10 +1040,11 @@ describe('CredentialsLogic', () => { jest.spyOn(CredentialsLogic.actions, 'setCredentialsData').mockImplementationOnce(() => {}); http.get.mockReturnValue(Promise.resolve({ meta, results })); - CredentialsLogic.actions.fetchCredentials(2); + CredentialsLogic.actions.fetchCredentials(); expect(http.get).toHaveBeenCalledWith('/api/app_search/credentials', { query: { - 'page[current]': 2, + 'page[current]': 1, + 'page[size]': 10, }, }); await nextTick(); @@ -1117,15 +1092,16 @@ describe('CredentialsLogic', () => { describe('deleteApiKey', () => { const tokenName = 'abc123'; - it('will call an API endpoint and set the results with the `onApiKeyDelete` action', async () => { + it('will call an API endpoint and re-fetch the credentials list', async () => { mount(); - jest.spyOn(CredentialsLogic.actions, 'onApiKeyDelete').mockImplementationOnce(() => {}); + jest.spyOn(CredentialsLogic.actions, 'fetchCredentials').mockImplementationOnce(() => {}); http.delete.mockReturnValue(Promise.resolve()); CredentialsLogic.actions.deleteApiKey(tokenName); expect(http.delete).toHaveBeenCalledWith(`/api/app_search/credentials/${tokenName}`); await nextTick(); - expect(CredentialsLogic.actions.onApiKeyDelete).toHaveBeenCalledWith(tokenName); + + expect(CredentialsLogic.actions.fetchCredentials).toHaveBeenCalled(); expect(setSuccessMessage).toHaveBeenCalled(); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.ts index ff4600872c589..2841282704189 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.ts @@ -8,12 +8,15 @@ import { kea, MakeLogicType } from 'kea'; import { Meta } from '../../../../../common/types'; +import { DEFAULT_META } from '../../../shared/constants'; import { clearFlashMessages, setSuccessMessage, flashAPIErrors, } from '../../../shared/flash_messages'; import { HttpLogic } from '../../../shared/http'; +import { updateMetaPageIndex } from '../../../shared/table_pagination'; + import { AppLogic } from '../../app_logic'; import { Engine } from '../../types'; import { formatApiName } from '../../utils/format_api_name'; @@ -32,7 +35,6 @@ export const defaultApiToken: ApiToken = { interface CredentialsLogicActions { addEngineName(engineName: string): string; - onApiKeyDelete(tokenName: string): string; onApiTokenCreateSuccess(apiToken: ApiToken): ApiToken; onApiTokenError(formErrors: string[]): string[]; onApiTokenUpdateSuccess(apiToken: ApiToken): ApiToken; @@ -47,8 +49,8 @@ interface CredentialsLogicActions { showCredentialsForm(apiToken?: ApiToken): ApiToken; hideCredentialsForm(): { value: boolean }; resetCredentials(): { value: boolean }; - initializeCredentialsData(): { value: boolean }; - fetchCredentials(page?: number): number; + onPaginate(newPageIndex: number): { newPageIndex: number }; + fetchCredentials(): void; fetchDetails(): { value: boolean }; deleteApiKey(tokenName: string): string; onApiTokenChange(): void; @@ -66,7 +68,7 @@ interface CredentialsLogicValues { isCredentialsDataComplete: boolean; isCredentialsDetailsComplete: boolean; fullEngineAccessChecked: boolean; - meta: Partial; + meta: Meta; nameInputBlurred: boolean; shouldShowCredentialsForm: boolean; } @@ -77,7 +79,6 @@ export const CredentialsLogic = kea({ path: ['enterprise_search', 'app_search', 'credentials_logic'], actions: () => ({ addEngineName: (engineName) => engineName, - onApiKeyDelete: (tokenName) => tokenName, onApiTokenCreateSuccess: (apiToken) => apiToken, onApiTokenError: (formErrors) => formErrors, onApiTokenUpdateSuccess: (apiToken) => apiToken, @@ -92,8 +93,8 @@ export const CredentialsLogic = kea({ showCredentialsForm: (apiToken = { ...defaultApiToken }) => apiToken, hideCredentialsForm: false, resetCredentials: false, - initializeCredentialsData: true, - fetchCredentials: (page) => page, + onPaginate: (newPageIndex) => ({ newPageIndex }), + fetchCredentials: true, fetchDetails: true, deleteApiKey: (tokenName) => tokenName, onApiTokenChange: () => null, @@ -109,14 +110,13 @@ export const CredentialsLogic = kea({ ...apiTokens.filter((token) => token.name !== apiToken.name), apiToken, ], - onApiKeyDelete: (apiTokens, tokenName) => - apiTokens.filter((token) => token.name !== tokenName), }, ], meta: [ - {}, + DEFAULT_META, { setCredentialsData: (_, { meta }) => meta, + onPaginate: (state, { newPageIndex }) => updateMetaPageIndex(state, newPageIndex), }, ], isCredentialsDetailsComplete: [ @@ -130,6 +130,7 @@ export const CredentialsLogic = kea({ false, { setCredentialsData: () => true, + fetchCredentials: () => false, resetCredentials: () => false, }, ], @@ -218,7 +219,7 @@ export const CredentialsLogic = kea({ dataLoading: [ () => [selectors.isCredentialsDetailsComplete, selectors.isCredentialsDataComplete], (isCredentialsDetailsComplete, isCredentialsDataComplete) => { - return isCredentialsDetailsComplete === false || isCredentialsDataComplete === false; + return isCredentialsDetailsComplete === false && isCredentialsDataComplete === false; }, ], activeApiTokenExists: [ @@ -230,14 +231,14 @@ export const CredentialsLogic = kea({ showCredentialsForm: () => { clearFlashMessages(); }, - initializeCredentialsData: () => { - actions.fetchCredentials(); - actions.fetchDetails(); - }, - fetchCredentials: async (page = 1) => { + fetchCredentials: async () => { try { const { http } = HttpLogic.values; - const query = { 'page[current]': page }; + const { meta } = values; + const query = { + 'page[current]': meta.page.current, + 'page[size]': meta.page.size, + }; const response = await http.get('/api/app_search/credentials', { query }); actions.setCredentialsData(response.meta, response.results); } catch (e) { @@ -259,7 +260,7 @@ export const CredentialsLogic = kea({ const { http } = HttpLogic.values; await http.delete(`/api/app_search/credentials/${tokenName}`); - actions.onApiKeyDelete(tokenName); + actions.fetchCredentials(); setSuccessMessage(DELETE_MESSAGE); } catch (e) { flashAPIErrors(e); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts index 1b2d3b8cdb953..434aff9c3cc4b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts @@ -9,13 +9,13 @@ import { kea, MakeLogicType } from 'kea'; import { Meta } from '../../../../../common/types'; import { DEFAULT_META } from '../../../shared/constants'; - import { clearFlashMessages, setSuccessMessage, flashAPIErrors, } from '../../../shared/flash_messages'; import { HttpLogic } from '../../../shared/http'; +import { updateMetaPageIndex } from '../../../shared/table_pagination'; import { EngineLogic } from '../engine'; import { DELETE_MESSAGE, SUCCESS_MESSAGE } from './constants'; @@ -60,11 +60,7 @@ export const CurationsLogic = kea meta, - onPaginate: (state, { newPageIndex }) => { - const newState = { page: { ...state.page } }; - newState.page.current = newPageIndex; - return newState; - }, + onPaginate: (state, { newPageIndex }) => updateMetaPageIndex(state, newPageIndex), }, ], }), diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx index 863920d209d5b..6affef53d71ee 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx @@ -24,6 +24,8 @@ import { FlashMessages } from '../../../../shared/flash_messages'; import { KibanaLogic } from '../../../../shared/kibana'; import { Loading } from '../../../../shared/loading'; import { EuiButtonTo, EuiLinkTo } from '../../../../shared/react_router_helpers'; +import { convertMetaToPagination, handlePageChange } from '../../../../shared/table_pagination'; + import { ENGINE_CURATIONS_NEW_PATH, ENGINE_CURATION_PATH } from '../../../routes'; import { FormattedDateTime } from '../../../utils/formatted_date_time'; import { generateEnginePath } from '../../engine'; @@ -167,15 +169,10 @@ export const CurationsTable: React.FC = () => { /> } pagination={{ - pageIndex: meta.page.current - 1, - pageSize: meta.page.size, - totalItemCount: meta.page.total_results, + ...convertMetaToPagination(meta), hidePerPageOptions: true, }} - onChange={({ page }: { page: { index: number } }) => { - const { index } = page; - onPaginate(index + 1); // Note on paging - App Search's API pages start at 1, EuiBasicTables' pages start at 0 - }} + onChange={handlePageChange(onPaginate)} /> ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.test.ts index 9e9bfc4973124..8be4f471b79a6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.test.ts @@ -9,6 +9,8 @@ import { LogicMounter, mockHttpValues } from '../../../__mocks__'; import { nextTick } from '@kbn/test/jest'; +import { DEFAULT_META } from '../../../shared/constants'; + import { EngineDetails } from '../engine/types'; import { EnginesLogic } from './'; @@ -20,11 +22,11 @@ describe('EnginesLogic', () => { const DEFAULT_VALUES = { dataLoading: true, engines: [], - enginesTotal: 0, - enginesPage: 1, + enginesMeta: DEFAULT_META, + enginesLoading: true, metaEngines: [], - metaEnginesTotal: 0, - metaEnginesPage: 1, + metaEnginesMeta: DEFAULT_META, + metaEnginesLoading: true, }; const MOCK_ENGINE = { @@ -33,16 +35,17 @@ describe('EnginesLogic', () => { document_count: 50, field_count: 10, } as EngineDetails; + const MOCK_META = { + page: { + current: 1, + size: 10, + total_results: 100, + total_pages: 10, + }, + }; const MOCK_ENGINES_API_RESPONSE = { results: [MOCK_ENGINE], - meta: { - page: { - current: 1, - total_pages: 10, - total_results: 100, - size: 10, - }, - }, + meta: MOCK_META, }; beforeEach(() => { @@ -56,112 +59,143 @@ describe('EnginesLogic', () => { describe('actions', () => { describe('onEnginesLoad', () => { - describe('dataLoading', () => { - it('should be set to false', () => { - mount(); - EnginesLogic.actions.onEnginesLoad({ engines: [], total: 0 }); - - expect(EnginesLogic.values).toEqual({ - ...DEFAULT_VALUES, - dataLoading: false, - }); - }); - }); + it('should set engines & enginesMeta and set enginesLoading to false', () => { + mount(); + EnginesLogic.actions.onEnginesLoad(MOCK_ENGINES_API_RESPONSE); - describe('engines & enginesTotal', () => { - it('should be set to the provided value', () => { - mount(); - EnginesLogic.actions.onEnginesLoad({ engines: [MOCK_ENGINE], total: 100 }); - - expect(EnginesLogic.values).toEqual({ - ...DEFAULT_VALUES, - dataLoading: false, - engines: [MOCK_ENGINE], - enginesTotal: 100, - }); + expect(EnginesLogic.values).toEqual({ + ...DEFAULT_VALUES, + engines: [MOCK_ENGINE], + enginesMeta: MOCK_META, + enginesLoading: false, + dataLoading: false, }); }); }); describe('onMetaEnginesLoad', () => { - describe('engines & enginesTotal', () => { - it('should be set to the provided value', () => { - mount(); - EnginesLogic.actions.onMetaEnginesLoad({ engines: [MOCK_ENGINE], total: 1 }); - - expect(EnginesLogic.values).toEqual({ - ...DEFAULT_VALUES, - metaEngines: [MOCK_ENGINE], - metaEnginesTotal: 1, - }); + it('should set engines & enginesMeta and set enginesLoading to false', () => { + mount(); + EnginesLogic.actions.onMetaEnginesLoad(MOCK_ENGINES_API_RESPONSE); + + expect(EnginesLogic.values).toEqual({ + ...DEFAULT_VALUES, + metaEngines: [MOCK_ENGINE], + metaEnginesMeta: MOCK_META, + metaEnginesLoading: false, }); }); }); describe('onEnginesPagination', () => { - describe('enginesPage', () => { - it('should be set to the provided value', () => { - mount(); - EnginesLogic.actions.onEnginesPagination(2); - - expect(EnginesLogic.values).toEqual({ - ...DEFAULT_VALUES, - enginesPage: 2, - }); + it('should set enginesMeta.page.current', () => { + mount(); + EnginesLogic.actions.onEnginesPagination(2); + + expect(EnginesLogic.values).toEqual({ + ...DEFAULT_VALUES, + enginesMeta: { + page: { + ...DEFAULT_VALUES.enginesMeta.page, + current: 2, + }, + }, }); }); }); describe('onMetaEnginesPagination', () => { - describe('metaEnginesPage', () => { - it('should be set to the provided value', () => { - mount(); - EnginesLogic.actions.onMetaEnginesPagination(99); - - expect(EnginesLogic.values).toEqual({ - ...DEFAULT_VALUES, - metaEnginesPage: 99, - }); + it('should set metaEnginesMeta.page.current', () => { + mount(); + EnginesLogic.actions.onMetaEnginesPagination(99); + + expect(EnginesLogic.values).toEqual({ + ...DEFAULT_VALUES, + metaEnginesMeta: { + page: { + ...DEFAULT_VALUES.metaEnginesMeta.page, + current: 99, + }, + }, }); }); }); + }); + describe('listeners', () => { describe('loadEngines', () => { it('should call the engines API endpoint and set state based on the results', async () => { http.get.mockReturnValueOnce(Promise.resolve(MOCK_ENGINES_API_RESPONSE)); - mount({ enginesPage: 10 }); + mount(); jest.spyOn(EnginesLogic.actions, 'onEnginesLoad'); EnginesLogic.actions.loadEngines(); await nextTick(); expect(http.get).toHaveBeenCalledWith('/api/app_search/engines', { - query: { type: 'indexed', pageIndex: 10 }, - }); - expect(EnginesLogic.actions.onEnginesLoad).toHaveBeenCalledWith({ - engines: [MOCK_ENGINE], - total: 100, + query: { + type: 'indexed', + 'page[current]': 1, + 'page[size]': 10, + }, }); + expect(EnginesLogic.actions.onEnginesLoad).toHaveBeenCalledWith(MOCK_ENGINES_API_RESPONSE); }); }); describe('loadMetaEngines', () => { it('should call the engines API endpoint and set state based on the results', async () => { http.get.mockReturnValueOnce(Promise.resolve(MOCK_ENGINES_API_RESPONSE)); - mount({ metaEnginesPage: 99 }); + mount(); jest.spyOn(EnginesLogic.actions, 'onMetaEnginesLoad'); EnginesLogic.actions.loadMetaEngines(); await nextTick(); expect(http.get).toHaveBeenCalledWith('/api/app_search/engines', { - query: { type: 'meta', pageIndex: 99 }, + query: { + type: 'meta', + 'page[current]': 1, + 'page[size]': 10, + }, }); - expect(EnginesLogic.actions.onMetaEnginesLoad).toHaveBeenCalledWith({ + expect(EnginesLogic.actions.onMetaEnginesLoad).toHaveBeenCalledWith( + MOCK_ENGINES_API_RESPONSE + ); + }); + }); + }); + + describe('selectors', () => { + describe('dataLoading', () => { + it('returns true if enginesLoading is true and engines is empty', () => { + mount({ + enginesLoading: true, + engines: [], + }); + expect(EnginesLogic.values.dataLoading).toEqual(true); + }); + + it('returns false if enginesLoading is true but engines exist', () => { + // = the engines table is paginating, which has its own separate table loading indicator + mount({ + enginesLoading: true, engines: [MOCK_ENGINE], - total: 100, }); + expect(EnginesLogic.values.dataLoading).toEqual(false); }); + + it('returns false if engineLoading is false and engines is empty', () => { + // = empty prompt state + mount({ + enginesLoading: false, + engines: [], + }); + expect(EnginesLogic.values.dataLoading).toEqual(false); + }); + + // NOTE: dataLoading ignores metaEnginesLoading to prevent a race condition where + // meta engines finish fetching before engines and flash an empty prompt state. }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.ts index 4382722aeffd3..558bf666a51b1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_logic.ts @@ -7,27 +7,30 @@ import { kea, MakeLogicType } from 'kea'; +import { Meta } from '../../../../../common/types'; +import { DEFAULT_META } from '../../../shared/constants'; import { HttpLogic } from '../../../shared/http'; +import { updateMetaPageIndex } from '../../../shared/table_pagination'; import { EngineDetails } from '../engine/types'; interface EnginesValues { dataLoading: boolean; engines: EngineDetails[]; - enginesTotal: number; - enginesPage: number; + enginesMeta: Meta; + enginesLoading: boolean; metaEngines: EngineDetails[]; - metaEnginesTotal: number; - metaEnginesPage: number; + metaEnginesMeta: Meta; // keanu_whoa.jpg + metaEnginesLoading: boolean; } -interface OnEnginesLoad { - engines: EngineDetails[]; - total: number; +interface EnginesAPIResponse { + results: EngineDetails[]; + meta: Meta; } interface EnginesActions { - onEnginesLoad({ engines, total }: OnEnginesLoad): OnEnginesLoad; - onMetaEnginesLoad({ engines, total }: OnEnginesLoad): OnEnginesLoad; + onEnginesLoad({ results, meta }: EnginesAPIResponse): EnginesAPIResponse; + onMetaEnginesLoad({ results, meta }: EnginesAPIResponse): EnginesAPIResponse; onEnginesPagination(page: number): { page: number }; onMetaEnginesPagination(page: number): { page: number }; loadEngines(): void; @@ -37,81 +40,87 @@ interface EnginesActions { export const EnginesLogic = kea>({ path: ['enterprise_search', 'app_search', 'engines_logic'], actions: { - onEnginesLoad: ({ engines, total }) => ({ engines, total }), - onMetaEnginesLoad: ({ engines, total }) => ({ engines, total }), + onEnginesLoad: ({ results, meta }) => ({ results, meta }), + onMetaEnginesLoad: ({ results, meta }) => ({ results, meta }), onEnginesPagination: (page) => ({ page }), onMetaEnginesPagination: (page) => ({ page }), loadEngines: true, loadMetaEngines: true, }, reducers: { - dataLoading: [ - true, - { - onEnginesLoad: () => false, - }, - ], engines: [ [], { - onEnginesLoad: (_, { engines }) => engines, + onEnginesLoad: (_, { results }) => results, }, ], - enginesTotal: [ - 0, + enginesMeta: [ + DEFAULT_META, { - onEnginesLoad: (_, { total }) => total, + onEnginesLoad: (_, { meta }) => meta, + onEnginesPagination: (state, { page }) => updateMetaPageIndex(state, page), }, ], - enginesPage: [ - 1, + enginesLoading: [ + true, { - onEnginesPagination: (_, { page }) => page, + loadEngines: () => true, + onEnginesLoad: () => false, }, ], metaEngines: [ [], { - onMetaEnginesLoad: (_, { engines }) => engines, + onMetaEnginesLoad: (_, { results }) => results, }, ], - metaEnginesTotal: [ - 0, + metaEnginesMeta: [ + DEFAULT_META, { - onMetaEnginesLoad: (_, { total }) => total, + onMetaEnginesLoad: (_, { meta }) => meta, + onMetaEnginesPagination: (state, { page }) => updateMetaPageIndex(state, page), }, ], - metaEnginesPage: [ - 1, + metaEnginesLoading: [ + true, { - onMetaEnginesPagination: (_, { page }) => page, + loadMetaEngines: () => true, + onMetaEnginesLoad: () => false, }, ], }, + selectors: { + dataLoading: [ + (selectors) => [selectors.enginesLoading, selectors.engines], + (enginesLoading, engines) => enginesLoading && !engines.length, + ], + }, listeners: ({ actions, values }) => ({ loadEngines: async () => { const { http } = HttpLogic.values; - const { enginesPage } = values; + const { enginesMeta } = values; const response = await http.get('/api/app_search/engines', { - query: { type: 'indexed', pageIndex: enginesPage }, - }); - actions.onEnginesLoad({ - engines: response.results, - total: response.meta.page.total_results, + query: { + type: 'indexed', + 'page[current]': enginesMeta.page.current, + 'page[size]': enginesMeta.page.size, + }, }); + actions.onEnginesLoad(response); }, loadMetaEngines: async () => { const { http } = HttpLogic.values; - const { metaEnginesPage } = values; + const { metaEnginesMeta } = values; const response = await http.get('/api/app_search/engines', { - query: { type: 'meta', pageIndex: metaEnginesPage }, - }); - actions.onMetaEnginesLoad({ - engines: response.results, - total: response.meta.page.total_results, + query: { + type: 'meta', + 'page[current]': metaEnginesMeta.page.current, + 'page[size]': metaEnginesMeta.page.size, + }, }); + actions.onMetaEnginesLoad(response); }, }), }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.test.tsx index 978538d26e5d6..c25f27c81ff48 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.test.tsx @@ -22,11 +22,23 @@ describe('EnginesOverview', () => { hasPlatinumLicense: false, dataLoading: false, engines: [], - enginesTotal: 0, - enginesPage: 1, + enginesMeta: { + page: { + current: 1, + size: 10, + total_results: 0, + }, + }, + enginesLoading: false, metaEngines: [], - metaEnginesTotal: 0, - metaEnginesPage: 1, + metaEnginesMeta: { + page: { + current: 1, + size: 10, + total_results: 0, + }, + }, + metaEnginesLoading: false, }; const actions = { loadEngines: jest.fn(), @@ -62,8 +74,13 @@ describe('EnginesOverview', () => { ...values, dataLoading: false, engines: ['dummy-engine'], - enginesTotal: 100, - enginesPage: 1, + enginesMeta: { + page: { + current: 1, + size: 10, + total_results: 100, + }, + }, }; beforeEach(() => { @@ -107,19 +124,43 @@ describe('EnginesOverview', () => { const wrapper = shallow(); const pagination = getTablePagination(wrapper); - expect(pagination.totalEngines).toEqual(100); + expect(pagination.totalItemCount).toEqual(100); expect(pagination.pageIndex).toEqual(0); }); it('re-polls the API on page change', async () => { const wrapper = shallow(); - setMockValues({ ...valuesWithEngines, enginesPage: 51 }); + setMockValues({ + ...valuesWithEngines, + enginesMeta: { + page: { + ...valuesWithEngines.enginesMeta.page, + current: 51, + }, + }, + }); rerender(wrapper); expect(actions.loadEngines).toHaveBeenCalledTimes(2); expect(getTablePagination(wrapper).pageIndex).toEqual(50); }); + + it('calls onPagination handlers', async () => { + setMockValues({ + ...valuesWithEngines, + hasPlatinumLicense: true, + metaEngines: ['dummy-meta-engine'], + }); + const wrapper = shallow(); + const pageEvent = { page: { index: 0 } }; + + wrapper.find(EnginesTable).first().simulate('change', pageEvent); + expect(actions.onEnginesPagination).toHaveBeenCalledWith(1); + + wrapper.find(EnginesTable).last().simulate('change', pageEvent); + expect(actions.onMetaEnginesPagination).toHaveBeenCalledWith(1); + }); }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx index 1a81c1918ad4d..a26fe87365536 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx @@ -22,6 +22,7 @@ import { FlashMessages } from '../../../shared/flash_messages'; import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { LicensingLogic } from '../../../shared/licensing'; import { EuiButtonTo } from '../../../shared/react_router_helpers'; +import { convertMetaToPagination, handlePageChange } from '../../../shared/table_pagination'; import { SendAppSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { ENGINE_CREATION_PATH } from '../../routes'; @@ -39,11 +40,11 @@ export const EnginesOverview: React.FC = () => { const { dataLoading, engines, - enginesTotal, - enginesPage, + enginesMeta, + enginesLoading, metaEngines, - metaEnginesTotal, - metaEnginesPage, + metaEnginesMeta, + metaEnginesLoading, } = useValues(EnginesLogic); const { loadEngines, loadMetaEngines, onEnginesPagination, onMetaEnginesPagination } = useActions( EnginesLogic @@ -51,11 +52,11 @@ export const EnginesOverview: React.FC = () => { useEffect(() => { loadEngines(); - }, [enginesPage]); + }, [enginesMeta.page.current]); useEffect(() => { if (hasPlatinumLicense) loadMetaEngines(); - }, [hasPlatinumLicense, metaEnginesPage]); + }, [hasPlatinumLicense, metaEnginesMeta.page.current]); if (dataLoading) return ; if (!engines.length) return ; @@ -89,12 +90,13 @@ export const EnginesOverview: React.FC = () => { @@ -110,12 +112,13 @@ export const EnginesOverview: React.FC = () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.test.tsx index d6f0946164ea4..f8ad9bc6b2bc3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.test.tsx @@ -19,8 +19,7 @@ import { EngineDetails } from '../engine/types'; import { EnginesTable } from './engines_table'; describe('EnginesTable', () => { - const onPaginate = jest.fn(); // onPaginate updates the engines API call upstream - + const onChange = jest.fn(); const data = [ { name: 'test-engine', @@ -32,113 +31,112 @@ describe('EnginesTable', () => { } as EngineDetails, ]; const pagination = { - totalEngines: 50, pageIndex: 0, - onPaginate, + pageSize: 10, + totalItemCount: 50, + hidePerPageOptions: true, }; const props = { - data, + items: data, + loading: false, pagination, + onChange, }; - const wrapper = mountWithIntl(); - const table = wrapper.find(EuiBasicTable); + describe('basic table', () => { + const wrapper = mountWithIntl(); + const table = wrapper.find(EuiBasicTable); - it('renders', () => { - expect(table).toHaveLength(1); - expect(table.prop('pagination').totalItemCount).toEqual(50); + it('renders', () => { + expect(table).toHaveLength(1); + expect(table.prop('pagination').totalItemCount).toEqual(50); - const tableContent = table.text(); - expect(tableContent).toContain('test-engine'); - expect(tableContent).toContain('Jan 1, 1970'); - expect(tableContent).toContain('English'); - expect(tableContent).toContain('99,999'); - expect(tableContent).toContain('10'); + const tableContent = table.text(); + expect(tableContent).toContain('test-engine'); + expect(tableContent).toContain('Jan 1, 1970'); + expect(tableContent).toContain('English'); + expect(tableContent).toContain('99,999'); + expect(tableContent).toContain('10'); - expect(table.find(EuiPagination).find(EuiButtonEmpty)).toHaveLength(5); // Should display 5 pages at 10 engines per page - }); + expect(table.find(EuiPagination).find(EuiButtonEmpty)).toHaveLength(5); // Should display 5 pages at 10 engines per page + }); - it('contains engine links which send telemetry', () => { - const engineLinks = wrapper.find(EuiLinkTo); + it('contains engine links which send telemetry', () => { + const engineLinks = wrapper.find(EuiLinkTo); - engineLinks.forEach((link) => { - expect(link.prop('to')).toEqual('/engines/test-engine'); - link.simulate('click'); + engineLinks.forEach((link) => { + expect(link.prop('to')).toEqual('/engines/test-engine'); + link.simulate('click'); - expect(mockTelemetryActions.sendAppSearchTelemetry).toHaveBeenCalledWith({ - action: 'clicked', - metric: 'engine_table_link', + expect(mockTelemetryActions.sendAppSearchTelemetry).toHaveBeenCalledWith({ + action: 'clicked', + metric: 'engine_table_link', + }); }); }); - }); - it('triggers onPaginate', () => { - table.prop('onChange')({ page: { index: 4 } }); - - expect(onPaginate).toHaveBeenCalledWith(5); + it('triggers onPaginate', () => { + table.prop('onChange')({ page: { index: 4 } }); + expect(onChange).toHaveBeenCalledWith({ page: { index: 4 } }); + }); }); - it('handles empty data', () => { - const emptyWrapper = mountWithIntl( - {} }} - /> - ); - const emptyTable = emptyWrapper.find(EuiBasicTable); - - expect(emptyTable.prop('pagination').pageIndex).toEqual(0); + describe('loading', () => { + it('passes the loading prop', () => { + const wrapper = mountWithIntl(); + expect(wrapper.find(EuiBasicTable).prop('loading')).toEqual(true); + }); }); describe('language field', () => { it('renders language when available', () => { - const wrapperWithLanguage = mountWithIntl( + const wrapper = mountWithIntl( ); - const tableContent = wrapperWithLanguage.find(EuiBasicTable).text(); + const tableContent = wrapper.find(EuiBasicTable).text(); expect(tableContent).toContain('German'); }); it('renders the language as Universal if no language is set', () => { - const wrapperWithLanguage = mountWithIntl( + const wrapper = mountWithIntl( ); - const tableContent = wrapperWithLanguage.find(EuiBasicTable).text(); + const tableContent = wrapper.find(EuiBasicTable).text(); expect(tableContent).toContain('Universal'); }); it('renders no language text if the engine is a Meta Engine', () => { - const wrapperWithLanguage = mountWithIntl( + const wrapper = mountWithIntl( ); - const tableContent = wrapperWithLanguage.find(EuiBasicTable).text(); + const tableContent = wrapper.find(EuiBasicTable).text(); expect(tableContent).not.toContain('Universal'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx index 85a9bb338b7f0..fe61ba8cbcc43 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_table.tsx @@ -9,11 +9,10 @@ import React from 'react'; import { useActions } from 'kea'; -import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; +import { EuiBasicTable, EuiBasicTableColumn, CriteriaWithPagination } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, FormattedNumber } from '@kbn/i18n/react'; -import { ENGINES_PAGE_SIZE } from '../../../../../common/constants'; import { EuiLinkTo } from '../../../shared/react_router_helpers'; import { TelemetryLogic } from '../../../shared/telemetry'; import { UNIVERSAL_LANGUAGE } from '../../constants'; @@ -22,24 +21,23 @@ import { generateEncodedPath } from '../../utils/encode_path_params'; import { FormattedDateTime } from '../../utils/formatted_date_time'; import { EngineDetails } from '../engine/types'; -interface EnginesTablePagination { - totalEngines: number; - pageIndex: number; - onPaginate(pageIndex: number): void; -} interface EnginesTableProps { - data: EngineDetails[]; - pagination: EnginesTablePagination; -} -interface OnChange { - page: { - index: number; + items: EngineDetails[]; + loading: boolean; + pagination: { + pageIndex: number; + pageSize: number; + totalItemCount: number; + hidePerPageOptions: boolean; }; + onChange(criteria: CriteriaWithPagination): void; } export const EnginesTable: React.FC = ({ - data, - pagination: { totalEngines, pageIndex, onPaginate }, + items, + loading, + pagination, + onChange, }) => { const { sendAppSearchTelemetry } = useActions(TelemetryLogic); @@ -145,18 +143,11 @@ export const EnginesTable: React.FC = ({ return ( { - const { index } = page; - onPaginate(index + 1); // Note on paging - App Search's API pages start at 1, EuiBasicTables' pages start at 0 - }} + loading={loading} + pagination={pagination} + onChange={onChange} /> ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.test.ts new file mode 100644 index 0000000000000..32059f4dc7ae5 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.test.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { convertMetaToPagination, handlePageChange, updateMetaPageIndex } from './'; + +describe('convertMetaToPagination', () => { + expect( + convertMetaToPagination({ + page: { + current: 1, + size: 10, + total_results: 25, + total_pages: 3, // Not used, EuiBasicTable calculates pages on its own + }, + }) + ).toEqual({ + pageIndex: 0, + pageSize: 10, + totalItemCount: 25, + }); +}); + +describe('handlePageChange', () => { + it('creates an onChange handler that calls a passed callback with the new page index', () => { + const mockCallback = jest.fn(); + const handler = handlePageChange(mockCallback); + + handler({ page: { index: 0 } }); + expect(mockCallback).toHaveBeenCalledWith(1); + }); +}); + +describe('updateMetaPageIndex', () => { + it('updates meta.page.current without mutating meta.page', () => { + const oldMeta = { + page: { + current: 5, + size: 10, + total_results: 100, + total_pages: 10, + }, + some_other_meta: true, + }; + const newMeta = updateMetaPageIndex(oldMeta, 6); + + expect(newMeta.page.current).toEqual(6); + expect(oldMeta.page === newMeta.page).toEqual(false); // Would be true if we had simply done oldMeta.page.current = 6 + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts new file mode 100644 index 0000000000000..fb94a88fd0ce7 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts @@ -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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta } from '../../../../common/types'; + +/** + * Note: App Search's API pages start at 1 & EuiBasicTables' pages start at 0 + * These helpers both automatically handle off-by-1 conversion in addition to + * automatically converting our snake_cased API meta to camelCased EUI props + */ + +export const convertMetaToPagination = (meta: Meta) => ({ + pageIndex: meta.page.current - 1, + pageSize: meta.page.size, + totalItemCount: meta.page.total_results, +}); + +interface EuiBasicTableOnChange { + page: { index: number }; +} +export const handlePageChange = (paginationCallback: Function) => ({ + page: { index }, +}: EuiBasicTableOnChange) => { + paginationCallback(index + 1); +}; + +/** + * Helper for updating Kea `meta` state without mutating nested objs + */ + +export const updateMetaPageIndex = (oldState: Meta, newPageIndex: number) => { + const newMetaState = { ...oldState, page: { ...oldState.page } }; + newMetaState.page.current = newPageIndex; + return newMetaState; +}; diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.test.ts index d9e84d3e62f28..18fce922e470d 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.test.ts @@ -34,11 +34,16 @@ describe('credentials routes', () => { describe('validates', () => { it('correctly', () => { - const request = { query: { 'page[current]': 1 } }; + const request = { + query: { + 'page[current]': 1, + 'page[size]': 10, + }, + }; mockRouter.shouldValidate(request); }); - it('missing page[current]', () => { + it('missing page query params', () => { const request = { query: {} }; mockRouter.shouldThrow(request); }); diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.ts index 3b691f196c135..22edb16f0aca6 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/credentials.ts @@ -41,6 +41,7 @@ export function registerCredentialsRoutes({ validate: { query: schema.object({ 'page[current]': schema.number(), + 'page[size]': schema.number(), }), }, }, diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts index 6fbc9f5bd2fc4..779c51131b472 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts @@ -11,14 +11,11 @@ import { registerEnginesRoutes } from './engines'; describe('engine routes', () => { describe('GET /api/app_search/engines', () => { - const AUTH_HEADER = 'Basic 123'; const mockRequest = { - headers: { - authorization: AUTH_HEADER, - }, query: { type: 'indexed', - pageIndex: 1, + 'page[current]': 1, + 'page[size]': 10, }, }; @@ -42,17 +39,6 @@ describe('engine routes', () => { expect(mockRequestHandler.createRequest).toHaveBeenCalledWith({ path: '/as/engines/collection', - params: { type: 'indexed', 'page[current]': 1, 'page[size]': 10 }, - hasValidData: expect.any(Function), - }); - }); - - it('passes custom parameters to enterpriseSearchRequestHandler', () => { - mockRouter.callRoute({ query: { type: 'meta', pageIndex: 99 } }); - - expect(mockRequestHandler.createRequest).toHaveBeenCalledWith({ - path: '/as/engines/collection', - params: { type: 'meta', 'page[current]': 99, 'page[size]': 10 }, hasValidData: expect.any(Function), }); }); @@ -84,27 +70,29 @@ describe('engine routes', () => { describe('validates', () => { it('correctly', () => { - const request = { query: { type: 'meta', pageIndex: 5 } }; + const request = { + query: { + type: 'meta', + 'page[current]': 5, + 'page[size]': 10, + }, + }; mockRouter.shouldValidate(request); }); - it('wrong pageIndex type', () => { - const request = { query: { type: 'indexed', pageIndex: 'indexed' } }; - mockRouter.shouldThrow(request); - }); - it('wrong type string', () => { - const request = { query: { type: 'invalid', pageIndex: 1 } }; - mockRouter.shouldThrow(request); - }); - - it('missing pageIndex', () => { - const request = { query: { type: 'indexed' } }; + const request = { + query: { + type: 'invalid', + 'page[current]': 5, + 'page[size]': 10, + }, + }; mockRouter.shouldThrow(request); }); - it('missing type', () => { - const request = { query: { pageIndex: 1 } }; + it('missing query params', () => { + const request = { query: {} }; mockRouter.shouldThrow(request); }); }); diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts index 7d537e5dc0df3..9bff6cf127dd3 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts @@ -7,7 +7,6 @@ import { schema } from '@kbn/config-schema'; -import { ENGINES_PAGE_SIZE } from '../../../common/constants'; import { RouteDependencies } from '../../plugin'; interface EnginesResponse { @@ -25,20 +24,14 @@ export function registerEnginesRoutes({ validate: { query: schema.object({ type: schema.oneOf([schema.literal('indexed'), schema.literal('meta')]), - pageIndex: schema.number(), + 'page[current]': schema.number(), + 'page[size]': schema.number(), }), }, }, async (context, request, response) => { - const { type, pageIndex } = request.query; - return enterpriseSearchRequestHandler.createRequest({ path: '/as/engines/collection', - params: { - type, - 'page[current]': pageIndex, - 'page[size]': ENGINES_PAGE_SIZE, - }, hasValidData: (body?: EnginesResponse) => Array.isArray(body?.results) && typeof body?.meta?.page?.total_results === 'number', })(context, request, response); From 41a02a7a9e75716fe894585b6c4c91a50bb59459 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 23 Feb 2021 19:45:15 +0100 Subject: [PATCH 08/45] Bump Node.js from version 14.15.4 to 14.16.0 (#92421) --- .node-version | 2 +- .nvmrc | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.node-version b/.node-version index c91434ab584a7..2a0dc9a810cf3 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -14.15.4 +14.16.0 diff --git a/.nvmrc b/.nvmrc index c91434ab584a7..2a0dc9a810cf3 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.15.4 +14.16.0 diff --git a/package.json b/package.json index 72fc72ea5f055..70918f02dcd41 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "**/typescript": "4.1.3" }, "engines": { - "node": "14.15.4", + "node": "14.16.0", "yarn": "^1.21.1" }, "dependencies": { From f4b16f3d872763108a8b6aab8187a04deaee8ea6 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Tue, 23 Feb 2021 14:06:36 -0500 Subject: [PATCH 09/45] [Maps] Fix geo shape agg telemetry not collecting due to missing index pattern IDs (#90886) --- .../plugins/maps/server/maps_telemetry/maps_telemetry.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 0387d96046cb1..8f9b529ae30f5 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts @@ -24,6 +24,8 @@ import { import { MapSavedObject, MapSavedObjectAttributes } from '../../common/map_saved_object_type'; import { getIndexPatternsService, getInternalRepository } from '../kibana_server_services'; import { MapsConfigType } from '../../config'; +// @ts-expect-error +import { injectReferences } from '././../../common/migrations/references'; interface Settings { showMapVisualizationTypes: boolean; @@ -310,7 +312,12 @@ export async function getMapsTelemetry(config: MapsConfigType): Promise( MAP_SAVED_OBJECT_TYPE, - (savedObjects) => layerLists.push(...getLayerLists(savedObjects)) + (savedObjects) => { + const savedObjectsWithIndexPatternIds = savedObjects.map((savedObject) => { + return injectReferences(savedObject); + }); + return layerLists.push(...getLayerLists(savedObjectsWithIndexPatternIds)); + } ); const savedObjectsTelemetry = buildMapsSavedObjectsTelemetry(layerLists); From a88106cc8b0f0b4bbb56ce51edd87367671d236d Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 23 Feb 2021 12:26:36 -0700 Subject: [PATCH 10/45] [esArchiver] pass x-elastic-product-origin header to ES (#91566) Co-authored-by: spalger Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../src/actions/empty_kibana_index.ts | 2 +- packages/kbn-es-archiver/src/actions/load.ts | 17 ++++--- .../kbn-es-archiver/src/client_headers.ts | 11 +++++ .../docs/generate_doc_records_stream.test.ts | 10 ++++ .../lib/docs/generate_doc_records_stream.ts | 24 ++++++---- .../lib/docs/index_doc_records_stream.test.ts | 10 ++++ .../src/lib/docs/index_doc_records_stream.ts | 46 +++++++++++-------- .../lib/indices/create_index_stream.test.ts | 8 ++++ .../src/lib/indices/create_index_stream.ts | 22 +++++---- .../src/lib/indices/delete_index.ts | 38 +++++++++++---- .../indices/generate_index_records_stream.ts | 45 +++++++++++------- .../src/lib/indices/kibana_index.ts | 31 ++++++++----- 12 files changed, 181 insertions(+), 83 deletions(-) create mode 100644 packages/kbn-es-archiver/src/client_headers.ts diff --git a/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts b/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts index f86865ffa6670..300c9f4dd66b0 100644 --- a/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts +++ b/packages/kbn-es-archiver/src/actions/empty_kibana_index.ts @@ -24,7 +24,7 @@ export async function emptyKibanaIndexAction({ const kibanaPluginIds = await kbnClient.plugins.getEnabledIds(); await cleanKibanaIndices({ client, stats, log, kibanaPluginIds }); - await migrateKibanaIndex({ client, kbnClient }); + await migrateKibanaIndex(kbnClient); stats.createdIndex('.kibana'); return stats.toJSON(); } diff --git a/packages/kbn-es-archiver/src/actions/load.ts b/packages/kbn-es-archiver/src/actions/load.ts index e1552107eec7c..60af6b3aa747b 100644 --- a/packages/kbn-es-archiver/src/actions/load.ts +++ b/packages/kbn-es-archiver/src/actions/load.ts @@ -11,8 +11,8 @@ import { createReadStream } from 'fs'; import { Readable } from 'stream'; import { ToolingLog, KbnClient } from '@kbn/dev-utils'; import { Client } from '@elastic/elasticsearch'; - import { createPromiseFromStreams, concatStreamProviders } from '@kbn/utils'; +import { ES_CLIENT_HEADERS } from '../client_headers'; import { isGzip, @@ -90,14 +90,19 @@ export async function loadAction({ } } - await client.indices.refresh({ - index: '_all', - allow_no_indices: true, - }); + await client.indices.refresh( + { + index: '_all', + allow_no_indices: true, + }, + { + headers: ES_CLIENT_HEADERS, + } + ); // If we affected the Kibana index, we need to ensure it's migrated... if (Object.keys(result).some((k) => k.startsWith('.kibana'))) { - await migrateKibanaIndex({ client, kbnClient }); + await migrateKibanaIndex(kbnClient); log.debug('[%s] Migrated Kibana index after loading Kibana data', name); if (kibanaPluginIds.includes('spaces')) { diff --git a/packages/kbn-es-archiver/src/client_headers.ts b/packages/kbn-es-archiver/src/client_headers.ts new file mode 100644 index 0000000000000..da240c3ad8318 --- /dev/null +++ b/packages/kbn-es-archiver/src/client_headers.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const ES_CLIENT_HEADERS = { + 'x-elastic-product-origin': 'kibana', +}; diff --git a/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.test.ts b/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.test.ts index f62fae2d197ee..da7ed4c81b666 100644 --- a/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.test.ts +++ b/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.test.ts @@ -107,6 +107,11 @@ it('transforms each input index to a stream of docs using scrollSearch helper', "scroll": "1m", "size": 1000, }, + Object { + "headers": Object { + "x-elastic-product-origin": "kibana", + }, + }, ], Array [ Object { @@ -119,6 +124,11 @@ it('transforms each input index to a stream of docs using scrollSearch helper', "scroll": "1m", "size": 1000, }, + Object { + "headers": Object { + "x-elastic-product-origin": "kibana", + }, + }, ], ], "results": Array [ diff --git a/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.ts b/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.ts index 4afc29fad6e22..cacd224e71421 100644 --- a/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.ts +++ b/packages/kbn-es-archiver/src/lib/docs/generate_doc_records_stream.ts @@ -10,6 +10,7 @@ import { Transform } from 'stream'; import { Client } from '@elastic/elasticsearch'; import { Stats } from '../stats'; import { Progress } from '../progress'; +import { ES_CLIENT_HEADERS } from '../../client_headers'; const SCROLL_SIZE = 1000; const SCROLL_TIMEOUT = '1m'; @@ -30,16 +31,21 @@ export function createGenerateDocRecordsStream({ readableObjectMode: true, async transform(index, enc, callback) { try { - const interator = client.helpers.scrollSearch({ - index, - scroll: SCROLL_TIMEOUT, - size: SCROLL_SIZE, - _source: 'true', - body: { - query, + const interator = client.helpers.scrollSearch( + { + index, + scroll: SCROLL_TIMEOUT, + size: SCROLL_SIZE, + _source: 'true', + body: { + query, + }, + rest_total_hits_as_int: true, }, - rest_total_hits_as_int: true, - }); + { + headers: ES_CLIENT_HEADERS, + } + ); let remainingHits: number | null = null; diff --git a/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.test.ts b/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.test.ts index 623410ae6a354..2aa71fd23a711 100644 --- a/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.test.ts +++ b/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.test.ts @@ -152,6 +152,11 @@ it('indexes documents using the bulk client helper', async () => { "onDrop": [Function], "retries": 5, }, + Object { + "headers": Object { + "x-elastic-product-origin": "kibana", + }, + }, ], Array [ Object { @@ -170,6 +175,11 @@ it('indexes documents using the bulk client helper', async () => { "onDrop": [Function], "retries": 5, }, + Object { + "headers": Object { + "x-elastic-product-origin": "kibana", + }, + }, ], ], "results": Array [ diff --git a/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.ts b/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.ts index 98a9cdbe38ffd..e105a243cae76 100644 --- a/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.ts +++ b/packages/kbn-es-archiver/src/lib/docs/index_doc_records_stream.ts @@ -11,6 +11,7 @@ import AggregateError from 'aggregate-error'; import { Writable } from 'stream'; import { Stats } from '../stats'; import { Progress } from '../progress'; +import { ES_CLIENT_HEADERS } from '../../client_headers'; export function createIndexDocRecordsStream( client: Client, @@ -23,27 +24,32 @@ export function createIndexDocRecordsStream( const ops = new WeakMap(); const errors: string[] = []; - await client.helpers.bulk({ - retries: 5, - datasource: docs.map((doc) => { - const body = doc.source; - ops.set(body, { - [operation]: { - _index: doc.index, - _id: doc.id, - }, - }); - return body; - }), - onDocument(doc) { - return ops.get(doc); + await client.helpers.bulk( + { + retries: 5, + datasource: docs.map((doc) => { + const body = doc.source; + ops.set(body, { + [operation]: { + _index: doc.index, + _id: doc.id, + }, + }); + return body; + }), + onDocument(doc) { + return ops.get(doc); + }, + onDrop(dropped) { + const dj = JSON.stringify(dropped.document); + const ej = JSON.stringify(dropped.error); + errors.push(`Bulk doc failure [operation=${operation}]:\n doc: ${dj}\n error: ${ej}`); + }, }, - onDrop(dropped) { - const dj = JSON.stringify(dropped.document); - const ej = JSON.stringify(dropped.error); - errors.push(`Bulk doc failure [operation=${operation}]:\n doc: ${dj}\n error: ${ej}`); - }, - }); + { + headers: ES_CLIENT_HEADERS, + } + ); if (errors.length) { throw new AggregateError(errors); diff --git a/packages/kbn-es-archiver/src/lib/indices/create_index_stream.test.ts b/packages/kbn-es-archiver/src/lib/indices/create_index_stream.test.ts index cc7ae7971424f..39e00ff0c72c0 100644 --- a/packages/kbn-es-archiver/src/lib/indices/create_index_stream.test.ts +++ b/packages/kbn-es-archiver/src/lib/indices/create_index_stream.test.ts @@ -65,6 +65,9 @@ describe('esArchiver: createCreateIndexStream()', () => { ], }, Object { + "headers": Object { + "x-elastic-product-origin": "kibana", + }, "ignore": Array [ 404, ], @@ -81,6 +84,11 @@ describe('esArchiver: createCreateIndexStream()', () => { "actual-index", ], }, + Object { + "headers": Object { + "x-elastic-product-origin": "kibana", + }, + }, ], ] `); diff --git a/packages/kbn-es-archiver/src/lib/indices/create_index_stream.ts b/packages/kbn-es-archiver/src/lib/indices/create_index_stream.ts index 11220bb7562f9..ca89278305813 100644 --- a/packages/kbn-es-archiver/src/lib/indices/create_index_stream.ts +++ b/packages/kbn-es-archiver/src/lib/indices/create_index_stream.ts @@ -15,6 +15,7 @@ import { ToolingLog } from '@kbn/dev-utils'; import { Stats } from '../stats'; import { deleteKibanaIndices } from './kibana_index'; import { deleteIndex } from './delete_index'; +import { ES_CLIENT_HEADERS } from '../../client_headers'; interface DocRecord { value: { @@ -63,15 +64,20 @@ export function createCreateIndexStream({ kibanaIndexAlreadyDeleted = true; } - await client.indices.create({ - method: 'PUT', - index, - body: { - settings, - mappings, - aliases, + await client.indices.create( + { + method: 'PUT', + index, + body: { + settings, + mappings, + aliases, + }, }, - }); + { + headers: ES_CLIENT_HEADERS, + } + ); stats.createdIndex(index, { settings }); } catch (err) { diff --git a/packages/kbn-es-archiver/src/lib/indices/delete_index.ts b/packages/kbn-es-archiver/src/lib/indices/delete_index.ts index 1e411a33f62b6..b5641eec4b9da 100644 --- a/packages/kbn-es-archiver/src/lib/indices/delete_index.ts +++ b/packages/kbn-es-archiver/src/lib/indices/delete_index.ts @@ -9,6 +9,7 @@ import { Client } from '@elastic/elasticsearch'; import { ToolingLog } from '@kbn/dev-utils'; import { Stats } from '../stats'; +import { ES_CLIENT_HEADERS } from '../../client_headers'; // see https://github.com/elastic/elasticsearch/blob/99f88f15c5febbca2d13b5b5fda27b844153bf1a/server/src/main/java/org/elasticsearch/cluster/SnapshotsInProgress.java#L313-L319 const PENDING_SNAPSHOT_STATUSES = ['INIT', 'STARTED', 'WAITING']; @@ -30,6 +31,7 @@ export async function deleteIndex(options: { }, { ignore: [404], + headers: ES_CLIENT_HEADERS, } ); @@ -38,7 +40,12 @@ export async function deleteIndex(options: { try { const indicesToDelete = await getIndicesToDelete(); - await client.indices.delete({ index: indicesToDelete }); + await client.indices.delete( + { index: indicesToDelete }, + { + headers: ES_CLIENT_HEADERS, + } + ); for (const index of indices) { stats.deletedIndex(index); } @@ -86,10 +93,15 @@ export async function waitForSnapshotCompletion( body: { snapshots: [status], }, - } = await client.snapshot.status({ - repository, - snapshot, - }); + } = await client.snapshot.status( + { + repository, + snapshot, + }, + { + headers: ES_CLIENT_HEADERS, + } + ); log.debug(`Snapshot ${repository}/${snapshot} is ${status.state}`); return PENDING_SNAPSHOT_STATUSES.includes(status.state); @@ -98,15 +110,21 @@ export async function waitForSnapshotCompletion( const getInProgressSnapshots = async (repository: string) => { const { body: { snapshots: inProgressSnapshots }, - } = await client.snapshot.get({ - repository, - snapshot: '_current', - }); + } = await client.snapshot.get( + { + repository, + snapshot: '_current', + }, + { + headers: ES_CLIENT_HEADERS, + } + ); return inProgressSnapshots; }; - for (const repository of Object.keys(await client.snapshot.getRepository({} as any))) { + const { body: repositoryMap } = await client.snapshot.getRepository({} as any); + for (const repository of Object.keys(repositoryMap)) { const allInProgress = await getInProgressSnapshots(repository); const found = allInProgress.find((s: any) => s.indices.includes(index)); diff --git a/packages/kbn-es-archiver/src/lib/indices/generate_index_records_stream.ts b/packages/kbn-es-archiver/src/lib/indices/generate_index_records_stream.ts index d9c94551e49bf..4e0319c52264f 100644 --- a/packages/kbn-es-archiver/src/lib/indices/generate_index_records_stream.ts +++ b/packages/kbn-es-archiver/src/lib/indices/generate_index_records_stream.ts @@ -9,6 +9,7 @@ import { Transform } from 'stream'; import { Client } from '@elastic/elasticsearch'; import { Stats } from '../stats'; +import { ES_CLIENT_HEADERS } from '../../client_headers'; export function createGenerateIndexRecordsStream(client: Client, stats: Stats) { return new Transform({ @@ -17,22 +18,27 @@ export function createGenerateIndexRecordsStream(client: Client, stats: Stats) { async transform(indexOrAlias, enc, callback) { try { const resp = ( - await client.indices.get({ - index: indexOrAlias, - filter_path: [ - '*.settings', - '*.mappings', - // remove settings that aren't really settings - '-*.settings.index.creation_date', - '-*.settings.index.uuid', - '-*.settings.index.version', - '-*.settings.index.provided_name', - '-*.settings.index.frozen', - '-*.settings.index.search.throttled', - '-*.settings.index.query', - '-*.settings.index.routing', - ], - }) + await client.indices.get( + { + index: indexOrAlias, + filter_path: [ + '*.settings', + '*.mappings', + // remove settings that aren't really settings + '-*.settings.index.creation_date', + '-*.settings.index.uuid', + '-*.settings.index.version', + '-*.settings.index.provided_name', + '-*.settings.index.frozen', + '-*.settings.index.search.throttled', + '-*.settings.index.query', + '-*.settings.index.routing', + ], + }, + { + headers: ES_CLIENT_HEADERS, + } + ) ).body as Record; for (const [index, { settings, mappings }] of Object.entries(resp)) { @@ -40,7 +46,12 @@ export function createGenerateIndexRecordsStream(client: Client, stats: Stats) { body: { [index]: { aliases }, }, - } = await client.indices.getAlias({ index }); + } = await client.indices.getAlias( + { index }, + { + headers: ES_CLIENT_HEADERS, + } + ); stats.archivedIndex(index, { settings, mappings }); this.push({ diff --git a/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts b/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts index ae750023a8e39..7f0080783ee0a 100644 --- a/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts +++ b/packages/kbn-es-archiver/src/lib/indices/kibana_index.ts @@ -12,6 +12,7 @@ import { Client } from '@elastic/elasticsearch'; import { ToolingLog, KbnClient } from '@kbn/dev-utils'; import { Stats } from '../stats'; import { deleteIndex } from './delete_index'; +import { ES_CLIENT_HEADERS } from '../../client_headers'; /** * Deletes all indices that start with `.kibana` @@ -30,10 +31,15 @@ export async function deleteKibanaIndices({ return; } - await client.indices.putSettings({ - index: indexNames, - body: { index: { blocks: { read_only: false } } }, - }); + await client.indices.putSettings( + { + index: indexNames, + body: { index: { blocks: { read_only: false } } }, + }, + { + headers: ES_CLIENT_HEADERS, + } + ); await deleteIndex({ client, @@ -50,13 +56,7 @@ export async function deleteKibanaIndices({ * builds up an object that implements just enough of the kbnMigrations interface * as is required by migrations. */ -export async function migrateKibanaIndex({ - client, - kbnClient, -}: { - client: Client; - kbnClient: KbnClient; -}) { +export async function migrateKibanaIndex(kbnClient: KbnClient) { await kbnClient.savedObjects.migrate(); } @@ -67,7 +67,12 @@ export async function migrateKibanaIndex({ * index (e.g. we don't want to remove .kibana_task_manager or the like). */ async function fetchKibanaIndices(client: Client) { - const resp = await client.cat.indices({ index: '.kibana*', format: 'json' }); + const resp = await client.cat.indices( + { index: '.kibana*', format: 'json' }, + { + headers: ES_CLIENT_HEADERS, + } + ); const isKibanaIndex = (index: string) => /^\.kibana(:?_\d*)?$/.test(index) || /^\.kibana(_task_manager)?_(pre)?\d+\.\d+\.\d+/.test(index); @@ -118,6 +123,7 @@ export async function cleanKibanaIndices({ }, { ignore: [404, 409], + headers: ES_CLIENT_HEADERS, } ); @@ -160,6 +166,7 @@ export async function createDefaultSpace({ index, client }: { index: string; cli }, { ignore: [409], + headers: ES_CLIENT_HEADERS, } ); } From 08fcf443fc1e7ed7be6ef7bd5ad83865e391920b Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 23 Feb 2021 13:44:46 -0600 Subject: [PATCH 11/45] Add labelAppend support for text form fields (#92106) The forms schema accepts this field for arbitrary field types, but text forms were not using it. For security solution, since we were already using labelAppend in multiple instances of text fields, this has the effect of causing an "Optional" label modifier appear where it didn't before. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../es_ui_shared/static/forms/components/fields/text_field.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/es_ui_shared/static/forms/components/fields/text_field.tsx b/src/plugins/es_ui_shared/static/forms/components/fields/text_field.tsx index fdb86aa1ca91f..ba0dee7bf2ce3 100644 --- a/src/plugins/es_ui_shared/static/forms/components/fields/text_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/fields/text_field.tsx @@ -24,6 +24,7 @@ export const TextField = ({ field, euiFieldProps = {}, idAria, ...rest }: Props) return ( Date: Tue, 23 Feb 2021 13:46:41 -0600 Subject: [PATCH 12/45] [build] Add task skips intended for partial builds (#92076) --- src/dev/build/args.test.ts | 21 ++++++ src/dev/build/args.ts | 6 ++ src/dev/build/build_distributables.ts | 69 +++++++++++-------- .../tasks/os_packages/docker_generator/run.ts | 27 ++++---- 4 files changed, 82 insertions(+), 41 deletions(-) diff --git a/src/dev/build/args.test.ts b/src/dev/build/args.test.ts index 2397c18c04d07..e749af73241cf 100644 --- a/src/dev/build/args.test.ts +++ b/src/dev/build/args.test.ts @@ -33,8 +33,11 @@ it('build default and oss dist for current platform, without packages, by defaul "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": false, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": false, "versionQualifier": "", @@ -57,8 +60,11 @@ it('builds packages if --all-platforms is passed', () => { "createDockerCentOS": true, "createDockerContexts": true, "createDockerUBI": true, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": true, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -81,8 +87,11 @@ it('limits packages if --rpm passed with --all-platforms', () => { "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": false, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": true, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -105,8 +114,11 @@ it('limits packages if --deb passed with --all-platforms', () => { "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": false, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -130,8 +142,11 @@ it('limits packages if --docker passed with --all-platforms', () => { "createDockerCentOS": true, "createDockerContexts": true, "createDockerUBI": true, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -162,8 +177,11 @@ it('limits packages if --docker passed with --skip-docker-ubi and --all-platform "createDockerCentOS": true, "createDockerContexts": true, "createDockerUBI": false, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -187,8 +205,11 @@ it('limits packages if --all-platforms passed with --skip-docker-centos', () => "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": true, + "createGenericFolders": true, + "createPlatformFolders": true, "createRpmPackage": true, "downloadFreshNode": true, + "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", diff --git a/src/dev/build/args.ts b/src/dev/build/args.ts index c594eacd08c01..bbfbd3e6f8813 100644 --- a/src/dev/build/args.ts +++ b/src/dev/build/args.ts @@ -18,6 +18,9 @@ export function readCliArgs(argv: string[]) { 'oss', 'no-oss', 'skip-archives', + 'skip-initialize', + 'skip-generic-folders', + 'skip-platform-folders', 'skip-os-packages', 'rpm', 'deb', @@ -93,7 +96,10 @@ export function readCliArgs(argv: string[]) { versionQualifier: flags['version-qualifier'], buildOssDist: flags.oss !== false, buildDefaultDist: !flags.oss, + initialize: !Boolean(flags['skip-initialize']), downloadFreshNode: !Boolean(flags['skip-node-download']), + createGenericFolders: !Boolean(flags['skip-generic-folders']), + createPlatformFolders: !Boolean(flags['skip-platform-folders']), createArchives: !Boolean(flags['skip-archives']), createRpmPackage: isOsPackageDesired('rpm'), createDebPackage: isOsPackageDesired('deb'), diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index 237fc71811a41..f0403fac1e26b 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -16,6 +16,9 @@ export interface BuildOptions { buildOssDist: boolean; buildDefaultDist: boolean; downloadFreshNode: boolean; + initialize: boolean; + createGenericFolders: boolean; + createPlatformFolders: boolean; createArchives: boolean; createRpmPackage: boolean; createDebPackage: boolean; @@ -41,45 +44,53 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions /** * verify, reset, and initialize the build environment */ - await run(Tasks.VerifyEnv); - await run(Tasks.Clean); - await run(options.downloadFreshNode ? Tasks.DownloadNodeBuilds : Tasks.VerifyExistingNodeBuilds); - await run(Tasks.ExtractNodeBuilds); + if (options.initialize) { + await run(Tasks.VerifyEnv); + await run(Tasks.Clean); + await run( + options.downloadFreshNode ? Tasks.DownloadNodeBuilds : Tasks.VerifyExistingNodeBuilds + ); + await run(Tasks.ExtractNodeBuilds); + } /** * run platform-generic build tasks */ - await run(Tasks.CopySource); - await run(Tasks.CopyBinScripts); - await run(Tasks.ReplaceFavicon); - await run(Tasks.CreateEmptyDirsAndFiles); - await run(Tasks.CreateReadme); - await run(Tasks.BuildBazelPackages); - await run(Tasks.BuildPackages); - await run(Tasks.BuildKibanaPlatformPlugins); - await run(Tasks.TranspileBabel); - await run(Tasks.CreatePackageJson); - await run(Tasks.InstallDependencies); - await run(Tasks.CleanPackages); - await run(Tasks.CreateNoticeFile); - await run(Tasks.UpdateLicenseFile); - await run(Tasks.RemovePackageJsonDeps); - await run(Tasks.CleanTypescript); - await run(Tasks.CleanExtraFilesFromModules); - await run(Tasks.CleanEmptyFolders); + if (options.createGenericFolders) { + await run(Tasks.CopySource); + await run(Tasks.CopyBinScripts); + await run(Tasks.ReplaceFavicon); + await run(Tasks.CreateEmptyDirsAndFiles); + await run(Tasks.CreateReadme); + await run(Tasks.BuildBazelPackages); + await run(Tasks.BuildPackages); + await run(Tasks.BuildKibanaPlatformPlugins); + await run(Tasks.TranspileBabel); + await run(Tasks.CreatePackageJson); + await run(Tasks.InstallDependencies); + await run(Tasks.CleanPackages); + await run(Tasks.CreateNoticeFile); + await run(Tasks.UpdateLicenseFile); + await run(Tasks.RemovePackageJsonDeps); + await run(Tasks.CleanTypescript); + await run(Tasks.CleanExtraFilesFromModules); + await run(Tasks.CleanEmptyFolders); + } /** * copy generic build outputs into platform-specific build * directories and perform platform/architecture-specific steps */ - await run(Tasks.CreateArchivesSources); - await run(Tasks.PatchNativeModules); - await run(Tasks.InstallChromium); - await run(Tasks.CleanExtraBinScripts); - await run(Tasks.CleanNodeBuilds); + if (options.createPlatformFolders) { + await run(Tasks.CreateArchivesSources); + await run(Tasks.PatchNativeModules); + await run(Tasks.InstallChromium); + await run(Tasks.CleanExtraBinScripts); + await run(Tasks.CleanNodeBuilds); - await run(Tasks.PathLength); - await run(Tasks.UuidVerification); + await run(Tasks.PathLength); + await run(Tasks.UuidVerification); + } /** * package platform-specific builds into archives diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index 21d2582f205f3..b8029328ac94a 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -83,6 +83,16 @@ export async function runDockerGenerator( revision: config.getBuildSha(), }; + type HostArchitectureToDocker = Record; + const hostTarget: HostArchitectureToDocker = { + x64: 'x64', + arm64: 'aarch64', + }; + const buildArchitectureSupported = hostTarget[process.arch] === flags.architecture && flags.image; + if (!buildArchitectureSupported) { + return; + } + // Verify if we have the needed kibana target in order // to build the kibana docker image. // Also create the docker build target folder @@ -132,18 +142,11 @@ export async function runDockerGenerator( await chmodAsync(`${resolve(dockerBuildDir, 'build_docker.sh')}`, '755'); // Only build images on native targets - type HostArchitectureToDocker = Record; - const hostTarget: HostArchitectureToDocker = { - x64: 'x64', - arm64: 'aarch64', - }; - const buildImage = hostTarget[process.arch] === flags.architecture && flags.image; - if (buildImage) { - await exec(log, `./build_docker.sh`, [], { - cwd: dockerBuildDir, - level: 'info', - }); - } + + await exec(log, `./build_docker.sh`, [], { + cwd: dockerBuildDir, + level: 'info', + }); // Pack Dockerfiles and create a target for them if (flags.context) { From 4f8cd8399b51fd046d6e65eb34f43921042d3d10 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 23 Feb 2021 14:48:49 -0500 Subject: [PATCH 13/45] fix escapeDoubleQuotes regex to ensure quotes escaped correctly (#92471) --- x-pack/plugins/ml/public/application/explorer/explorer_utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js index eb94f00b6bf8d..2f19cbc80f055 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js @@ -631,7 +631,7 @@ export function escapeParens(string) { } export function escapeDoubleQuotes(string) { - return string.replace(/\"/g, '\\$&'); + return string.replace(/[\\"]/g, '\\$&'); } export function getQueryPattern(fieldName, fieldValue) { From 57dfb811d6c8315ce712965e51a3d537c8f53c8e Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 23 Feb 2021 14:04:12 -0600 Subject: [PATCH 14/45] Remove kuery from uiFilters (#91932) * Make kuery a standalone query parameter instead of part of uiFilters * Move getEsFilters helper to RUM * Move query utils from "common" to "server" (it uses esKuery from the data plugin, which is exported from server, not common.) * Move uiFiltersRt to RUM routes References #84526. --- .../app/ErrorGroupDetails/index.tsx | 9 +-- .../app/correlations/error_correlations.tsx | 7 +- .../app/correlations/latency_correlations.tsx | 7 +- .../app/error_group_overview/index.tsx | 9 ++- .../app/service_inventory/index.tsx | 10 ++- .../app/service_node_metrics/index.tsx | 9 ++- .../app/service_node_overview/index.tsx | 9 ++- .../service_overview_errors_table/index.tsx | 10 +-- ...ice_overview_instances_chart_and_table.tsx | 7 +- .../service_overview_throughput_chart.tsx | 9 ++- .../index.tsx | 9 +-- .../app/service_profiling/index.tsx | 9 +-- .../service_profiling_flamegraph.tsx | 9 +-- .../components/app/trace_overview/index.tsx | 9 ++- .../use_transaction_list.ts | 9 ++- .../shared/DatePicker/date_picker.test.tsx | 7 +- .../use_transaction_breakdown.ts | 9 ++- .../transaction_error_rate_chart/index.tsx | 9 ++- .../annotations/annotations_context.tsx | 9 ++- .../mock_url_params_context_provider.tsx | 4 +- .../url_params_context/url_params_context.tsx | 8 +- .../use_error_group_distribution_fetcher.tsx | 9 ++- .../use_service_metric_charts_fetcher.ts | 18 ++--- .../use_transaction_distribution_fetcher.ts | 24 +++--- .../use_transaction_latency_chart_fetcher.ts | 6 +- ...se_transaction_throughput_chart_fetcher.ts | 7 +- .../plugins/apm/public/utils/testHelpers.tsx | 3 - .../chart_preview/get_transaction_duration.ts | 2 +- .../get_transaction_error_count.ts | 2 +- .../get_transaction_error_rate.ts | 2 +- .../alerts/register_error_count_alert_type.ts | 2 +- ...egister_transaction_duration_alert_type.ts | 2 +- ...ister_transaction_error_rate_alert_type.ts | 2 +- .../create_anomaly_detection_jobs.ts | 2 +- .../index.ts | 12 ++- .../index.ts | 12 ++- .../lib/environments/get_environments.ts | 2 +- .../errors/__snapshots__/queries.test.ts.snap | 15 ---- .../__snapshots__/queries.test.ts.snap | 10 --- .../errors/distribution/get_buckets.test.ts | 1 - .../lib/errors/distribution/get_buckets.ts | 12 ++- .../errors/distribution/get_distribution.ts | 3 + .../lib/errors/get_error_group_sample.ts | 12 ++- .../apm/server/lib/errors/get_error_groups.ts | 3 + .../helpers/aggregated_transactions/index.ts | 2 +- .../apm/server/lib/helpers/setup_request.ts | 4 - .../__snapshots__/queries.test.ts.snap | 75 ------------------- .../server/lib/metrics/by_agent/default.ts | 6 +- .../java/gc/fetch_and_transform_gc_metrics.ts | 3 + .../by_agent/java/gc/get_gc_rate_chart.ts | 3 + .../by_agent/java/gc/get_gc_time_chart.ts | 3 + .../by_agent/java/heap_memory/index.ts | 3 + .../server/lib/metrics/by_agent/java/index.ts | 29 ++++--- .../by_agent/java/non_heap_memory/index.ts | 3 + .../by_agent/java/thread_count/index.ts | 3 + .../lib/metrics/by_agent/shared/cpu/index.ts | 3 + .../metrics/by_agent/shared/memory/index.ts | 4 + .../metrics/fetch_and_transform_metrics.ts | 3 + .../get_metrics_chart_data_by_agent.ts | 10 ++- .../get_service_count.ts | 2 +- .../get_transaction_coordinates.ts | 2 +- .../__snapshots__/queries.test.ts.snap | 35 --------- .../apm/server/lib/rum_client/has_rum_data.ts | 2 +- .../ui_filters}/get_es_filter.ts | 21 +----- .../__snapshots__/index.test.ts.snap | 5 -- .../get_local_filter_query.ts | 2 +- .../ui_filters/local_ui_filters/index.test.ts | 2 +- .../fetch_service_paths_from_trace_ids.ts | 2 +- .../lib/service_map/get_service_anomalies.ts | 2 +- .../server/lib/service_map/get_service_map.ts | 4 +- .../get_service_map_service_node_info.test.ts | 1 - .../get_service_map_service_node_info.ts | 2 +- .../lib/service_map/get_trace_sample_ids.ts | 2 +- .../__snapshots__/queries.test.ts.snap | 15 ---- .../apm/server/lib/service_nodes/index.ts | 4 +- .../__snapshots__/queries.test.ts.snap | 5 -- .../get_derived_service_annotations.ts | 2 +- .../annotations/get_stored_annotations.ts | 2 +- .../lib/services/get_service_agent_name.ts | 2 +- .../get_destination_map.ts | 2 +- .../get_service_dependencies/get_metrics.ts | 2 +- ...rvice_error_group_comparison_statistics.ts | 12 ++- ..._service_error_group_primary_statistics.ts | 12 ++- .../get_service_error_groups/index.ts | 14 +++- ...et_service_instance_system_metric_stats.ts | 11 ++- .../get_service_instance_transaction_stats.ts | 11 ++- .../services/get_service_instances/index.ts | 1 + .../services/get_service_metadata_details.ts | 2 +- .../services/get_service_metadata_icons.ts | 2 +- .../lib/services/get_service_node_metadata.ts | 3 + ...transaction_group_comparison_statistics.ts | 12 ++- .../get_service_transaction_groups.ts | 12 ++- .../services/get_service_transaction_types.ts | 2 +- .../get_services/get_legacy_data_status.ts | 2 +- .../get_service_transaction_stats.ts | 12 ++- .../get_services/get_services_items.ts | 4 + .../server/lib/services/get_services/index.ts | 3 + .../apm/server/lib/services/get_throughput.ts | 12 ++- .../get_service_profiling_statistics.ts | 14 +++- .../get_service_profiling_timeline.ts | 9 ++- .../apm/server/lib/traces/get_trace_items.ts | 2 +- .../__snapshots__/queries.test.ts.snap | 35 --------- .../server/lib/transaction_groups/fetcher.ts | 2 + .../lib/transaction_groups/get_error_rate.ts | 12 ++- .../__snapshots__/queries.test.ts.snap | 15 ---- .../lib/transactions/breakdown/index.test.ts | 1 - .../lib/transactions/breakdown/index.ts | 12 ++- .../distribution/get_buckets/index.ts | 9 ++- .../distribution/get_distribution_max.ts | 12 ++- .../lib/transactions/distribution/index.ts | 4 + .../transactions/get_anomaly_data/fetcher.ts | 2 +- .../transactions/get_latency_charts/index.ts | 15 +++- .../get_throughput_charts/index.ts | 15 +++- .../lib/transactions/get_transaction/index.ts | 2 +- .../plugins/apm/server/projections/errors.ts | 12 ++- .../plugins/apm/server/projections/metrics.ts | 12 ++- .../projections/rum_page_load_transactions.ts | 11 +-- .../apm/server/projections/service_nodes.ts | 3 + .../apm/server/projections/services.ts | 8 +- .../apm/server/projections/transactions.ts | 12 ++- .../plugins/apm/server/routes/correlations.ts | 10 ++- .../apm/server/routes/default_api_types.ts | 2 +- x-pack/plugins/apm/server/routes/errors.ts | 31 +++++--- x-pack/plugins/apm/server/routes/metrics.ts | 9 ++- .../plugins/apm/server/routes/rum_client.ts | 11 +-- .../plugins/apm/server/routes/service_map.ts | 2 +- .../apm/server/routes/service_nodes.ts | 6 +- x-pack/plugins/apm/server/routes/services.ts | 69 ++++++++++------- x-pack/plugins/apm/server/routes/traces.ts | 8 +- .../plugins/apm/server/routes/transactions.ts | 44 +++++++---- .../{common => server}/utils/queries.test.ts | 4 +- .../apm/{common => server}/utils/queries.ts | 16 +++- .../plugins/apm/server/utils/test_helpers.tsx | 3 - .../tests/feature_controls.ts | 26 +++---- .../tests/metrics_charts/metrics_charts.ts | 8 +- .../tests/service_overview/instances.ts | 3 - .../error_groups_comparison_statistics.ts | 3 - .../error_groups_primary_statistics.ts | 2 - .../tests/services/throughput.ts | 3 - .../tests/services/top_services.ts | 20 ++--- .../tests/traces/top_traces.ts | 9 +-- .../tests/transactions/breakdown.ts | 9 +-- .../tests/transactions/distribution.ts | 1 - .../tests/transactions/error_rate.ts | 3 +- .../tests/transactions/latency.ts | 41 +++------- .../tests/transactions/throughput.ts | 3 - .../transactions/top_transaction_groups.ts | 5 +- ...ansactions_groups_comparison_statistics.ts | 4 - .../transactions_groups_primary_statistics.ts | 3 - 149 files changed, 644 insertions(+), 672 deletions(-) rename x-pack/plugins/apm/server/lib/{helpers/convert_ui_filters => rum_client/ui_filters}/get_es_filter.ts (58%) rename x-pack/plugins/apm/{common => server}/utils/queries.test.ts (85%) rename x-pack/plugins/apm/{common => server}/utils/queries.ts (73%) diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx index 4cd2db43621a8..4b8d8ddc6f746 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx @@ -67,9 +67,8 @@ type ErrorGroupDetailsProps = RouteComponentProps<{ export function ErrorGroupDetails({ location, match }: ErrorGroupDetailsProps) { const { serviceName, groupId } = match.params; - const { urlParams, uiFilters } = useUrlParams(); - const { environment, start, end } = urlParams; - + const { urlParams } = useUrlParams(); + const { environment, kuery, start, end } = urlParams; const { data: errorGroupData } = useFetcher( (callApmApi) => { if (start && end) { @@ -82,15 +81,15 @@ export function ErrorGroupDetails({ location, match }: ErrorGroupDetailsProps) { }, query: { environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, serviceName, start, end, groupId, uiFilters] + [environment, kuery, serviceName, start, end, groupId] ); const { errorDistributionData } = useErrorGroupDistributionFetcher({ diff --git a/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx index 69f03f56b4c72..6a5582ca24fc7 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx @@ -49,9 +49,10 @@ export function ErrorCorrelations({ onClose }: Props) { ] = useState(null); const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams, uiFilters } = useUrlParams(); + const { urlParams } = useUrlParams(); const { environment, + kuery, transactionName, transactionType, start, @@ -71,12 +72,12 @@ export function ErrorCorrelations({ onClose }: Props) { params: { query: { environment, + kuery, serviceName, transactionName, transactionType, start, end, - uiFilters: JSON.stringify(uiFilters), fieldNames: fieldNames.join(','), }, }, @@ -85,12 +86,12 @@ export function ErrorCorrelations({ onClose }: Props) { }, [ environment, + kuery, serviceName, start, end, transactionName, transactionType, - uiFilters, fieldNames, ] ); diff --git a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx index ce88da64dabc4..22dd89918e25d 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx @@ -47,9 +47,10 @@ export function LatencyCorrelations({ onClose }: Props) { ] = useState(null); const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams, uiFilters } = useUrlParams(); + const { urlParams } = useUrlParams(); const { environment, + kuery, transactionName, transactionType, start, @@ -76,12 +77,12 @@ export function LatencyCorrelations({ onClose }: Props) { params: { query: { environment, + kuery, serviceName, transactionName, transactionType, start, end, - uiFilters: JSON.stringify(uiFilters), durationPercentile: durationPercentile.toString(10), fieldNames: fieldNames.join(','), }, @@ -91,12 +92,12 @@ export function LatencyCorrelations({ onClose }: Props) { }, [ environment, + kuery, serviceName, start, end, transactionName, transactionType, - uiFilters, durationPercentile, fieldNames, ] diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx index bde23eddaa44f..49e1cc44f9255 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx @@ -27,8 +27,9 @@ interface ErrorGroupOverviewProps { } export function ErrorGroupOverview({ serviceName }: ErrorGroupOverviewProps) { - const { urlParams, uiFilters } = useUrlParams(); - const { environment, start, end, sortField, sortDirection } = urlParams; + const { + urlParams: { environment, kuery, start, end, sortField, sortDirection }, + } = useUrlParams(); const { errorDistributionData } = useErrorGroupDistributionFetcher({ serviceName, groupId: undefined, @@ -47,17 +48,17 @@ export function ErrorGroupOverview({ serviceName }: ErrorGroupOverviewProps) { }, query: { environment, + kuery, start, end, sortField, sortDirection: normalizedSortDirection, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, serviceName, start, end, sortField, sortDirection, uiFilters] + [environment, kuery, serviceName, start, end, sortField, sortDirection] ); useTrackPageview({ diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index cd17ca0ce023d..1d67ff03b675d 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -36,10 +36,12 @@ const initialData = { let hasDisplayedToast = false; function useServicesFetcher() { - const { urlParams, uiFilters } = useUrlParams(); + const { + urlParams: { environment, kuery, start, end }, + } = useUrlParams(); const { core } = useApmPluginContext(); const upgradeAssistantHref = useUpgradeAssistantHref(); - const { environment, start, end } = urlParams; + const { data = initialData, status } = useFetcher( (callApmApi) => { if (start && end) { @@ -48,15 +50,15 @@ function useServicesFetcher() { params: { query: { environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, start, end, uiFilters] + [environment, kuery, start, end] ); useEffect(() => { diff --git a/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx b/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx index 21871a17f4b04..186c148fa6918 100644 --- a/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx @@ -57,11 +57,12 @@ type ServiceNodeMetricsProps = RouteComponentProps<{ }>; export function ServiceNodeMetrics({ match }: ServiceNodeMetricsProps) { - const { urlParams, uiFilters } = useUrlParams(); + const { + urlParams: { kuery, start, end }, + } = useUrlParams(); const { serviceName, serviceNodeName } = match.params; const { agentName } = useApmServiceContext(); const { data } = useServiceMetricChartsFetcher({ serviceNodeName }); - const { start, end } = urlParams; const { data: { host, containerId } = INITIAL_DATA, status } = useFetcher( (callApmApi) => { @@ -72,15 +73,15 @@ export function ServiceNodeMetrics({ match }: ServiceNodeMetricsProps) { params: { path: { serviceName, serviceNodeName }, query: { + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [serviceName, serviceNodeName, start, end, uiFilters] + [kuery, serviceName, serviceNodeName, start, end] ); const isLoading = status === FETCH_STATUS.LOADING; diff --git a/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx b/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx index c64bbcb569dde..f4870439fe478 100644 --- a/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx @@ -35,8 +35,9 @@ interface ServiceNodeOverviewProps { } function ServiceNodeOverview({ serviceName }: ServiceNodeOverviewProps) { - const { uiFilters, urlParams } = useUrlParams(); - const { start, end } = urlParams; + const { + urlParams: { kuery, start, end }, + } = useUrlParams(); const { data: items = [] } = useFetcher( (callApmApi) => { @@ -50,14 +51,14 @@ function ServiceNodeOverview({ serviceName }: ServiceNodeOverviewProps) { serviceName, }, query: { + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), }, }, }); }, - [serviceName, start, end, uiFilters] + [kuery, serviceName, start, end] ); const columns: Array> = [ diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx index 109bf0483f2b0..bbd36a4c8df93 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx @@ -43,8 +43,7 @@ const INITIAL_STATE = { export function ServiceOverviewErrorsTable({ serviceName }: Props) { const { - urlParams: { environment, start, end }, - uiFilters, + urlParams: { environment, kuery, start, end }, } = useUrlParams(); const { transactionType } = useApmServiceContext(); const [tableOptions, setTableOptions] = useState<{ @@ -72,9 +71,9 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { path: { serviceName }, query: { environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), transactionType, }, }, @@ -85,7 +84,7 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { }; }); }, - [environment, start, end, serviceName, uiFilters, transactionType] + [environment, kuery, start, end, serviceName, transactionType] ); const { requestId, items } = data; @@ -116,9 +115,10 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { params: { path: { serviceName }, query: { + environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), numBuckets: 20, transactionType, groupIds, diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx index 2f2aaf3156b93..b01529a86e88f 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx @@ -25,8 +25,7 @@ export function ServiceOverviewInstancesChartAndTable({ const { transactionType } = useApmServiceContext(); const { - urlParams: { environment, latencyAggregationType, start, end }, - uiFilters, + urlParams: { environment, kuery, latencyAggregationType, start, end }, } = useUrlParams(); const { data = [], status } = useFetcher( @@ -44,11 +43,11 @@ export function ServiceOverviewInstancesChartAndTable({ }, query: { environment, + kuery, latencyAggregationType, start, end, transactionType, - uiFilters: JSON.stringify(uiFilters), numBuckets: 20, }, }, @@ -56,12 +55,12 @@ export function ServiceOverviewInstancesChartAndTable({ }, [ environment, + kuery, latencyAggregationType, start, end, serviceName, transactionType, - uiFilters, ] ); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx index 2d38ce2c23ca7..ecb57ae5d5715 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx @@ -28,9 +28,10 @@ export function ServiceOverviewThroughputChart({ }) { const theme = useTheme(); const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams, uiFilters } = useUrlParams(); + const { + urlParams: { environment, kuery, start, end }, + } = useUrlParams(); const { transactionType } = useApmServiceContext(); - const { environment, start, end } = urlParams; const { data = INITIAL_STATE, status } = useFetcher( (callApmApi) => { @@ -43,16 +44,16 @@ export function ServiceOverviewThroughputChart({ }, query: { environment, + kuery, start, end, transactionType, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, serviceName, start, end, uiFilters, transactionType] + [environment, kuery, serviceName, start, end, transactionType] ); return ( diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx index 5529f9028b9dd..e4c42b4de90fe 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx @@ -57,8 +57,7 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { const { transactionType } = useApmServiceContext(); const { - uiFilters, - urlParams: { environment, start, end, latencyAggregationType }, + urlParams: { environment, kuery, start, end, latencyAggregationType }, } = useUrlParams(); const { data = INITIAL_STATE, status } = useFetcher( @@ -73,9 +72,9 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { path: { serviceName }, query: { environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), transactionType, latencyAggregationType, }, @@ -89,10 +88,10 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { }, [ environment, + kuery, serviceName, start, end, - uiFilters, transactionType, latencyAggregationType, ] @@ -128,9 +127,9 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { path: { serviceName }, query: { environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), numBuckets: 20, transactionType, latencyAggregationType, diff --git a/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx b/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx index 09a42f9b2df90..23adbb23b2322 100644 --- a/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx @@ -33,8 +33,7 @@ export function ServiceProfiling({ environment, }: ServiceProfilingProps) { const { - urlParams: { start, end }, - uiFilters, + urlParams: { kuery, start, end }, } = useUrlParams(); const { data = [] } = useFetcher( @@ -48,15 +47,15 @@ export function ServiceProfiling({ params: { path: { serviceName }, query: { + kuery, start, end, environment, - uiFilters: JSON.stringify(uiFilters), }, }, }); }, - [start, end, serviceName, environment, uiFilters] + [kuery, start, end, serviceName, environment] ); const [valueType, setValueType] = useState(); @@ -125,7 +124,7 @@ export function ServiceProfiling({ valueType={valueType} start={start} end={end} - uiFilters={uiFilters} + kuery={kuery} /> diff --git a/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx b/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx index 03248d2836674..fa1da99dbf072 100644 --- a/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx +++ b/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx @@ -42,7 +42,6 @@ import { asDynamicBytes, asInteger, } from '../../../../common/utils/formatters'; -import { UIFilters } from '../../../../typings/ui_filters'; import { useFetcher } from '../../../hooks/use_fetcher'; import { useTheme } from '../../../hooks/use_theme'; import { px, unit } from '../../../style/variables'; @@ -124,17 +123,17 @@ function CustomTooltip({ export function ServiceProfilingFlamegraph({ serviceName, environment, + kuery, valueType, start, end, - uiFilters, }: { serviceName: string; environment?: string; + kuery?: string; valueType?: ProfilingValueType; start?: string; end?: string; - uiFilters: UIFilters; }) { const theme = useTheme(); @@ -154,16 +153,16 @@ export function ServiceProfilingFlamegraph({ serviceName, }, query: { + kuery, start, end, environment, valueType, - uiFilters: JSON.stringify(uiFilters), }, }, }); }, - [start, end, environment, serviceName, valueType, uiFilters] + [kuery, start, end, environment, serviceName, valueType] ); const points = useMemo(() => { diff --git a/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx b/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx index 8fc9ac12824ba..6d7edcd0a1e35 100644 --- a/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx @@ -22,8 +22,9 @@ const DEFAULT_RESPONSE: TracesAPIResponse = { }; export function TraceOverview() { - const { urlParams, uiFilters } = useUrlParams(); - const { environment, start, end } = urlParams; + const { + urlParams: { environment, kuery, start, end }, + } = useUrlParams(); const { status, data = DEFAULT_RESPONSE } = useFetcher( (callApmApi) => { if (start && end) { @@ -32,15 +33,15 @@ export function TraceOverview() { params: { query: { environment, + kuery, start, end, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, start, end, uiFilters] + [environment, kuery, start, end] ); useTrackPageview({ app: 'apm', path: 'traces_overview' }); diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/use_transaction_list.ts b/x-pack/plugins/apm/public/components/app/transaction_overview/use_transaction_list.ts index a63788457b8b5..062fd5470e60c 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/use_transaction_list.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/use_transaction_list.ts @@ -19,9 +19,10 @@ const DEFAULT_RESPONSE: Partial = { }; export function useTransactionListFetcher() { - const { urlParams, uiFilters } = useUrlParams(); + const { + urlParams: { environment, kuery, transactionType, start, end }, + } = useUrlParams(); const { serviceName } = useParams<{ serviceName?: string }>(); - const { environment, transactionType, start, end } = urlParams; const { data = DEFAULT_RESPONSE, error, status } = useFetcher( (callApmApi) => { if (serviceName && start && end && transactionType) { @@ -31,16 +32,16 @@ export function useTransactionListFetcher() { path: { serviceName }, query: { environment, + kuery, start, end, transactionType, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, serviceName, start, end, transactionType, uiFilters] + [environment, kuery, serviceName, start, end, transactionType] ); return { diff --git a/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx b/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx index f21e87da23979..28a45e492169b 100644 --- a/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx @@ -12,10 +12,7 @@ import { createMemoryHistory } from 'history'; import React, { ReactNode } from 'react'; import { Router } from 'react-router-dom'; import { MockApmPluginContextWrapper } from '../../../context/apm_plugin/mock_apm_plugin_context'; -import { - UrlParamsContext, - useUiFilters, -} from '../../../context/url_params_context/url_params_context'; +import { UrlParamsContext } from '../../../context/url_params_context/url_params_context'; import { IUrlParams } from '../../../context/url_params_context/types'; import { DatePicker } from './'; @@ -35,7 +32,7 @@ function MockUrlParamsProvider({ rangeId: 0, refreshTimeRange: mockRefreshTimeRange, urlParams, - uiFilters: useUiFilters(urlParams), + uiFilters: {}, }} children={children} /> diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts b/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts index 293a1929ca606..a80c859459557 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts @@ -12,8 +12,9 @@ import { useApmServiceContext } from '../../../../context/apm_service/use_apm_se export function useTransactionBreakdown() { const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams, uiFilters } = useUrlParams(); - const { environment, start, end, transactionName } = urlParams; + const { + urlParams: { environment, kuery, start, end, transactionName }, + } = useUrlParams(); const { transactionType } = useApmServiceContext(); const { data = { timeseries: undefined }, error, status } = useFetcher( @@ -26,11 +27,11 @@ export function useTransactionBreakdown() { path: { serviceName }, query: { environment, + kuery, start, end, transactionName, transactionType, - uiFilters: JSON.stringify(uiFilters), }, }, }); @@ -38,12 +39,12 @@ export function useTransactionBreakdown() { }, [ environment, + kuery, serviceName, start, end, transactionType, transactionName, - uiFilters, ] ); diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx index a3da8812966f1..b3c38651ea178 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx @@ -31,9 +31,10 @@ export function TransactionErrorRateChart({ }: Props) { const theme = useTheme(); const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams, uiFilters } = useUrlParams(); + const { + urlParams: { environment, kuery, start, end, transactionName }, + } = useUrlParams(); const { transactionType } = useApmServiceContext(); - const { environment, start, end, transactionName } = urlParams; const { data, status } = useFetcher( (callApmApi) => { @@ -47,11 +48,11 @@ export function TransactionErrorRateChart({ }, query: { environment, + kuery, start, end, transactionType, transactionName, - uiFilters: JSON.stringify(uiFilters), }, }, }); @@ -59,10 +60,10 @@ export function TransactionErrorRateChart({ }, [ environment, + kuery, serviceName, start, end, - uiFilters, transactionType, transactionName, ] diff --git a/x-pack/plugins/apm/public/context/annotations/annotations_context.tsx b/x-pack/plugins/apm/public/context/annotations/annotations_context.tsx index 54a1d3a59eb20..ea2feb3d2a4ad 100644 --- a/x-pack/plugins/apm/public/context/annotations/annotations_context.tsx +++ b/x-pack/plugins/apm/public/context/annotations/annotations_context.tsx @@ -23,8 +23,9 @@ export function AnnotationsContextProvider({ children: React.ReactNode; }) { const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams } = useUrlParams(); - const { environment, start, end } = urlParams; + const { + urlParams: { environment, start, end }, + } = useUrlParams(); const { data = INITIAL_STATE } = useFetcher( (callApmApi) => { @@ -36,15 +37,15 @@ export function AnnotationsContextProvider({ serviceName, }, query: { + environment, start, end, - environment, }, }, }); } }, - [start, end, environment, serviceName] + [environment, start, end, serviceName] ); return ; diff --git a/x-pack/plugins/apm/public/context/url_params_context/mock_url_params_context_provider.tsx b/x-pack/plugins/apm/public/context/url_params_context/mock_url_params_context_provider.tsx index 7a561072d4bb2..6f34e9dec59e5 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/mock_url_params_context_provider.tsx +++ b/x-pack/plugins/apm/public/context/url_params_context/mock_url_params_context_provider.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { IUrlParams } from './types'; -import { UrlParamsContext, useUiFilters } from './url_params_context'; +import { UrlParamsContext } from './url_params_context'; const defaultUrlParams = { page: 0, @@ -35,7 +35,7 @@ export function MockUrlParamsContextProvider({ rangeId: 0, refreshTimeRange, urlParams, - uiFilters: useUiFilters(urlParams), + uiFilters: {}, }} children={children} /> diff --git a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx index 90245b9843b01..bb29d1c40b5e2 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx +++ b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx @@ -30,16 +30,12 @@ export interface TimeRange { } function useUiFilters(params: IUrlParams): UIFilters { - const { kuery, environment, ...urlParams } = params; const localUiFilters = mapValues( - pickKeys(urlParams, ...localUIFilterNames), + pickKeys(params, ...localUIFilterNames), (val) => (val ? val.split(',') : []) ) as Partial>; - return useDeepObjectIdentity({ - kuery, - ...localUiFilters, - }); + return useDeepObjectIdentity(localUiFilters); } const defaultRefresh = (_time: TimeRange) => {}; diff --git a/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx index 9ff179e6af6a0..3ef685abe0847 100644 --- a/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx @@ -15,8 +15,9 @@ export function useErrorGroupDistributionFetcher({ serviceName: string; groupId: string | undefined; }) { - const { urlParams, uiFilters } = useUrlParams(); - const { environment, start, end } = urlParams; + const { + urlParams: { environment, kuery, start, end }, + } = useUrlParams(); const { data } = useFetcher( (callApmApi) => { if (start && end) { @@ -26,16 +27,16 @@ export function useErrorGroupDistributionFetcher({ path: { serviceName }, query: { environment, + kuery, start, end, groupId, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [environment, serviceName, start, end, groupId, uiFilters] + [environment, kuery, serviceName, start, end, groupId] ); return { errorDistributionData: data }; diff --git a/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts index 87e10f1e8937b..baf3eb51ae033 100644 --- a/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts @@ -21,10 +21,12 @@ export function useServiceMetricChartsFetcher({ }: { serviceNodeName: string | undefined; }) { - const { urlParams, uiFilters } = useUrlParams(); + const { + urlParams: { environment, kuery, start, end }, + } = useUrlParams(); const { agentName } = useApmServiceContext(); const { serviceName } = useParams<{ serviceName?: string }>(); - const { environment, start, end } = urlParams; + const { data = INITIAL_DATA, error, status } = useFetcher( (callApmApi) => { if (serviceName && start && end && agentName) { @@ -34,25 +36,17 @@ export function useServiceMetricChartsFetcher({ path: { serviceName }, query: { environment, + kuery, serviceNodeName, start, end, agentName, - uiFilters: JSON.stringify(uiFilters), }, }, }); } }, - [ - environment, - serviceName, - start, - end, - agentName, - serviceNodeName, - uiFilters, - ] + [environment, kuery, serviceName, start, end, agentName, serviceNodeName] ); return { diff --git a/x-pack/plugins/apm/public/hooks/use_transaction_distribution_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_transaction_distribution_fetcher.ts index c493a30716aa5..25632d4b19cf4 100644 --- a/x-pack/plugins/apm/public/hooks/use_transaction_distribution_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_transaction_distribution_fetcher.ts @@ -23,16 +23,18 @@ const INITIAL_DATA = { export function useTransactionDistributionFetcher() { const { serviceName } = useParams<{ serviceName?: string }>(); - const { urlParams, uiFilters } = useUrlParams(); const { - environment, - start, - end, - transactionType, - transactionId, - traceId, - transactionName, - } = urlParams; + urlParams: { + environment, + kuery, + start, + end, + transactionType, + transactionId, + traceId, + transactionName, + }, + } = useUrlParams(); const history = useHistory(); const { data = INITIAL_DATA, status, error } = useFetcher( @@ -47,13 +49,13 @@ export function useTransactionDistributionFetcher() { }, query: { environment, + kuery, start, end, transactionType, transactionName, transactionId, traceId, - uiFilters: JSON.stringify(uiFilters), }, }, }); @@ -96,12 +98,12 @@ export function useTransactionDistributionFetcher() { // eslint-disable-next-line react-hooks/exhaustive-deps [ environment, + kuery, serviceName, start, end, transactionType, transactionName, - uiFilters, ] ); diff --git a/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts index cca2e99d84dfd..b92b812bdd430 100644 --- a/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts @@ -20,12 +20,12 @@ export function useTransactionLatencyChartsFetcher() { const { urlParams: { environment, + kuery, start, end, transactionName, latencyAggregationType, }, - uiFilters, } = useUrlParams(); const { data, error, status } = useFetcher( @@ -44,11 +44,11 @@ export function useTransactionLatencyChartsFetcher() { path: { serviceName }, query: { environment, + kuery, start, end, transactionType, transactionName, - uiFilters: JSON.stringify(uiFilters), latencyAggregationType, }, }, @@ -57,12 +57,12 @@ export function useTransactionLatencyChartsFetcher() { }, [ environment, + kuery, serviceName, start, end, transactionName, transactionType, - uiFilters, latencyAggregationType, ] ); diff --git a/x-pack/plugins/apm/public/hooks/use_transaction_throughput_chart_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_transaction_throughput_chart_fetcher.ts index 55765cd40c04e..c8ae4fa5823a4 100644 --- a/x-pack/plugins/apm/public/hooks/use_transaction_throughput_chart_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_transaction_throughput_chart_fetcher.ts @@ -18,8 +18,7 @@ export function useTransactionThroughputChartsFetcher() { const { transactionType } = useApmServiceContext(); const theme = useTheme(); const { - urlParams: { environment, start, end, transactionName }, - uiFilters, + urlParams: { environment, kuery, start, end, transactionName }, } = useUrlParams(); const { data, error, status } = useFetcher( @@ -32,11 +31,11 @@ export function useTransactionThroughputChartsFetcher() { path: { serviceName }, query: { environment, + kuery, start, end, transactionType, transactionName, - uiFilters: JSON.stringify(uiFilters), }, }, }); @@ -44,12 +43,12 @@ export function useTransactionThroughputChartsFetcher() { }, [ environment, + kuery, serviceName, start, end, transactionName, transactionType, - uiFilters, ] ); diff --git a/x-pack/plugins/apm/public/utils/testHelpers.tsx b/x-pack/plugins/apm/public/utils/testHelpers.tsx index f7f6f7486091b..80df113e18190 100644 --- a/x-pack/plugins/apm/public/utils/testHelpers.tsx +++ b/x-pack/plugins/apm/public/utils/testHelpers.tsx @@ -17,7 +17,6 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import { EuiThemeProvider } from '../../../../../src/plugins/kibana_react/common'; import { - ESFilter, ESSearchRequest, ESSearchResponse, } from '../../../../typings/elasticsearch'; @@ -121,7 +120,6 @@ interface MockSetup { internalClient: any; config: APMConfig; uiFilters: UIFilters; - esFilter: ESFilter[]; indices: { /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': string; @@ -183,7 +181,6 @@ export async function inspectSearchParams( } ) as APMConfig, uiFilters: {}, - esFilter: [], indices: { /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'myIndex', diff --git a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts index 3457207eeee3c..86456114698cb 100644 --- a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts +++ b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts @@ -13,7 +13,7 @@ import { TRANSACTION_TYPE, } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { AlertParams } from '../../../routes/alerts/chart_preview'; import { withApmSpan } from '../../../utils/with_apm_span'; import { getBucketSize } from '../../helpers/get_bucket_size'; diff --git a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_count.ts b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_count.ts index aa85c44284d9d..2cf1317dc44b0 100644 --- a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_count.ts +++ b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_count.ts @@ -8,7 +8,7 @@ import { SERVICE_NAME } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; import { AlertParams } from '../../../routes/alerts/chart_preview'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; import { getBucketSize } from '../../helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_rate.ts b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_rate.ts index 88e249a71a81f..f0c8d23e0e8fa 100644 --- a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_rate.ts +++ b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_error_rate.ts @@ -12,7 +12,7 @@ import { } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; import { AlertParams } from '../../../routes/alerts/chart_preview'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { getBucketSize } from '../../helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { diff --git a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts index c7861eaa819ae..cf31ff69bad27 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts @@ -27,7 +27,7 @@ import { SERVICE_NAME, } from '../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../common/processor_event'; -import { environmentQuery } from '../../../common/utils/queries'; +import { environmentQuery } from '../../../server/utils/queries'; import { getApmIndices } from '../settings/apm_indices/get_apm_indices'; import { apmActionVariables } from './action_variables'; import { alertingEsClient } from './alerting_es_client'; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts index 704aee932a604..6de9ca6db8c12 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts @@ -20,7 +20,7 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../common/processor_event'; import { getDurationFormatter } from '../../../common/utils/formatters'; -import { environmentQuery } from '../../../common/utils/queries'; +import { environmentQuery } from '../../../server/utils/queries'; import { getApmIndices } from '../settings/apm_indices/get_apm_indices'; import { apmActionVariables } from './action_variables'; import { alertingEsClient } from './alerting_es_client'; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts index 6f58b7714d832..b9923cc339ac2 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts @@ -22,7 +22,7 @@ import { import { EventOutcome } from '../../../common/event_outcome'; import { ProcessorEvent } from '../../../common/processor_event'; import { asDecimalOrInteger } from '../../../common/utils/formatters'; -import { environmentQuery } from '../../../common/utils/queries'; +import { environmentQuery } from '../../../server/utils/queries'; import { getApmIndices } from '../settings/apm_indices/get_apm_indices'; import { apmActionVariables } from './action_variables'; import { alertingEsClient } from './alerting_es_client'; diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts index d70e19bf4a5f5..dd36e7cbeb24e 100644 --- a/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts @@ -11,7 +11,7 @@ import { snakeCase } from 'lodash'; import Boom from '@hapi/boom'; import { ML_ERRORS } from '../../../common/anomaly_detection'; import { ProcessorEvent } from '../../../common/processor_event'; -import { environmentQuery } from '../../../common/utils/queries'; +import { environmentQuery } from '../../../server/utils/queries'; import { Setup } from '../helpers/setup_request'; import { TRANSACTION_DURATION, diff --git a/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_failed_transactions/index.ts b/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_failed_transactions/index.ts index ecefdfc2b3d9b..e2411d1d17adc 100644 --- a/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_failed_transactions/index.ts +++ b/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_failed_transactions/index.ts @@ -13,7 +13,11 @@ import { } from '../process_significant_term_aggs'; import { AggregationOptionsByType } from '../../../../../../typings/elasticsearch/aggregations'; import { ESFilter } from '../../../../../../typings/elasticsearch'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { EVENT_OUTCOME, SERVICE_NAME, @@ -32,6 +36,7 @@ import { withApmSpan } from '../../../utils/with_apm_span'; export async function getCorrelationsForFailedTransactions({ environment, + kuery, serviceName, transactionType, transactionName, @@ -39,6 +44,7 @@ export async function getCorrelationsForFailedTransactions({ setup, }: { environment?: string; + kuery?: string; serviceName: string | undefined; transactionType: string | undefined; transactionName: string | undefined; @@ -46,13 +52,13 @@ export async function getCorrelationsForFailedTransactions({ setup: Setup & SetupTimeRange; }) { return withApmSpan('get_correlations_for_failed_transactions', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const backgroundFilters: ESFilter[] = [ { term: { [PROCESSOR_EVENT]: ProcessorEvent.transaction } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; if (serviceName) { diff --git a/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_slow_transactions/index.ts b/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_slow_transactions/index.ts index 832b89a18d102..824b290a6ba60 100644 --- a/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_slow_transactions/index.ts +++ b/x-pack/plugins/apm/server/lib/correlations/get_correlations_for_slow_transactions/index.ts @@ -7,7 +7,11 @@ import { AggregationOptionsByType } from '../../../../../../typings/elasticsearch/aggregations'; import { ESFilter } from '../../../../../../typings/elasticsearch'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { SERVICE_NAME, TRANSACTION_DURATION, @@ -24,6 +28,7 @@ import { withApmSpan } from '../../../utils/with_apm_span'; export async function getCorrelationsForSlowTransactions({ environment, + kuery, serviceName, transactionType, transactionName, @@ -32,6 +37,7 @@ export async function getCorrelationsForSlowTransactions({ setup, }: { environment?: string; + kuery?: string; serviceName: string | undefined; transactionType: string | undefined; transactionName: string | undefined; @@ -40,13 +46,13 @@ export async function getCorrelationsForSlowTransactions({ setup: Setup & SetupTimeRange; }) { return withApmSpan('get_correlations_for_slow_transactions', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const backgroundFilters: ESFilter[] = [ { term: { [PROCESSOR_EVENT]: ProcessorEvent.transaction } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; if (serviceName) { diff --git a/x-pack/plugins/apm/server/lib/environments/get_environments.ts b/x-pack/plugins/apm/server/lib/environments/get_environments.ts index af88493c148ce..509e4cdcd67ac 100644 --- a/x-pack/plugins/apm/server/lib/environments/get_environments.ts +++ b/x-pack/plugins/apm/server/lib/environments/get_environments.ts @@ -11,7 +11,7 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { ENVIRONMENT_NOT_DEFINED } from '../../../common/environment_filter_values'; import { ProcessorEvent } from '../../../common/processor_event'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { getProcessorEventForAggregatedTransactions } from '../helpers/aggregated_transactions'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/errors/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/errors/__snapshots__/queries.test.ts.snap index 632232ffb075d..c0d928ebd70f6 100644 --- a/x-pack/plugins/apm/server/lib/errors/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/errors/__snapshots__/queries.test.ts.snap @@ -30,11 +30,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], "should": Array [ Object { @@ -117,11 +112,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -192,11 +182,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/errors/distribution/__snapshots__/queries.test.ts.snap index b329499c8b045..121cbe226d387 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/errors/distribution/__snapshots__/queries.test.ts.snap @@ -38,11 +38,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -89,11 +84,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "error.grouping_key": "foo", diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.test.ts b/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.test.ts index 1712699162b73..b1260d653f3de 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.test.ts +++ b/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.test.ts @@ -44,7 +44,6 @@ describe('get buckets', () => { } ) as APMConfig, uiFilters: {}, - esFilter: [], indices: { /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'apm-*', diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts b/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts index fbe406d8d1a9d..1e161b0383f0b 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts +++ b/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts @@ -11,30 +11,36 @@ import { SERVICE_NAME, } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; export async function getBuckets({ environment, + kuery, serviceName, groupId, bucketSize, setup, }: { environment?: string; + kuery?: string; serviceName: string; groupId?: string; bucketSize: number; setup: Setup & SetupTimeRange; }) { return withApmSpan('get_error_distribution_buckets', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const filter: ESFilter[] = [ { term: { [SERVICE_NAME]: serviceName } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; if (groupId) { diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts b/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts index 1fb0cbad4a5f0..6bb43a395f235 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts +++ b/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts @@ -15,11 +15,13 @@ function getBucketSize({ start, end }: SetupTimeRange) { export async function getErrorDistribution({ environment, + kuery, serviceName, groupId, setup, }: { environment?: string; + kuery?: string; serviceName: string; groupId?: string; setup: Setup & SetupTimeRange; @@ -27,6 +29,7 @@ export async function getErrorDistribution({ const bucketSize = getBucketSize({ start: setup.start, end: setup.end }); const { buckets, noHits } = await getBuckets({ environment, + kuery, serviceName, groupId, bucketSize, diff --git a/x-pack/plugins/apm/server/lib/errors/get_error_group_sample.ts b/x-pack/plugins/apm/server/lib/errors/get_error_group_sample.ts index 0ab26f3c6e969..d4ad2c8a9b2cb 100644 --- a/x-pack/plugins/apm/server/lib/errors/get_error_group_sample.ts +++ b/x-pack/plugins/apm/server/lib/errors/get_error_group_sample.ts @@ -11,24 +11,30 @@ import { TRANSACTION_SAMPLED, } from '../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { getTransaction } from '../transactions/get_transaction'; export function getErrorGroupSample({ environment, + kuery, serviceName, groupId, setup, }: { environment?: string; + kuery?: string; serviceName: string; groupId: string; setup: Setup & SetupTimeRange; }) { return withApmSpan('get_error_group_sample', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const params = { apm: { @@ -43,7 +49,7 @@ export function getErrorGroupSample({ { term: { [ERROR_GROUP_ID]: groupId } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], should: [{ term: { [TRANSACTION_SAMPLED]: true } }], }, diff --git a/x-pack/plugins/apm/server/lib/errors/get_error_groups.ts b/x-pack/plugins/apm/server/lib/errors/get_error_groups.ts index 28d89eb057470..5371d69caaa99 100644 --- a/x-pack/plugins/apm/server/lib/errors/get_error_groups.ts +++ b/x-pack/plugins/apm/server/lib/errors/get_error_groups.ts @@ -22,12 +22,14 @@ import { Setup, SetupTimeRange } from '../helpers/setup_request'; export function getErrorGroups({ environment, + kuery, serviceName, sortField, sortDirection = 'desc', setup, }: { environment?: string; + kuery?: string; serviceName: string; sortField?: string; sortDirection?: 'asc' | 'desc'; @@ -41,6 +43,7 @@ export function getErrorGroups({ const projection = getErrorGroupsProjection({ environment, + kuery, setup, serviceName, }); diff --git a/x-pack/plugins/apm/server/lib/helpers/aggregated_transactions/index.ts b/x-pack/plugins/apm/server/lib/helpers/aggregated_transactions/index.ts index 71744c3e59092..394cf6b988f12 100644 --- a/x-pack/plugins/apm/server/lib/helpers/aggregated_transactions/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/aggregated_transactions/index.ts @@ -6,7 +6,7 @@ */ import { SearchAggregatedTransactionSetting } from '../../../../common/aggregated_transactions'; -import { rangeQuery } from '../../../../common/utils/queries'; +import { rangeQuery } from '../../../../server/utils/queries'; import { ProcessorEvent } from '../../../../common/processor_event'; import { TRANSACTION_DURATION, diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts index b12a396befe8c..60fb9a8bfa85a 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts @@ -10,14 +10,12 @@ import { isActivePlatinumLicense } from '../../../common/license_check'; import { APMConfig } from '../..'; import { KibanaRequest } from '../../../../../../src/core/server'; import { UI_SETTINGS } from '../../../../../../src/plugins/data/common'; -import { ESFilter } from '../../../../../typings/elasticsearch'; import { UIFilters } from '../../../typings/ui_filters'; import { APMRequestHandlerContext } from '../../routes/typings'; import { ApmIndicesConfig, getApmIndices, } from '../settings/apm_indices/get_apm_indices'; -import { getEsFilter } from './convert_ui_filters/get_es_filter'; import { APMEventClient, createApmEventClient, @@ -38,7 +36,6 @@ export interface Setup { config: APMConfig; indices: ApmIndicesConfig; uiFilters: UIFilters; - esFilter: ESFilter[]; } export interface SetupTimeRange { @@ -110,7 +107,6 @@ export async function setupRequest( : undefined, config, uiFilters, - esFilter: getEsFilter(uiFilters), }; return { diff --git a/x-pack/plugins/apm/server/lib/metrics/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/metrics/__snapshots__/queries.test.ts.snap index 4eed09f3e5c28..ad91356ac6448 100644 --- a/x-pack/plugins/apm/server/lib/metrics/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/metrics/__snapshots__/queries.test.ts.snap @@ -85,11 +85,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -173,11 +168,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -336,11 +326,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "exists": Object { "field": "system.process.cgroup.memory.mem.usage.bytes", @@ -429,11 +414,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -512,11 +492,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -621,11 +596,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -715,11 +685,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -884,11 +849,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "exists": Object { "field": "system.process.cgroup.memory.mem.usage.bytes", @@ -983,11 +943,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -1072,11 +1027,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -1170,11 +1120,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -1253,11 +1198,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -1411,11 +1351,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "exists": Object { "field": "system.process.cgroup.memory.mem.usage.bytes", @@ -1499,11 +1434,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", @@ -1577,11 +1507,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "term": Object { "agent.name": "java", diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/default.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/default.ts index c5e80600b69d4..e4d6d2e77f73c 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/default.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/default.ts @@ -11,16 +11,18 @@ import { getMemoryChartData } from './shared/memory'; export async function getDefaultMetricsCharts({ environment, + kuery, serviceName, setup, }: { environment?: string; + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; }) { const charts = await Promise.all([ - getCPUChartData({ environment, setup, serviceName }), - getMemoryChartData({ environment, setup, serviceName }), + getCPUChartData({ environment, kuery, setup, serviceName }), + getMemoryChartData({ environment, kuery, setup, serviceName }), ]); return { charts }; diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/fetch_and_transform_gc_metrics.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/fetch_and_transform_gc_metrics.ts index d7c9294c8ec7a..9f83af989fc57 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/fetch_and_transform_gc_metrics.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/fetch_and_transform_gc_metrics.ts @@ -23,6 +23,7 @@ import { getVizColorForIndex } from '../../../../../../common/viz_colors'; export async function fetchAndTransformGcMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, @@ -30,6 +31,7 @@ export async function fetchAndTransformGcMetrics({ fieldName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -42,6 +44,7 @@ export async function fetchAndTransformGcMetrics({ const projection = getMetricsProjection({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_rate_chart.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_rate_chart.ts index 8c5b9fb3db922..388331f3bbf17 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_rate_chart.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_rate_chart.ts @@ -34,11 +34,13 @@ const chartBase: ChartBase = { function getGcRateChart({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -46,6 +48,7 @@ function getGcRateChart({ return withApmSpan('get_gc_rate_charts', () => fetchAndTransformGcMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_time_chart.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_time_chart.ts index 98f31f06c1b64..e6f80190d1daa 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_time_chart.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/gc/get_gc_time_chart.ts @@ -34,11 +34,13 @@ const chartBase: ChartBase = { function getGcTimeChart({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -46,6 +48,7 @@ function getGcTimeChart({ return withApmSpan('get_gc_time_charts', () => fetchAndTransformGcMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/heap_memory/index.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/heap_memory/index.ts index d6cbc4a07e8f9..7630827a3cb38 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/heap_memory/index.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/heap_memory/index.ts @@ -54,11 +54,13 @@ const chartBase: ChartBase = { export function getHeapMemoryChart({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -66,6 +68,7 @@ export function getHeapMemoryChart({ return withApmSpan('get_heap_memory_charts', () => fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/index.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/index.ts index 970b4d3499b79..5a266b57bd598 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/index.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/index.ts @@ -17,29 +17,34 @@ import { getGcTimeChart } from './gc/get_gc_time_chart'; export function getJavaMetricsCharts({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; }) { return withApmSpan('get_java_system_metric_charts', async () => { + const options = { + environment, + kuery, + setup, + serviceName, + serviceNodeName, + }; + const charts = await Promise.all([ - getCPUChartData({ environment, setup, serviceName, serviceNodeName }), - getMemoryChartData({ environment, setup, serviceName, serviceNodeName }), - getHeapMemoryChart({ environment, setup, serviceName, serviceNodeName }), - getNonHeapMemoryChart({ - environment, - setup, - serviceName, - serviceNodeName, - }), - getThreadCountChart({ environment, setup, serviceName, serviceNodeName }), - getGcRateChart({ environment, setup, serviceName, serviceNodeName }), - getGcTimeChart({ environment, setup, serviceName, serviceNodeName }), + getCPUChartData(options), + getMemoryChartData(options), + getHeapMemoryChart(options), + getNonHeapMemoryChart(options), + getThreadCountChart(options), + getGcRateChart(options), + getGcTimeChart(options), ]); return { charts }; diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/non_heap_memory/index.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/non_heap_memory/index.ts index 25abd2c34c83a..cd11e5e5383b6 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/non_heap_memory/index.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/non_heap_memory/index.ts @@ -51,11 +51,13 @@ const chartBase: ChartBase = { export async function getNonHeapMemoryChart({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -63,6 +65,7 @@ export async function getNonHeapMemoryChart({ return withApmSpan('get_non_heap_memory_charts', () => fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/thread_count/index.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/thread_count/index.ts index c8a209fee701a..8d4c079197d19 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/java/thread_count/index.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/java/thread_count/index.ts @@ -43,11 +43,13 @@ const chartBase: ChartBase = { export async function getThreadCountChart({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -55,6 +57,7 @@ export async function getThreadCountChart({ return withApmSpan('get_thread_count_charts', () => fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/cpu/index.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/cpu/index.ts index ebfe504e5269b..37bef191ae876 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/cpu/index.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/cpu/index.ts @@ -55,11 +55,13 @@ const chartBase: ChartBase = { export function getCPUChartData({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -67,6 +69,7 @@ export function getCPUChartData({ return withApmSpan('get_cpu_metric_charts', () => fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/memory/index.ts b/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/memory/index.ts index 55b3328bcd2a9..c58fb170bd2b0 100644 --- a/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/memory/index.ts +++ b/x-pack/plugins/apm/server/lib/metrics/by_agent/shared/memory/index.ts @@ -72,11 +72,13 @@ export const percentCgroupMemoryUsedScript = { export async function getMemoryChartData({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -87,6 +89,7 @@ export async function getMemoryChartData({ () => fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, @@ -105,6 +108,7 @@ export async function getMemoryChartData({ return await withApmSpan('get_system_memory_metrics_charts', () => fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts b/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts index 17e9aef29ba82..ef24b531d8046 100644 --- a/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts +++ b/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts @@ -49,6 +49,7 @@ interface Filter { export async function fetchAndTransformMetrics({ environment, + kuery, setup, serviceName, serviceNodeName, @@ -57,6 +58,7 @@ export async function fetchAndTransformMetrics({ additionalFilters = [], }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -68,6 +70,7 @@ export async function fetchAndTransformMetrics({ const projection = getMetricsProjection({ environment, + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/metrics/get_metrics_chart_data_by_agent.ts b/x-pack/plugins/apm/server/lib/metrics/get_metrics_chart_data_by_agent.ts index eda71ef380ee9..8e7008ef913fa 100644 --- a/x-pack/plugins/apm/server/lib/metrics/get_metrics_chart_data_by_agent.ts +++ b/x-pack/plugins/apm/server/lib/metrics/get_metrics_chart_data_by_agent.ts @@ -16,12 +16,14 @@ export interface MetricsChartsByAgentAPIResponse { export async function getMetricsChartDataByAgent({ environment, + kuery, setup, serviceName, serviceNodeName, agentName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; @@ -31,6 +33,7 @@ export async function getMetricsChartDataByAgent({ case 'java': { return getJavaMetricsCharts({ environment, + kuery, setup, serviceName, serviceNodeName, @@ -38,7 +41,12 @@ export async function getMetricsChartDataByAgent({ } default: { - return getDefaultMetricsCharts({ environment, setup, serviceName }); + return getDefaultMetricsCharts({ + environment, + kuery, + setup, + serviceName, + }); } } } diff --git a/x-pack/plugins/apm/server/lib/observability_overview/get_service_count.ts b/x-pack/plugins/apm/server/lib/observability_overview/get_service_count.ts index c7ac678899b58..2ccbe318862f1 100644 --- a/x-pack/plugins/apm/server/lib/observability_overview/get_service_count.ts +++ b/x-pack/plugins/apm/server/lib/observability_overview/get_service_count.ts @@ -6,7 +6,7 @@ */ import { ProcessorEvent } from '../../../common/processor_event'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { SERVICE_NAME } from '../../../common/elasticsearch_fieldnames'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { getProcessorEventForAggregatedTransactions } from '../helpers/aggregated_transactions'; diff --git a/x-pack/plugins/apm/server/lib/observability_overview/get_transaction_coordinates.ts b/x-pack/plugins/apm/server/lib/observability_overview/get_transaction_coordinates.ts index 2da4b0f8de363..aac18e2bdfe4c 100644 --- a/x-pack/plugins/apm/server/lib/observability_overview/get_transaction_coordinates.ts +++ b/x-pack/plugins/apm/server/lib/observability_overview/get_transaction_coordinates.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { Coordinates } from '../../../../observability/typings/common'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { getProcessorEventForAggregatedTransactions } from '../helpers/aggregated_transactions'; 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 6b4bc844f21c3..79eb0fbce5498 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 @@ -58,11 +58,6 @@ Object { "transaction.type": "page-load", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -158,11 +153,6 @@ Object { "service.language.name": "javascript", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -237,11 +227,6 @@ Object { "field": "transaction.marks.navigationTiming.fetchStart", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -507,11 +492,6 @@ Object { "field": "transaction.marks.navigationTiming.fetchStart", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -554,11 +534,6 @@ Object { "transaction.type": "page-load", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -676,11 +651,6 @@ Object { "field": "transaction.marks.navigationTiming.fetchStart", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -727,11 +697,6 @@ Object { "field": "transaction.marks.navigationTiming.fetchStart", }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/rum_client/has_rum_data.ts b/x-pack/plugins/apm/server/lib/rum_client/has_rum_data.ts index 9626019347e5b..ec96b5225d617 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/has_rum_data.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/has_rum_data.ts @@ -11,7 +11,7 @@ import { TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../common/processor_event'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { TRANSACTION_PAGE_LOAD } from '../../../common/transaction_types'; export async function hasRumData({ setup }: { setup: Setup & SetupTimeRange }) { diff --git a/x-pack/plugins/apm/server/lib/helpers/convert_ui_filters/get_es_filter.ts b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/get_es_filter.ts similarity index 58% rename from x-pack/plugins/apm/server/lib/helpers/convert_ui_filters/get_es_filter.ts rename to x-pack/plugins/apm/server/lib/rum_client/ui_filters/get_es_filter.ts index e91c9b52deecf..aed361f13bd7d 100644 --- a/x-pack/plugins/apm/server/lib/helpers/convert_ui_filters/get_es_filter.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/get_es_filter.ts @@ -7,14 +7,10 @@ import { ESFilter } from '../../../../../../typings/elasticsearch'; import { UIFilters } from '../../../../typings/ui_filters'; -import { - localUIFilters, - localUIFilterNames, -} from '../../rum_client/ui_filters/local_ui_filters/config'; -import { esKuery } from '../../../../../../../src/plugins/data/server'; +import { localUIFilters, localUIFilterNames } from './local_ui_filters/config'; export function getEsFilter(uiFilters: UIFilters) { - const { kuery, environment, ...localFilterValues } = uiFilters; + const localFilterValues = uiFilters; const mappedFilters = localUIFilterNames .filter((name) => name in localFilterValues) .map((filterName) => { @@ -27,16 +23,5 @@ export function getEsFilter(uiFilters: UIFilters) { }; }) as ESFilter[]; - const esFilters = [...getKueryUiFilterES(uiFilters.kuery), ...mappedFilters]; - - return esFilters; -} - -function getKueryUiFilterES(kuery?: string) { - if (!kuery) { - return []; - } - - const ast = esKuery.fromKueryExpression(kuery); - return [esKuery.toElasticsearchQuery(ast) as ESFilter]; + return mappedFilters; } diff --git a/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/__snapshots__/index.test.ts.snap b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/__snapshots__/index.test.ts.snap index 40504cec36a63..9742d89587841 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/__snapshots__/index.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/__snapshots__/index.test.ts.snap @@ -44,11 +44,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/get_local_filter_query.ts b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/get_local_filter_query.ts index 8ea635467d0a1..a904bfe337a6b 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/get_local_filter_query.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/get_local_filter_query.ts @@ -9,7 +9,7 @@ import { omit } from 'lodash'; import { mergeProjection } from '../../../../projections/util/merge_projection'; import { Projection } from '../../../../projections/typings'; import { UIFilters } from '../../../../../typings/ui_filters'; -import { getEsFilter } from '../../../helpers/convert_ui_filters/get_es_filter'; +import { getEsFilter } from '../get_es_filter'; import { localUIFilters } from './config'; import { LocalUIFilterName } from '../../../../../common/ui_filter'; diff --git a/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/index.test.ts b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/index.test.ts index 7254bb25cc5fe..e2ccc43374db7 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/index.test.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/ui_filters/local_ui_filters/index.test.ts @@ -16,7 +16,7 @@ describe('getLocalUIFilters', () => { let mock: SearchParamsMock; beforeEach(() => { - jest.mock('../../../helpers/convert_ui_filters/get_es_filter', () => { + jest.mock('../get_es_filter', () => { return []; }); }); diff --git a/x-pack/plugins/apm/server/lib/service_map/fetch_service_paths_from_trace_ids.ts b/x-pack/plugins/apm/server/lib/service_map/fetch_service_paths_from_trace_ids.ts index 259a0e6daea6f..64de74fb9023b 100644 --- a/x-pack/plugins/apm/server/lib/service_map/fetch_service_paths_from_trace_ids.ts +++ b/x-pack/plugins/apm/server/lib/service_map/fetch_service_paths_from_trace_ids.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { ProcessorEvent } from '../../../common/processor_event'; import { TRACE_ID } from '../../../common/elasticsearch_fieldnames'; import { diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts index ab221e30ea489..f08cc27b2e59c 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts @@ -17,7 +17,7 @@ import { TRANSACTION_PAGE_LOAD, TRANSACTION_REQUEST, } from '../../../common/transaction_types'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { getMlJobsWithAPMGroup } from '../anomaly_detection/get_ml_jobs_with_apm_group'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts index 1aee1bb5b242a..e5b0b72b8784a 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts @@ -15,7 +15,7 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { getServicesProjection } from '../../projections/services'; import { mergeProjection } from '../../projections/util/merge_projection'; -import { environmentQuery } from '../../../common/utils/queries'; +import { environmentQuery } from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { @@ -91,7 +91,7 @@ async function getServicesData(options: IEnvOptions) { const { environment, setup, searchAggregatedTransactions } = options; const projection = getServicesProjection({ - setup: { ...setup, esFilter: [] }, + setup, searchAggregatedTransactions, }); diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts index b161345e729d3..d812275d7103b 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts @@ -19,7 +19,6 @@ describe('getServiceMapServiceNodeInfo', () => { hits: { total: { value: 0 } }, }), }, - esFilter: [], indices: {}, uiFilters: {}, } as unknown) as Setup & SetupTimeRange; diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts index 367fbc6810a7f..a6e7832bf697d 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts @@ -19,7 +19,7 @@ import { TRANSACTION_PAGE_LOAD, TRANSACTION_REQUEST, } from '../../../common/transaction_types'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { getDocumentTypeFilterForAggregatedTransactions, diff --git a/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts b/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts index e8dcb28baa9a3..2b949863bcb30 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_trace_sample_ids.ts @@ -16,7 +16,7 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../common/processor_event'; import { SERVICE_MAP_TIMEOUT_ERROR } from '../../../common/service_map'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/service_nodes/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/service_nodes/__snapshots__/queries.test.ts.snap index e6d702cc03c0b..8e47b7298cc33 100644 --- a/x-pack/plugins/apm/server/lib/service_nodes/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/service_nodes/__snapshots__/queries.test.ts.snap @@ -49,11 +49,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -117,11 +112,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -186,11 +176,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/service_nodes/index.ts b/x-pack/plugins/apm/server/lib/service_nodes/index.ts index a22c732a5e8ce..07b7e532d8055 100644 --- a/x-pack/plugins/apm/server/lib/service_nodes/index.ts +++ b/x-pack/plugins/apm/server/lib/service_nodes/index.ts @@ -18,16 +18,18 @@ import { withApmSpan } from '../../utils/with_apm_span'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; const getServiceNodes = ({ + kuery, setup, serviceName, }: { + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; }) => { return withApmSpan('get_service_nodes', async () => { const { apmEventClient } = setup; - const projection = getServiceNodesProjection({ setup, serviceName }); + const projection = getServiceNodesProjection({ kuery, setup, serviceName }); const params = mergeProjection(projection, { body: { diff --git a/x-pack/plugins/apm/server/lib/services/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/services/__snapshots__/queries.test.ts.snap index 0521ff7d9554d..dec5be8da32f4 100644 --- a/x-pack/plugins/apm/server/lib/services/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/services/__snapshots__/queries.test.ts.snap @@ -191,11 +191,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/annotations/get_derived_service_annotations.ts b/x-pack/plugins/apm/server/lib/services/annotations/get_derived_service_annotations.ts index 25c42f403da2e..efe9608edb95d 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/get_derived_service_annotations.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/get_derived_service_annotations.ts @@ -12,7 +12,7 @@ import { SERVICE_NAME, SERVICE_VERSION, } from '../../../../common/elasticsearch_fieldnames'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; import { getDocumentTypeFilterForAggregatedTransactions, diff --git a/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts b/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts index 6c7cbc26ea653..87ee0e9830fce 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts @@ -7,7 +7,7 @@ import { ResponseError } from '@elastic/elasticsearch/lib/errors'; import { ElasticsearchClient, Logger } from 'kibana/server'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { unwrapEsResponse, WrappedElasticsearchClientError, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_agent_name.ts b/x-pack/plugins/apm/server/lib/services/get_service_agent_name.ts index 3683a069342a9..a81c0b2fc2c44 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_agent_name.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_agent_name.ts @@ -10,7 +10,7 @@ import { AGENT_NAME, SERVICE_NAME, } from '../../../common/elasticsearch_fieldnames'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { getProcessorEventForAggregatedTransactions } from '../helpers/aggregated_transactions'; import { withApmSpan } from '../../utils/with_apm_span'; diff --git a/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_destination_map.ts b/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_destination_map.ts index 558d6ae22f00f..cb9d37d56b867 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_destination_map.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_destination_map.ts @@ -20,7 +20,7 @@ import { SPAN_TYPE, } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { joinByKey } from '../../../../common/utils/join_by_key'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { withApmSpan } from '../../../utils/with_apm_span'; diff --git a/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_metrics.ts b/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_metrics.ts index dfbdfb3f504e8..c8642c6272b5f 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_metrics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_dependencies/get_metrics.ts @@ -14,7 +14,7 @@ import { SPAN_DESTINATION_SERVICE_RESPONSE_TIME_SUM, } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { environmentQuery, rangeQuery } from '../../../../server/utils/queries'; import { getBucketSize } from '../../helpers/get_bucket_size'; import { EventOutcome } from '../../../../common/event_outcome'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts index 3655fa513dfb4..e33044bff8ffa 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts @@ -11,12 +11,17 @@ import { TRANSACTION_TYPE, } from '../../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; import { getBucketSize } from '../../helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; export async function getServiceErrorGroupComparisonStatistics({ + kuery, serviceName, setup, numBuckets, @@ -24,6 +29,7 @@ export async function getServiceErrorGroupComparisonStatistics({ groupIds, environment, }: { + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; numBuckets: number; @@ -34,7 +40,7 @@ export async function getServiceErrorGroupComparisonStatistics({ return withApmSpan( 'get_service_error_group_comparison_statistics', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const { intervalString } = getBucketSize({ start, end, numBuckets }); @@ -52,7 +58,7 @@ export async function getServiceErrorGroupComparisonStatistics({ { term: { [TRANSACTION_TYPE]: transactionType } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts index e6c1c5db8f2ca..13a6069876369 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts @@ -14,24 +14,30 @@ import { } from '../../../../common/elasticsearch_fieldnames'; import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; import { ProcessorEvent } from '../../../../common/processor_event'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; import { getErrorName } from '../../helpers/get_error_name'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; export function getServiceErrorGroupPrimaryStatistics({ + kuery, serviceName, setup, transactionType, environment, }: { + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; transactionType: string; environment?: string; }) { return withApmSpan('get_service_error_group_primary_statistics', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const response = await apmEventClient.search({ apm: { @@ -46,7 +52,7 @@ export function getServiceErrorGroupPrimaryStatistics({ { term: { [TRANSACTION_TYPE]: transactionType } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts index a17fb6da2007f..676ba1625cc61 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts @@ -9,7 +9,11 @@ import { ValuesType } from 'utility-types'; import { orderBy } from 'lodash'; import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; import { PromiseReturnType } from '../../../../../observability/typings/common'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { ProcessorEvent } from '../../../../common/processor_event'; import { ERROR_EXC_MESSAGE, @@ -29,6 +33,7 @@ export type ServiceErrorGroupItem = ValuesType< export async function getServiceErrorGroups({ environment, + kuery, serviceName, setup, size, @@ -39,6 +44,7 @@ export async function getServiceErrorGroups({ transactionType, }: { environment?: string; + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; size: number; @@ -49,7 +55,7 @@ export async function getServiceErrorGroups({ transactionType: string; }) { return withApmSpan('get_service_error_groups', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const { intervalString } = getBucketSize({ start, end, numBuckets }); @@ -67,7 +73,7 @@ export async function getServiceErrorGroups({ { term: { [TRANSACTION_TYPE]: transactionType } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, @@ -150,7 +156,7 @@ export async function getServiceErrorGroups({ { term: { [TRANSACTION_TYPE]: transactionType } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_system_metric_stats.ts b/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_system_metric_stats.ts index ef90e5197229b..3e788ca8ddf83 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_system_metric_stats.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_system_metric_stats.ts @@ -6,7 +6,11 @@ */ import { AggregationOptionsByType } from '../../../../../../typings/elasticsearch'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { SERVICE_NODE_NAME_MISSING } from '../../../../common/service_nodes'; import { METRIC_CGROUP_MEMORY_USAGE_BYTES, @@ -27,13 +31,14 @@ import { withApmSpan } from '../../../utils/with_apm_span'; export async function getServiceInstanceSystemMetricStats({ environment, + kuery, setup, serviceName, size, numBuckets, }: ServiceInstanceParams) { return withApmSpan('get_service_instance_system_metric_stats', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const { intervalString } = getBucketSize({ start, end, numBuckets }); @@ -99,7 +104,7 @@ export async function getServiceInstanceSystemMetricStats({ { term: { [SERVICE_NAME]: serviceName } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], should: [cgroupMemoryFilter, systemMemoryFilter, cpuUsageFilter], minimum_should_match: 1, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_transaction_stats.ts b/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_transaction_stats.ts index 620fd9828bd37..94a5e54e9ace5 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_transaction_stats.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instance_transaction_stats.ts @@ -6,7 +6,11 @@ */ import { EventOutcome } from '../../../../common/event_outcome'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { SERVICE_NODE_NAME_MISSING } from '../../../../common/service_nodes'; import { EVENT_OUTCOME, @@ -29,6 +33,7 @@ import { export async function getServiceInstanceTransactionStats({ environment, + kuery, latencyAggregationType, setup, transactionType, @@ -38,7 +43,7 @@ export async function getServiceInstanceTransactionStats({ numBuckets, }: ServiceInstanceParams) { return withApmSpan('get_service_instance_transaction_stats', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const { intervalString, bucketSize } = getBucketSize({ start, @@ -78,7 +83,7 @@ export async function getServiceInstanceTransactionStats({ { term: { [TRANSACTION_TYPE]: transactionType } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_instances/index.ts b/x-pack/plugins/apm/server/lib/services/get_service_instances/index.ts index 7c0124f4ce004..838753890a8cd 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_instances/index.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_instances/index.ts @@ -14,6 +14,7 @@ import { getServiceInstanceTransactionStats } from './get_service_instance_trans export interface ServiceInstanceParams { environment?: string; + kuery?: string; latencyAggregationType: LatencyAggregationType; setup: Setup & SetupTimeRange; serviceName: string; diff --git a/x-pack/plugins/apm/server/lib/services/get_service_metadata_details.ts b/x-pack/plugins/apm/server/lib/services/get_service_metadata_details.ts index 5c43191cf588c..a064d5b3008c2 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_metadata_details.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_metadata_details.ts @@ -21,7 +21,7 @@ import { SERVICE_VERSION, } from '../../../common/elasticsearch_fieldnames'; import { ContainerType } from '../../../common/service_metadata'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { TransactionRaw } from '../../../typings/es_schemas/raw/transaction_raw'; import { getProcessorEventForAggregatedTransactions } from '../helpers/aggregated_transactions'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/services/get_service_metadata_icons.ts b/x-pack/plugins/apm/server/lib/services/get_service_metadata_icons.ts index b342ffea02464..94da6545c5e90 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_metadata_icons.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_metadata_icons.ts @@ -16,7 +16,7 @@ import { HOST_OS_PLATFORM, } from '../../../common/elasticsearch_fieldnames'; import { ContainerType } from '../../../common/service_metadata'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { TransactionRaw } from '../../../typings/es_schemas/raw/transaction_raw'; import { getProcessorEventForAggregatedTransactions } from '../helpers/aggregated_transactions'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/services/get_service_node_metadata.ts b/x-pack/plugins/apm/server/lib/services/get_service_node_metadata.ts index 16753db416edd..8eaf9e96c7fd9 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_node_metadata.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_node_metadata.ts @@ -16,10 +16,12 @@ import { getServiceNodesProjection } from '../../projections/service_nodes'; import { withApmSpan } from '../../utils/with_apm_span'; export function getServiceNodeMetadata({ + kuery, serviceName, serviceNodeName, setup, }: { + kuery?: string; serviceName: string; serviceNodeName: string; setup: Setup & SetupTimeRange; @@ -29,6 +31,7 @@ export function getServiceNodeMetadata({ const query = mergeProjection( getServiceNodesProjection({ + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts index ce36db3e82bab..6875a41ad7d9f 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts @@ -14,7 +14,11 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { EventOutcome } from '../../../common/event_outcome'; import { LatencyAggregationType } from '../../../common/latency_aggregation_types'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../server/utils/queries'; import { Coordinate } from '../../../typings/timeseries'; import { withApmSpan } from '../../utils/with_apm_span'; import { @@ -32,6 +36,7 @@ import { calculateTransactionErrorPercentage } from '../helpers/transaction_erro export async function getServiceTransactionGroupComparisonStatistics({ environment, + kuery, serviceName, transactionNames, setup, @@ -41,6 +46,7 @@ export async function getServiceTransactionGroupComparisonStatistics({ latencyAggregationType, }: { environment?: string; + kuery?: string; serviceName: string; transactionNames: string[]; setup: Setup & SetupTimeRange; @@ -62,7 +68,7 @@ export async function getServiceTransactionGroupComparisonStatistics({ return withApmSpan( 'get_service_transaction_group_comparison_statistics', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const { intervalString } = getBucketSize({ start, end, numBuckets }); const field = getTransactionDurationFieldForAggregatedTransactions( @@ -89,7 +95,7 @@ export async function getServiceTransactionGroupComparisonStatistics({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_transaction_groups.ts b/x-pack/plugins/apm/server/lib/services/get_service_transaction_groups.ts index ddbfd617faf65..28574bab4df21 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_transaction_groups.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_transaction_groups.ts @@ -13,7 +13,11 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { EventOutcome } from '../../../common/event_outcome'; import { LatencyAggregationType } from '../../../common/latency_aggregation_types'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../server/utils/queries'; import { withApmSpan } from '../../utils/with_apm_span'; import { getDocumentTypeFilterForAggregatedTransactions, @@ -37,6 +41,7 @@ export type ServiceOverviewTransactionGroupSortField = export async function getServiceTransactionGroups({ environment, + kuery, serviceName, setup, searchAggregatedTransactions, @@ -44,6 +49,7 @@ export async function getServiceTransactionGroups({ latencyAggregationType, }: { environment?: string; + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; searchAggregatedTransactions: boolean; @@ -51,7 +57,7 @@ export async function getServiceTransactionGroups({ latencyAggregationType: LatencyAggregationType; }) { return withApmSpan('get_service_transaction_groups', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const field = getTransactionDurationFieldForAggregatedTransactions( searchAggregatedTransactions @@ -77,7 +83,7 @@ export async function getServiceTransactionGroups({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_transaction_types.ts b/x-pack/plugins/apm/server/lib/services/get_service_transaction_types.ts index 3d77bf5bd6baf..e280ab6db1665 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_transaction_types.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_transaction_types.ts @@ -9,7 +9,7 @@ import { SERVICE_NAME, TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { getDocumentTypeFilterForAggregatedTransactions, diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_legacy_data_status.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_legacy_data_status.ts index a3adca0d306aa..b42fd340bfb42 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_legacy_data_status.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_legacy_data_status.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { rangeQuery } from '../../../../common/utils/queries'; +import { rangeQuery } from '../../../../server/utils/queries'; import { ProcessorEvent } from '../../../../common/processor_event'; import { OBSERVER_VERSION_MAJOR } from '../../../../common/elasticsearch_fieldnames'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts index e1f8bca83829c..5f0302035462c 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts @@ -15,7 +15,11 @@ import { TRANSACTION_PAGE_LOAD, TRANSACTION_REQUEST, } from '../../../../common/transaction_types'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { getDocumentTypeFilterForAggregatedTransactions, @@ -33,6 +37,7 @@ import { withApmSpan } from '../../../utils/with_apm_span'; interface AggregationParams { environment?: string; + kuery?: string; setup: ServicesItemsSetup; searchAggregatedTransactions: boolean; } @@ -41,11 +46,12 @@ const MAX_NUMBER_OF_SERVICES = 500; export async function getServiceTransactionStats({ environment, + kuery, setup, searchAggregatedTransactions, }: AggregationParams) { return withApmSpan('get_service_transaction_stats', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const outcomes = getOutcomeAggregation(); @@ -78,7 +84,7 @@ export async function getServiceTransactionStats({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts index c2677af038486..1ddc7a6583c81 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts @@ -17,11 +17,13 @@ export type ServicesItemsSetup = Setup & SetupTimeRange; export async function getServicesItems({ environment, + kuery, setup, searchAggregatedTransactions, logger, }: { environment?: string; + kuery?: string; setup: ServicesItemsSetup; searchAggregatedTransactions: boolean; logger: Logger; @@ -29,7 +31,9 @@ export async function getServicesItems({ return withApmSpan('get_services_items', async () => { const params = { environment, + kuery, projection: getServicesProjection({ + kuery, setup, searchAggregatedTransactions, }), diff --git a/x-pack/plugins/apm/server/lib/services/get_services/index.ts b/x-pack/plugins/apm/server/lib/services/get_services/index.ts index 1a0ddeda11651..e76eb3c28fddb 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/index.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/index.ts @@ -15,11 +15,13 @@ import { hasHistoricalAgentData } from './has_historical_agent_data'; export async function getServices({ environment, + kuery, setup, searchAggregatedTransactions, logger, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; searchAggregatedTransactions: boolean; logger: Logger; @@ -28,6 +30,7 @@ export async function getServices({ const [items, hasLegacyData] = await Promise.all([ getServicesItems({ environment, + kuery, setup, searchAggregatedTransactions, logger, diff --git a/x-pack/plugins/apm/server/lib/services/get_throughput.ts b/x-pack/plugins/apm/server/lib/services/get_throughput.ts index f7cd23b0e37a7..490eec337840e 100644 --- a/x-pack/plugins/apm/server/lib/services/get_throughput.ts +++ b/x-pack/plugins/apm/server/lib/services/get_throughput.ts @@ -10,7 +10,11 @@ import { SERVICE_NAME, TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, @@ -21,6 +25,7 @@ import { withApmSpan } from '../../utils/with_apm_span'; interface Options { environment?: string; + kuery?: string; searchAggregatedTransactions: boolean; serviceName: string; setup: Setup; @@ -31,6 +36,7 @@ interface Options { function fetcher({ environment, + kuery, searchAggregatedTransactions, serviceName, setup, @@ -38,7 +44,7 @@ function fetcher({ start, end, }: Options) { - const { esFilter, apmEventClient } = setup; + const { apmEventClient } = setup; const { intervalString } = getBucketSize({ start, end }); const filter: ESFilter[] = [ { term: { [SERVICE_NAME]: serviceName } }, @@ -48,7 +54,7 @@ function fetcher({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; const params = { diff --git a/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_statistics.ts b/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_statistics.ts index 0c9bbb35be631..8b60d39a8de5d 100644 --- a/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_statistics.ts @@ -21,7 +21,11 @@ import { PROFILE_TOP_ID, SERVICE_NAME, } from '../../../../common/elasticsearch_fieldnames'; -import { rangeQuery, environmentQuery } from '../../../../common/utils/queries'; +import { + rangeQuery, + environmentQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { APMEventClient } from '../../helpers/create_es_client/create_apm_event_client'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { withApmSpan } from '../../../utils/with_apm_span'; @@ -184,12 +188,14 @@ function getProfilesWithStacks({ } export async function getServiceProfilingStatistics({ + kuery, serviceName, setup, environment, valueType, logger, }: { + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; environment?: string; @@ -202,11 +208,11 @@ export async function getServiceProfilingStatistics({ const valueTypeField = getValueTypeConfig(valueType).field; const filter: ESFilter[] = [ - ...rangeQuery(start, end), { term: { [SERVICE_NAME]: serviceName } }, - ...environmentQuery(environment), { exists: { field: valueTypeField } }, - ...setup.esFilter, + ...rangeQuery(start, end), + ...environmentQuery(environment), + ...kqlQuery(kuery), ]; const [profileStats, profileStacks] = await Promise.all([ diff --git a/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_timeline.ts b/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_timeline.ts index dc29d6a43d82d..93fa029da8c72 100644 --- a/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_timeline.ts +++ b/x-pack/plugins/apm/server/lib/services/profiling/get_service_profiling_timeline.ts @@ -5,7 +5,7 @@ * 2.0. */ import { mapKeys, mapValues } from 'lodash'; -import { rangeQuery, environmentQuery } from '../../../../common/utils/queries'; +import { rangeQuery, environmentQuery } from '../../../../server/utils/queries'; import { ProcessorEvent } from '../../../../common/processor_event'; import { PROFILE_ID, @@ -18,6 +18,7 @@ import { import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { getBucketSize } from '../../helpers/get_bucket_size'; import { withApmSpan } from '../../../utils/with_apm_span'; +import { kqlQuery } from '../../../utils/queries'; const configMap = mapValues( mapKeys(ProfilingValueType, (val, key) => val), @@ -27,16 +28,18 @@ const configMap = mapValues( const allFields = Object.values(configMap).map((config) => config.field); export async function getServiceProfilingTimeline({ + kuery, serviceName, environment, setup, }: { + kuery?: string; serviceName: string; setup: Setup & SetupTimeRange; environment?: string; }) { return withApmSpan('get_service_profiling_timeline', async () => { - const { apmEventClient, start, end, esFilter } = setup; + const { apmEventClient, start, end } = setup; const response = await apmEventClient.search({ apm: { @@ -50,7 +53,7 @@ export async function getServiceProfilingTimeline({ { term: { [SERVICE_NAME]: serviceName } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/traces/get_trace_items.ts b/x-pack/plugins/apm/server/lib/traces/get_trace_items.ts index f631657f87276..0b158d9e57285 100644 --- a/x-pack/plugins/apm/server/lib/traces/get_trace_items.ts +++ b/x-pack/plugins/apm/server/lib/traces/get_trace_items.ts @@ -15,7 +15,7 @@ import { ERROR_LOG_LEVEL, } from '../../../common/elasticsearch_fieldnames'; import { APMError } from '../../../typings/es_schemas/ui/apm_error'; -import { rangeQuery } from '../../../common/utils/queries'; +import { rangeQuery } from '../../../server/utils/queries'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { PromiseValueType } from '../../../typings/common'; import { withApmSpan } from '../../utils/with_apm_span'; diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap index 7fb2bb2fcbeeb..34c2f39ca04c0 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap @@ -56,11 +56,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], "must_not": Array [ Object { @@ -123,11 +118,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], "must_not": Array [ Object { @@ -190,11 +180,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], "must_not": Array [ Object { @@ -262,11 +247,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -317,11 +297,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -372,11 +347,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, @@ -433,11 +403,6 @@ Array [ }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts index 09e5e358a1b7c..ce0b6cf2a64fe 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts @@ -28,6 +28,7 @@ import { interface TopTransactionOptions { environment?: string; + kuery?: string; type: 'top_transactions'; serviceName: string; transactionType: string; @@ -37,6 +38,7 @@ interface TopTransactionOptions { interface TopTraceOptions { environment?: string; + kuery?: string; type: 'top_traces'; transactionName?: string; searchAggregatedTransactions: boolean; diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts index d1a056002db07..627086df9d681 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts @@ -14,7 +14,11 @@ import { TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; import { EventOutcome } from '../../../common/event_outcome'; -import { environmentQuery, rangeQuery } from '../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, @@ -30,6 +34,7 @@ import { withApmSpan } from '../../utils/with_apm_span'; export async function getErrorRate({ environment, + kuery, serviceName, transactionType, transactionName, @@ -37,6 +42,7 @@ export async function getErrorRate({ searchAggregatedTransactions, }: { environment?: string; + kuery?: string; serviceName: string; transactionType?: string; transactionName?: string; @@ -48,7 +54,7 @@ export async function getErrorRate({ average: number | null; }> { return withApmSpan('get_transaction_group_error_rate', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const transactionNamefilter = transactionName ? [{ term: { [TRANSACTION_NAME]: transactionName } }] @@ -71,7 +77,7 @@ export async function getErrorRate({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; const outcomes = getOutcomeAggregation(); diff --git a/x-pack/plugins/apm/server/lib/transactions/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/transactions/__snapshots__/queries.test.ts.snap index 62050563497e9..baa9b3ae230fe 100644 --- a/x-pack/plugins/apm/server/lib/transactions/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/transactions/__snapshots__/queries.test.ts.snap @@ -159,11 +159,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "bool": Object { "minimum_should_match": 1, @@ -310,11 +305,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, Object { "bool": Object { "minimum_should_match": 1, @@ -387,11 +377,6 @@ Object { }, }, }, - Object { - "term": Object { - "service.environment": "test", - }, - }, ], }, }, diff --git a/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts b/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts index 130029495af32..d8867c0dcc1e2 100644 --- a/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts +++ b/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts @@ -38,7 +38,6 @@ function getMockSetup(esResponse: any) { } ) as APMConfig, uiFilters: {}, - esFilter: [], indices: mockIndices, dynamicIndexPattern: null as any, }; diff --git a/x-pack/plugins/apm/server/lib/transactions/breakdown/index.ts b/x-pack/plugins/apm/server/lib/transactions/breakdown/index.ts index f1e202df312c2..568769b52e2b4 100644 --- a/x-pack/plugins/apm/server/lib/transactions/breakdown/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/breakdown/index.ts @@ -18,7 +18,11 @@ import { TRANSACTION_BREAKDOWN_COUNT, } from '../../../../common/elasticsearch_fieldnames'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { getMetricsDateHistogramParams } from '../../helpers/metrics'; import { MAX_KPIS } from './constants'; import { getVizColorForIndex } from '../../../../common/viz_colors'; @@ -26,19 +30,21 @@ import { withApmSpan } from '../../../utils/with_apm_span'; export function getTransactionBreakdown({ environment, + kuery, setup, serviceName, transactionName, transactionType, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; transactionName?: string; transactionType: string; }) { return withApmSpan('get_transaction_breakdown', async () => { - const { esFilter, apmEventClient, start, end, config } = setup; + const { apmEventClient, start, end, config } = setup; const subAggs = { sum_all_self_times: { @@ -86,7 +92,7 @@ export function getTransactionBreakdown({ { term: { [TRANSACTION_TYPE]: transactionType } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), { bool: { should: [ diff --git a/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts b/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts index 7ed016cd4b4c6..fb7544e5fcb8d 100644 --- a/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/distribution/get_buckets/index.ts @@ -20,7 +20,8 @@ import { joinByKey } from '../../../../../common/utils/join_by_key'; import { environmentQuery, rangeQuery, -} from '../../../../../common/utils/queries'; + kqlQuery, +} from '../../../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, @@ -50,6 +51,7 @@ function getHistogramAggOptions({ export async function getBuckets({ environment, + kuery, serviceName, transactionName, transactionType, @@ -61,6 +63,7 @@ export async function getBuckets({ searchAggregatedTransactions, }: { environment?: string; + kuery?: string; serviceName: string; transactionName: string; transactionType: string; @@ -74,7 +77,7 @@ export async function getBuckets({ return withApmSpan( 'get_latency_distribution_buckets_with_samples', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const commonFilters = [ { term: { [SERVICE_NAME]: serviceName } }, @@ -82,7 +85,7 @@ export async function getBuckets({ { term: { [TRANSACTION_NAME]: transactionName } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; async function getSamplesForDistributionBuckets() { diff --git a/x-pack/plugins/apm/server/lib/transactions/distribution/get_distribution_max.ts b/x-pack/plugins/apm/server/lib/transactions/distribution/get_distribution_max.ts index f8061ea989469..2e86f6bb84c81 100644 --- a/x-pack/plugins/apm/server/lib/transactions/distribution/get_distribution_max.ts +++ b/x-pack/plugins/apm/server/lib/transactions/distribution/get_distribution_max.ts @@ -15,11 +15,16 @@ import { getProcessorEventForAggregatedTransactions, getTransactionDurationFieldForAggregatedTransactions, } from '../../helpers/aggregated_transactions'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; export async function getDistributionMax({ environment, + kuery, serviceName, transactionName, transactionType, @@ -27,6 +32,7 @@ export async function getDistributionMax({ searchAggregatedTransactions, }: { environment?: string; + kuery?: string; serviceName: string; transactionName: string; transactionType: string; @@ -34,7 +40,7 @@ export async function getDistributionMax({ searchAggregatedTransactions: boolean; }) { return withApmSpan('get_latency_distribution_max', async () => { - const { start, end, esFilter, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const params = { apm: { @@ -54,7 +60,7 @@ export async function getDistributionMax({ { term: { [TRANSACTION_NAME]: transactionName } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts b/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts index 92d1d96b4a8e3..ef92ce6edcafe 100644 --- a/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/distribution/index.ts @@ -20,6 +20,7 @@ function getBucketSize(max: number) { } export async function getTransactionDistribution({ + kuery, environment, serviceName, transactionName, @@ -30,6 +31,7 @@ export async function getTransactionDistribution({ searchAggregatedTransactions, }: { environment?: string; + kuery?: string; serviceName: string; transactionName: string; transactionType: string; @@ -41,6 +43,7 @@ export async function getTransactionDistribution({ return withApmSpan('get_transaction_latency_distribution', async () => { const distributionMax = await getDistributionMax({ environment, + kuery, serviceName, transactionName, transactionType, @@ -56,6 +59,7 @@ export async function getTransactionDistribution({ const { buckets, noHits } = await getBuckets({ environment, + kuery, serviceName, transactionName, transactionType, diff --git a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts index d566f3a169e78..cfd09f0207536 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts @@ -7,7 +7,7 @@ import { ESSearchResponse } from '../../../../../../typings/elasticsearch'; import { PromiseReturnType } from '../../../../../observability/typings/common'; -import { rangeQuery } from '../../../../common/utils/queries'; +import { rangeQuery } from '../../../../server/utils/queries'; import { withApmSpan } from '../../../utils/with_apm_span'; import { Setup } from '../../helpers/setup_request'; diff --git a/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts index e1d3921d298c7..0be72c95b0a60 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts @@ -13,7 +13,11 @@ import { TRANSACTION_TYPE, } from '../../../../common/elasticsearch_fieldnames'; import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, @@ -32,6 +36,7 @@ export type LatencyChartsSearchResponse = PromiseReturnType< function searchLatency({ environment, + kuery, serviceName, transactionType, transactionName, @@ -40,6 +45,7 @@ function searchLatency({ latencyAggregationType, }: { environment?: string; + kuery?: string; serviceName: string; transactionType: string | undefined; transactionName: string | undefined; @@ -47,7 +53,7 @@ function searchLatency({ searchAggregatedTransactions: boolean; latencyAggregationType: LatencyAggregationType; }) { - const { esFilter, start, end, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const { intervalString } = getBucketSize({ start, end }); const filter: ESFilter[] = [ @@ -57,7 +63,7 @@ function searchLatency({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; if (transactionName) { @@ -106,6 +112,7 @@ function searchLatency({ export function getLatencyTimeseries({ environment, + kuery, serviceName, transactionType, transactionName, @@ -114,6 +121,7 @@ export function getLatencyTimeseries({ latencyAggregationType, }: { environment?: string; + kuery?: string; serviceName: string; transactionType: string | undefined; transactionName: string | undefined; @@ -124,6 +132,7 @@ export function getLatencyTimeseries({ return withApmSpan('get_latency_charts', async () => { const response = await searchLatency({ environment, + kuery, serviceName, transactionType, transactionName, diff --git a/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts index ec5dbf0eab3e9..3b7ffafff0d2a 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts @@ -13,7 +13,11 @@ import { TRANSACTION_RESULT, TRANSACTION_TYPE, } from '../../../../common/elasticsearch_fieldnames'; -import { environmentQuery, rangeQuery } from '../../../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, @@ -29,6 +33,7 @@ export type ThroughputChartsResponse = PromiseReturnType< function searchThroughput({ environment, + kuery, serviceName, transactionType, transactionName, @@ -37,6 +42,7 @@ function searchThroughput({ intervalString, }: { environment?: string; + kuery?: string; serviceName: string; transactionType: string; transactionName: string | undefined; @@ -44,7 +50,7 @@ function searchThroughput({ searchAggregatedTransactions: boolean; intervalString: string; }) { - const { esFilter, start, end, apmEventClient } = setup; + const { start, end, apmEventClient } = setup; const filter: ESFilter[] = [ { term: { [SERVICE_NAME]: serviceName } }, @@ -54,7 +60,7 @@ function searchThroughput({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; if (transactionName) { @@ -95,6 +101,7 @@ function searchThroughput({ export async function getThroughputCharts({ environment, + kuery, serviceName, transactionType, transactionName, @@ -102,6 +109,7 @@ export async function getThroughputCharts({ searchAggregatedTransactions, }: { environment?: string; + kuery?: string; serviceName: string; transactionType: string; transactionName: string | undefined; @@ -113,6 +121,7 @@ export async function getThroughputCharts({ const response = await searchThroughput({ environment, + kuery, serviceName, transactionType, transactionName, diff --git a/x-pack/plugins/apm/server/lib/transactions/get_transaction/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_transaction/index.ts index 38d6b593dc72d..a089850e427e6 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_transaction/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_transaction/index.ts @@ -9,7 +9,7 @@ import { TRACE_ID, TRANSACTION_ID, } from '../../../../common/elasticsearch_fieldnames'; -import { rangeQuery } from '../../../../common/utils/queries'; +import { rangeQuery } from '../../../../server/utils/queries'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { ProcessorEvent } from '../../../../common/processor_event'; import { withApmSpan } from '../../../utils/with_apm_span'; diff --git a/x-pack/plugins/apm/server/projections/errors.ts b/x-pack/plugins/apm/server/projections/errors.ts index 342d78608efbf..341c7d13936ba 100644 --- a/x-pack/plugins/apm/server/projections/errors.ts +++ b/x-pack/plugins/apm/server/projections/errors.ts @@ -10,19 +10,25 @@ import { SERVICE_NAME, ERROR_GROUP_ID, } from '../../common/elasticsearch_fieldnames'; -import { environmentQuery, rangeQuery } from '../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../server/utils/queries'; import { ProcessorEvent } from '../../common/processor_event'; export function getErrorGroupsProjection({ environment, + kuery, setup, serviceName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; }) { - const { start, end, esFilter } = setup; + const { start, end } = setup; return { apm: { @@ -35,7 +41,7 @@ export function getErrorGroupsProjection({ { term: { [SERVICE_NAME]: serviceName } }, ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }, }, diff --git a/x-pack/plugins/apm/server/projections/metrics.ts b/x-pack/plugins/apm/server/projections/metrics.ts index a32c2ae46c870..ca43d0a8fb3c8 100644 --- a/x-pack/plugins/apm/server/projections/metrics.ts +++ b/x-pack/plugins/apm/server/projections/metrics.ts @@ -10,7 +10,11 @@ import { SERVICE_NAME, SERVICE_NODE_NAME, } from '../../common/elasticsearch_fieldnames'; -import { environmentQuery, rangeQuery } from '../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../server/utils/queries'; import { SERVICE_NODE_NAME_MISSING } from '../../common/service_nodes'; import { ProcessorEvent } from '../../common/processor_event'; @@ -28,23 +32,25 @@ function getServiceNodeNameFilters(serviceNodeName?: string) { export function getMetricsProjection({ environment, + kuery, setup, serviceName, serviceNodeName, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; }) { - const { start, end, esFilter } = setup; + const { start, end } = setup; const filter = [ { term: { [SERVICE_NAME]: serviceName } }, ...getServiceNodeNameFilters(serviceNodeName), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ]; return { diff --git a/x-pack/plugins/apm/server/projections/rum_page_load_transactions.ts b/x-pack/plugins/apm/server/projections/rum_page_load_transactions.ts index 1d5f7316b69ad..9c6ea6bc83511 100644 --- a/x-pack/plugins/apm/server/projections/rum_page_load_transactions.ts +++ b/x-pack/plugins/apm/server/projections/rum_page_load_transactions.ts @@ -11,9 +11,10 @@ import { TRANSACTION_TYPE, SERVICE_LANGUAGE_NAME, } from '../../common/elasticsearch_fieldnames'; -import { rangeQuery } from '../../common/utils/queries'; +import { rangeQuery } from '../../server/utils/queries'; import { ProcessorEvent } from '../../common/processor_event'; import { TRANSACTION_PAGE_LOAD } from '../../common/transaction_types'; +import { getEsFilter } from '../lib/rum_client/ui_filters/get_es_filter'; export function getRumPageLoadTransactionsProjection({ setup, @@ -24,7 +25,7 @@ export function getRumPageLoadTransactionsProjection({ urlQuery?: string; checkFetchStartFieldExists?: boolean; }) { - const { start, end, esFilter } = setup; + const { start, end, uiFilters } = setup; const bool = { filter: [ @@ -52,7 +53,7 @@ export function getRumPageLoadTransactionsProjection({ }, ] : []), - ...esFilter, + ...getEsFilter(uiFilters), ], }; @@ -75,7 +76,7 @@ export function getRumErrorsProjection({ setup: Setup & SetupTimeRange; urlQuery?: string; }) { - const { start, end, esFilter: esFilter } = setup; + const { start, end, uiFilters } = setup; const bool = { filter: [ @@ -86,7 +87,7 @@ export function getRumErrorsProjection({ [SERVICE_LANGUAGE_NAME]: 'javascript', }, }, - ...esFilter, + ...getEsFilter(uiFilters), ...(urlQuery ? [ { diff --git a/x-pack/plugins/apm/server/projections/service_nodes.ts b/x-pack/plugins/apm/server/projections/service_nodes.ts index 64e7406987fea..932309d9875c2 100644 --- a/x-pack/plugins/apm/server/projections/service_nodes.ts +++ b/x-pack/plugins/apm/server/projections/service_nodes.ts @@ -11,16 +11,19 @@ import { mergeProjection } from './util/merge_projection'; import { getMetricsProjection } from './metrics'; export function getServiceNodesProjection({ + kuery, setup, serviceName, serviceNodeName, }: { + kuery?: string; setup: Setup & SetupTimeRange; serviceName: string; serviceNodeName?: string; }) { return mergeProjection( getMetricsProjection({ + kuery, setup, serviceName, serviceNodeName, diff --git a/x-pack/plugins/apm/server/projections/services.ts b/x-pack/plugins/apm/server/projections/services.ts index a9f5a7efd0e67..3509e4fa5b339 100644 --- a/x-pack/plugins/apm/server/projections/services.ts +++ b/x-pack/plugins/apm/server/projections/services.ts @@ -7,18 +7,20 @@ import { Setup, SetupTimeRange } from '../../server/lib/helpers/setup_request'; import { SERVICE_NAME } from '../../common/elasticsearch_fieldnames'; -import { rangeQuery } from '../../common/utils/queries'; +import { rangeQuery, kqlQuery } from '../../server/utils/queries'; import { ProcessorEvent } from '../../common/processor_event'; import { getProcessorEventForAggregatedTransactions } from '../lib/helpers/aggregated_transactions'; export function getServicesProjection({ + kuery, setup, searchAggregatedTransactions, }: { + kuery?: string; setup: Setup & SetupTimeRange; searchAggregatedTransactions: boolean; }) { - const { start, end, esFilter } = setup; + const { start, end } = setup; return { apm: { @@ -34,7 +36,7 @@ export function getServicesProjection({ size: 0, query: { bool: { - filter: [...rangeQuery(start, end), ...esFilter], + filter: [...rangeQuery(start, end), ...kqlQuery(kuery)], }, }, aggs: { diff --git a/x-pack/plugins/apm/server/projections/transactions.ts b/x-pack/plugins/apm/server/projections/transactions.ts index 45ed5d2865a67..7955518d56f03 100644 --- a/x-pack/plugins/apm/server/projections/transactions.ts +++ b/x-pack/plugins/apm/server/projections/transactions.ts @@ -11,7 +11,11 @@ import { TRANSACTION_TYPE, TRANSACTION_NAME, } from '../../common/elasticsearch_fieldnames'; -import { environmentQuery, rangeQuery } from '../../common/utils/queries'; +import { + environmentQuery, + rangeQuery, + kqlQuery, +} from '../../server/utils/queries'; import { getProcessorEventForAggregatedTransactions, getDocumentTypeFilterForAggregatedTransactions, @@ -19,6 +23,7 @@ import { export function getTransactionsProjection({ environment, + kuery, setup, serviceName, transactionName, @@ -26,13 +31,14 @@ export function getTransactionsProjection({ searchAggregatedTransactions, }: { environment?: string; + kuery?: string; setup: Setup & SetupTimeRange; serviceName?: string; transactionName?: string; transactionType?: string; searchAggregatedTransactions: boolean; }) { - const { start, end, esFilter } = setup; + const { start, end } = setup; const transactionNameFilter = transactionName ? [{ term: { [TRANSACTION_NAME]: transactionName } }] @@ -54,7 +60,7 @@ export function getTransactionsProjection({ ), ...rangeQuery(start, end), ...environmentQuery(environment), - ...esFilter, + ...kqlQuery(kuery), ], }; diff --git a/x-pack/plugins/apm/server/routes/correlations.ts b/x-pack/plugins/apm/server/routes/correlations.ts index d4a0db3c0d6c7..48305d1a9df07 100644 --- a/x-pack/plugins/apm/server/routes/correlations.ts +++ b/x-pack/plugins/apm/server/routes/correlations.ts @@ -13,7 +13,7 @@ import { getCorrelationsForFailedTransactions } from '../lib/correlations/get_co import { getCorrelationsForSlowTransactions } from '../lib/correlations/get_correlations_for_slow_transactions'; import { setupRequest } from '../lib/helpers/setup_request'; import { createRoute } from './create_route'; -import { environmentRt, rangeRt } from './default_api_types'; +import { environmentRt, kueryRt, rangeRt } from './default_api_types'; const INVALID_LICENSE = i18n.translate( 'xpack.apm.significanTerms.license.text', @@ -36,8 +36,8 @@ export const correlationsForSlowTransactionsRoute = createRoute({ durationPercentile: t.string, fieldNames: t.string, }), - t.partial({ uiFilters: t.string }), environmentRt, + kueryRt, rangeRt, ]), }), @@ -49,6 +49,7 @@ export const correlationsForSlowTransactionsRoute = createRoute({ const setup = await setupRequest(context, request); const { environment, + kuery, serviceName, transactionType, transactionName, @@ -58,6 +59,7 @@ export const correlationsForSlowTransactionsRoute = createRoute({ return getCorrelationsForSlowTransactions({ environment, + kuery, serviceName, transactionType, transactionName, @@ -80,8 +82,8 @@ export const correlationsForFailedTransactionsRoute = createRoute({ t.type({ fieldNames: t.string, }), - t.partial({ uiFilters: t.string }), environmentRt, + kueryRt, rangeRt, ]), }), @@ -93,6 +95,7 @@ export const correlationsForFailedTransactionsRoute = createRoute({ const setup = await setupRequest(context, request); const { environment, + kuery, serviceName, transactionType, transactionName, @@ -101,6 +104,7 @@ export const correlationsForFailedTransactionsRoute = createRoute({ return getCorrelationsForFailedTransactions({ environment, + kuery, serviceName, transactionType, transactionName, diff --git a/x-pack/plugins/apm/server/routes/default_api_types.ts b/x-pack/plugins/apm/server/routes/default_api_types.ts index 990b462a520d2..10c50a384c2d7 100644 --- a/x-pack/plugins/apm/server/routes/default_api_types.ts +++ b/x-pack/plugins/apm/server/routes/default_api_types.ts @@ -20,4 +20,4 @@ export const comparisonRangeRt = t.partial({ export const environmentRt = t.partial({ environment: t.string }); -export const uiFiltersRt = t.type({ uiFilters: t.string }); +export const kueryRt = t.partial({ kuery: t.string }); diff --git a/x-pack/plugins/apm/server/routes/errors.ts b/x-pack/plugins/apm/server/routes/errors.ts index 073a91bfe1548..710e614165aa5 100644 --- a/x-pack/plugins/apm/server/routes/errors.ts +++ b/x-pack/plugins/apm/server/routes/errors.ts @@ -11,7 +11,7 @@ import { getErrorDistribution } from '../lib/errors/distribution/get_distributio import { getErrorGroupSample } from '../lib/errors/get_error_group_sample'; import { getErrorGroups } from '../lib/errors/get_error_groups'; import { setupRequest } from '../lib/helpers/setup_request'; -import { environmentRt, uiFiltersRt, rangeRt } from './default_api_types'; +import { environmentRt, kueryRt, rangeRt } from './default_api_types'; export const errorsRoute = createRoute({ endpoint: 'GET /api/apm/services/{serviceName}/errors', @@ -25,7 +25,7 @@ export const errorsRoute = createRoute({ sortDirection: t.union([t.literal('asc'), t.literal('desc')]), }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -34,10 +34,11 @@ export const errorsRoute = createRoute({ const setup = await setupRequest(context, request); const { params } = context; const { serviceName } = params.path; - const { environment, sortField, sortDirection } = params.query; + const { environment, kuery, sortField, sortDirection } = params.query; return getErrorGroups({ environment, + kuery, serviceName, sortField, sortDirection, @@ -53,15 +54,21 @@ export const errorGroupsRoute = createRoute({ serviceName: t.string, groupId: t.string, }), - query: t.intersection([environmentRt, uiFiltersRt, rangeRt]), + query: t.intersection([environmentRt, kueryRt, rangeRt]), }), options: { tags: ['access:apm'] }, handler: async ({ context, request }) => { const setup = await setupRequest(context, request); const { serviceName, groupId } = context.params.path; - const { environment } = context.params.query; + const { environment, kuery } = context.params.query; - return getErrorGroupSample({ environment, serviceName, groupId, setup }); + return getErrorGroupSample({ + environment, + groupId, + kuery, + serviceName, + setup, + }); }, }); @@ -76,7 +83,7 @@ export const errorDistributionRoute = createRoute({ groupId: t.string, }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -85,7 +92,13 @@ export const errorDistributionRoute = createRoute({ const setup = await setupRequest(context, request); const { params } = context; const { serviceName } = params.path; - const { environment, groupId } = params.query; - return getErrorDistribution({ environment, serviceName, groupId, setup }); + const { environment, kuery, groupId } = params.query; + return getErrorDistribution({ + environment, + kuery, + serviceName, + groupId, + setup, + }); }, }); diff --git a/x-pack/plugins/apm/server/routes/metrics.ts b/x-pack/plugins/apm/server/routes/metrics.ts index 08376ed0e37ff..c7e82e13d07b8 100644 --- a/x-pack/plugins/apm/server/routes/metrics.ts +++ b/x-pack/plugins/apm/server/routes/metrics.ts @@ -9,10 +9,10 @@ import * as t from 'io-ts'; import { setupRequest } from '../lib/helpers/setup_request'; import { getMetricsChartDataByAgent } from '../lib/metrics/get_metrics_chart_data_by_agent'; import { createRoute } from './create_route'; -import { environmentRt, uiFiltersRt, rangeRt } from './default_api_types'; +import { environmentRt, kueryRt, rangeRt } from './default_api_types'; export const metricsChartsRoute = createRoute({ - endpoint: `GET /api/apm/services/{serviceName}/metrics/charts`, + endpoint: 'GET /api/apm/services/{serviceName}/metrics/charts', params: t.type({ path: t.type({ serviceName: t.string, @@ -25,7 +25,7 @@ export const metricsChartsRoute = createRoute({ serviceNodeName: t.string, }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -34,9 +34,10 @@ export const metricsChartsRoute = createRoute({ const setup = await setupRequest(context, request); const { params } = context; const { serviceName } = params.path; - const { agentName, environment, serviceNodeName } = params.query; + const { agentName, environment, kuery, serviceNodeName } = params.query; return await getMetricsChartDataByAgent({ environment, + kuery, setup, serviceName, agentName, diff --git a/x-pack/plugins/apm/server/routes/rum_client.ts b/x-pack/plugins/apm/server/routes/rum_client.ts index c9fa4253bb58e..ecf56e2aec246 100644 --- a/x-pack/plugins/apm/server/routes/rum_client.ts +++ b/x-pack/plugins/apm/server/routes/rum_client.ts @@ -6,10 +6,8 @@ */ import * as t from 'io-ts'; -import { omit } from 'lodash'; import { jsonRt } from '../../common/runtime_types/json_rt'; import { LocalUIFilterName } from '../../common/ui_filter'; -import { getEsFilter } from '../lib/helpers/convert_ui_filters/get_es_filter'; import { Setup, setupRequest, @@ -31,7 +29,7 @@ import { localUIFilterNames } from '../lib/rum_client/ui_filters/local_ui_filter import { getRumPageLoadTransactionsProjection } from '../projections/rum_page_load_transactions'; import { Projection } from '../projections/typings'; import { createRoute } from './create_route'; -import { rangeRt, uiFiltersRt } from './default_api_types'; +import { rangeRt } from './default_api_types'; import { APMRequestHandlerContext } from './typings'; export const percentileRangeRt = t.partial({ @@ -39,6 +37,8 @@ export const percentileRangeRt = t.partial({ maxPercentile: t.string, }); +const uiFiltersRt = t.type({ uiFilters: t.string }); + const uxQueryRt = t.intersection([ uiFiltersRt, rangeRt, @@ -319,10 +319,7 @@ function createLocalFiltersRoute< const projection = await getProjection({ query, context, - setup: { - ...setup, - esFilter: getEsFilter(omit(uiFilters, filterNames)), - }, + setup, }); return getLocalUIFilters({ diff --git a/x-pack/plugins/apm/server/routes/service_map.ts b/x-pack/plugins/apm/server/routes/service_map.ts index 6a05431c5677a..33943d6e05d01 100644 --- a/x-pack/plugins/apm/server/routes/service_map.ts +++ b/x-pack/plugins/apm/server/routes/service_map.ts @@ -62,7 +62,7 @@ export const serviceMapRoute = createRoute({ }); export const serviceMapServiceNodeRoute = createRoute({ - endpoint: `GET /api/apm/service-map/service/{serviceName}`, + endpoint: 'GET /api/apm/service-map/service/{serviceName}', params: t.type({ path: t.type({ serviceName: t.string, diff --git a/x-pack/plugins/apm/server/routes/service_nodes.ts b/x-pack/plugins/apm/server/routes/service_nodes.ts index 9523c89a639c4..e65b0b679da5a 100644 --- a/x-pack/plugins/apm/server/routes/service_nodes.ts +++ b/x-pack/plugins/apm/server/routes/service_nodes.ts @@ -9,7 +9,7 @@ import * as t from 'io-ts'; import { createRoute } from './create_route'; import { setupRequest } from '../lib/helpers/setup_request'; import { getServiceNodes } from '../lib/service_nodes'; -import { rangeRt, uiFiltersRt } from './default_api_types'; +import { rangeRt, kueryRt } from './default_api_types'; export const serviceNodesRoute = createRoute({ endpoint: 'GET /api/apm/services/{serviceName}/serviceNodes', @@ -17,15 +17,17 @@ export const serviceNodesRoute = createRoute({ path: t.type({ serviceName: t.string, }), - query: t.intersection([rangeRt, uiFiltersRt]), + query: t.intersection([kueryRt, rangeRt]), }), options: { tags: ['access:apm'] }, handler: async ({ context, request }) => { const setup = await setupRequest(context, request); const { params } = context; const { serviceName } = params.path; + const { kuery } = params.query; return getServiceNodes({ + kuery, setup, serviceName, }); diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts index 86f7853647894..58e6f6ccadc0a 100644 --- a/x-pack/plugins/apm/server/routes/services.ts +++ b/x-pack/plugins/apm/server/routes/services.ts @@ -30,8 +30,8 @@ import { jsonRt } from '../../common/runtime_types/json_rt'; import { comparisonRangeRt, environmentRt, + kueryRt, rangeRt, - uiFiltersRt, } from './default_api_types'; import { withApmSpan } from '../utils/with_apm_span'; import { getServiceProfilingStatistics } from '../lib/services/profiling/get_service_profiling_statistics'; @@ -45,18 +45,19 @@ import { export const servicesRoute = createRoute({ endpoint: 'GET /api/apm/services', params: t.type({ - query: t.intersection([environmentRt, uiFiltersRt, rangeRt]), + query: t.intersection([environmentRt, kueryRt, rangeRt]), }), options: { tags: ['access:apm'] }, handler: async ({ context, request }) => { const setup = await setupRequest(context, request); - const { environment } = context.params.query; + const { environment, kuery } = context.params.query; const searchAggregatedTransactions = await getSearchAggregatedTransactions( setup ); const services = await getServices({ environment, + kuery, setup, searchAggregatedTransactions, logger: context.logger, @@ -166,13 +167,20 @@ export const serviceNodeMetadataRoute = createRoute({ serviceName: t.string, serviceNodeName: t.string, }), - query: t.intersection([uiFiltersRt, rangeRt]), + query: t.intersection([kueryRt, rangeRt]), }), options: { tags: ['access:apm'] }, handler: async ({ context, request }) => { const setup = await setupRequest(context, request); const { serviceName, serviceNodeName } = context.params.path; - return getServiceNodeMetadata({ setup, serviceName, serviceNodeName }); + const { kuery } = context.params.query; + + return getServiceNodeMetadata({ + kuery, + setup, + serviceName, + serviceNodeName, + }); }, }); @@ -182,7 +190,7 @@ export const serviceAnnotationsRoute = createRoute({ path: t.type({ serviceName: t.string, }), - query: t.intersection([rangeRt, environmentRt]), + query: t.intersection([environmentRt, rangeRt]), }), options: { tags: ['access:apm'] }, handler: async ({ context, request }) => { @@ -205,10 +213,10 @@ export const serviceAnnotationsRoute = createRoute({ ]); return getServiceAnnotations({ + environment, setup, searchAggregatedTransactions, serviceName, - environment, annotationsClient, client: context.core.elasticsearch.client.asCurrentUser, logger: context.logger, @@ -285,8 +293,8 @@ export const serviceErrorGroupsPrimaryStatisticsRoute = createRoute({ }), query: t.intersection([ environmentRt, + kueryRt, rangeRt, - uiFiltersRt, t.type({ transactionType: t.string, }), @@ -298,9 +306,10 @@ export const serviceErrorGroupsPrimaryStatisticsRoute = createRoute({ const { path: { serviceName }, - query: { transactionType, environment }, + query: { kuery, transactionType, environment }, } = context.params; return getServiceErrorGroupPrimaryStatistics({ + kuery, serviceName, setup, transactionType, @@ -318,8 +327,8 @@ export const serviceErrorGroupsComparisonStatisticsRoute = createRoute({ }), query: t.intersection([ environmentRt, + kueryRt, rangeRt, - uiFiltersRt, t.type({ numBuckets: toNumberRt, transactionType: t.string, @@ -333,11 +342,12 @@ export const serviceErrorGroupsComparisonStatisticsRoute = createRoute({ const { path: { serviceName }, - query: { environment, numBuckets, transactionType, groupIds }, + query: { environment, kuery, numBuckets, transactionType, groupIds }, } = context.params; return getServiceErrorGroupComparisonStatistics({ environment, + kuery, serviceName, setup, numBuckets, @@ -356,7 +366,7 @@ export const serviceThroughputRoute = createRoute({ query: t.intersection([ t.type({ transactionType: t.string }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, comparisonRangeRt, ]), @@ -367,6 +377,7 @@ export const serviceThroughputRoute = createRoute({ const { serviceName } = context.params.path; const { environment, + kuery, transactionType, comparisonStart, comparisonEnd, @@ -378,6 +389,8 @@ export const serviceThroughputRoute = createRoute({ const { start, end } = setup; const commonProps = { + environment, + kuery, searchAggregatedTransactions, serviceName, setup, @@ -387,14 +400,12 @@ export const serviceThroughputRoute = createRoute({ const [currentPeriod, previousPeriod] = await Promise.all([ getThroughput({ ...commonProps, - environment, start, end, }), comparisonStart && comparisonEnd ? getThroughput({ ...commonProps, - environment, start: comparisonStart, end: comparisonEnd, }).then((coordinates) => @@ -427,7 +438,7 @@ export const serviceInstancesRoute = createRoute({ numBuckets: toNumberRt, }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -435,7 +446,12 @@ export const serviceInstancesRoute = createRoute({ handler: async ({ context, request }) => { const setup = await setupRequest(context, request); const { serviceName } = context.params.path; - const { environment, transactionType, numBuckets } = context.params.query; + const { + environment, + kuery, + transactionType, + numBuckets, + } = context.params.query; const latencyAggregationType = (context.params.query .latencyAggregationType as unknown) as LatencyAggregationType; @@ -445,6 +461,7 @@ export const serviceInstancesRoute = createRoute({ return getServiceInstances({ environment, + kuery, latencyAggregationType, serviceName, setup, @@ -493,13 +510,7 @@ export const serviceProfilingTimelineRoute = createRoute({ path: t.type({ serviceName: t.string, }), - query: t.intersection([ - rangeRt, - uiFiltersRt, - t.partial({ - environment: t.string, - }), - ]), + query: t.intersection([environmentRt, kueryRt, rangeRt]), }), options: { tags: ['access:apm'], @@ -509,10 +520,11 @@ export const serviceProfilingTimelineRoute = createRoute({ const { path: { serviceName }, - query: { environment }, + query: { environment, kuery }, } = context.params; return getServiceProfilingTimeline({ + kuery, setup, serviceName, environment, @@ -527,11 +539,9 @@ export const serviceProfilingStatisticsRoute = createRoute({ serviceName: t.string, }), query: t.intersection([ + environmentRt, + kueryRt, rangeRt, - uiFiltersRt, - t.partial({ - environment: t.string, - }), t.type({ valueType: t.union([ t.literal(ProfilingValueType.wallTime), @@ -553,10 +563,11 @@ export const serviceProfilingStatisticsRoute = createRoute({ const { path: { serviceName }, - query: { environment, valueType }, + query: { environment, kuery, valueType }, } = context.params; return getServiceProfilingStatistics({ + kuery, serviceName, environment, valueType, diff --git a/x-pack/plugins/apm/server/routes/traces.ts b/x-pack/plugins/apm/server/routes/traces.ts index 5d3f99be7af34..6287ffbf0c751 100644 --- a/x-pack/plugins/apm/server/routes/traces.ts +++ b/x-pack/plugins/apm/server/routes/traces.ts @@ -10,25 +10,25 @@ import { setupRequest } from '../lib/helpers/setup_request'; import { getTrace } from '../lib/traces/get_trace'; import { getTransactionGroupList } from '../lib/transaction_groups'; import { createRoute } from './create_route'; -import { environmentRt, rangeRt, uiFiltersRt } from './default_api_types'; +import { environmentRt, kueryRt, rangeRt } from './default_api_types'; import { getSearchAggregatedTransactions } from '../lib/helpers/aggregated_transactions'; import { getRootTransactionByTraceId } from '../lib/transactions/get_transaction_by_trace'; export const tracesRoute = createRoute({ endpoint: 'GET /api/apm/traces', params: t.type({ - query: t.intersection([environmentRt, rangeRt, uiFiltersRt]), + query: t.intersection([environmentRt, kueryRt, rangeRt]), }), options: { tags: ['access:apm'] }, handler: async ({ context, request }) => { const setup = await setupRequest(context, request); - const { environment } = context.params.query; + const { environment, kuery } = context.params.query; const searchAggregatedTransactions = await getSearchAggregatedTransactions( setup ); return getTransactionGroupList( - { environment, type: 'top_traces', searchAggregatedTransactions }, + { environment, kuery, type: 'top_traces', searchAggregatedTransactions }, setup ); }, diff --git a/x-pack/plugins/apm/server/routes/transactions.ts b/x-pack/plugins/apm/server/routes/transactions.ts index 960cc7f526424..330b4b4bdd12a 100644 --- a/x-pack/plugins/apm/server/routes/transactions.ts +++ b/x-pack/plugins/apm/server/routes/transactions.ts @@ -24,7 +24,7 @@ import { getThroughputCharts } from '../lib/transactions/get_throughput_charts'; import { getTransactionGroupList } from '../lib/transaction_groups'; import { getErrorRate } from '../lib/transaction_groups/get_error_rate'; import { createRoute } from './create_route'; -import { environmentRt, rangeRt, uiFiltersRt } from './default_api_types'; +import { environmentRt, kueryRt, rangeRt } from './default_api_types'; /** * Returns a list of transactions grouped by name @@ -39,7 +39,7 @@ export const transactionGroupsRoute = createRoute({ query: t.intersection([ t.type({ transactionType: t.string }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -47,7 +47,7 @@ export const transactionGroupsRoute = createRoute({ handler: async ({ context, request }) => { const setup = await setupRequest(context, request); const { serviceName } = context.params.path; - const { environment, transactionType } = context.params.query; + const { environment, kuery, transactionType } = context.params.query; const searchAggregatedTransactions = await getSearchAggregatedTransactions( setup @@ -56,6 +56,7 @@ export const transactionGroupsRoute = createRoute({ return getTransactionGroupList( { environment, + kuery, type: 'top_transactions', serviceName, transactionType, @@ -73,8 +74,8 @@ export const transactionGroupsPrimaryStatisticsRoute = createRoute({ path: t.type({ serviceName: t.string }), query: t.intersection([ environmentRt, + kueryRt, rangeRt, - uiFiltersRt, t.type({ transactionType: t.string, latencyAggregationType: latencyAggregationTypeRt, @@ -93,11 +94,12 @@ export const transactionGroupsPrimaryStatisticsRoute = createRoute({ const { path: { serviceName }, - query: { environment, latencyAggregationType, transactionType }, + query: { environment, kuery, latencyAggregationType, transactionType }, } = context.params; return getServiceTransactionGroups({ environment, + kuery, setup, serviceName, searchAggregatedTransactions, @@ -114,8 +116,8 @@ export const transactionGroupsComparisonStatisticsRoute = createRoute({ path: t.type({ serviceName: t.string }), query: t.intersection([ environmentRt, + kueryRt, rangeRt, - uiFiltersRt, t.type({ transactionNames: jsonRt.pipe(t.array(t.string)), numBuckets: toNumberRt, @@ -138,6 +140,7 @@ export const transactionGroupsComparisonStatisticsRoute = createRoute({ path: { serviceName }, query: { environment, + kuery, transactionNames, latencyAggregationType, numBuckets, @@ -147,6 +150,7 @@ export const transactionGroupsComparisonStatisticsRoute = createRoute({ return getServiceTransactionGroupComparisonStatistics({ environment, + kuery, setup, serviceName, transactionNames, @@ -173,7 +177,7 @@ export const transactionLatencyChartsRoute = createRoute({ latencyAggregationType: latencyAggregationTypeRt, }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -184,6 +188,7 @@ export const transactionLatencyChartsRoute = createRoute({ const { serviceName } = context.params.path; const { environment, + kuery, transactionType, transactionName, latencyAggregationType, @@ -195,6 +200,7 @@ export const transactionLatencyChartsRoute = createRoute({ const options = { environment, + kuery, serviceName, transactionType, transactionName, @@ -235,9 +241,9 @@ export const transactionThroughputChartsRoute = createRoute({ query: t.intersection([ t.type({ transactionType: t.string }), t.partial({ transactionName: t.string }), - uiFiltersRt, - rangeRt, environmentRt, + kueryRt, + rangeRt, ]), }), options: { tags: ['access:apm'] }, @@ -246,6 +252,7 @@ export const transactionThroughputChartsRoute = createRoute({ const { serviceName } = context.params.path; const { environment, + kuery, transactionType, transactionName, } = context.params.query; @@ -256,6 +263,7 @@ export const transactionThroughputChartsRoute = createRoute({ return await getThroughputCharts({ environment, + kuery, serviceName, transactionType, transactionName, @@ -282,7 +290,7 @@ export const transactionChartsDistributionRoute = createRoute({ traceId: t.string, }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -292,6 +300,7 @@ export const transactionChartsDistributionRoute = createRoute({ const { serviceName } = context.params.path; const { environment, + kuery, transactionType, transactionName, transactionId = '', @@ -304,6 +313,7 @@ export const transactionChartsDistributionRoute = createRoute({ return getTransactionDistribution({ environment, + kuery, serviceName, transactionType, transactionName, @@ -325,7 +335,7 @@ export const transactionChartsBreakdownRoute = createRoute({ t.type({ transactionType: t.string }), t.partial({ transactionName: t.string }), environmentRt, - uiFiltersRt, + kueryRt, rangeRt, ]), }), @@ -335,12 +345,14 @@ export const transactionChartsBreakdownRoute = createRoute({ const { serviceName } = context.params.path; const { environment, + kuery, transactionName, transactionType, } = context.params.query; return getTransactionBreakdown({ environment, + kuery, serviceName, transactionName, transactionType, @@ -358,7 +370,7 @@ export const transactionChartsErrorRateRoute = createRoute({ }), query: t.intersection([ environmentRt, - uiFiltersRt, + kueryRt, rangeRt, t.type({ transactionType: t.string }), t.partial({ transactionName: t.string }), @@ -369,7 +381,12 @@ export const transactionChartsErrorRateRoute = createRoute({ const setup = await setupRequest(context, request); const { params } = context; const { serviceName } = params.path; - const { environment, transactionType, transactionName } = params.query; + const { + environment, + kuery, + transactionType, + transactionName, + } = params.query; const searchAggregatedTransactions = await getSearchAggregatedTransactions( setup @@ -377,6 +394,7 @@ export const transactionChartsErrorRateRoute = createRoute({ return getErrorRate({ environment, + kuery, serviceName, transactionType, transactionName, diff --git a/x-pack/plugins/apm/common/utils/queries.test.ts b/x-pack/plugins/apm/server/utils/queries.test.ts similarity index 85% rename from x-pack/plugins/apm/common/utils/queries.test.ts rename to x-pack/plugins/apm/server/utils/queries.test.ts index 546c8627def69..9fa97940db8f3 100644 --- a/x-pack/plugins/apm/common/utils/queries.test.ts +++ b/x-pack/plugins/apm/server/utils/queries.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { SERVICE_ENVIRONMENT } from '../elasticsearch_fieldnames'; -import { ENVIRONMENT_NOT_DEFINED } from '../environment_filter_values'; +import { SERVICE_ENVIRONMENT } from '../../common/elasticsearch_fieldnames'; +import { ENVIRONMENT_NOT_DEFINED } from '../../common/environment_filter_values'; import { environmentQuery } from './queries'; describe('environmentQuery', () => { diff --git a/x-pack/plugins/apm/common/utils/queries.ts b/x-pack/plugins/apm/server/utils/queries.ts similarity index 73% rename from x-pack/plugins/apm/common/utils/queries.ts rename to x-pack/plugins/apm/server/utils/queries.ts index dbbbf324b964a..6eab50d089821 100644 --- a/x-pack/plugins/apm/common/utils/queries.ts +++ b/x-pack/plugins/apm/server/utils/queries.ts @@ -5,12 +5,13 @@ * 2.0. */ +import { esKuery } from '../../../../../src/plugins/data/server'; import { ESFilter } from '../../../../typings/elasticsearch'; +import { SERVICE_ENVIRONMENT } from '../../common/elasticsearch_fieldnames'; import { - ENVIRONMENT_NOT_DEFINED, ENVIRONMENT_ALL, -} from '../environment_filter_values'; -import { SERVICE_ENVIRONMENT } from '../elasticsearch_fieldnames'; + ENVIRONMENT_NOT_DEFINED, +} from '../../common/environment_filter_values'; type QueryContainer = ESFilter; @@ -43,3 +44,12 @@ export function rangeQuery( }, ]; } + +export function kqlQuery(kql?: string) { + if (!kql) { + return []; + } + + const ast = esKuery.fromKueryExpression(kql); + return [esKuery.toElasticsearchQuery(ast) as ESFilter]; +} diff --git a/x-pack/plugins/apm/server/utils/test_helpers.tsx b/x-pack/plugins/apm/server/utils/test_helpers.tsx index 4df638cc2c5df..e804183c78867 100644 --- a/x-pack/plugins/apm/server/utils/test_helpers.tsx +++ b/x-pack/plugins/apm/server/utils/test_helpers.tsx @@ -8,7 +8,6 @@ import { APMConfig } from '../'; import { PromiseReturnType } from '../../../observability/typings/common'; import { - ESFilter, ESSearchRequest, ESSearchResponse, } from '../../../../typings/elasticsearch'; @@ -27,7 +26,6 @@ interface MockSetup { internalClient: any; config: APMConfig; uiFilters: UIFilters; - esFilter: ESFilter[]; indices: { /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': string; @@ -89,7 +87,6 @@ export async function inspectSearchParams( } ) as APMConfig, uiFilters: {}, - esFilter: [{ term: { 'service.environment': 'test' } }], indices: { /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'myIndex', diff --git a/x-pack/test/apm_api_integration/tests/feature_controls.ts b/x-pack/test/apm_api_integration/tests/feature_controls.ts index 45114dd506716..e82b14d6cb7e6 100644 --- a/x-pack/test/apm_api_integration/tests/feature_controls.ts +++ b/x-pack/test/apm_api_integration/tests/feature_controls.ts @@ -44,39 +44,39 @@ export default function featureControlsTests({ getService }: FtrProviderContext) { // this doubles as a smoke test for the _debug query parameter req: { - url: `/api/apm/services/foo/errors?start=${start}&end=${end}&uiFilters=%7B%7D&_debug=true`, + url: `/api/apm/services/foo/errors?start=${start}&end=${end}&_debug=true`, }, expectForbidden: expect403, expectResponse: expect200, }, { - req: { url: `/api/apm/services/foo/errors/bar?start=${start}&end=${end}&uiFilters=%7B%7D` }, + req: { url: `/api/apm/services/foo/errors/bar?start=${start}&end=${end}` }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/errors/distribution?start=${start}&end=${end}&groupId=bar&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/errors/distribution?start=${start}&end=${end}&groupId=bar`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/errors/distribution?start=${start}&end=${end}&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/errors/distribution?start=${start}&end=${end}`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/metrics/charts?start=${start}&end=${end}&agentName=cool-agent&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/metrics/charts?start=${start}&end=${end}&agentName=cool-agent`, }, expectForbidden: expect403, expectResponse: expect200, }, { - req: { url: `/api/apm/services?start=${start}&end=${end}&uiFilters=%7B%7D` }, + req: { url: `/api/apm/services?start=${start}&end=${end}` }, expectForbidden: expect403, expectResponse: expect200, }, @@ -91,7 +91,7 @@ export default function featureControlsTests({ getService }: FtrProviderContext) expectResponse: expect200, }, { - req: { url: `/api/apm/traces?start=${start}&end=${end}&uiFilters=%7B%7D` }, + req: { url: `/api/apm/traces?start=${start}&end=${end}` }, expectForbidden: expect403, expectResponse: expect200, }, @@ -102,42 +102,42 @@ export default function featureControlsTests({ getService }: FtrProviderContext) }, { req: { - url: `/api/apm/services/foo/transactions/groups?start=${start}&end=${end}&transactionType=bar&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/transactions/groups?start=${start}&end=${end}&transactionType=bar`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=bar&latencyAggregationType=avg&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=bar&latencyAggregationType=avg`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=bar&latencyAggregationType=avg&transactionName=baz&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=bar&latencyAggregationType=avg&transactionName=baz`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/transactions/charts/throughput?environment=testing&start=${start}&end=${end}&transactionType=bar&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/transactions/charts/throughput?environment=testing&start=${start}&end=${end}&transactionType=bar`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/transactions/charts/throughput?environment=testing&start=${start}&end=${end}&transactionType=bar&transactionName=baz&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/transactions/charts/throughput?environment=testing&start=${start}&end=${end}&transactionType=bar&transactionName=baz`, }, expectForbidden: expect403, expectResponse: expect200, }, { req: { - url: `/api/apm/services/foo/transactions/charts/distribution?start=${start}&end=${end}&transactionType=bar&transactionName=baz&uiFilters=%7B%7D`, + url: `/api/apm/services/foo/transactions/charts/distribution?start=${start}&end=${end}&transactionType=bar&transactionName=baz`, }, expectForbidden: expect403, expectResponse: expect200, diff --git a/x-pack/test/apm_api_integration/tests/metrics_charts/metrics_charts.ts b/x-pack/test/apm_api_integration/tests/metrics_charts/metrics_charts.ts index 78dc0fa44c5de..b767eaae1c203 100644 --- a/x-pack/test/apm_api_integration/tests/metrics_charts/metrics_charts.ts +++ b/x-pack/test/apm_api_integration/tests/metrics_charts/metrics_charts.ts @@ -27,14 +27,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('for opbeans-node', () => { const start = encodeURIComponent('2020-09-08T14:50:00.000Z'); const end = encodeURIComponent('2020-09-08T14:55:00.000Z'); - const uiFilters = encodeURIComponent(JSON.stringify({})); const agentName = 'nodejs'; describe('returns metrics data', () => { let chartsResponse: ChartResponse; before(async () => { chartsResponse = await supertest.get( - `/api/apm/services/opbeans-node/metrics/charts?start=${start}&end=${end}&uiFilters=${uiFilters}&agentName=${agentName}` + `/api/apm/services/opbeans-node/metrics/charts?start=${start}&end=${end}&agentName=${agentName}` ); }); it('contains CPU usage and System memory usage chart data', async () => { @@ -113,7 +112,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('for opbeans-java', () => { - const uiFilters = encodeURIComponent(JSON.stringify({})); const agentName = 'java'; describe('returns metrics data', () => { @@ -123,7 +121,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let chartsResponse: ChartResponse; before(async () => { chartsResponse = await supertest.get( - `/api/apm/services/opbeans-java/metrics/charts?start=${start}&end=${end}&uiFilters=${uiFilters}&agentName=${agentName}` + `/api/apm/services/opbeans-java/metrics/charts?start=${start}&end=${end}&agentName=${agentName}` ); }); @@ -412,7 +410,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const end = encodeURIComponent('2020-09-08T15:05:00.000Z'); const chartsResponse: ChartResponse = await supertest.get( - `/api/apm/services/opbeans-java/metrics/charts?start=${start}&end=${end}&uiFilters=${uiFilters}&agentName=${agentName}` + `/api/apm/services/opbeans-java/metrics/charts?start=${start}&end=${end}&agentName=${agentName}` ); const systemMemoryUsageChart = chartsResponse.body.charts.find( diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances.ts index cca40a6950007..8ff493b5575b0 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances.ts @@ -40,7 +40,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { end, numBuckets: 20, transactionType: 'request', - uiFilters: '{}', }, }) ); @@ -69,7 +68,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { end, numBuckets: 20, transactionType: 'request', - uiFilters: '{}', }, }) ); @@ -153,7 +151,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { end, numBuckets: 20, transactionType: 'request', - uiFilters: '{}', }, }) ); diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts index a13a76e2ddb46..4a19efac5a809 100644 --- a/x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts @@ -39,7 +39,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, transactionType: 'request', groupIds: JSON.stringify(groupIds), @@ -63,7 +62,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, transactionType: 'request', groupIds: JSON.stringify(groupIds), @@ -94,7 +92,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, transactionType: 'request', groupIds: JSON.stringify(['foo']), diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts index 8a334ca567f0e..61a44619ea905 100644 --- a/x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts @@ -32,7 +32,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', transactionType: 'request', }, }) @@ -58,7 +57,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', transactionType: 'request', environment: 'production', }, diff --git a/x-pack/test/apm_api_integration/tests/services/throughput.ts b/x-pack/test/apm_api_integration/tests/services/throughput.ts index 787436ea37b05..4f568aafe33cc 100644 --- a/x-pack/test/apm_api_integration/tests/services/throughput.ts +++ b/x-pack/test/apm_api_integration/tests/services/throughput.ts @@ -29,7 +29,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { `/api/apm/services/opbeans-java/throughput?${qs.stringify({ start: metadata.start, end: metadata.end, - uiFilters: encodeURIComponent('{}'), transactionType: 'request', })}` ); @@ -49,7 +48,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { `/api/apm/services/opbeans-java/throughput?${qs.stringify({ start: metadata.start, end: metadata.end, - uiFilters: encodeURIComponent('{}'), transactionType: 'request', })}` ); @@ -96,7 +94,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { before(async () => { const response = await supertest.get( `/api/apm/services/opbeans-java/throughput?${qs.stringify({ - uiFilters: encodeURIComponent('{}'), transactionType: 'request', start: moment(metadata.end).subtract(15, 'minutes').toISOString(), end: metadata.end, diff --git a/x-pack/test/apm_api_integration/tests/services/top_services.ts b/x-pack/test/apm_api_integration/tests/services/top_services.ts index 3afaec653fcb3..3896bc1c6fabc 100644 --- a/x-pack/test/apm_api_integration/tests/services/top_services.ts +++ b/x-pack/test/apm_api_integration/tests/services/top_services.ts @@ -25,16 +25,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { const start = encodeURIComponent(range.start); const end = encodeURIComponent(range.end); - const uiFilters = encodeURIComponent(JSON.stringify({})); - registry.when( 'APM Services Overview with a basic license when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles the empty state', async () => { - const response = await supertest.get( - `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` - ); + const response = await supertest.get(`/api/apm/services?start=${start}&end=${end}`); expect(response.status).to.be(200); expect(response.body.hasHistoricalData).to.be(false); @@ -56,9 +52,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let sortedItems: typeof response.body.items; before(async () => { - response = await supertest.get( - `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` - ); + response = await supertest.get(`/api/apm/services?start=${start}&end=${end}`); sortedItems = sortBy(response.body.items, 'serviceName'); }); @@ -273,9 +267,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }; before(async () => { - response = await supertest.get( - `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` - ); + response = await supertest.get(`/api/apm/services?start=${start}&end=${end}`); }); it('the response is successful', () => { @@ -321,7 +313,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let response: PromiseReturnType; before(async () => { response = await supertestAsApmReadUserWithoutMlAccess.get( - `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` + `/api/apm/services?start=${start}&end=${end}` ); }); @@ -346,8 +338,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { let response: PromiseReturnType; before(async () => { response = await supertest.get( - `/api/apm/services?environment=ENVIRONMENT_ALL&start=${start}&end=${end}&uiFilters=${encodeURIComponent( - `{"kuery":"service.name:opbeans-java"}` + `/api/apm/services?environment=ENVIRONMENT_ALL&start=${start}&end=${end}&kuery=${encodeURIComponent( + 'service.name:opbeans-java' )}` ); }); diff --git a/x-pack/test/apm_api_integration/tests/traces/top_traces.ts b/x-pack/test/apm_api_integration/tests/traces/top_traces.ts index fb19c74e05cf4..40f87be3dc402 100644 --- a/x-pack/test/apm_api_integration/tests/traces/top_traces.ts +++ b/x-pack/test/apm_api_integration/tests/traces/top_traces.ts @@ -20,13 +20,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { // url parameters const start = encodeURIComponent(metadata.start); const end = encodeURIComponent(metadata.end); - const uiFilters = encodeURIComponent(JSON.stringify({})); registry.when('Top traces when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles empty state', async () => { - const response = await supertest.get( - `/api/apm/traces?start=${start}&end=${end}&uiFilters=${uiFilters}` - ); + const response = await supertest.get(`/api/apm/traces?start=${start}&end=${end}`); expect(response.status).to.be(200); expect(response.body.items.length).to.be(0); @@ -40,9 +37,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { () => { let response: any; before(async () => { - response = await supertest.get( - `/api/apm/traces?start=${start}&end=${end}&uiFilters=${uiFilters}` - ); + response = await supertest.get(`/api/apm/traces?start=${start}&end=${end}`); }); it('returns the correct status code', async () => { diff --git a/x-pack/test/apm_api_integration/tests/transactions/breakdown.ts b/x-pack/test/apm_api_integration/tests/transactions/breakdown.ts index 90ade5bb9c8a9..8e29004deb4f3 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/breakdown.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/breakdown.ts @@ -20,12 +20,11 @@ export default function ApiTest({ getService }: FtrProviderContext) { const end = encodeURIComponent(metadata.end); const transactionType = 'request'; const transactionName = 'GET /api'; - const uiFilters = encodeURIComponent(JSON.stringify({})); registry.when('Breakdown when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles the empty state', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}` + `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&transactionType=${transactionType}` ); expect(response.status).to.be(200); expect(response.body).to.eql({ timeseries: [] }); @@ -35,7 +34,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when('when data is loaded', { config: 'basic', archives: [archiveName] }, () => { it('returns the transaction breakdown for a service', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}` + `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&transactionType=${transactionType}` ); expect(response.status).to.be(200); @@ -43,7 +42,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns the transaction breakdown for a transaction group', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}&transactionName=${transactionName}` + `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&transactionType=${transactionType}&transactionName=${transactionName}` ); expect(response.status).to.be(200); @@ -102,7 +101,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns the transaction breakdown sorted by name', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}` + `/api/apm/services/opbeans-node/transaction/charts/breakdown?start=${start}&end=${end}&transactionType=${transactionType}` ); expect(response.status).to.be(200); diff --git a/x-pack/test/apm_api_integration/tests/transactions/distribution.ts b/x-pack/test/apm_api_integration/tests/transactions/distribution.ts index 56d5e217068a4..770fc90267680 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/distribution.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/distribution.ts @@ -21,7 +21,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { const url = `/api/apm/services/opbeans-java/transactions/charts/distribution?${qs.stringify({ start: metadata.start, end: metadata.end, - uiFilters: encodeURIComponent('{}'), transactionName: 'APIRestController#stats', transactionType: 'request', })}`; diff --git a/x-pack/test/apm_api_integration/tests/transactions/error_rate.ts b/x-pack/test/apm_api_integration/tests/transactions/error_rate.ts index 73b40648b5377..2b94816466aa7 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/error_rate.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/error_rate.ts @@ -19,12 +19,11 @@ export default function ApiTest({ getService }: FtrProviderContext) { // url parameters const { start, end } = archives_metadata[archiveName]; - const uiFilters = '{}'; const transactionType = 'request'; const url = format({ pathname: '/api/apm/services/opbeans-java/transactions/charts/error_rate', - query: { start, end, uiFilters, transactionType }, + query: { start, end, transactionType }, }); registry.when('Error rate when data is not loaded', { config: 'basic', archives: [] }, () => { diff --git a/x-pack/test/apm_api_integration/tests/transactions/latency.ts b/x-pack/test/apm_api_integration/tests/transactions/latency.ts index 523139717b309..4b9409ce6f16b 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/latency.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/latency.ts @@ -26,10 +26,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { 'Latency with a basic license when data is not loaded ', { config: 'basic', archives: [] }, () => { - const uiFilters = encodeURIComponent(JSON.stringify({})); it('returns 400 when latencyAggregationType is not informed', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=request` + `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=request` ); expect(response.status).to.be(400); @@ -37,7 +36,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns 400 when transactionType is not informed', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&uiFilters=${uiFilters}&latencyAggregationType=avg` + `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&latencyAggregationType=avg` ); expect(response.status).to.be(400); @@ -45,7 +44,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('handles the empty state', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&uiFilters=${uiFilters}&latencyAggregationType=avg&transactionType=request` + `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&latencyAggregationType=avg&transactionType=request` ); expect(response.status).to.be(200); @@ -62,12 +61,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { () => { let response: PromiseReturnType; - const uiFilters = encodeURIComponent(JSON.stringify({})); - describe('average latency type', () => { before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=request&latencyAggregationType=avg` + `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=request&latencyAggregationType=avg` ); }); @@ -81,7 +78,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('95th percentile latency type', () => { before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=request&latencyAggregationType=p95` + `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=request&latencyAggregationType=p95` ); }); @@ -95,7 +92,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('99th percentile latency type', () => { before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=request&latencyAggregationType=p99` + `/api/apm/services/opbeans-node/transactions/charts/latency?environment=testing&start=${start}&end=${end}&transactionType=request&latencyAggregationType=p99` ); }); @@ -117,10 +114,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { const transactionType = 'request'; describe('without an environment', () => { - const uiFilters = encodeURIComponent(JSON.stringify({})); before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-java/transactions/charts/latency?start=${start}&end=${end}&transactionType=${transactionType}&uiFilters=${uiFilters}&latencyAggregationType=avg` + `/api/apm/services/opbeans-java/transactions/charts/latency?start=${start}&end=${end}&transactionType=${transactionType}&latencyAggregationType=avg` ); }); @@ -129,22 +125,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - describe('without uiFilters', () => { - before(async () => { - response = await supertest.get( - `/api/apm/services/opbeans-java/transactions/charts/latency?start=${start}&end=${end}&transactionType=${transactionType}&latencyAggregationType=avg` - ); - }); - it('should return an error response', () => { - expect(response.status).to.eql(400); - }); - }); - describe('with environment selected', () => { - const uiFilters = encodeURIComponent(JSON.stringify({})); before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-java/transactions/charts/latency?environment=production&start=${start}&end=${end}&transactionType=${transactionType}&uiFilters=${uiFilters}&latencyAggregationType=avg` + `/api/apm/services/opbeans-java/transactions/charts/latency?environment=production&start=${start}&end=${end}&transactionType=${transactionType}&latencyAggregationType=avg` ); }); @@ -168,10 +152,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('when not defined environment is selected', () => { - const uiFilters = encodeURIComponent(JSON.stringify({})); before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-python/transactions/charts/latency?environment=ENVIRONMENT_NOT_DEFINED&start=${start}&end=${end}&transactionType=${transactionType}&uiFilters=${uiFilters}&latencyAggregationType=avg` + `/api/apm/services/opbeans-python/transactions/charts/latency?environment=ENVIRONMENT_NOT_DEFINED&start=${start}&end=${end}&transactionType=${transactionType}&latencyAggregationType=avg` ); }); @@ -194,10 +177,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('with all environments selected', () => { - const uiFilters = encodeURIComponent(JSON.stringify({})); before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-java/transactions/charts/latency?environment=ENVIRONMENT_ALL&start=${start}&end=${end}&transactionType=${transactionType}&uiFilters=${uiFilters}&latencyAggregationType=avg` + `/api/apm/services/opbeans-java/transactions/charts/latency?environment=ENVIRONMENT_ALL&start=${start}&end=${end}&transactionType=${transactionType}&latencyAggregationType=avg` ); }); @@ -211,10 +193,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('with environment selected and empty kuery filter', () => { - const uiFilters = encodeURIComponent(JSON.stringify({ kuery: '' })); before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-java/transactions/charts/latency?environment=production&start=${start}&end=${end}&transactionType=${transactionType}&uiFilters=${uiFilters}&latencyAggregationType=avg` + `/api/apm/services/opbeans-java/transactions/charts/latency?environment=production&start=${start}&end=${end}&transactionType=${transactionType}&latencyAggregationType=avg` ); }); diff --git a/x-pack/test/apm_api_integration/tests/transactions/throughput.ts b/x-pack/test/apm_api_integration/tests/transactions/throughput.ts index 430392a32bfb8..5c2de185fdf79 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/throughput.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/throughput.ts @@ -20,7 +20,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { // url parameters const { start, end } = metadata; - const uiFilters = JSON.stringify({}); registry.when('Throughput when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles the empty state', async () => { @@ -31,7 +30,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { environment: 'testing', start, end, - uiFilters, transactionType: 'request', }, }) @@ -57,7 +55,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { environment: 'testing', start, end, - uiFilters, transactionType: 'request', }, }) diff --git a/x-pack/test/apm_api_integration/tests/transactions/top_transaction_groups.ts b/x-pack/test/apm_api_integration/tests/transactions/top_transaction_groups.ts index 165853203429f..32effa64e60db 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/top_transaction_groups.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/top_transaction_groups.ts @@ -24,7 +24,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { // url parameters const start = encodeURIComponent(metadata.start); const end = encodeURIComponent(metadata.end); - const uiFilters = encodeURIComponent(JSON.stringify({})); const transactionType = 'request'; registry.when( @@ -33,7 +32,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { () => { it('handles empty state', async () => { const response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/groups?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}` + `/api/apm/services/opbeans-node/transactions/groups?start=${start}&end=${end}&transactionType=${transactionType}` ); expect(response.status).to.be(200); @@ -51,7 +50,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let response: any; before(async () => { response = await supertest.get( - `/api/apm/services/opbeans-node/transactions/groups?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}` + `/api/apm/services/opbeans-node/transactions/groups?start=${start}&end=${end}&transactionType=${transactionType}` ); }); diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts index 414e2189a63fe..fdc499594aad0 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts @@ -33,7 +33,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, latencyAggregationType: 'avg', transactionType: 'request', @@ -59,7 +58,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, transactionType: 'request', latencyAggregationType: 'avg', @@ -103,7 +101,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, transactionType: 'request', latencyAggregationType: 'p99', @@ -141,7 +138,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', numBuckets: 20, transactionType: 'request', latencyAggregationType: 'avg', diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts index 7d8417bc5bf63..b6fd4054a351c 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts @@ -32,7 +32,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', latencyAggregationType: 'avg', transactionType: 'request', }, @@ -58,7 +57,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', transactionType: 'request', latencyAggregationType: 'avg', }, @@ -131,7 +129,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { query: { start, end, - uiFilters: '{}', transactionType: 'request', latencyAggregationType: 'p99', }, From d847958fb30bc29edc4301f7720c1178686c21ac Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Tue, 23 Feb 2021 12:06:46 -0800 Subject: [PATCH 15/45] [ci] disable firefox scripts from security cypress job (#92483) Temporarily disabling security solution Firefox tests. Seem to be race conditions present in the Firefox run specifically causing flake. --- .ci/Jenkinsfile_security_cypress | 3 ++- vars/tasks.groovy | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile_security_cypress b/.ci/Jenkinsfile_security_cypress index 9202af60c1571..811af44d1ca56 100644 --- a/.ci/Jenkinsfile_security_cypress +++ b/.ci/Jenkinsfile_security_cypress @@ -18,7 +18,8 @@ kibanaPipeline(timeoutMinutes: 180) { workers.ci(name: job, size: 'l', ramDisk: true) { kibanaPipeline.bash('test/scripts/jenkins_xpack_build_kibana.sh', 'Build Default Distributable') kibanaPipeline.functionalTestProcess(job, 'test/scripts/jenkins_security_solution_cypress_chrome.sh')() - kibanaPipeline.functionalTestProcess(job, 'test/scripts/jenkins_security_solution_cypress_firefox.sh')() + // Temporarily disabled to figure out test flake + // kibanaPipeline.functionalTestProcess(job, 'test/scripts/jenkins_security_solution_cypress_firefox.sh')() } } } diff --git a/vars/tasks.groovy b/vars/tasks.groovy index f782ffdd8c5e6..a61035403dabd 100644 --- a/vars/tasks.groovy +++ b/vars/tasks.groovy @@ -127,7 +127,8 @@ def functionalXpack(Map params = [:]) { ]) { if (githubPr.isPr()) { task(kibanaPipeline.functionalTestProcess('xpack-securitySolutionCypressChrome', './test/scripts/jenkins_security_solution_cypress_chrome.sh')) - task(kibanaPipeline.functionalTestProcess('xpack-securitySolutionCypressFirefox', './test/scripts/jenkins_security_solution_cypress_firefox.sh')) + // Temporarily disabled to figure out test flake + // task(kibanaPipeline.functionalTestProcess('xpack-securitySolutionCypressFirefox', './test/scripts/jenkins_security_solution_cypress_firefox.sh')) } } } From 535686607bc132ce697af731478b5dbc8079e569 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 23 Feb 2021 12:25:47 -0800 Subject: [PATCH 16/45] [build] Clean tsbuildinfo from distribution (#92115) Signed-off-by: Tyler Smalley --- src/dev/build/tasks/clean_tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/build/tasks/clean_tasks.ts b/src/dev/build/tasks/clean_tasks.ts index f555b36ef26c7..3051579d2e6f8 100644 --- a/src/dev/build/tasks/clean_tasks.ts +++ b/src/dev/build/tasks/clean_tasks.ts @@ -45,7 +45,7 @@ export const CleanTypescript: Task = { 'Deleted %d files', await scanDelete({ directory: build.resolvePath(), - regularExpressions: [/\.(ts|tsx|d\.ts)$/, /tsconfig.*\.json$/], + regularExpressions: [/\.(ts|tsx|d\.ts)$/, /tsconfig.*\.(json|tsbuildinfo)$/], }) ); }, From 9a72090ecff9ac3ef1c0efa00841301a63a7da5d Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Tue, 23 Feb 2021 16:29:16 -0500 Subject: [PATCH 17/45] Add ECS audit logging config settings to docker kibana vars (#92497) --- .../resources/base/bin/kibana-docker | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker index 1598f00354bf8..bac44f6b9c221 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker +++ b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker @@ -260,6 +260,20 @@ kibana_vars=( xpack.rollup.enabled xpack.searchprofiler.enabled xpack.security.audit.enabled + xpack.security.audit.appender.type + xpack.security.audit.appender.layout.type + xpack.security.audit.appender.layout.highlight + xpack.security.audit.appender.layout.pattern + xpack.security.audit.appender.legacyLoggingConfig + xpack.security.audit.appender.fileName + xpack.security.audit.appender.policy.type + xpack.security.audit.appender.policy.interval + xpack.security.audit.appender.policy.modulate + xpack.security.audit.appender.policy.size + xpack.security.audit.appender.strategy.type + xpack.security.audit.appender.strategy.max + xpack.security.audit.appender.strategy.pattern + xpack.security.audit.ignore_filters xpack.security.authc.oidc.realm xpack.security.authc.providers xpack.security.authc.saml.maxRedirectURLSize From 0c3d30ccedb60e629f3ce85a54238048277f7409 Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Tue, 23 Feb 2021 17:16:48 -0500 Subject: [PATCH 18/45] [Security Solution] [Detections] Adds integration test to ensure max_signals param is obeyed (#92489) --- .../security_and_spaces/tests/generating_signals.ts | 13 +++++++++++++ .../test/detection_engine_api_integration/utils.ts | 10 ++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts index 5dd32600a7938..08fb9222e1789 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts @@ -70,6 +70,19 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).greaterThan(0); }); + it('should abide by max_signals > 100', async () => { + const maxSignals = 500; + const rule: QueryCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + max_signals: maxSignals, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, maxSignals, [id]); + const signalsOpen = await getSignalsByIds(supertest, [id], maxSignals); + expect(signalsOpen.hits.hits.length).equal(maxSignals); + }); + it('should have recorded the rule_id within the signal', async () => { const rule: QueryCreateSchema = { ...getRuleForSignalTesting(['auditbeat-*']), diff --git a/x-pack/test/detection_engine_api_integration/utils.ts b/x-pack/test/detection_engine_api_integration/utils.ts index 684cbb6368ad9..7711338b44697 100644 --- a/x-pack/test/detection_engine_api_integration/utils.ts +++ b/x-pack/test/detection_engine_api_integration/utils.ts @@ -226,7 +226,8 @@ export const getQuerySignalsRuleId = (ruleIds: string[]) => ({ * created from that rule's regular id. * @param ruleIds The rule_id to search for signals */ -export const getQuerySignalsId = (ids: string[]) => ({ +export const getQuerySignalsId = (ids: string[], size = 10) => ({ + size, query: { terms: { 'signal.rule.id': ids, @@ -1009,7 +1010,7 @@ export const waitForSignalsToBePresent = async ( signalIds: string[] ): Promise => { await waitFor(async () => { - const signalsOpen = await getSignalsByIds(supertest, signalIds); + const signalsOpen = await getSignalsByIds(supertest, signalIds, numberOfSignals); return signalsOpen.hits.hits.length >= numberOfSignals; }, 'waitForSignalsToBePresent'); }; @@ -1043,7 +1044,8 @@ export const getSignalsByRuleIds = async ( */ export const getSignalsByIds = async ( supertest: SuperTest, - ids: string[] + ids: string[], + size?: number ): Promise< SearchResponse<{ signal: Signal; @@ -1053,7 +1055,7 @@ export const getSignalsByIds = async ( const { body: signalsOpen }: { body: SearchResponse<{ signal: Signal }> } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQuerySignalsId(ids)) + .send(getQuerySignalsId(ids, size)) .expect(200); return signalsOpen; }; From b1eac3cd8409ff9f47f05f3854694085b4282636 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Tue, 23 Feb 2021 14:19:47 -0800 Subject: [PATCH 19/45] [DOCS] Updates refresh text in index pattern doc (#92469) --- docs/management/index-patterns.asciidoc | 13 +++++-------- .../images/new-index-pattern.png | Bin 129062 -> 113824 bytes 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/management/index-patterns.asciidoc b/docs/management/index-patterns.asciidoc index 28dbacc628ce9..88dbf6ec8761f 100644 --- a/docs/management/index-patterns.asciidoc +++ b/docs/management/index-patterns.asciidoc @@ -139,6 +139,10 @@ which indicates the type of data the field contains in {es}, such as strings or boolean values. The field mapping also determines how you can use the field, such as whether it can be searched or aggregated. +When a new field is added to the index, the index pattern field list is updated +the next time the index pattern is loaded, for example, when you load the page or +move between {kib} apps. + [role="screenshot"] image:management/index-patterns/images/new-index-pattern.png["Create index pattern"] @@ -158,7 +162,7 @@ date values in {es}, you can use a {kib} field formatter to change the display t <>, and <>. -To customize the displayed field name provided by {es}, you can +To customize the displayed field name provided by {es}, you can use *Custom Label* . A popularity counter keeps track of the fields you use most often. @@ -170,13 +174,6 @@ To edit the field display, click the edit icon [role="screenshot"] image:management/index-patterns/images/edit-field-format.png["Edit field format"] -[float] -==== Refresh the data fields - -To pick up newly-added fields, -refresh (image:management/index-patterns/images/refresh-icon.png[Refresh icon]) the index fields list. -This action also resets the {kib} popularity counters for the fields. - [float] [[default-index-pattern]] === Set the default index pattern diff --git a/docs/management/index-patterns/images/new-index-pattern.png b/docs/management/index-patterns/images/new-index-pattern.png index 1bd0344826994b0aa7fb84bb294cbb810dbf95ff..e0365a22b0b147b4b855ddbb519e62e3eae3e883 100644 GIT binary patch literal 113824 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
imvc$3VYt7vWeOLGIh*H>j8hPL zsO_P0Qf8aD4LCodGT5s{&X6ACUM(%GuX~WkO-#MTiqtpva+&eMLh01u{t&Ohz%t?6 zLi)1{bcW+jEe>b-y2gb=Rl&aAe$k@WNb#mzypD&}G15Yj@fQu)h=qkbsTBEIy*^`p zsx<8mtG1Tqql=ZivJh!Id4mYec9$72sz%EpdIDn+Uy$bmM((agpYg_vrvS-S$SVXo z8VMWN6b_@**8XUJZVhJFH@d<*y@B(Nr$i@<9Zgh9j|p0B z55q)J@y^MtH3>GpYHyFoC=QO>K3?*zisC_S_{KA>j@S|I*qUy;g^iZ#k}Qs<{9@TJ z_qb`;y#wN5Bo|XCpLFUqiA@>~^O{KJbClio=9P$= zJO>ZV5`$F-;m~ChNyf2jQT@jp(?)(C5RHec&rWC-cUr%&)T^>>IfhI`vt^QY%_X)ypc}Af!INq<0Q68C)0!bfqHz>i8&-9rr!s4 zPKl??7UM5L|Ab!1E_i?jb;7YvpiDSd8KT-tkDt8_ zxm6$D(qS-NM;4`6s$e5PRH1v7TL<&amQGW~x*}0u4{gKULYf031ih)$YT6tp-y_em z#MN)W{{`ds*4T<_Kio)tX#%Ki6@Qc&Laf80f1o7FvUZtdxvJw66UT>s zrPkja&E_R@mN%DpHlNvY(-JX_UVWi-89+F-&@qX+)MAGC;U$;EqgF|;8$C^iUrWer zIV%R<+ituva=Yh#OIoa844nRB~eGH1&=)|n#u9ONba1ng3XCY9&Nc?PE==|OM_TL|nU06x3~$~=T;rP8Eh>(@AJYq06DCBpwX z5Q<9dNjQfis7ax@yd{O+=A30;LqH=rZWw^6x>&Ae!cm{+iyB#0{Dlxj0t3!uG=2sQ z=1V&g=d`iFYe`$IIxfxd0jw?kxlw0B_g||w)V^}Qlmj4`D*}W&Xd5C z7?o0$oHS%>iqYqXzwuy6z)c?|D5Jze*{hHru(=$>3)pE?aPa(gjVLlDOONF#P2g;P zsCv-$I!U}lJh@eWOB&X|s|-s2_Xu7h*m;3|t(6?_er{)H^}@V2D47nuKGGQshC@hv zrz@NKp^PepB|>7E78ejS(LjTe&&sxKCE?g@HP3CLm{SCqkU2 z^cyOVgg+JN2A25pZqD*42H*2Mo@;M9CkOW~y&k3gkCiB)6%KO0G<)ij5=mWSv+DVj z0Lx9B(_uX+K<+>~JR~R>n`!Tv^_YDdRY-)DOsQ+~s_R4|D@*&VQbB+(&sIxba{)U8uF%vo3hZhtrRrQHzPFj|rBZlq z8AfDclugrI)15$*lMfs+G0rXOSV##)4cU;zui3A7kSxC%v-U&afPKwryPJO{Z&6V+ z>i9n2b3dS!N~^_Ax~dF?15`fwTT)P+)|IJe_dO75Td(x9c!~&iLISml$W&1QBfT(e zbh0VzrBbu?S1MKfnTPIB8o?L1L4jc&#+OCxsxCt7jyatxZu13+^0u0GUwlYd9MxF8 z2iiXybpVjFJs9_{r!5yHb=0pbF*#|&_OWl7$n(YF=EJ9Hp)6N>eZusz&H4jmx6~ko zE5kiB&2^@n5$!}$cgkXAuYvh#ANu--q&@4qWY|cJezXL&D1S#O63eW`67vy2MQ6P$`Ey!>2ujx{oSy*VV4;lL zOw-Sy5gm{(Q zZlr`oy-6DB`XJ2m{s=s_V5H1EpEV6|9)4sPY}O^P5^Hm+h-mY#s;aVNy$v~u6+L55 zXSL3Op%IOMg%tYwdo+`~&31`0uSRvT)M)x$LN}f!!#cJfv_H*v*vFH}r+SXGulFQ1 zRDy2He;^D(#VK{Ev1ejpBOV*$D|w7uOwDfI@(uAFG;Ag|$5Rj=cv5*ju@q}0&m}qk z`P0X1P3`Zhu7l*kBHx7Mi*SNH3dKX|rEQBf<)7)>TqI(b-ahRL{g=z<%2MlUU8Tu-8LYn5x8WbJh^@-Ss z6~j|BO$@*#R4@t*e7(b4FK(X?9Z>W8y;GSBJbJ!d)4^mqJAHmc)n)lEjmm;} zHZ*}sxSBx%WsOLQ4@K}(SsvM{I&$_GJodqJC+)~ipQuu_L=kYTd78b7OvQxV(P)Jy z&O22UlEf-LT@vHLpxlnrnS;71Cf5^VM<&SK%Lq+{IxB0XTyR@}&uq&*LL#n?_j`sq zh-Lj6<1-pTt}v|jj)IpWUrG@rq{pI62YKeoeg?g#%gl=WGs z;_epZs)mNsLBsO?`3m?%5vVs#K2VZJ&kt>|;{f$x%YW7~2q?f9umL~cq(m3@e%Cg; zT-QSP`8?5>a=RAWg6&Ft!{(ImxH(XG%n`e$))uH;49BA(eA)&U*J-s#<<5VlY+W9- z$%6a%7uHMz0KBJxw~-k8#JWB}9Uqd#jT56ei%d$|dPj&aAXo|DD(RmDd$UdUhpq1~ zoT8a5SH*ZfjzQr^HG1{b2+TZVkxj!xd4g|!e5&xg-+b#AQxeaG2{bZnjzS_Aa!TbG zNWHzidvuOuaKi)PHOm172~F|{I4FOxY;X&xN-EOl>mU?O;N8XBQQxoOxcgI%dQxaP z+wT;9q72_e%5!ZZ^=g1}N`DZ1s;=#Nwb(s}j=+{d^~c&K;0kefz0x6d`SBO_%@wh(t+#ilHptM0t*y-b0NOAban27)IT#b`| zL{ma&yzaTvcvqor4+a5YHoXN=xW$$x2e+tMy)O|G;KHv>nTg*BTfV9*9jnSwwuF8u zSM9>zOXihLs1)61vy&Sye^wQMT)rS6Ab_m6e(kTS=1;eWP?w^$s5ZQP$a-^T-JoNc zm?Icu%6A150zn{CjJy8N0hQld_&z4?8ogt@;U*TearEE1RgYsKG6rDZ>N64fmNu3& zXlPQaawWZ5N`~U31CyF_VKpNKWN_keBGU3#1nn$dGbJVld=T{os52z0US4-xud*6ZmYiWNWI8rv_S4mg* z*x8Y2em!Frqg}llXY81OBaZ|_pAW)x)8z(Yt%#R!Y17H^aLwp^P&k>%D^uPh980QV zq8Fzd8_(o+zt?w~Gws}pCyl^n|Ef97lEJyDn%d87FInQmNr_&`IK%%F*RrF-DoFhx zo!fo$t}nnitM?m;l8-=3oAXtt79R{PLFbnj=-v8lED3Ug%P9bUT+chuSlVK<6AJ*% z=_uLs$+@2mxr6**M+YNTpo}RsH%$G~uy%X-$X`5;5sMU>^E88TYzJ~UE2h-Ez$zwF zsmqX%RI0?+;o&?~Dm9Isp0+}_K$>`(#{x^(>hHD=CQC!r5Xx}-2YMRP=L6hz^8hIH zZh)=Gx{y@9>n$3wqx0cEr)ZuKP?pQ49&$TK&}N{a?rbr9lMw_L>cl#H3tmQ5VO z?bU}`5hQL#3o=nII3)){=JIdmSLA=M9PKi53k2q;#jq+Ri*p_7w`VAr3eSpyQq1GS zVO>c7zD9eCljULH_fkI2HW@C;BEv|Zm#afucY3_!Hf!vfn>kE&{G?K&6rEQGqWPM9 zgAQ$rJs;Iu>|L#IlSp&Q_Z3t^1;u1Qt&&qGDtNA0jPA#Gok}S`@N(@A<$nxIoy;9SGom4VL?hCMp=3+~J`lmmy1|C|q1?>N6u&-hAK8tP~Q5=BVcFF%BpzU^9-p zA4j@qiPb%Pt-tOJqlt{fzGSNEdI-flj=H8zjIXbwRoCm8I&HwXaEh9|i zU!CL-6f$gQNE1t`(-)FYs)c0Yje<{iyy7*XbD!P^BfzOP<`I|%?su|_l1OKxv{JYB zyp5+|{&{`G71SB{a8Pu|pvjJ}2xuUZnU8T}$OsZ8xmV{GGMKUlf-0NwWHn!W*O*YpBBucwjzMBfEP ziGst4)Spr*IHX_Zif4G)Dj*gq`noW3D#ez-=Yoh0Ul68y zv@K9dJ2;FkZasBkw9MfB`IpZ)Jj*O?;Lm>ffx}`gl5`!JafFpSq8X7T@PS^Y7U}=GbXdDjzVoZ9% zNa{UJ{2e3=jhgWNrGr+1Nd(>)q?RNYf$<(=%lngv=o^#8@BCIt=6Xw~7iinVj*lxW z^CS|<#E~%C4m8?D7&a=oveG0S*Nr;;2?}F^66S!on>IJK>D5Bfzf)RwJh!S>HxGwn))fpX$d0{%!%loX0W^|h zNF+ZKjPoYO zOl5_)rE1gsf^Xk4Ng=>?3oSNUr8ixjeIV>J$T9Xw66vDPH#^D(ZH5VX-{>acvdu~z zfv6Y(*vWinwSJGT?JybMKqw<{Qf`v=X_@~O|4q@CQ2gocKrmmYD$Pza&sVy}zBE+#(D%JSTEDYetXu2`b!R}; zp>({>h85C5(dmNopZln9-W@;JLl{&TfCU2PbyjkZEbmJjjLr4{5T~|@$P0a@&wjg7 zWYape#(5G=M-?0v6Q2S2{gP7`4WJ##c=XK=L9tSj*|>ZUsm!zpH8vGNq>cNm`yr zM1n2vC!x(inOsNe{$$*k6#bVZd?*^hUvTnB6k;C>C41*6kq&wV4J!99dA*;%>X~WIXUhdYc1a zlyNbLPr17o=Pg`vSaceOIz0ki+SQPgMgl87&2A|pL?-<60z;*$06d>v+urT|R8R9v*XV93ci?6!)|;eFL`5{( z0BkuhK_ckOg~MPWf@A1C&Gm~%8Vj}2N+>FW=PDH@olUf@i6FO^n>UB+Y5Y#43ukjh z`|meKditte=78^izeQU5S8({`f&pcv{YT1TaR7NsDyM* z<_Fcn-H}0Vcd2qH;b6+nfKYRV=L)a42zl3vnwrmm%mA&7v-yf3!z@go6GXAkp4L43 zqc05Sw*(^7J>lQ2Y(Z99PkhiW?42|l4TOO->G-r?_l7e#o8F%0$e*|UqoliK;FR@d zd;%Egr*YY~wHQ^?*-S(Ag87*={r!|M#LKlc-Z6xTNZ|{+FYgr*u9aZJ=?%P?<~Z@# zTz)I3X^v}nriWE(af)|2Z!yfhu8xvxmFB{M_qhk{qZ$w#V8y`r(vBgS#NH z%M2f_-fQF22LDoqhEYaSq;uy%PzhB?4H*O&v0!4<1Y{BXUrx$(Aipe6reMU_^atzR zI9wGe^1Ud&s=Bm0?XAB(_5FM{95x~48Fz4O^9zJg_g@AKWhuu_{qmqnE;t*b?OL?F zu2M?pg-SZU^&ZbK(cJC5e-X^`daYQB5LT=zax=rTW4>exV$OZ>_1}}mtI?9pnD4r) zlZ7m6W}9d>@x{J`wTWU-CKTT{C}CFM=-{!fB)l&Sx7*c*Jr3#%@+_>&MMcx(1PpD= zY>(RPg-yaXu?LG)mEwb&vx`Cxfe=8W>BlKq2w0HySMqBKhoLEr#f#kB&2>nq_2}+g1=`v2^={A1OWyOMt?>D z6zI(a78R=1kL1lU6)j{sX4?p?h5B`iL2BSRc7tfRrWEat%$N+0urJNT%zC;Uo~wo# zAB_Pk2ZIrO4L?@QAljEet%B1Am%BAQR9C;!XfB)9^bqtIhia%ofSX~S-0za_UsWa2 z&!CC0GHnj^fCj~PMWy6ofJzdB;c#c45yYa>DvzH4-OiWH4N5@o%659xfFo(-*-+Ua z_zKI=bAMJ_2&{H`2Gv{5&D5LD^zuqa8#agNB^Kw2MxD~PmK6w!5dDg$J@W8!#=#!_ zb&UF`xw7ih2@PAYHxxBi5S9eT8%!)5pW$hNs4C=e@epqdTU%3|uyc-LlqU=5ZE4eC zM^R_+dT*+tW^ma`2si1D6x=JxjfLbkebv$61!w&omIiW<(~S&yZo~6-*Gi#C{<2;m znIuzbZV~4ngdq9r?nIi`o)pA~v7bYAv|AX#O8S8ibG1eLjJ?!~E!Z7IvVOK8w~7o3 zt$9=CgcB6g;f$M&GXY&wn4J2bu#M>4+DGwZonSq>Bj!c#1ISZn2n~hz@Mi@U9lrN& z2*jYofeb`AqEjNRh6RKx!gqSn+_85a<>saZ>*@J^wi@_Z6myhGCAo%a)qMK}GU7uL z?5EaE@JgFptLWgv{W2A;^LFcjd$=D9v0fYzu{Dw03` z#yi&fMzEf`eHgch4D#vqyGPeC=uYvm{|;;Iz%{7SI1HVZ{yGLxqfpQPg|gL9(mbg5 z;Xgkd%XAl z;3!r_>ldBYn_Why=SZy4;0?IZFH=N4us0E&algBn>_=uG$DFo`$k+cEGUwU`!w`D} z=JmDk+69|DQ(X0ayDmyODD6-uVM}u*zm84z2eU%ycDMng>4_CE@Tuc#{i^ltj&bZE?w>pPKkwI7KqiHf@@4Jq zb<(Cr|CqG-za*RO9zwpEgB}hY3+g|`@$ZLpg9`ZMj)B_cE=&FS^Z(`o_(FyOXgiQ+ z9yJaBq5gk=M1cC25e$duGye70zfl1QIN!=|2NwUz-QmIqXoL%&EOg?p1Ra-Z0F}nI zdJp^hz%7F2I2@TMu* z09$<2A<|Xb-Mu8!R>KZSlkNFjow;@S@6x$M@l{0E>ZSQ4+DSq$U5q_d+9K;OXOTv% z&fPbD5*Ana&1`EcnMIn~FY<>K|8KQ%t%J#HJqN?EBU3j6MAYoAtj@`CVa-Z3IW{qT zwktA2Qjvk%81$cF`6dDKNKhzw(~8nUY;6mjX*hpycuLsFVVMPe89$0Wr=KQ|$q%wn zpl>3cjk^BlIsGqv15nK9(?lBafz#Ym-=LtfxnSCu7*=6HM==+nco(BfO*nLwA0GXz0TwoL4t(Dipzp%wC7?=1x*6QV`WuI|6DD* z-r7SzVJT6Z$+=;S;)dK~Q#3$I(Uq3QFk>H$(MF6q_$So!Zxe_P2b;}5_Vc}4x%Iu7 zi@%_B5Go1YCd{Pl77|fIMlH|}Gef^fLr?17hH`b?MtG?YG$6gyR(c9df4K07K6X8~WOUOs zL6QL@NI@;M@ zP0BTOYmw#mX7xpRcxL@Zu&r&>kTTw%Q-=SJecN7$VsVKyF)?!TbULIduafSJ)0;Jq z?OZc@t?l<7sIE0CBzuRTNwLw>V$bE?mK4h5VQM@s`=R@zF*4h34(I#K6s2eOMzU4P zjI8_HGv8wslER)$Sk~zIhPL0MFYQH|@;X6W-^Ym;SzwW%AY;tb>Rg8~*-OxfQAZ7v zS{q=*4#PKR+w9q)R+{_(cH+z$slO|=4 zLYuhEaB@G7Ms6liWVr70w-I|0nplf{VUm7eU25$EPBXbi11>rZ_(qqhQ4gi@XHHlwby!q$>2JH^VH#Q zKUpuWZ$%Uya^*iyl)~)D|Jf66_j2xd@_51kJ!gqxd>QK*L^C#CW4S+Py*S)Mv}AZ) zFT-FvNRvWuofV3nVsui90!TR*coHJk7Vmf;OKea`CNimr4T4x_9^6Zczv6dnX%_2G zvU7W>G$f0Y`EQj_Tc#z(n=c7UryWso{ZwsfZ57}8hPt1DUOJ-TpM+JjZ^jo~@8;I{ zR%vl_C_`J-{uxE3?Im?98j{o$#I=wU?r}3|K$$F@>~?b~L1r?qZhGZACZGEg&9%Up z1e04Y&35Hx?jid!$zelQ0iiTuj-!EQv~0*$)8JG{>{)*0;HU~~jL68Yly2V$j10=~ zuR%N!itV99oQOJLTK82j4)Lu2gR`6z#GlYX7cT>W-)hNm@YVKh6 zs=(}KO}0YLul2}6=~~dR5C%afd=uZAOGTK4`kdrlr-X)Ac8x^Adn-?wVn!7}4>S!( zoylUAmkhs??~?I)Hn$@)aP)1p0uxDAWt3FGOLG2I9!*mrIXVa~I}(g=HoD#wHT>zd zZm8*K!G?t4@`C4XG~a)5qxpDKdm42q-__Vsq-s(zBk6 zq6nD5|M@Qf17FlpR{ygw9XDCm&R3$=$`D(67&w?D>`_o?G!95bpX;e3GFb16Y!F2! z%$s|Tjc=r3q|Wi$xMRb3tAi7qlURjSUQbc!9PWaLZ}TFF6PKjIO69J5dEN^V-+v@l zaTDytPjoMt4JQhBDA~9QC01}#pjUy79p^+4>saxYD6$k$rOt{=d>tVyTg-~(rY!Wh zvBF(xeKI}SY^?WSv?}{{1Wxp^KJ8Sw;i0_g-qISbaJ|1ga(45QT`-#OH=eevJwRej zWCm`^quQ3kO4W>~R!7>T`wRlrF|x8l8DOQq#0Um+)fy+qMW zzEGw01C55e(CPXPfo8o_4nYr^B;>~Bv#s8 z)o+!`%>0!2J)Tge(`gO+*I3|ij~!+!w+G1)gB*}nVx60pZd^5>U(+(4{-&&TQ4oas zW8|o`$SHzwp<*Ckurs87hMs0zKZt(dx^hOs9_fSG1jId#0JRvVvQ~^1@rQCAGo{?R z>*EiMLBaECX<2vzA^~vF@;VaLO?)pvuLly8R|koxIy+oHkRk1fQG|6Gq~@x#Z;9AB z@($2#AnC!P!k|}z*%z-;Cgm>_i-&(q{TcR6gL)=QHE1LXzcO1|EE#^J5hvsOi}(Kh zJwKubYshRPKbL?&d2(7ZlEfMcHCBjbD~?5^>rR)b^l$xoVDCU!L#9hU>G|Hnj7}xP zS_poH8~7MAR5L5tq${apy&%%V}WScRLraYBvdk{60H7C4hlol z^z+*PKl5%ed}<_@W+8MESUoUk0iO%TO9taU@glzfZ!cc>#kI*`AdY$!0#c@)ldL?+ z@ONG?-*c=clAus##=&}IUS8`8&H8dWA~%;Z)L*7?mHul#t_4yQU0U?11n?{Q;5cka ze+2&eDFDtPR(_9Lqj zl~`&39!e;Oa?x;UnFdi2u?w7D`3qiKVWmKtu$yr79&ui_H5`#V~h>#&KWYW=%j#s(?Tubo$L)L*0K;oqPbMVYl_9o8}NGI-vc z*c)%2{u|pJP)wNm^4*E?Qr8ost^vVDeY=o68)si)T0Zw8YPDGR65)8r_#S6`#jr>( zZutewcQGQYY(c76>cg{2-Rtev*9p=E z0LNqYoSU*#li6>qiPt)2lJ>)N-QP=zR4G-4!BU`mcXlApgwU@QEQUNTs|bhNQOlqU zhqcC}cR>l}Vl0cyAM6xPdav+;De-%?P0QNdb?`#1nu+L(!3;1aw{4mtMV11!6$6H3 zN*i_Df1(Kgs_^(EkX`Vpv~;2+SCe7>?Gtjky=(k_2FgV`g@r&n{Ur!@!r z^%zvebj?qPYMTJllJA(Ok6h4Wu}2zjq=PpaLUUHggRSUk8*}<1+fw{_{AK%X+53!Rlq1?;wdZ*8feE`CrSaL$ULptX`HNF^Q+M*`iUY z0nOHMF6Oq3+Kt~5Y(g=}sFyguP7#Hu%i02M{O>B47q6v0ajwQUNku3rbY#6q0K=<# z?P&3W=<#^`G|~YoL7T~j1DYz4< zA?_3L?90NdSL$hm^75_f*E2uNA}3wewBPmN@Ihr6vFCF9Xbj`Ylf?_-uc@t+RycuM z*h@Pt%#Xj7YTb@KvkZ8>UQD6-hAPFZaKK*bj&F={t56F~IOG?KD6J$C<1qp_@}99) zBs(r%1bI3dP7KEvLnK%~MCH>QOWO0l`YC31+jo~N?870%#EDrisR-{k7|~j{a_P^# z@wpo^-~K{404|X9Xh)YqXsj&hBQ&5I3)#|Xt5xYI1x+=bfJYtY50lzI;;W04V=Hp2 z$RDZ2_#+|< z&MRkq%SeP)A`5W5cdST*v1M=VpNlkLHNo}ceQ=6Sv46ES`M+M1zoD*v3mZA6#+XA= z7*5McIMjN26?)D=kHFDSn1+g`9sLQJ~;@8WKQV0+AkF6{lKDYBZA9?s#a~{o;NJ75}hn zMq{+OCnuqv*X7%|@Qwa@ckyqEPsusTvC`D||5^u1ZCAiz2=80&yJ9^Dc9?*3|?0Wj9ZX`!!-)y-jW*Z|fV)H$@U;I$>MuGX!M z*MCOo#`tEC@UIS1UqGT$z8%>KI)S3c_DM(_Ox9}!u2@8CBL+it$GWco^c*$5^-Y8( zYD7&s<;pZA5e-2`eUBqnJ*X-FEni8IRG|Y%ex@|SL|;l1LZB7vu>YWyKgZIbqw+vt zEDOqN`ft^W0yE&1r2XG>A;p47ZE9G`7rog0&EbTCZ3;;|R3;lDy#M;+D13(@1*9p^ z-*{WhIBL$2y(2=A_5KIfyE!fxGow$O^T>mPS-l? z*ZaSz`v2F*-k2}qIDEKz|D!GnMmT{rUCK78dV>E+v;B%uOD;S&gaU)}KioF3HbT<& zA3_mh0{wsKga7BrFTjWEg8Ib&=kJzc{11C7l49b2qs9E+SIP%Id|~AH-w*ZwQe_hU zBPSn_jXD4Sm;L|v)&GBdx53Y`iMGeqLvF4SkMl$7MyKcfw8s&VG!@$S@3dj4#L1(h zqZHSeT&4g(Yo&gRh{e>$fRD*5nD=l1Ht9Jv6pvk}Fd4?HmMD~1uPa#llJ^iXuvxw{ z?)+yf*YOiBI7|`@OBtb{zv%H~*zZ=cz(Tic z8#u7S|9&ySdJ{y7arpBmJUo27rr|YpP1l?uY##dEQuuYD??{Q+&^QMRvVSVh@H_t; zb9*6#uuO5R;CEVwZUH4xu>yymLT~IMYaVBm_c)9(Wt{x{a*l#GlhU?B=-W+el^OMQWC&4bK8Odbiv@)-=9IbH_h8IkZ;*y!kaZk^;oLWJ2y z-GiJaalqkq$U@!Naz8f=%W{as#cVi`nwP5|<@}#2NWNdSIUOj$oR(H6by)=UTe{_`P;hI#{4XAWkS6cMBA@B9Lwi?7)Tj9!VH0GaT?^67xT4pm0=YRo+bF|6a1lo#N0FFG|{tu-R$?h>>b#X zDo8A-VlZc!nbafGa#p_WY$%=?Izo_uG?&ti)VquzZnj1Y*Bh!YOGJd_DaLl#YjSTYUVW*ej z{V`!ZpfNtJx^nH|LUi(?s_#0MK-mEB^cvsu|47~+QQ!`4u>l!8TaGz{=`|T(td`VP zXIqifu4n>FLC(M%>bgugCYV4o7na@8!Yz%Eh)JzDHdioWN;GVwIRLp{QN0{$O+mxtzbVE^E;n(b=G zwQznuBuqJg&G+u0OS`nSqeB`DCsS#aBE1Cy_ z1pfh$X|q};RIY*nmK5CCUEZjpb^FwqU8{VwiRV{Yy+e^HlRW=Qj&DN$gq6k5rl4B+ zi}dsbQNQ$O6@tkgvYLcXEvoTe^9QFM^)?Cj*@C_jkEd>)J3D!)0iFpS-LZI()rMRk zOb;$D8ZDBXgNYRCqZ;9l&V)IppkMma1U!XSbNvZ)nlXIV3^1^-s00ZvmY6MP1HWP4 zY3cFk*Yor3&vwjPJ>$_=WSq7F#pml}9e8ptWn^SZKwbSIZ$)wbB2F%me*D~SXHm~t zQh#o;lX&AS7mljt!A8Y;zxUz7tGn3)$Pv?*iy&_wXI6PeVaw@kwxHY9p7%68alzR` zC@84WZb(>4sgTkznqBkhYJKm6`J#z2cdc55zH1GWcizM;8>gH;UtAhi)^UF7-4 zOYuVe=?xa%d~>7i>x1;Ee#7rVkZYofCs;6!aouyKu3Gd4e%y=HzuM+Lo(6j$Aw?(X zk3b&C%nn$Ro*x~N4S}`zdQaByoLKLEl2#58h%$wlr6qNpCfi~MRE@E6j`PA=l;M3U zI9A**T)#GYZO`sqQBOB3GPZnF^~wLNH>y2f6$e3hcz8Iq6?6<_aZPE&+RZ#(>PWA1 zGMG4ZR|#j^tT&Fr-?Hw6;Jb1&kE3lsdS z|C_P@eeX^}5~M;QE7BD||As@B?D5F&5B(w;@v(G{NN`-*s4~crf9|z?^WKSaUe4ZK z^a}_-6Y`Bx(%(@(yG5Rl}MV7R3OL9<}u8%9xURJ@(h; zR?Ua2P5JL!mDi0IFurb>i4#ex1k-D7S67Sy@Wb-C+HE;`CMtrsfX<0FNt z3zd9^UwLvaRaCn?6by|(g|*+_v0-77mB(FttJ}(3>+ig~-r{v8;)g2{LWAY&A6sd3 znhMX)CD$fbVx@>d-klUbTLZ#a#B)$VT5?3e`;7t(gYTDZhIZSze{u2Hye3?l?quEH zf8O0oGo8OIVLQ2f5L{JuUD0v_P7F=PkQ6udoBj;mQ)y`EtY77g098QZ5}dE&7eRaW1w{6Dm*^!Zx2P+gl%jFs!GfxI-T z#f3>U>hs_vfJIlOc87tN(31Rrm_ZY?_*{0%k*Vg+D&k+Ye(`^3F_fuxgs!4!;-q@M zmgR3Xcps-`aBVRvWC_Za3+afbvqxaN)ea;S(a9ktSh{|R!tXACx|e7)FKXuznVYHn z3tw6z^4`ue;;6N4Aphc)?s~o^g7s;72ZobbOPh?5V~v;nTU@*_HRRmD#x8e`B~ILE zbCFG%zMMqO^UV(ayHd4XXlKY+qL{;hE#gL8L(X9%_}w98Y1|<~2emJ=s}@0jv)wiP zR|CWSauwfV(}{y;v!Y@X^BwzJv;8_LsdclU>p!Wn>c5gR4_D|jdvKK_(K!?uoOW2m z#13iv=EakSwOY`bM=E(f+6kZKa5R+YG^(*X85lL28yl7L;IKKIFc(2RIG=Q{AY%5QL2IvRFw)nb+WjyJjOK_O>A zbzxc!dSVv=64VW96hc8V&-;VF*i-l!ez50-4=);J8VnEn)F$scIZIwR=Nw+b+jquj zhPg(5WomVSi`D9cLzFzb{JXp%ZiC4cD-;=jWX*w{Oa6E8V{xRuay*XWue!0uE7e`j z>i4_pjOy*d?6W@HI8t<)RV;xF-5yIeV8GIpm%~4!%F^$gmDGy-2D(Nxpb{OutR6?@ zxA%Kla6Ugt(yu{C&SS2`w-NQ>WLdiAxT)TFAKS&hRQX-`*T#wT0!ZG1`V$&9EOmc1 ze`R8+LX!f_0a7XOQm^Xxi=wm-5~ChUT>^8rQhGjg$k6B`u^7l0bUEkzb^#>rQVd2P z&mJKJs))3mt^pjP(cfd!ZID6&Zo&R$d3+xqJzy*6L@kqq%*2s=p;{S6vETz3)}@)& zDxRHfV7;n7%RHbvCa?9+X1>*`l_3Iu=v%d$y$BVm*>hY@Z96Hhi{RERmt3vGM!umgA6i-8LkWp^F=bjmCk<~}>Ws#V|Jo8h7zEk~(ZDl`$pSNL zR$lpE*s3F_bA0rym!i61ZaY|%{T+;&!XNr1bEE@&Jd46Uj^tC>m)`z*d3#Tw?o(N3 zG{~$l5(1H3L|lA~^cyTV0`ND{->a+(Mj~JPM;#;(VZ<5SR{uIOGSd2MOCOb@ zWUr*(nRSg!d5U&dtW=NvBOcE1R_$t!U3KR;1}vuL6z-8978wV5vAV6%-+Q0$UXd@ASSk;X^OA}-I-^2vtqKJ0MGUB?r>b@ zTw^KGxqkP7puRbwy0F1P2l^@su}F02?vA(XFnb{Q5?%$R?nN55TEY z%tRfV!~IJub-QF3Xi6V?OAoq#GAxS!urT)AHT*1X%FgM0f22zg(BvxNr}D$Jv?1uOpk2h7+YZE@`hG5uD^=-ZbxqdQGtfUL-lFDH z7|8Ch{9~Do$Gx`;0#q*ap=IP3=`=I!Kz;?^y#2Kk?a4sDoVZ4HVfP;D>Z{QETg78b z;L%#n{W^b_U`m?JJ(IxnrkCGMr&c}y-EHbayXKvBzFs_0>vFT|9o{~3>S0T{$+}2u z9peSU!#z_{>uX;-JQG^RsY}7->bK=!Oe%RyApyoWzv)b11{fi;%FneA!iDdtdx{p* zhQ2#ae0i}|Z&SHA-`2)=H0*Wxnyubjm%1gS=5UPB$YPSJvMu$NM?hzI5?=so1k;O2wlS@2$gL=BoW%cG@g3()1<)-bP_m#H}qb zS&>?xSrT#c(M+ojl>gTKp4q9~Q%f)8s*ZidZ@H#g()w3hUYxFHeG7j3(_0NXig{o` zR@=Abp;QkwBJOH!Sa~95>{0b=f>2^hV|A)-`rjGzZL^5Q*O|#FOS3tJ=<6~kxAJpO zK()I_TK#S#puJ1LAGY9`+4yW z>W`=-zq82(FTXDBiFwH>*B}1;{Zs@>+RmxS?~mNKywHkP$YYZBzLPx~Z#d~i7n*kQ z%dwoymR%S4v2*1Aa02gnT%|cU!S@opKLW_#I?!ph`tA~x!|YTZh07!3A2pwrL23`N zU^yAzJp=rkV&JokG*4o6u@Z*Yxip!^_A-J+1~=Xx%TDxV^8p5y14@c}1xD;W6IoS7qRwq_Um-_H&J4{OV z+Ot66DoHF+NDE7DJvuKPthY}m_JuNZb#mfBP58=XFSQeGm4fsJ*wJ%8T{OUJ%V34A zU}7Tr&FmPAC$!fxnfjc8M93<2c49QF9Jmwc62pl-nzP*sGr0&Gl3cNz4jZNCWnc?W zzkMkr)vrchs+3o$*9wq^@#R+|4sV_aBYud)8(hCz7gWY3QsQ&7wY;-cRW@lB{3e$9 zyEVm7A48+cpa%6X;=v`CLBdv7`?|aQ4JH>-?VH)C<2$-G10dsRgG~|dD{RmQyjKh} zT&P>hRM&(!tczySDOjao|2Vj^cKUjrCe(NpaNYIn|2PeKb$k}NPwk!91wsl@Tl@3a zh*4yvZJsE(aVxPGBH z7+OK>_82Bkd|QmQC@1|0-f;`ctyQ9$F^OVzoA*cMK@am5zGq`1Oi+qc5-IdPJD@2Yb|JuTQs_lgEdef5&QA?)czWR3L6d6$! zZW-LhUTW!WY=0Nhj{b8uSBU6#F=zAp+{RoDeF)7&ue9cX!#Jr9ZwxJPrulkLN&`vY z2`4sU=e`S^V#FXJ$PtegdSN@3pFiH`UqE+)yw>d7{~CE;6AWL(O{jLt7` zc2^rkDQsT7KO|!=?v{hcs)>Q8OO)xhCiY&%c9z<0*3lh`{FqGL59Rofp(s}sGrf32 z^H>BU{&D0F4F@zTrN%lE%QT_j*tDx>Ca*hSEgBlP_kh>5)6%$a0@OZxv-P?_Fa~`J z;U{L`GX!)x;^4;-%6zHQ4YyipE+XIHPB}(V#2DsBn$0ZF5q1pv#RY5*{t_vFk~7nI zzIRj@$;4POYzQNn@5^l7-pO6)(C7raI(Yq{Fa#!mCDfw7Of zQ~DJFBBI&;-3#YRxb+f)LsT13>b~#Ba+6g)1B1x$k?mjLYx8)~_GcSIl3i5qYSz*_ zJ;vcgI0~Bnj0Ek%4*2}9GEyQ+xdceO&m4@=j)6!J50z=CDPZ(ZwqS#Wa_PySV2fvi z>uj~o7oSV$a*i`svvSD?kDt2DRphcZfgCqx63EoWP2zqIX0@^Gb{S`LWC6_gr@k5e8KAk86_U<{?wy610*TPg6S z4nw>rZr{8~k)#U%Jkfm0&M zA%84m@)u}Q6s;uRaB+T=(~wJpbUshzP>Aq-Vc(Lhn+muxdyj1kcZzH~&S#}`6X8$9 z=lbVbFmg|r+=z@0j8gsQOrMSssI4S6t5L1Tu&@}Tl~)L$UYa4B+LesSNjQ|rCs2ZX zeHvT1tLUEb`%y%&aE(gIM>=p+2HKj#oGYA&wRx1vQWhHhPD#PY_)X^|^J%~$?dF~8 zxpvGvfkBx2iSwr2@0hgB;{a6ecu7>28!ABbEqY6bUK3}|l7!Jjct*hSAh@&Ls9;jP z-eMuUAVE?ZK`Q)Li(bG4k@XvRm||2{!o#`&{x88~Hjc zk~*CQZU*g6u|Bncii;ITBn@Bn{Csv^eJeK%d}rS;c_dgs%Krt z%K93q-0U;tVE={u7cmhu|Ah^(Z&)`(UEKs-xv_d~>EmA#N0J5%v&M6Wo87gBw(>VV z*Q;uYou6&@)4G{~LxlrBhmBaw9En@nd!ZI8W=KZ#nDibRs`K?p*Il74YH2NTL&emU zMM*7pzVnWmeelE_l(TX5nZ$|#MH&`K+9y5&g zCSPKkXBua{RcY3^f1b)F-yuZ=WBk0r2`BALxsfmdLQxv;APyATw#}z+AJ`Uob|(;` zN#Q~XWM3b^ar67|x}EMO;dGL9#${rY?}4+^uHyul!-!&`6&{PCmj6O(9-r=&s#Bj_ zKU_t-Sh!F8_eY{#S12sfC}w`}gU)2MZ2#mjVUov3c-4OItfW9=b-Uj5kea}j-#GY6 zD)yXrE}^fbXb}>PW$TP*tk!VWSB^D&CQB{~A}R>B3`kbdXuC-o&ERU$HQ&?w26MBg z-ItuI4v{3C^i!kkgiSW(Jzr+>SKk*gkzG81a$-KqoYSRu(#7CTkd>%Y$V2YrO|tIx z)(#y44-qfm??!Qjt7a(%^eL>a(-TBbuFV40!cPvCGS!-)*bVWDf~Fq zmOUE52F?qd1blF@OX}edee)-llP4BlxW~ZY6c`F)98ziCDd%7U=b^1U1|8@pEXR=g8gkXIBi`wUvgtb+KnN0xY}>*}TRe~o$>C`+&?&8Xu}D3=R(7CCG*NXFpY9L2s)&_U!ueE=Zc zG!N0lzdQdP40u={KkNJ5V%mDK-DCKIN^l0ZY%KQL#)1wFnrflqsrfqG)e02|bJuF0 z^?klr-NnP}bhKP{EEsVwlfBV)I8{fUC3&cDX-UWjay>M3 z_oQqS5twYHYIV8}#CZ2j!oj65Zo9)7Taejfx0#o+Z)@{<==$Ag9FX6}XtGl!=KtpQ zj9@v4yiB;o*rtW7!{KOADp|Y$8T#NdEC|9F$YF^Z3Yusbet<$+rhX#YzpT2wZsm;i zvrFx00RUNI8CSZ;8v;BS?DFjzDSzy4n`YMkP}1*;XSQ}e96yDtX>R|*EQKSer8JsF zm-1MJn5q27(jbyLN2%t|L$yGaj>jx?E_`*(J-s-_Fzo~4X!Q$dMR|a^>Av~bd}Gsj zY*ZG1;zL6tFISJCb?P@2Ch-@^nXNTO;G=nRy5q8AKx4N~SB@0tlwL2v)O{bM_d3JU z(!N_Q+q^ckj(*WKfrnaiipxphv$A;n29#`_D=|-Q}UTXq8{|vrc=Edec&t)PP?_H{&L>ehM(@_`d@~@AT zZEokMU%m>r2}Oprw~zpag=5_L5ODd#?>u|I%YqjSm!Z1-5wk`w*Uo$i-lruEChlSX z&IIl7^BOlsC6XRl+l{W0@58*0bDY_)vo6VN@sE%%K*x4Hs|%SbkY_Hr-U+$eb;aqC z99+%cwH^b!=k^4b_r@2TR(A#sjB1->_v!Ue-DvcU2GAE!R1^K2+VM~v4pg=ZT28fp znLUR=SB4kJyU(*qnL3zPq;L@A_z@i&u(8}Mk?Q@@npK%)~U7DM?L%5`lb9A-zF#|ld z;ZbY?EPFy2-vr@DvTw{-$P>F5r11wuWuSRRO|_i-o9t&n6bSaK-x(o5be|llgWren zT-9l@r2;Lrtt9gpM!3WM4Ulo}$|Kc0QE@q%TnHH?yz^N>ndXcC2)z<^z5)rQmYXWt zaKQ*`QLASCy1*yTY+>5xdru1y$BvsN-c~34(tnr-1L_D7J~DOH!)Cy1m?gi-41_y; z7C%0lf7VWcM9#;|%JHO8P=vB$Cc5UwtkUIlgVI}TMW+GoMl25@uhoi%RGHdjkIUViE`MqX*Yi{FgX_K z%+|XLRK(8T_M(ziKG#H9^M|k)VW-w*KG*@id7U+bh=mikm?aPI7SaX5{oaatv|N9u zNvVMWzRwd)^LJA@hmi6+>rXHJjDfViaELI+}PN%Nk@RFVMO8Lhz=-aaAAb+PV z7NbO&TkfjDQN1bgdt+0E1~qq{;vCq?7yWkHv<21k2j}-leN2^ex3*?t=!K$r@m+n% zgX#JWjZ=W$e4z_d===bg{lP=cPIiefsBkRbz?ex~Y{wU#t|u3F5A zHM4sjy=qONNje=2kIzN$!@FxTc}KUkZ_$CKv&HA`{$1_fOBaUJD@s-z{prlV_^ZOw z&m;P6nyCt`c<+9G+oxyQce~MJ8#ATLdYzAJYawwOkv@ozVGv7GLC-BXhsOMFIGI+% z@`#*S7ZSO(G9Jjvj76uzy}VW{I(g84MxV$K2+=n%IZjqx9>>^PmXMjWB!Ywyj^%FI z`)@E;>{pO$0Prxc`{Sj;q{~7CSrM1ZB3LyBR}cN0s1%~swLY(KZFxxU4KsY5PN4AJ zjpxgQ;-b}NWnttfs9X+{YqLui_W1jlQ_@P~Ex7`^FiW_s;KzZgWn*oA&?{O0mvN)1 zGZ_1oIL6A{i}emeod-LN%j{@s@d|8teSn57pHxrE`w59m!zyIIW2CbxIaQ1(@iDK$@0Ze8PdPxY8Z?96a%^sPTke9qL6+g zILB_COeQ|Ef~q9zE)?STIVYxa1t%eaNN+Ie*C0zdF@3vGT&e|;?DPCF8MOwsmS;g>jk zjTJ}ADtA+LkQ}S@YqxAEL`5<{-MH7};czrwUOI*HO4|}hPC+WHP3VvdBP!bk`r(Gk z{}AkbsEwby#kN7tKMhxtr@JGL{%x9i5G4=|kHf2yoW;`}-aEjxjl|0f9^D8{4Un0O zyIVc!rsO^vvUoB_y>z2}HjFizl{@#nv)VuQ^=3Fa56c`5M`P}!B980g#}Q_wiJUVk zU$aetG1P0OipukR=@KJl14;P_4q!RYk@rwG!oo2asrMW?4_u4q=K35+Ql#~M(0Sec zI#(sZ_UQaMlkB?d^~3SUpAE&)eGy16UWYHtKBCBd@8#h;ls7w&ZppbXTl!&w0q85T z$OKS#C7L-n8{VJ9bm@&bLc`nmZj?w4lA;th-Q(!k-*;vr&y%rwlxw0@2LOR|DWf{6aHTH&eyQwZxbMwg&jP7Hf22u2F0~QXnBLz2Cn|^V2Sj?|9cTA0UoL|%X= z3pQ!oDQK%;KlBkl*c)Lk)&rJE6)u}O?k4zW0Wq0QBY7)JAs%QSK%JxOZ4)@>K`I&O4sjKIX+F+12`y>W9u#d~~n!S!KA7oe!U#0mE?Gei!j!CX+yb zk%e-`ep`&)p(v1B{O&C9hi}g2*@>)EJmU%F&P&{xt8#3X?(gm%dwINqLM%jidOa{^ zT=?~9ljXc@kUE$Vil@Je+i9=$Ja&T`iV%`D`(xbKB<~Meql%0{KB6b8Zs)=*;Xm=j zknwf(8Hx+E>nzT4K2~>9@g)Uv-rQgJmJeQ672%&EH$KH6qO4oxCJ;##TBj??zgwbV zNSG{45r5Ac5m95r`?(O>2Bkrklk9jY91o*KeB?=xI(LxDIHMRnLl{ z*XZF#jDYMkubJCyUg%@}td33jaFpI+t1@*2ph2sn2|X5*DE zMSs&MeNX%hR9QRpYV2Mm*6Uw;oyL;I;d>mo%3yV9@yZKfv$?^M5w|lJhhJrn{edTb zkcQ%2bL0z!GFLGZrCM@cZz?>+!I)c2brBug9|7G4#s|XHWL0y zrk9b6=)yW~(~yf>s!&%KvrLLS46%Ct7|GfAV=Jo`DrziFjD{3FpKgu6jC|erSooGM) zb+8;21Z^xlupe&fC>u@6E(h%Z1M^HKlLQ^2rOW?CtLZ^SHko?EnAm!8(326(Tc>Pq zXl^i7h_QP`bBfTjoRnGae_5ve4ck}9^AgskEWHE z6R0X4I1fQ97O8uoqGwZnd$w784UJ>|M$-9}8Kc>D^K4B-;9Woh9t2@;Kr*k@Hw<{P zeZ;YEN_1jXyFR$eer0{*f%gpgOfJ6jATHjuJ+P zyXCG6Jdw?PiUl0HaS7f~UV_zpPV<0;*YEwe$+VRRSnYZ_=AH52J_KxEKhbSwg$C9? zEC=h6UngCpvjX>|xkL|ITPoo&Lc^FToCMv1YV*7MKKfbW&fq}oKa!wNClLU8qMiUZ zW}&(YXbC6^6a(H#!tRg0Th6EK`ghCEvzn2%N-L`1+#M}vY0v(#l)gadV2Et7yt@Jz zYky&anr^|5WHFC&5Dt;i=|lGZ*WGnkZADy|KinXQeLOP29iJ)zyu2XgFx?f6*46(`|OttLgxh2JG9#R?p0TG&FQzCyjyJ9;)qF4VA zv1~S+U(ij2{0&NOjR{nqKeNK#rkGz22IZd)9zwC_Vf<3)qzio{F~1`Jr^v1k_S&rekBs(v3K4cTl;_vz zU06J4VQKEDCaFTi!+HO)k^!=4LnZPg=zNw|ES^IQFU)T*0^AsWQMMbkW2Y1Vl@P>t zgc&(I?I*>#oZI=lo`-XxMbG2iIT0;3o>_iv;U|oV*#paiv&{tq?X1lWAqZ*M9Q6(x%u zfBgC&2uT&eMTwC&dgyx+xP<%kyXieuFPp#-ewl1QUaX}mD)*5C6B-_%X?FWYFP|XT zi6HB@-A8Br;q)`oHJkCv%l0lN9xUzj z6TYVQzLaTD=)o^a2dYhsW`c#!qqt7+bs*BI2f~)@0`H zgd~!wJC7Cew&J`9>kt;85c37mL5)jv33_U2*sj*_(Gh-|5~=*ZSpbft+#4mmrY9I9 z2I|bR?7MptohtC(&6f{Am!y1)$igq%97CpF0-`r+OPzEzlZH$OH4#7CPbeuPkEF)( z{6%Q0cSQ}$Ql^wCWlC3csvN!ob!gC+kDO%!52n%;6qMo+3T3+fcpi8HDQH(*syB2Q zOY~I9DmHQ{6a)nr1>t)(vmH-s%us_7=Vir`=4q!RXe=eb>27FDpiRL@TQaLuiuPG| zXuY%eV!06@`HkCEG?@v88V)*%N=WGjEtyeYbRbzYQJ|+TP*my*1r!XSG!(q0i73VG z`QzpKW?^(awl0MJSpdF&%kgV_TsYVu(H?*dlOytiuiu4?Q&XD*6i`e+xV>zp1II6L zwVmLDcyW!?(0KzyPGE6ip6bnI#S`f%AWZRRjR3Js_$ylw*(ioHOI%cBs+PttsidfN zF92S5rBn^+<2Fdp|K|xh>gV$3cb~)TCqbDGmV9Qdy_ALNlR{$e0E)b>y6d~sko_#b^JJ=-4(M2*v59(#6f~Vl8&Ma+(WLk# z-WueNO{$HT7+yMr^U#boz!RF|E)j&R9=Ii0N0Pu)i**IfPonfI1j=WPqd(aaU#DJ- zbYiF@-6wlUj8P>i`VXkDBUVnIDM~1AWGojo)|t>bF$%cbL1uI4 zth#vhm*w{IOf;2s&A$Zdtuy}YzQy;w_QC6$9N;si}a_6g^| z4lpNdiF(F$29r#^L0zw~+p~l=??Fp&y8<+$uKjXjm5*IdrzhdNw@yrNjm1wkCzz03 z2L%vGn5<8J+@r#q@iqJFIL(}5L({lqF}ChjVfZ}4p;{V;wZ*>_ zH$+yD9CT|5#zDb^#;x%2H+OG5L~KWh&UoE|NAi;N*bL=ue;cdS)iek2X^Jyr0N13g zH-5jVWcoqGjjz;UI)=@kOBBbifiNkW2tVj zlKcGK>2hDiC!=?Q84O;cYz=$c1!#*-rt2EriA}|A5S~krZ-k)X;UC$}K&q7?y5Zxi z2->Z#+8a?ra97J)7Raa{kS(n$8H`92+8CP|X3)wxBT6CNJNx~#5qFzV%>jLGPt)4( zZ&q08dRj&@pQ<%Y0Vz{i5&#Z|pRu(jzFA(OYA}M9Yqx~rgbhS^TXQ9l1Dt6|;YE3S z@Hj0S3q-XN7(W`zo{MPgQOe zF5dBUJ{ZKa?T>Y;0%9S(#@C!;0tUHNXfD3fq>}eDU%5(3)09F@=?d8Vpt*S%RU2epVZJfe;z7K)y(mw#*UlaxIx~*L7}mU&hy<$4{fXg!o)#{}EW!9~L!;{^H&ij^0DD)&NIZ0@pRT5Jl5pS*7v?!CR>-A- z-fSF&_@{4M=bnkesKWlp_wqS|l`1Hs)&^Mw#vu3}MSOOYKz6~=oY7okyEXk4Fb>aE4K57mDSFD1io zB1&lfG-o>-HYKU=4^`>64o&Iuer&roI_~-nxr_W(=OttCMPq&pQAxxFf2aJ_1EIRB zRn=w2kdR}!%JtREy>1DTOQ%!T{d(&>i8E#ZGT41y(4F=9vPGQ{CgWn~LI-G70J{W7 zVe63Xx-jrm5@vU~VvspDFH!P`Z~gQLB_?T4wB$v-qrKSuMrsJO@wEEG7b zJ2jujX9Dd;#|Yi$)WVJwrEM0|ZH<%{UjeRzkga~3MQ3GUcrpXI_B<^Z(L)W~>ez9_+(hGAl36^RZth|o_V^TEe zn+yRI&MuDu9G&p)y>Hra;z27wM&x3{{oIZ*R*ZBrIpU^{E2*{rUlhdyIujc^cDfVx zP|M$=U{ZLtLc~zSy0!Rk0{-@TH6+0kEWiWp4}F2(ox-Vgk?`5V0E^sO^!Y#*2-1MM zNm`tKTAUdP$IRVd!<)FMgh{d*cQ4^ zFb~edp+cNKmB^aB@NRryG}V0^Z3Tjpk`{*?k%S49|M7dr*=7*B2;6Da*%oqNA4eFH zFVDCv$q}B&#T!#Ma=hRD$RKE(!-K|Yy!Bk5o;z$)2VnnCWE$91ddtOK>_Wg(r_@d^ zU26dFb!2p5W4!5eW?t*Z(&6WN+V?cmqbPd-OwEXvA{UB^h8(9jDu0YdG`fz}FmBK1 zk`Cy9QV_!eT@eanB1A}SXWokqMOk;;!eHs&`R3WMwj=}1DGvlvjlNtj#TjG3n2yfP z#8Ia=f|H~^JdKe~DMAlOqL`t`#HSd!^=pJz(K|EuHGSUTA?xnXgkCuQuFwf4{-Rhg z8n(x00m@#Rcn?V+neG+|l^TH1OT@baYdKfJb#kGIuT$X&)SXfk-KdvLt$6j2!qm5wS%%gDUs&+XWD< z2C`wNi0_u@2`0(4M+-hCo74=ZAtjeYa-v9CsXAYFD10YBY9Kb?H1?SsLQ^R)B*flN z%N3F=_W&DESQ7i53U(uswSu{#j;mWJ=^ z;|<%P$<*|a6Q}NlA)Qf-J3(1ayG7b0^!;{6DHSUE5J%0*4HLYQGo*5(-C}S0q^PjH zTEGhi!?JWSO!M9_z4c#?ySybm%-&@1Cf`XUGX5Xzy=73G+qN#80Ko|sEVz4P!QI{6 zJp^}mcWc~(I|O%k?O?&(-Q8}l^WA;F+WV|kb^qT})m7clZ@+WCQ^$D5n9ma>PDddk zJw8dFHgm8Q2c+$?=GCTLEpa!_BRo2Qcxz=ZcO^(9kZMj;ijAKqXxEUUW=d4!)n_|& zF8-mkw2{X`I%mrbiqq)C%$T*@O+=GhWUYo5^0dERY`;GlxX<}^F5^LN1CY7j{{ivS z5rO3^$xYiI?|c7z2g48+kqgWT(>mSb?PDQtB13|fqMtkt&L0;my1-!*$z|%X!nwAw z9j)8J%SU|V9xPUj_jNhg>T(q#9g?oL(HMVroRn=W zgJ>7$dp;DP;DL-+?j0{nj5xTj$B94^Gy*Ul-8dP?B1jd5z zeTRIpQ>oUew2;1uCBel@TKuFSD9pBp0}Z)2znZkEF3Gxm8qqqeuE#JAUDXqUj&7wp zia>nLP=$2B9Vl)VYh{CG9(DL3DmtcOjJl#oG1(xK2RbJywY6?d;NG#UHE!n z7OOqs$GYJy_G0ntOk30*CVjq-TJEH^d9kUIb$Y5`4+3Q?l&D_UI-J}+utRlJ$ z--05DL+;FZaL^1kSsB>A1i_msv9(cs3RX27BlT_*?Glpu`~ zy1@kJ4l4VmXGsQc)3JUW?(V<)b%IWuLaQFf8H&GjhWra!k=~e>-s+9Edu6S zq>&&bvj+Ai8@3NCD+qE^X*?YE@z(8+8^xq3BiH3O;>6@uPs4lC_Mj4N9f-v~iVto` zSBSrUO5}M7m1!u5RQ(Y}jZ){qoNDv(yv)PqGfG5=-Q-w;mekc=4iPtYT2=uGB1cwR zKRSQjeR5-G1bBQ@cNz1j6d!bdGo-<&NzStB$a~)(GL`0*liwm{+fYX~dAA7bk$8_a6OU1GoJsYy-STQRdf1B zXYxH(2xhZ#New8c?08x`JlcNUDlFBm;YVY=5``~?du*21tYa?%H(5t+i!@LCQP(@I zK07s&!$vogy8`;G+V9`Quvk0Wrpq^vJOmvIL#`(!^#Vyiu z*SS7M3%sQ=GQ<&2%0oF3L0~`) zF8S;2&;W15%k4aOxdK|A8yD9` z&*M_)EqFy<9DUS)AT2|vnrC=q7UbYG=)NovyK$3D#Y<$LB+SxD@J801HHzvY) zh>UuRDD`PcUKc)KYTdY9%B^x?jBJng5%e;bZlxsOLL4<)VmlwxbDYMAtoaz#rS*ANE zH4ZsgLrYDd)?{Soizr2P4(k`grmyYT7hph+e4nI0GLV+oNoL8aW!PmAg$X-yUx@-< z1S}@S8h%7)hFJe&ZY>yb(_Lf%Es)3rJAyjf(v69J_J#0%-nU=&?Zl(M4ugeotfijf z&REeT?L`w`u9TzY!TB^N3gLtf1F(Yd#JjAwHHerd;JI*=baw&s=$vw=$QU8NkOqPL znMXq*Z=p7sZ#)83iu)dCvvnZii;MHlqv1SKqt+0WXv?SVpBo*$5op;wD7CSyHl^Ch zpPjr3(87I&lMAT|QQX^ZTP{Yfx0KQY=3zUBsCs{vS97xoX3oej9RncA(8+uepi$Ps zg1GFu;7$cOvtI{N0AlSkj=c4;*-pkEXl=0fD;9n!Y1fLtHCfZlA6IEt#;Sn`+UXf1 zV#;gvRj<1ZpaMjxqU9HCcizdyf;vGz(z@f`%Gtgscf54D}0j+~c{-8BIi z6v?Iuu3}IS8x79pT;o=9joI$g!MdzueC;E-%*QjFlPvy>nuvIf$7EPCzcV6g;(~)8 zxfV-Kle!r;+^A@9g zaod|lE|Qr!-D_)Ur^SZY`QVQTN5ez*yXYJ^o~Vwtj-GdE7x=vT8IRt{m17TX2`=3K z3IzYA+ZxT<3kW)ygoGPV%fGR7Xum`Rx?yd$`Mid3kpA$qX_CSxfzxiVor2m*4BkRM z8e4roS4y1Y_0-~Yyf%MGF%XGq&q=(1RHadq z2f!P~c%Xdmizd{CGJ?;7R?4(DIB9OepMppmNSti$sWNoKI-7B^2f4|0XLy;c^)V>1 z)*eQ%aISwJe^BYbaA>x+m?~{YNgrZcw1QS>`qMEv*8jezj}tiD(&r_wAN142IctB; zHdHn{R_mygS<4w64RO7YTYwo8MXe8Wo6hd>`E=~I`hb09UGa!jtL=_g&X#CDDZ^4F zltbMRv0V4srYVVcn>!mM9!p@qe8H8^5-}TIsq;j|eehe(B_+RF&|_mtjl}{izm7pm zmFt>y^ke&5`%9Qkxg#MlMv&KUvxU>WC(G(-Pu0;|S|>r^DvSDrB4nxp4G;A;diEU5 z(Y!r3bj`tKT!^wTk-%Bqk871{N+FTY=u!|tzcky~7Y0*W!h>PZsL;1YUXjY;Zn)bw z4>E>g@Kt$dV==0Ktb-VuhVqule||k{-SNxF^I(8tXsPvjL!0cnO~%b)=ZYkXEz=uu z+YIg$nnXJ@U0>7H<$ke!!!Sxx0AL~w9tV8LHgNl%OWP)zYask8X;^(vo9nOpyHnW} zt9RQ498na)7S>Ris^P?rz;bEDt<#h-crlqY$#qS?BOUx5iaYD5Cw2fGjDP{;bnKjd zu{m$P`VEP*oo4%rw5j(i_~tV{NTM~SiTo860vk{I;3eQ^3L3>ittyQ9baU>tfG|4= zL-c1d0L<5+xyo|u8J{I}c1ph&attWLkXd5m5X7k`_Ms4j)|tSs#1}HllU4eBxf$OX z^~dLe8(i12$~FyE^PBoU^WS@U4QlV$-8XtZd*7~BpLnPD6I226(!Z>Died=(sT;%@63<+d;~>(ehugkZU00!f zZPHJlw`Rxp_8K+0YN5aY7m>^3B$d>S*OHVhzl5BWpA-xwOhcPHO&?xZSs+rLP$ zT3lrZ7d2+CG27J2dRHygZ!)a_2%dw>*6G6#Z%kb)BvT?MZ&LelmKOh{t0&v;sd#o% zqldrBrWB@f0VPy;^GhTp^{Xd|3Je8dForxD1s*}a1R7N2_^p-h&}eUDD>I^Uh)_g1 z-r}QeON&+%iNd$Vkd{Q6pC~-A@Cv)uACNI2or)Fa7VubON}o*ZEd6hx$>F(gb^; z179AmT22!U>rt=xc&fR{ZV$N^D)Wp{rduxA{Jad&;HBJFZCeka_opK+Cq`$u69x|^ zl|%!I`@O1>qClyB&4+V!b;@=c?t+J(smDy6aL0>{$es{L!gGh+U!6QTdv%DSHAbxe zoG`7T9*&n`!y_+y)ah<-5R)caN#&Q9k;_SJw~Ai02Zl^$^U?Ga7)W zO}q7LFKoLHT9;QR{NmUlr|@zsUy7%Fe1Viea2ffA9`4I;C{^9Z_KdD4%++U zI#>U`sG1K-AqDOg>A}V)V>_OMxh~e)tEGE}x<9HOT~!I7EFef9=J7HXub-HgpW zcp!M-h)_VDz$an863>Le*ybc79T&+G2?;FDn2V^iQUXY9bF!C8y;CmLL6(;N^vf_y z!Iiw9gA{I^F`=p6I(>hd`MlG8B*JucdcC*Y zx@ytpYrqF-g)vcT54VtwNF4bF|A(kLF-A4)E!kVV|>us4*BdYASn`+j48IXIgz9 zq4zCSJn{>5#h_->56Ez)R2?c5Zftz)t{{iA)h>NL_??FC;Vm8>oJEqfn$L!t`E`4g z4m--f99#5_->~LEJjPb};}6US!J9F#-?I%U86}n>pH?nk0zQFo;KEBoZLu6(yZCg; zt1^wS>v`%RlT3oX3_KXa@G|Vy%L^jX>C~%~sa79##rW(#?X0;M7l;TeUvst36!QNe<4tY>HqNKQVM&0`opl%2FqFrFiczOvM;2jVevf9zT6 z2lO$%*STEGQ|xKyAt?%UW%k*|jrJ2s+bIv4D&gno)0a3G6pQMaa@Ek2%4?P&u4^vG z&l)UjpT;)USYo$o-fGdh-S!ywHf5*ea%7zl7<#T>TrN6NkT2SOri!BP%qUlbhmT)7codp3)^wbhmMH5b+;U(4loEPV*& zSes9x#H1)XK-@OqTL0Q_C>oUXx*fa_{ zH}{@6vIS!ceWfravA4SRrALp-B~_Uo)-`?!Qfw3k9K4pfdK==DEeqx|JWS&Aq+Fz& zKF3JBgVe@O8NACW%?V_Yj1Qe%sofp6l+Juf;(x8t}9TngbVf3FB0l!`R4?Di>u>eAp8V9(Al2cYTQUx4r;eK215+Rm_Vs%*qprCnXp z^TQ+6&o~Z*^4Hw!f%PgNObN^&FIro+3ZhC%hJ-y^`s73@yG>NcM`n>@B@Ry$8$ZWK z>nr38@)kBUG&(A;rPlYMAdWf=UB0sSX3599EXNM|^e}DImU_EOVO=9eQ5Mm;)<3}biBrsv# zccs8#*bs+ML2JnSG1O=@Ocra1@54vOLu=QJ&Ai~g*}085;l9y33PDS)r;)as`to?) zGBV^V&pVRotFo*jan8wM@5_{VnSKEw>EA}ai(=Ft1QPj@@(a!Ha^zKH(|Fe>Cj`>o z=0b1dlTcT_jf_WpP?G4%lRbG6k1wAdnwzab`wU^)Ld&{AUxxr^K5s?U1y5W`Cf^NE0*Qs~3h$Z`NE*trM@J-sV;U|lAZAr-&o`U!b{(*e5 zys-PkP|9e}W?>eX%zu<_18AKo5NZZ%@G=zJROE?`Ga7*fn zyp3V<1tdFyHjqV$ZfyFIwJ2cpyIWTC-g#H`9L5bjP;*EEQEl)uBF{Pf7Rc~SGhd{2 z?YpaOAc$N~c04yO3!6bF149{27W$l344t-?M|}mipZs<9+?@8B@HLJP)R@<^KQJH2 z8Eh8l9$1s6gTOPt*=)yipVVrHr}tgY?G9V}GYzMA?jI~r)P*~Y)d46|elZa>^SzXP z)BN`6kHd22Q!Qx+Gr->VFr|6ZQJQF$!mf+h`D^h)39;VegydVaqJ)G-g<_ZFe!(XB=|22Vr|cI6A#mWWqKYcXto#9oJYeS_}DzmM_-iqa?YSq*@7#6gWT&1;_3V=ivmpr87uyPsW`uZBmuWq7q!ZL zAub2{ij|HQ@?i(jI{8CaoW4XKPuP(99-XiG<_CdCHOew@q3iX4w4{Qc@L${u$8E36frS{=y*aseZVqP_3>9Sfh{Eb~|;gL>P2_d9ev&YGkS&Hz7 z`#&pYR+!>AH%3#j-xdkmbdQ^!e*rx`@LE&@daD#{%FPEt@3EY7wjE~2EfmS0eyzg9 zjxb2YohaI331viBJ~LA_+K=e*x&(wsoGLnyi(aur24o5&b5u0fW!*-b3USHmn7*oZ z;d3~tu-UHDK02D(r#|z&#S-bhm5FI_hWHU*+!Nc`R>EWoN?fhl2|jl1?%}SEdOX;M zKXOX6wsX4dxWlpbCAoF~OvwyYb<-ZX4D5-a6naPw+Z=jZ&0&i9$~LX)#5y~SiUv60 znr<=Hmc4KrtRsC%ec)rzYgbunJl^7gk}4&cq~ThQ^DSA!sX!5iy1>^Hpa|)H5B#9# zJCW@n_H;}G$ZeoFu4ubB*R+VyKL>(ABnlNcE7>!43sPgUEJr*Ky3fsa9s2EOMVV6Eh;vlODiAss>!vYDC9AZ7z~vYI!37#UlR{7)0Pfb6K(rN zYykU`fnsov*d8Ec3CCnPX`x_eO1oDbejkp(rUq-6Rl5C%(i?Sg6;2=ZNhomc#y9;J z8kfsBt&J$d7VjK9Ob6j+8#tH9)A6*bh%vP8Ol9HT-G)Ulx$@fW-)e9^aT|+)_vv!sm`bsCi9q|m< zw%r!h2@vmp)(Z)GOv8qd#Q8X@byXYJN5U5Uuu_GQJdDWpt-mp$->WI4ed7;;p!gahEG^-h3*WJ! zDWx}*&2N!0vMJ;cIkH!^oGwf>EzuH)5g_5*3wIEo7|-h3; zpz7|tM@L5#PGahPL14UV0N(@~OclRHWB{$RwPB;q3N?xGQHc4}omYMKndwVyBigJ3CU-z+W|C?|B>)K2P z@Fkr3!&)u>{?q^euZtY9Zi$rlo71L2-2b@$zb@*26arsz9bA!Q`QPgBzpwefs|s4M z6Q})FP=(H88y=t64ukpp;Y=}kRo8|n$Ju!zSd_S}kpN6se%@}Cr+a)p$UgPe0*eg_ z@gum=8UN#LOOQxWBIS^UFMi3HFgZovoj&_$;QcyRIJD3?BgO%|K<%D=y)}MWwV(H% zu6M^>?0Wa3J=j$j8$*}X0+aiBZZkaK#rj!+=~?6OIMEU$p6r$oOP$w+nH^?R9qBID zT_2VjjtkZxV@E@k`QPqU*DS35{^4H+U<)21$D|ePIUV=nrVFK{dIBENoxF5lvbdb3 z{#0o*fTgv8V>Id!_6Oh;S8~_0Ody?RnD$bwX?cZSo!UkHWBDhNV$+N}2gSqb=}z79 zgDuDXaq2>8OKpUm$TvV~C#Ty*+)ELG446q%vP`z#1?TTO3Qp{=HlZ!o0jTTfai$|m z+F2WOqA(-?$s@-$1Urm5Np764c1FN#)YmgR2!Lh*Hrq9t7RS8^#Zb$t7Nx4zqlm7G zN+$UCQ11_r7q?{d{1qN*_eo478k5(9yD8FpYmmxuq$OaXM()e{2KGoZLhf2>986wB!hD+ z)dCK!6lhH4F=<_nF^rl1G1DKm?WzPina>QXs_Rp`uDH|{$Yn`&KHhnzy-dP*ycudf zja5${wh%ZdrcGZ7ymHkZ-On+fO@u3*ziEL_ftDUHQ}2@^)oHa@G?+|yF@2-LANMJtWC4!GjNKJU21HlfF7-3%qSmk_dT(i#fbmd8j# zUN$T{S3XFTdhzt=aORbEKQ~`%zKz+UQ0@NetUfZqzKZR=0$(}v0GCjxHqmB!xn+9w zh~-GG-^p`jwVVv3HWph13w4)YgXyuzOh>;cRh@`BJX^C%R_SmW&%$i&9#?nGJ#)xj z_)r%HX+(RTB?<*24025J{pXbb-_uPJ$6sXRu-1Cn#r?WcGA8cBiud!~*sM9>*ad2S zf#tnVt?@qK(fFRgeRqysrxP>k^#O_@(h(ypaVYx-F#{4Id0W1a(O}nW%s1cKN+5BU zI2O#~g~-gGtK2`RLWVQR*3+8dNgo6CoN}eaKNG4785L)8IWO%xEw(ymAh_oF(RvnkPI=Sn6H+1W|z681Mlu#_Z>V~K6x85b2ExW2ZkSF>=M`_htP(tdvNxINt4lmf- zw&Ahjve`rcEJs6Uc54RdO-Dmnb{1-kYu!c|uEy)K3SHN+>TM`j?Y;O7HW=N@cI%{2 zUcvkZg|m!5Rj+R9KqC?ZsVMX&b!ZCclwH-%hlTfBtegd8)0f6W3V{g~Vc?@_aj*?PUMs z+4~s!Eu4OhRIuln+%x6`DBHnBGJ<#e;SVJI z8$Q48Ce2(R&ycT&f7EURK9Wh%@r3BqhPD~4)NsVA)cGQ+)YY@?VEYmSzWqP>wb9Oac=~ITmsrc({sY2j;MnvO%su5>a^0JSa4{*d$s&m&&rLESvQboxb;L z^orZ|?R3L+9Zb?He1(S#rd5P;8^%Jh$Wj;m@frt0b&7pFw(SX$9d~t@3`|fT`;@9WBWoC_$ zbb0<)ov(Z^0^iu~2LIb~|6koBF$zlte~1S6d)wkbz2nW|e&`&9nf0tgnWBq(ARZxp z@^XDs_c8;GEt{$QHC06Y6O7G zX63RjxPqr_8*4I>Ai7UOTu`E&a(6W6pfX*E5De)qpJ9U4f68-n>dH^kQZFSL5d%K; z9C7xw{ua#aM&{e;1*DXxq8x`K&jM1XCF)ckk9D5@$=F!}$NnygezWdRK5KOt+>QRi zg5lT-?gf+g5y`W8%J98=RmnX6C?eGbr-adg-K)beQrItKfdsB2^&}Adu=ETc-u2g^4Ow#*z;`JzRTDpApg;>Qtc9mh`%!L8^r4fHLdHqMzK>X_yc!e z#_d^Gv&tkY{O>J-3w^;2Lg7{vJe3jyf9&RB^>egg|BmOofd{@9$TrmY{hcW>B%>E7 ze=rPHgT4NVU*ONLf$LD^V#|^lEzK^Uz-zt5yj>ey zX+TGPz?p>8_xr-2y+p&}!f)nE+{h^gx)(3R{1I5~A`7eGzw%34KRG7RG9*N#B&I}Q zFkFT8ZD12B| zIGf-v)9pX4h`%C!cQ)&( z7iw41S zKhLa&NO7SBWRkI3u%oy{gMFk}HhyvHsdmP$q(DNDr13S5gMrbvPdCAY=NiucMTvuGN| z0{Z~MdL_1T8$>myW_4XohT_PxUGm`6las2;H<+0f8?m?c1w9ti(VZ}I9)A+J0(A~U z%tMan$-nD7urba+9A}3W?aM*4Z*-&ovjA$7`9*cwE^G8FP0&2d)v7E1$Y69vemHUr z4%3yh`+W!U>iJ@=>0CR@yo9x^OPlTc$BEb4DerU1m{-L%Ql&!R{aQ{@ zHnmw;UQ#+1b%PObg}$?BZz_>X<52X7*(lsntW1vzi!b{$D7#l zVYwiiA@h0e#dgL1LNT83OXC_Kk+? z=CjP%T;+QO?Qh?xb8F>=2mcHRZIRU@a{tp)Q%zBbJByEZqXY3 zLq1TeH%3`4xAs}DXHu%mAxXmrUzkj0YF_P)&?8{Io`fa9V~ma!CeeuK&vdoyY&i%C z=`?y!5ZgB3R;A<*#f+Bc5B`WrVs&Ua;|O|b-D1Bj!Z`)5thrb^lS?UaY{8%%jMAjE z7+1}iG^m@OrC@y%i8zOgUMg>+mi5?&eDvsX1-5C+#g~_J$YjeSR;i`N z{P?gfzgne0tvtB?iOA!~GE8;-qcGT^&)R)^wrED7USgDY^*qYsCgGf>79eSXAG{)z zOdz(vd~FwjMn0lX(Z{rKqzhf1|K|zuK!0{UOLva56^Z;le(yE(neSaK1vfAB_6_Xt~ekW;LNq3VFlm=8@-g&MNS9<0)7*Q<H|y>ObGGD$3tu)O&%$r@ffqI-C_4YEqLaheTaD9q*y7Oma^@dhNe^r5U)1g#VNn zdNw|p`-jQLPHNZVFDx!+yVR(DwKqg(#NqaVdtZwh~ zNG7MU6aFv;Sf@g*sZZ|iWHGM`xzk^u2O-!x3vwldJ7@!6B4*_%UZ_{|ss`_m<^EJq zi&rcjhuv>fG|&6f`JGz#0p^%_vB{!_~Osm;=sv!J7-nCp+x;(0z? z7&{~OJnLmwD#OI-q$C!z&-x-av~4Jx6A5gxTGX1g&7?k!R*QQsv_@E@y}=jQ0VP+P zYEzWr9l3zx2JexiZ$|eNumlWo%q!{+gC?ViQ@*D_G)F>Zi`8M_z!Sw-JfWmvOXGg& zZz_Lp+id8Eb%Wc{^!ly?$ghsMpSXFtB0{YD7W|-@g!Fgr?|<1tVPOJR1=2vt0^FLp zyTZTU@c%*$!h`(c0pU>Xx_|z@8yTU1Y!G6tWT(%Tl`Q|^XaCDC_80jJ0}z2&1NHt5@Le_X_Ak&DXjlgOhGibu9DAhTF3t?`9B|@C?17znmpdG zY3%FYyTKs>(|U}u&VN7e{fOfvV6hK@65Y$D|J1xh=A_`dPIq?w;re^Sp&Lbl z3=FPFl5L#U{$nxqsNlMquj^Z8{Zsdlq5akLXcsP;|5(h@Uv;fNuWtB<-GC8nwu74< z4bH8t;vb8#{;RG__w!n2e-C5)&oKELU;BTC$$v*3|7SJ%Z?pYxhl!4f74N^e0RC;= z{eO04@e%@fZtYOxFquV<>$K7nhrS;gcWS8q?mU z9NFv(-R_v(*B?(p=6jKl%i_W~uW|7s{s1u)OPF$rPBHdU-NkDr@ZE=5n=k!xgfqvC z^4}*hnK#tiT)|lBO!00i8hXv^CAY)IFx;cztqrHc$qwiG)V9`JxN@$;7FU|IVyrS8 z2V0dxKv&2645m4oy?MK-lK9(J+3w^kcxOKAbGUg}6#LPdI8yjJi*Yrb+0Zlgp1*EP zbh=P8^NP>ya?(EQJeFKpYcXfRi9Z)RIVSohl1nL{orq2;M|Lnik2OIL6QD&0_CdIg!JxQ&e+ia%-to2f zd*VlLwaxuYgjnj^*qeRHd`KAN(P`7J(VWBM8;mCzuU_xM&u{7W`0{DjomxL%kF3+G zOd#()LD?NwU_^CSWwya<8EsmBtM$+N?Xp?UL_C<|G0_A|$L|kHYB~!xJZGk}0L~;Pg8}P_A5%V~IrkqyMMd}Uaa#X*0 zQxfxSnDmxA@Ew|sYj$5~QhJXLzRbRQU0PMDy|zkw5k5%2%tiry6pzhGv|&*nK`N{r zsoZrK@VLp`<=)A&(H~BF?E=#KW}be$INp0zGVXU(YCpzOs(r>QT{xC@x9kbQ-qqD1 zs{7VX(uMfw6>YWXNH%EuUXSd?X>c%Cc^@`gvfBMRSGugQmi-MhA<{)e{RyL4v9KUV4)?1NEQPmcv7gqg~x-Cdic69s1H{+HQJGH?m$&R>Uz za=bA2Yi>>nI-n)4iRF2r)boM6R2eaNU$3Z&2xr82^4m)8d zYju=@WO4la=Wd01)iDIL>iXWnDy0sZQPPuH?D{!r-?{$qP~HFWP)Pq~NeVuw6m35a zX4;_pgs?OJ#zrhypc<8M8u)LPh5%5EXrQab`S}~(_tnNg2kXU5rH$Tt2j+u#yQ})0 z$;3g{YOl^H2k&qzB@*=zM+-na+;QSCN0I3OWoT>`(3$)5NGGYUY}lkat?NiN?%k;J z?WlCEiCJ~K5+RSZJK5v%LD_j~~P_R%&5pBn%s-cAm;aMM$3$y;&WuXOOQ zl44Lg57qOA9yu?cmsl>=mN=R%eLr6+l89HLQEeA-*ck?-v6%7gU#Y!zifQq$3Q7jR z6uL}!PCmXg%RLz1+bq^PYqt-sQs(#oEa$6I_&QpLO;c2XU~$!9J@Nn=eJw@!68}`@ z-4@t{CAXw6L~yEKd10kLJFU9f&}mija$(^4WsO|6-i$_>@$TM6XP zp`!js><=@UD{Lk)^o3gKuQ0@@0eOj!Dss-%?wA-2*Hl-Zu+esitix%8x>OY&=g#aQ zOZE>+=MR5L3zQpQf+YEikx2xuLt4r&Q}b^m!zUwwQapLG~FTC?o|8iO|?mF{HLd8##t?AQ)O9^5Y0;EEjE)5ss*G%% z{r+Y?Ezw{x&n<*)RHsox(h2MN@9w}uEUBH1+B`oZ-8uBy?H!s@rBjTCrTYEVi_$%_ z>IG?YbX&rP3d!|Xpb%W_PE8y^4+2G>nMCZhGyL1$+K_#8UCbOq5yL8gx}lwB01$Ok z_iQtKGI!P2+M&c~2F+PUCe_@|=NnkD=phg?&%iKYLwDq(SDIt%afyrbuxL^0X|6Yt z%2xQ?sq`iTR1Gh8#k59>XR6si^@;AfX2~TF8lA0jZgM(&vHI5Hpb>pqwfbDr!=hNW zu5nwDWN{RB2`7l2gMt<>WBVN(Z!6GUPQJt^I6jYqSZ+Fxn$IB1y@e;hD$|#-jg`Py zY_Vwr*E==sHMps;`4l_vaxXzyPi&n$VIeDM=zq z)~2nY^#Uscss@=qw$!O%ADsvvgaw0k=A#HyGimy08b*c{S&~w~1b3 zjrdjtEL1Dr9+b;K+Nu8DKIp3B)df;__>@VbUWVdLr6*J!O+a}#U6?=|_%u9#6&lu7 zR#zR*26A$E)Nge?#`g9afX8av?#kp|mq_`cauWS-%SLxsy3=J71E2htb}=#U8ZoXl zT`8&E$piU>^ZAqHrp`s8NVc;CIw`&t4X(Ct?PWhrL-hOsv@7x_;qyGiX@XH?eW3U>rt09%U^`4vDJwrkQUfNC4cvgO9hZuO#toz*OlPt2;4!zm@oc zGpJ`vI{5XFlak7PQouB-2|2!cM-n-JRS)j=CBExK6Nwx>J?yL6FUqmu&quRiowIzm zMrq8>tzPf1u}6n?3zZw|j`ycZtxh8c#v~p7Iwau-;E2;G7?r$jN4xqR=$wCvlr2n< zMol;wM=qUWzA(r17uNV^Q?G-;Juo!u_Dvm0p11-mzBW45WeP^P)7ibp-F+%lltNI- z?5Gv$z-qlVciTg2^AUB`}Ih8pYd7YSej$NI~Br4j}I0}HTPu}+5{U-G(I z6)*~ic^D%_J=ycDQI6h|NYt|4-F28K1}7p3)R@X;e1t zhR@EADDEW99$zv6i2w77{pSB5{zeTOnNc3|6-{EO8hZ2#hUBDPER&;t0Ve)L*DA%j zH5aY9%7+#&T9wvGKB`KeC2DrnUttVct!O{!M4gqC&j zv~m(-gf6367~WT=*NF*Q@7n11!)9OW)rJ@@i;kC)%fCLbc@{ZsrJc#?(tYDmdU|me zfmsJ!-8vSkc1t>nyThh?DsI=+QzZ%We9JMmP@`#c`_b||`NR!KrlGmYyhH*byfI}O znM!Oi*v0nD90VhzjDj@cX>ksR8Uy<9!pphQZI2|b(k~ye5 z`0B`ggApGCqVdPJz+Y*|P7+ z4$dil8SJujk!QTma6t%Uh+DmLtDoS`VC|M+m1|((0Hma1K4x13-SqI7R4C$HzO%|c zU+*JFj9)WySxUVY3X5?Tgn0ZKhQwDrGW;o4IJczPD*Fhe2fr^lXs>b;X=(V&5(`;R z_0%T4yuKEior6p-=1J!;2E@Uebumj#MI8Iun*y8FijisC_G(cTW4_os5wFK>0%>Th zB%7`6VxxBo*soYd6w|%Y&^!!k)$VxKV}EoWbutD=|Ba#3%2-gnOP-NxC~}?NUPSHZ zUMI3>DH>6sZ?WUlRhn|^xxzw;HZqyb@fQ=9O);enpg@%@l)5 z4{CpFglimw6@STW->d6hO8@8|AkSAnTSg@*UQG>oLsju!7CP=vX1LMuTlfn9vS(Lk z$KiF!jC!=mL`B_hO9zwToN7U!8bN#t-7t;ScDgy>FN$WjU2`Z~(j!^vuV|LG;}jwc z9zaA3nDwb(N(`|)A=cODCmnyu%|m(Gs9N>RALI5oA&e%j6Yw~AZ1m~F9EqEn*$Mtt zr}E4?c@G`{(sIsot)=_he$}1vxqU+-O`NSnp~xJzAaLqL0;MY*6P6IB$Uq3v5$8^$ zZ-sVo(MCIG`I)j>FDrE3`6nd3S6c`I?cIwkC<(uRy@;Gq!+dv=mF|>n8oEWHB^)V-Wbhgy`V6UwjA8IQG;U)FZNqm4vC$`uQ4K7FY6Kl) z-1WYwkxZ0oTm0T(NGCy~LRJ1zhCdEV&rOYOY|ka-f&=@57<)UVGgp1hk`~?y0-dk;&(l zpa3E$z`yjB`#K+)mpX>m`MVL7@V8rD%KXDoU%s5FRJXqbL;wzVAHoy9qwpBb-is{^ z19vBz*|=TLl1gX3ORj3Mnhvw;OSnYyI|#$%LBb%ZOXrv>4L4^mY*s4J<{AI$#$new znlHCb=h26}mP>oe$ec-~Xvy31<2Xm?6kd=jKVc~~715yv^n7}>L%iObAb)=6E3p63 zOJ=wn+bkv5Zu;wwWbsO+cMtcI6F7uA?$gZ-u-1zG!A?A$2Wg3lmlEFxBU!3M9woqN zd8gAr^{Dp!hyKg@GMHl(l3za6s)Fh1?$D4}sWsKCf;|M+i5oDU>7B@v!`(w`nhf^3F3Mg~Yp0$2h0Cbreyf=N$ZA zB*Z(TfNnR1N$OAczm{<>qdo^>YCEJ(mS27<`PMoIYZR zXU=Fgh#YdimwW?c2(Q`01|4UD zBA|U1<-uui208(q@Ai3|ohbi{ySIvpbJ-ep6P(~4+}(n^2X}AW-Q8V6aF^ij4gnf> z4Fq?0m*9GOegD7KPWHFX<+(Xy^hJ&Ce(NonWph3?r&N~eU8wp}LwtqC>6vH^n7@m- zIzE}Oy-;9;P|A3wjG)q>5I>ZSUEAxC4!DWOeJsGQr}_8gu?2P)zLZ6(1#47 zo@#YIG={*cn8*|QBA}v<)NEs5Z%w|_3m_Qmld{+Iy!vVyn$k#DW4b zmM;KN+L~zMfv)}_34~8U_UWF2@aad@`D9+L+g|p;R%C2rttHCdrq^1IG}MROgtZIg z@z_sxyNpf)sHCIEE;Wc~lP`*6^ukSHUNI|BUM9U7fx}{Uf+V1&vF+0| z4ldmn&0&N`Tk+zg?Q*)rrcuRU3G%O_ghDm2TWP&GHFdi?2ex_Mtm&az0a&{Ts0ngH zPPS7EG&g)qXJ_DCSQ{jYC%HufXx92yJV&3`NOj+49Tgp<65X~mH-AfIh#tMfw)Ny} zdY&O4k<$O_gbVh~q}!-+n+G=b-QSu#msnXyIBE1+ z#;6BB?d@d2!nB6dHoB=rPkqA}h=|ltnhN&=?l+<+t9at?2M&s>wpFDHlg)AgJR?=Q zpP`@T%s-EgoaIW)POt_8LNC$!s{dCSwcP5Vb_1NG~IOYCJ`^Lg$rQyHXwrLg*j`&Vxr1g1O!lI#WbGiu5TK~tM%hFQ<9HD@IHE0u1XJR_H(Np&>~0D zDfYFTnoVS}sJTR7RmUP6nWDMCviKa9Y3c=w2d6J)WK?og>9$*%Qqrg@iJI^YM3?4i znibxJ9kxav;|XZlG_2vzuO6EX+A!*M7)GC#Dw`E%hkM(1iwHl}WDmg|ql7U?aN1>< z8G$Uvb($94E*HD5cGwZMG~7>s({Hn9+}miTG$J~#DZI)d56~zS%*;K_Favareu3^` zt{#UE=Hz%R%`}Dc8m$?NnjZIZ|JkCGT^yiD6p_X~aUy$eFBizjSyatY-hB%cIZeh> zpM|87u}h?{g<77cIw1FGpTgPf=GTs-W@B9`0taiKbVa3&?G*_@W%&?35*=`uf@4=` zoh8F;btkIf&?jGH%f-l5SCEifDJ4DV8ItF?_K++Dnb1H}qCI)bRn-5)I670gU+D9r zEnb%1Os>QoB6C+WXFyB=QA}p)+=GpZA@JCkzYGWUYXZL8cibQ4vx#nG#%o0tak}qdg9O;Ekd40sKvF|wh0-X`_ z!D%JA*rrj0^mu7tQO(Wnn~0ICxq8F~`EMz9!#W!i%~pc5N3UQFMS z?%oOP;W~VHuMwwzIHgsLA3f?bZ2Z$NjqMC!YigyeD-snaXvgA%Q^lf(9sDYHtIh3KwJl%3q_e@H5!2jcZl1F=^V-Yu z)VzgZ`Y`%t0tEL{iB59p&6Po}fbi81XBIk4b)qwvI(dd7N>>!kgp=87KWt&4f{vO0 z_Y2*+Nfb7Ij?bPvDH5{l-d`|6yJkj%H@j&))LDU$?~Oe<;IYUi!WT{?k1 z+HBFSQrEE#8!itWTPrWAa-yA7#777zT^r@Kv0*3w4=Kcb0^Nf64&oIM@ApE~CPq%y z-x7mxpuzIsOlbmlhuMCd^CrNpAao%xeLSNyNLR>ofezrOPa(JR8jIb|oE`1UtV!O) zUk1Q}GeI1=IQ*bqkA7ZiX6bWoPxT(krf+Tf8WY%!zavuy?#KNIKVDH{c3l zS5qzbC)V>bctro+$id^9o-sOBTt8l++p3#=2A%p+H@9u^_Cu@b3|R?zr`az1%r%0* zCF;TD3LedU7RKxd6HTut@#n{%k7ZN^o0ex>Lg-iRp0ca;SL>VHjuRndN@5Tt?b*Qr ze0_B>0-lUZr%=m0w;bN$dTuhvO+U}+BWMO)YA9gmx+WB%*BxfT-%b|f7;VrhJ|E3h z(r5cDt>z+8th{C5hA^kITbSz}1VJO=&k0TllpW8>Yr4|27^VCIdEb|u2sl}+8^&mS zbaWQ2GyS>*v?-oZP-h&3DCh389!}udTY;ZxX0l%|)2*zls&BRAw(XtxWB)}Fz(cqw z0ETCYaf!*%NRgIzCQ4xtT*@er$#k%t<~M4Lpkjp(itm6vmMkQ7*f2tiq!Y#V3#l(n zQfs_))oYAsb7z+5kl7}CEV8UuYc)z!ZJ3l%eVE>tyZ$G(Pk+kB+DuN(093QHw45b8 z7HvC#tvb>|ODL3IO9_fkRT!#?s{`UIc28PQbVIY=3}zuQhY}Qd+&Dgb3BX~#xp|!OdZ}H->g=W zs|v+ZLJp3;dHBCZh&Q`8wb!La-X-yGNy| z?Q~%FhbE$Qv1mjJwgdYfjcKKi{W*h$_81qsJMA7YSw3hTlUA*-0k%qPt|Mm-yYq!% z{pHhI#wctf*t9I^21BqqS=d(>%X!x6UJ-aMKmH?4LUH1nz`)VvIMTNR8BO(kCzUcl zw+v|%^(3*gChW9|k*5cM5`!vsLX&QgEg23%0%GBNw#a1peZb#GYS7tw1BJrgFXk}; zn~LSWUd-RkDqW-lN3?Fpsu6Ce@1~e-$R@aZ2WqvO~Yt2(m6 zV#sP)T{n`znz)%U(9)0y?(QS61!JKp4!z5FEE(BVzb<_)m&XRgpW!$u5CEU9_z4(u!=(istWz3qeDU!}Z=s@<9pxMv z`KoTY_j*qN^5vrQCtSaNjLAebRtJZMeCud*oaH`z-h7MP@OP}qY^1NK1f7c1inU+0 z`A_eX+HOp}wl!J&UX}P<-#)@I)7oj<)Fk((40^Quxr)@8s8?!# zQS&;SdtrIVkw)@pJe4-xD|+!G{8_qacI2T0(6xV48>~edCJsjLdR7blrQ4s z@sA1(r$$1tZ)qKP^y9Zj=ob;%DxV)I0?#yBB}`($7kZ(&(4qiKKTB+EV+)q%twJ6Wl4SHqqyde*6w{8ri= zuUBcgclIj|(dEN8&ph1SYauuBsWKOt5+F8LQ8*;?D7=kGcFUKY(GW}7oEx*B*x{bM z%1VzV`a7w~rN^kI>YhUM4)Inr%D@76+^a$qxlep7U_`z2#O**VHk&Cy{^yO%gL_i@ z?FY-QVrC^X{ray7f3e!bF=JQWB?%m_KZ-6yOVaktZ+y_v**qQzl|8FD7&9O67MDGnb$Ym zv2bfS(u7JD-X^7_^cD zDk)`(r{7Z9K7e7HN(ql4T#OevaPyzfD`!oWcA`mTWo3QaXL{I8v2eUy@o+#~IbLB% z3<-G9Y_z1Qt~D;>gt3O5O+Y^;BHH}ek3l(9%QyZMcAn~pcPW8M2Po54$8jUQZnY)s zv@^Y{eQbDfAJjg|_RecT>HOs4oGsruV?@ji>Eys-!l~^rRl+7E47;26qpFI@gv3wV z#`(;z(Nb0Y{jLeAy?!Wd2G7B-AL;CK9W&|!QQ36h9XP0~p&;d_M9f)c)UK4ai#|4L za1XH_QY=VUnrbmSZNW>aO$fS2MV;+@jyftj(II;B7FL`{=_a>Wf@wa%|6+VC6;_aH zioZ3Xk1!SCGst?TcYBU+CB`VD(QeyodTNDHXgy=CG#PRM{`a{Vbb#(6l_mO7nWMi9 zN$5A6J}u4cNg>}9e;C1AOJeT%pb3*`50?!k#yZoccvSeW6;WI6{}1&*NJot-2> z*h#^zmd4jWxmx2-2rePrxH~tR55{AoOg#Zc_``=RTMXJiv0YAV8QIZzLGz8b>CgQY zIrxr=EI!5#UtiPEytbne|A3sNz(8Bvly@-iqQT(idih|3sK@$(QaOG#(bJq62l13Knui&D)mx?Mjz1_z$HI3j69H&4JP&*hkTWL z3)eXsSmJlDQyY&8546MS<86S6a4?veT_v0$25Lq2>z%Fo!&QVlq_Q&QJbJ+(lOXg> zD*sBY9(NPgAa0P~wdlS(aY|B@!{{V`_`Lv^Qy+wz=$kk^35Qz~kLk0J|ALbl<44*` z;UmXHIeMO|5-$Yp9iqLy6r!x|C|EG0&qB1hdU@wNKVRQ7QRg}x#}C8^A?pK@1Xb#% z=%XNm`2%h0O+*O$WE_}$R$36Pc#iRHmCPED^0W7bvUDcWGGHAWzxO`PSk&(soDe?4-_Btx^%X9Mk8E!AE~rbJCvpV=r8q-Bp=`+~VG^ z7e!h3QQF!HFELLvWyW`bh^AYrC|XW@RoAGIx1!BzTW#+6Y6D13Xe%1G$uqsPn%KeN3=2!JxUSQTBhMnz@WT1p-zkOf1= zKyfPpj+2DwuiPaNEoiI9-S*zCN0Xzj%43g7|F&Gj*1;+`OD+z^RLVpBbtRE@nhkNd z=b`f}MhyoxYlQ57j)H%m2_+1{F26D`xh_kt2&&104QC2+MIl|Cu*mm0evvq{F@5@v zmE&)7M|||V)rk0LJ}Zj9GxU}_M;qS+yf6~-p??hA3oog0U{yuI0 zUW9-|5&t~t|L>~ZOzx^BLQ2waDt)4lJh}UL`l-c{ zB{*+1-yX9>a(eieZ#*#xpoi3a?V1YD@r?ApdzcIhj2%D0vq+v6($P$^j)EL`!2I;1 z3>B5YA|*ZEx=F(!4_P6ze|cIq>f3={B2}9P?0;twD@X?>X|Wp^N(MZL=gSwTd-p8- zF9ij4OKIFY@bZFz{1G3L-+SWkw1gw5x8t9YYu^9Ug}*02PlHCZyGo1v@8ABDmXrf^ zXFMSo`)>mBpOHeuhMIE_j}t?4_w`?;c=)eTdL_~Y^&i#o?{X;immF>@?()a|_U%7^ zCF26gp`6Fd$t-!xRw)1VXEI9A_!>rfkNdYQ{8OdB60tacl`Kj;>FM*o zHEQe*XaJEt5bJ~gr>?&>fD$RFWTlrSj@keEb9@GsGgzy zuRaGoAQ+EkFMWc!U|ll#EPYa@LHNg?3P`{#$Yj6uE#jxYQ1Cm@7}3Xk3g|nY9*^xM zAtC3D-&QeWpuX|)Mm&Umq z|8|+n!5|EsKX1E&ijOF84Fq)OOTY73l7$}8XlEv)33l=oVz%wI(D1$}(??PhPGn6jO$hz{(1e*eS@;g;}bF!^!m40Oae*P>bwd8EOwVA7`EYa4K->3aY2W$uu zX@|saY$!PKWCD~VLg6iLx-AT6_iE~&Qy*c?n?Arr{QUB3^DD4=(8pGCG~0D#^B0He zWq`@&JdjR|fFuBprih+vhgL^^Jr;#A84U}gG=T_CrsLB7xm!$B<^9>P5k*wag$|iYaR`^x$ouO{Ctm!E* z6(*@)4^lMce$gJ`kG}j%&;@D8Hp(xxyusN*rBQ*I1;Q1>b}1^CoUZg#lFOo#
5 zj{i%%1Ntbsuv<{m-BIUKnzO9jPN+mvcw+6}|F7Ktr>mdcK%?xHMLp=WH`4z?hvRkf}^*!b{KeAZo!SuXQKVIjRjDH*O{t#P#Eo%%k z+G77UtOUW{;{2EWR`?}3q$E}ByBmtdtNMn$+-w06UjwtM*17%brQpeiaHJ!JeN7%W-e3)#6u1!>zRl#c zM|gESvtFQ(3pUlP2u`h55!T$=GJL3PW_)~`IaO#S@6qO=>~Y@SMDFwGjC%R5Qde7B z`!iei0fa0iGqVR^77(c7XsOIf<@=CEb9Mg&`SD8PUYBQ}DKV7gbIA2O8aq`5WRj(}qeE{d9} z6O_IIxplXx*?lM!@I96W2G<=yU*OEpuj|5XHbcD2+J;LU4zc2BA`5|$*d`^pfziTGu?tzTS*u0?I z;wdYa$wkRw3n8I)PN!6$;5!^gZxtv2^>xzkBFN#%wFZy-Dh8b{R^8Eb!j#SjHQ#nl z=#TDnBlUl}1;O2;#O>~npjWSo zL@~%1{c`g(@M9TtJJ`cTL3q(Hc$HpQrwm8LraAk?B z{ZZUif>HnGqF$xpo)nOs!nE~tG0bz^CtxDZ)tqd$Fp?RT&u{_rdvmGm2ZdR zU-(IAqF2~T-Ia3fF*RO=WYaqD>YnWeUhgXvdPsH)Ej@OYzhfBR*ZCPQ94R~O&)%xg z#%d&6d4afkt8cOVmFdshXjGk@%Cfd42TCvLQI0)#-&a5E*+!{c8jonH7MgaCO<9k* za`}=|ot@S&Lbe-+%(Y(Lvw1kIR5dTVH9ac*eDvb%k?iECqJbROtLcMbFzUdkK{%Ra zAHhzv+gER4F5GFI6xjv&2)f#qM?3A2iDds(?K&XJc%xDk^1WZvlR-tN$FF2iU|9uryG2Yp-<@<`k5KPoBtPORPRfeA zJEYiizYHqzXuOyvy#3Sr7ZkD_0#x~=Vd8!#)5HuK$2LXU^;I1!{Q^{zlC9h`fdz($ z59|&UU)m1&v}M*JEl%h39QNjGoxf;4L~Sq|^kP%b`&Bw;djY&{Lq^tEIE-Hu^)BH) zOef4+Sbg!#m2UY*>>G*K>?HG&#?l^oRuN2NH%bP9 z)>Y{Anp8rgs9~Qp>f9x>byo|ln$~c(cO9sefyRLpL9qDR+B5Q5+~t7-*-9PS)E=8H zlw?Lw@-4ordcIFSxsh)-91nErX2aPWP2a>tzroR?J6uyA*PU2nTBK2FdR*A1v5L{| z0+HukDnxobYa~jnK}+HRA$U2W^|7`VyiNRv}%x zbva(XX>qOEK63NEM)=cyKK4FrK=$?dx)x0`qt#j3x@Ub5@7u~Wh#$>5c+wj!9Ci@M zJdZjRfa}e>mOH$9`IsSE|u}kMD+#mClX~GSw%yCaQ+I#6+_LvMZSa zk|-JOsA#K`23xdw3tZ=dGw!CBZhhAko1A61(T!liUdkAeH{wa=n-r@DK$hE< zFQaP5#%9!OF6UO~@RblA-o2#k9wZ5V738s9EI3>^Ma|pAnI|kaI&^D*o%;kpuSlkk zvsB&wcn4|2;?rLSb8a57*Yq9kL%4$n&`1xjNm?{Jq4OY5+uFVN>vB5Bt%97L+90I>NOYZMjAD*o{aC8it=#fd#}kjqPDgxC20+ycjYB% z2ybA7j9?f2V&k2i5&u`v?TV4)cqQ_1^Ajwu!NHjE%LKEXu5KeoQo+^4wze6S+6?re z?7`;)?VEOnW!IB98jR5q0m|``a6jEL^>Q+dkz{l~dawPg7st!^7~_#tA*mFqq9+YH z&-tGZo8YZ(Z^T@An2feGJt|asno^jIcshR0rhhCxL;;_P{2f-JGh457cM&|Arqi!R z3rg$ECiJFC3|0@iiN9@9)p7c|T9Xh6GicR{CDZE_o{3j6+pQTcwm&htP2o4k7MH=z$MB`m4;8mL^lurQCq7zQ{+7s$5iWR{7=cjKgy_JiB9yzou%0bTok0g|=S(eU;urocVXS4OF)fYt-Sf|BLZY9j_ zJ$Z<)8W;dsw+?Cf#^dtxvGerjMcqULIf z>dp=Q+n8LkS4AZtQ*c7s3ex9{mI{2{x?0|0x9kp9HS?;m z7Z<3im;Jz@G#%GV*}@2}FfA&&GiC(7V`uPWvs7VI7G96B)T}pkN#plP4ktm07h`mM zV=wamcOpfLyM1;p?2`gY^?Eb0KyrX3n%M;s zYL$HpgwpTI;-#Gr$j1FTg3|&R4MRXd4c8?d@Aj+F@6=M<$arb17;AJ|v_c%ZF4lXD za=pZ9v>KGRJ*n~dfGIo*=s3$l{+AizPDBs`T!y#S`oS`aFI7+1_YjgawF1yG5XNw) zjDFQqw=>l*?I_j{8HP$Jmldzy$Qlstc=6K!O*cm||8Y+j_tJ>}@Sz2W0x4mEAXH;9 z&7Q_?^Bo@ls&J-E<0iUHL`1|G#50?0<`pWH8hR+d9-7-*5(>lSykM?u%NUi8wx0SS z5bkq+OzTY?$QjUK&?YJ>EF3fi&->GIo3fp`*G-aNtQ4b5+rDDX9+jrLX*Ijn4KOfq zd1X-Fb@FPp981&3OUnaLKjJZ*T4KdwVmOIUMsAe}OTZ!c^N9DO0pjplou{wsLFUG! z^7o!{ed+oZMriB)$lHiJrI^edc3&j@J9>I-;)O=b^1!4aX86e}i#tAW|5__I(2ir! z?WCWdfh^Tn#M_&_oNs6LIQH<;9ei6ljM%wOBqyAU&*Nel@@PEZI>#lGS0AwfyX)cD zQ9LB37Ix+;=1<=pO>*H4zPsi!8^>F6=ph$;VcT@Pw)>0)XiN;5m5HLM(;v2MRN%6t zQwDiQsvwc{l}wpiO@yOO=^s^TnG@6{Y+qMoED}{cfn@<3C0VT!ZkeJuID=I6qfKTc zukLtmdthqbaZ)wvk4!*Fcf*RJfpTy-AUv1snWh~Apu#_z9p)c zr+jLECzo;6TA`v?EH)cX6Ae5Fku_R5c=dhWOpn(II@J9M_f}GiX0n~EBj(&fX+HL+ zHUlZ_T?G%ao5|q#>eYAPoBLtV;N#6vNpsE23djCX+-Zkp5BLHHcZa36M+Y9~=f|6u z&wt^`BmRX_KwA2_r&)WnhBfmsF3SYZE^udw& z%4M=&dyMfht-eI~x?YPF-zoz^)%SJQJj8mA!Ovg1xd8cqfTeTiiA2AQ2?6$uCk1|Ih>2h*h{2ney=%IQHo0qC~C z@Qek^Zo*mS&HGd02alfWsag@9!|P6t$eSOgKYrDQ)4^fVC8;lWP$AbaXtz-%P`;3n zhhwo-X^VXEqvhvzy=R0?eysTzxDfc*=FEGu`D7=86~=d0Ueufb+;wFWrmzmDVgvx$tcBcq#N$NQoX%eX~w$rZPpFP90?AcaEH0#6bwVB zH9xJ6pMW`lT>&ob5T}5h+ae7_nHz7^7e;O{+Yd8g*PS#UdNHc~AQfng;5n#Y)Qy=( zaUr+-K8XA*qDy53kurfr5I2dF zip8KrKe8XI$E}hqL@zyR*{I7^jmcaa@0!>lpZqCs^tnA{r_$odSuJ0pG?gRaIX9X0 z!TCFxvQR~o(mvLH4d<{Uqd_+cio=_-Wc~k`Og)`M^b)P`EL^6F`guCN5&)K`N zQMY+|bPD5mcln%Rxf7@J*oUIc>u#9k1V`MXPR-cp@<@eMs zJBF7{qD^Es4Yjy|-o2UE#HGbdG?`8ynZl%ID_3Wy;rc*Z!XO>uVri3z(9g$EKLkj+ zg8M_+!7B*n4v2o&gp5yMwbqxoqO|G<1`cj=Jcn=k&{@im`=q(@)Z1uwuJ^RtkCl~B zp;7;_yIwTq=7J*sR5g?sQ8w%Y-y0gpqcstYqQj%Z00kWsIk4HPcbdaojyGaGO+r6fqxa& zGe-d>vl~K~o zPzP=Aw~#ss4-9qo>}HB5IlYwSrk))n43eqRoJ;MHj55BG_`<_fZ8t5? z2_6y-5fU;9$mm_ar=i5keM4l+b?PkIe9Z#mIG>|E7W+d1M`?N`u*Rz4^oe1^AK3~@ z^!)@{P=u@onuo}Zj-Z%G6$PWxB@#+a0JTNWE1-A%b1;MjPw!1)+TFZ~Mv<-jL)*0U zgLhgKZCoQg1g;&1DrkqJQ)%8)c;1u0Rs7_wHM(5If{CEzurl%}(N+v2og!?h=y-IU z_QX%5FpH7{cPVd=^3(*Ii6rIR>&aGNYm><@%}7_{u2Jh5^!z+(H&y=B>ME*JDT7Gx zD*lLsQ<<0Z<6e)16Pck41}f6|c7|me8LxDgy>u6A;!2W##;rixfn#Qa-S%P>cXp=YhT#}1VEo{J2xi9dW zGAk92gwJe`oN&LR`HyxTYm$(WyakUbx zyEXSO5*MS@(=zG+`@N*OI4sd$93vP zYl0Om-iLK4k!zqy+*5CofmemT#E490XHt8+)q1%@*$nWgL2=lTtf)={qZK2tCNuc) zsPFRpi;$_AfsTr5NQ#}x(Ba~-6U2I4)A~`)@yVHL`;)f;0Xq`mW6~u2o9{AGHVZ*O$1dB=`FEp8@%gT=GFRXhJ+hR)| zj%G8StRfy5dbf8r=Hqb2LViCg85AT!n3o5u_99+cdh)AAv)S5Dc)dgrb$}QwY~RmD zO>Nfm6P1Dwl=3}Q+x1_|j%;gCNY5y8HiUz%M)&BK3q5aW_6))2)BV!*`@w`rjl|@q zhuc)??N)M<70bjUvF!rqNK8L)>n<{r&tR0+p{OVjCb~Yy?x+yTLiA)_9Lu0N6&k!~ zDoKbY^0qh*HS3vv-fvnm?>t!QY$*$YXGrY^zD2{1R-pAev}~IVI^w1LV)=8@k^xKY z-oFr_yf)Z1V9Ea(8kK$%(BUICZoRfv_jV5Ms6?4crPwwEZU;q?*wy>P^;DM`O=}_K zU3x8vn<{N`9uCdBdO|J=K(^kzMlzo02k+2X&lOUo!Ad5Es1}yNU%E0TIz)cDndrt5 z;hdY6g^sH*WYJopB__N*;2Tv0NH%e{D=?q7KR{fBl%s!6n-Dm*7!gOD354z;pn);a zhLFxe>4h2r`RY=sSfsR4-8q_e^Z&~6pxMgKJ$`?;P1FEA48y2OBegEyI%<}U#B3`r ze@s`KeMe{wQB`Xcs%T%EAO4~jBX8RX;UOF}MAEL=l;go=N>hHu+Zb*f#|AxvPge#P zVzKTb7l5pWr$ph_$^mUk8=g63p6#NG$us!kJ(@SiDPgKcl7W0{YniMgn1P8A{|qLQ zzZ{J*lvmuT2?8e@sBf7p#vV|dqWkGsAd9B_hIO60yDODjL%%xm%LmCcdKET)<|a7g zM1*I!SpI&l847#LWn6v8~|@m%##o;0pe|N0C`xZV1JqY&75%J0FUQW#1Or~P$HYEQWAHQ^%W z`RS)3NTVx)rts0@Z4NsYk&uT$p54xvVaUN|!sHLrL97adT9s}&SU_tySkM?5dUKOF zT^|~yy!4lO9@yYiXnLR^h*+g;`g#s#Q0Q8TGuaxm7;0M*Az+I80k&2vPs>PR%<_70 zCB*S)2Af)~A$Ad}o)Dkk`=rX|Gj<6U>=qnH`tK(snh z$-Q<_F5}+Q%q+w7_Krg3Q|`G?rXTZHZUwy*XA=hRRg|s^rvhDvR^pXSk%~U^gLh}2_*tAraqe`yj(@_Gkf;|GHZ;#M=Q2P z9-{=l6M%8p4`5~G!T>Yvub1@2&_(Vwi37d}h6xJ0hcUOXNRE!Q6jo{$3Od88ViCij zdw{}J?0@y#Ug(E^QIHQ><}RwQ37%9TX6A^!*o39inEQWRk44RR?)r;KzNrSS5pcN*-=6W12}EXF ze*ZOFnp0msVTy?%?|QOUEp^RAn)l3oio{|RxBbegS-imlcF10)r(9gXLqF~Nq`cjl z5i6_ZHrh8_uL93);5(EP$zyAF%9z~WxS~1X_S+it9@YIPguOf>?Rg^(C8XLhGOPCL z%1y_tNU^7DO8n7)a-$SEOF|q5WB+B=jqP2HXN1=vUsWT5q0pY1)zuthLn161oeIUa`nz1s8{&m!?Gu%Zdx_(c(rM+p8p~gVlPs?31N-^$r|Xl~u2* zLu8gS$}4kdiY`IAR1i~(BmI<*M5HTz*GFQu%y3 zJK`*M3}RXT2rXk1`4A7rdJWIpSM50qg|$w$nzJS&zj%&yUp=*IO|y#46gnMZ zLYGtedeb+Hk<^!`HmbPdh0f?SG(A86n!v*n@#y=d$cYa8o2WA{f)5Or?|PYRi&@Z# z5p-R(JtugH+IgpNODR#rYQIkq?Iv%g;)&61Q+QI6s z)eTpk?SV{<`eR<(-?cB1)M(Qxrs{+lP%?dBs+EAJ^^+|4{nl62{4GUsAY{uJ zc4XPXn3T}_+{X_n06Q7?!ax}tJ;@JcB@j&gQpiTg04!U%u!k#Ka2uXr?9~*R!`0nw z3ek#+m_Dz%Cg*O&u3?0myZD%xYr>1hwwnQ~qqoJLl1@NOFI=ZInKrWBaf5?9Quh5!qH*;JMqJ;v|98Fr#T4{(`(0=q0yofi3|{|9Oi&`0Fo)dGqi z%Mzd?;C_zZt{jCTNyOdt0?i~Y7V{t!jW1wOp~TC_cSEq?D<7#5Hg!zfu~Sur5oUMb z9s?JF)92Lp!aC)ZxyFh~ncxcwxg(cVl}w+@o#fzfI0*{LF(bR|xhCxxKxmQyap(Ssssi_wr7XHE0Uoi5a z;XFkQJ+NF!JhQu0HeGFCX+stt_u=tzxM>7653}L|m%V}##9>AZ)-hr5=g5CdPo&oA z0r^oLa4X`3A%d~VikxatalM?R&X_MR3_G9`8(8W!b_1!+?4}O$36<|iAu=;-A1Wes z-A2YfuwIF}$SZgEh(ksrHeN|XLX^)MKek2FPCTq7pU-C}zXu)n`VfEu!zJ&lP+4kId`bI& zqsDXlebH?qveRV|u$n>ve0#~JCSS`Ua1;(nRpWMXeL=m|7~LvgM^6raEo{L+w{G3o zX7q6KJXBGu1>fL}d}(vtPOe>%NI_JlU-v@bB>I#c6tlH(K9Ck+AB8hZCV!@_B+6*n ze-j9WMo9+f0R<<2&tju-JU21i`gUy2pqX6eecm{*^Es_4kkzpH(SziIJ}+#4=*$KJ z=~y^u9CE%0_mxAIUuHXlFTJUyL@N(@tnU*p3Q0t-3 zTk(U2fGF8WSX&XvhhO>C`|@^0PDr}3qYQ@$sM1$cO2pOcarNbv>zWyEnHd@2g`Z{b zy4m{CB=CvlF_M6-kC(IY=)rYNK2X2MXN_*h1K)djfM9T79MfkAm*ft6G)$a0!#dDW)b&wJC0xadBEg$X~vX5kg% zS-0QT$%@}NJF}e!)YP+4o;MZk#|?1FpBh)5-wo1$jueH1x`X4HPX>mx7p#RLeG#SsCPpFxy>zxa#}<5bmr7$BG@ATwTk##5Cdzg?JB}Sn^qAAFPt?Sv1LLnR zrv5MCc(p&0H(&elJOgC72bkMWUe3d94#;Z#V0H5K^}X6biy8hk(HK@(N3y;~wYl35 zP1XkJfksTar6#=sV2PCbxHmCe+(*LYIuVrP!AvA81h=X2TgRMkN!`Ei7KObb?QBH2 z+WHFi-BCLf7>k#Z_NU@G))2M;ViNK$*PUy{5JnQD(nSU$7xM_V`Y*+hY7$I z;^T_IvDv=YujV6%al52b09G;=rS%sryP5Yw!}Ig%b9M_PBB9aDOg7)xY(Dbob^}ai z4zi8=M`oGLZdEdwmuzQ)hy}H8^!zl<6vey z4u_H4@`Do#6*_g+sNH{-6QUuTn5RS z-~fB``0pGk10|)!hVY+bWRF0%ytZ5Q^%N+Nd`qaY!x)$-P>@{Y3AHyB3YprMS#aoa zL9Q4?2kO{C!KLnKl14{si1n}|u(aLRJj#QB_X~_0Y8@c64K|8mCR6U|NuZ<(Wd!N= z>d04ldm%*!o#09uJV-n%>?6bfTJb3SpMD0PiDu68tnG9AMwhRSFO$e?kJjLs^zXkz zQ|EKol{XhqfR0zi%(B<(IH5gnf2-|yI_TXjF7$ojW(rd9a&^IQWU8m$EYCNQo;d>8 zl?dcI46V)$(nRW^M)|+lV2FPr2r4V^b0Cl0tSWmrl#|n3l2@dM}U*@;3 ztAPO4=wkwFD}ZJ^s(S4J1}Zp=N7CsWKHB?TH>ZmFX}HI z{|)nP*g_DMt^5G4If?_dG_>VG*kB#(0_j@8iBEI!oU(ljrObaR-2dE^zw`V*6yZh|h~NExeOwUiPTW6l^ySjf_K&UpKlo2GB?##{gGFQc!&3i0wANox zS=S3n&Vi#}TWb1$H_ZPj&DmEFpXk-oC-cW)^lvaYJ+x_2v`6}Br z+ACXE;Djc5gyLa%exI+F{edBb*^BH@SJ_!o>AB*6qhUm~u;?Ra)He~PD6kPSAgWQ% z5XC=4`Wx$1ogss_M1|&giFjdqpL|>#``56rf|Atx1C8IIT0t5j|EI$~xwyDyKY3t) zwBb49u{19jH$!sY$uxVTt>p10O*d{CHlZ41?dU9%MR0f+TZD1aI!|(n-F#-8jhXF8V=RnU zM*(*Fpe+Q$ioRE>zIbxmD;O%UHZ zs?58xT1zwxfpucBb!`b<^loGG%+!~TWYr+gJU=}SoY0r-cf>BB8K#Sw09+IhEdnDc zqwJxMp8<4VfF87G*>ak0jz&&dWehmruM9F&$ETz)%^vV5NU}^=B@2@Fq)r_dAwdBH z=Mhr8^hGkc8j3M08^+VbC|=Fe<(&Jv*py)a0-X)N?sNhq z*&rs`lrx|^h(Y$`eXtK5c&)f7AwJ%(SH8L2%@jXLBI+mBZ`M%T+@D+~eQhFUYD-19wS`#aVZ(tnoH(@75aWBfrr3WkHC*Of}n zC`li5^MGJpZkW=VrGk^`uCK4~`w6U72eXo^-&EZF6D(8WCpTr7C;JU2Y;EE;{w!|+ zJXqTodF;Wjm2Dhgx36QmK6VXC5>>{|oSS_Ef12w4GtMsjL1?l^m!JmTAKJoyuxS5x zqFA@!|2{Fe!+^MDUWgL9_}_&2H*lE>ScCLWMt>x_M2G|@cZmf};{H>Tzh{L1`DQZ2 z=eLah5K%A?4UP1kCgKlK`H$FyGn|0`d!`r2plQ$pMnQw@->a(NY(V(Wr1wW6;ENz= zh7|E1A^BH!6oiJuJ^eEu{+Zx~08O3*U@DlBe;|VYln`BK0s8mq{U^OajGS|Dg`86- z@$aplbI`;8N1OfU1xNv)Dfi2}B+-ApkP-V=m;R^0{>c6R4_ztJTk;?e|x6H>N zzi--UuD&;TeM~pl+IN%XKb=-~+#5q#9h)@jNH7wAi|g?5l3r``$V;ItM$-Cjosc~! z57JfQNDfAyCMZuYVE)xe5;qXZjC$0{#Xn*jET+TD%gdXanELUIGeWK2N^fhfan=K~0SHhQtf6IrVb zw8OZG@VLl$s3e^~QprJYPb&A60pX(*6OG<#IIJZpWR*HK`f(dK4oxuyAa^i#tD%?M zesS%7FXSNCL!=&8D;`LX`)!bQ_M3)>OO5p^6$-B%qw;6CGU>1B6`G9$D}H`!=gN{P z3_6Z>j)AAW?%N|t<)#9l0~|#v7Hw}&kMaG5-R?jX?p43PZ#;kW%iHE)_U_Nz-m5gw z72*AHmw9G1+TL2Dx1q4Oe8_plX9AMVrEk>A6fAR(j5ea#sUW|V4>py$?MpuY4}0$! z)l|2&4c{POK}1DCKoF@SO{ogfR8*v?AT0^KhtPX3B1-SQN$)+h00E>LdJBZ!YY4ps z$h-BN`#k44=l?gxH{SOTBV=VKYp=b^oY%bOyl{ifzWxSd+aCv)vqlHg+aiw|&c`cO z44Psu0fW@Oiz$HNTwN`sh`&oSX=v8X>UmK)P1fx2A8$NdCf03MM|xzOJ#|c(tal#L zj4GT~E7s(B;C37iFk&<(Bvig$r%frubhQ88OQg&=Zr-#~<^|V0isjReDVnH46>1<+ zGoAz<35i(y@vK#8H?x(nh$Gx`4`{dJ!CrSm6HxA^)nzX3tG_>6AcXz^doOP$EidVr zGqXk|N39U^vuEl65h0tng98xxvkx&euO{ z=cysTyG?sGiDTtnzs}T(R7JJO$jzTKcsD&e>RS|1+}YWAiu6kqv3!aQ9u>Na;<>e) z!qghRmg*UT+Fuh`3JQ2YV29K%vLMfeL4cOsp{1}0^Vs#fj)YU_3=)$<9}e&*-^Il6 zj#*PuQts?`>nOGWv$%7wPtw?_27yS-iFMNaPSWPk5t3{p^?6X9R^WYui#;HwSZ~A- zH3U>de>de~zlb}(ym)%BF<4{$sw;*k(R{l8b4cp5heA-5SU}A&@$A_DLA3pb@M_P= z-MkM!lAP%RL~(3I;Ij7;fD87q`iGt4`hL~f>BgO_p;uxXQx6+sndAKb91*jUw@s!_ zozHumRJR3ou&X%3*`|^Mx=Fbdmvz~_#4;G(Azsq+hx6kYpk}1<#MTsIX@9L^uvGVw zfR3pBdgXA5w%Xz52~bQM$pnXvgq15QwL4-lJoj4fcBU%je=f*I@=O!TmL?~ey=I)$ zAB_yn;Iuh{tEm$m)%hOIIl3%l_so}2b1b1^BQ;%u!nXHa4iexI8mY6(9|Ok#0W{g* z_0Mej?egW8GZJ}_oT{YJ1=sa`T7BzqNo|So3dfRZj{Czlzt+nN&3-jYz8IL!vfm0LCIT_vZ847khn+OmUEkL<(V@NS029y`D3yi-Gt z9G{qd+H~X3#B!6JPvUPu>(3M3ynOY_@aId4u9`0z)$Gm09Jip^XcEZ2#S6e^gyMttOJ0{W)8%?)aNiT4Wy zi1MKKG2FKxK-Ah)VMd62{{hJ?K%03_7c2Ow$n5j)+OhD*G7TAh55!%DlUSay*Q~(C z(mV>?pLv|sq(p*({9KYT@aP3q!?;&wqm`+NK$32`%K_bYm7R3cp>~_yMNaXKv!(AG zjFCXiO7h~LBL!+|5BD(>QUWt}8#7IRM~OLg6Mc6V=k zdU_63^X7GeGOZrkPJ>j%4|il;Y8|i%+>ko(OZY{$nQpk4lEo1F{w;M4&4oMMU*bv? z@K1m`VHpXt36W!0(aL9!8u#_MPBtr)^go9}*AKB`-A|h=nO-( zaXlJy*pCXu8tIg-({!<{4c!7&EGvx%+~I+7X%+?*=`F2SDd#99wy#m$1~tEAGdE*5 ze$_}RaoichV(d}DZQ00Nb?t7!_;5qV;`w}_cNMsnd@Kbvj#16Ek_D;aCaYFJ4F(&d z4LLlX-g?3~b7%7`luG5AU;EPx78*-@FJj6~2!_`ZpIYC|7*~?Xp?vf(NOG*+ag+=em2CFuo?~Vt=J~9TC z*?hL6WqBJ?wbTU~J3CzDQ}0&IFcMF^@hAhm_tTRl%~urU?b8Mml?tt3a?jN(faLsm zu6VLb17GR|b)NOEQ-LOmnxsGgOA!`bFkJb$OOC&;L$FPex%Vm zc}dV>Hx66jp}pGh#`HV|JxQ;A{_?VEm8d=ay8CNsTS{OKJ)Dqp2~AUdR@In#AaYK8 z#GroRcgUGNMxqkMZ%!v{W-%lU+keksu;D&Ju?M;AP*pv>mDy32R%8|asjA*Z5$;wD zSGbHYYS3(tTYA<`y8q%QzEqc`N7UWP=$B=GX?&M*p_9hM+K{oi=wH>*k0AqvKX*7) zGBaU=nVd%Sa4F%AiV<>{d6p1mFZPTy05c40FYGu8J!J@W&S>v}0g@T~8)EjSO<(yF zg**rMU>JMe}RM{*Qj5U!Qttr7xOrQDC4%Y6iz=9KB=pN5bwp$ly7R40V zEF}mty4PWBlaRI#VRcVC-JhNj+gFXB=#ja2hY1_RJ@`7RgH}Sn%nl3R(m*q zs%ihheZGA^HB43YkD2s(Y9&d_cJ^R8NuxsnxzWjA8Q%}XBeNA4W}G@y)jMuJA~)Td zl^*^HO)_WErBpN+(lkR}~e zr=Z|69bnvL&|Q?QK-9X-8Wo*|@yZ9B zD^#bg(1wqyfP@=2u6{2&N!(Q{h8tqEOG)=aWprccTbcfw^`Rc@pqjhG9A0dpTEocQ zji6c#W^2IjM|x`?#B!v%fj=KkuyduvEUFbG$|8eeg`nuJwC0&sHImqWIJ$rvbeaKu z51-y4MUpzv)tVh>R@}Haa=JbKE_HiuEopsunKQRQLMV~2g4^Az!LdC%u5x>>6IPb4 zPP-(5$yR`l*XmbvCkrSO6BF;#NwyxJCB8htNm5xkIx3^0&Ii|~D3>7a4F{?mCm)O6 z%~kDMSErc8+qIu*m8dtqORW(J)BXA8DmT|)epaCz9nIcwl_4s}a3EcB$uyYCi=*_| z{l@2lD1iR(9#I9`_s~H)KNiz%Q5r-zI@abXImYsUbTP&0fzJHrQ;r!1eOpDl-2yy< zxNCdE^=f^LgZU%2%UXslUmh%F@IE+OIah#@Mgav4wOrOn^>1ZT4lZU1V~2Om3!kf% z8|?5S@aIR8c?AQ+w1TC`v#cWs%bV*@smZ9=<@o`f#Ea+bLc{zzYY`{qy60x@`4B1n z<#WAXR`&K!so7}wv?8Q^$vQVRhPsc6A+EVu-u`u;Y=cxgq=zdX;GngsW_ zs;kGHybGQuAHbv%oL)mD)-8&KP_aBJs6_igbsjRH1cD*ANH-bh;)BAE zswG;++^_p_8@cd%g|fnVGBcYHrRE&&_D5ylaFcZ7%P*^%^Ff% zD|`x9Ednzuy_g0A+CwbGF7lh4!Pes+2UJRGXS!J7R=#bgE2*BQTSe6t8hn8?eE@Io zu??__wve9-!#fzE>_BfKv>IIQ$;kxW(h0U!(0`?+BA0OkJJEFrqc>_$n4H|r z1=LQvs4A1J^m{5z=3eOcRCy9Sh7O-**mIY3W$IZyJ3et%my26iZE!qtRda4PFZyq>uSD*eB2UafemG=FbOB$Ke?wY_Y zP+6}7SG-0+9^88b|7tvzuKH=lQ$+Jn@5N|!Y}-#c-*fst z56Z%wdWy`0$=l!^lg5PZ+}pBft-o$Cit1TZ0tD9X8U}BcZhzf%v5%HfRzK_I6~-O% z`<{51=-LF_$?EF_1k|&QI)t*|T23oH+PNZ{d~%nBZuRD}2U2ldJoa$eY3;eEXcfnN z3Q&9`r)`5Yo_1f^d9`=pnk*mROPI~h{FOib#7$Qo4Mds50EoHX&TRqKKr7EB?&5Y| zO_-PE4;1l^gcz_L1dB7Q=)E~b!74r@_CE|!#`4&kCOV84-?a+3R32Gsof`CsBM zTEclsFFbs2zP6q|BW-tMD3$?4qWDD?YT}JgaU@n5Tet^0Uue!!7Np-O+H-k<`Y+Bs z>30eh5@{4AMp8IU8?VrE0Aq({+>9*stQ z{p{DNUF~pY#5>IQaPw?(2N%|fDfq?#U!^NoZ`y>K&PZ!dWEaz0**-N~6JJqmP*r&^ zy=5}txEbbo@%+amhCW0gL2&q(mnv9i{Nl|# z<{({prrCM8QPLO{U7%{_WspuLzXH9 z<9THshRjiXu9#Zf2~xm`(>Uh<0{B%;j`^?G={{yfWEJh=E9f8;Q8Kj@~=e%+lD<{W?NyR5On=b z85UiI&Dg3i^xgq-iV^JYh<(>_!isnC*9e{*A%RME9fv8$WU}U>lX!|yM<@BjmkI-K zWn+J8=}R$vAR!iA)zj9)GdenN(Kft#qU_4=G?Dybe2Q-(UPEl$pV6b6;T!C-y2^wJ zMzIC;^{Ii_M^xrzJNiwOg&6UK_t-2PQ5nwt-jZX$;c^dV?dw|5PrD9{60Ky!yEPQTI=@++gI6IZ%86sd0>Vzn^Oc|a z))o%8V9oOQGP--JUi&92+A-*9r-_j-rDBuI#x$*D&=trCRK?btdm?0%wpmTvv%ouq z`%^KP_NZaM8qV~7)O_4cNrO5-p^tz7)v0inJ)qx&Kf)4m1(G?KmzvX($6+z>4uuK+ zg38(e#G^`F1*tMtz_?kMep4V$!kvu9%2sLBv$k?NuqdZzB4&n63|*OU?{KFwiVK@ zsKD(u`(B2`1dxuKmo`W|;tX&*lRKTzl4pf3*=p6ST=7FkyN0p;P(bK_9*;my( zSOLQsZGwv?b=p%XNP;}-#j%cSUXvqh|hYR>iBd-r^o>otuj#)QX z#VeqQ*@feLN&hN0cn)W*n<+aXoUFJwQdpY_9)*|neQEH_BD-3(vCEpDW|LyPRECk%y3m1L zx-v2Fh3}D}^H$C6J zjkR)|?!9>2$L#eN@s-S&rV%xGl#(QteX7orH;{%W93<#B8E_w?Ln9wUB%l(a7F`KVVN;N;~znoXyHS`Cm}qa{MyMs4P}x(zMZ@>7AUMb!*gS+0Cj znhLoX?t@@`2D-xjmnkvl5%);motckanKo{1+@m(BfLSPLHsY&7$?s?oO>!!G94VmM zE6CRX%BR^8I%~@Bhk_XJ1;ym12&u|u2^v56_j)YH`bH1J0z#E&rH-ze*q=vC=CvRi zuU_8vg(T4GHs9saazzN!RG9d{#8CWY^97^ag!iy%{bY6ZDu2?K<{;25$V7^fd7D4> zKnR*$*Db_VhycVUdr~y;)!a`BSdDCXPUEq|AD1%^Am1TGuF`0|wt(7~#Z}@)@~Lch z4-6(5L2rT$VPh*g^Q~R{9xVp23qtuu`@}UpP^f<02iaCE^9&hc`B)kuQRUv%|Krl) zZvJP8Kw=(JVK3M+l?oMB-JNPSl3&-CXE=Rlq%XxDnUqFEO26r-+mli@+g#-0wl-GQ z;5t1z5paY#c%^y03Rjt0LE-B`yU8yM9VwhEmn{VUTwq|dUt-)u05SnDOedC!jz(K? zBWBK3wjA12PeHbL^RYv%f{9TuPmPhZz+LN9QgSzqZH$B%rQ~G00(5KA*=BdRaoER( zy1yLPe}p+hH6BqnRmwlcdw`nS6OJ@C$nYNHXVhy?CtYG}!g)nxE?zNhlMo97r-(3q zhb-`#!q zBH3xDznw_!TwusC`oR4--h8sAYvke-l2|lpb#A|9fIHo|;Bsg=8AO$s_PqgtgT1sG z8g1gk-967n6G@PL%1t4C7adSb8$b98WkH1w?M*BrHcjJtmJq4Cm)r;vIQu6}rpu;W zL(e59jOV(YSuc{GX^SCC$=M5*O5gdKNuF&-k{3Fo3~0zke||NT7r$_Fg{9m15jJ^G zI^aV5goXw3Ts1y@rkNwf?M*Raiw?bM)YQ}r z_>xNNG7elq*KOf^*{d=H05smeac0?QzElD01LWq-D$>a`Ip&QimS4Yjp@{N07^&8y zC3kpeLSt?`v3v-g4^vlb^~vox@aZ+{RiAC*z1PrOjD{tafNM2OuNG0=W`KOUB!aHtjlnVxtl!ZT5Gs(~L#26a=?x|tF%eSo@e(M0=gk3sI7bcI zEzoRYzMbCER-w+Keohn?V;fmdxaiPC1)6o)BBP7_Zsw&}OG)Y)*au_^w0#r~QmXc# zbFk{!*sOTwHpbW3SMItXbJ6F<(_{+ozG3pA%O$LQg&W$D;4<#GknAX7HL(S3@PQ60 z%$oZen`CWEv1%jBNot~!8=Rw>H}_B0p)@9L*by3g&F`tMc$jp=;Hi5BZ`*{#{x=Wb zpZl(O!~{DvYZ*Na9G>$W8Zol-J%_d8P(|#6ulS+HbLW==1L^6DAz~IoqP!)m8%hXv zs6!HCUTX5ujHg_oY1+YSe4r64FsG)4H1LMoHytZlNBxPsrS4uCOOta@pnu`r~jvKKtE|`FbDHRmyg&*dB=G()zn&%kBa|tuhZ*IlP%rsmnac_pL z%w~y7Y&W@YZ5bUgrXq41t69p4!Pf!X>@VVGj!w4(g)f#+g1peAmGnp_)A@B; z_XBRd+1gY7z!G^*U8d70#91!3@6cl0k$KJK?Z`EL2|^31xDz3ce#f`3<-R22n6#5h z8A?d@f^cgLUE=eb@qAo`)pEtMsd2R={1rTC0g`+37IFG8R;_4$-B*3;i@6Kqoa9*9 zOz+kDKA$NV-1e`Mt}@u$#GGWRv1dxAJw$4(gdRtsf*+ZJmea#iKNNF%hRkaS7X;Hc zZTxDUt-SnK>W-m-Q3LE64X#JSdhk>;@xbrAflUcX>QZe!yu#|+-NYc(?!6JU89N#+ zRsX)NY)~Xc0p|c5N?GK0l%&-(YCUxw1f#*bsl#qeq&O6>P-yJ?Z143UOr=L?D(|f_ ziD)gf2UlJ>L~ZHyZq;#kkljvn7!$6(E`l!$>;*80+CT^L;os7e8v}xlJumr<-X-}b z(_oC}R4JaQKUFOt=)*71xSfBlzB28cW2ir|vhkC0+TJf2e#GkdP^;#{LucHS$N{r( z*#y+G_R`4_4yoiwq(J`Um=ch<9nvcog1l)}4o`94*0~!ar(RowqewhP^VX>nl?eU;eaU?Dtu&9qUAnm zt9rEa!~b@LaJdN+M~+7?tn@t4-g!nNmY`3eqy8lO<%tc(&^DH}hh?gh=0uX*XmR8K zD2tIO>_?Z`!H?Sf?ua_oNyJZ8m1auG2SZqQ_?1Dn(4bkt4&Vv)HPp%1FS=@m|c0eg||H*~AY_&7uARCU!Wzcl1Vo<8akp znP7`L&$N-)6Qs?UWgein&<%Z6qQ9O+TZ>~L~`?)Cy|)e zm`pN6-Id5GF`t35@nTubc|Fe5M*2uIw&f^6pE5E>iTYNboEIp5lQscsa#fIsRykRK`MFsdF}ge%w;bzqDE6E&dQ| zo63inH9kgoB}31%#1%9j8WeO`8$Ics*6n%TJx~=3d3{28s5Rkm$WRgZ8b7V^gx6Xu zb=uWtk!c(V{ zUug;l8opCkrpBMCS0s8SH1?ol*m$?%P*HmlphLGO*AF4(UQsImd)q+~HbaD0T zk2`LT&G8;%D|99%5RKc*x+`agu707rZqfY2wFkUui=zNyjh~Q_ zjoHRsV z0>jRUV(byiZwDs{*#vMe7H`2~_+1ad4Urn}zuuq?GtfTYAL@ILlbA8V9J2!2*h_n< z50#~WY5P*Wsn-=@=iFr|Gh76EyHR~-IK|bdZuV#Oj9Z@gv|#uH{9)vwW@e2_UPQ4} z!CjuJ<;35LavN_>XST-#El6A;OMlk_s69{=d4Mu0Ha^bXNCOI+P&+r^sLW zf6P$nj4$W8uf6ndN70@jVLW+o|x3DrTE4_$$1UTXI#{wgJH7eFI{(uNXW03z}#NIqo{cNSxlybo9KPT{S zh@_KT{jYYpTI2^V*QeReKVpK{fXt^X7OUbka*BSwtglphcufU@2wm72% z=BKtKH?MFK`S3o3Ki8oB-E&}D_@6&l?f^~RJs z<fvKxX1x~SF7W%WCQ~k;33eVY_OGA#`y*d+|B{Zq zIaOLn{a;O)ML<*Kf$`Sg-TM0)rvJ}ws!4|G-Me>TksL}|m1_cXp43_d zMgM-!NUalAJ^d&=TvlxX@!(X}Nxf#$_K3lPlRN(izpp`8`uq_Afr!qOqp|mn;a!T1 z&qkG*?A$ipYa+0|`g)x+^)K9?$#two?1`P?0tyqx*Pned=G4rzD$g#nMO&O~;Zqlv z=}V%4R0p;V@t`k%k2#5t7lZ(8?5aTRF!sBTRl)$2>OEkbW~rCyd6zoHcJs3atCEbF zSiW9aEF7TU#nNa+ z0*I`V%i(dSdzj17iDH!*CMp?>-2VllD>P+R6EtI5Xjh7P<$nXQ8OtE%@T+>}D3ZRI z5Zaw0pbZc|+3s>hMIyH96&yAvInO;AH_Oc)f9B>Z+NzNe_%w)LZU888w9i)6VpCGY zU4?6xk!tUQ*JJTo)!FhH9YL}270b1={f5z8HReg(@d7CH%vmn#scfnwGhgFwl}bZl zItjk_54`f(`*Xo)C*P~Ds4a0L`b#P=E$+z?1d->)w&pO!6Tt@+MwU6>%Ox&wz(&3GV0fe~QWQ(l z^A6qfXl*Dfc7jWbJ$2ooJDSrrjaL-q*TlwBs#f9J5k$-4ckONjS8>hD!h_Dva27U% z)+->7fp zGTPMy!>Xs(N#u5#5(K zapM%S$2Mk%a@1?n8P$n1jqZ4`pcQWVoL_HIeZ0Wa(PjQ=buhPF)~gQVrEgV%1!~pV zXJtmomGnEA^`|y8G;U>HsJE&6VMLew-}TVNBAVK1v^`kJY4{?KW}HW+AmSeLnTUA( zBinjIP_;$Fi@^)dvIHT8M8PO`{EbdIKI9UySm=v0uf%Gh5@5wgiiMJC2Gq><1kqMN zn3kKo?>VLuP+_|Kj?*uVV_4ogXcX?9+aH_ISap@qzKmhpS4K+nJMZEKGw}YOm^>v! zU>C1`+g%De)Agi-WkY)|HsPPmMsk-AT{GS)S#dDT4wm7E8$rQ1)wqY=BsU*jfB0R=G|J@-mQ^}asjpb7v0<$ap*xYR~Gm3nln z4$z42nk5xd60h)B$txXCP%u2A5=6;NILoQ4h>G+qxbO?=>=1Y5YIJGOU@(pqYxTyR zB)kDly5eduflQ>lHWF|E)~hP#)ZOaON_9dE24>|#6SqpAUB3h%>ETU`4dVv1ya2&B z=1nl2>3s7;8ZUq_7l?8yOFWL*0mh2@;cA2^Jtvbd?@rwUqmWCzp!tWl`CwJq(c*Ju zUxx3nZ7x%XPD^B;713>I;^=AdM5f_h_Ljj>OkzoF2m@nymYiChe5{C;Yjci?Js402 zfAK`!rFO)R6O>&E2+8hko%Ff7^E~hvRse7hjoKW0uIE2YBY|1|3pZpGKq^sq@gBX^ zz^a@bw2KuH&(iTevq)0Yc2y(aKMV)dif*Ug#Fc|JP1$906tPqFi9)8Vw#&R$q;5E5 z3Eb79vxG(P!(I|l9=PkgK@C@_`KJ37Y%9`cNw7`T-*FnRo)NCUw1u#6lzxb}QGc>l zB%;-?QW{Ziux4Yr*T1l}coCTLKn^ICco4F2$9a8?#_(WWGE*@*!J>h?e|SA4aY}T| zr7sov4kJD)+lZD=?d`L(+nbjJ%tNLql1+(dR*!C>(bE-4_t7gjrh@#_;&7OfyVcP4Yaj1f_(s>DnL4~?|#)O1Q-hQ7{NKQ=iT4xY5!f*XEkK7)~scDNOX|N(V zw|#PU+c3)0s;rqQcyV3O`)Pq%=e`0x>!wO+8>q1r8>i&~u6l<-!&vWqvZ=kglEtbkO$J&Z$Q$&+^7=DtnE+OiS7Q)+SV+vjs>jjs zJK$YVT#te!1+ zxX1Y27VnK$ItP+jzn48U*Dwqq^D`SM<{jZJ$@dGOt9xL{S--T4D=$#(F>|re?wRtQ zs{TL3~nK@<+H^9mGKYc!{g-6%USNUQ;mX0W#y243UUH zzZcFnwSg3bwW!CmMdMOj;IM$SK;-q%TT)DSNN$+SJ_jep#RMt3bi7Dq6fsApTAA^g zN@E{*oM{NK<9e zvQ;U zmS1sVuVGN4Wu`7a$5SfaoUQQ$e~R6hCQNZ2Y>XU|x}`H`*qyW-gqY~*Voo(H9i)(! z2JzEaaE(>j^Hs|VFdbw zMTev?Ha*nnV)-RHr_Vr%CuPgg)@)Q8PV9Hd$XVki2`?#NgsFA`Q2KJY#;;gDJ}s(@ zU(sB0MVjyk!KdX~K{aIZ=Spq0mSUL~<;Tl$GOnjxX+rOXp#seGg;ra?-4Vh?tC4^$ zTq=FUxyDiqf!VA>A5I%NdKD=u3^2>M2^rR-kAngCWBk{WvcId$5yPa^|ENYW#qckP)ajm1~5pYp4ybf8#o^^rO7E4hV&Jt0_7RANg zqj4)qQ&7e_=^zRH3lRqqD^oYO+gE^1{hQ$9&u@zPK+;^r?QB=g>Jr~tcPuvMk7V)F zY!DGXntsf#2j@+E!UbKpi!p{q3Xhn{#k-wc@(@>-B6%sJbFeKO=u>b+3f7(2`buV!U#rTKV-mmD4J*sI&Ftdc{_GzCaVd6Cv;OmI9(-nBw-EKcJe zSVI^=Oh4X*xA2M?Y*bU4v-Tn-S{`efALXQy)$%4J3RnkpJ{iwABWT_yMFIU>&VV-f^p1{sQPH-Y9j9RecSGmK?>mBo`gG=Le|qT`SV*BGB56P;4-H$tPYWUJ`o+v&Pp&0e{P2+~DuT06qn zO1A3m;beK$RxCKnx(4x^#-0ff2?qh8I+A>FB72#bGr~ z>kwpCg=$$5Y;y0oARXhjEBIv?N|)yLw2tGaA_TPLGOO#fc#bz+iDKa088~sX8f07r zA&kx7c-Ap>Y}v3AAsqgG)9+^@Bk~r2fquAcQY4Plpc+ZNd?P$OqodaSBvR=``uI2B z%32dWqMby`Iz^=q!ic{bM!d?hlO0XVrmj+DpB^@-f(rJA7$7+NREKjg-~{6i2XOTV z0dBkFD}zP&SPSh3KX8@=6MD1?XViTS8WP@2sb=%>r5rI_^mBSNBE2@;g;%-Y!>zne zHLHF}6hn2L#4@&vQQk!l!p7+dQ8HpxaxO*wpF!2SSw4bXb)Eb2jNYuoG2fwvtbilV z3;2IFJ>S;RB{+Vqstx<)8tVn{wx3o&L}^yn16_Z;PWh-`4b^W0F3qJu_fV?OLDpK(00UprPxVK*>4pv- z-@8|l*~UF-~J{jfmoL--9&-@H4P)AK2GeTOxNEDuKTP&q32_)*n$$!-IKyujr6S?fcF z6emhR;b4Nk_rREK6|P#7_X2Onm2T0&h3em@4Dx@(@h`lOh*`&wh3xvh+2WmDGi*P! zxVAkRr%sgt0A}yuW+Py}H$>$%v8{Ud1H{=U92mlwPi$*!6>y@GI=;MBpMR&@O?#}c zlsOy&d0O^xmG{xyTh}&twHx0<>o;S0`y|#Rz_G2W@^kM!_N^V`GsgL6JkeZbH?6MC z^sWAluKg3Q^5)Qyj=ea?BNDe_q{8^LCDc%cb1i`L+3dCFXdhnuy$ku2JcFE9+MhCRE_rVgiFA0VknxnFT8XUkjt zJ68Jp1Pb$tu6m?aoKy&^?k$QoT;zq+sn7|U%$n7I>CY!S&nL0VM#a~uvW_O;)e}O{ z-OJt9$M{Mw8OfqNWi1|(wJhOekLb7maSP4dI_M5nqZTr*w{tVsMdQ$1_hQ8#2|#+k zR8fY*tBv2KNCB#kks{3c{{hmHBzvjN2&__{-PW8PiYDRv5pDDtScU(AM|%eXfq*4F zasl`M0_JO2Nw3s_BNCIN-~3;6)lKIzW2@zTrIeu9<1b$XQkVa*g8uiY&H7yZ;_oN> z`ZZ=bA=9PbaANDyZC6&s7P}?de~WqibF96|dBW1V7~}b~BhyK3v{q$vOkDC9?SPn; zf7oh7I;^$xKc4s%rm&aZQk@6y4$=Y*Ye-rGa;!j4MgI#IX9{EXu7phjl9h%A|Ml#o zn4Czi)RFX6>B;`rGiUntyJ?_Z@8f?r{lBaJXNA1`F6HJ{e_zt$1)HVrB>AJ8QPQ!b z>Ft2Sbb$fXmBJfJY{9}(eFIr+_NC*<-O@R|0M_nf0+#%fArBM zWVGhBtf^|<{S~P3%De_}>8v*S{byE9q+lRbfaAAE*Aqz1r?pwGrCDXpX^4tBM-MFr zb5dRTm4?FDZ)ABAq<23|;IpK>-7JDdU>N4}%V*3$>T$Tw>7;^))`kx+=Yo#;pDul% z0l?8lBkA6V8=>Odv;sy}1qi$GYk(NDZaKaLnF)^nWFwP7cAHVUUt(C2yij}nTH$zu zG6sMFBSkJaZFax(zL1|Dr8f|X;^7mwtbtrJK&8}?w@&`^IIJ)Z4FaMZ0W^HPKq_*S zen&{xw_7Z%K%u2i1*$ypLeLn5Dz8Sl!MAH9qh_Q_v`avW?jK;BkT<-2up#muIM@uk zmQ*sFAg1ruVj?8KOEiWCzUIV`l72S9ivDCsS#=C zh2wjRez7xQH8sz!l2h(Yw*yVdCE?*K7jcO%sH?E`e)vS}r`!)jYv*mo5n_(K&kH*uSG1j8u`8V@;C>1KJ@UI5 zciizfUXPY{O>k^pMA|het&c(z4o;aY2i#Y#xueIFfA*qJ%%$#lhuFDKfVOqs$BeH| z3PHOoeSAHMB1eYxV{kiQ4k`1Swu@7Gr*+%yjG}$`fU=y?01AupEU}m)<~>X>te*7P z2nKYSEXuaZ?)_soeg+UQ?@sJ58l0a}*mS@|0B}Ay^0_j5ZN&&rgoL|`?7Mf*_F!j# z7fE=j)4m*>{;`*ph{lrN!FMw*rH=X`5ex?aF>>P$%5#jj;5tXH3Txrfo~ogx9eVSHz9w`aM1A_uY8q+T{V+h;U>>E7hMN zB5;@LwOs?~d-deS>P>BCaP>E+rC9AP07PpK1cr@<1!~k2R!1z&U{^-9#I3w6RpGWVu}U{M36w`XMCs3gw@tcSgE-Pp=~s2w|;t{W2iL8tg94fZ5r+@vPiu z-c3kqlY0$7h-kvI7+m|ws4oS( z4p*n?2fQ`F00tghzFG+{KtFPjvCGKF$dU=92Gi#Z__IFp-(5rQb9aQ{=tHs~Y zs4yz3Ki-|##aG7fzM4tRa_y7AFiJA?1P-qHwwVKy7obRPhdk7py+|3YMvd)6E+!vI z!~h$U900-_^oPwwOmF?#*!c>a6200@Z9!n=t@^yO#Y;%$#0{ z1{I41Yt|G8%eGD6{+Ywl`iRZyhr$v^=1>kTUv8kPZe$RxfQb?nDP)M*wMb)#YcUwD z6~>2m<0`2?1UhkN#Q#B^QoB-IVW@zMuCtYu1KiA37YRM8{Mh5( zl%CEUnWWOu&N!gc^RO#{r+~}Lgkx&7sPeOk(VuhviaSvO?qK#67On#h;>*>8!f3fv zFKs4DOig{4bvx@qGU(r6d;uuwF-9gmFGrx~=R=@~m2a#=SKXyYZ~oIL^pS3=^JRRZ zl%lUK_T|L$8k9J(pZ&49pYd4Dx5}a^?COQ3M|?ZiX!gSm8}AI# z@fwruM+UV%__N}EKdPHofRp|m(&HSw@-*fkf65uh%L(^DDqOrSrpDu>ve_O?Wc{fp&-lhZcULt^ME_mwR+xO}d>>D|p!_A>{>)Ahc?Ef*sfQ9wHs8j#j=jyu2v>I`p z^^Np@Iw(XWpMKL&vh@CSPyhDQtgpP%jfq&oS0c4Y?fTt3_7r@`W{Ku=X z>i~tROG@v~KhD5^?kC{S%VCg-DzJSJCsjp^nRa@(z!d*; z(!6!?z)R0G{SD8*^#4BfpV6Yk!~m5wB0x2;JGDNF?5QFOS6~a@br{JW3en`KqHMGY zui}!0p+PnWuYBQx<)1IlV&>`FclljE37mBLqXk8aWj(;d9OfyEqORFn7PaVoVLx-m?DR817F{Wm%V9eE~B=1x4%2yNXTmo zdsp2E)E5R#zPCZ7ONB=B@AYr4zsAHi0KpboB*dgs@1BW&x$_X6!+|1C+xk<9^F>d` zq`$mAn9n%%nOo{jftGa`axO*d(9zRNWW%(@HKrWmz~_74*V!*$C*FrEj278tM6fD~ z=2sWTj7XKBbk`A{WW3Vp$Goy~2@jYEI-<`MLALW9R7c#6A)ZnGRl5li(7ueS^YP|abG@*G?R{w)aIL{dTTdVo3x{^NAy&;x17!L(f85n zg8|1o6=YVdnvY#4oonX0W7lUoKW0(C5-G-XTpyzYSy?1lHqt&>>|RywcKT8L!-55Mnv3@xK2hT)m^iVqVliybZW$UgS!Gqmwdouo3XHD9YdKI*30 zM8~60S=}y*RfGMk=?`7@hXJD-&b^DP6zKBuddPZh*LjQOjEf#tcMn&unM@UxjBI5n zwc~L*tZ=*R`N$(UTHyBl?)!xTg9qZvqdP2uglW;{qs7MfL+prBRuSNY7vi^`epS2o z#i)LE7}w)!TW0TUnt2uHWbS^Th~)Jq(|0m8I#)YNk*l=NteoG9r}ZZ?_J-dlt}?B% zC*e_&TXDJjL>Ig1o*=cw`%_jsZfi%^N9p0tUHhc9=Arh)Tv{{o@oralV+-xCy~%F` zT0l_E?*}yf8Hf+JV()^&Uo!c%+tPkPK~cY46N;bX-@XfdN(lfLw z{?zwwfqW+lb|>2cv+1T{fx^yW|y6X-j%Lap33cnV@~If zR$yK_qrU*Pnhd)DTg9ZUPn=xNxK-%UczN^}k~y?uKJ|pg!eAkwsxPOTZ+nf43}J6I zSQD;VZXWeeGob414Eq!AtrDnb#SNm9dSE(0 zO7&dm>=|S+@aE;uRu&jT8IoW9*tir4H=G<|!*eWO{|KqOp;o1oFj1}yVbP*(jQZ64 zc)IV_NU@=R0EO`6pjDPiUM&4hT3!xjt;#|(J^Q(~+rzbtV6>nmFK4Pc(x}4A&4?pn zAVy*8%+AZu-m%oo?9DV#8bq?w+s9UNQ$XVjqHOgvLd9uf2?N3leb}W|6tM{shW+9f zFTW?`c*jhDPR#0T_e-@))K3Q(bssV*=4L($E#EWjH;*<-uw*YO3$c3Nn&^r;$*95$YHF-Z6KR+(PDJR3F@QX~V zsdDq=rAT-(t%rSlu$ahcI>3lV8bGQFwvg~-fRZf-Ccf0WNCX@Z-|bjun?1RHr}Uqs z^wk3#Gy34}MZ@cI={!WmKXf~(`0?Dt{Lq@Yfw z{#8Ab`Y2y*2TGdz?juT9R-u129wuep%nY=Fkvv|<%dy3-vYHmh`eV6YJ!`+b<{`9K zuXD|FpFDXY=PGd5^L^3UJuF9~v7F~k^}ls>#agomfcg9i8nh;Db&SodBY z%7^8smo>14OA7KGeu|X1U+5R?1|h!q9N5)?O(3&Y=psjLomZC zV%mM0hoKB##|#u~c}%?7G^&}RhSQ|h)ct{MOm~)mMMF%;c@z1ZqUo~WkDJl<%PFPV z^}DwArnQkQ!)+@(UXl=tBVnKmwA~3DmRjhHscqjTMF$>~BbaiS(6zf^OwVUdPa01@ z(wZ4|1%Xp%3C<fjtXlhw+4 zJh$-4U|L?%l3O$4Wx6x=!SA0@uLK46#HMWOu zX&f}X$@wX4+qq9`#%t4O<@&6M`>5%fEP>#=T#b|W1_Qd%_V!qN`hrt|i4U3y7R&g? z!>x41DJ_0gJWjVt=~ zW)OpmL@0U*LhB;EDs4rWnVwi9odvHIK*2_?cFNhWSKtt;6>(dmzG#;$uC>OJmsQUa zx*QBTl@j??XsPxNdHhmXCwT~TiuDWPU9sAqVIDUl86F81AcUtDV-T#aXU8EOh^)~-Fzf6d$obO`*%lnJUjh;)aKvKBPj~9SBV(w2 znLgR)I;++q{RQJ-zGbzbH(}+_lq>ZHG)048-PZNpvqT{{nGW6zez15H()e+NW3YXg zTj{CHo0nBL$RBDE8t?Va!=plHG$_{W*jDPFmS~X!=6)Ev??IRS!E}lxv`pGCHrsXo z_@>xY`OIYYOW8qABDjMs5xoZBP${Y&$P)wE4L9VGLeGV_!kT4)c*)V%$k zHTt6=SB?HE!tq9U?U+^rtm|c8nh9J%({Sjj_bY-zZD*tIggoLBoHQ{%JdJSsczWz- zk)UcW8t6M6YGTw?ox@Wre1%5JGVu>CpxqajUm+)NpgGY75nk7itv8U7y4*FDwJ z^^qgx4x7dZL1)>z^J*8LFM-V3Fp4PVk=19ol1uh;H=N{S<`{b|(&CkivnhL1JrE%` zxa!pLQUW}8Ip3=Gu$JXxr4`DPn9DJ_wEBcT`lcn#gwrOB)9MTLf%2sXk<6++;cFrC zFepjcKl|kN6e0oaG?kP!s6&Hc(JB=+ zzGEf&IsLJ33K4|56#S;2$gk2HH_~cU3+$yHXTpRuzc`Qrdpb2j$U~>vgs<1}UXgwj zGHS2rrT9?qWI(P+4Z#bqxgS@x8k;9~oZr7soyCV4%q`h$H+ndYKL<-bSHu#h@K<$J zq=0rsC~I$W)$PNRY?Z>oi1xTrZDU0ePZ-uA z=eX|T_PwETBb4STj10tcB_{DvO`?8ALHhjxe*8;9mEd7>aN?{x7~!VrW~6?(Q;d5Y z0|$J-8B!uC=q>2BD;@X#k+Ibij{2kzU5MR&71jA1_8Qa26BzA6@0?qSt#EFVJzT?h z$ZtE>qwnu9V*~wKW^6D*%)`toY1Qg~Z?xp-!{BIT`8^}@Cvq#!SVsKi&O38wNFW+8 zuugx4%zdESc!58+4msx1UN#H}8TO&3HVlZv%0O?_UFGlYq+U8=-cO2J4aV~?L212i z3Zfp7y}wqO*e4ot+DJFYD>)rRp?z+WuNnbeaqY;5HhaV%4eF0&sA8(pLzjwz{Ugsm@sOH#6S7@e=anP z0pMvaaslUEUDr}20iO2%^NoeJldgXabU1F3@(Y%)w8l4(K7W&q#27z*yuc$MwrMHJ zIx+(GIL8fs#-gXQAnRv!7>=m=LlFUpC_1W;kPylk&eU*fOxx7u!*ti4W|fZu(cFlI z&U=5%i+2dowKqz^O1RY{DmZTla1Z2(SbWc6XC}-dR0!^QqlI(VcPkrAkEjE@So_>d zA?avDG$JwPJa(3e_S_A!!ClW?yhtqCbNAfy<$2HDXEfNURKdD>es;k1_0Y*4#PFX( zG~Z-{MW=u$&LukcQYsn-{oi|2jm`KEY-Zlv6LkGG)Afo8l_D}HT;Jh;ZYXa>V7$Lc z7KVjSFZt|Q0JrIYB(UW8*b2UO`HWS4d1pv}^v_4&fq&yND&&!0TsnxAD^ z*5(fc;f00w(X3alS`qa+;Tqm2I}iXhwYI`D6=w}*=BBu1SCTwmeP}z`D~r+-_uuFJ z5i2|-Jyj35|MK-PuBSH-x(C@(T}oQ&huOaJIk#EIa5}_F9LY&8L+R2SR>xC~L%&*n z0xm-7?(U;DoM9cB=MJCdSybEWoGQW=y5iahJ=R<6FBz^^3!@PpTSNHE?I~1gL|a?Z z+^?9Qf8IkSrsLWO6;NOUOGk$kqS^tZKY{o7p=hQaFy8jW?2hZwEixYu|^ADgp)2ddi!u%9visKmpRP^m#wB6_{~71D?#}P zm;GJ_!{erQXtEgatO?bTF8XWh)XYo8ceQB!_gtK9p3H?7<*6+t6{cpz_JSSCGKO~$$mGkvG5P0nvx%blsCDs-|>c6BE)CwA3t_Lt4a zrq;xWjo8m&Tt+vS5vyG7aeTo-(UexkAuYuk8fII@ z-`#GGo@%SHYM{Oi_9Jp~2+*8I5mgJ!!}VOY()j2eXAJKhu>)Ph@kX8S@rX{f!{&Oi ziL^-z+D!CsXg!Om(4?O}=7CM}Kt4<}TPcegeZ<~x_9u#_myN9qi0065kt{bKJu{J1 z8At!BeGOT{yM3EV{5ny@Xe^?y07YpsP*@+qO3W7QWW2~bH{}C(H@{8FzlU4gVwn!pEQz35wNJr0O#qQUV5oRnbTuCpIi1@q1%5hGy-&zxrzb7 zA>j@IT($pjQyZuD%0SkvnO=mTnuY~o(9O2>dwdv!6Qn(sPA1Go+895% z7i3`50bQ-{+S;y7Js>pZ|12Axe#(o$^f>lkec2ZB_$Haq8fi3IgZ!`UT+7@Wl;m&w z1?+$T^Ujxp101@UQ-gIJpq(0!+2&Kw{Gm|GrkNmLytP@IKHW=$a_KdsdPz>^Ytth9#2uHD zKm3M9crz*M33FY!Rmnp(ZIR|9i`kK#!`Bn`-^%)cO{&@S+lX$={o5p;+9Nnpj^faI z&3|o2l_MDbglu6|c8k*BU)qNcHFzy27{lphZDj)>HEWzi)?f&vU`Oe z{;N#!nKe$7#WwIOw|%PGf&HA1MQPKq3!zGfEc`$%7Y5mZRb*O30^m68DRM~_*3x2?yIXzLtD1%MB-J+sS=*;rmY%E5M1FfSFp zQviQ1-$2P$_Q)uwZu@zIH!!a9RhFBf4Y$#%bu5Smda*rR<_ZpZK0?OIPTVff zBoru^lLEcc{XHbd1+0SwPUr0UPPdHas?7?*E?w1|1Dy6sB}3WjQhGI}UHYktLC}BQ z1bQV!2fT8)Bxv;gUUVHaSB>LfHdt6o6-W&-0i|L45G9_5h}nTqHx$s(GHKFM;a8#hRgig?%d)`4MjX{{E3okfJ9FQP z+l>vVcKt9dPIRU@{@jqGeP7XCP)mn{%uGwL?;gLcB#?s}3}!3mw<`iI2IRJ1qk5Me zCJZA#-GA_T5xMVQqND%1!s$&6P%G6DCRza4^g*h!%Wr|8Nd}Y`Ycj39e>q452mvtO zzoYw;#0Hh_0Ed-oiKyOS_!$*Mw@sAP&FFdLE<7gs zf1mnmtAEuXl8U0p+Iq0Dj|CD7$v|}u+M|Z49_{lMdyw`9VRKY@2?m0^Ar*NYWyUmlK54j?D)K58 z!qljzbneGRD67y}9ZR$G`MDIij?U^X_@5WGBrsSd&avvi z7K5(HQ3XX;g!%L5z$GThTra#!@UP?MY*|a@qtjJs4)Sv!q71=6r>pFMkHm}fmPvY~lmq^yR2ZWex`0SC}d2@Ak#k4;7jKZ8=i9d3S8S+rohB9mfp{=D-n zx(R@!$cC{V$q+bFjaimBrYBK*_c zPSjr0+jta;k5Buok`@phi+&Z}9G;z(PdBh#yvIj%nz(3}&u4psKl(=ZUypvHFxJ{+ zou)*k{m(@kRss7@#e zLV0l~Xh1DQ4*?dH+%UAGv)pnD0)%Q2IR)mBVVGN)m;`LIV zl)tJ5Nd~&)2u+m&jr8(DgMOqcsF2wJ}lU4(Ie}VMTP~MuOu<2Iwf~0bdkOA4pm~EWg6h7KBR&(l3=f z%dNV_;U6gm2gQ+n2Qfjmpu~sEY!~j_2MMIXdNq!#kx4qY*^nf;sa>Mn&MWu5Ctm86 z#zkV{5>j2U(K4%#torrE38zYdr;X{-m79^^%(t(yg~#VvMrrWm9BD89Q&z_s;+>~i zQB5z7ws~umnO3EX6TT{HlmXe4A&6}82ngsv!zbZkTIW-Y>z57FWkBtzjz^mw)Zi3| zlE7JQ?=ys_oq!q#`LLRMUB{UIX%;mM2FO_9RLk|)FhNaTbUu`3R-ujOwPHEjm&Rgn zdMqx*SYb7lMbWryD<+DqAejgQw(hnz#o4qSyMi`FoW_y+z&S3MZtuvz2(p_{{n&ToTkQ}|-5!O#YRqw? zt^{_V!E^L-L*>DaGJuJumCT6szP>lShOeHBM*&~Ng&y%ZCF@1Dt z_RGeg(#+|0X9@f2F@CV%x2FM7t&fBl-1gR^Ne0=68{rpSN>BQM=#m)CUjMyEeNxs1 zg^1D2o#0;P8U_TYIe~x#(6}#5CTpv(YXO&M$;ts(yB@>pPdzp7!LkFC&`R6UX8l40 ztB*nF2v)2(9+hMA_|A^dMi5Y^y3>P5)p7O?^T#QKdTp^G*U1Hyo;K}N|BVB#r($np zKwB)Z`F9GEk>92QNNl9Mu&btU>e~ssh7+OZ?}ABa*c*Q4PPoF68&!lL72jd61?835 z!wK19CA$;qkYd#l?!7xS(T4go9{Y-X2h#G}7V33|wpI)1dIuN0mGDO@oD$(-wTl}n zXsXz<-eGkhOx&NXi}#D6h$B$ftPEu_C3n~WrRJhrW;z%N`^_eTt_5+IajKOHkQ3;F4j1J$8;d4oyTvIHj1{q z$;`@^EKN!^gx=SevhT&?hpaW`K8TZq#dyJQH&`qE*Vb*`;JOtQ8vh$cDBhFF)U z8XDA?h;sC}ZDz!Voi~ym`%GM-!){AWOOpyFuRjXOe2RThqzMx?!+onSS)A*@{#4K7 z;eIS3f}FA|&Zw;*zh=zF(9j|h-5bWC;aFV3dbYSIx;py_yk2eNHH4suZOBwCzI$T{ zw{qkmHW9>8o~1QFsJp?hW-5$$z5TBcF%Er%zv6jXkr z5Gm5_h*Z@|r&A^D0D?*&uc{}IG|Gxtdh*KC!|mV_L`8I=|G+=BKyC*EQvUfiNiIcC zL&cTncm|`z^ZAFNk;%ul&C+|6UlJtBEc!LHHIJimEXAhlF^*YZpFJHS5m>p}bs9kE z%mzYfN1S(ZUbK2%ERuHMfcEi=d1ZQ?4lj$4j#s0>=b< zVucoQDz?q?tsNhGX<)tU$Hy3|<^l?wYBU@YOw1Jmjl(_{%dS<4=q?=bVp*pHf`Kj&vOKt=X=}`81nivO_*XBL=Qvk8av)x#c}*b`asR+LmaP_4a~x&x$V+ohH*;W5OZl{DKW2o$k6&8 zGT%U+Szlkjsix?r)_a@321t!5Y%$S8bSQ6XDf_T?d(62?Cdap)f5Ro~d8 z)y2RPiU%PnUqZe?WpX}^=|+D@DZu6D=hsMKtjsEHG@SW0rtp;F!rD~ydb#2xg;`E# zHU#0dNoJc~PPdR}HB4IbI9qvDQom+Cubca?5Xcwe4eS)AnrSiy007dslv;IJg`=ah z(;loNX~j5Ri_+4K3r@nfVWNYH#(kWFhG03Bi_}P-{6x;}^iDmlpWF(D#iE<5E)dXFo8 zane(__2%zaYTmimxdx&h>W>2k%G->c)w-_H2D@#Xrzsz|+{;R>Scz1p;gqnhJU8;@ zdUx1moIbDget`MTHN0c(ad`RtaQ{((;v}!jU%|C^zh)zOr~B!_VlmnV!DAW$j1L4U z08f$v>g-admS=3KA@gJQVCezt2kkUeHbbl_(!OX{@nu&`4#K0JZrIr7XKJcg%mbI$ zp&0qzme*r4?pn24c7u_&M`U~L77aD35`h9wd9A+N3MvPXJ0#ezkF_gm3Lb&dPB6== z^}W85r+f#{8t2LKbxpIUy(oiT5_y4#lAK~SH`dd~D;FCmLUKGk-$rRkMO93lDCDrM zN4+FjE6NBhN7Zb4h*;Jx-{jx>L?AasW^SB(llB?MYaMXzX&q1_ ztzp)6)GXKAl_k(+o*){IFE6<2%D#dqiE}TrEnA%#%QuSFw)L)H(*6tRr~H7K`)1uJ z(PLrEy1lLK7ItN49ACFGhbf}EjPU+XWsa3e#8|;9c{6k{5&3bV_H|$0qhh+c7i3bh zQn|Z#)SE1OXXx^aMBJF~J{ajTD@Z`hze>;@s%cUsVJtF?<$;IjXdl_FUra9X+9Kv! zY%A$*$i=}Ux90m!cwBi%qCkD;uA;pBMR;m)rE|(* zkD|=tBmH(9=_$McMq1?fBEj{L-$SEHGUaViU$!B(6IVjks@pfvigaEar&R3(b=Pmu z-pL{GWDG!7XZu6;ZN|Qh_`LCjr~8KwcM(X4p*%vkXg?&g2ux8%EIz-j>dE^ zqAI3hl1x5QUPT_>DZnND-m4uBpuFo@Ft}3xX-L~t^HCD)uDAZQ)`vW+hPl&aszJZez#gRRGsk%ChVqJ{6U;$ z-E%96;iWF?KuX9e){+;+amtnZ)m6(^aTiP^<|@}y)h@J-*+>oaF*ssGfu0=AmW6p; zksUX8-}LRiNP~5d+DB~&w^}?>_s{t)hF8jKB)8~ZtzNYfqPMo18XUTR*pTQxKrvA$ zVUl+eF$<&k;E!uIyLhniXwvmQvsGb>4N}w^DtKXpr&HQW!>?=mN)7KQCvQV7Z&Qcn zdy~I1>04wNg!X7kXf-n}N+<%PSOF@smTS_r?#ElLdN8pHE3Z@q5&KLfD+mq!k{(~n z5%O~JG`u%(OkuDwgqG1Ru$)YhsDW)qm)N zTkRNEONX^smi5Yb*Z4}66)lJJ<5}kQ5E2#O#0x7S3N;bd?nyg->NNOK+$^)uQbU6$ z{T1wNTEwzn5zObRZU#uo3N8P`{4&#q#KvZ?M><9Vmsw4cKc=?h#st&iC%Yg=)^Nqo z7KIANm%jq)A=bQv=&!TmAIOXPdE;32Dx#+1h$x2NH$mxYg%YXY0e!}w5Cbr-L;~0% z3#!d~p403_6PFsn0tf$G(%;axH!}g{5;U#W{7=UA;^kyz09uriyKMiHEc}D@Mr3NO)Lk%8ODO!b7vy7f5Ge7O5pn1;t4QJ2Y@2xz5?Ia`H!p{VM|N6d6DEL0*4tUF-bfpNT2IkC@_^q$W-=JDhYK}vS ze`fukU!=6o#*|J|n$gpz{(A1NUWqgVTuQ0aFYWIc z`p=ztO9Qn*)*T}3{{gimzz5UF!4M_-uOUDC4rV$qSx_xjw0!-a3;z9=(lan6&7ah+ z|K~^k{wp&A47{{W(fxBDqEz4j!%JYN$Mok~1z`geOv?YkH|Fh&&&bLeF)=aWE3>y8 zHof0ZM>BWn?|c5|p$obOwpKXk6tC3-oYbebL+VCkG3{!Sm#K?W;jv|_bFrvu#i9K1 zTX?jNzmtXkjI9VQ*4jkXbNXi=DVLX*IStxw0j9Iw9XY5P8u7NDI`1~IeLH^$3x$^e z%8e+L83Gad@tBo~DYUPz4Q~?ZYJQ&Rl|x#1Mq;I?@SQXjAGLy zl#>!%@5i$l^cRZdeSUh9NR;Zhu5~6;9>vC~-*N+32K?4dV&mr)nyWDU!*EAgdzsf_3{-f077CCg zP=imkITPT4obLP9sx!^kndau^-l%?+pB)g>l8O!@F(%f8vToKNebxe9LTw$N>eySh zO<&xe>+fy{RfW@huE?108*I2s$;pM;y~DNHWQ&cCj%MIHUD)H?uC<#e{Zc(yHYU^= zXI01EP`C9E=o6}Qk5|lG4zr%7$}GxR#)Q&zN1A!M0HRSi3WRd&>HnnlfA0(4*0T#vV8;_+Ia^tP^~GIXu=y(>v0=joz1Fjo`Xu z69h&howqO`D$QsbHNVM!nD*&|)DwI8Cm?j^@4ZMYX!~ZuwN_KkpU<10c0MyOKn3m&JGnbgi~PQoatrQkPv2l?N$29{ckQxk#`QDkU899>d=C zV2RoH%rAwfJq^z9OSPei5nRL{zOPW{Y9!fBjyR6xDB`eHAnh&-yRS0XMhdc8Dfd8< z{EL%sNU%tV1)h_;?LWpT-G9w$Q)FYQt)(SKcw@V`o#o$KYNH9Q?w2U``hC&w!YKD) z1xsB58Z+);Fhn!WEr3v5efWVtu$bbux?dZkC}8X#sc-M>_=K1Z=hJz?*MIXXv;&$^ueFYZPnc zPV(-{Qj_OV6(j}cP6q#1$blMzcD#eb)dI8$9x`1Fx{M8Tg(`CtQ~L8{n^{zCWWgM!h!+zA8W?6*I{y>Lb_Ea*z;RkQkaj^^?6O*FQ zr(dDDpe2&4$=Pg-fI(t<~|!tVMMyNyONoi*c-vG$ZuUFzc#SKDqx1-u{SDMt#A zXIl)syMSA550VZxP43|p5u341=bFYr*pq75L!*vnqM)c~9Wr*zx0rp=G(7Z$G+$yvV`r)s~EQ;2bT(VHo^VI9RE}b7kp_vvnsk97NH@*gD zn5F*2-9ylczZK7i5f$9&;=txSLje9OknlFWRrr!`cLTvP!~*7DT3&vbgoMR#vepHC zyscO5<(f(o)Cg!$KFGHDHDT&ZkwK?)dfZr-Uy*co*s3Q~EaF4K-e;QUrJfPx{d!L< zHy*23E^)bRp7`m}>48N*(bzmu=|E$FGWYfOXW^Tkc^P#gCHd^uQSiAdvA$jC_%u(% z8wWgZW0w3oom{Xo>KwfRP#xP^%5)%uX6-e^aa(OGvjbF!wG4ZIy8AJ8C>PX-+<9aY zJ304JmU{@w=|>{@TkQMKfe(~uP)z9a=ioUfFZMif1=XG}bb4AO>jRTwev?elZF~|HNzSVu`SLR6>`c7(0}^g{(AZx=|AbVSq;|q`WixxhuBHKrdmbuq<|MS6`TvA-VyPfp^A#|sB{>(&e1(A^uabhQ?>sSin+fCv)VQR6=ko$< zBH$n1c90@8S2J#HQwr>*2=fmp>Q0D5*(QRsv|9UuoU*xS&5E)W$7ls=D88Y0u z<^r>c_Iyrw2cd(k8TO^@+fu>zHZ9WjU zk{w$121!6vX7kLhozI2j7$(B3-}ZU5$Z9~*Ga zS1!Vco(O21$N4)SxCUk~_KB>-`PqvAQzV+zRsVO0@y}ACGzCeCSl4Izl=Jf{4JPmN zz)PL;ukfG~v;~E5#q%?s23D(rX$kweSA0pp*D2a%wlkhv3vZxc9W$1Vo|D*8-C<;8 zL|1=#V;#K4tUxLB6X$%oXzh9pcxmMUDoPK0)DggdEDf}-a=`)O3J}I+=ogJhT!h7Aru)7ABVz|Jod(K;oGg1wJeO z(zIGP^i#!RzW6(Wj*V`N|$tMbh#mBF27z!QC;iJv5 zAcn7lj_dyjC-QCYVqrv7(`fdQ4uuXxG=)#~F=>~GS(#_ZC$d>J?9{J~*64(Vht0j_ zSZojWbS`RYZmy~$FiDyZ+}do5VCrwi;6l_mg?{llgtHU`Mx*K%o%*=z{4_VXaH0fI zGiJqhix3bpNBKhpbRhNC0Rx%0H(xX29v@isWjM)?*0}|DenJ-AA&PGEz5QgqBT;+d zH8*>`fLzO}r{nT5$X4dog2?7TCG~z69yy!*(R=7M)VN3BjPj8JeHz)@zr$)$)l1U* zie0!|roA>o@0=(`hljJUFCld&kKaO}Q0n#Zc&3Khg+cMGuS570!eQ}4Vo+p*z`n10m0sFF7EGoONn-b{pdeDauF~Y7zBK@u@{%nAkE5& z9G3}zold_eK!6l2vZPz6W(Du|Tg~tPIY1^KwH#8+VG=D~qq&QnK4CkKAh|0QQY2ih zHdboF0DS_~;MTSdAjYyLoyS>!qzYt*&8_J7QUYh%+IEn zaLpr}gnJmo1k+yl9CA8adl9`d8Df3nv-6Exu}u_uLMS)&t8}sI61A9K@q;{@`4eC0Pw`nQBvRsQlWXniD5%xN@V)d@T(WbRYy; zfr|OoXq1Ad*CLxGahxZjz%mLjrBde4a@{^0{PIeO{vQ9RqhDTVg`GNkQe*8n8^PBGa0YP7;9TewL2 zIKBB(pRd=zvcB~a0}yr}BHw)CHw)5oZO80OcaVwxO3an9y0@?Aa-8TDS?}RmWkRIQ ztpP!`4?@~3(^NdIm)~+4eb;iC$ufe8ptcwidy`HXiApO7JRO@2x5J`5J3*YQdTfw8 ze#HyauBgFG_pF0PZSJdZW4Nw;eQ42=jx09bksuye=+s~2I;;7TB#M!vS`Y;c=Abq1 zlle}r?mGn^6ai!bBcK61Ajn5eCMr1w{h4W9O$o1$he4iP!L_~^UA8&|2dN};L9m+) z=-0D>!4!oYoXWLvK(bdk2k3mwriA74^{5CkLWI66Gk^tMQfe_SA#}862dsA9H9zF? zVwi!#GAcLM0xw57GM70VQw7YXkFw6nL{>_UtAR!Hh%R!{oRN8kDZpnM7d>Px7?VyF zd!|yb;$PTVI-5841TBYsTn??iy_4;$RJ^2K;aCTkt@T7rx%MMn14mefPYwxHMHea> zs=g;a-z3qs_zIlZBF&gl=2P^pJ_`lPcPi7%qLs9i7+IXm%4mMG3E_C4ea~Bf&WuOC zEPCay%n{3J_(9E&$gIB^gsC9gBIY&!*dX#%YCRy5neJ9O9gGli`0Nz9@1@m^&r?S3 zsi6^TRzat-Dlr<86G$`kC?#L6fGpxiwTZ*Tky_oW#kmFP&~hZF#TYBjL}z$kSg{0N zS*!xKMO>N)`_D1vRgo}<}(~}qHNz?QOkv#M&;(oQOf3Eu1|S2Myi=4 zH>cFTSgjaGWJYQiN#N%-!OMn^pGm}f<+EJW=gPZ?xSQu0@$uudt6;H-V?Wu0d&nW- zoLX(RV=m&e-0B*OcjKlxOV>!TIG4+c-+Kg4BcADF!YQ7|N3ASJkN1(oQ*9ZEkgy>Q zHc*0O)b?P6LJ~jk^$Lz--Ongw`WA@Z7ziI!bg6H*HZ4PS(_le2>z7WnPX;vlD%Ab) zt=?3fZEvmDSk($eawFiNCP`T+%6*x+cw^YYiV<NLHpyVDFeEpYM9gSfx!#?ZJ>6 zUV(Si%(vz~HMgX~mYaD`lR;nM>UFiBE!DR@b`PRqDIYjozrjMk?3&eStBLrYWlfZ| zn5-Z5lwalA`}5ha_elZvn{jo>;-?NS>wOd&s48Yxsib%ff}p6UKN{St@)VG~UfqoUESkr^4#kvo+o_ngzz~o5EYi^B@&?KP2 zfV8INZWG%$P1$Wy*xn?R&Wn`_OQI9``l2u+REGOLr{Rh{e@HkDOPLc@j%n%S$|Rp9 zW3(2hglSs3G&sz(d@B3XyZdII+Zohe(aLpIbaV{TOxLb+g*JE!x-6&J6oa5n6=9ss z+jKM{oM`(v23sPrfNzv~w)F92xrK(*rncbmXyV>7hDEMZ$!hZ0>jx?~PfoDHkuAqE zOstF{oj2E)zqA!JpKZC?7%HywKDZgxyS1#oUXHELEbdlR0pFykwkJ{+Cwb8~(zwVB z9uQ+^uoU7wHf_n`Bv@$nm13htW>v(=?#oFAH)B84t^Uz!C+~*a)N9_M%%hSz=JQklTNISushK|M=4C+=+q4_x$ zHCp*~L=L?SG0%l#se})|h;K-xBN&}FBA9gYH1hbSWDLi5$vADBtgD{82^8<@=3eh# z88mB_{$6V4l-lfG5Q_NxwG*y>&h$Jv+#qirGcS5)tD2`l zXSev>flk|;Fee}}_A%^Eu`gYrH)*9sA1-OH6bA<|e$_4GLm>*YoW!?Q^R z_rB(Ax0rP=V+}V6BP6b4Vc=cD!3Yj02pX;FxjVL22h zyL$Z>=}W1W+kjItEh%vqkM3Ruw^Y5vF8M)gILYWZ)v)#n7n|tdgz^*DL*ee#{x+dL z$(jp-uKPlK!`|Z$(=S#w#{8z7-$XX{UL=zFggMn-uOv%=JoW#&{2$P!{l~AL*j84G>FJ5q8SS1&lX@u?G??)y zh*;XCc(QqF07kO*D1?E~nQ94|*BXBgDX|^{GTCMfNV^n3RD!{~Q~7cyZ>Z+*K01$_ zW#0A;1`aP!PPa()EYA94)V({fXzA&tMMYnOe|(2bw{f?|8%|VqH{p>ZGXhf50??my z>A9!!S&{9%U)-!_dD(u}@pWm}eTk!3Ue)vr`tGwg2{)VO^zIMhLugKEgX&jVgL&7R z&1PCaUGTk?z|koCT5~GR?!ZH%qo*B1`X0w?_WZWm)~A_oZI&7r-*4hNG4BhLpN85t z2(P>Q1rEN)^Iq)UT4`M=&fm!06W@3=|N69ghyBK|@OD*CK!VsIjiJX0#!s@8q!j3G z-85M={#+t5Wqi{)aVlw<;eprdDC`GUebP(nQAfP5+5)feV|Lz%4WjTg9A16({LRi& z%-2E;7au(Cr`g|`-G0Gm#^83memZ@5m11wQjjLa^Ca{fNfc2;tx8q%DY`(5P5x$>J zwLuYflDXrf>klv#1yD&6z$uXUL$4GY6VaXytVG2GeSo&#MMLO?(s zx$i7Z5`%@_qi@M!h`)Us_9<+|t7qCXdNr*PrjMLifjz97T8(nFigjAwZ5VdRfFIIr z92yNj&`H3MfgkQ@I&RK_wmkx&czdmbCL-72LXDC^@V zPRIUbJNTP?&prv2S6p>f{$X|W^Te_^C({_`1|m9PWRl;qpV{GrRr9n|r(x}(nGmn@ z0kR&ycJJ{XjrZ`vW>tL!#nhxnL!iY(+$rp6FDj=4$>ZP3Z)EYk=!tb~Q2b^bv^?K! zE6`1IN4B_OBRu);u2(=)Mp_z~mD%a??&F`y+^2q#cl}C{b?niNtmJ}SZaR}W9wsBV z_E*>zWlQ!{er1AcDPf;JiT2RlinBqV70)iultsu$OMhrG=F!?*prUVaqH>s8b#y4N zIBfOuxoe$Q=2Gr%k|p~KC$zp^8!_RKvq5aM#KWo#f?xx)A^I+@QJih2POmI&c@P!R zB1yR;e6HFVPEFQ@g@@;*I||&($1PhEY9>p0b#gS|a}sp$8oYw#8Z^726FcsC<%IPXE0Z!oglMnc zycdF~ajcqBj0%#53Bz}-*d4#C9v%n!BDCkY*zFPgJj$q>Ja;4ptJv}eB6GNmQ2H`J$V_fM;Uk~TntwwH4xrzhtO$+|b zx;>Ig%V~Gg;8G-;{Lo||rnCTQoTI&Vt;wXlCPUBclEbBF_9LxI3zhv~CoPuRuZq~k z^_zA!cVym9&AduM)*2#m{=Wd2 z0cZaG;PKYAS8v&}iDk>UIo@(Xui>-4UB42Ol4aEB3pE(hSYq^P@~m&yj~J;}uYtab?9zZjg{~jf<`<*Ek78-xp`#2OG(-|=BuK2b{W)dw2a>&i zUr?2afRote%_X_)9P!4#>-bwqMmz6@3?1(O-L-V-Vp+U!fo{`Ey!f`{ZO>j$=vT@8 zA33MJ{RHl?a-YAzGf9t73g`zuv3u<9L4M?cZC^dp$Mlm+k4~ yUdj%hOOgKZZvVX$dau4YW$%JteEZdVr~eO$;fC07vdf_W0000eug?^ z;oA1zd1o7*5>*7kb86GN1cuHukTMA z>yzoJ4M0FEHGS*{n3#Vb-5UJem(($_gmM4A_I}2PU`r1p7>DUIl}UL`1-C3XG5=qV z;z*wf<1vahevu%OQ8;H(1w)*%bbCZLaUY1k99z;zS4Wg~6pRt)fwkQ=U$axf`u7}~ z>*^*8v@62@_75KjyHCq6&tK7yLawI2m5dUK#co&jvtz^u{DdbPO`?Si?&3K#wEl~E z?~eVR~6o zLh&T_^pd2$Z8@n3q$6}yiNA~^vHT~n;67^yv=(Nxq%^?)jmvzZk**X0AxQpi@c8GX zVIqIKQ4T~q3TA8hD7-mS0tE8k%<{QJ94;Krf$h8J3_xgsXveTueczN$^L+f`8)OM(_ecKjg&*!C&m?I_}Aw5$oNG>y-2wQ|7PD- zK19jz)l5{b`d=IV4I>{Ln++5FS42FJgHbYi)Ekkb{jFE;?p6lune-C<^~SuCK4I^p zj`8*|yegjgC?(P*~OUSU2@-dhJ{u)0hR! zne_k@rLkYb&nUQ@^{1ArV{6clVI@CaomWXX zKtIywXpyM?==FbDaHRsSVHmi510xmj9H4EOsE|=$B_9s2CpnPF0~|AMR-F6lIHbc% z)afn$scdZ>H@H}agNQM)gwW_m<9Q1EHM-?`Yr}G+V~chQi$#?7JrfcVl6{qwv~(}N zxAb7UD;$77DZ*PRihk`%0$g^cc`}6oZf>8BhiA8bxY>9@^ZEJ^rJ$%NE9pjq{12-i zAiy?f!S=pUG?s^d8P(HX$&?7KS?PZyrvFyF-dTgFUWLPGgpiG>AgLV7;Jo4CaAC)0 zJe8_;HfX)p40C_)@oC+iTOS2I3(m;U@CtCri}CaE>lA@k96v31D$<9;l|#K=CAm8x zZ4d1#`(pFMbeqBLmP1`ZNy*Vt%DDaijmiJs;<_2Y8{}9o+TYL)1>e&GH@X#TM?DY zRb`}~ueqc%8DZ4)Joi@wQWdk}A(RDXTE;qD&aR7Vyx+X$L_gCONF7LeeUqx;P)RZqAfQ#7})E>LHcElhMyXO+qud}6&<7}y^BazP>GmttHN1)a%wOF z9;>}iO^y6~i2|;9Zsje6OxckwXC`l*uvM05#(o=b_3(11C-h?FrjI;`#B8&(5+tP2 zXxV~Ejjrbr3t|}g0bRB-SFc;8)nbRLNPLyoilS{RU{!Cut_hyM*Fkvynna^j>vYc9 zPez=AjJUmRI$OYCzF1-KtK)5^87>@+hJlvGYE>H``*J(QXt~jjd3+x z63qt5T$O^t;_XY4x2P1E1m@f0bIFk`Me+liZ(N9kU-=VAS$6BnD!GOkWbVg)Ee z9oF@#3BV(Kq*rjx4=>+fZaLY7|>u5TMx=q!0$N-zABnPR4h-T3soY@qc^y5@fVDJY%fCa_&Vc zDqw2*sj7X)4j$)$5w`ARnM^W(EvP+`La8XUyc=x!<-ADAaau%7EMKc>@@VOvB4A{1 zF+MIn{<=S24qK%AFx%6wILk{^RV9@Q`3!*Bu4t142L$&1sI)NQe)I57pio-1H=8V8 zyq^)vud$smBx*||KDOh3&FisPYevjEzGt>>*)Pg?Ci@?ra$^ECmL-65`O6l;MLYXy)>7;H*_&1M$x`tr0>gk62# z3DGrn!tnCQ6P(KQ+JA#e#o%xh%x<@5`m4b@$@7srR1DwslNNA4jo0%re81O&ViTAk zT^3WK)5Zz~?;?R`+O$XMK5OH>mHJAjf01#VcOKEVE5{84F!=%tn(6|a&sQ6ywcL1Y z`Iw6&L31|oUddh$7*a{pEW6U{!pw~#zi)t`b;qTx{bb!3P>i0yY;GTk>3j*88_z>Y z?11$>8*HO9VElxG^dFn!8UzlQlk}^7+PKUwtnfg5?`O=3^wTlD&4y8V^f;05q)~8W z8^furjsp_+!Z6ec?W?P8qGbZQ$gbs1sshAW9)Jr5U%stoZ9PkUky{gOyCLD z{Bc(TYjui~ZqtI9=CZNGyJMpcuDk1cosRN|u{<#se~* zYeCbQX7lT##s2xr`GHI)?dI>X>UetVH5cxiqj;n(W}Hk;$Di6xg4v^I6KtCU(D)t! za3}MF)At*K;b;?kmhhp`Ss<$Iow=I><+zs3-c?UxR7Dn@OfKz#r`R( zQXZJ?{aZ$x((CI=HvjQuCj(o_A*YI639x_JrmL^sj0rTsa^ZD_JTO_^CDZG?Dbt-J zAoP`lZKBwSx3AUl^m-86KVm`B(vrIK(T&=8G9$9nGh4(eG<3G!3|Vd_&-9v&8Uddp zB3T#DXT9xSf2&(90ySuCzkgiA{_1XNGt9A{DsP1cAUzL@MaBVXY~%4V(PYemjH~9n zxenR1VV6%{(HqG!!e%s-%GhMN5mepz*rlCBXl8c&AhXJB`9NN)z7lP|Q1(qF>Nkv* zj?Q5x-u*CpC*Kl_>*)dSA3;RM7{t%}=2oNOV2PUzv|xmRttJWYl$Oj+>K7^9lPc{N zEGtbm|2Znz&d#&>-_jCfo`~%ReQ2)NFHx=x+D+ED4woCBY0}u37Jq}TVN&?s=%iEV z6%N?2$F)@s(Kw-R5)(-6b(3AdmjSeG_T#1ji#9&3)t$6E8Z~>6_h}o^hWAZ+M6IVh z#+!QZVBlkk_o&zQW3jQvb+b$vs+w*^iE&BRR%>3R;8>bUgi4s=bgco}zF$mfk1q5A)TE29@usJmm`UXi3sB z_LHux#O(Pb$Tn2u&GmQFebE|*23s6Jp8IF1r1h=@$0yuO8c^;q$HmG!(#sbf^M0u& zmNir)QmMHiXn{bWMUrG~W08a^Qx+RgEr~T9$00X1lgVVGx!!blSXh-Ajb?kl{qp== z9uV99yhI@%c-Cz9-sYe<*Ql^+-9>x37OgAKVfbx}S07Zl=tQe(`QkZ^mDmO`Esg4e zIl6izR@1QAQ>W(>{M0OvQZw7*#v5|<*Y!}grdy}Q(nSm47N=Ui*1Yp|uC<{Ol~T2~ zY^lVkA;wF$!Q7EHwtr&qWUi?TRl6)=;WE|4J`G*_g3=x9>= zK4}UPRcaMkEEX$PI1WWP01Z}4GvB#nv67gmOBk(R`$bIQN#s#Kh|F z>oUU)_w*?u6%kWk1`;y+X;Hd$lOO=ToZ9|i^81FDNeM|04~+)tvfIzvjiBhLh2uFB zx3FEZKLNJ@p{=2zYG*E5`>Ht0SeXwBUE~{6)rv2kXyko6;j*|&ztnPe_8vB$Y0Y0K zn*bhEyOtv?$}~AO=wdz;vAB(^Emn8QHK5UG7@zaG2p^QD4wOj&B@Bii;8Or904R$6IYsdpCY_L{792MspB35%uKw9U>2 zmNqj_3)McjHCKT5Zo0pH72TxhxS#9dY@0QO>|*?6d_tUc40Q1@5x*iPR0CWw@u>h0Pw8KvC6U1A;eqNTVzbfQ+3*>XdoZ^pEK73`xfiamL)!*D!pS39!X zuQLRl{hiCMg=PUogJHkW2ufdM{jYzoDrC{j@(8JYsdvSO} zm%)o@3oDfKnpZfeZP-0_a2w<5MCxe$={h5YsMX`h2aGNpDCEukpg#o;JSA9!x)Vlj zG1wK|#)~gkcf3?^j_`ZD?8IB2+3JNGI46@`lfq-ZVA?>p@Q4}0^TbG`R7r5MnKTJ1 zq@@Lct_SZ5tTQ<`lGCgrRc7B(i*r?Jvb`QPI!`<3Vz@r_1w}Gf30Jq@wAY4R^H%>j zkz_WV=C8MMk5$)ujzS$%OQX)sH6T~(%=oz-{@^()ceK2%SW=x$8ac#hzDMuDc40AJ zttO@&Hkz{g9Q;T2YmyAyT&CLkU@CmTq04J3Jn`X^QA3T>`J=Wy{6z5uR+r>>L@W{C zKsX)3*V8Lr^$ug5C@l{Okdj5j`3_?q8v5%iLakxf7xeim+N9-Ft*4YP>Gi{1FDOEzNlWK*uJU`U)W{FYh-ro~+}O)>Fx2^O{Fy2Cj`yNt zJy!_2{q5D(aq3)Z4ffTq;b>bp#OaF}PbcVzh(L4L` z%Ubejf?fOhV!A!`deK#_zi!dvKm;$xkm}bE%#A(}`xjURJ_dLaE|7hCu!XAwH4K5`NB2MDE z$tle|Z8tfb&h1O#a^}@+wDhgg;dDnhd{SP@%DQ((XUpC|N(WZK#Ar&cz6a!pEjwXH z81n^TIOlB^)g4%BI*x%1sbgy7|A@jlWcd#zPrP0t+D&l?tubL>BmyZ(l~Z%Qt<{j) z`a4cToz7`_k6our1*xFOjk8v|yzybEz7pE|CW%WqA5iKZf;DYAeeZX)v`9d2t%j4G zuhvsLfNHrtXuX2JfEa~y_XcIFk%$(ywGvba2%W{ES2sNI2GbyIRxc{O)LaH%eq}O2 z10PL_@2WGAZ$&O2B}2jFB+#WR*EZFk@_a%N_Xuy=lX>MKTSOYEd{ug1jQL;SPElR0 z(pjy(VrmRZ+d2B+(gpbq1}rzYH^G3LgZsE;wAES6FxG!|{Rnh}%k@`(>2+|7+aXqg z?+?#Tq;#Ig60$jpmx%-{L{cKv>>s|z(}R#LZ=LQWKKmn2oTZknCnJ)fMs;SlXt9+! z1^}wK;Ht8MYg$;XBxZVg{scNr>qeqXwOuPaX`>jF1sei_Lg}1|ZT!go0~sw?6+lI- zcn22A?BeAwZy~9mLwz1vQ>uQ?7C^OGU6csb=Rcdozx&QMYp)R`= z%+d4qC>5vRE+zuj&!TY>Bv=(=mjjdN5krW3@iWd2)#yZk;(%m}U2OCIphW~ml_ki* z;6tXrxgsVDLM|;vjwl8m7d(jPIurw6RJ0)g4-;zuAgNe zDATE;K~PIr&{;{kW$K{~jueknt2JKUpDj_Jq5@aes6JGt9Ex_I_&U9ytLuLL8K#kA z17flL>_&F_8;cA8h@#SulEfMkXSQG-Yc*`-WpV^JmTF@Jn?&~ zIU2(_Z=JgqkQ(gY`iMifP@*vbP(Y9Godwg#6s;sX7*8d;;E5hHXMlu8n)Q;3kbnE}W&P!d zsKd5;9A+VH*To+8@>FiAk&+ByRIzqUts;(c?G|0dP+PvONaORIl|UZd;(9rE8TNBr z*IO(kB{&F_zK9g`t($ChdqT|LT~ju7>C(r5xp^bVoORK%Twzm zv4SxdtE$zJ&ZkP1Q7}oyQ*wtT!#0kg5JU#6gyu4;G!WP+u>@14DSp%`E3cAzbKZPe zYxTp4X1kuyAj?p8`+6Q++i# zw{Fs7id_vn?!Q8MDOGOJJ$6T5tnm073T!CVs+841gM=l+7Y*OsgpI3SPT}o9i#_^q7>P}~Yr!PLJW{^RCfR^vfi7)$ zIKPJKuV8%d-eCNw1PphpY1!8lSsq^`H2?tEG9KVLKfG<6x7={rvBP!8IuE&%ly1Xa zi#Db&Co9YNk>XNjTSs10G>Dv@aXes6op6|cUVy{nLA>Oy_jZcMe~j)Du*04Z88Hq* zOyLHa$NCa=oRUxe!qZ^VNIp{DkJQZjPh4U|k;{05?J0+iHiA@IM=1pgqh_2MK-YtK znFC5RS^a?eT*G9)Xo-Bg9f+qM&U0+8dXpl-;2FWi40?-&35L5q6SFXpCF@ zu0ja>`JdEI1_oH>CJwJhzj~YdS~X7%dpK8;qXyi$@`gSo#(`aec?xUc# z(ZjmknB$R`4VzMVqtqMDE9 zIgLQP7H4}2)RTYh#C-zh3h;&7DUerGz@S_*N`IA|hZANP1j}wO7ivEIi@dyO!1$y;V)EHiPfIx}pz_T!zdS z^$3aP!wce-<1;`bmlyGEZ9bJG=uDU=?Ay1?Ga8aYL{*VMq0?g6tIRcAcuCM$kym5G zVYMu%Wj9+dBhmH9?P{0*OyPi_YG^gK__ZZ2K9*t>UCPCze}IsRNQZY9@LNSEV@JBP zgqH(}H+T3dOTXOdG%;DPpJhqgENQ^w_k!=hqTz7^1x4vY*HkCDLw5zBO&1LwL?7@Os>L-e}a)rl>ZQ& zlkfK?Zj<5s@RymUsd&`u=&+KT@1KKI@mKF(uK^3lF@P9d&#}rs+x4h zp34ZT^C+o;0<{B1K9uWrl)1LOZr4OlKaC7U`t{nc#}YBPT>MU+fM_~=S)XZlWwMvt z1qq9Ygzf;cQgQUCe0e(JA3=A=KQ^gZ%A}w&%L>Nw%J7$m^7#ft&>P}>iudhMc}ym? zzc1ENPROc~6)hqG$3zXUcSu|g*K>DB8JV-o2fE&9``9);Ou!=+%hiU4bLz~n?ykv9 z7s^C_$E&#T0O?XRoDCq(aQ8HVdS z2T;&ELxcEOr}Z{3Ql$OcuH>8d{=OV4hFc_E5o5ALf3BG~;qDbdlM7>$q{K3KI(2Vs zol*MunPp8ftY~WZ+6G+bGF0LS87d}aN)j;4#}^oNLq1uN^;-w4Ph-xE`8N*A3r+98eiQvnQ#v%J=uRaUgI zux{T@%4n)Td!Tk?Uy#)bX7vDSe>U&_(wcx}AEA(VxQ(Vr`T3MBO2PV`dDv6Q*emnl z`p51Nh%~LA8mOVwyw0Z0LFJF4DGrlyHC&|Po`8b2nXkD(dC*Zc$)t?ATbV%t#t^Lq zOq|sDs#uQ3IFMP;-3&7ul_QymI8*T(G)6fBPf|5JjY&|VR-+|pxf8sgUq!+@7jUJ0<90GZ6|FX7 ztVBas2QZVf8OW=WzL^oj|8_PY&*XYBcds#Gk;+YJaX9(LG@7v?cgIv`rqik!{4_`r zg&F`P-JF@3d3gRlW7u#X44@Ia{e^(ziD=+R9(FU=0dd|dUObBQ*gi5Naorh9Od_L2<^&m*UX|3&lq#XQ~d=J z-f2&oPh)!88k!+@lXG%>q3JfQ1kSN*M1L}-x?rS9efB1sDxiNDX;3`s=!#AE|-0=42$#{ zEmy!#mGH~n5sp<3p<*a3n#9nf$4E>r!J}Xa0RfS6DlMNPla7dm1n!7BQ*ZU;RH5^I z5}r15Yq3J(qf8p}qEcYddyH&&cfzuB>d@aTql`%P&Jb#)^3!1PE52l#kD8NZq0%bz zHmpwHsLbrt-VAH`Le;Mj--skc@!xSXU?;qUp_Y%wl}H#$$WyXo+yNSrNF&!55m%#> zLthl6RyV&d^{IDRcg!drR1#f!1yM7&zkFW80)`xB&=$7}r4$zw39bVY+}|0Cu)QwB zLM>Jmq*BW}x(b^`??uKYD|_hEnMR8YL>Vz+$xB&{&IZ+qv_YK#oblUe-C{}1h9GkC zloH07M2Y!u9dImCBAHiszO_i>JE`HU3a?z` z#l8}YtauT*xWk#t-rZ!$XuL|f>R6nd`xcobb;C_)nf6LT=}bcEAIhLD53(4Nu7$Z- z&pAgyy>HNvIB%XEny$sb2UYAaD)+NEk!3;ka;Ic$eGT#PM#b<>hsBy#fV`&tKsyfEm? z`2q=|*uHmU^6D-(Hp*2Z{;bX^pyhXsAAB6fz9h2A@~gU?%$E-9Q$f`@fl|)cQ(#3+ zR7=FB(PXBxyGzTfI^_7rj)KIV3BjBdD7?#^sgj|*(h43%v-J~OxWslyO(jzq*=6SV zn|?AFm*N_aFqruoUX)s}CQHVsifWV^{#5**%Dapwh<<|~>e8nkeM@ngEGT3n?n>Df zLLlImDpgz!q&xz%KB$02zE`Qcohx=!SA?moz^ft}SrLUH8vn3}UBa78cyooXgjG!c z3{;5a6(N*iwyxCJEH^a>RWyz~MmBZ1r64CxrL3;Fz*as|DGLu^TlYd~a1?I%EFmt| z7)X4ERH|0$B|1yL;@L@l2`8=l)|V=-49I{Pt=LUKoMy*3t}6>4BsKVl;(;6!94}Cy zNC};p+;t4TP2G?k$0^iajXNB^@PNvS9do6e@1e#edAa5ls6j9IqvAGyhwWwlGuF8~ zpEr9i(e%~&J)(BQYAID)NLPHA^6gc=v@ttM76kcC~la8>s3R^^dRpZKovJ2aoF)A`3f{GYG?kH)@|%+Q;d!$(!%21f+o`b?-I z5!T2ev9rObqdnsgklXjrd@5bLS+gY4`iD`ry2#{+BBJAuFd>`2xGaBl-(vA%%YhgB z`v5s&W1GJ$5C!+*VSqTx^i%)YFL^@yJ92*1kPJJTr*bSc$nsS#AeQd z1R0v0txhuB&#XjN61S?o__b+qyxU($&4|D2S97I`1_01Hl?wlMo&CWZ+w0MQVsKoJ zzi5t!Vv#VvEOEg7%aYh7+W`T48E2X=x>RAMo@y!-jcq|l zJ{IWKAeF1BOu_A-hC3gQz_5q`w&Q1TY~gkf=Uy8l4;gZ1e0i$nmJb~(QA|n6jfPW4 zW%Daq=E3pnQLPX(QVq}>)@?%_E?3|tNe=)E55ro^)2ge4{p$v}FG%*fffmlVo%j{! zsJqt{`|5g!`T5ETdRZq`9yf&Y>$5PFr&RSKRvCr@ZU80Ko_D-5TH;iGx;$KbL;9EP zY#p?qUza}N*nzu8s?c~*!@|lXIu&23*$cEA7_VrThCS)=EbfiFDd@oq1%pj}>OF#O z>lGPmoTRuF8ENK3ozG`=t36geO}Iwe4fAQKCd!@43(O6m2WyhKyLa}hrIPQg*XefC9khwg#qcXrwpo5qDs65wQB5ayUQ=i&_Sl_52zWi8 zn?zDpp_E$hfg7(8*Yh)b{t`qKl?I017XTx9e8)?hkwM`ogpRROn-gA-%^QwL$MA=7^-g>PAkp;s38i|c$Crbu zP_YRt)ammyEOLC(QG{eTCF9Hf3e;eO-_Sd8stV0jG9s?0*;=W&$fIQolKGb(ClFzi zQ*Fz%B#cF&wDSl?{M-f08K}X5gl$fDv=J}2A6QAiJ`Pp%`m-&HzKjZ}Ur*sZ-`soQ zplPJDlmw)63FmuIU>{7a`+bJV!vPuVj|>v8Emb0Fs?q?1Hd`H^7+&u)uWqM$XI0!0 zRVcphOL73v&Y6)lXAJcB6)BvLy>Mdf(pf74vJ=QgCyXw!u(9LhSL)EyIGRwyHO`b#i?k{RvjU_rZ&ST zpp^!Y@|bB)>1@`6L<~o(FOqv#SXoJkB0yLnP|a<6@!v(ngQ=Q`C!!2hx92CjwKV z2jlJ$wYlEy(<~4PA7_vMY)07Q=6dt!{$jI)qy3}cjv<5f4MHpn+@(hy&i#h&7lNI~ zk8jeLMBQr|=`}<=AHXJ+sn=3`pk(qv8ZTd;Ijp#x2HR}S(#x8Ucf!8DKxR--VDP!K zq1l9p$RB^z_5?XPn4%EaX)MIiFNjmY{zoJ9i&i_C- z$jMI=SYXl&5ZVNs7EB1Hok52X_Q`E*kzGXh1#eagWfrMyhj4`D>Q#ychHaPNqXtmi zF775{YRR`qVn~LE_Y~Ap*>>XvZ0nTkpDic4cs)BgnCqZ=VP3l&oS!eh4U@R+t-}7M z2LJi_ab{V$VC08qCiCjc`KLR3!~W<~g(6oW2WwRG!SGI!=uj!43UWyB3hI8`N&d32 zpvX5%v1)-ag;E6(=E%nF7rCUJYMs)Domw~b?}pGDS(xuyqF#l3L$g%NHdOe>Bwhj% zfh_hgPeAg ze+SdQde+i@5+4w%rt3Fwr@v?}p+1<{2!MI(*I(5-uQmID2>)W|PtHatUv2n-bV@5Y zbdHUv%p9WkS^I&X^iIs*|9a9Y@%s3%{A!i14KyI4vK0|Ipk!m&M57EP^j}-A0#fp2ijdk0d?=f8+JUa=$X738 zm9>ToyzLC2Y;t-+1q}zaF3$#dBkxb54RF2sQj$IR_V;0mN0Qol9LU+S+R-Q`AJUkq zgFmQo>f$$IU?Xd8XZ|QZ#IDZb-Tza&^Ph-i48lV-7Q}sorOx!p33*LH2Xl{w?~!i? ztz%VWYu(wz=xCO?{Y_hpIou)l5SgjQ8VGM#jnJ1O!DV|_8F_u}>9~D3+MUyMp#PjO z(R^4IrkIuTXrfj@3*qiOu;cAnJeII*b+h?6D~jP|BLYKf&Q=Azq7f-2SR8eCJzSOl zU~0f9+CGa#Fv-l#V2Lbfp*o=UQ8TqE)XF!k`AjoL zBlNcEtpB3Z5K$idNDUw^-kKZXnyHYn^0-xm6Aoh;iZQTf@aUW)a+)lzOQS{#Mx+lw(@Rx7D5w{Rtis%na^uM+MLgV3fz;XQoe&g5H-@*?_eyZ-qmi_7z%di!V(f(vy@C*}rv+(N3v)DMlQi7=#gS{JmI~p> z-NuUBO9!~-2~;_gYs%O3uXDLef>>j9Bhx)uN0S)~Nt_1TnlM?-9SKDJin<*P>r3Hs zS`C3C?GV})f{$a!@^hvfx8Rcc=NS(q_E{{((;$g0PNcvS*`a=w`th2wh<558-+3Qh zwpBz-1$;YoSUP^O<&ct^ng|JI&5F<<{qDbm2;Q&k7O0ploMMM>2+(Coa41v=AgNN6 zu+c&qWt1g9huRo&ssos|fo38K0?5+3*@3tfE!+J(E5kDbAw@+>?d{i)#08qXkLwI@ z^_Eh`^S-gUF70Z_%A-yuq15QsJ2-n~T<&5<0swJshz4Q_nJGbjV^Y>(N+ReeoPHh8 z;#3$n)mG%xYqTANLhL{Zfbh4x0RXW`lzSVDX*+zRTy7P$S=m-h3S8D++=6EP+6zOl ztx5Ko-5g_~cDlM>!C1ihc~Wdvny*Xjacg5@B$sR&P%L;*h2C((X}5KoLXK|%D7g5< zZxzZF7k45&U~UldDLDnJm!%{D_gW13s;9XjM9PtXmRH73Dgz-@#Sk`bL8~l8N-nK` zJp|=K0h+PjaS$IfNvZjXKq7^BfD}79rbUTur;Z~%@`t#GAtlbfe<0U%BQRk*A4I-Z zhC`u=fwOif7&wR;)A~e?z$s;L_43(PB2ux$T&kxaGd*HI$Xh%{`e49Z)Fl-IePvv` z3~(*kswh>^uLJW%aRs-8h>=t|`s)&2@{u7eJk!NFOf!b>?MC| zON3yoUicRN2=z2rPD{@KGYe3pP!d?~S0T_gL~!X^PjY3Z9O=Jr3@5?!oxmj$O8l&G zjFgZUQn2_L%VnNU%FjyDci}|2M~kNn6EZvli2-P+IpB+0_Vep@#CXf$nn=P$BlV{^ zI}7m^p;omCm5aa`gy;Oo=|{FQ{v*|HaJn(ZIu zB6OqM-j?K368l~q-DfWC6~J93V

UPtEc(6f_EOWCf#lWl%m9 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

{ui$% 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 Date: Tue, 23 Feb 2021 14:55:42 -0800 Subject: [PATCH 20/45] [Security Solution][Exceptions] - Update exceptions modal to use existing lists plugin useApi hook (#92348) Doing a quick refactor to help with #90634 . While working on #90634 found that I would introduce a circular dependency if I didn't refactor the hook used by the exception builder component to make use of the existing useApi hook in the lists plugin. #90634 adds temporary ids to item entries to mitigate some React key requirements and the logic to remove/add these id's isn't at the boundary but in the hooks (so as not to pollute the data for everyone wanting to use the api. An upside is that it removed some of the looping and seemed to speed things up a bit. I briefly considered adding the bulk SO endpoints for exception items, but they are still experimental. --- .../public/exceptions/hooks/use_api.test.ts | 63 +++++++++++++++- .../lists/public/exceptions/hooks/use_api.ts | 39 +++++++++- .../exceptions/use_add_exception.tsx | 74 ++++++++----------- 3 files changed, 129 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts b/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts index 0fec2ab23994b..e61e74ca33236 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_api.test.ts @@ -7,13 +7,20 @@ import { act, renderHook } from '@testing-library/react-hooks'; +import { getUpdateExceptionListItemSchemaMock } from '../../../common/schemas/request/update_exception_list_item_schema.mock'; import { coreMock } from '../../../../../../src/core/public/mocks'; import * as api from '../api'; import { getExceptionListSchemaMock } from '../../../common/schemas/response/exception_list_schema.mock'; import { getFoundExceptionListItemSchemaMock } from '../../../common/schemas/response/found_exception_list_item_schema.mock'; import { getExceptionListItemSchemaMock } from '../../../common/schemas/response/exception_list_item_schema.mock'; +import { getCreateExceptionListItemSchemaMock } from '../../../common/schemas/request/create_exception_list_item_schema.mock'; import { HttpStart } from '../../../../../../src/core/public'; -import { ApiCallByIdProps, ApiCallByListIdProps } from '../types'; +import { + AddExceptionListItemProps, + ApiCallByIdProps, + ApiCallByListIdProps, + UpdateExceptionListItemProps, +} from '../types'; import { ExceptionsApi, useApi } from './use_api'; @@ -366,4 +373,58 @@ describe('useApi', () => { expect(onErrorMock).toHaveBeenCalledWith(mockError); }); }); + + test('it invokes "addExceptionListItem" when "addExceptionListItem" used', async () => { + const payload = getExceptionListItemSchemaMock(); + const itemToCreate = getCreateExceptionListItemSchemaMock(); + const spyOnFetchExceptionListItemById = jest + .spyOn(api, 'addExceptionListItem') + .mockResolvedValue(payload); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useApi(mockKibanaHttpService) + ); + await waitForNextUpdate(); + + await result.current.addExceptionListItem({ + listItem: itemToCreate, + }); + + const expected: AddExceptionListItemProps = { + http: mockKibanaHttpService, + listItem: itemToCreate, + signal: new AbortController().signal, + }; + + expect(spyOnFetchExceptionListItemById).toHaveBeenCalledWith(expected); + }); + }); + + test('it invokes "updateExceptionListItem" when "getExceptionItem" used', async () => { + const payload = getExceptionListItemSchemaMock(); + const itemToUpdate = getUpdateExceptionListItemSchemaMock(); + const spyOnUpdateExceptionListItem = jest + .spyOn(api, 'updateExceptionListItem') + .mockResolvedValue(payload); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useApi(mockKibanaHttpService) + ); + await waitForNextUpdate(); + + await result.current.updateExceptionListItem({ + listItem: itemToUpdate, + }); + + const expected: UpdateExceptionListItemProps = { + http: mockKibanaHttpService, + listItem: itemToUpdate, + signal: new AbortController().signal, + }; + + expect(spyOnUpdateExceptionListItem).toHaveBeenCalledWith(expected); + }); + }); }); diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_api.ts b/x-pack/plugins/lists/public/exceptions/hooks/use_api.ts index 91050c5fff795..b0c831ef3b857 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_api.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_api.ts @@ -9,11 +9,22 @@ import { useMemo } from 'react'; import * as Api from '../api'; import { HttpStart } from '../../../../../../src/core/public'; -import { ExceptionListItemSchema, ExceptionListSchema } from '../../../common/schemas'; +import { + CreateExceptionListItemSchema, + ExceptionListItemSchema, + ExceptionListSchema, + UpdateExceptionListItemSchema, +} from '../../../common/schemas'; import { ApiCallFindListsItemsMemoProps, ApiCallMemoProps, ApiListExportProps } from '../types'; import { getIdsAndNamespaces } from '../utils'; export interface ExceptionsApi { + addExceptionListItem: (arg: { + listItem: CreateExceptionListItemSchema; + }) => Promise; + updateExceptionListItem: (arg: { + listItem: UpdateExceptionListItemSchema; + }) => Promise; deleteExceptionItem: (arg: ApiCallMemoProps) => Promise; deleteExceptionList: (arg: ApiCallMemoProps) => Promise; getExceptionItem: ( @@ -29,6 +40,19 @@ export interface ExceptionsApi { export const useApi = (http: HttpStart): ExceptionsApi => { return useMemo( (): ExceptionsApi => ({ + async addExceptionListItem({ + listItem, + }: { + listItem: CreateExceptionListItemSchema; + }): Promise { + const abortCtrl = new AbortController(); + + return Api.addExceptionListItem({ + http, + listItem, + signal: abortCtrl.signal, + }); + }, async deleteExceptionItem({ id, namespaceType, @@ -184,6 +208,19 @@ export const useApi = (http: HttpStart): ExceptionsApi => { onError(error); } }, + async updateExceptionListItem({ + listItem, + }: { + listItem: UpdateExceptionListItemSchema; + }): Promise { + const abortCtrl = new AbortController(); + + return Api.updateExceptionListItem({ + http, + listItem, + signal: abortCtrl.signal, + }); + }, }), [http] ); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/use_add_exception.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/use_add_exception.tsx index a8e6c72e3e165..614f5301c82e2 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/use_add_exception.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/use_add_exception.tsx @@ -10,11 +10,9 @@ import { UpdateDocumentByQueryResponse } from 'elasticsearch'; import { HttpStart } from '../../../../../../../src/core/public'; import { - addExceptionListItem, - updateExceptionListItem, ExceptionListItemSchema, CreateExceptionListItemSchema, - UpdateExceptionListItemSchema, + useApi, } from '../../../lists_plugin_deps'; import { updateAlertStatus } from '../../../detections/containers/detection_engine/alerts/api'; import { getUpdateAlertsQuery } from '../../../detections/components/alerts_table/actions'; @@ -25,6 +23,7 @@ import { import { getQueryFilter } from '../../../../common/detection_engine/get_query_filter'; import { Index } from '../../../../common/detection_engine/schemas/common/schemas'; import { formatExceptionItemForUpdate, prepareExceptionItemsForBulkClose } from './helpers'; +import { useKibana } from '../../lib/kibana'; /** * Adds exception items to the list. Also optionally closes alerts. @@ -66,11 +65,13 @@ export const useAddOrUpdateException = ({ onError, onSuccess, }: UseAddOrUpdateExceptionProps): ReturnUseAddOrUpdateException => { + const { services } = useKibana(); const [isLoading, setIsLoading] = useState(false); const addOrUpdateExceptionRef = useRef(null); + const { addExceptionListItem, updateExceptionListItem } = useApi(services.http); const addOrUpdateException = useCallback( async (ruleId, exceptionItemsToAddOrUpdate, alertIdToClose, bulkCloseIndex) => { - if (addOrUpdateExceptionRef.current !== null) { + if (addOrUpdateExceptionRef.current != null) { addOrUpdateExceptionRef.current( ruleId, exceptionItemsToAddOrUpdate, @@ -86,49 +87,33 @@ export const useAddOrUpdateException = ({ let isSubscribed = true; const abortCtrl = new AbortController(); - const addOrUpdateItems = async ( - exceptionItemsToAddOrUpdate: Array - ): Promise => { - const toAdd: CreateExceptionListItemSchema[] = []; - const toUpdate: UpdateExceptionListItemSchema[] = []; - exceptionItemsToAddOrUpdate.forEach( - (item: ExceptionListItemSchema | CreateExceptionListItemSchema) => { - if ('id' in item && item.id !== undefined) { - toUpdate.push(formatExceptionItemForUpdate(item)); - } else { - toAdd.push(item); - } - } - ); - - const promises: Array> = []; - toAdd.forEach((item: CreateExceptionListItemSchema) => { - promises.push( - addExceptionListItem({ - http, - listItem: item, - signal: abortCtrl.signal, - }) - ); - }); - toUpdate.forEach((item: UpdateExceptionListItemSchema) => { - promises.push( - updateExceptionListItem({ - http, - listItem: item, - signal: abortCtrl.signal, - }) - ); - }); - await Promise.all(promises); - }; - - const addOrUpdateExceptionItems: AddOrUpdateExceptionItemsFunc = async ( + const onUpdateExceptionItemsAndAlertStatus: AddOrUpdateExceptionItemsFunc = async ( ruleId, exceptionItemsToAddOrUpdate, alertIdToClose, bulkCloseIndex ) => { + const addOrUpdateItems = async ( + exceptionListItems: Array + ): Promise => { + await Promise.all( + exceptionListItems.map( + (item: ExceptionListItemSchema | CreateExceptionListItemSchema) => { + if ('id' in item && item.id != null) { + const formattedExceptionItem = formatExceptionItemForUpdate(item); + return updateExceptionListItem({ + listItem: formattedExceptionItem, + }); + } else { + return addExceptionListItem({ + listItem: item, + }); + } + } + ) + ); + }; + try { setIsLoading(true); let alertIdResponse: UpdateDocumentByQueryResponse | undefined; @@ -170,7 +155,6 @@ export const useAddOrUpdateException = ({ const updated = (alertIdResponse?.updated ?? 0) + (bulkResponse?.updated ?? 0); const conflicts = alertIdResponse?.version_conflicts ?? 0 + (bulkResponse?.version_conflicts ?? 0); - if (isSubscribed) { setIsLoading(false); onSuccess(updated, conflicts); @@ -187,12 +171,12 @@ export const useAddOrUpdateException = ({ } }; - addOrUpdateExceptionRef.current = addOrUpdateExceptionItems; + addOrUpdateExceptionRef.current = onUpdateExceptionItemsAndAlertStatus; return (): void => { isSubscribed = false; abortCtrl.abort(); }; - }, [http, onSuccess, onError]); + }, [http, onSuccess, onError, updateExceptionListItem, addExceptionListItem]); return [{ isLoading }, addOrUpdateException]; }; From 561a26787690bfdece6c0309f6ba68bdab30b0bb Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 23 Feb 2021 15:12:22 -0800 Subject: [PATCH 21/45] [Alerts][Docs] Alert types doc update. Added refs to applications specific alerts groups. (#91787) * [Alerts][Docs] Alert types doc update. Added refs to applications specific alerts groups. * fixed ci * fixed ci * fixed ci * fixed ci * fixed alignment of pages * fixed addtional links * fixed titles * Apply suggestions from code review Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update docs/management/alerting/alert-management.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * renamed titles * moved maps to own folder * renamed titles * removed mistake file Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- .../alerting/alert-management.asciidoc | 2 +- docs/user/alerting/action-types.asciidoc | 2 +- docs/user/alerting/alert-types.asciidoc | 164 +++--------------- .../alerting-getting-started.asciidoc | 2 +- docs/user/alerting/index.asciidoc | 1 - .../geo-alert-types.asciidoc | 16 +- .../alerting/stack-alerts/es-query.asciidoc | 45 +++++ .../stack-alerts/index-threshold.asciidoc | 101 +++++++++++ 8 files changed, 177 insertions(+), 156 deletions(-) rename docs/user/alerting/{ => maps-alerts}/geo-alert-types.asciidoc (87%) create mode 100644 docs/user/alerting/stack-alerts/es-query.asciidoc create mode 100644 docs/user/alerting/stack-alerts/index-threshold.asciidoc diff --git a/docs/management/alerting/alert-management.asciidoc b/docs/management/alerting/alert-management.asciidoc index b4a5c3bc1931f..4fd1d8a7182db 100644 --- a/docs/management/alerting/alert-management.asciidoc +++ b/docs/management/alerting/alert-management.asciidoc @@ -3,7 +3,7 @@ === Managing Alerts -The *Alerts* tab provides a cross-app view of alerting. Different {kib} apps like <>, <>, <>, and <> can offer their own alerts, and the *Alerts* tab provides a central place to: +The *Alerts* tab provides a cross-app view of alerting. Different {kib} apps like {observability-guide}/create-alerts.html[*Observability*], {security-guide}/prebuilt-rules.html[*Security*], <> and <> can offer their own alerts. The *Alerts* tab provides a central place to: * <> alerts * <> including enabling/disabling, muting/unmuting, and deleting diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc index 599cce3a03cd9..586feeb032cb4 100644 --- a/docs/user/alerting/action-types.asciidoc +++ b/docs/user/alerting/action-types.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[action-types]] -== Action and connector types +== Actions and connectors Actions are Kibana services or integrations with third-party systems that run as background tasks on the Kibana server when alert conditions are met. {kib} provides the following types of actions: diff --git a/docs/user/alerting/alert-types.asciidoc b/docs/user/alerting/alert-types.asciidoc index 0877f067eee21..993d815c37f71 100644 --- a/docs/user/alerting/alert-types.asciidoc +++ b/docs/user/alerting/alert-types.asciidoc @@ -1,159 +1,35 @@ [role="xpack"] [[alert-types]] -== Standard stack alert types +== Alerts -{kib} supplies alert types in two ways: some are built into {kib} (these are known as stack alerts), while domain-specific alert types are registered by {kib} apps such as <>, <>, <>, and <>. +Kibana provides two types of alerts: -This section covers stack alerts. For domain-specific alert types, refer to the documentation for that app. -Users will need `all` access to the *Stack Alerts* feature to be able to create and edit any of the alerts listed below. -See <> for more information on configuring roles that provide access to this feature. - -Currently {kib} provides two stack alerts: <> and <>. - -[float] -[[alert-type-index-threshold]] -=== Index threshold - -The index threshold alert type is designed to run an {es} query over indices, aggregating field values from documents, comparing them to threshold values, and scheduling actions to run when the thresholds are met. - -[float] -==== Creating the alert - -An index threshold alert can be created from the *Create* button in the <>. Fill in the <>, then select *Index Threshold*. - -[role="screenshot"] -image::images/alert-types-index-threshold-select.png[Choosing an index threshold alert type] - -[float] -==== Defining the conditions - -The index threshold has 5 clauses that define the condition to detect. - -[role="screenshot"] -image::images/alert-types-index-threshold-conditions.png[Five clauses define the condition to detect] - -Index:: This clause requires an *index or index pattern* and a *time field* that will be used for the *time window*. -When:: This clause specifies how the value to be compared to the threshold is calculated. The value is calculated by aggregating a numeric field a the *time window*. The aggregation options are: `count`, `average`, `sum`, `min`, and `max`. When using `count` the document count is used, and an aggregation field is not necessary. -Over/Grouped Over:: This clause lets you configure whether the aggregation is applied over all documents, or should be split into groups using a grouping field. If grouping is used, an <> will be created for each group when it exceeds the threshold. To limit the number of instances on high cardinality fields, you must specify the number of groups to check against the threshold. Only the *top* groups are checked. -Threshold:: This clause defines a threshold value and a comparison operator (one of `is above`, `is above or equals`, `is below`, `is below or equals`, or `is between`). The result of the aggregation is compared to this threshold. -Time window:: This clause determines how far back to search for documents, using the *time field* set in the *index* clause. Generally this value should be to a value higher than the *check every* value in the <>, to avoid gaps in detection. - -If data is available and all clauses have been defined, a preview chart will render the threshold value and display a line chart showing the value for the last 30 intervals. This can provide an indication of recent values and their proximity to the threshold, and help you tune the clauses. - -[role="screenshot"] -image::images/alert-types-index-threshold-preview.png[Five clauses define the condition to detect] - -[float] -=== Example - -In this section, you will use the {kib} <> to setup and tune the conditions on an index threshold alert. For this example, we want to detect when any of our top three sites have served more than 420,000 bytes over a 24 hour period. - -From the <>, create a new alert, and fill in the <>. This alert will be checked every 4 hours, and will not execute actions more than once per day. Choose the index threshold alert type. - -[role="screenshot"] -image::images/alert-types-index-threshold-select.png[Choosing an index threshold alert type] - -Click on each clause to open a control that helps you set the value: - -[float] -==== Index clause -The index clause control will list and allow you to search for available indices. Choose *kibana_sample_data_logs* - -[role="screenshot"] -image::images/alert-types-index-threshold-example-index.png[Choosing an index] - -Once an index is selected, the list of time fields for that index will be available to select. Choose *@timestamp*. - -[role="screenshot"] -image::images/alert-types-index-threshold-example-timefield.png[Choosing a time field] - -[float] -==== When clause - -We want to detect the number of bytes served during the time window, so we select `sum` as the aggregation, and `bytes` as the field to aggregate. - -[role="screenshot"] -image::images/alert-types-index-threshold-example-aggregation.png[Choosing the aggregation] - -[float] -==== Over/Grouped over clause - -We want to alert on the three sites that have the most traffic, so we'll group the sum of bytes by the `host.keyword` field and take the top 3 values. - -[role="screenshot"] -image::images/alert-types-index-threshold-example-grouping.png[Choosing the groups] - -[float] -==== Threshold clause - -We want to alert when any site exceeds 420,000 bytes over a 24 hour period, so we'll set the threshold to 420,000 and use the `is above` comparison. - -[role="screenshot"] -image::images/alert-types-index-threshold-example-threshold.png[Setting the threshold] - -[float] -==== Time window clause - -Finally, set the time window to 24 hours to complete the alert configuration. - -[role="screenshot"] -image::images/alert-types-index-threshold-example-window.png[Setting the time window] - -The preview chart will render showing the 24 hour sum of bytes at 4 hours intervals (the *check every* interval) for the past 120 hours (the last 30 intervals). - -[role="screenshot"] -image::images/alert-types-index-threshold-example-preview.png[Setting the time window] - -[float] -==== Comparing time windows - -You can interactively change the time window and observe the effect it has on the chart. Compare a 24 window to a 12 hour window. Notice the variability in the sum of bytes, due to different traffic levels during the day compared to at night. This variability would result in noisy alerts, so the 24 hour window is better. The preview chart can help you find the right values for your alert. - -[role="screenshot"] -image::images/alert-types-index-threshold-example-comparison.png[Comparing two time windows] - -[float] -[[alert-type-es-query]] -=== ES query - -The ES query alert type is designed to run a user-configured {es} query over indices, compare the number of matches to a configured threshold, and schedule -actions to run when the threshold condition is met. +* Stack alerts, which are built into {kib} +* Domain-specific alerts, which are registered by {kib} apps. [float] -==== Creating the alert +==== Standard stack alerts -An ES query alert can be created from the *Create* button in the <>. Fill in the <>, then select *ES query*. +Users require the `all` privilege to access to the *Stack Alerts* feature and create and edit alerts. . +See <> for more information. -[role="screenshot"] -image::images/alert-types-es-query-select.png[Choosing an ES query alert type] - -[float] -==== Defining the conditions +{kib} provides two stack alerts: -The ES query alert has 5 clauses that define the condition to detect. +* <> +* <> -[role="screenshot"] -image::images/alert-types-es-query-conditions.png[Four clauses define the condition to detect] - -Index:: This clause requires an *index or index pattern* and a *time field* that will be used for the *time window*. -Size:: This clause specifies the number of documents to pass to the configured actions when the the threshold condition is met. -ES query:: This clause specifies the ES DSL query to execute. The number of documents that match this query will be evaulated against the threshold -condition. Aggregations are not supported at this time. -Threshold:: This clause defines a threshold value and a comparison operator (`is above`, `is above or equals`, `is below`, `is below or equals`, or `is between`). The number of documents that match the specified query is compared to this threshold. -Time window:: This clause determines how far back to search for documents, using the *time field* set in the *index* clause. Generally this value should be set to a value higher than the *check every* value in the <>, to avoid gaps in detection. [float] -==== Testing your query - -Use the *Test query* feature to verify that your query DSL is valid. - -When your query is valid:: Valid queries will be executed against the configured *index* using the configured *time window*. The number of documents that -match the query will be displayed. +==== Domain-specific alerts -[role="screenshot"] -image::images/alert-types-es-query-valid.png[Test ES query returns number of matches when valid] +For domain-specific alerts, refer to the documentation for that app. +{kib} supports these alerts: -When your query is invalid:: An error message is shown if the query is invalid. +* {observability-guide}/create-alerts.html[Observability alerts] +* {security-guide}/prebuilt-rules.html[Security alerts] +* <> +* <> -[role="screenshot"] -image::images/alert-types-es-query-invalid.png[Test ES query shows error when invalid] \ No newline at end of file +include::stack-alerts/index-threshold.asciidoc[] +include::stack-alerts/es-query.asciidoc[] +include::maps-alerts/geo-alert-types.asciidoc[] diff --git a/docs/user/alerting/alerting-getting-started.asciidoc b/docs/user/alerting/alerting-getting-started.asciidoc index 9b402e6cb9c49..0a7c17576de3d 100644 --- a/docs/user/alerting/alerting-getting-started.asciidoc +++ b/docs/user/alerting/alerting-getting-started.asciidoc @@ -5,7 +5,7 @@ -- -Alerting allows you to detect complex conditions within different {kib} apps and trigger actions when those conditions are met. Alerting is integrated with <>, <>, <>, <>, can be centrally managed from the <> UI, and provides a set of built-in <> and <> (known as stack alerts) for you to use. +Alerting allows you to detect complex conditions within different {kib} apps and trigger actions when those conditions are met. Alerting is integrated with {observability-guide}/create-alerts.html[*Observability*], {security-guide}/prebuilt-rules.html[*Security*], <> and <>, can be centrally managed from the <> UI, and provides a set of built-in <> and <> (known as stack alerts) for you to use. image::images/alerting-overview.png[Alerts and actions UI] diff --git a/docs/user/alerting/index.asciidoc b/docs/user/alerting/index.asciidoc index 25e87801f84af..caef0c6e7332d 100644 --- a/docs/user/alerting/index.asciidoc +++ b/docs/user/alerting/index.asciidoc @@ -2,5 +2,4 @@ include::alerting-getting-started.asciidoc[] include::defining-alerts.asciidoc[] include::action-types.asciidoc[] include::alert-types.asciidoc[] -include::geo-alert-types.asciidoc[] include::alerting-production-considerations.asciidoc[] diff --git a/docs/user/alerting/geo-alert-types.asciidoc b/docs/user/alerting/maps-alerts/geo-alert-types.asciidoc similarity index 87% rename from docs/user/alerting/geo-alert-types.asciidoc rename to docs/user/alerting/maps-alerts/geo-alert-types.asciidoc index d9073ecca1145..f899cd0204b9a 100644 --- a/docs/user/alerting/geo-alert-types.asciidoc +++ b/docs/user/alerting/maps-alerts/geo-alert-types.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[geo-alerting]] -== Geo alerting +=== Geo alerting Alerting now includes one additional stack alert: <>. @@ -9,7 +9,7 @@ to be able to create and edit a geo alert. See <> for more information on configuring roles that provide access to this feature. [float] -=== Geo alerting requirements +==== Geo alerting requirements To create a *Tracking containment* alert, the following requirements must be present: - *Tracks index or index pattern*: An index containing a `geo_point` field, `date` field, @@ -29,27 +29,27 @@ than the current time minus the amount of the interval. If data older than `now - ` is ingested, it won't trigger an alert. [float] -=== Creating a geo alert +==== Creating a geo alert Click the *Create* button in the <>. Complete the <>. [role="screenshot"] -image::images/alert-types-tracking-select.png[Choosing a tracking alert type] +image::user/alerting/images/alert-types-tracking-select.png[Choosing a tracking alert type] [float] [[alert-type-tracking-containment]] -=== Tracking containment +==== Tracking containment The Tracking containment alert type runs an {es} query over indices, determining if any documents are currently contained within any boundaries from the specified boundary index. In the event that an entity is contained within a boundary, an alert may be generated. [float] -==== Defining the conditions +===== Defining the conditions Tracking containment alerts have 3 clauses that define the condition to detect, as well as 2 Kuery bars used to provide additional filtering context for each of the indices. [role="screenshot"] -image::images/alert-types-tracking-containment-conditions.png[Five clauses define the condition to detect] +image::user/alerting/images/alert-types-tracking-containment-conditions.png[Five clauses define the condition to detect] Index (entity):: This clause requires an *index or index pattern*, a *time field* that will be used for the *time window*, and a *`geo_point` field* for tracking. When entity:: This clause specifies which crossing option to track. The values @@ -66,4 +66,4 @@ An alert can be triggered either when a containment condition is met or when an is no longer contained. [role="screenshot"] -image::images/alert-types-tracking-containment-action-options.png[Five clauses define the condition to detect] +image::user/alerting/images/alert-types-tracking-containment-action-options.png[Five clauses define the condition to detect] diff --git a/docs/user/alerting/stack-alerts/es-query.asciidoc b/docs/user/alerting/stack-alerts/es-query.asciidoc new file mode 100644 index 0000000000000..772178c9552da --- /dev/null +++ b/docs/user/alerting/stack-alerts/es-query.asciidoc @@ -0,0 +1,45 @@ +[role="xpack"] +[[alert-type-es-query]] +=== ES query + +The ES query alert type is designed to run a user-configured {es} query over indices, compare the number of matches to a configured threshold, and schedule +actions to run when the threshold condition is met. + +[float] +==== Creating the alert + +An ES query alert can be created from the *Create* button in the <>. Fill in the <>, then select *ES query*. + +[role="screenshot"] +image::user/alerting/images/alert-types-es-query-select.png[Choosing an ES query alert type] + +[float] +==== Defining the conditions + +The ES query alert has 5 clauses that define the condition to detect. + +[role="screenshot"] +image::user/alerting/images/alert-types-es-query-conditions.png[Four clauses define the condition to detect] + +Index:: This clause requires an *index or index pattern* and a *time field* that will be used for the *time window*. +Size:: This clause specifies the number of documents to pass to the configured actions when the the threshold condition is met. +ES query:: This clause specifies the ES DSL query to execute. The number of documents that match this query will be evaulated against the threshold +condition. Aggregations are not supported at this time. +Threshold:: This clause defines a threshold value and a comparison operator (`is above`, `is above or equals`, `is below`, `is below or equals`, or `is between`). The number of documents that match the specified query is compared to this threshold. +Time window:: This clause determines how far back to search for documents, using the *time field* set in the *index* clause. Generally this value should be set to a value higher than the *check every* value in the <>, to avoid gaps in detection. + +[float] +==== Testing your query + +Use the *Test query* feature to verify that your query DSL is valid. + +When your query is valid:: Valid queries will be executed against the configured *index* using the configured *time window*. The number of documents that +match the query will be displayed. + +[role="screenshot"] +image::user/alerting/images/alert-types-es-query-valid.png[Test ES query returns number of matches when valid] + +When your query is invalid:: An error message is shown if the query is invalid. + +[role="screenshot"] +image::user/alerting/images/alert-types-es-query-invalid.png[Test ES query shows error when invalid] \ No newline at end of file diff --git a/docs/user/alerting/stack-alerts/index-threshold.asciidoc b/docs/user/alerting/stack-alerts/index-threshold.asciidoc new file mode 100644 index 0000000000000..424320aea3adc --- /dev/null +++ b/docs/user/alerting/stack-alerts/index-threshold.asciidoc @@ -0,0 +1,101 @@ +[role="xpack"] +[[alert-type-index-threshold]] +=== Index threshold + +The index threshold alert type is designed to run an {es} query over indices, aggregating field values from documents, comparing them to threshold values, and scheduling actions to run when the thresholds are met. + +[float] +==== Creating the alert + +An index threshold alert can be created from the *Create* button in the <>. Fill in the <>, then select *Index Threshold*. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-select.png[Choosing an index threshold alert type] + +[float] +==== Defining the conditions + +The index threshold has 5 clauses that define the condition to detect. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-conditions.png[Five clauses define the condition to detect] + +Index:: This clause requires an *index or index pattern* and a *time field* that will be used for the *time window*. +When:: This clause specifies how the value to be compared to the threshold is calculated. The value is calculated by aggregating a numeric field a the *time window*. The aggregation options are: `count`, `average`, `sum`, `min`, and `max`. When using `count` the document count is used, and an aggregation field is not necessary. +Over/Grouped Over:: This clause lets you configure whether the aggregation is applied over all documents, or should be split into groups using a grouping field. If grouping is used, an <> will be created for each group when it exceeds the threshold. To limit the number of instances on high cardinality fields, you must specify the number of groups to check against the threshold. Only the *top* groups are checked. +Threshold:: This clause defines a threshold value and a comparison operator (one of `is above`, `is above or equals`, `is below`, `is below or equals`, or `is between`). The result of the aggregation is compared to this threshold. +Time window:: This clause determines how far back to search for documents, using the *time field* set in the *index* clause. Generally this value should be to a value higher than the *check every* value in the <>, to avoid gaps in detection. + +If data is available and all clauses have been defined, a preview chart will render the threshold value and display a line chart showing the value for the last 30 intervals. This can provide an indication of recent values and their proximity to the threshold, and help you tune the clauses. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-preview.png[Five clauses define the condition to detect] + +[float] +==== Example + +In this section, you will use the {kib} <> to setup and tune the conditions on an index threshold alert. For this example, we want to detect when any of our top three sites have served more than 420,000 bytes over a 24 hour period. + +From the <>, create a new alert, and fill in the <>. This alert will be checked every 4 hours, and will not execute actions more than once per day. Choose the index threshold alert type. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-select.png[Choosing an index threshold alert type] + +Click on each clause to open a control that helps you set the value: + +[float] +==== Index clause +The index clause control will list and allow you to search for available indices. Choose *kibana_sample_data_logs* + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-index.png[Choosing an index] + +Once an index is selected, the list of time fields for that index will be available to select. Choose *@timestamp*. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-timefield.png[Choosing a time field] + +[float] +==== When clause + +We want to detect the number of bytes served during the time window, so we select `sum` as the aggregation, and `bytes` as the field to aggregate. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-aggregation.png[Choosing the aggregation] + +[float] +==== Over/Grouped over clause + +We want to alert on the three sites that have the most traffic, so we'll group the sum of bytes by the `host.keyword` field and take the top 3 values. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-grouping.png[Choosing the groups] + +[float] +==== Threshold clause + +We want to alert when any site exceeds 420,000 bytes over a 24 hour period, so we'll set the threshold to 420,000 and use the `is above` comparison. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-threshold.png[Setting the threshold] + +[float] +==== Time window clause + +Finally, set the time window to 24 hours to complete the alert configuration. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-window.png[Setting the time window] + +The preview chart will render showing the 24 hour sum of bytes at 4 hours intervals (the *check every* interval) for the past 120 hours (the last 30 intervals). + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-preview.png[Setting the time window] + +[float] +==== Comparing time windows + +You can interactively change the time window and observe the effect it has on the chart. Compare a 24 window to a 12 hour window. Notice the variability in the sum of bytes, due to different traffic levels during the day compared to at night. This variability would result in noisy alerts, so the 24 hour window is better. The preview chart can help you find the right values for your alert. + +[role="screenshot"] +image::user/alerting/images/alert-types-index-threshold-example-comparison.png[Comparing two time windows] \ No newline at end of file From 4619f02189b5b1ac6dd16f40d9756077e5a0911a Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Tue, 23 Feb 2021 17:47:20 -0600 Subject: [PATCH 22/45] [Enterprise Search] Change icon for error in EuiCallouts (#92527) --- .../applications/shared/flash_messages/flash_messages.tsx | 2 +- .../shared/indexing_status/indexing_status_errors.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx index 60d80487a2593..ef1a4a2d0be86 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx @@ -17,7 +17,7 @@ const FLASH_MESSAGE_TYPES = { success: { color: 'success' as EuiCallOutProps['color'], icon: 'check' }, info: { color: 'primary' as EuiCallOutProps['color'], icon: 'iInCircle' }, warning: { color: 'warning' as EuiCallOutProps['color'], icon: 'alert' }, - error: { color: 'danger' as EuiCallOutProps['color'], icon: 'cross' }, + error: { color: 'danger' as EuiCallOutProps['color'], icon: 'alert' }, }; export const FlashMessages: React.FC = ({ children }) => { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/indexing_status/indexing_status_errors.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/indexing_status/indexing_status_errors.tsx index 0e69547cbf6b5..0a4a0a36ce417 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/indexing_status/indexing_status_errors.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/indexing_status/indexing_status_errors.tsx @@ -20,7 +20,7 @@ interface IIndexingStatusErrorsProps { export const IndexingStatusErrors: React.FC = ({ viewLinkPath }) => ( From 1f1f7037885bac7fb1c704a80a5e1b6f7aa0875f Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Tue, 23 Feb 2021 18:15:50 -0600 Subject: [PATCH 23/45] Revert "[build] Add task skips intended for partial builds (#92076)" This reverts commit 8fac02f8cbde0d2b83124f35f9a749f9e1a0d62c. --- src/dev/build/args.test.ts | 21 ------ src/dev/build/args.ts | 6 -- src/dev/build/build_distributables.ts | 69 ++++++++----------- .../tasks/os_packages/docker_generator/run.ts | 27 ++++---- 4 files changed, 41 insertions(+), 82 deletions(-) diff --git a/src/dev/build/args.test.ts b/src/dev/build/args.test.ts index e749af73241cf..2397c18c04d07 100644 --- a/src/dev/build/args.test.ts +++ b/src/dev/build/args.test.ts @@ -33,11 +33,8 @@ it('build default and oss dist for current platform, without packages, by defaul "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": false, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": false, "versionQualifier": "", @@ -60,11 +57,8 @@ it('builds packages if --all-platforms is passed', () => { "createDockerCentOS": true, "createDockerContexts": true, "createDockerUBI": true, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": true, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -87,11 +81,8 @@ it('limits packages if --rpm passed with --all-platforms', () => { "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": false, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": true, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -114,11 +105,8 @@ it('limits packages if --deb passed with --all-platforms', () => { "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": false, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -142,11 +130,8 @@ it('limits packages if --docker passed with --all-platforms', () => { "createDockerCentOS": true, "createDockerContexts": true, "createDockerUBI": true, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -177,11 +162,8 @@ it('limits packages if --docker passed with --skip-docker-ubi and --all-platform "createDockerCentOS": true, "createDockerContexts": true, "createDockerUBI": false, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": false, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", @@ -205,11 +187,8 @@ it('limits packages if --all-platforms passed with --skip-docker-centos', () => "createDockerCentOS": false, "createDockerContexts": true, "createDockerUBI": true, - "createGenericFolders": true, - "createPlatformFolders": true, "createRpmPackage": true, "downloadFreshNode": true, - "initialize": true, "isRelease": false, "targetAllPlatforms": true, "versionQualifier": "", diff --git a/src/dev/build/args.ts b/src/dev/build/args.ts index bbfbd3e6f8813..c594eacd08c01 100644 --- a/src/dev/build/args.ts +++ b/src/dev/build/args.ts @@ -18,9 +18,6 @@ export function readCliArgs(argv: string[]) { 'oss', 'no-oss', 'skip-archives', - 'skip-initialize', - 'skip-generic-folders', - 'skip-platform-folders', 'skip-os-packages', 'rpm', 'deb', @@ -96,10 +93,7 @@ export function readCliArgs(argv: string[]) { versionQualifier: flags['version-qualifier'], buildOssDist: flags.oss !== false, buildDefaultDist: !flags.oss, - initialize: !Boolean(flags['skip-initialize']), downloadFreshNode: !Boolean(flags['skip-node-download']), - createGenericFolders: !Boolean(flags['skip-generic-folders']), - createPlatformFolders: !Boolean(flags['skip-platform-folders']), createArchives: !Boolean(flags['skip-archives']), createRpmPackage: isOsPackageDesired('rpm'), createDebPackage: isOsPackageDesired('deb'), diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index f0403fac1e26b..237fc71811a41 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -16,9 +16,6 @@ export interface BuildOptions { buildOssDist: boolean; buildDefaultDist: boolean; downloadFreshNode: boolean; - initialize: boolean; - createGenericFolders: boolean; - createPlatformFolders: boolean; createArchives: boolean; createRpmPackage: boolean; createDebPackage: boolean; @@ -44,53 +41,45 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions /** * verify, reset, and initialize the build environment */ - if (options.initialize) { - await run(Tasks.VerifyEnv); - await run(Tasks.Clean); - await run( - options.downloadFreshNode ? Tasks.DownloadNodeBuilds : Tasks.VerifyExistingNodeBuilds - ); - await run(Tasks.ExtractNodeBuilds); - } + await run(Tasks.VerifyEnv); + await run(Tasks.Clean); + await run(options.downloadFreshNode ? Tasks.DownloadNodeBuilds : Tasks.VerifyExistingNodeBuilds); + await run(Tasks.ExtractNodeBuilds); /** * run platform-generic build tasks */ - if (options.createGenericFolders) { - await run(Tasks.CopySource); - await run(Tasks.CopyBinScripts); - await run(Tasks.ReplaceFavicon); - await run(Tasks.CreateEmptyDirsAndFiles); - await run(Tasks.CreateReadme); - await run(Tasks.BuildBazelPackages); - await run(Tasks.BuildPackages); - await run(Tasks.BuildKibanaPlatformPlugins); - await run(Tasks.TranspileBabel); - await run(Tasks.CreatePackageJson); - await run(Tasks.InstallDependencies); - await run(Tasks.CleanPackages); - await run(Tasks.CreateNoticeFile); - await run(Tasks.UpdateLicenseFile); - await run(Tasks.RemovePackageJsonDeps); - await run(Tasks.CleanTypescript); - await run(Tasks.CleanExtraFilesFromModules); - await run(Tasks.CleanEmptyFolders); - } + await run(Tasks.CopySource); + await run(Tasks.CopyBinScripts); + await run(Tasks.ReplaceFavicon); + await run(Tasks.CreateEmptyDirsAndFiles); + await run(Tasks.CreateReadme); + await run(Tasks.BuildBazelPackages); + await run(Tasks.BuildPackages); + await run(Tasks.BuildKibanaPlatformPlugins); + await run(Tasks.TranspileBabel); + await run(Tasks.CreatePackageJson); + await run(Tasks.InstallDependencies); + await run(Tasks.CleanPackages); + await run(Tasks.CreateNoticeFile); + await run(Tasks.UpdateLicenseFile); + await run(Tasks.RemovePackageJsonDeps); + await run(Tasks.CleanTypescript); + await run(Tasks.CleanExtraFilesFromModules); + await run(Tasks.CleanEmptyFolders); /** * copy generic build outputs into platform-specific build * directories and perform platform/architecture-specific steps */ - if (options.createPlatformFolders) { - await run(Tasks.CreateArchivesSources); - await run(Tasks.PatchNativeModules); - await run(Tasks.InstallChromium); - await run(Tasks.CleanExtraBinScripts); - await run(Tasks.CleanNodeBuilds); + await run(Tasks.CreateArchivesSources); + await run(Tasks.PatchNativeModules); + await run(Tasks.InstallChromium); + await run(Tasks.CleanExtraBinScripts); + await run(Tasks.CleanNodeBuilds); - await run(Tasks.PathLength); - await run(Tasks.UuidVerification); - } + await run(Tasks.PathLength); + await run(Tasks.UuidVerification); /** * package platform-specific builds into archives diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index b8029328ac94a..21d2582f205f3 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -83,16 +83,6 @@ export async function runDockerGenerator( revision: config.getBuildSha(), }; - type HostArchitectureToDocker = Record; - const hostTarget: HostArchitectureToDocker = { - x64: 'x64', - arm64: 'aarch64', - }; - const buildArchitectureSupported = hostTarget[process.arch] === flags.architecture && flags.image; - if (!buildArchitectureSupported) { - return; - } - // Verify if we have the needed kibana target in order // to build the kibana docker image. // Also create the docker build target folder @@ -142,11 +132,18 @@ export async function runDockerGenerator( await chmodAsync(`${resolve(dockerBuildDir, 'build_docker.sh')}`, '755'); // Only build images on native targets - - await exec(log, `./build_docker.sh`, [], { - cwd: dockerBuildDir, - level: 'info', - }); + type HostArchitectureToDocker = Record; + const hostTarget: HostArchitectureToDocker = { + x64: 'x64', + arm64: 'aarch64', + }; + const buildImage = hostTarget[process.arch] === flags.architecture && flags.image; + if (buildImage) { + await exec(log, `./build_docker.sh`, [], { + cwd: dockerBuildDir, + level: 'info', + }); + } // Pack Dockerfiles and create a target for them if (flags.context) { From 048425daa0f027dacdb24b78319369ad7ef4b99b Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Tue, 23 Feb 2021 20:58:13 -0500 Subject: [PATCH 24/45] [Security Solution][Endpoint][Admin] Match Policy Details in Security Solution with Fleet (#92047) --- .../pages/policy/view/policy_details.tsx | 145 +++++++++++------- 1 file changed, 89 insertions(+), 56 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index e14f56881d673..bc89fe572b936 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState, useContext } from 'react'; +import styled, { ThemeContext } from 'styled-components'; import { EuiFlexGroup, EuiFlexItem, @@ -15,7 +16,7 @@ import { EuiConfirmModal, EuiCallOut, EuiLoadingSpinner, - EuiHideFor, + EuiBottomBar, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; @@ -32,7 +33,6 @@ import { } from '../store/policy_details/selectors'; import { useKibana, toMountPoint } from '../../../../../../../../src/plugins/kibana_react/public'; import { AgentsSummary } from './agents_summary'; -import { VerticalDivider } from './vertical_divider'; import { useToasts } from '../../../../common/lib/kibana'; import { AppAction } from '../../../../common/store/actions'; import { SpyRoute } from '../../../../common/utils/route/spy_routes'; @@ -46,6 +46,25 @@ import { WrapperPage } from '../../../../common/components/wrapper_page'; import { HeaderPage } from '../../../../common/components/header_page'; import { PolicyDetailsForm } from './policy_details_form'; +const maxFormWidth = '770px'; +const PolicyDetailsHeader = styled.div` + padding: ${(props) => props.theme.eui.paddingSizes.xl} 0; + background-color: #fafbfd; + border-bottom: 1px solid #d3dae6; + .siemHeaderPage { + max-width: ${maxFormWidth}; + margin: 0 auto; + } +`; + +const PolicyDetailsFormDiv = styled.div` + background-color: ${(props) => props.theme.eui.euiHeaderBackgroundColor}; + padding: ${(props) => props.theme.eui.paddingSizes.l} 0; + max-width: ${maxFormWidth}; + flex: 1; + align-self: center; +`; + export const PolicyDetails = React.memo(() => { const dispatch = useDispatch<(action: AppAction) => void>(); const { @@ -69,6 +88,7 @@ export const PolicyDetails = React.memo(() => { const [routeState, setRouteState] = useState(); const policyName = policyItem?.name ?? ''; const hostListRouterPath = getEndpointListPath({ name: 'endpointList' }); + const theme = useContext(ThemeContext); // Handle showing update statuses useEffect(() => { @@ -153,43 +173,12 @@ export const PolicyDetails = React.memo(() => { } const headerRightContent = ( - - - - - - - - - - - - - - - - - - - - + ); return ( @@ -201,24 +190,68 @@ export const PolicyDetails = React.memo(() => { onConfirm={handleSaveConfirmation} /> )} - - - {headerRightContent} - + + + + {headerRightContent} + + - + + + + + + + + + + + + + + + + + + From ae6a18da3266801d09c362fff6e56da8da359f32 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Feb 2021 02:05:38 +0000 Subject: [PATCH 25/45] chore(NA): add missing files to exclude when building bazel prod packages (#92506) * chore(NA): add missing bazel files to exclude when building prod bazel packages * chore(NA): use globs to support all future run targets --- packages/kbn-pm/dist/index.js | 2 +- .../src/production/build_bazel_production_projects.ts | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 1b8bd4784e583..51e8a617e2446 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -59868,7 +59868,7 @@ async function copyToBuild(project, kibanaRoot, buildRoot) { // We want the package to have the same relative location within the build const relativeProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(kibanaRoot, project.path); const buildProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(buildRoot, relativeProjectPath); - const bazelFilesToExclude = ['!*.params', '!*_mappings.json', '!*_options.optionsvalid.d.ts']; + const bazelFilesToExclude = ['!*.sh.runfiles*', '!*.params', '!*_mappings.json', '!*_options.optionsvalid.d.ts', '!*_loader.js', '!*_require_patch.js', '!*.sh']; await cpy__WEBPACK_IMPORTED_MODULE_0___default()(['**/*', '!node_modules/**', ...bazelFilesToExclude], buildProjectPath, { cwd: Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(kibanaRoot, 'bazel', 'bin', 'packages', Object(path__WEBPACK_IMPORTED_MODULE_2__["basename"])(buildProjectPath)), dot: true, diff --git a/packages/kbn-pm/src/production/build_bazel_production_projects.ts b/packages/kbn-pm/src/production/build_bazel_production_projects.ts index a54d6c753d8d7..1034253c5e0dc 100644 --- a/packages/kbn-pm/src/production/build_bazel_production_projects.ts +++ b/packages/kbn-pm/src/production/build_bazel_production_projects.ts @@ -60,8 +60,16 @@ async function copyToBuild(project: Project, kibanaRoot: string, buildRoot: stri // We want the package to have the same relative location within the build const relativeProjectPath = relative(kibanaRoot, project.path); const buildProjectPath = resolve(buildRoot, relativeProjectPath); + const bazelFilesToExclude = [ + '!*.sh.runfiles*', + '!*.params', + '!*_mappings.json', + '!*_options.optionsvalid.d.ts', + '!*_loader.js', + '!*_require_patch.js', + '!*.sh', + ]; - const bazelFilesToExclude = ['!*.params', '!*_mappings.json', '!*_options.optionsvalid.d.ts']; await copy(['**/*', '!node_modules/**', ...bazelFilesToExclude], buildProjectPath, { cwd: join(kibanaRoot, 'bazel', 'bin', 'packages', basename(buildProjectPath)), dot: true, From 69bf12773059f4f6eddb6e1a34fe9f9d42636600 Mon Sep 17 00:00:00 2001 From: ymao1 Date: Tue, 23 Feb 2021 21:29:41 -0500 Subject: [PATCH 26/45] [Actions][Doc] Clean up Actions README (#91789) * Removing REST API from README. Updating configuration docs * Updating action config docs * Cleaning up action type configs in README and user docs * Cleaning up action type configs in README and user docs * Fixing formatting * Apply suggestions from code review Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * PR fixes * Update x-pack/plugins/actions/README.md Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../user/alerting/action-types/email.asciidoc | 20 +- .../user/alerting/action-types/index.asciidoc | 4 +- docs/user/alerting/action-types/jira.asciidoc | 50 +- .../alerting/action-types/pagerduty.asciidoc | 23 +- .../alerting/action-types/resilient.asciidoc | 33 +- .../alerting/action-types/server-log.asciidoc | 1 + .../alerting/action-types/servicenow.asciidoc | 37 +- .../user/alerting/action-types/slack.asciidoc | 14 +- .../user/alerting/action-types/teams.asciidoc | 14 +- .../alerting/action-types/webhook.asciidoc | 17 +- docs/user/alerting/defining-alerts.asciidoc | 5 +- x-pack/plugins/actions/README.md | 561 ++---------------- 12 files changed, 204 insertions(+), 575 deletions(-) diff --git a/docs/user/alerting/action-types/email.asciidoc b/docs/user/alerting/action-types/email.asciidoc index 8a5d8d156245e..0c238da1b39e3 100644 --- a/docs/user/alerting/action-types/email.asciidoc +++ b/docs/user/alerting/action-types/email.asciidoc @@ -13,12 +13,12 @@ NOTE: For emails to have a footer with a link back to {kib}, set the <"` format. See the https://nodemailer.com/message/addresses/[Nodemailer address documentation] for more information. Host:: Host name of the service provider. If you are using the <> setting, make sure this hostname is added to the allowed hosts. Port:: The port to connect to on the service provider. Secure:: If true, the connection will use TLS when connecting to the service provider. Refer to the https://nodemailer.com/smtp/#tls-options[Nodemailer TLS documentation] for more information. If not true, the connection will initially connect over TCP, then attempt to switch to TLS via the SMTP STARTTLS command. -Username:: username for 'login' type authentication. -Password:: password for 'login' type authentication. +User:: Username for login type authentication. +Password:: Password for login type authentication. [float] [[Preconfigured-email-configuration]] @@ -40,11 +40,14 @@ Password:: password for 'login' type authentication. -- [[email-connector-config-properties]] -`config` defines the action type specific to the configuration and contains the following properties: +**`config`** defines the action type specific to the configuration and contains the following properties: [cols="2*<"] |=== +| `service` +| The name of a https://nodemailer.com/smtp/well-known/[well-known email service provider]. If `service` is provided, `host`, `port`, and `secure` properties are ignored. For more information on the `gmail` service value, see the (https://nodemailer.com/usage/using-gmail/)[Nodemailer Gmail documentation]. + | `from` | An email address that corresponds to *Sender*. @@ -57,18 +60,21 @@ Password:: password for 'login' type authentication. | `secure` | A boolean that corresponds to *Secure*. +| `hasAuth` +| If `true`, this connector will require values for `user` and `password` inside the secrets configuration. Defaults to `true`. + |=== -`secrets` defines sensitive information for the action type: +**`secrets`** defines sensitive information for the action type and contains the following properties: [cols="2*<"] |=== | `user` -| A string that corresponds to *User*. +| A string that corresponds to *User*. Required if `hasAuth` is set to `true`. | `password` -| A string that corresponds to *Password*. Should be stored in the <>. +| A string that corresponds to *Password*. Should be stored in the <>. Required if `hasAuth` is set to `true`. |=== diff --git a/docs/user/alerting/action-types/index.asciidoc b/docs/user/alerting/action-types/index.asciidoc index 2f459edea28f1..7ecc1cdb4f74e 100644 --- a/docs/user/alerting/action-types/index.asciidoc +++ b/docs/user/alerting/action-types/index.asciidoc @@ -31,7 +31,7 @@ Execution time field:: This field will be automatically set to the time the ale -- [[index-connector-config-properties]] -`config` defines the action type specific to the configuration and contains the following properties: +**`config`** defines the action type specific to the configuration and contains the following properties: [cols="2*<"] |=== @@ -40,7 +40,7 @@ Execution time field:: This field will be automatically set to the time the ale | A string that corresponds to *Index*. |`refresh` -| A boolean that corresponds to *Refresh*. +| A boolean that corresponds to *Refresh*. Defaults to `false`. |`executionTimeField` | A string that corresponds to *Execution time field*. diff --git a/docs/user/alerting/action-types/jira.asciidoc b/docs/user/alerting/action-types/jira.asciidoc index 6e47d5618d598..0740cf7838b15 100644 --- a/docs/user/alerting/action-types/jira.asciidoc +++ b/docs/user/alerting/action-types/jira.asciidoc @@ -34,7 +34,7 @@ API token (or password):: Jira API authentication token (or password) for HTTP -- [[jira-connector-config-properties]] -`config` defines the action type specific to the configuration and contains the following properties: +**`config`** defines the action type specific to the configuration and contains the following properties: [cols="2*<"] |=== @@ -47,7 +47,7 @@ API token (or password):: Jira API authentication token (or password) for HTTP |=== -`secrets` defines sensitive information for the action type: +**`secrets`** defines sensitive information for the action type and contains the following properties: [cols="2*<"] |=== @@ -65,14 +65,44 @@ API token (or password):: Jira API authentication token (or password) for HTTP Jira actions have the following configuration properties: -Issue type:: The type of the issue. -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. +Subaction:: The subaction to perform: `pushToService`, `getIncident`, `issueTypes`, `fieldsByIssueType`, `issues`, `issue`, or `getFields`. +Subaction params:: The parameters of the subaction. + +==== `pushToService` subaction configuration + +Incident:: A Jira incident has the following properties: +* `summary` - The title of the issue. +* `description` - A description of the issue. +* `externalId` - The ID of the issue in Jira. If present, the issue is updated. Otherwise, a new issue is created. +* `issueType` - The ID of the issue type in Jira. +* `priority` - The priority level in Jira. Example: `Medium`. +* `labels` - An array of labels. Labels cannot contain spaces. +* `parent` - The parent issue ID or key. Only for subtask issue types. +Comments:: A comment in the form of `{ commentId: string, version: string, comment: string }`. + +==== `getIncident` subaction configuration + +External ID:: The ID of the issue in Jira. + +==== `issueTypes` subaction configuration + +The `issueTypes` subaction has no parameters. Provide an empty object `{}`. + +==== `fieldsByIssueType` subaction configuration + +ID:: The ID of the issue in Jira. + +==== `issues` subaction configuration + +Title:: The title to search for. + +==== `issue` subaction configuration + +ID:: The ID of the issue in Jira. + +==== `getFields` subaction configuration + +The `getFields` subaction has no parameters. Provide an empty object `{}`. [[configuring-jira]] ==== Configuring and testing Jira diff --git a/docs/user/alerting/action-types/pagerduty.asciidoc b/docs/user/alerting/action-types/pagerduty.asciidoc index e1078a55ddd0d..c3185aaad553a 100644 --- a/docs/user/alerting/action-types/pagerduty.asciidoc +++ b/docs/user/alerting/action-types/pagerduty.asciidoc @@ -151,14 +151,25 @@ Integration Key:: A 32 character PagerDuty Integration Key for an integration -- [[pagerduty-connector-config-properties]] -`config` defines the action type specific to the configuration. -`config` contains -`apiURL`, a string that corresponds to *API URL*. +**`config`** defines the action type specific to the configuration and contains the following properties: -`secrets` defines sensitive information for the action type. -`secrets` contains -`routingKey`, a string that corresponds to *Integration Key*. +[cols="2*<"] +|=== +|`apiURL` +| A URL string that corresponds to *API URL*. + +|=== + +**`secrets`** defines sensitive information for the action type and contains the following properties: + +[cols="2*<"] +|=== + +|`routingKey` +| A string that corresponds to *Integration Key*. + +|=== [float] [[pagerduty-action-configuration]] diff --git a/docs/user/alerting/action-types/resilient.asciidoc b/docs/user/alerting/action-types/resilient.asciidoc index 112246ab91162..dfa95e2deec00 100644 --- a/docs/user/alerting/action-types/resilient.asciidoc +++ b/docs/user/alerting/action-types/resilient.asciidoc @@ -34,7 +34,7 @@ API key secret:: The authentication key secret for HTTP Basic authentication. -- [[resilient-connector-config-properties]] -`config` defines the action type specific to the configuration and contains the following properties: +**`config`** defines the action type specific to the configuration and contains the following properties: [cols="2*<"] |=== @@ -47,7 +47,7 @@ API key secret:: The authentication key secret for HTTP Basic authentication. |=== -`secrets` defines sensitive information for the action type: +**`secrets`** defines sensitive information for the action type and contains the following properties: [cols="2*<"] |=== @@ -65,11 +65,30 @@ API key secret:: The authentication key secret for HTTP Basic authentication. IBM Resilient actions have the following configuration properties: -Incident types:: The incident types of the incident. -Severity code:: The severity of the incident. -Name:: A name for the issue, used for searching the contents of the knowledge base. -Description:: The details about the incident. -Additional comments:: Additional information for the client, such as how to troubleshoot the issue. +Subaction:: The subaction to perform: `pushToService`, `getFields`, `incidentTypes`, or `severity`. +Subaction params:: The parameters of the subaction. + +==== `pushToService` subaction configuration + +Incident:: The IBM resilient incident has the following properties: +* `name` - A name for the issue, used for searching the contents of the knowledge base. +* `description` - The details about the incident. +* `externalId` - The ID of the incident in IBM Resilient. If present, the incident is updated. Otherwise, a new incident is created. +* `incidentTypes` - An array with the IDs of IBM Resilient incident types. +* `severityCode` - The IBM Resilient ID of the severity code. +Comments:: A comment in the form of `{ commentId: string, version: string, comment: string }`. + +===== `getFields` subaction configuration + +The `getFields` subaction has not parameters. Provide an empty object `{}`. + +===== `incidentTypes` subaction configuration + +The `incidentTypes` subaction has no parameters. Provide an empty object `{}`. + +===== `severity` subaction configuration + +The `severity` subaction has no parameters. Provide an empty object `{}`. [[configuring-resilient]] ==== Configuring and testing IBM Resilient diff --git a/docs/user/alerting/action-types/server-log.asciidoc b/docs/user/alerting/action-types/server-log.asciidoc index 7022320328c85..276f64e7786bd 100644 --- a/docs/user/alerting/action-types/server-log.asciidoc +++ b/docs/user/alerting/action-types/server-log.asciidoc @@ -30,3 +30,4 @@ Name:: The name of the connector. The name is used to identify a connector Server log actions have the following properties: Message:: The message to log. +Level:: The log level of the message: `trace`, `debug`, `info`, `warn`, `error` or `fatal`. Defaults to `info`. diff --git a/docs/user/alerting/action-types/servicenow.asciidoc b/docs/user/alerting/action-types/servicenow.asciidoc index 5d8782c14e581..d1ee1b9357737 100644 --- a/docs/user/alerting/action-types/servicenow.asciidoc +++ b/docs/user/alerting/action-types/servicenow.asciidoc @@ -32,7 +32,7 @@ Password:: Password for HTTP Basic authentication. -- [[servicenow-connector-config-properties]] -`config` defines the action type specific to the configuration and contains the following properties: +**`config`** defines the action type specific to the configuration and contains the following properties: [cols="2*<"] |=== @@ -42,7 +42,7 @@ Password:: Password for HTTP Basic authentication. |=== -`secrets` defines sensitive information for the action type: +**`secrets`** defines sensitive information for the action type and contains the following properties: [cols="2*<"] |=== @@ -60,12 +60,33 @@ Password:: Password for HTTP Basic authentication. ServiceNow actions have the following configuration properties: -Urgency:: The extent to which the incident resolution can delay. -Severity:: The severity of the incident. -Impact:: The effect an incident has on business. Can be measured by the number of affected users or by how critical it is to the business in question. -Short description:: A short description for the incident, used for searching the contents of the knowledge base. -Description:: The details about the incident. -Additional comments:: Additional information for the client, such as how to troubleshoot the issue. +Subaction:: The subaction to perform: `pushToService`, `getFields`, `getIncident`, or `getChoices`. +Subaction params:: The parameters of the subaction. + +==== `pushToService` subaction configuration + +Incident:: The ServiceNow incident has the following properties: +* `short_description` - A short description for the incident, used for searching the contents of the knowledge base. +* `description` - The details about the incident. +* `externalId` - The ID of the incident in ServiceNow. If present, the incident is updated. Otherwise, a new incident is created. +* `severity` - The severity of the incident. +* `urgency` - The extent to which the incident resolution can delay. +* `impact` - The effect an incident has on business. Can be measured by the number of affected users or by how critical it is to the business in question. +* `category` - The name of the category in ServiceNow. +* `subcategory` - The name of the subcategory in ServiceNow. +Comments:: A comment in the form of `{ commentId: string, version: string, comment: string }`. + +===== `getFields` subaction configuration + +The `getFields` subaction has no parameters. Provide an empty object `{}`. + +===== `getIncident` subaction configuration + +External ID:: The ID of the incident in ServiceNow. + +===== `getChoices` subaction configuration + +Fields:: An array of fields. Example: `[priority, category, impact]`. [[configuring-servicenow]] ==== Configuring and testing ServiceNow diff --git a/docs/user/alerting/action-types/slack.asciidoc b/docs/user/alerting/action-types/slack.asciidoc index 6a38e5c827ab2..6258969753356 100644 --- a/docs/user/alerting/action-types/slack.asciidoc +++ b/docs/user/alerting/action-types/slack.asciidoc @@ -22,15 +22,19 @@ Webhook URL:: The URL of the incoming webhook. See https://api.slack.com/messa my-slack: name: preconfigured-slack-action-type actionTypeId: .slack - config: + secrets: webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' -- -[[slack-connector-config-properties]] -`config` defines the action type specific to the configuration. -`config` contains -`webhookUrl`, a string that corresponds to *Webhook URL*. +**`secrets`** defines sensitive information for the action type and contains the following properties: +[cols="2*<"] +|=== + +| `webhookUrl` +| A string that corresponds to *Webhook URL*. + +|=== [float] [[slack-action-configuration]] diff --git a/docs/user/alerting/action-types/teams.asciidoc b/docs/user/alerting/action-types/teams.asciidoc index e1ce91fc0c123..7f4a29dc86fc5 100644 --- a/docs/user/alerting/action-types/teams.asciidoc +++ b/docs/user/alerting/action-types/teams.asciidoc @@ -22,14 +22,20 @@ Webhook URL:: The URL of the incoming webhook. See https://docs.microsoft.com/ my-teams: name: preconfigured-teams-action-type actionTypeId: .teams - config: + secrets: webhookUrl: 'https://outlook.office.com/webhook/abcd@0123456/IncomingWebhook/abcdefgh/ijklmnopqrstuvwxyz' -- [[teams-connector-config-properties]] -`config` defines the action type specific to the configuration. -`config` contains -`webhookUrl`, a string that corresponds to *Webhook URL*. +**`secrets`** defines sensitive information for the action type and contains the following properties: + +[cols="2*<"] +|=== + +| `webhookUrl` +| A string that corresponds to *Webhook URL*. + +|=== [float] diff --git a/docs/user/alerting/action-types/webhook.asciidoc b/docs/user/alerting/action-types/webhook.asciidoc index 2d626d53d1c77..efe1077707ef0 100644 --- a/docs/user/alerting/action-types/webhook.asciidoc +++ b/docs/user/alerting/action-types/webhook.asciidoc @@ -12,10 +12,10 @@ Webhook connectors have the following configuration properties: Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. URL:: The request URL. If you are using the <> setting, make sure the hostname is added to the allowed hosts. -Method:: HTTP request method, either `post`(default) or `put`. +Method:: HTTP request method, either `POST`(default) or `PUT`. Headers:: A set of key-value pairs sent as headers with the request -User:: An optional username. If set, HTTP basic authentication is used. Currently only basic authentication is supported. -Password:: An optional password. If set, HTTP basic authentication is used. Currently only basic authentication is supported. +User:: Username for HTTP basic authentication. +Password:: Password for HTTP basic authentication. [float] [[Preconfigured-webhook-configuration]] @@ -37,7 +37,7 @@ Password:: An optional password. If set, HTTP basic authentication is used. Cur -- [[webhook-connector-config-properties]] -`config` defines the action type specific to the configuration and contains the following properties: +**`config`** defines the action type specific to the configuration and contains the following properties: [cols="2*<"] |=== @@ -51,18 +51,21 @@ Password:: An optional password. If set, HTTP basic authentication is used. Cur |`headers` |A record that corresponds to *Headers*. +| `hasAuth` +| If `true`, this connector will require values for `user` and `password` inside the secrets configuration. Defaults to `true`. + |=== -`secrets` defines sensitive information for the action type: +**`secrets`** defines sensitive information for the action type and contains the following properties: [cols="2*<"] |=== |`user` -|A string that corresponds to *User*. +|A string that corresponds to *User*. Required if `hasAuth` is set to `true`. |`password` -|A string that corresponds to *Password*. Should be stored in the <>. +|A string that corresponds to *Password*. Should be stored in the <>. Required if `hasAuth` is set to `true`. |=== diff --git a/docs/user/alerting/defining-alerts.asciidoc b/docs/user/alerting/defining-alerts.asciidoc index 528189b8a1216..5f13c6e1774a8 100644 --- a/docs/user/alerting/defining-alerts.asciidoc +++ b/docs/user/alerting/defining-alerts.asciidoc @@ -92,6 +92,7 @@ Actions are not required on alerts. In some cases you may want to run an alert w ============================================== [float] +[[actions-configuration]] === Global actions configuration Some actions configuration options apply to all actions. If you are using an *on-prem* Elastic Stack deployment, you can set these in the kibana.yml file. @@ -99,8 +100,10 @@ If you are using a cloud deployment, you can set these via the console. Here's a list of the available global configuration options and an explanation of what each one does: +* `xpack.actions.enabled`: Feature toggle that enables Actions in {kib}. Default: `true` * `xpack.actions.allowedHosts`: Specifies an array of host names which actions such as email, Slack, PagerDuty, and webhook can connect to. An element of * indicates any host can be connected to. An empty array indicates no hosts can be connected to. Default: [ {asterisk} ] -* `xpack.actions.enabledActionTypes`: Specifies to an array of action types that are enabled. An {asterisk} indicates all action types registered are enabled. The action types that {kib} provides are: .server-log, .slack, .email, .index, .pagerduty, .webhook. Default: [ {asterisk} ] +* `xpack.actions.enabledActionTypes`: Specifies an array of action types that are enabled. An {asterisk} indicates all action types registered are enabled. The action types that {kib} provides are `.email`, `.index`, `.jira`, `.pagerduty`, `.resilient`, `.server-log`, `.servicenow`, `.servicenow-sir`, `.slack`, `.teams`, and `.webhook`. Default: [ {asterisk} ] +* `xpack.actions.preconfigured`: Specifies preconfigured action IDs and configs. Default: {} * `xpack.actions.proxyUrl`: Specifies the proxy URL to use, if using a proxy for actions. * `xpack.actions.proxyHeader`: Specifies HTTP headers for proxy, if using a proxy for actions. * `xpack.actions.proxyRejectUnauthorizedCertificates`: Set to `false` to bypass certificate validation for proxy, if using a proxy for actions. diff --git a/x-pack/plugins/actions/README.md b/x-pack/plugins/actions/README.md index 9d48e618b76dc..78094f4c0eb0b 100644 --- a/x-pack/plugins/actions/README.md +++ b/x-pack/plugins/actions/README.md @@ -26,19 +26,12 @@ Table of Contents - [Executor](#executor) - [Example](#example) - [RESTful API](#restful-api) - - [`POST /api/actions/action`: Create action](#post-apiactionsaction-create-action) - - [`DELETE /api/actions/action/{id}`: Delete action](#delete-apiactionsactionid-delete-action) - - [`GET /api/actions`: Get all actions](#get-apiactions-get-all-actions) - - [`GET /api/actions/action/{id}`: Get action](#get-apiactionsactionid-get-action) - - [`GET /api/actions/list_action_types`: List action types](#get-apiactionslist_action_types-list-action-types) - - [`PUT /api/actions/action/{id}`: Update action](#put-apiactionsactionid-update-action) - - [`POST /api/actions/action/{id}/_execute`: Execute action](#post-apiactionsactionid_execute-execute-action) - [Firing actions](#firing-actions) - - [Accessing a scoped ActionsClient](#accessing-a-scoped-actionsclient) + - [Accessing a scoped ActionsClient](#accessing-a-scoped-actionsclient) - [actionsClient.enqueueExecution(options)](#actionsclientenqueueexecutionoptions) - - [Example](#example-1) + - [Example](#example-1) - [actionsClient.execute(options)](#actionsclientexecuteoptions) - - [Example](#example-2) + - [Example](#example-2) - [Built-in Action Types](#built-in-action-types) - [Server log](#server-log) - [`config`](#config) @@ -109,9 +102,9 @@ action types. ## Usage -1. Develop and register an action type (see action types -> example). -2. Create an action by using the RESTful API (see actions -> create action). -3. Use alerts to execute actions or execute manually (see firing actions). +1. Develop and register an action type (see [Action types -> Example](#example)). +2. Create an action by using the [RESTful API](#restful-api). +3. Use alerts to execute actions or execute manually (see [Firing actions](#firing-actions)). ## Kibana Actions Configuration @@ -119,50 +112,48 @@ Implemented under the [Actions Config](./server/actions_config.ts). ### Configuration Options -Built-In-Actions are configured using the _xpack.actions_ namespoace under _kibana.yml_, and have the following configuration options: +Built-In-Actions are configured using the _xpack.actions_ namespace under _kibana.yml_. See the [Actions configuration Documentation](https://www.elastic.co/guide/en/kibana/master/defining-alerts.html#actions-configuration) for all configuration options. -| Namespaced Key | Description | Type | -| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| _xpack.actions._**enabled** | Feature toggle which enabled Actions in Kibana. | boolean | -| _xpack.actions._**allowedHosts** | Which _hostnames_ are allowed for the Built-In-Action? This list should contain hostnames of every external service you wish to interact with using Webhooks, Email or any other built in Action. Note that you may use the string "\*" in place of a specific hostname to enable Kibana to target any URL, but keep in mind the potential use of such a feature to execute [SSRF](https://www.owasp.org/index.php/Server_Side_Request_Forgery) attacks from your server. | Array | -| _xpack.actions._**enabledActionTypes** | A list of _actionTypes_ id's that are enabled. A "\*" may be used as an element to indicate all registered actionTypes should be enabled. The actionTypes registered for Kibana are `.server-log`, `.slack`, `.email`, `.index`, `.pagerduty`, `.webhook`. Default: `["*"]` | Array | -| _xpack.actions._**preconfigured** | A object of action id / preconfigured actions. Default: `{}` | Array | +#### **allowedHosts** configuration -#### Adding Built-in Action Types to allowedHosts +- You can use the string "*" in the **allowedHosts** configuration in place of a specific hostname to enable Kibana to target any URL, but keep in mind the potential to use such a feature to execute [SSRF](https://www.owasp.org/index.php/Server_Side_Request_Forgery) attacks from your server. -It is worth noting that the **allowedHosts** configuation applies to built-in action types (such as Slack, or PagerDuty) as well. - -Uniquely, the _PagerDuty Action Type_ has been configured to support the service's Events API (at _https://events.pagerduty.com/v2/enqueue_, which you can read about [here](https://v2.developer.pagerduty.com/docs/events-api-v2)) as a default, but this too, must be included in the allowedHosts before the PagerDuty action can be used. +- The **allowedHosts** configuration applies to built-in action types (such as Slack and PagerDuty). While the _PagerDuty Action Type_ has been configured to support the service's Events API (at _https://events.pagerduty.com/v2/enqueue_, which you can read about in [Pagerduty's documentation](https://v2.developer.pagerduty.com/docs/events-api-v2)), the PagerDuty domain must still be included in the allowedHosts configuration before the action can be used. ### Configuration Utilities -This module provides a Utilities for interacting with the configuration. +This module provides utilities for interacting with the configuration. -| Method | Arguments | Description | Return Type | -| ----------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -| isUriAllowed | _uri_: The URI you wish to validate is allowed | Validates whether the URI is allowed. This checks the configuration and validates that the hostname of the URI is in the list of allowed Hosts and returns `true` if it is allowed. If the configuration says that all URI's are allowed (using an "\*") then it will always return `true`. | Boolean | -| isHostnameAllowed | _hostname_: The Hostname you wish to validate is allowed | Validates whether the Hostname is allowed. This checks the configuration and validates that the hostname is in the list of allowed Hosts and returns `true` if it is allowed. If the configuration says that all Hostnames are allowed (using an "\*") then it will always return `true`. | Boolean | -| isActionTypeEnabled | _actionType_: The actionType to check to see if it's enabled | Returns true if the actionType is enabled, otherwise false. | Boolean | -| ensureUriAllowed | _uri_: The URI you wish to validate is allowed | Validates whether the URI is allowed. This checks the configuration and validates that the hostname of the URI is in the list of allowed Hosts and throws an error if it is not allowed. If the configuration says that all URI's are allowed (using an "\*") then it will never throw. | No return value, throws if URI isn't allowed | -| ensureHostnameAllowed | _hostname_: The Hostname you wish to validate is allowed | Validates whether the Hostname is allowed. This checks the configuration and validates that the hostname is in the list of allowed Hosts and throws an error if it is not allowed. If the configuration says that all Hostnames are allowed (using an "\*") then it will never throw | No return value, throws if Hostname isn't allowed . | -| ensureActionTypeEnabled | _actionType_: The actionType to check to see if it's enabled | Throws an error if the actionType is not enabled | No return value, throws if actionType isn't enabled | +| Method | Arguments | Description | Return Type | +| --------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| isUriAllowed | _uri_: The URI you wish to validate is allowed | Validates whether the URI is allowed. This checks the configuration and validates that the hostname of the URI is in the list of allowed Hosts and returns `true` if it is allowed. If the configuration says that all URI's are allowed (using an "\*") then it will always return `true`. | Boolean | +| isHostnameAllowed | _hostname_: The Hostname you wish to validate is allowed | Validates whether the Hostname is allowed. This checks the configuration and validates that the hostname is in the list of allowed Hosts and returns `true` if it is allowed. If the configuration says that all Hostnames are allowed (using an "\*") then it will always return `true`. | Boolean | +| isActionTypeEnabled | _actionType_: The actionType to check to see if it's enabled | Returns true if the actionType is enabled, otherwise false. | Boolean | +| ensureUriAllowed | _uri_: The URI you wish to validate is allowed | Validates whether the URI is allowed. This checks the configuration and validates that the hostname of the URI is in the list of allowed Hosts and throws an error if it is not allowed. If the configuration says that all URI's are allowed (using an "\*") then it will never throw. | No return value, throws if URI isn't allowed | +| ensureHostnameAllowed | _hostname_: The Hostname you wish to validate is allowed | Validates whether the Hostname is allowed. This checks the configuration and validates that the hostname is in the list of allowed Hosts and throws an error if it is not allowed. If the configuration says that all Hostnames are allowed (using an "\*") then it will never throw | No return value, throws if Hostname isn't allowed . | +| ensureActionTypeEnabled | _actionType_: The actionType to check to see if it's enabled | Throws an error if the actionType is not enabled | No return value, throws if actionType isn't enabled | +| isRejectUnauthorizedCertificatesEnabled | _none_ | Returns value of `rejectUnauthorized` from configuration. | Boolean | +| getProxySettings | _none_ | If `proxyUrl` is set in the configuration, returns the proxy settings `proxyUrl`, `proxyHeaders` and `proxyRejectUnauthorizedCertificates`. Otherwise returns _undefined_. | Undefined or ProxySettings | ## Action types ### Methods -**server.plugins.actions.setup.registerType(options)** +**server.plugins.actions.setup.registerType (options)** The following table describes the properties of the `options` object. -| Property | Description | Type | -| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -| id | Unique identifier for the action type. For convention, ids starting with `.` are reserved for built in action types. We recommend using a convention like `.mySpecialAction` for your action types. | string | -| name | A user-friendly name for the action type. These will be displayed in dropdowns when chosing action types. | string | -| unencryptedAttributes | A list of opt-out attributes that don't need to be encrypted. These attributes won't need to be re-entered on import / export when the feature becomes available. These attributes will also be readable / displayed when it comes to a table / edit screen. | array of strings | -| validate.params | When developing an action type, it needs to accept parameters to know what to do with the action. (Example to, from, subject, body of an email). See the current built-in email action type for an example of the state-of-the-art validation.

Technically, the value of this property should have a property named `validate()` which is a function that takes a params object to validate and returns a sanitized version of that object to pass to the execution function. Validation errors should be thrown from the `validate()` function and will be available as an error message | schema / validation function | -| validate.config | Similar to params, a config is required when creating an action (for example host, port, username, and password of an email server). | schema / validation function | -| executor | This is where the code of an action type lives. This is a function gets called for executing an action from either alerting or manually by using the exposed function (see firing actions). For full details, see executor section below. | Function | +| Property | Description | Type | +| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| id | Unique identifier for the action type. For convention, ids starting with `.` are reserved for built in action types. We recommend using a convention like `.mySpecialAction` for your action types. | string | +| name | A user-friendly name for the action type. These will be displayed in dropdowns when chosing action types. | string | +| maxAttempts | The maximum number of times this action will attempt to execute when scheduled. | number | +| minimumLicenseRequired | The license required to use the action type. | string | +| validate.params | When developing an action type, it needs to accept parameters to know what to do with the action. (Example `to`, `from`, `subject`, `body` of an email). See the current built-in email action type for an example of the state-of-the-art validation.

Technically, the value of this property should have a property named `validate()` which is a function that takes a params object to validate and returns a sanitized version of that object to pass to the execution function. Validation errors should be thrown from the `validate()` function and will be available as an error message | schema / validation function | +| validate.config | Similar to params, a config may be required when creating an action (for example `host` and `port` for an email server). | schema / validation function | +| validate.secrets | Similar to params, a secrets object may be required when creating an action (for example `user` and `password` for an email server). | schema / validation function | +| executor | This is where the code of an action type lives. This is a function gets called for executing an action from either alerting or manually by using the exposed function (see firing actions). For full details, see executor section below. | Function | +| renderParameterTemplates | Optionally define a function to provide custom rendering for this action type. | Function | **Important** - The config object is persisted in ElasticSearch and updated via the ElasticSearch update document API. This API allows "partial updates" - and this can cause issues with the encryption used on specified properties. So, a `validate()` function should return values for all configuration properties, so that partial updates do not occur. Setting property values to `null` rather than `undefined`, or not including a property in the config object, is all you need to do to ensure partial updates won't occur. @@ -175,12 +166,13 @@ This is the primary function for an action type. Whenever the action needs to ex | Property | Description | | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | actionId | The action saved object id that the action type is executing for. | -| config | The decrypted configuration given to an action. This comes from the action saved object that is partially or fully encrypted within the data store. If you would like to validate the config before being passed to the executor, define `validate.config` within the action type. | +| config | The action configuration. If you would like to validate the config before being passed to the executor, define `validate.config` within the action type. | +| secrets | The decrypted secrets object given to an action. This comes from the action saved object that is partially or fully encrypted within the data store. If you would like to validate the secrets object before being passed to the executor, define `validate.secrets` within the action type. | | params | Parameters for the execution. These will be given at execution time by either an alert or manually provided when calling the plugin provided execute function. | | services.callCluster(path, opts) | Use this to do Elasticsearch queries on the cluster Kibana connects to. This function is the same as any other `callCluster` in Kibana but runs in the context of the user who is calling the action when security is enabled. | | services.getLegacyScopedClusterClient | This function returns an instance of the LegacyScopedClusterClient scoped to the user who is calling the action when security is enabled. | | services.savedObjectsClient | This is an instance of the saved objects client. This provides the ability to do CRUD on any saved objects within the same space the alert lives in.

The scope of the saved objects client is tied to the user in context calling the execute API or the API key provided to the execute plugin function (only when security isenabled). | -| services.log(tags, [data], [timestamp]) | Use this to create server logs. (This is the same function as server.log) | +| services.log(tags, [data], [timestamp]) | Use this to create server logs. (This is the same function as server.log) ### Example @@ -189,83 +181,14 @@ The built-in email action type provides a good example of creating an action typ ## RESTful API -Using an action type requires an action to be created that will contain and encrypt configuration for a given action type. See below for CRUD operations using the API. - -### `POST /api/actions/action`: Create action - -Payload: - -| Property | Description | Type | -| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -| name | A name to reference and search in the future. This value will be used to populate dropdowns. | string | -| actionTypeId | The id value of the action type you want to call when the action executes. | string | -| config | The configuration the action type expects. See related action type to see what attributes are expected. This will also validate against the action type if config validation is defined. | object | -| secrets | The secrets the action type expects. See related action type to see what attributes are expected. This will also validate against the action type if secrets validation is defined. | object | - -### `DELETE /api/actions/action/{id}`: Delete action - -Params: - -| Property | Description | Type | -| -------- | --------------------------------------------- | ------ | -| id | The id of the action you're trying to delete. | string | - -### `GET /api/actions`: Get all actions - -No parameters. - -Return all actions from saved objects merged with predefined list. -Use the [saved objects API for find](https://www.elastic.co/guide/en/kibana/master/saved-objects-api-find.html) with the proprties: `type: 'action'` and `perPage: 10000`. -List of predefined actions should be set up in Kibana.yaml. - -### `GET /api/actions/action/{id}`: Get action - -Params: - -| Property | Description | Type | -| -------- | ------------------------------------------ | ------ | -| id | The id of the action you're trying to get. | string | - -### `GET /api/actions/list_action_types`: List action types - -No parameters. - -### `PUT /api/actions/action/{id}`: Update action - -Params: - -| Property | Description | Type | -| -------- | --------------------------------------------- | ------ | -| id | The id of the action you're trying to update. | string | - -Payload: - -| Property | Description | Type | -| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -| name | A name to reference and search in the future. This value will be used to populate dropdowns. | string | -| config | The configuration the action type expects. See related action type to see what attributes are expected. This will also validate against the action type if config validation is defined. | object | -| secrets | The secrets the action type expects. See related action type to see what attributes are expected. This will also validate against the action type if secrets validation is defined. | object | - -### `POST /api/actions/action/{id}/_execute`: Execute action - -Params: - -| Property | Description | Type | -| -------- | ---------------------------------------------- | ------ | -| id | The id of the action you're trying to execute. | string | - -Payload: - -| Property | Description | Type | -| -------- | ---------------------------------------------------------- | ------ | -| params | The parameters the action type requires for the execution. | object | +Using an action type requires an action to be created that will contain and encrypt configuration for a given action type. See the [REST API Documentation](https://www.elastic.co/guide/en/kibana/master/actions-and-connectors-api.html) API for CRUD operations for Actions. ## Firing actions Running actions is possible by using the ActionsClient which is provided by the `getActionsClientWithRequest` function part of the plugin's Start Contract. By providing the user's Request you'll receive an instance of the ActionsClient which is tailered to the current user and is scoped to the resources the user is authorized to access. -## Accessing a scoped ActionsClient +### Accessing a scoped ActionsClient ``` const actionsClient = server.plugins.actions.getActionsClientWithRequest(request); @@ -279,7 +202,7 @@ This api schedules a task which will run the action using the current user scope Running the action by scheduling a task means that we will no longer have a user request by which to ascertain the action's privileges and so you might need to provide these yourself: -- The **SpaceId** in which the user's action is expected to run +- The **spaceId** in which the user's action is expected to run - When security is enabled you'll also need to provide an **apiKey** which allows us to mimic the user and their privileges. The following table describes the properties of the `options` object. @@ -292,7 +215,7 @@ The following table describes the properties of the `options` object. | 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 +#### Example This example makes action `3c5b2bd4-5424-4e4b-8cf5-c0a58c762cc5` send an email. The action plugin will load the saved object and find what action type to call with `params`. @@ -324,7 +247,7 @@ The following table describes the properties of the `options` object. | 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 +#### Example As with the previous example, we'll use the action `3c5b2bd4-5424-4e4b-8cf5-c0a58c762cc5` to send an email. @@ -347,405 +270,7 @@ const result = await actionsClient.execute({ # Built-in Action Types -Kibana ships with a set of built-in action types: - -| Type | Id | Description | -| ------------------------------- | ----------------- | ------------------------------------------------------------------ | -| [Server log](#server-log) | `.server-log` | Logs messages to the Kibana log using Kibana's logger | -| [Email](#email) | `.email` | Sends an email using SMTP | -| [Slack](#slack) | `.slack` | Posts a message to a slack channel | -| [Index](#index) | `.index` | Indexes document(s) into Elasticsearch | -| [Webhook](#webhook) | `.webhook` | Send a payload to a web service using HTTP POST or PUT | -| [PagerDuty](#pagerduty) | `.pagerduty` | Trigger, resolve, or acknowlege an incident to a PagerDuty service | -| [ServiceNow ITSM](#servicenow) | `.servicenow` | Create or update an incident to a ServiceNow ITSM instance | -| [ServiceNow SIR](#servicenow) | `.servicenow-sir` | Create or update an incident to a ServiceNow SIR instance | -| [Jira](#jira) | `.jira` | Create or update an issue to a Jira instance | -| [IBM Resilient](#ibm-resilient) | `.resilient` | Create or update an incident to a IBM Resilient instance | - ---- - -## Server log - -ID: `.log` - -The params properties are modelled after the arguments to the [Hapi.server.log()](https://hapijs.com/api#-serverlogtags-data-timestamp) function. - -### `config` - -This action has no `config` properties. - -### `secrets` - -This action type has no `secrets` properties. - -### `params` - -| Property | Description | Type | -| -------- | ---------------------------------------- | --------------------- | -| message | The message to log. | string | -| tags | Tags associated with the message to log. | string[] _(optional)_ | - ---- - -## Email - -ID: `.email` - -This action type uses [nodemailer](https://nodemailer.com/about/) to send emails. - -### `config` - -Either the property `service` must be provided, or the `host` and `port` properties must be provided. If `service` is provided, `host`, `port` and `secure` are ignored. For more information on the `gmail` service value specifically, see the [nodemailer gmail documentation](https://nodemailer.com/usage/using-gmail/). - -The `secure` property defaults to `false`. See the [nodemailer TLS documentation](https://nodemailer.com/smtp/#tls-options) for more information. - -The `from` field can be specified as in typical `"user@host-name"` format, or as `"human name "` format. See the [nodemailer address documentation](https://nodemailer.com/message/addresses/) for more information. - -| Property | Description | Type | -| -------- | ------------------------------------------------------------------------------------------ | -------------------- | -| service | the name of a [well-known email service provider](https://nodemailer.com/smtp/well-known/) | string _(optional)_ | -| host | host name of the service provider | string _(optional)_ | -| port | port number of the service provider | number _(optional)_ | -| secure | whether to use TLS with the service provider | boolean _(optional)_ | -| from | the from address for all emails sent with this action type | string | - -### `secrets` - -| Property | Description | Type | -| -------- | ----------------------------------------- | ------ | -| user | userid to use with the service provider | string | -| password | password to use with the service provider | string | - -### `params` - -There must be at least one entry in the `to`, `cc` and `bcc` arrays. - -The message text will be sent as both plain text and html text. Additional function may be provided later. - -The `to`, `cc`, and `bcc` array entries can be in the same format as the `from` property described in the config object above. - -| Property | Description | Type | -| -------- | ----------------------------- | --------------------- | -| to | list of to addressees | string[] _(optional)_ | -| cc | list of cc addressees | string[] _(optional)_ | -| bcc | list of bcc addressees | string[] _(optional)_ | -| subject | the subject line of the email | string | -| message | the message text | string | - ---- - -## Slack - -ID: `.slack` - -This action type interfaces with the [Slack Incoming Webhooks feature](https://api.slack.com/incoming-webhooks). Currently the params property `message` will be used as the `text` property of the Slack incoming message. Additional function may be provided later. - -### `config` - -This action type has no `config` properties. - -### `secrets` - -| Property | Description | Type | -| ---------- | ------------------------------------- | ------ | -| webhookUrl | the url of the Slack incoming webhook | string | - -### `params` - -| Property | Description | Type | -| -------- | ---------------- | ------ | -| message | the message text | string | - ---- - -## Index - -ID: `.index` - -The config and params properties are modelled after the [Watcher Index Action](https://www.elastic.co/guide/en/elasticsearch/reference/master/actions-index.html). The index can be set in the config or params, and if set in config, then the index set in the params will be ignored. - -### `config` - -| Property | Description | Type | -| -------------------- | ---------------------------------------------------------- | -------------------- | -| index | The Elasticsearch index to index into. | string _(optional)_ | -| doc_id | The optional \_id of the document. | string _(optional)_ | -| execution_time_field | The field that will store/index the action execution time. | string _(optional)_ | -| refresh | Setting of the refresh policy for the write request. | boolean _(optional)_ | - -### `secrets` - -This action type has no `secrets` properties. - -### `params` - -| Property | Description | Type | -| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| documents | JSON object that describes the [document](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-index.html#getting-started-batch-processing). | object[] | - ---- - -## Webhook - -ID: `.webhook` - -The webhook action uses [axios](https://github.com/axios/axios) to send a POST or PUT request to a web service. - -### `config` - -| Property | Description | Type | -| -------- | ------------------------------------------------------- | ------------------------------------------------ | -| url | Request URL | string | -| method | HTTP request method, either `post`_(default)_ or `put` | string _(optional)_ | -| headers | Key-value pairs of the headers to send with the request | object, keys and values are strings _(optional)_ | - -### `secrets` - -| Property | Description | Type | -| -------- | -------------------------------------- | ------------------- | -| user | Username for HTTP Basic authentication | string _(optional)_ | -| password | Password for HTTP Basic authentication | string _(optional)_ | - -### `params` - -| Property | Description | Type | -| -------- | --------------------- | ------------------- | -| body | The HTTP request body | string _(optional)_ | - ---- - -## PagerDuty - -ID: `.pagerduty` - -The PagerDuty action uses the [V2 Events API](https://v2.developer.pagerduty.com/docs/events-api-v2) to trigger, acknowlege, and resolve PagerDuty alerts. - -### `config` - -| Property | Description | Type | -| -------- | -------------------------------------------------------------------------- | ------------------- | -| apiUrl | PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue` | string _(optional)_ | - -### `secrets` - -| Property | Description | Type | -| ---------- | ---------------------------------------------------------------------------------------------------------- | ------ | -| routingKey | This is the 32 character PagerDuty Integration Key for an integration on a service or on a global ruleset. | string | - -### `params` - -| Property | Description | Type | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | -| eventAction | One of `trigger` _(default)_, `resolve`, or `acknowlege`. See [event action](https://v2.developer.pagerduty.com/docs/events-api-v2#event-action) for more details. | string _(optional)_ | -| dedupKey | All actions sharing this key will be associated with the same PagerDuty alert. Used to correlate trigger and resolution. The maximum length is **255** characters. See [alert deduplication](https://v2.developer.pagerduty.com/docs/events-api-v2#alert-de-duplication) for details. | string _(optional)_ | -| summary | A text summary of the event, defaults to `No summary provided`. The maximum length is **1024** characters. | string _(optional)_ | -| source | The affected system, preferably a hostname or fully qualified domain name. Defaults to `Kibana Action `. | string _(optional)_ | -| severity | The perceived severity of on the affected system. This can be one of `critical`, `error`, `warning` or `info`_(default)_. | string _(optional)_ | -| timestamp | An [ISO-8601 format date-time](https://v2.developer.pagerduty.com/v2/docs/types#datetime), indicating the time the event was detected or generated. | string _(optional)_ | -| component | The component of the source machine that is responsible for the event, for example `mysql` or `eth0`. | string _(optional)_ | -| group | Logical grouping of components of a service, for example `app-stack`. | string _(optional)_ | -| class | The class/type of the event, for example `ping failure` or `cpu load`. | string _(optional)_ | - -For more details see [PagerDuty v2 event parameters](https://v2.developer.pagerduty.com/v2/docs/send-an-event-events-api-v2). - ---- - -## ServiceNow - -ServiceNow ITSM ID: `.servicenow` - -ServiceNow SIR ID: `.servicenow-sir` - -The ServiceNow actions use the [V2 Table API](https://developer.servicenow.com/app.do#!/rest_api_doc?v=orlando&id=c_TableAPI) to create and update ServiceNow incidents. Both action types use the same `config`, `secrets`, and `params` schema. - -### `config` - -| Property | Description | Type | -| -------- | ------------------------ | ------ | -| apiUrl | ServiceNow instance URL. | string | - -### `secrets` - -| Property | Description | Type | -| -------- | -------------------------------------- | ------ | -| username | Username for HTTP Basic authentication | string | -| password | Password for HTTP Basic authentication | string | - -### `params` - -| Property | Description | Type | -| --------------- | -------------------------------------------------------------------------------------------------- | ------ | -| subAction | The sub action to perform. It can be `pushToService`, `getFields`, `getIncident`, and `getChoices` | string | -| subActionParams | The parameters of the sub action | object | - -#### `subActionParams (pushToService)` - -| Property | Description | Type | -| -------- | ------------------------------------------------------------------------------------------------------------- | --------------------- | -| incident | The ServiceNow incident. | object | -| comments | The comments of the case. A comment is of the form `{ commentId: string, version: string, comment: string }`. | object[] _(optional)_ | - -The following table describes the properties of the `incident` object. - -| Property | Description | Type | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------- | -| short_description | The title of the incident. | string | -| description | The description of the incident. | string _(optional)_ | -| externalId | The id of the incident in ServiceNow. If presented the incident will be update. Otherwise a new incident will be created. | string _(optional)_ | -| severity | The name of the severity in ServiceNow. | string _(optional)_ | -| urgency | The name of the urgency in ServiceNow. | string _(optional)_ | -| impact | The name of the impact in ServiceNow. | string _(optional)_ | -| category | The name of the category in ServiceNow. | string _(optional)_ | -| subcategory | The name of the subcategory in ServiceNow. | string _(optional)_ | - -#### `subActionParams (getFields)` - -No parameters for `getFields` sub-action. Provide an empty object `{}`. - -#### `subActionParams (getIncident)` - -| Property | Description | Type | -| ---------- | ------------------------------------- | ------ | -| externalId | The id of the incident in ServiceNow. | string | - - -#### `subActionParams (getChoices)` - -| Property | Description | Type | -| -------- | ------------------------------------------------------------ | -------- | -| fields | An array of fields. Example: `[priority, category, impact]`. | string[] | - ---- - -## Jira - -ID: `.jira` - -The Jira action uses the [V2 API](https://developer.atlassian.com/cloud/jira/platform/rest/v2/) to create and update Jira incidents. - -### `config` - -| Property | Description | Type | -| -------- | ------------------ | ------ | -| apiUrl | Jira instance URL. | string | - -### `secrets` - -| Property | Description | Type | -| -------- | ----------------------------------------------------- | ------ | -| email | email (or username) for HTTP Basic authentication | string | -| apiToken | API token (or password) for HTTP Basic authentication | string | - -### `params` - -| Property | Description | Type | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------ | -| subAction | The sub action to perform. It can be `pushToService`, `getIncident`, `issueTypes`, `fieldsByIssueType`, `issues`, `issue`, and `getFields` | string | -| subActionParams | The parameters of the sub action | object | - -#### `subActionParams (pushToService)` - -| Property | Description | Type | -| -------- | ------------------------------------------------------------------------------------------------------------- | --------------------- | -| incident | The Jira incident. | object | -| comments | The comments of the case. A comment is of the form `{ commentId: string, version: string, comment: string }`. | object[] _(optional)_ | - -The following table describes the properties of the `incident` object. - -| Property | Description | Type | -| ----------- | ---------------------------------------------------------------------------------------------------------------- | --------------------- | -| summary | The title of the issue | string | -| description | The description of the issue | string _(optional)_ | -| externalId | The id of the issue in Jira. If presented the incident will be update. Otherwise a new incident will be created. | string _(optional)_ | -| 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. Labels cannot contain spaces. | string[] _(optional)_ | -| parent | The parent issue id or key. Only for `Sub-task` issue types. | string _(optional)_ | - -#### `subActionParams (getIncident)` - -| Property | Description | Type | -| ---------- | --------------------------- | ------ | -| externalId | The id of the issue in Jira | string | - -#### `subActionParams (issueTypes)` - -No parameters for `issueTypes` sub-action. Provide an empty object `{}`. - -#### `subActionParams (fieldsByIssueType)` - -| Property | Description | Type | -| -------- | -------------------------------- | ------ | -| id | The id of the issue type in Jira | string | - -#### `subActionParams (issues)` - -| Property | Description | Type | -| -------- | ----------------------- | ------ | -| title | The title to search for | string | - -#### `subActionParams (issue)` - -| Property | Description | Type | -| -------- | --------------------------- | ------ | -| id | The id of the issue in Jira | string | - -#### `subActionParams (getFields)` - -No parameters for `getFields` sub-action. Provide an empty object `{}`. - -## IBM Resilient - -ID: `.resilient` - -### `config` - -| Property | Description | Type | -| -------- | --------------------------- | ------ | -| apiUrl | IBM Resilient instance URL. | string | - -### `secrets` - -| Property | Description | Type | -| ------------ | -------------------------------------------- | ------ | -| apiKeyId | API key ID for HTTP Basic authentication | string | -| apiKeySecret | API key secret for HTTP Basic authentication | string | - -### `params` - -| Property | Description | Type | -| --------------- | -------------------------------------------------------------------------------------------------- | ------ | -| subAction | The sub action to perform. It can be `pushToService`, `getFields`, `incidentTypes`, and `severity` | string | -| subActionParams | The parameters of the sub action | object | - -#### `subActionParams (pushToService)` - -| Property | Description | Type | -| -------- | ------------------------------------------------------------------------------------------------------------- | --------------------- | -| incident | The IBM Resilient incident. | object | -| comments | The comments of the case. A comment is of the form `{ commentId: string, version: string, comment: string }`. | object[] _(optional)_ | - -The following table describes the properties of the `incident` object. - -| Property | Description | Type | -| ------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------- | -| name | The title of the incident | string _(optional)_ | -| description | The description of the incident | string _(optional)_ | -| externalId | The id of the incident in IBM Resilient. If presented the incident will be update. Otherwise a new incident will be created. | string _(optional)_ | -| incidentTypes | An array with the ids of IBM Resilient incident types. | number[] _(optional)_ | -| severityCode | IBM Resilient id of the severity code. | number _(optional)_ | - -#### `subActionParams (getFields)` - -No parameters for `getFields` sub-action. Provide an empty object `{}`. - -#### `subActionParams (incidentTypes)` - -No parameters for `incidentTypes` sub-action. Provide an empty object `{}`. - -#### `subActionParams (severity)` - -No parameters for `severity` sub-action. Provide an empty object `{}`. +Kibana ships with a set of built-in action types. See [Actions and connector types Documentation](https://www.elastic.co/guide/en/kibana/master/action-types.html). # Command Line Utility @@ -801,4 +326,4 @@ Instead of `schema.maybe()`, use `schema.nullable()`, which is the same as `sche ## user interface -In order to make this action usable in the Kibana UI, you will need to provide all the UI editing aspects of the action. The existing action type user interfaces are defined in [`x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types`](../triggers_actions_ui/public/application/components/builtin_action_types). For more information, see the [UI documentation](../triggers_actions_ui/README.md#create-and-register-new-action-type-ui). \ No newline at end of file +To make this action usable in the Kibana UI, you will need to provide all the UI editing aspects of the action. The existing action type user interfaces are defined in [`x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types`](../triggers_actions_ui/public/application/components/builtin_action_types). For more information, see the [UI documentation](../triggers_actions_ui/README.md#create-and-register-new-action-type-ui). From 698a06aad2a1db4162572af26f63a21f916b296c Mon Sep 17 00:00:00 2001 From: Daniil Date: Wed, 24 Feb 2021 11:09:35 +0300 Subject: [PATCH 27/45] Fix text align in Safari (#92374) --- .../public/application/components/visualize_listing.scss | 4 ++++ .../visualize/public/application/utils/get_table_columns.tsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/visualize/public/application/components/visualize_listing.scss b/src/plugins/visualize/public/application/components/visualize_listing.scss index 8eb2a8911ee02..c3b0df67e317d 100644 --- a/src/plugins/visualize/public/application/components/visualize_listing.scss +++ b/src/plugins/visualize/public/application/components/visualize_listing.scss @@ -16,6 +16,10 @@ margin-left: $euiSizeS; } +.visListingTable__titleLink { + text-align: left; +} + .visListingCallout { max-width: 1000px; width: 100%; diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index 930d3b7ce1890..ac8fee452aa6c 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -85,7 +85,7 @@ export const getTableColumns = ( render: (field: string, { editApp, editUrl, title, error }: VisualizationListItem) => // In case an error occurs i.e. the vis has wrong type, we render the vis but without the link !error ? ( - + Date: Wed, 24 Feb 2021 13:12:55 +0300 Subject: [PATCH 28/45] [TSVB] Enable `dual mode`, support index patterns and strings (#92395) Part of #91367 Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/lib/get_fields.ts | 1 - .../server/lib/get_vis_data.ts | 1 - .../lib/get_index_pattern.ts | 32 +++++++++++++ .../abstract_search_strategy.test.ts | 1 + .../strategies/abstract_search_strategy.ts | 18 ++++--- .../annotations/get_request_params.js | 11 +++-- .../server/lib/vis_data/get_table_data.js | 7 ++- .../lib/vis_data/helpers/get_index_pattern.js | 48 ------------------- .../lib/vis_data/series/get_request_params.js | 7 ++- 9 files changed, 59 insertions(+), 67 deletions(-) create mode 100644 src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/get_index_pattern.ts delete mode 100644 src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_index_pattern.js diff --git a/src/plugins/vis_type_timeseries/server/lib/get_fields.ts b/src/plugins/vis_type_timeseries/server/lib/get_fields.ts index 4b58624a7d1a4..dd74a6c780f4b 100644 --- a/src/plugins/vis_type_timeseries/server/lib/get_fields.ts +++ b/src/plugins/vis_type_timeseries/server/lib/get_fields.ts @@ -47,7 +47,6 @@ export async function getFields( ), }, getUiSettingsService: () => requestContext.core.uiSettings.client, - getSavedObjectsClient: () => requestContext.core.savedObjects.client, getEsShardTimeout: async () => { return await framework.globalConfig$ .pipe( diff --git a/src/plugins/vis_type_timeseries/server/lib/get_vis_data.ts b/src/plugins/vis_type_timeseries/server/lib/get_vis_data.ts index 4c4e1d4603763..f99d02d00b2ef 100644 --- a/src/plugins/vis_type_timeseries/server/lib/get_vis_data.ts +++ b/src/plugins/vis_type_timeseries/server/lib/get_vis_data.ts @@ -52,7 +52,6 @@ export function getVisData( pre: {}, payload: request.body, getUiSettingsService: () => requestContext.core.uiSettings.client, - getSavedObjectsClient: () => requestContext.core.savedObjects.client, getEsShardTimeout: async () => { return await framework.globalConfig$ .pipe( diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/get_index_pattern.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/get_index_pattern.ts new file mode 100644 index 0000000000000..512494de290fd --- /dev/null +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/get_index_pattern.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { IndexPatternsService, IndexPattern } from '../../../../../data/server'; + +interface IndexPatternObjectDependencies { + indexPatternsService: IndexPatternsService; +} +export async function getIndexPatternObject( + indexPatternString: string, + { indexPatternsService }: IndexPatternObjectDependencies +) { + let indexPatternObject: IndexPattern | undefined | null; + + if (!indexPatternString) { + indexPatternObject = await indexPatternsService.getDefault(); + } else { + indexPatternObject = (await indexPatternsService.find(indexPatternString)).find( + (index) => index.title === indexPatternString + ); + } + + return { + indexPatternObject, + indexPatternString: indexPatternObject?.title || indexPatternString || '', + }; +} diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts index 017fa6837f562..774ef19ef1cd7 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts @@ -36,6 +36,7 @@ describe('AbstractSearchStrategy', () => { getIndexPatternsService: jest.fn(() => Promise.resolve({ find: jest.fn(() => []), + getDefault: jest.fn(() => {}), }) ), } as unknown) as ReqFacade; diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts index 620f494021f0f..dec0330bde6fc 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { FakeRequest, IUiSettingsClient, SavedObjectsClientContract } from 'kibana/server'; +import type { FakeRequest, IUiSettingsClient } from 'kibana/server'; import { indexPatterns, IndexPatternsFetcher } from '../../../../../data/server'; @@ -14,6 +14,7 @@ import type { Framework } from '../../../plugin'; import type { FieldSpec, IndexPatternsService } from '../../../../../data/common'; import type { VisPayload, SanitizedFieldType } from '../../../../common/types'; import type { VisTypeTimeseriesRequestHandlerContext } from '../../../types'; +import { getIndexPatternObject } from '../lib/get_index_pattern'; /** * ReqFacade is a regular KibanaRequest object extended with additional service @@ -29,7 +30,6 @@ export interface ReqFacade extends FakeRequest { indexPatternsFetcher?: IndexPatternsFetcher; }; getUiSettingsService: () => IUiSettingsClient; - getSavedObjectsClient: () => SavedObjectsClientContract; getEsShardTimeout: () => Promise; getIndexPatternsService: () => Promise; } @@ -89,16 +89,14 @@ export abstract class AbstractSearchStrategy { rollupIndex: string; }> ) { - const { indexPatternsFetcher } = req.pre; - const indexPatternsService = await req.getIndexPatternsService(); - const kibanaIndexPattern = (await indexPatternsService.find(indexPattern)).find( - (index) => index.title === indexPattern - ); + const { indexPatternObject } = await getIndexPatternObject(indexPattern, { + indexPatternsService: await req.getIndexPatternsService(), + }); return toSanitizedFieldType( - kibanaIndexPattern - ? kibanaIndexPattern.getNonScriptedFields() - : await indexPatternsFetcher!.getFieldsForWildcard({ + indexPatternObject + ? indexPatternObject.getNonScriptedFields() + : await req.pre.indexPatternsFetcher!.getFieldsForWildcard({ pattern: indexPattern, fieldCapsOptions: { allow_no_indices: true }, metaFields: [], diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/annotations/get_request_params.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/annotations/get_request_params.js index b3287957801a3..49697205a8582 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/annotations/get_request_params.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/annotations/get_request_params.js @@ -8,7 +8,7 @@ import { buildAnnotationRequest } from './build_request_body'; import { getEsShardTimeout } from '../helpers/get_es_shard_timeout'; -import { getIndexPatternObject } from '../helpers/get_index_pattern'; +import { getIndexPatternObject } from '../../search_strategies/lib/get_index_pattern'; export async function getAnnotationRequestParams( req, @@ -19,8 +19,13 @@ export async function getAnnotationRequestParams( ) { const uiSettings = req.getUiSettingsService(); const esShardTimeout = await getEsShardTimeout(req); - const indexPattern = annotation.index_pattern; - const { indexPatternObject, indexPatternString } = await getIndexPatternObject(req, indexPattern); + const { indexPatternObject, indexPatternString } = await getIndexPatternObject( + annotation.index_pattern, + { + indexPatternsService: await req.getIndexPatternsService(), + } + ); + const request = await buildAnnotationRequest( req, panel, diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.js index 97015db5d435c..e0604145eef33 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.js @@ -11,7 +11,7 @@ import { handleErrorResponse } from './handle_error_response'; import { get } from 'lodash'; import { processBucket } from './table/process_bucket'; import { getEsQueryConfig } from './helpers/get_es_query_uisettings'; -import { getIndexPatternObject } from './helpers/get_index_pattern'; +import { getIndexPatternObject } from '../search_strategies/lib/get_index_pattern'; import { createFieldsFetcher } from './helpers/fields_fetcher'; import { extractFieldLabel } from '../../../common/calculate_label'; @@ -23,7 +23,10 @@ export async function getTableData(req, panel) { capabilities, } = await req.framework.searchStrategyRegistry.getViableStrategy(req, panelIndexPattern); const esQueryConfig = await getEsQueryConfig(req); - const { indexPatternObject } = await getIndexPatternObject(req, panelIndexPattern); + const { indexPatternObject } = await getIndexPatternObject(panelIndexPattern, { + indexPatternsService: await req.getIndexPatternsService(), + }); + const extractFields = createFieldsFetcher(req, searchStrategy, capabilities); const calculatePivotLabel = async () => { diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_index_pattern.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_index_pattern.js deleted file mode 100644 index bddd7a7011612..0000000000000 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_index_pattern.js +++ /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 - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { get } from 'lodash'; - -export async function getIndexPatternObject(req, indexPatternString) { - let defaultIndex; - - if (!indexPatternString) { - defaultIndex = await req.getUiSettingsService().get('defaultIndex'); - } - - // getting the matching index pattern - const savedObjectClient = req.getSavedObjectsClient(); - const indexPatternObjects = await savedObjectClient.find({ - type: 'index-pattern', - fields: ['title', 'fields', 'timeFieldName'], - search: indexPatternString ? `"${indexPatternString}"` : null, - search_fields: ['title'], - }); - - // getting the index pattern fields - const indexPatterns = indexPatternObjects.saved_objects - .filter( - (obj) => - obj.attributes.title === indexPatternString || (defaultIndex && obj.id === defaultIndex) - ) - .map((indexPattern) => { - const { title, fields, timeFieldName } = indexPattern.attributes; - return { - title, - timeFieldName, - fields: JSON.parse(fields), - }; - }); - - const indexPatternObject = indexPatterns.length === 1 ? indexPatterns[0] : null; - - return { - indexPatternObject, - indexPatternString: indexPatternString || get(indexPatternObject, 'title', ''), - }; -} diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/series/get_request_params.js b/src/plugins/vis_type_timeseries/server/lib/vis_data/series/get_request_params.js index cb9561847b90b..ca4676d363a15 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/series/get_request_params.js +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/series/get_request_params.js @@ -8,13 +8,16 @@ import { buildRequestBody } from './build_request_body'; import { getEsShardTimeout } from '../helpers/get_es_shard_timeout'; -import { getIndexPatternObject } from '../helpers/get_index_pattern'; +import { getIndexPatternObject } from '../../../lib/search_strategies/lib/get_index_pattern'; export async function getSeriesRequestParams(req, panel, series, esQueryConfig, capabilities) { const uiSettings = req.getUiSettingsService(); const indexPattern = (series.override_index_pattern && series.series_index_pattern) || panel.index_pattern; - const { indexPatternObject, indexPatternString } = await getIndexPatternObject(req, indexPattern); + + const { indexPatternObject, indexPatternString } = await getIndexPatternObject(indexPattern, { + indexPatternsService: await req.getIndexPatternsService(), + }); const request = await buildRequestBody( req, From f0a9b7af45a5ec33ac20c7d947630f9392f706f0 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 24 Feb 2021 13:36:12 +0200 Subject: [PATCH 29/45] Fix timelion deprecation documentation links (#92576) --- src/core/public/doc_links/doc_links_service.ts | 2 +- src/plugins/timelion/server/plugin.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 23534b3cf9210..7792e25e54d01 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -175,7 +175,7 @@ export class DocLinksService { }, visualize: { guide: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/dashboard.html`, - timelionDeprecation: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/dashboard.html#timelion-deprecation`, + timelionDeprecation: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/create-panels-with-timelion.html`, lens: `${ELASTIC_WEBSITE_URL}what-is/kibana-lens`, lensPanels: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/dashboard.html#create-panels-with-lens`, maps: `${ELASTIC_WEBSITE_URL}maps`, diff --git a/src/plugins/timelion/server/plugin.ts b/src/plugins/timelion/server/plugin.ts index 2fb3918c17089..66348c572117d 100644 --- a/src/plugins/timelion/server/plugin.ts +++ b/src/plugins/timelion/server/plugin.ts @@ -31,7 +31,7 @@ const showWarningMessageIfTimelionSheetWasFound = (core: CoreStart, logger: Logg ({ total }) => total && logger.warn( - 'Deprecated since 7.0, the Timelion app will be removed in 8.0. To continue using your Timelion worksheets, migrate them to a dashboard. See https://www.elastic.co/guide/en/kibana/master/dashboard.html#timelion-deprecation.' + 'Deprecated since 7.0, the Timelion app will be removed in 8.0. To continue using your Timelion worksheets, migrate them to a dashboard. See https://www.elastic.co/guide/en/kibana/current/create-panels-with-timelion.html.' ) ); }; From fd9e159816295b4c642a61634ae5b2310aaaeade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Wed, 24 Feb 2021 12:21:40 +0000 Subject: [PATCH 30/45] [Usage Collection] Remove unused UI Metric APIs (#91620) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/core/TESTING.md | 11 ++++++++--- src/plugins/data/public/public.api.md | 1 - .../delete_field_provider/get_delete_provider.tsx | 7 ++----- .../field_editor_flyout_content_container.tsx | 13 +++---------- src/plugins/usage_collection/public/mocks.tsx | 4 +--- src/plugins/usage_collection/public/plugin.tsx | 15 ++------------- .../public/application/services/ui_metric.ts | 3 ++- 7 files changed, 18 insertions(+), 36 deletions(-) diff --git a/src/core/TESTING.md b/src/core/TESTING.md index a0fd0a6ffc255..ef6db57c1a993 100644 --- a/src/core/TESTING.md +++ b/src/core/TESTING.md @@ -830,6 +830,7 @@ data. ```typescript // src/plugins/myplugin/public/plugin.ts +import { METRIC_TYPE } from '@kbn/analytics'; import { CoreSetup, CoreStart, Plugin } from 'kibana/public'; import { DataPublicPluginSetup, DataPublicPluginStart } from '../../data/public'; import { UsageCollectionSetup } from '../../usage_collection/public'; @@ -853,8 +854,10 @@ export class MyPlugin implements Plugin { @@ -1090,8 +1095,8 @@ describe('Plugin', () => { plugin.setup(coreSetup, setupDeps); - expect(usageCollectionSetup.allowTrackUserAgent).toHaveBeenCalledTimes(1); - expect(usageCollectionSetup.allowTrackUserAgent).toHaveBeenCalledWith(true); + expect(usageCollectionSetup.reportUiCounter).toHaveBeenCalledTimes(2); + expect(usageCollectionSetup.reportUiCounter).toHaveBeenCalledWith('my_plugin', METRIC_TYPE.LOADED, 'my_event'); }); }); ``` diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 63b766a82e8e6..05e5c8577ebe3 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -60,7 +60,6 @@ import { LocationDescriptorObject } from 'history'; import { Logger } from '@kbn/logging'; import { LogMeta } from '@kbn/logging'; import { MaybePromise } from '@kbn/utility-types'; -import { METRIC_TYPE } from '@kbn/analytics'; import { Moment } from 'moment'; import moment from 'moment'; import { NameList } from 'elasticsearch'; diff --git a/src/plugins/index_pattern_field_editor/public/components/delete_field_provider/get_delete_provider.tsx b/src/plugins/index_pattern_field_editor/public/components/delete_field_provider/get_delete_provider.tsx index c8f1ad9035761..c5d17f4cf8d8d 100644 --- a/src/plugins/index_pattern_field_editor/public/components/delete_field_provider/get_delete_provider.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/delete_field_provider/get_delete_provider.tsx @@ -9,6 +9,7 @@ import React, { useCallback } from 'react'; import { i18n } from '@kbn/i18n'; +import { METRIC_TYPE } from '@kbn/analytics'; import { NotificationsStart } from 'src/core/public'; import { IndexPattern, UsageCollectionStart } from '../../shared_imports'; import { pluginName } from '../../constants'; @@ -33,11 +34,7 @@ export const getDeleteProvider = ( }); try { - usageCollection.reportUiCounter( - pluginName, - usageCollection.METRIC_TYPE.COUNT, - 'delete_runtime' - ); + usageCollection.reportUiCounter(pluginName, METRIC_TYPE.COUNT, 'delete_runtime'); // eslint-disable-next-line no-empty } catch {} diff --git a/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx b/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx index ade25424c2250..e01b3f9bb422c 100644 --- a/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx @@ -9,6 +9,7 @@ import React, { useCallback, useEffect, useState, useMemo } from 'react'; import { DocLinksStart, NotificationsStart, CoreStart } from 'src/core/public'; import { i18n } from '@kbn/i18n'; +import { METRIC_TYPE } from '@kbn/analytics'; import { IndexPatternField, @@ -98,11 +99,7 @@ export const FieldEditorFlyoutContentContainer = ({ if (fieldTypeToProcess === 'runtime') { try { - usageCollection.reportUiCounter( - pluginName, - usageCollection.METRIC_TYPE.COUNT, - 'save_runtime' - ); + usageCollection.reportUiCounter(pluginName, METRIC_TYPE.COUNT, 'save_runtime'); // eslint-disable-next-line no-empty } catch {} // rename an existing runtime field @@ -116,11 +113,7 @@ export const FieldEditorFlyoutContentContainer = ({ }); } else { try { - usageCollection.reportUiCounter( - pluginName, - usageCollection.METRIC_TYPE.COUNT, - 'save_concrete' - ); + usageCollection.reportUiCounter(pluginName, METRIC_TYPE.COUNT, 'save_concrete'); // eslint-disable-next-line no-empty } catch {} } diff --git a/src/plugins/usage_collection/public/mocks.tsx b/src/plugins/usage_collection/public/mocks.tsx index 72cefaf026490..268ed3316542e 100644 --- a/src/plugins/usage_collection/public/mocks.tsx +++ b/src/plugins/usage_collection/public/mocks.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ApplicationUsageTracker } from '@kbn/analytics'; -import { UsageCollectionSetup, METRIC_TYPE } from '.'; +import { UsageCollectionSetup } from '.'; import { ApplicationUsageContext } from './components/track_application_view'; export type Setup = jest.Mocked; @@ -33,9 +33,7 @@ const createSetupContract = (): Setup => { ), }, applicationUsageTracker: applicationUsageTrackerMock, - allowTrackUserAgent: jest.fn(), reportUiCounter: jest.fn(), - METRIC_TYPE, }; return setupContract; diff --git a/src/plugins/usage_collection/public/plugin.tsx b/src/plugins/usage_collection/public/plugin.tsx index 6d1eb751d907a..79260b17e0c82 100644 --- a/src/plugins/usage_collection/public/plugin.tsx +++ b/src/plugins/usage_collection/public/plugin.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { Reporter, METRIC_TYPE, ApplicationUsageTracker } from '@kbn/analytics'; +import { Reporter, ApplicationUsageTracker } from '@kbn/analytics'; import type { Subscription } from 'rxjs'; import React from 'react'; import type { @@ -35,15 +35,12 @@ export interface UsageCollectionSetup { components: { ApplicationUsageTrackingProvider: React.FC; }; - allowTrackUserAgent: (allow: boolean) => void; applicationUsageTracker: IApplicationUsageTracker; reportUiCounter: Reporter['reportUiCounter']; - METRIC_TYPE: typeof METRIC_TYPE; } export interface UsageCollectionStart { reportUiCounter: Reporter['reportUiCounter']; - METRIC_TYPE: typeof METRIC_TYPE; applicationUsageTracker: Pick< ApplicationUsageTracker, 'trackApplicationViewUsage' | 'flushTrackedView' | 'updateViewClickCounter' @@ -57,7 +54,6 @@ export function isUnauthenticated(http: HttpSetup) { export class UsageCollectionPlugin implements Plugin { private applicationUsageTracker?: ApplicationUsageTracker; - private trackUserAgent: boolean = true; private subscriptions: Subscription[] = []; private reporter?: Reporter; private config: PublicConfigType; @@ -88,11 +84,7 @@ export class UsageCollectionPlugin implements Plugin { - this.trackUserAgent = allow; - }, reportUiCounter: this.reporter.reportUiCounter, - METRIC_TYPE, }; } @@ -110,14 +102,11 @@ export class UsageCollectionPlugin implements Plugin Date: Wed, 24 Feb 2021 14:08:26 +0100 Subject: [PATCH 31/45] Add metricbeat steps to jenkins_build_load_testing.sh (#90290) * Update jenkins_build_load_testing.sh * Change variables name * Change to tar.gz package * change install location * Rename folder * Debug and new folder name * fix debug * Fix path not changed * more logging * add cat logs * more logging and skipping tests for debug * Update jenkins_build_load_testing.sh * Update jenkins_build_load_testing.sh * Fix kibana_dir var * Change log file path * Update jenkins_build_load_testing.sh * Update jenkins_build_load_testing.sh * Fix metricbeat start * Remove extra ls logging * Changing to MB 7.11.0 * Fix package name * Fix wrong copy * Add vault credentials for stats * Adding system data and removing log * Update jenkins_build_load_testing.sh Update script * Update jenkins_build_load_testing.sh Remove `ls` commands Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Dmitry --- test/scripts/jenkins_build_load_testing.sh | 54 ++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/test/scripts/jenkins_build_load_testing.sh b/test/scripts/jenkins_build_load_testing.sh index 659321f1d3975..a635e34bcbeda 100755 --- a/test/scripts/jenkins_build_load_testing.sh +++ b/test/scripts/jenkins_build_load_testing.sh @@ -15,10 +15,48 @@ if [[ ! "$TASK_QUEUE_PROCESS_ID" ]]; then ./test/scripts/jenkins_xpack_build_plugins.sh fi +echo " -> Configure Metricbeat monitoring" +# Configure Metricbeat monitoring for Kibana and ElasticSearch, ingest monitoring data into Kibana Stats cluster +# Getting the URL +TOP="$(curl -L http://snapshots.elastic.co/latest/master.json)" +MB_BUILD=$(echo $TOP | sed 's/.*"version" : "\(.*\)", "build_id.*/\1/') +echo $MB_BUILD +MB_BUILD_ID=$(echo $TOP | sed 's/.*"build_id" : "\(.*\)", "manifest_url.*/\1/') + +URL=https://snapshots.elastic.co/${MB_BUILD_ID}/downloads/beats/metricbeat/metricbeat-${MB_BUILD}-linux-x86_64.tar.gz +URL=https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.0-linux-x86_64.tar.gz +echo $URL +# Downloading the Metricbeat package +while [ 1 ]; do + wget -q --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -t 0 --continue --no-check-certificate --tries=3 $URL + if [ $? = 0 ]; then break; fi; # check return value, break if successful (0) + sleep 1s; +done; + +# Install Metricbeat +echo "untar metricbeat and config" +#tar -xzf metricbeat-${MB_BUILD}-linux-x86_64.tar.gz +tar -xzf metricbeat-7.11.0-linux-x86_64.tar.gz +#mv metricbeat-${MB_BUILD}-linux-x86_64 metricbeat-install +mv metricbeat-7.11.0-linux-x86_64 metricbeat-install + +# Configure Metricbeat +echo " -> Changing metricbeat config" +pushd ../kibana-load-testing +cp cfg/metricbeat/elasticsearch-xpack.yml $KIBANA_DIR/metricbeat-install/modules.d/elasticsearch-xpack.yml +cp cfg/metricbeat/kibana-xpack.yml $KIBANA_DIR/metricbeat-install/modules.d/kibana-xpack.yml +echo "fields.build: ${BUILD_ID}" >> cfg/metricbeat/metricbeat.yml +echo "path.config: ${KIBANA_DIR}/metricbeat-install" >> cfg/metricbeat/metricbeat.yml +echo "cloud.auth: ${USER_FROM_VAULT}:${PASS_FROM_VAULT}" >> cfg/metricbeat/metricbeat.yml +cp cfg/metricbeat/metricbeat.yml $KIBANA_DIR/metricbeat-install/metricbeat.yml +# Disable system monitoring: enabled for now to have more data +#mv $KIBANA_DIR/metricbeat-install/modules.d/system.yml $KIBANA_DIR/metricbeat-install/modules.d/system.yml.disabled +popd + # doesn't persist, also set in kibanaPipeline.groovy export KBN_NP_PLUGINS_BUILT=true -echo " -> building and extracting default Kibana distributable for use in functional tests" +echo " -> Building and extracting default Kibana distributable for use in functional tests" cd "$KIBANA_DIR" node scripts/build --debug --no-oss linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" @@ -29,11 +67,21 @@ tar -xzf "$linuxBuild" -C "$installDir" --strip=1 mkdir -p "$WORKSPACE/kibana-build-xpack" cp -pR install/kibana/. $WORKSPACE/kibana-build-xpack/ -echo " -> test setup" +echo " -> Setup env for tests" source test/scripts/jenkins_test_setup_xpack.sh -echo " -> run gatling load testing" +# Start Metricbeat +echo " -> Starting metricbeat" +pushd $KIBANA_DIR/metricbeat-install +nohup ./metricbeat > metricbeat.log 2>&1 & +popd + +echo " -> Running gatling load testing" export GATLING_SIMULATIONS="$simulations" node scripts/functional_tests \ --kibana-install-dir "$KIBANA_INSTALL_DIR" \ --config test/load/config.ts + +# Show output of Metricbeat. Disabled. Enable for debug purposes +#echo "output of metricbeat.log" +#cat $KIBANA_DIR/metricbeat-install/metricbeat.log From fdc637df83610d2fbe9dba61bd30257076dbf154 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Wed, 24 Feb 2021 14:50:30 +0100 Subject: [PATCH 32/45] [Discover] Fix sorting by _score behavior (#92132) --- .../discover/public/__mocks__/config.ts | 5 +- .../angular/doc_table/actions/columns.test.ts | 78 +++++++++++++++++++ .../angular/doc_table/actions/columns.ts | 10 ++- .../application/components/discover.tsx | 3 +- 4 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/plugins/discover/public/application/angular/doc_table/actions/columns.test.ts diff --git a/src/plugins/discover/public/__mocks__/config.ts b/src/plugins/discover/public/__mocks__/config.ts index a79c56aa77f3b..977dc5699a57a 100644 --- a/src/plugins/discover/public/__mocks__/config.ts +++ b/src/plugins/discover/public/__mocks__/config.ts @@ -6,12 +6,15 @@ * Side Public License, v 1. */ -import { IUiSettingsClient } from '../../../../core/public'; +import { IUiSettingsClient } from 'kibana/public'; +import { SORT_DEFAULT_ORDER_SETTING } from '../../common'; export const configMock = ({ get: (key: string) => { if (key === 'defaultIndex') { return 'the-index-pattern-id'; + } else if (key === SORT_DEFAULT_ORDER_SETTING) { + return 'desc'; } return ''; diff --git a/src/plugins/discover/public/application/angular/doc_table/actions/columns.test.ts b/src/plugins/discover/public/application/angular/doc_table/actions/columns.test.ts new file mode 100644 index 0000000000000..43044d08f6ac0 --- /dev/null +++ b/src/plugins/discover/public/application/angular/doc_table/actions/columns.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { getStateColumnActions } from './columns'; +import { configMock } from '../../../../__mocks__/config'; +import { indexPatternMock } from '../../../../__mocks__/index_pattern'; +import { indexPatternsMock } from '../../../../__mocks__/index_patterns'; +import { Capabilities } from '../../../../../../../core/types'; +import { AppState } from '../../discover_state'; + +function getStateColumnAction(state: {}, setAppState: (state: Partial) => void) { + return getStateColumnActions({ + capabilities: ({ + discover: { + save: false, + }, + } as unknown) as Capabilities, + config: configMock, + indexPattern: indexPatternMock, + indexPatterns: indexPatternsMock, + useNewFieldsApi: true, + setAppState, + state, + }); +} + +describe('Test column actions', () => { + test('getStateColumnActions with empty state', () => { + const setAppState = jest.fn(); + const actions = getStateColumnAction({}, setAppState); + + actions.onAddColumn('_score'); + expect(setAppState).toHaveBeenCalledWith({ columns: ['_score'], sort: [['_score', 'desc']] }); + actions.onAddColumn('test'); + expect(setAppState).toHaveBeenCalledWith({ columns: ['test'] }); + }); + test('getStateColumnActions with columns and sort in state', () => { + const setAppState = jest.fn(); + const actions = getStateColumnAction( + { columns: ['first', 'second'], sort: [['first', 'desc']] }, + setAppState + ); + + actions.onAddColumn('_score'); + expect(setAppState).toHaveBeenCalledWith({ + columns: ['first', 'second', '_score'], + sort: [['first', 'desc']], + }); + setAppState.mockClear(); + actions.onAddColumn('third'); + expect(setAppState).toHaveBeenCalledWith({ + columns: ['first', 'second', 'third'], + sort: [['first', 'desc']], + }); + setAppState.mockClear(); + actions.onRemoveColumn('first'); + expect(setAppState).toHaveBeenCalledWith({ + columns: ['second'], + sort: [], + }); + setAppState.mockClear(); + actions.onSetColumns(['first', 'second', 'third']); + expect(setAppState).toHaveBeenCalledWith({ + columns: ['first', 'second', 'third'], + }); + setAppState.mockClear(); + + actions.onMoveColumn('second', 0); + expect(setAppState).toHaveBeenCalledWith({ + columns: ['second', 'first'], + }); + }); +}); diff --git a/src/plugins/discover/public/application/angular/doc_table/actions/columns.ts b/src/plugins/discover/public/application/angular/doc_table/actions/columns.ts index 53ced59b17c5d..8028aa6c08634 100644 --- a/src/plugins/discover/public/application/angular/doc_table/actions/columns.ts +++ b/src/plugins/discover/public/application/angular/doc_table/actions/columns.ts @@ -5,10 +5,11 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { Capabilities } from 'kibana/public'; +import { Capabilities, IUiSettingsClient } from 'kibana/public'; import { popularizeField } from '../../../helpers/popularize_field'; import { IndexPattern, IndexPatternsContract } from '../../../../kibana_services'; import { AppState } from '../../discover_state'; +import { SORT_DEFAULT_ORDER_SETTING } from '../../../../../common'; /** * Helper function to provide a fallback to a single _source column if the given array of columns @@ -54,6 +55,7 @@ export function moveColumn(columns: string[], columnName: string, newIndex: numb export function getStateColumnActions({ capabilities, + config, indexPattern, indexPatterns, useNewFieldsApi, @@ -61,6 +63,7 @@ export function getStateColumnActions({ state, }: { capabilities: Capabilities; + config: IUiSettingsClient; indexPattern: IndexPattern; indexPatterns: IndexPatternsContract; useNewFieldsApi: boolean; @@ -72,7 +75,10 @@ export function getStateColumnActions({ popularizeField(indexPattern, columnName, indexPatterns); } const columns = addColumn(state.columns || [], columnName, useNewFieldsApi); - setAppState({ columns }); + const defaultOrder = config.get(SORT_DEFAULT_ORDER_SETTING); + const sort = + columnName === '_score' && !state.sort?.length ? [['_score', defaultOrder]] : state.sort; + setAppState({ columns, sort }); } function onRemoveColumn(columnName: string) { diff --git a/src/plugins/discover/public/application/components/discover.tsx b/src/plugins/discover/public/application/components/discover.tsx index d0c839aac5a6c..1c4a5be2f2b24 100644 --- a/src/plugins/discover/public/application/components/discover.tsx +++ b/src/plugins/discover/public/application/components/discover.tsx @@ -104,13 +104,14 @@ export function Discover({ () => getStateColumnActions({ capabilities, + config, indexPattern, indexPatterns, setAppState, state, useNewFieldsApi, }), - [capabilities, indexPattern, indexPatterns, setAppState, state, useNewFieldsApi] + [capabilities, config, indexPattern, indexPatterns, setAppState, state, useNewFieldsApi] ); const onOpenInspector = useCallback(() => { From 06418ae523176c6dad125a50db22719f20ae1a94 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Wed, 24 Feb 2021 08:27:56 -0600 Subject: [PATCH 33/45] Put environment back in uiFilters (#92561) `environment` is still used in `uiFilters` in UX, but not anywhere else. It was removed when removing environment from UI filters for the rest of APM and broke UX's environment switcher. Put it back. --- .../public/context/url_params_context/url_params_context.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx index bb29d1c40b5e2..1da57ac10a20c 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx +++ b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx @@ -35,7 +35,10 @@ function useUiFilters(params: IUrlParams): UIFilters { (val) => (val ? val.split(',') : []) ) as Partial>; - return useDeepObjectIdentity(localUiFilters); + return useDeepObjectIdentity({ + environment: params.environment, + ...localUiFilters, + }); } const defaultRefresh = (_time: TimeRange) => {}; From a3f7b1d55ae5ad3d9a729a05bf5e50b82379a587 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 24 Feb 2021 15:47:11 +0100 Subject: [PATCH 34/45] [Lens] Fix sorting undefined, null and NaN values (#92575) --- .../datatable_visualization/sorting.test.tsx | 146 +++++++++++++++++- .../datatable_visualization/sorting.tsx | 45 ++++-- 2 files changed, 181 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/lens/public/datatable_visualization/sorting.test.tsx b/x-pack/plugins/lens/public/datatable_visualization/sorting.test.tsx index ed93ddddd39f4..f5d457db65234 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/sorting.test.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/sorting.test.tsx @@ -19,18 +19,20 @@ function testSorting({ direction, type, keepLast, + reverseOutput = true, }: { input: unknown[]; output: unknown[]; direction: 'asc' | 'desc'; type: DatatableColumnType | 'range'; keepLast?: boolean; // special flag to handle values that should always be last no matter the direction + reverseOutput?: boolean; }) { const datatable = input.map((v) => ({ a: v, })); const sorted = output.map((v) => ({ a: v })); - if (direction === 'desc') { + if (direction === 'desc' && reverseOutput) { sorted.reverse(); if (keepLast) { // Cycle shift of the first element @@ -64,6 +66,44 @@ describe('Data sorting criteria', () => { }); }); } + + it(`should sort undefined and null to the end`, () => { + const now = Date.now(); + testSorting({ + input: [null, now, 0, undefined, null, now - 150000], + output: [0, now - 150000, now, null, undefined, null], + direction: 'asc', + type: 'date', + reverseOutput: false, + }); + + testSorting({ + input: [null, now, 0, undefined, null, now - 150000], + output: [now, now - 150000, 0, null, undefined, null], + direction: 'desc', + type: 'date', + reverseOutput: false, + }); + }); + + it(`should sort NaN to the end`, () => { + const now = Date.now(); + testSorting({ + input: [null, now, 0, undefined, Number.NaN, now - 150000], + output: [0, now - 150000, now, null, undefined, Number.NaN], + direction: 'asc', + type: 'number', + reverseOutput: false, + }); + + testSorting({ + input: [null, now, 0, undefined, Number.NaN, now - 150000], + output: [now, now - 150000, 0, null, undefined, Number.NaN], + direction: 'desc', + type: 'number', + reverseOutput: false, + }); + }); }); describe('String or anything else as string', () => { @@ -86,6 +126,39 @@ describe('Data sorting criteria', () => { }); }); } + + it('should sort undefined and null to the end', () => { + testSorting({ + input: ['a', null, 'b', 'c', undefined, 'd', '12'], + output: ['12', 'a', 'b', 'c', 'd', null, undefined], + direction: 'asc', + type: 'string', + reverseOutput: false, + }); + + testSorting({ + input: ['a', null, 'b', 'c', undefined, 'd', '12'], + output: ['d', 'c', 'b', 'a', '12', null, undefined], + direction: 'desc', + type: 'string', + reverseOutput: false, + }); + + testSorting({ + input: [true, null, false, undefined, false], + output: [false, false, true, null, undefined], + direction: 'asc', + type: 'boolean', + reverseOutput: false, + }); + testSorting({ + input: [true, null, false, undefined, false], + output: [true, false, false, null, undefined], + direction: 'desc', + type: 'boolean', + reverseOutput: false, + }); + }); }); describe('IP sorting', () => { @@ -154,6 +227,60 @@ describe('Data sorting criteria', () => { }); }); } + + it('should sort undefined and null to the end', () => { + testSorting({ + input: [ + 'fc00::123', + '192.168.1.50', + null, + undefined, + 'Other', + '10.0.1.76', + '8.8.8.8', + '::1', + ], + output: [ + '::1', + '8.8.8.8', + '10.0.1.76', + '192.168.1.50', + 'fc00::123', + 'Other', + null, + undefined, + ], + direction: 'asc', + type: 'ip', + reverseOutput: false, + }); + + testSorting({ + input: [ + 'fc00::123', + '192.168.1.50', + null, + undefined, + 'Other', + '10.0.1.76', + '8.8.8.8', + '::1', + ], + output: [ + 'fc00::123', + '192.168.1.50', + '10.0.1.76', + '8.8.8.8', + '::1', + 'Other', + null, + undefined, + ], + direction: 'desc', + type: 'ip', + reverseOutput: false, + }); + }); }); describe('Range sorting', () => { @@ -184,5 +311,22 @@ describe('Data sorting criteria', () => { }); }); } + + it('should sort undefined and null to the end', () => { + testSorting({ + input: [{ gte: 1, lt: 5 }, undefined, { gte: 0, lt: 5 }, null, { gte: 0 }], + output: [{ gte: 0, lt: 5 }, { gte: 0 }, { gte: 1, lt: 5 }, undefined, null], + direction: 'asc', + type: 'range', + reverseOutput: false, + }); + testSorting({ + input: [{ gte: 1, lt: 5 }, undefined, { gte: 0, lt: 5 }, null, { gte: 0 }], + output: [{ gte: 1, lt: 5 }, { gte: 0 }, { gte: 0, lt: 5 }, undefined, null], + direction: 'desc', + type: 'range', + reverseOutput: false, + }); + }); }); }); diff --git a/x-pack/plugins/lens/public/datatable_visualization/sorting.tsx b/x-pack/plugins/lens/public/datatable_visualization/sorting.tsx index 9c3716827f54f..0859ab5428c9e 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/sorting.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/sorting.tsx @@ -62,6 +62,8 @@ function getRangeCriteria(sortBy: string, directionFactor: number) { }; } +type CompareFn = (rowA: Record, rowB: Record) => number; + export function getSortingCriteria( type: string | undefined, sortBy: string, @@ -71,22 +73,47 @@ export function getSortingCriteria( // handle the direction with a multiply factor. const directionFactor = direction === 'asc' ? 1 : -1; + let criteria: CompareFn; + if (['number', 'date'].includes(type || '')) { - return (rowA: Record, rowB: Record) => + criteria = (rowA: Record, rowB: Record) => directionFactor * ((rowA[sortBy] as number) - (rowB[sortBy] as number)); } // this is a custom type, and can safely assume the gte and lt fields are all numbers or undefined - if (type === 'range') { - return getRangeCriteria(sortBy, directionFactor); + else if (type === 'range') { + criteria = getRangeCriteria(sortBy, directionFactor); } // IP have a special sorting - if (type === 'ip') { - return getIPCriteria(sortBy, directionFactor); + else if (type === 'ip') { + criteria = getIPCriteria(sortBy, directionFactor); + } else { + // use a string sorter for the rest + criteria = (rowA: Record, rowB: Record) => { + const aString = formatter.convert(rowA[sortBy]); + const bString = formatter.convert(rowB[sortBy]); + return directionFactor * aString.localeCompare(bString); + }; } - // use a string sorter for the rest + return getUndefinedHandler(sortBy, criteria); +} + +function getUndefinedHandler( + sortBy: string, + sortingCriteria: (rowA: Record, rowB: Record) => number +) { return (rowA: Record, rowB: Record) => { - const aString = formatter.convert(rowA[sortBy]); - const bString = formatter.convert(rowB[sortBy]); - return directionFactor * aString.localeCompare(bString); + const valueA = rowA[sortBy]; + const valueB = rowB[sortBy]; + if (valueA != null && valueB != null && !Number.isNaN(valueA) && !Number.isNaN(valueB)) { + return sortingCriteria(rowA, rowB); + } + if (valueA == null || Number.isNaN(valueA)) { + return 1; + } + if (valueB == null || Number.isNaN(valueB)) { + return -1; + } + + return 0; }; } From b1316300c0caefd77eda514ad53d43858cb04d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Casper=20H=C3=BCbertz?= Date: Wed, 24 Feb 2021 15:49:30 +0100 Subject: [PATCH 35/45] [APM] Correlations style polish in prep for release (#92514) - Removed the icon from the "View correlations" button - Moved the tabs to the FlyoutHeader - Removed unneeded spacers in the content - Reduced the filtering by callout and button - Made the introduction text color `subdued` to make it less noisy - Reduced ImpactBar size and extended width so the bar itself is `100` - Changed the selected term visualization color to `euiColorVis2` because the `euiColorAccent` is not great for visualizations. - Changed the latency distribution visualization color to `euiColorVis1` to make it consistent with the Transactions visualization colors in the other charts. --- .../app/correlations/correlations_table.tsx | 4 +-- .../app/correlations/error_correlations.tsx | 2 +- .../components/app/correlations/index.tsx | 33 +++++++++---------- .../app/correlations/latency_correlations.tsx | 5 +-- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx b/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx index 17559755b12e1..f2726cf41e578 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx @@ -63,14 +63,14 @@ export function CorrelationsTable({ const history = useHistory(); const columns: Array> = [ { - width: '100px', + width: '116px', field: 'impact', name: i18n.translate( 'xpack.apm.correlations.correlationsTable.impactLabel', { defaultMessage: 'Impact' } ), render: (_: any, term: T) => { - return ; + return ; }, }, { diff --git a/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx index 6a5582ca24fc7..4e8a8e3f5092f 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx @@ -103,7 +103,7 @@ export function ErrorCorrelations({ onClose }: Props) { <> - +

{i18n.translate('xpack.apm.correlations.error.description', { defaultMessage: diff --git a/x-pack/plugins/apm/public/components/app/correlations/index.tsx b/x-pack/plugins/apm/public/components/app/correlations/index.tsx index eba7c42490e06..464bcf1cde870 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/index.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/index.tsx @@ -66,7 +66,6 @@ export function Correlations() { onClick={() => { setIsFlyoutVisible(true); }} - iconType="visTagCloud" > {i18n.translate('xpack.apm.correlations.buttonLabel', { defaultMessage: 'View correlations', @@ -100,12 +99,25 @@ export function Correlations() { /> + + {tabs.map(({ key, label }) => ( + { + setCurrentTab(key); + }} + > + {label} + + ))} + {urlParams.kuery ? ( <> - + {i18n.translate( 'xpack.apm.correlations.filteringByLabel', @@ -116,7 +128,7 @@ export function Correlations() { - + {i18n.translate( 'xpack.apm.correlations.clearFiltersLabel', { defaultMessage: 'Clear' } @@ -128,21 +140,6 @@ export function Correlations() { ) : null} - - - {tabs.map(({ key, label }) => ( - { - setCurrentTab(key); - }} - > - {label} - - ))} - - setIsFlyoutVisible(false)} /> diff --git a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx index 22dd89918e25d..76e9a9242efbe 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx @@ -110,7 +110,7 @@ export function LatencyCorrelations({ onClose }: Props) { <> - +

{i18n.translate('xpack.apm.correlations.latency.description', { defaultMessage: @@ -250,6 +250,7 @@ function LatencyDistributionChart({ yScaleType={ScaleType.Linear} xAccessor={'x'} yAccessors={['y']} + color={theme.eui.euiColorVis1} data={data?.overall?.distribution || []} minBarHeight={5} tickFormat={(d) => `${roundFloat(d)}%`} @@ -271,7 +272,7 @@ function LatencyDistributionChart({ yScaleType={ScaleType.Linear} xAccessor={'x'} yAccessors={['y']} - color={theme.eui.euiColorAccent} + color={theme.eui.euiColorVis2} data={getSelectedDistribution(data, selectedSignificantTerm)} minBarHeight={5} tickFormat={(d) => `${roundFloat(d)}%`} From 3aad1b7527c98aea4215a81af1f5bed131ab46ac Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Wed, 24 Feb 2021 09:56:52 -0500 Subject: [PATCH 36/45] [Lens] Stop requesting stats on Records field (#92508) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../indexpattern_datasource/field_item.test.tsx | 12 ++++++++++++ .../public/indexpattern_datasource/field_item.tsx | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx index 0871ef4749496..99b571af964fb 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx @@ -16,6 +16,7 @@ import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; import { IndexPattern } from './types'; import { chartPluginMock } from '../../../../../src/plugins/charts/public/mocks'; +import { documentField } from './document_field'; const chartsThemeService = chartPluginMock.createSetupContract().theme; @@ -70,6 +71,7 @@ describe('IndexPattern Field Item', () => { aggregatable: true, searchable: true, }, + documentField, ], } as IndexPattern; @@ -222,4 +224,14 @@ describe('IndexPattern Field Item', () => { }), }); }); + + it('should not request field stats for document field', async () => { + const wrapper = mountWithIntl(); + + clickField(wrapper, 'Records'); + + expect(core.http.post).not.toHaveBeenCalled(); + expect(wrapper.find(EuiPopover).prop('isOpen')).toEqual(true); + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); + }); }); 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 e5d46b4a7a073..09510f05ad180 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -122,7 +122,7 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { }); function fetchData() { - if (state.isLoading) { + if (state.isLoading || field.type === 'document') { return; } From 1be0612b05d9a5323f47027980a36757575af7e5 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 24 Feb 2021 16:02:32 +0100 Subject: [PATCH 37/45] [Uptime] Search made easy (#88581) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - x-pack/plugins/uptime/common/constants/ui.ts | 2 + .../common/runtime_types/monitor/state.ts | 1 + .../common/runtime_types/ping/histogram.ts | 1 + .../ping_histogram_container.tsx | 5 +- .../alert_monitor_status.tsx | 6 +- .../overview/kuery_bar/kuery_bar.tsx | 4 +- .../search_type/search_type.test.tsx | 71 +++++ .../typeahead/search_type/search_type.tsx | 144 +++++++++ .../kuery_bar/typeahead/translations.ts | 38 +++ .../kuery_bar/typeahead/typehead.test.tsx | 44 +++ .../overview/kuery_bar/typeahead/typehead.tsx | 281 ++++++------------ .../kuery_bar/typeahead/use_key_events.ts | 113 +++++++ .../kuery_bar/typeahead/use_kql_syntax.ts | 56 ++++ .../kuery_bar/typeahead/use_simple_kuery.ts | 32 ++ .../monitor_list/monitor_list_container.tsx | 4 +- .../overview/snapshot/snapshot_container.tsx | 6 +- .../uptime/public/hooks/use_url_params.ts | 69 +++-- .../uptime/public/lib/helper/rtl_helpers.tsx | 57 +++- .../get_supported_url_params.test.ts.snap | 5 + .../url_params/get_supported_url_params.ts | 3 + .../uptime/public/state/actions/ping.ts | 7 +- .../uptime/public/state/actions/snapshot.ts | 15 +- .../plugins/uptime/public/state/api/ping.ts | 2 + .../uptime/public/state/api/snapshot.ts | 6 +- .../uptime/public/state/effects/ping.ts | 13 +- .../uptime/public/state/effects/snapshot.ts | 12 +- .../uptime/public/state/reducers/ping.ts | 8 +- .../public/state/reducers/snapshot.test.ts | 17 +- .../uptime/public/state/reducers/snapshot.ts | 12 +- .../server/lib/requests/get_monitor_states.ts | 5 +- .../server/lib/requests/get_ping_histogram.ts | 18 +- .../lib/requests/get_snapshot_counts.ts | 25 +- .../requests/search/find_potential_matches.ts | 20 +- .../lib/requests/search/query_context.ts | 5 +- .../server/rest_api/monitors/monitor_list.ts | 3 + .../rest_api/pings/get_ping_histogram.ts | 4 +- .../rest_api/snapshot/get_snapshot_count.ts | 4 +- .../test/functional/apps/uptime/overview.ts | 8 + 40 files changed, 814 insertions(+), 314 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/translations.ts create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_key_events.ts create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_kql_syntax.ts create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_simple_kuery.ts diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3496d7b0b52f0..d68e6c375a592 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -21758,7 +21758,6 @@ "xpack.uptime.filterPopout.searchMessage.ariaLabel": "{title} を検索", "xpack.uptime.integrationLink.missingDataMessage": "この統合に必要なデータが見つかりませんでした。", "xpack.uptime.kueryBar.indexPatternMissingWarningMessage": "インデックスパターンの取得中にエラーが発生しました。", - "xpack.uptime.kueryBar.searchPlaceholder": "モニター ID、名前、プロトコルタイプなどを検索…", "xpack.uptime.locationAvailabilityViewToggleLegend": "トグルを表示", "xpack.uptime.locationMap.locations.missing.message": "重要な位置情報構成がありません。{codeBlock}フィールドを使用して、アップタイムチェック用に一意の地域を作成できます。", "xpack.uptime.locationMap.locations.missing.message1": "詳細については、ドキュメンテーションを参照してください。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 0e87e36bef825..dc39b7b03634b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -21808,7 +21808,6 @@ "xpack.uptime.filterPopout.searchMessage.ariaLabel": "搜索 {title}", "xpack.uptime.integrationLink.missingDataMessage": "未找到此集成的所需数据。", "xpack.uptime.kueryBar.indexPatternMissingWarningMessage": "检索索引模式时出错。", - "xpack.uptime.kueryBar.searchPlaceholder": "搜索监测 ID、名称和协议类型......", "xpack.uptime.locationAvailabilityViewToggleLegend": "视图切换", "xpack.uptime.locationMap.locations.missing.message": "重要的地理位置配置缺失。您可以使用 {codeBlock} 字段为您的运行时间检查创建独特的地理区域。", "xpack.uptime.locationMap.locations.missing.message1": "在我们的文档中获取更多的信息。", diff --git a/x-pack/plugins/uptime/common/constants/ui.ts b/x-pack/plugins/uptime/common/constants/ui.ts index 0c8ff6d3f1ed6..880bc0f92ddf6 100644 --- a/x-pack/plugins/uptime/common/constants/ui.ts +++ b/x-pack/plugins/uptime/common/constants/ui.ts @@ -63,3 +63,5 @@ export enum CERT_STATUS { EXPIRED = 'EXPIRED', TOO_OLD = 'TOO_OLD', } + +export const KQL_SYNTAX_LOCAL_STORAGE = 'xpack.uptime.kql.syntax'; diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts index d5eb67fcdcde1..fc2cd42500d6c 100644 --- a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts +++ b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts @@ -96,6 +96,7 @@ export const FetchMonitorStatesQueryArgsType = t.intersection([ pagination: t.string, filters: t.string, statusFilter: t.string, + query: t.string, }), t.type({ dateRangeStart: t.string, diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts b/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts index 0e5a23ddaa83f..a843eae29efe3 100644 --- a/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts +++ b/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts @@ -23,6 +23,7 @@ export interface GetPingHistogramParams { filters?: string; monitorId?: string; bucketSize?: string; + query?: string; } export interface HistogramResult { diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx index 9de642b82ee0f..6330f14aa63a3 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx @@ -21,6 +21,7 @@ interface Props { const Container: React.FC = ({ height }) => { const { + query, absoluteDateRangeStart, absoluteDateRangeEnd, dateRangeStart: dateStart, @@ -37,8 +38,8 @@ const Container: React.FC = ({ height }) => { const { loading, pingHistogram: data } = useSelector(selectPingHistogram); useEffect(() => { - dispatch(getPingHistogram({ monitorId, dateStart, dateEnd, filters: esKuery })); - }, [dateStart, dateEnd, monitorId, lastRefresh, esKuery, dispatch]); + dispatch(getPingHistogram.get({ monitorId, dateStart, dateEnd, query, filters: esKuery })); + }, [dateStart, dateEnd, monitorId, lastRefresh, esKuery, dispatch, query]); return ( = ({ ); useEffect(() => { dispatch( - getSnapshotCountAction({ dateRangeStart: 'now-24h', dateRangeEnd: 'now', filters: esKuery }) + getSnapshotCountAction.get({ + dateRangeStart: 'now-24h', + dateRangeEnd: 'now', + filters: esKuery, + }) ); }, [dispatch, esKuery]); diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx index 919f831d2d33b..7db3659564ce2 100644 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx @@ -68,7 +68,7 @@ export function KueryBar({ let currentRequestCheck: string; const [getUrlParams, updateUrlParams] = useUrlParams(); - const { search: kuery } = getUrlParams(); + const { search: kuery, query } = getUrlParams(); useEffect(() => { updateSearchText(kuery); @@ -155,7 +155,7 @@ export function KueryBar({ dataTestSubj={dataTestSubj} disabled={indexPatternMissing} isLoading={isLoadingSuggestions || loading} - initialValue={defaultKuery || kuery} + initialValue={defaultKuery || kuery || query} onChange={onChange} onSubmit={onSubmit} suggestions={state.suggestions.slice(0, suggestionLimit)} diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.test.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.test.tsx new file mode 100644 index 0000000000000..2e7dfe990e9c1 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.test.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { fireEvent } from '@testing-library/react'; +import { render } from '../../../../../lib/helper/rtl_helpers'; +import { SearchType } from './search_type'; + +describe('Kuery bar search type', () => { + it('can change from simple to kq;', () => { + let kqlSyntax = false; + const setKqlSyntax = jest.fn((val: boolean) => { + kqlSyntax = val; + }); + + const { getByTestId } = render( + + ); + + // open popover to change + fireEvent.click(getByTestId('syntaxChangeToKql')); + + // change syntax + fireEvent.click(getByTestId('toggleKqlSyntax')); + + expect(setKqlSyntax).toHaveBeenCalledWith(true); + expect(setKqlSyntax).toHaveBeenCalledTimes(1); + }); + + it('can change from kql to simple;', () => { + let kqlSyntax = false; + const setKqlSyntax = jest.fn((val: boolean) => { + kqlSyntax = val; + }); + + const { getByTestId } = render( + + ); + + fireEvent.click(getByTestId('syntaxChangeToKql')); + + fireEvent.click(getByTestId('toggleKqlSyntax')); + + expect(setKqlSyntax).toHaveBeenCalledWith(true); + expect(setKqlSyntax).toHaveBeenCalledTimes(1); + }); + + it('clears the query on change to kql', () => { + const setKqlSyntax = jest.fn(); + + const { history } = render(, { + url: '/app/uptime?query=test', + }); + + expect(history?.location.search).toBe(''); + }); + + it('clears the search param on change to simple syntax', () => { + const setKqlSyntax = jest.fn(); + + const { history } = render(, { + url: '/app/uptime?search=test', + }); + + expect(history?.location.search).toBe(''); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.tsx new file mode 100644 index 0000000000000..af539e1c361a1 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/search_type/search_type.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; +import { + EuiPopover, + EuiFormRow, + EuiSwitch, + EuiButtonEmpty, + EuiPopoverTitle, + EuiText, + EuiSpacer, + EuiLink, + EuiButtonIcon, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; +import { useKibana } from '../../../../../../../../../src/plugins/kibana_react/public'; +import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; +import { useUrlParams } from '../../../../../hooks'; +import { + CHANGE_SEARCH_BAR_SYNTAX, + CHANGE_SEARCH_BAR_SYNTAX_SIMPLE, + SYNTAX_OPTIONS_LABEL, +} from '../translations'; + +const BoxesVerticalIcon = euiStyled(EuiButtonIcon)` + padding: 10px 8px 0 8px; + border-radius: 0; + height: 38px; + width: 32px; + background-color: ${(props) => props.theme.eui.euiColorLightestShade}; + padding-top: 8px; + padding-bottom: 8px; + cursor: pointer; +`; + +interface Props { + kqlSyntax: boolean; + setKqlSyntax: (val: boolean) => void; +} + +export const SearchType = ({ kqlSyntax, setKqlSyntax }: Props) => { + const { + services: { docLinks }, + } = useKibana(); + + const [getUrlParams, updateUrlParams] = useUrlParams(); + + const { query, search } = getUrlParams(); + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const onButtonClick = () => setIsPopoverOpen((prevState) => !prevState); + + const closePopover = () => setIsPopoverOpen(false); + + useEffect(() => { + if (kqlSyntax && query) { + updateUrlParams({ query: '' }); + } + + if (!kqlSyntax && search) { + updateUrlParams({ search: '' }); + } + }, [kqlSyntax, query, search, updateUrlParams]); + + const button = kqlSyntax ? ( + + KQL + + ) : ( + + ); + + return ( + +

+ {SYNTAX_OPTIONS_LABEL} + +

+ +

+
+ + + setKqlSyntax(!kqlSyntax)} + data-test-subj="toggleKqlSyntax" + /> + +
+ + ); +}; + +const KqlDescription = ({ href }: { href: string }) => { + return ( + + {KIBANA_QUERY_LANGUAGE} + + ), + searchField: Monitor Name, ID, Url, + }} + /> + ); +}; + +const KIBANA_QUERY_LANGUAGE = i18n.translate('xpack.uptime.query.queryBar.kqlFullLanguageName', { + defaultMessage: 'Kibana Query Language', +}); diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/translations.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/translations.ts new file mode 100644 index 0000000000000..e0d36bcb57587 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/translations.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const KQL_PLACE_HOLDER = i18n.translate('xpack.uptime.kueryBar.searchPlaceholder.kql', { + defaultMessage: + 'Search using kql syntax for monitor IDs, names and type etc (E.g monitor.type: "http" AND tags: "dev")', +}); + +export const SIMPLE_SEARCH_PLACEHOLDER = i18n.translate( + 'xpack.uptime.kueryBar.searchPlaceholder.simple', + { + defaultMessage: 'Search by monitor ID, name, or url (E.g. http:// )', + } +); + +export const CHANGE_SEARCH_BAR_SYNTAX = i18n.translate( + 'xpack.uptime.kueryBar.options.syntax.changeLabel', + { + defaultMessage: 'Change search bar syntax to use Kibana Query Language', + } +); + +export const CHANGE_SEARCH_BAR_SYNTAX_SIMPLE = i18n.translate( + 'xpack.uptime.kueryBar.options.syntax.simple', + { + defaultMessage: 'Change search bar syntax to not use Kibana Query Language', + } +); + +export const SYNTAX_OPTIONS_LABEL = i18n.translate('xpack.uptime.kueryBar.options.syntax', { + defaultMessage: 'SYNTAX OPTIONS', +}); diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.test.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.test.tsx new file mode 100644 index 0000000000000..ed75747aa3416 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.test.tsx @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { fireEvent } from '@testing-library/react'; +import { Typeahead } from './typehead'; +import { render } from '../../../../lib/helper/rtl_helpers'; + +describe('Type head', () => { + jest.useFakeTimers(); + + it('it sets initial value', () => { + const { getByTestId, getByDisplayValue, history } = render( + {}} + suggestions={[]} + loadMore={() => {}} + queryExample="" + /> + ); + + const input = getByTestId('uptimeKueryBarInput'); + + expect(input).toBeInTheDocument(); + expect(getByDisplayValue('elastic')).toBeInTheDocument(); + + fireEvent.change(input, { target: { value: 'kibana' } }); + + // to check if it updateds the query params, needed for debounce wait + jest.advanceTimersByTime(250); + + expect(history.location.search).toBe('?query=kibana'); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx index 99ce6e97a7632..e4dd175b2fe1b 100644 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx @@ -5,30 +5,15 @@ * 2.0. */ -import React, { KeyboardEvent, ChangeEvent, MouseEvent, useState, useRef, useEffect } from 'react'; -import { i18n } from '@kbn/i18n'; +import React, { ChangeEvent, MouseEvent, useState, useRef, useEffect } from 'react'; import { EuiFieldSearch, EuiProgress, EuiOutsideClickDetector } from '@elastic/eui'; import { Suggestions } from './suggestions'; import { QuerySuggestion } from '../../../../../../../../src/plugins/data/public'; - -const KEY_CODES = { - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - ENTER: 13, - ESC: 27, - TAB: 9, -}; - -interface TypeaheadState { - isSuggestionsVisible: boolean; - index: number | null; - value: string; - inputIsPristine: boolean; - lastSubmitted: string; - selected: QuerySuggestion | null; -} +import { SearchType } from './search_type/search_type'; +import { useKqlSyntax } from './use_kql_syntax'; +import { useKeyEvents } from './use_key_events'; +import { KQL_PLACE_HOLDER, SIMPLE_SEARCH_PLACEHOLDER } from './translations'; +import { useSimpleQuery } from './use_simple_kuery'; interface TypeaheadProps { onChange: (inputValue: string, selectionStart: number | null) => void; @@ -54,181 +39,92 @@ export const Typeahead: React.FC = ({ isLoading, loadMore, }) => { - const [state, setState] = useState({ - isSuggestionsVisible: false, - index: null, - value: '', - inputIsPristine: true, - lastSubmitted: '', - selected: null, - }); + const [value, setValue] = useState(''); + const [index, setIndex] = useState(null); + const [isSuggestionsVisible, setIsSuggestionsVisible] = useState(false); + + const [selected, setSelected] = useState(null); + const [inputIsPristine, setInputIsPristine] = useState(true); + const [lastSubmitted, setLastSubmitted] = useState(''); + + const { kqlSyntax, setKqlSyntax } = useKqlSyntax({ setValue }); const inputRef = useRef(); + const { setQuery } = useSimpleQuery(); + useEffect(() => { - if (state.inputIsPristine && initialValue) { - setState((prevState) => ({ - ...prevState, - value: initialValue, - })); + if (inputIsPristine && initialValue) { + setValue(initialValue); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [initialValue]); - const incrementIndex = (currentIndex: number) => { - let nextIndex = currentIndex + 1; - if (currentIndex === null || nextIndex >= suggestions.length) { - nextIndex = 0; - } - - setState((prevState) => ({ - ...prevState, - index: nextIndex, - })); - }; - - const decrementIndex = (currentIndex: number) => { - let previousIndex: number | null = currentIndex - 1; - if (previousIndex < 0) { - previousIndex = null; - } - - setState((prevState) => ({ - ...prevState, - index: previousIndex, - })); - }; - - const onKeyUp = (event: KeyboardEvent & ChangeEvent) => { - const { selectionStart } = event.target; - const { value } = state; - switch (event.keyCode) { - case KEY_CODES.LEFT: - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: true, - })); - onChange(value, selectionStart); - break; - case KEY_CODES.RIGHT: - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: true, - })); - onChange(value, selectionStart); - break; - } - }; - - const onKeyDown = (event: KeyboardEvent) => { - const { isSuggestionsVisible, index, value } = state; - switch (event.keyCode) { - case KEY_CODES.DOWN: - event.preventDefault(); - if (isSuggestionsVisible) { - incrementIndex(index!); - } else { - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: true, - index: 0, - })); - } - break; - case KEY_CODES.UP: - event.preventDefault(); - if (isSuggestionsVisible) { - decrementIndex(index!); - } - break; - case KEY_CODES.ENTER: - event.preventDefault(); - if (isSuggestionsVisible && suggestions[index!]) { - selectSuggestion(suggestions[index!]); - } else { - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: false, - })); - - onSubmit(value); - } - break; - case KEY_CODES.ESC: - event.preventDefault(); - - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: false, - })); - - break; - case KEY_CODES.TAB: - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: false, - })); - break; - } - }; - const selectSuggestion = (suggestion: QuerySuggestion) => { const nextInputValue = - state.value.substr(0, suggestion.start) + - suggestion.text + - state.value.substr(suggestion.end); + value.substr(0, suggestion.start) + suggestion.text + value.substr(suggestion.end); - setState((prevState) => ({ - ...prevState, - value: nextInputValue, - index: null, - selected: suggestion, - })); + setValue(nextInputValue); + setSelected(suggestion); + setIndex(null); onChange(nextInputValue, nextInputValue.length); }; - const onClickOutside = () => { - if (state.isSuggestionsVisible) { - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: false, - })); + const { onKeyDown, onKeyUp } = useKeyEvents({ + index, + value, + isSuggestionsVisible, + setIndex, + setIsSuggestionsVisible, + suggestions, + selectSuggestion, + onChange, + onSubmit, + }); + const onClickOutside = () => { + if (isSuggestionsVisible) { + setIsSuggestionsVisible(false); onSuggestionSubmit(); } }; const onChangeInputValue = (event: ChangeEvent) => { - const { value, selectionStart } = event.target; - const hasValue = Boolean(value.trim()); + const { value: valueN, selectionStart } = event.target; + const hasValue = Boolean(valueN.trim()); - setState((prevState) => ({ - ...prevState, - value, - inputIsPristine: false, - isSuggestionsVisible: hasValue, - index: null, - })); + setValue(valueN); + + setInputIsPristine(false); + setIndex(null); + + if (!kqlSyntax) { + setQuery(valueN); + return; + } + + setIsSuggestionsVisible(hasValue); if (!hasValue) { - onSubmit(value); + onSubmit(valueN); } - onChange(value, selectionStart!); + onChange(valueN, selectionStart!); }; const onClickInput = (event: MouseEvent & ChangeEvent) => { - event.stopPropagation(); - const { selectionStart } = event.target; - onChange(state.value, selectionStart!); + if (kqlSyntax) { + event.stopPropagation(); + const { selectionStart } = event.target; + onChange(value, selectionStart!); + } }; const onFocus = () => { - setState((prevState) => ({ - ...prevState, - isSuggestionsVisible: true, - })); + if (kqlSyntax) { + setIsSuggestionsVisible(true); + } }; const onClickSuggestion = (suggestion: QuerySuggestion) => { @@ -236,16 +132,11 @@ export const Typeahead: React.FC = ({ if (inputRef.current) inputRef.current.focus(); }; - const onMouseEnterSuggestion = (index: number) => { - setState((prevState) => ({ - ...prevState, - index, - })); + const onMouseEnterSuggestion = (indexN: number) => { + setIndex(indexN); }; const onSuggestionSubmit = () => { - const { value, lastSubmitted, selected } = state; - if ( lastSubmitted !== value && selected && @@ -253,11 +144,8 @@ export const Typeahead: React.FC = ({ ) { onSubmit(value); - setState((prevState) => ({ - ...prevState, - lastSubmitted: value, - selected: null, - })); + setLastSubmitted(value); + setSelected(null); } }; @@ -268,26 +156,30 @@ export const Typeahead: React.FC = ({ { if (node) { inputRef.current = node; } }} disabled={disabled} - value={state.value} - onKeyDown={onKeyDown} - onKeyUp={onKeyUp} + value={value} + onKeyDown={kqlSyntax ? onKeyDown : undefined} + onKeyUp={kqlSyntax ? onKeyUp : undefined} onFocus={onFocus} onChange={onChangeInputValue} onClick={onClickInput} autoComplete="off" spellCheck={false} + data-test-subj={'uptimeKueryBarInput'} + append={} /> {isLoading && ( @@ -302,15 +194,16 @@ export const Typeahead: React.FC = ({ /> )} - - + {kqlSyntax && ( + + )} ); diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_key_events.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_key_events.ts new file mode 100644 index 0000000000000..ac702cc95dd64 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_key_events.ts @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ChangeEvent, KeyboardEvent } from 'react'; +import * as React from 'react'; +import { QuerySuggestion } from '../../../../../../../../src/plugins/data/public'; + +const KEY_CODES = { + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + ENTER: 13, + ESC: 27, + TAB: 9, +}; + +interface Props { + value: string; + index: number | null; + isSuggestionsVisible: boolean; + setIndex: React.Dispatch>; + setIsSuggestionsVisible: React.Dispatch>; + suggestions: QuerySuggestion[]; + selectSuggestion: (suggestion: QuerySuggestion) => void; + onChange: (inputValue: string, selectionStart: number | null) => void; + onSubmit: (inputValue: string) => void; +} + +export const useKeyEvents = ({ + value, + index, + isSuggestionsVisible, + setIndex, + setIsSuggestionsVisible, + suggestions, + selectSuggestion, + onChange, + onSubmit, +}: Props) => { + const incrementIndex = (currentIndex: number) => { + let nextIndex = currentIndex + 1; + if (currentIndex === null || nextIndex >= suggestions.length) { + nextIndex = 0; + } + + setIndex(nextIndex); + }; + + const decrementIndex = (currentIndex: number) => { + let previousIndex: number | null = currentIndex - 1; + if (previousIndex < 0) { + previousIndex = null; + } + setIndex(previousIndex); + }; + + const onKeyUp = (event: KeyboardEvent & ChangeEvent) => { + const { selectionStart } = event.target; + switch (event.keyCode) { + case KEY_CODES.LEFT: + setIsSuggestionsVisible(true); + onChange(value, selectionStart); + break; + case KEY_CODES.RIGHT: + setIsSuggestionsVisible(true); + onChange(value, selectionStart); + break; + } + }; + + const onKeyDown = (event: KeyboardEvent) => { + switch (event.keyCode) { + case KEY_CODES.DOWN: + event.preventDefault(); + if (isSuggestionsVisible) { + incrementIndex(index!); + } else { + setIndex(0); + setIsSuggestionsVisible(true); + } + break; + case KEY_CODES.UP: + event.preventDefault(); + if (isSuggestionsVisible) { + decrementIndex(index!); + } + break; + case KEY_CODES.ENTER: + event.preventDefault(); + if (isSuggestionsVisible && suggestions[index!]) { + selectSuggestion(suggestions[index!]); + } else { + setIsSuggestionsVisible(false); + onSubmit(value); + } + break; + case KEY_CODES.ESC: + event.preventDefault(); + setIsSuggestionsVisible(false); + break; + case KEY_CODES.TAB: + setIsSuggestionsVisible(false); + break; + } + }; + + return { onKeyUp, onKeyDown }; +}; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_kql_syntax.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_kql_syntax.ts new file mode 100644 index 0000000000000..2c945c33b9dc7 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_kql_syntax.ts @@ -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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; +import { KQL_SYNTAX_LOCAL_STORAGE } from '../../../../../common/constants'; +import { useUrlParams } from '../../../../hooks'; + +interface Props { + setValue: React.Dispatch>; +} + +export const useKqlSyntax = ({ setValue }: Props) => { + const [kqlSyntax, setKqlSyntax] = useState( + localStorage.getItem(KQL_SYNTAX_LOCAL_STORAGE) === 'true' + ); + + const [getUrlParams] = useUrlParams(); + + const { query, search } = getUrlParams(); + + useEffect(() => { + setValue(query || ''); + }, [query, setValue]); + + useEffect(() => { + setValue(search || ''); + }, [search, setValue]); + + useEffect(() => { + if (query || search) { + // if url has query or params we will give them preference on load + // for selecting syntax type + if (query) { + setKqlSyntax(false); + } + if (search) { + setKqlSyntax(true); + } + } else { + setKqlSyntax(localStorage.getItem(KQL_SYNTAX_LOCAL_STORAGE) === 'true'); + } + // This part is meant to run only when component loads + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + localStorage.setItem(KQL_SYNTAX_LOCAL_STORAGE, String(kqlSyntax)); + setValue(''); + }, [kqlSyntax, setValue]); + + return { kqlSyntax, setKqlSyntax }; +}; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_simple_kuery.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_simple_kuery.ts new file mode 100644 index 0000000000000..55df62a7e14d6 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/use_simple_kuery.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useState } from 'react'; +import useDebounce from 'react-use/lib/useDebounce'; +import { useUrlParams } from '../../../../hooks'; + +export const useSimpleQuery = () => { + const [getUrlParams, updateUrlParams] = useUrlParams(); + + const { query } = getUrlParams(); + + const [debouncedValue, setDebouncedValue] = useState(query ?? ''); + + useEffect(() => { + setDebouncedValue(query ?? ''); + }, [query]); + + useDebounce( + () => { + updateUrlParams({ query: debouncedValue }); + }, + 250, + [debouncedValue] + ); + + return { query, setQuery: setDebouncedValue }; +}; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx index f9d87aa40d9a6..5ac6351ba5dec 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx @@ -35,7 +35,7 @@ export const MonitorList: React.FC = (props) => { const dispatch = useDispatch(); const [getUrlValues] = useUrlParams(); - const { dateRangeStart, dateRangeEnd, pagination, statusFilter } = getUrlValues(); + const { dateRangeStart, dateRangeEnd, pagination, statusFilter, query } = getUrlValues(); const { lastRefresh } = useContext(UptimeRefreshContext); @@ -50,6 +50,7 @@ export const MonitorList: React.FC = (props) => { pageSize, pagination, statusFilter, + query, }) ); }, [ @@ -61,6 +62,7 @@ export const MonitorList: React.FC = (props) => { pageSize, pagination, statusFilter, + query, ]); return ( diff --git a/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx b/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx index 68e04dd7a3c0d..09c832c603d10 100644 --- a/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx +++ b/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx @@ -21,7 +21,7 @@ interface Props { } export const Snapshot: React.FC = ({ height }: Props) => { - const { dateRangeStart, dateRangeEnd } = useGetUrlParams(); + const { dateRangeStart, dateRangeEnd, query } = useGetUrlParams(); const { lastRefresh } = useContext(UptimeRefreshContext); @@ -31,7 +31,7 @@ export const Snapshot: React.FC = ({ height }: Props) => { const dispatch = useDispatch(); useEffect(() => { - dispatch(getSnapshotCountAction({ dateRangeStart, dateRangeEnd, filters: esKuery })); - }, [dateRangeStart, dateRangeEnd, esKuery, lastRefresh, dispatch]); + dispatch(getSnapshotCountAction.get({ query, dateRangeStart, dateRangeEnd, filters: esKuery })); + }, [dateRangeStart, dateRangeEnd, esKuery, lastRefresh, dispatch, query]); return ; }; diff --git a/x-pack/plugins/uptime/public/hooks/use_url_params.ts b/x-pack/plugins/uptime/public/hooks/use_url_params.ts index dc58a77c09ad0..0178a4a0b65da 100644 --- a/x-pack/plugins/uptime/public/hooks/use_url_params.ts +++ b/x-pack/plugins/uptime/public/hooks/use_url_params.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; import { parse, stringify } from 'query-string'; import { useLocation, useHistory } from 'react-router-dom'; import { useDispatch, useSelector } from 'react-redux'; @@ -62,39 +62,42 @@ export const useUrlParams: UptimeUrlParamsHook = () => { } }, [dispatch, filters, selectedFilters]); - const updateUrlParams: UpdateUrlParams = (updatedParams) => { - if (!history || !location) return; - const { pathname, search } = location; - const currentParams = getParsedParams(search); - const mergedParams = { - ...currentParams, - ...updatedParams, - }; + const updateUrlParams: UpdateUrlParams = useCallback( + (updatedParams) => { + if (!history || !location) return; + const { pathname, search } = location; + const currentParams = getParsedParams(search); + const mergedParams = { + ...currentParams, + ...updatedParams, + }; - history.push({ - pathname, - search: stringify( - // drop any parameters that have no value - Object.keys(mergedParams).reduce((params, key) => { - const value = mergedParams[key]; - if (value === undefined || value === '') { - return params; - } - return { - ...params, - [key]: value, - }; - }, {}), - { sort: false } - ), - }); - const filterMap = getMapFromFilters(mergedParams.filters); - if (!filterMap) { - dispatch(setSelectedFilters(null)); - } else { - dispatch(setSelectedFilters(mapMapToObject(filterMap))); - } - }; + history.push({ + pathname, + search: stringify( + // drop any parameters that have no value + Object.keys(mergedParams).reduce((params, key) => { + const value = mergedParams[key]; + if (value === undefined || value === '') { + return params; + } + return { + ...params, + [key]: value, + }; + }, {}), + { sort: false } + ), + }); + const filterMap = getMapFromFilters(mergedParams.filters); + if (!filterMap) { + dispatch(setSelectedFilters(null)); + } else { + dispatch(setSelectedFilters(mapMapToObject(filterMap))); + } + }, + [dispatch, history, location] + ); return [useGetUrlParams, updateUrlParams]; }; diff --git a/x-pack/plugins/uptime/public/lib/helper/rtl_helpers.tsx b/x-pack/plugins/uptime/public/lib/helper/rtl_helpers.tsx index e02a2c6f9832f..a2a67fe7347f5 100644 --- a/x-pack/plugins/uptime/public/lib/helper/rtl_helpers.tsx +++ b/x-pack/plugins/uptime/public/lib/helper/rtl_helpers.tsx @@ -22,6 +22,7 @@ import { } from '../../../../../../src/plugins/kibana_react/public'; import { MountWithReduxProvider } from './helper_with_redux'; import { AppState } from '../../state'; +import { stringifyUrlParams } from './stringify_url_params'; interface KibanaProps { services?: KibanaServices; @@ -40,10 +41,18 @@ interface MockRouterProps extends MockKibanaProviderProps history?: History; } +type Url = + | string + | { + path: string; + queryParams: Record; + }; + interface RenderRouterOptions extends KibanaProviderOptions { history?: History; renderOptions?: Omit; state?: Partial; + url?: Url; } /* default mock core */ @@ -87,10 +96,9 @@ export function MockKibanaProvider({ export function MockRouter({ children, core, - history: customHistory, + history = createMemoryHistory(), kibanaProps, }: MockRouterProps) { - const history = customHistory || createMemoryHistory(); return ( @@ -104,18 +112,45 @@ configure({ testIdAttribute: 'data-test-subj' }); /* Custom react testing library render */ export function render( ui: ReactElement, - { history, core, kibanaProps, renderOptions, state }: RenderRouterOptions = {} + { + history = createMemoryHistory(), + core, + kibanaProps, + renderOptions, + state, + url, + }: RenderRouterOptions = {} ) { const testState: AppState = { ...mockState, ...state, }; - return reactTestLibRender( - - - {ui} - - , - renderOptions - ); + + if (url) { + history = getHistoryFromUrl(url); + } + + return { + ...reactTestLibRender( + + + {ui} + + , + renderOptions + ), + history, + }; } + +const getHistoryFromUrl = (url: Url) => { + if (typeof url === 'string') { + return createMemoryHistory({ + initialEntries: [url], + }); + } + + return createMemoryHistory({ + initialEntries: [url.path + stringifyUrlParams(url.queryParams)], + }); +}; diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap b/x-pack/plugins/uptime/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap index c9e0167d9c217..a5b8c92315967 100644 --- a/x-pack/plugins/uptime/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap +++ b/x-pack/plugins/uptime/public/lib/helper/url_params/__snapshots__/get_supported_url_params.test.ts.snap @@ -11,6 +11,7 @@ Object { "filters": "", "focusConnectorField": false, "pagination": undefined, + "query": undefined, "search": "", "statusFilter": "", } @@ -27,6 +28,7 @@ Object { "filters": "", "focusConnectorField": false, "pagination": undefined, + "query": undefined, "search": "", "statusFilter": "", } @@ -43,6 +45,7 @@ Object { "filters": "", "focusConnectorField": false, "pagination": undefined, + "query": undefined, "search": "monitor.status: down", "statusFilter": "", } @@ -59,6 +62,7 @@ Object { "filters": "", "focusConnectorField": false, "pagination": undefined, + "query": undefined, "search": "", "statusFilter": "", } @@ -75,6 +79,7 @@ Object { "filters": "", "focusConnectorField": false, "pagination": undefined, + "query": undefined, "search": "", "statusFilter": "", } diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts index 6c4400663f17a..d7363ff9db32e 100644 --- a/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts +++ b/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts @@ -22,6 +22,7 @@ export interface UptimeUrlParams { search: string; statusFilter: string; focusConnectorField?: boolean; + query?: string; } const { @@ -75,9 +76,11 @@ export const getSupportedUrlParams = (params: { statusFilter, pagination, focusConnectorField, + query, } = filteredParams; return { + query, pagination, absoluteDateRangeStart: parseAbsoluteDate( dateRangeStart || DATE_RANGE_START, diff --git a/x-pack/plugins/uptime/public/state/actions/ping.ts b/x-pack/plugins/uptime/public/state/actions/ping.ts index 03539b9f9d8a0..6b997ba184b0b 100644 --- a/x-pack/plugins/uptime/public/state/actions/ping.ts +++ b/x-pack/plugins/uptime/public/state/actions/ping.ts @@ -12,12 +12,13 @@ import { PingsResponse, GetPingsParams, } from '../../../common/runtime_types'; +import { createAsyncAction } from './utils'; export const clearPings = createAction('CLEAR PINGS'); -export const getPingHistogram = createAction('GET_PING_HISTOGRAM'); -export const getPingHistogramSuccess = createAction('GET_PING_HISTOGRAM_SUCCESS'); -export const getPingHistogramFail = createAction('GET_PING_HISTOGRAM_FAIL'); +export const getPingHistogram = createAsyncAction( + 'GET_PING_HISTOGRAM' +); export const getPings = createAction('GET PINGS'); export const getPingsSuccess = createAction('GET PINGS SUCCESS'); diff --git a/x-pack/plugins/uptime/public/state/actions/snapshot.ts b/x-pack/plugins/uptime/public/state/actions/snapshot.ts index b921c5b1885ed..b1ff299600943 100644 --- a/x-pack/plugins/uptime/public/state/actions/snapshot.ts +++ b/x-pack/plugins/uptime/public/state/actions/snapshot.ts @@ -5,15 +5,10 @@ * 2.0. */ -import { createAction } from 'redux-actions'; import { Snapshot } from '../../../common/runtime_types'; +import { createAsyncAction } from './utils'; +import { SnapShotQueryParams } from '../api'; -export interface GetSnapshotPayload { - dateRangeStart: string; - dateRangeEnd: string; - filters?: string; -} - -export const getSnapshotCountAction = createAction('GET_SNAPSHOT_COUNT'); -export const getSnapshotCountActionSuccess = createAction('GET_SNAPSHOT_COUNT_SUCCESS'); -export const getSnapshotCountActionFail = createAction('GET_SNAPSHOT_COUNT_FAIL'); +export const getSnapshotCountAction = createAsyncAction( + 'GET_SNAPSHOT_COUNT' +); diff --git a/x-pack/plugins/uptime/public/state/api/ping.ts b/x-pack/plugins/uptime/public/state/api/ping.ts index 7d1063c6b2fea..e4fc5cc620b55 100644 --- a/x-pack/plugins/uptime/public/state/api/ping.ts +++ b/x-pack/plugins/uptime/public/state/api/ping.ts @@ -27,6 +27,7 @@ export const fetchPingHistogram: APIFn dateEnd, filters, bucketSize, + query, }) => { const queryParams = { dateStart, @@ -34,6 +35,7 @@ export const fetchPingHistogram: APIFn monitorId, filters, bucketSize, + query, }; return await apiService.get(API_URLS.PING_HISTOGRAM, queryParams); diff --git a/x-pack/plugins/uptime/public/state/api/snapshot.ts b/x-pack/plugins/uptime/public/state/api/snapshot.ts index 79c74f2784025..d8f38128e3202 100644 --- a/x-pack/plugins/uptime/public/state/api/snapshot.ts +++ b/x-pack/plugins/uptime/public/state/api/snapshot.ts @@ -13,20 +13,20 @@ export interface SnapShotQueryParams { dateRangeStart: string; dateRangeEnd: string; filters?: string; - statusFilter?: string; + query?: string; } export const fetchSnapshotCount = async ({ dateRangeStart, dateRangeEnd, filters, - statusFilter, + query, }: SnapShotQueryParams): Promise => { const queryParams = { dateRangeStart, dateRangeEnd, ...(filters && { filters }), - ...(statusFilter && { statusFilter }), + ...(query && { query }), }; return await apiService.get(API_URLS.SNAPSHOT_COUNT, queryParams, SnapshotType); diff --git a/x-pack/plugins/uptime/public/state/effects/ping.ts b/x-pack/plugins/uptime/public/state/effects/ping.ts index b28d75f6a3bac..a9e2023d3b777 100644 --- a/x-pack/plugins/uptime/public/state/effects/ping.ts +++ b/x-pack/plugins/uptime/public/state/effects/ping.ts @@ -6,14 +6,7 @@ */ import { takeLatest } from 'redux-saga/effects'; -import { - getPingHistogram, - getPingHistogramSuccess, - getPingHistogramFail, - getPings, - getPingsSuccess, - getPingsFail, -} from '../actions'; +import { getPingHistogram, getPings, getPingsSuccess, getPingsFail } from '../actions'; import { fetchPingHistogram, fetchPings } from '../api'; import { fetchEffectFactory } from './fetch_effect'; @@ -23,7 +16,7 @@ export function* fetchPingsEffect() { export function* fetchPingHistogramEffect() { yield takeLatest( - String(getPingHistogram), - fetchEffectFactory(fetchPingHistogram, getPingHistogramSuccess, getPingHistogramFail) + String(getPingHistogram.get), + fetchEffectFactory(fetchPingHistogram, getPingHistogram.success, getPingHistogram.fail) ); } diff --git a/x-pack/plugins/uptime/public/state/effects/snapshot.ts b/x-pack/plugins/uptime/public/state/effects/snapshot.ts index b353aad0e3ac1..978f8eb8964ce 100644 --- a/x-pack/plugins/uptime/public/state/effects/snapshot.ts +++ b/x-pack/plugins/uptime/public/state/effects/snapshot.ts @@ -6,21 +6,17 @@ */ import { takeLatest } from 'redux-saga/effects'; -import { - getSnapshotCountAction, - getSnapshotCountActionFail, - getSnapshotCountActionSuccess, -} from '../actions'; +import { getSnapshotCountAction } from '../actions'; import { fetchSnapshotCount } from '../api'; import { fetchEffectFactory } from './fetch_effect'; export function* fetchSnapshotCountEffect() { yield takeLatest( - getSnapshotCountAction, + getSnapshotCountAction.get, fetchEffectFactory( fetchSnapshotCount, - getSnapshotCountActionSuccess, - getSnapshotCountActionFail + getSnapshotCountAction.success, + getSnapshotCountAction.fail ) ); } diff --git a/x-pack/plugins/uptime/public/state/reducers/ping.ts b/x-pack/plugins/uptime/public/state/reducers/ping.ts index d96c1f64b499c..a91734d77b4ab 100644 --- a/x-pack/plugins/uptime/public/state/reducers/ping.ts +++ b/x-pack/plugins/uptime/public/state/reducers/ping.ts @@ -6,7 +6,7 @@ */ import { handleActions, Action } from 'redux-actions'; -import { getPingHistogram, getPingHistogramSuccess, getPingHistogramFail } from '../actions'; +import { getPingHistogram } from '../actions'; import { HistogramResult } from '../../../common/runtime_types'; export interface PingState { @@ -25,18 +25,18 @@ type MonitorStatusPayload = HistogramResult & Error; export const pingReducer = handleActions( { - [String(getPingHistogram)]: (state) => ({ + [String(getPingHistogram.get)]: (state) => ({ ...state, loading: true, }), - [String(getPingHistogramSuccess)]: (state: PingState, action: Action) => ({ + [String(getPingHistogram.success)]: (state: PingState, action: Action) => ({ ...state, loading: false, pingHistogram: { ...action.payload }, }), - [String(getPingHistogramFail)]: (state, action: Action) => ({ + [String(getPingHistogram.fail)]: (state, action: Action) => ({ ...state, errors: [...state.errors, action.payload], loading: false, diff --git a/x-pack/plugins/uptime/public/state/reducers/snapshot.test.ts b/x-pack/plugins/uptime/public/state/reducers/snapshot.test.ts index c2c2f65a4af4e..0ab6cf309922b 100644 --- a/x-pack/plugins/uptime/public/state/reducers/snapshot.test.ts +++ b/x-pack/plugins/uptime/public/state/reducers/snapshot.test.ts @@ -6,15 +6,12 @@ */ import { snapshotReducer } from './snapshot'; -import { - getSnapshotCountAction, - getSnapshotCountActionSuccess, - getSnapshotCountActionFail, -} from '../actions'; +import { getSnapshotCountAction } from '../actions'; +import { IHttpFetchError } from '../../../../../../src/core/public'; describe('snapshot reducer', () => { it('updates existing state', () => { - const action = getSnapshotCountAction({ + const action = getSnapshotCountAction.get({ dateRangeStart: 'now-15m', dateRangeEnd: 'now', filters: 'foo: bar', @@ -32,7 +29,7 @@ describe('snapshot reducer', () => { }); it(`sets the state's status to loading during a fetch`, () => { - const action = getSnapshotCountAction({ + const action = getSnapshotCountAction.get({ dateRangeStart: 'now-15m', dateRangeEnd: 'now', }); @@ -40,7 +37,7 @@ describe('snapshot reducer', () => { }); it('changes the count when a snapshot fetch succeeds', () => { - const action = getSnapshotCountActionSuccess({ + const action = getSnapshotCountAction.success({ up: 10, down: 15, total: 25, @@ -50,8 +47,8 @@ describe('snapshot reducer', () => { }); it('appends a current error to existing errors list', () => { - const action = getSnapshotCountActionFail( - new Error(`I couldn't get your data because the server denied the request`) + const action = getSnapshotCountAction.fail( + new Error(`I couldn't get your data because the server denied the request`) as IHttpFetchError ); expect(snapshotReducer(undefined, action)).toMatchSnapshot(); diff --git a/x-pack/plugins/uptime/public/state/reducers/snapshot.ts b/x-pack/plugins/uptime/public/state/reducers/snapshot.ts index fd7f406dd9a46..82599416ab2b8 100644 --- a/x-pack/plugins/uptime/public/state/reducers/snapshot.ts +++ b/x-pack/plugins/uptime/public/state/reducers/snapshot.ts @@ -7,11 +7,7 @@ import { Action } from 'redux-actions'; import { Snapshot } from '../../../common/runtime_types'; -import { - getSnapshotCountAction, - getSnapshotCountActionSuccess, - getSnapshotCountActionFail, -} from '../actions'; +import { getSnapshotCountAction } from '../actions'; export interface SnapshotState { count: Snapshot; @@ -31,18 +27,18 @@ const initialState: SnapshotState = { export function snapshotReducer(state = initialState, action: Action): SnapshotState { switch (action.type) { - case String(getSnapshotCountAction): + case String(getSnapshotCountAction.get): return { ...state, loading: true, }; - case String(getSnapshotCountActionSuccess): + case String(getSnapshotCountAction.success): return { ...state, count: action.payload, loading: false, }; - case String(getSnapshotCountActionFail): + case String(getSnapshotCountAction.fail): return { ...state, errors: [...state.errors, action.payload], diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts index 0bda9e4e8d32a..ef90794e634b7 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts @@ -25,6 +25,7 @@ export interface GetMonitorStatesParams { pageSize: number; filters?: string | null; statusFilter?: string; + query?: string; } // To simplify the handling of the group of pagination vars they're passed back to the client as a string @@ -48,6 +49,7 @@ export const getMonitorStates: UMElasticsearchQueryFn< pageSize, filters, statusFilter, + query, }) => { pagination = pagination || CONTEXT_DEFAULTS.CURSOR_PAGINATION; statusFilter = statusFilter === null ? undefined : statusFilter; @@ -59,7 +61,8 @@ export const getMonitorStates: UMElasticsearchQueryFn< pagination, filters && filters !== '' ? JSON.parse(filters) : null, pageSize, - statusFilter + statusFilter, + query ); const size = Math.min(queryContext.size, QUERY.DEFAULT_AGGS_CAP); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts index 5c247cb8738e6..d59da8029f1b9 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts @@ -22,12 +22,14 @@ export interface GetPingHistogramParams { monitorId?: string; bucketSize?: string; + + query?: string; } export const getPingHistogram: UMElasticsearchQueryFn< GetPingHistogramParams, HistogramResult -> = async ({ uptimeEsClient, from, to, filters, monitorId, bucketSize }) => { +> = async ({ uptimeEsClient, from, to, filters, monitorId, bucketSize, query }) => { const boolFilters = filters ? JSON.parse(filters) : null; const additionalFilters = []; if (monitorId) { @@ -44,6 +46,20 @@ export const getPingHistogram: UMElasticsearchQueryFn< query: { bool: { filter, + ...(query + ? { + minimum_should_match: 1, + should: [ + { + multi_match: { + query: escape(query), + type: 'phrase_prefix', + fields: ['monitor.id.text', 'monitor.name.text', 'url.full.text'], + }, + }, + ], + } + : {}), }, }, size: 0, diff --git a/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts b/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts index 880f4051509d2..2999f9ebca065 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts @@ -15,6 +15,7 @@ export interface GetSnapshotCountParams { dateRangeStart: string; dateRangeEnd: string; filters?: string | null; + query?: string; } export const getSnapshotCount: UMElasticsearchQueryFn = async ({ @@ -22,6 +23,7 @@ export const getSnapshotCount: UMElasticsearchQueryFn => { const context = new QueryContext( uptimeEsClient, @@ -29,7 +31,9 @@ export const getSnapshotCount: UMElasticsearchQueryFn => { const { body: res } = await context.search({ - body: statusCountBody(await context.dateAndCustomFilters()), + body: statusCountBody(await context.dateAndCustomFilters(), context), }); return ( @@ -52,17 +56,32 @@ const statusCount = async (context: QueryContext): Promise => { ); }; -const statusCountBody = (filters: ESFilter[]) => { +const statusCountBody = (filters: ESFilter[], context: QueryContext) => { return { size: 0, query: { bool: { + ...(context.query + ? { + minimum_should_match: 1, + should: [ + { + multi_match: { + query: escape(context.query), + type: 'phrase_prefix', + fields: ['monitor.id.text', 'monitor.name.text', 'url.full.text'], + }, + }, + ], + } + : {}), filter: [ { exists: { field: 'summary', }, }, + ...filters, ], }, diff --git a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts index 50fcd94b57a19..639a24a2bdffa 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts @@ -52,7 +52,25 @@ const queryBody = async (queryContext: QueryContext, searchAfter: any, size: num const body = { size: 0, - query: { bool: { filter: filters } }, + query: { + bool: { + filter: filters, + ...(queryContext.query + ? { + minimum_should_match: 1, + should: [ + { + multi_match: { + query: escape(queryContext.query), + type: 'phrase_prefix', + fields: ['monitor.id.text', 'monitor.name.text', 'url.full.text'], + }, + }, + ], + } + : {}), + }, + }, aggs: { monitors: { composite: { diff --git a/x-pack/plugins/uptime/server/lib/requests/search/query_context.ts b/x-pack/plugins/uptime/server/lib/requests/search/query_context.ts index 524778cff28de..f377ba74dc8af 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/query_context.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/query_context.ts @@ -21,6 +21,7 @@ export class QueryContext { size: number; statusFilter?: string; hasTimespanCache?: boolean; + query?: string; constructor( database: UptimeESClient, @@ -29,7 +30,8 @@ export class QueryContext { pagination: CursorPagination, filterClause: any | null, size: number, - statusFilter?: string + statusFilter?: string, + query?: string ) { this.callES = database; this.dateRangeStart = dateRangeStart; @@ -38,6 +40,7 @@ export class QueryContext { this.filterClause = filterClause; this.size = size; this.statusFilter = statusFilter; + this.query = query; } async search(params: TParams) { diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts index daa7dc509ef83..8e98468496952 100644 --- a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts +++ b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts @@ -19,6 +19,7 @@ export const createMonitorListRoute: UMRestApiRouteFactory = (libs) => ({ filters: schema.maybe(schema.string()), pagination: schema.maybe(schema.string()), statusFilter: schema.maybe(schema.string()), + query: schema.maybe(schema.string()), pageSize: schema.number(), _debug: schema.maybe(schema.boolean()), }), @@ -34,6 +35,7 @@ export const createMonitorListRoute: UMRestApiRouteFactory = (libs) => ({ pagination, statusFilter, pageSize, + query, } = request.query; const decodedPagination = pagination @@ -47,6 +49,7 @@ export const createMonitorListRoute: UMRestApiRouteFactory = (libs) => ({ pagination: decodedPagination, pageSize, filters, + query, // this is added to make typescript happy, // this sort of reassignment used to be further downstream but I've moved it here // because this code is going to be decomissioned soon diff --git a/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts b/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts index 98d8fe99a43f7..8c0810d946a1b 100644 --- a/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts +++ b/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts @@ -20,11 +20,12 @@ export const createGetPingHistogramRoute: UMRestApiRouteFactory = (libs: UMServe monitorId: schema.maybe(schema.string()), filters: schema.maybe(schema.string()), bucketSize: schema.maybe(schema.string()), + query: schema.maybe(schema.string()), _debug: schema.maybe(schema.boolean()), }), }, handler: async ({ uptimeEsClient, request }): Promise => { - const { dateStart, dateEnd, monitorId, filters, bucketSize } = request.query; + const { dateStart, dateEnd, monitorId, filters, bucketSize, query } = request.query; return await libs.requests.getPingHistogram({ uptimeEsClient, @@ -33,6 +34,7 @@ export const createGetPingHistogramRoute: UMRestApiRouteFactory = (libs: UMServe monitorId, filters, bucketSize, + query, }); }, }); diff --git a/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts b/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts index 675384c573bc8..8c80c4d512b56 100644 --- a/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts +++ b/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts @@ -18,17 +18,19 @@ export const createGetSnapshotCount: UMRestApiRouteFactory = (libs: UMServerLibs dateRangeStart: schema.string(), dateRangeEnd: schema.string(), filters: schema.maybe(schema.string()), + query: schema.maybe(schema.string()), _debug: schema.maybe(schema.boolean()), }), }, handler: async ({ uptimeEsClient, request }): Promise => { - const { dateRangeStart, dateRangeEnd, filters } = request.query; + const { dateRangeStart, dateRangeEnd, filters, query } = request.query; return await libs.requests.getSnapshotCount({ uptimeEsClient, dateRangeStart, dateRangeEnd, filters, + query, }); }, }); diff --git a/x-pack/test/functional/apps/uptime/overview.ts b/x-pack/test/functional/apps/uptime/overview.ts index 9f2c55f68fe9b..6c9eb24070d8f 100644 --- a/x-pack/test/functional/apps/uptime/overview.ts +++ b/x-pack/test/functional/apps/uptime/overview.ts @@ -13,6 +13,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const retry = getService('retry'); const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + describe('overview page', function () { const DEFAULT_DATE_START = 'Sep 10, 2019 @ 12:40:08.078'; const DEFAULT_DATE_END = 'Sep 11, 2019 @ 19:40:08.078'; @@ -182,6 +184,12 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); + it('can change query syntax to kql', async () => { + await testSubjects.click('syntaxChangeToKql'); + await testSubjects.click('toggleKqlSyntax'); + await testSubjects.exists('syntaxChangeToSimple'); + }); + it('runs filter query without issues', async () => { await uptime.inputFilterQuery('monitor.status:up and monitor.id:"0000-intermittent"'); await uptime.pageHasExpectedIds(['0000-intermittent']); From 05717647ae580ac6d78433e6c28815041b67a4c5 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Wed, 24 Feb 2021 16:04:59 +0100 Subject: [PATCH 38/45] Bump the CI Node.js version from 14.15.4 to 14.16.0 (#92578) This wasn't part of #92421 as Docker Hub wasn't updated at the time. --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 3ca6b6a4b9098..445cc0e51073f 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,7 +1,7 @@ # NOTE: This Dockerfile is ONLY used to run certain tasks in CI. It is not used to run Kibana or as a distributable. # If you're looking for the Kibana Docker image distributable, please see: src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.ts -ARG NODE_VERSION=14.15.4 +ARG NODE_VERSION=14.16.0 FROM node:${NODE_VERSION} AS base From e3eaa97c6ba7a653bf8a7037c519884541263d96 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 24 Feb 2021 16:09:14 +0100 Subject: [PATCH 39/45] Fix navigating from discover single document view back to discover (#92463) --- .../discover/public/kibana_services.ts | 9 ++++++- .../apps/context/_discover_navigation.js | 27 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/plugins/discover/public/kibana_services.ts b/src/plugins/discover/public/kibana_services.ts index ba5ca5efad8c2..27bcc00234939 100644 --- a/src/plugins/discover/public/kibana_services.ts +++ b/src/plugins/discover/public/kibana_services.ts @@ -59,10 +59,17 @@ export const [getUrlTracker, setUrlTracker] = createGetterSetter<{ export const [getDocViewsRegistry, setDocViewsRegistry] = createGetterSetter( 'DocViewsRegistry' ); + /** * Makes sure discover and context are using one instance of history. */ -export const getHistory = _.once(() => createHashHistory()); +export const getHistory = _.once(() => { + const history = createHashHistory(); + history.listen(() => { + // keep at least one listener so that `history.location` always in sync + }); + return history; +}); /** * Discover currently uses two `history` instances: one from Kibana Platform and diff --git a/test/functional/apps/context/_discover_navigation.js b/test/functional/apps/context/_discover_navigation.js index 403f85273fcf1..6152659e47f27 100644 --- a/test/functional/apps/context/_discover_navigation.js +++ b/test/functional/apps/context/_discover_navigation.js @@ -18,7 +18,8 @@ export default function ({ getService, getPageObjects }) { const retry = getService('retry'); const docTable = getService('docTable'); const filterBar = getService('filterBar'); - const PageObjects = getPageObjects(['common', 'discover', 'timePicker']); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'context']); + const testSubjects = getService('testSubjects'); describe('context link in discover', () => { before(async () => { @@ -69,5 +70,29 @@ export default function ({ getService, getPageObjects }) { } expect(disabledFilterCounter).to.be(TEST_FILTER_COLUMN_NAMES.length); }); + + // bugfix: https://github.com/elastic/kibana/issues/92099 + it('should navigate to the first document and then back to discover', async () => { + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + // navigate to the doc view + await docTable.clickRowToggle({ rowIndex: 0 }); + + // click the open action + await retry.try(async () => { + const rowActions = await docTable.getRowActions({ rowIndex: 0 }); + if (!rowActions.length) { + throw new Error('row actions empty, trying again'); + } + await rowActions[1].click(); + }); + + const hasDocHit = await testSubjects.exists('doc-hit'); + expect(hasDocHit).to.be(true); + + await testSubjects.click('breadcrumb first'); + await PageObjects.discover.waitForDiscoverAppOnScreen(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + }); }); } From d9417635e8696a4206736af1242cc61da61c1e10 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 24 Feb 2021 10:32:04 -0500 Subject: [PATCH 40/45] skip flaky suite (#92567) --- .../security_solution_endpoint/apps/endpoint/policy_details.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 40972da0044bc..ba4687e497230 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 @@ -21,7 +21,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const policyTestResources = getService('policyTestResources'); - describe('When on the Endpoint Policy Details Page', function () { + // Failing: See https://github.com/elastic/kibana/issues/92567 + describe.skip('When on the Endpoint Policy Details Page', function () { this.tags(['ciGroup7']); describe('with an invalid policy id', () => { From 614c6c6853936283f1cb4b85a85a56e91c968514 Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Wed, 24 Feb 2021 10:42:07 -0500 Subject: [PATCH 41/45] [Lens] Fix unformatted timeseries functions (#92498) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../indexpattern.test.ts | 49 +++++++++++++++++++ .../indexpattern_datasource/to_expression.ts | 2 +- .../test/functional/apps/lens/smokescreen.ts | 37 ++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts index 4e7e07b99904f..bc4bb028696b8 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts @@ -602,6 +602,55 @@ describe('IndexPattern Data Source', () => { `); }); + it('should put column formatters after calculated columns', async () => { + const queryBaseState: IndexPatternBaseState = { + currentIndexPatternId: '1', + layers: { + first: { + indexPatternId: '1', + columnOrder: ['bucket', 'metric', 'calculated'], + columns: { + bucket: { + label: 'Date', + dataType: 'date', + isBucketed: true, + operationType: 'date_histogram', + sourceField: 'timestamp', + params: { + interval: 'auto', + }, + }, + metric: { + label: 'Count of records', + dataType: 'number', + isBucketed: false, + sourceField: 'Records', + operationType: 'count', + timeScale: 'h', + }, + calculated: { + label: 'Moving average of bytes', + dataType: 'number', + isBucketed: false, + operationType: 'moving_average', + references: ['metric'], + params: { + window: 5, + }, + }, + }, + }, + }, + }; + + const state = enrichBaseState(queryBaseState); + + const ast = indexPatternDatasource.toExpression(state, 'first') as Ast; + const formatIndex = ast.chain.findIndex((fn) => fn.function === 'lens_format_column'); + const calculationIndex = ast.chain.findIndex((fn) => fn.function === 'moving_average'); + expect(calculationIndex).toBeLessThan(formatIndex); + }); + it('should rename the output from esaggs when using flat query', () => { const queryBaseState: IndexPatternBaseState = { currentIndexPatternId: '1', diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts b/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts index eff88574161b1..cdac7d154628d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts @@ -177,8 +177,8 @@ function getExpressionForLayer( idMap: [JSON.stringify(idMap)], }, }, - ...formatterOverrides, ...expressions, + ...formatterOverrides, ...timeScaleFunctions, ], }; diff --git a/x-pack/test/functional/apps/lens/smokescreen.ts b/x-pack/test/functional/apps/lens/smokescreen.ts index 6ca13b232e11a..3e9ffa18c5949 100644 --- a/x-pack/test/functional/apps/lens/smokescreen.ts +++ b/x-pack/test/functional/apps/lens/smokescreen.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { range } from 'lodash'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { @@ -439,6 +440,42 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await find.allByCssSelector('.echLegendItem')).to.have.length(2); }); + it('should allow formatting on references', async () => { + await PageObjects.visualize.navigateToNewVisualization(); + await PageObjects.visualize.clickVisType('lens'); + await PageObjects.lens.goToTimeRange(); + await PageObjects.lens.switchToVisualization('lnsDatatable'); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsDatatable_column > lns-empty-dimension', + operation: 'date_histogram', + field: '@timestamp', + }); + await PageObjects.lens.configureDimension({ + dimension: 'lnsDatatable_metrics > lns-empty-dimension', + operation: 'moving_average', + keepOpen: true, + }); + await PageObjects.lens.configureReference({ + operation: 'sum', + field: 'bytes', + }); + await PageObjects.lens.editDimensionFormat('Number'); + await PageObjects.lens.closeDimensionEditor(); + + const values = await Promise.all( + range(0, 6).map((index) => PageObjects.lens.getDatatableCellText(index, 1)) + ); + expect(values).to.eql([ + '-', + '222,420.00', + '702,050.00', + '1,879,613.33', + '3,482,256.25', + '4,359,953.00', + ]); + }); + /** * The edge cases are: * From fb96b9c755552c8cd8b99863132299d79ea9c9c5 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Wed, 24 Feb 2021 07:53:36 -0800 Subject: [PATCH 42/45] [Docs] Changed REST API intro page with removing experimental definition for all APIs. (#92539) * [Docs] Changed REST API intro page with removing experimental definition for all APIs * fixed ci * fixed ci --- docs/api/using-api.asciidoc | 86 ------------------------------ docs/user/api.asciidoc | 102 +++++++++++++++++++++++++++++------- 2 files changed, 82 insertions(+), 106 deletions(-) delete mode 100644 docs/api/using-api.asciidoc diff --git a/docs/api/using-api.asciidoc b/docs/api/using-api.asciidoc deleted file mode 100644 index d66718be4074a..0000000000000 --- a/docs/api/using-api.asciidoc +++ /dev/null @@ -1,86 +0,0 @@ -[[using-api]] -== Using the APIs - -Interact with the {kib} APIs through the `curl` command and HTTP and HTTPs protocols. - -It is recommended that you use HTTPs on port 5601 because it is more secure. - -NOTE: The {kib} Console supports only Elasticsearch APIs. You are unable to interact with the {kib} APIs with the Console and must use `curl` or another HTTP tool instead. For more information, refer to <>. - -[float] -[[api-authentication]] -=== Authentication -The {kib} APIs support key- and token-based authentication. - -[float] -[[token-api-authentication]] -==== Token-based authentication - -To use token-based authentication, you use the same username and password that you use to log into Elastic. -In a given HTTP tool, and when available, you can select to use its 'Basic Authentication' option, -which is where the username and password are stored in order to be passed as part of the call. - -[float] -[[key-authentication]] -==== Key-based authentication - -To use key-based authentication, you create an API key using the Elastic Console, then specify the key in the header of your API calls. - -For information about API keys, refer to <>. - -[float] -[[api-calls]] -=== API calls -API calls are stateless. Each request that you make happens in isolation from other calls and must include all of the necessary information for {kib} to fulfill the request. API requests return JSON output, which is a format that is machine-readable and works well for automation. - -Calls to the API endpoints require different operations. To interact with the {kib} APIs, use the following operations: - -* *GET* - Fetches the information. - -* *POST* - Adds new information. - -* *PUT* - Updates the existing information. - -* *DELETE* - Removes the information. - -For example, the following `curl` command exports a dashboard: - -[source,sh] --- -curl -X POST api/kibana/dashboards/export?dashboard=942dcef0-b2cd-11e8-ad8e-85441f0c2e5c --- -// KIBANA - -[float] -[[api-request-headers]] -=== Request headers - -For all APIs, you must use a request header. The {kib} APIs support the `kbn-xsrf` and `Content-Type` headers. - -`kbn-xsrf: true`:: - By default, you must use `kbn-xsrf` for all API calls, except in the following scenarios: - -* The API endpoint uses the `GET` or `HEAD` operations -* The path is allowed using the <> setting -* XSRF protections are disabled using the <> setting - -`Content-Type: application/json`:: - Applicable only when you send a payload in the API request. {kib} API requests and responses use JSON. - Typically, if you include the `kbn-xsrf` header, you must also include the `Content-Type` header. - -Request header example: - -[source,sh] --- -curl -X POST \ - http://localhost:5601/api/spaces/space \ - -H 'Content-Type: application/json' \ - -H 'kbn-xsrf: true' \ - -d '{ - "id": "sales", - "name": "Sales", - "description": "This is your Sales Space!", - "disabledFeatures": [] -} -' --- diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index 9916ab42186dc..459dbbdd34b27 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -1,37 +1,99 @@ [[api]] = REST API -[partintro] --- Some {kib} features are provided via a REST API, which is ideal for creating an integration with {kib}, or automating certain aspects of configuring and deploying {kib}. -Each API is experimental and can include breaking changes in any version of -{kib}, or might be entirely removed from {kib}. +[float] +[[using-apis]] +== Using the APIs -//// -Each API has one of the following labels: +Interact with the {kib} APIs through the `curl` command and HTTP and HTTPs protocols. -* *Stable* APIs should be safe to use extensively in production. Any breaking -changes to these APIs should only occur in major versions and will be -clearly documented in the breaking changes documentation for that release. +It is recommended that you use HTTPs on port 5601 because it is more secure. -* *Beta* APIs are on track to become stable, permanent features of {kib}. -Caution should be exercised in their use since it is possible we'd have to make -a breaking change to these APIs in a minor version, but we'll avoid this -wherever possible. +NOTE: The {kib} Console supports only Elasticsearch APIs. You are unable to interact with the {kib} APIs with the Console and must use `curl` or another HTTP tool instead. For more information, refer to <>. -* *Experimental* APIs are just that - an experiment. An experimental API might -have breaking changes in any version of {kib}, or it might even be removed -entirely. +[float] +[[api-authentication]] +=== Authentication +The {kib} APIs support key- and token-based authentication. -If a label is missing from an API, it is considered `experimental`. -//// +[float] +[[token-api-authentication]] +==== Token-based authentication + +To use token-based authentication, you use the same username and password that you use to log into Elastic. +In a given HTTP tool, and when available, you can select to use its 'Basic Authentication' option, +which is where the username and password are stored in order to be passed as part of the call. + +[float] +[[key-authentication]] +==== Key-based authentication + +To use key-based authentication, you create an API key using the Elastic Console, then specify the key in the header of your API calls. + +For information about API keys, refer to <>. + +[float] +[[api-calls]] +=== API calls +API calls are stateless. Each request that you make happens in isolation from other calls and must include all of the necessary information for {kib} to fulfill the request. API requests return JSON output, which is a format that is machine-readable and works well for automation. + +Calls to the API endpoints require different operations. To interact with the {kib} APIs, use the following operations: + +* *GET* - Fetches the information. + +* *POST* - Adds new information. + +* *PUT* - Updates the existing information. + +* *DELETE* - Removes the information. + +For example, the following `curl` command exports a dashboard: + +[source,sh] +-------------------------------------------- +curl -X POST api/kibana/dashboards/export?dashboard=942dcef0-b2cd-11e8-ad8e-85441f0c2e5c +-------------------------------------------- +// KIBANA + +[float] +[[api-request-headers]] +=== Request headers + +For all APIs, you must use a request header. The {kib} APIs support the `kbn-xsrf` and `Content-Type` headers. + +`kbn-xsrf: true`:: + By default, you must use `kbn-xsrf` for all API calls, except in the following scenarios: + +* The API endpoint uses the `GET` or `HEAD` operations +* The path is allowed using the <> setting +* XSRF protections are disabled using the <> setting + +`Content-Type: application/json`:: + Applicable only when you send a payload in the API request. {kib} API requests and responses use JSON. + Typically, if you include the `kbn-xsrf` header, you must also include the `Content-Type` header. + +Request header example: + +[source,sh] +-------------------------------------------- +curl -X POST \ + http://localhost:5601/api/spaces/space \ + -H 'Content-Type: application/json' \ + -H 'kbn-xsrf: true' \ + -d '{ + "id": "sales", + "name": "Sales", + "description": "This is your Sales Space!", + "disabledFeatures": [] +} +' +-------------------------------------------- --- -include::{kib-repo-dir}/api/using-api.asciidoc[] include::{kib-repo-dir}/api/features.asciidoc[] include::{kib-repo-dir}/api/spaces-management.asciidoc[] include::{kib-repo-dir}/api/role-management.asciidoc[] From e980ee4740c64c6d79e66c2b10d834982197b652 Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Wed, 24 Feb 2021 09:54:28 -0600 Subject: [PATCH 43/45] [DOCS] Updates reporting and Canvas share options (#92529) * [DOCS] Updates reporting and Canvas share options * Update docs/canvas/canvas-share-workpad.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Resizes images and minor text edits * Updates dashboard embed content Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- docs/canvas/canvas-share-workpad.asciidoc | 31 ++---------- docs/index.asciidoc | 2 +- docs/user/dashboard/dashboard.asciidoc | 6 +-- .../automating-report-generation.asciidoc | 13 ++---- .../images/canvas-full-page-layout.png | Bin 226503 -> 57826 bytes .../images/preserve-layout-switch.png | Bin 168022 -> 63214 bytes docs/user/reporting/images/share-menu.png | Bin 93376 -> 36689 bytes docs/user/reporting/index.asciidoc | 44 ++++++++---------- .../security/authentication/index.asciidoc | 1 + 9 files changed, 32 insertions(+), 65 deletions(-) diff --git a/docs/canvas/canvas-share-workpad.asciidoc b/docs/canvas/canvas-share-workpad.asciidoc index 0df8357bb3bd6..68078b74da171 100644 --- a/docs/canvas/canvas-share-workpad.asciidoc +++ b/docs/canvas/canvas-share-workpad.asciidoc @@ -4,6 +4,8 @@ When you've finished your workpad, you can share it outside of {kib}. +For information on how to create PDFs and POST URLs, refer to <>. + [float] [[export-single-workpad]] === Export workpads @@ -17,37 +19,12 @@ image::images/canvas-export-workpad.png[Export single workpad through JSON, from Want to export multiple workpads? Go to the *Canvas* home page, select the workpads you want to export, then click *Export*. -[float] -[[create-workpad-pdf]] -=== Create a PDF - -If you have a subscription that supports the {report-features}, you can create a PDF copy of your workpad that you can save and share outside {kib}. - -To begin, click *Share > PDF reports > Generate PDF*. - -[role="screenshot"] -image::images/canvas-generate-pdf.gif[Image showing how to generate a PDF] - -For more information, refer to <>. - -[float] -[[create-workpad-URL]] -=== Create a POST URL - -If you have a subscription that supports the {report-features}, you can create a POST URL that you can use to automatically generate PDF reports using <> or a script. - -To begin, click *Share > PDF reports > Advanced options > Copy POST URL*. - -[role="screenshot"] -image::images/canvas-create-URL.gif[Image showing how to create POST URL] - -For more information, refer to <>. - [float] [[add-workpad-website]] === Share the workpad on a website -beta[] Canvas allows you to create _shareables_, which are workpads that you download and securely share on any website. To customize the behavior of the workpad on your website, you can choose to autoplay the pages or hide the workpad toolbar. +beta[] Canvas allows you to create _shareables_, which are workpads that you download and securely share on any website. +To customize the behavior of the workpad on your website, you can choose to autoplay the pages or hide the workpad toolbar. . Click *Share > Share on a website*. diff --git a/docs/index.asciidoc b/docs/index.asciidoc index eb6f794434f8a..b91af2ab51ebf 100644 --- a/docs/index.asciidoc +++ b/docs/index.asciidoc @@ -7,7 +7,7 @@ :blog-ref: https://www.elastic.co/blog/ :wikipedia: https://en.wikipedia.org/wiki -include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[] +include::{docs-root}/shared/versions/stack/7.10.asciidoc[] :docker-repo: docker.elastic.co/kibana/kibana :docker-image: docker.elastic.co/kibana/kibana:{version} diff --git a/docs/user/dashboard/dashboard.asciidoc b/docs/user/dashboard/dashboard.asciidoc index 3c86c37f1fd30..d65fef9a512d7 100644 --- a/docs/user/dashboard/dashboard.asciidoc +++ b/docs/user/dashboard/dashboard.asciidoc @@ -253,10 +253,8 @@ When you're finished making changes, save the dashboard. To share the dashboard with a larger audience, click *Share* in the toolbar, then choose one of the following options: -* *Embed code* — Embed the dashboard as an iframe on a web page. Embedded dashboards are fully interactive, but you can - hide some parts of the dashboard using the menu options. User authentication is required, which the user provides or via reverse proxy.  - <> is also supported. For more details, - learn about <>. +* *Embed code* — Embed a fully interactive dashboard as an iframe on a web page. To access embedded dashboards, you can require users to +log in using their {kib} credentials, via reverse proxy, or enable <>. * *Permalinks* — Share a direct link to a {kib} dashboard. User authentication is required. diff --git a/docs/user/reporting/automating-report-generation.asciidoc b/docs/user/reporting/automating-report-generation.asciidoc index 413573e7ec182..4c5a87782618e 100644 --- a/docs/user/reporting/automating-report-generation.asciidoc +++ b/docs/user/reporting/automating-report-generation.asciidoc @@ -8,17 +8,16 @@ include::report-intervals.asciidoc[] [float] === Create a POST URL -Create the POST -URL that triggers a report to generate. +Create the POST URL that triggers a report to generate PDF and CSV reports. To create the POST URL for PDF reports: -. Open then main menu, click *Dashboard*, then open a dashboard. -+ -To specify a relative or absolute time period, use the time filter. +. Open the  dashboard, visualization, or **Canvas** workpad. . From the {kib} toolbar, click *Share*, then select *PDF Reports*. +. If you are using **Canvas**, click *Advanced options*. + . Click *Copy POST URL*. + [role="screenshot"] @@ -27,9 +26,7 @@ image::images/report-automate-pdf.png[Generate Visualize and Dashboard reports] To create the POST URL for CSV reports: -. Load the saved search in *Discover*. -+ -To specify a relative or absolute time period, use the time filter. +. In *Discover*, open the saved search. . From the {kib} toolbar, click *Share*, then select *CSV Reports*. diff --git a/docs/user/reporting/images/canvas-full-page-layout.png b/docs/user/reporting/images/canvas-full-page-layout.png index 06c94f05531b26d490916fea440934b2cf56a777..518a4bbb98b17f7406bc3d9ace2bf71cef40aaef 100644 GIT binary patch literal 57826 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ⅅgfP6(J1SYhH^M!Qo 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

3WxpX59M<8ZqCwRmNz7`sb#dilv2CB?O) zepY~k;j--zfJE?Y5X>S#R>p>ya>3cb?zC;?d^6aU7c<|X$pa%_QOn!_$7#rmv^^mP zwURU*!NSRwDxDS^1|lJ~3K$j!*@5!>2i8-{zn={nY8y=yw%=32=5eUqvyS5z`sn$G zteC~Wb)SC>?qHLsC;%TFk|QFd3ddl1CfXw_BLxc^-*)xlYi3$^7ybM>D{m}|_4D*8_4HG+iC=p-rjS6xE^({ON}mRK}I9=(nWfeZ|8wF)g8z`S^0MmcX}C95LS?&*?MkuD&UX2UaXLFX zliu7$$HWX^v&z{TNlq7R{$fj1OS!+C#c(iynisnxg4uzgY#ORV|YF4002V2RR6Xd|xx|)gYGlnYQ zw{QD(%f!+&?)SI12}p@hFi<%VO3{C=WqHMI;3Thh89Vjn_ZUCo>qd}(r=Ft;Ewn7&tLfWu zq>YNLF|F;w$IBZIRb@P-#Oo=IE`Mbhl}8q5Wo-&4`v2?)(f$iGP&ul2XC0xNH>m^K zfE}0*FnK+5g4*frZqFPNi@CbmDJDzZ-%VQp(4K^a^X=hLIVMcYspI!BpQ>;#u{Rc4FI0h2t_ACd0=3Pg%?5iZ~!lC_89XfFEsq z=PK1a^@V?QtF#mgOPH}c3{Da&+#wGp<@^^*Is8CiEd$rUpUm@DNXW)Xbbb8z+0}_N z*1kfGNeKi6GX#sjBdQA5aZ>1Z?;yUo4+w2#db^eYkY3qa9CE2gZY&`Y7K4;DdbLNR zvo(6LN~@FRWW%2O>i>$dYaXWbS*}g=UgcN_Oe7X;(t=yDEEz;>ez(34>*Siqn%m)h zpG~XB3i}Tf{3{2D0y=xXZisKQG?g_qslh#Xh$DuWa0t5b22iq-V?)Z)*qt?-u2#_E zB0yG$I=QfBc(+6pkhm>Aq}HjA(_j&m%>-s;bm@$qnHKK^g30{33r^DTjkdP?=jX`t z+DSM+euW>wF(~Dl#fLbzN#T#Y<0K3``8GXkcVUVO`hMoA_?M}v7-6Be`P|pN=jDLs z7!>Yp$E(G}{S28^L!Q@Tg=6nup<@ijba6)RD|7dc@=vD;b0m>L6khQ=k#H^Exj!8@GNc50J8WcaE)w#IIZA$Xl6kVwWTc0If;oLuPt%7q z^>n=0-Ub(+a9*t&$#Ak+0+4m}B_ja5ccZdrl58EL(Jq`qcX-PVi0Vo9!njTJ|H(t^ zkihtFqYaLZDJMew^!#kXD8;1e$lC9pKU<~9rl3cUs{MSqQ&O@#SOg0Q4)IyWCE?}G z2C;zp)%t`}L#|fvMXj+BEsHOf@zYm-8<*&};o;9yQ_OH8a`0CB0_qO3AO#Z_H$TD;i*?&SKs&_%bIemDy7ZFL(%D}`BOO-Lll`YT zewZ~Fa2@Cn=9s>bM^>0Jwc_sXUamTSZ<%doxc-5WYNbygJGE~pJOs#^8&rI#ZKk6l zP$$jk;SQRiDc1;b-(w?#vp(_V<@6;fj=q;B_Z5$tCptT}tA0hqCl*Hi9*wPr9fN5I z(Et(Y`6$k+g(kG9Tb#k_qoqV#^3lb`TO3AyTrnJs&JMn-xjSWo5RX>Vy$>tdkhNANd+4bc@%<>RL(r)P&KQbkoy zNx94jhl1T}n6Y7>*TtR_QLMg>Jq4E%&T31qk{MFme0XK;;*w){S+Tu7t~Q>J-RBgAi&Dc%F7--7TtAI|3Jo* zQ`nyQZCapz8+-RRA<;46KFcOv{X^bR>|f3#J}E$UZ+(4nbM@-TG7A?Ux)>TA+6j)8 zh-5OGib_~v$dFjX9~A$t8df^Cs~-2MpPhcrBlU(05E30x1ZBy6WG^7n8xB^^Xg)y- zE-Er%qh!XN%5%o`Fh)X5;?#l+qzLJ+er1l)zwhykhn6#1S`HL&nLxt2LNKXcMOxW3-MHh2D6K1d&629DvCc}q)8g?^0*j@{FPUmn=3s;ss`<|SmG)1Vj}q|R=v z%YO{9>H+TiBcpIPr9?-�(u=l0lS~wIB(>hHATszg#uU@1W3BOZZn6(pr4)fdC>y zENz;)TN~Rin`|Zdm0?Kmoe&b6w&n|wB#^v1j2xd4W1r(<+9AQCHK6?1!;S*qtoyA| zfNsEKQJ7p`A1!RV;Mr~5^ny>iaYzcvz7|T8gTS}9#+@b{joRwAVqmu4#;F$THTpsE z?c=qGmT(}HhcGcQF_>bMy)uY1TrX(lAaZdPKte&zUR#xyXF%Isu9KUdnw+8RmOPZ+ zZp&R{dPLrCwze$CBrFQ#UJupiprhpX^WvHGL;AT-kmJfFstr(0H37PIr!-&BHIL6- zyM^M+ID!NYjt;Q)55?hkqo4#j#J1VBG?(X!PVrZCa(^(fMg-4Jj6}UCU>IP@XJxd1 zkbhU|Mb$Be)ioAXgs;XPSRhhC`^QUKXO<)@Wnr1ivMnZJ6S!hu8=nkWC0f4y0M6Uci42UP%v6>%UkT3q&;9B9MWMO37~T?>^M^UZy=xk4&?0QLPkWr;c+lGjj+fgv&POl3y(NYonwa zOSrhX<%d(2nx~~@dOfH*kfj}^WG4@kQ+M_>HR1Ou1G+RBME7IZXkNOFLteHnegTc@Yvg=AyjLxbU=)mIm$9iGg`2+Z!YZfNRc!RQyV8+wdrXqF=|duENB=={||Nu&y&57 zuyl9O*(1x#G^1F&$XvmG#SWU9I=I-G$?K_=fM&iOE48f;8&8j1t5Q zAg^jCO@MEv&|*~rlK3$f6e`+IZNd2WHE=S$f~Cwj8iq^bUS-YezJmGG>cJVZp%pfU zK79T-X4gPuPvH8GD%pV#!Kw@TWbXCu@jwzNBP|7Rk$q zj*gDMO#|PH53MYdP@@#Z%3xxn{C*q z^~&7$fB?wC^Yw&SY*O5sW2sX_8r#zQB8C1nQ!2sQmWBP=S|me@eL2ef;&$BfnhKp~ z7@AxSCv7WD&2Xn+_W2USq!6qiXe4H;;(5w5*D8&F;RuHc8VIhVa&u|Xt0VYDaAgr{ zO?2_(oOr7A!zVaU0f2n=FKhB7Ayg6_I%e`{)0O!VGgFNy+T^&Raho@~8N*s_eI3jC zm#w9>xE2IMC_Q!_0rxvFV{~FG+kSwZ&c)<78B&$Y$ty4SVdW+MhkjREckZpo=vDML zi&0Z$a64K)3#A@lRv}oy%1F(YbMob?jyJK)D+jo^+pn21{_N!YwC?4EeABxzCw8BE z&PdkoRYGe;ub6pYhpTQP+EF%aY4)d zrVGA;l_?6DlAR*b<;BO&&4~*aqm%{7p+?8(HG9u)2Ecy2*o=!aS-iG%Ao5iBVs%HE z!_9MW4<#;IHJ}D|^E82(oj#K-hH~fT>+sIhyVhysfts5xpkZn z|7G0t$!Dwx*NyGdH}f!q2n7C2{17@|64JU5@-&20f*kDWr6CC%n9f5t*CjF^jlPXR zy+=X4M7d0Nkl27EA%3OEe zFyn?hsNY#zmwBz$(3%v{w4!IN?BVCVc721?(9qY{(opc0wzFebCX}&Q5HQ;llyP|B zR8LJE7?i+vR1#8j+Uq_(J{N~pAa~dB!1_J~2AOV&U{UPpB)YYe6hacR6jHI}SAFje zF?PleSbdZahM|ltw4+C%=fN6t3CTdCPxdJ6-ca~GsZrYF9%Pcr2#^GcD!XH&7$T5?ve2Wjvj#|gVCB`8S&9@ zoQ{rj)s|2LT=mI_b-5t|vL8Tq;k`p6Zysp*^{4f^XJ@}N&FFo@;-C#VM)}sfilMO* zzs0wX6f0)Wi;QgvV+`LY@>ff=M}Kr6Um~r$YQ`|7nEZ8Y9;iUxsiDFrF#8Ww+)*GP z5IE5Yz@jB1C+W|3GQ4uWukQ0P`?35@SFB+4|uDp##V< zqr6cO84hHv79d&7D;q+Rdp?O1Mqu9M@6MDC?Ot&0F}T_lnRGoMTzC= z+S=N>2IxTeOt@;{f&y}P!omU>G6;DDP3WLjHX=7rCy1A5XlTau!HxK)(+rsC5PuGJ zz|c}A8ZZy~=kwm?!Q&BIa3chW2bjnYu(!_o@V2Ukepd+<_@Au68&?Je+L=EXFfd~2 zei@()z-{G&*V`ir8xnc1+sXd6Jl4}T&{EoN$V`ZGd_aJ(A|p)12{Fk52_SN}zP_=%yrQpfklMf)hN&b)q8qH<>>5V` zRuw4na9-*go0czKf_lKa7eOB{0Uw+Id-op*3@~M7q!HRnd0;ge9pN4t58VII5K3)@ z8vJyuFib)YoRP6nN|oWYfPv$PHi`r*Z)$0U{2vz^J5d2$C_Xru(((2fYOK3H6W4u;Z&QWQQq$}SX5X`=N23))v>qq(8E8EmQT zr6gdT=n|!$B4*y+l3mQ1yFl!<2T@GuH&CW^sfJJkT}&>I;sL6*qpenJvus<8wPgO)Mch5X)Xr@pjegZP8riQTM&l= z0fB%(z!3pza*_D5qN0XUvIzHN^F+o~Bxy|MaD>|0E!Hk8rt5^b*rkgX#2zW%OY|4< zsidi~b@y^PSta46K-@>ZM7torK4ci`)#hf0K$t;)K#X==!14DWs-jU04Gof}hot?w zsseX`14DQKd2$GTrGPQMi0R$h6lek^A|i^4OR?+Y6+t&xP>`3Gn?nwz&d$y*C`Ua# z8(cr*f zrwx}z*YMyFz7ztlHKEmxS52db=L@U=g`zc$%jfVCp$5z$_~O>{2LW<}>gEOd^ZT_= z7nxmWpO2jxzB)-__T$CYl$UpMk*E#WX?TE?Bf6zaT${T=L3}WNJR{g3hikZx2t5EW{0y2}d44 zlx?Hgyzk(lzP{cVUcQLK5#ciZ5-osyLg*Msw*?fo%}9s5t|SRn=AWqsx-@H2~d=_+a2g`x+V6-mQ z4RFopB39*22v8$Tw?2St>Ht_-h|uCidpr=68I34{ii)a5F&?^_0DwdW`-{qA#{;ss zRv;h{a1jKka%JtZHMO)5Y>H@0y8WE249B-97Hh1*o}`KM@j{l3hzNsZj}%Ei=`x`V z?LT-ZJ|<@6@+D-;L3WgPhmei68o3-_s}xjVG!ne4oShQ{u+W>$Ev$;W_w@8h5zl_U zRNm$5V@m5G?I_!ci;kjn8WF=pK5YMJhh+cn?ZGpEM|xp?E>RGKHRBl|rUJvilpED! zOj1LT8LEk_g3Wd{LExGB{63B^c(fIvVX;F<`Ktdo*nuzDzc zh4fGUe`xLy{?)5RQiPE|Iy^!HN;z?;Qe?1w2#x~uhlWPffMT*$lKCEAfgBTLfQoYdee`QpibB(e(}F6khi{ugoi9ZK*36Iwh(@1&xT|p;S&Fi3`;@P9%G|uQ-n0&W|8Sh z#8pelg{0~R#~|V}o(s`C$a&2q{sGRCU|}Y)Whor4y~EbqGXYN0^Cza6U}(w_;0S8( z=!6-h{#W7pZJ`FZ{xcFQbZG?05K1v!%@TBEUv?kTPvdGcV5kza4HpH+h zi6fzlP>8Cgz7B^#R76B{bTm4E5>ddlb~T_IffXSe>2{J7^~#Nozacp;BqF@Q1# zO)tISsa;?+R8&?6n@rGYAn#A()@V5FHz6Tz&8n3o48^rlxOX4ob!mAeX+TjD$SX=n zG?NoaVb8e~4#EiH{{BYtjFSBb37h+Z51JB=lx0g6TH`Y9X;4XfNdzRm3)+@9B?o)n1_nxayM;>v9tW z>e{sx0AL`J7sz#%Pi|210^^@Toe-e!wVv}PjXT`sd#i|KCB5=3BYcH$7u+8N$F;Q~L zf5nnbd~jEH4_0JJ4VWV9MrRpLbg@oy3K1f}Z{6YWln4wUy-#X#A_6XI0B(wtdlFyi{J~P zv+&lY_!m0BO0q01UYMJcjl!T{IMEs)8j&59EKKMjgk-RziAHMr`KEx}LyDxTTGW6J z96g!=$|1@HAtFRCkUWEb7?S(Ktv*5xaI4297VBaNSbK*ZT>;bwaGl(s07iWPa)ZLc zgwTH?@FUs{uPeEON}J7^#6f@qL?Hpke$SMZmA|$1ontQVzI*RH<`~BTW#yIfAe-V96s#dU?ad zna&5YygzcTzdvpV4A}jHS~oS5!lNOwmJFwL^$oCCFwE=Tsc)bk1AJU;G{z$W15g9Z zEiH{r%~A+&kZF3HC2t>}pkNb3ptWmOL`O%!gCglCbpUpJy0dWKeodq=;(PzVAdDY2 z#h!Arv)C7jK3RDZZiTp5N(^XV)ZGZ!!q=zx0Uj7^_WJsp!?@WLe^-0s*%`z}%^Q zhf*ilrRYG^36|+VyaZ1iq)g7Y4%DEU?g34WVIT?#aJI+`E2NqX--Qz`)$tWP(MZw% z*+k&Yx3)d0;Jf0(NUyi zf1^QpSz&Q+YHmJMRJ?lSGI9sOfze!xl-X@V4e+E&E|M-~vor&oJcKKc=!qSj+&Bcb z4(hQ}SQT`a*yx!0h9)v^5(A(+Im{NA`iSggL?y%)f)H7Znwpvk^F`{NrW)Yog--xM z91)qofReKE(y~feHsYX}Sq z3XmKdI{!$Nt6Zlc)Bx9c7Gfpthd^tW*4(nA!ZHinNHY4qcE=hhHya+`Ir;4_$d;Vf zd~fkmntbH(oMm!uK~iV_3pI_)lK@27@l%-lp1W>8?X;7paDf;q5D*9m1WqslZa;karw!h*(OtABa6jigpf(q!RS^4cJr7^i$Ofmuy;ED!(L2 zLm!fZbTP5xz95nqZ#K+(;8hQsq|FAI7D5s6!FXvr0cKo|wt)aw=KmCAl67J~=Kiy2H}(^6-QTpPrgB4e8m*ec=rV zF#40YhFc5_>DRGB!(j2qtb_#+q)Yi;&E)6+#41qzmz+rK2GJRLyl-HDRHub|4wZ;|AnBzQDbbvz*U03|^7_NXbVhoW1UUo{Qv!2jt zFArxcH;VS?Kh$nZh#1EL0;ri)1BfSn`|WpG>h;%O3wKkq=BJ*1mb@JC@v&E4ajE9i z^bR*~extOkoLWEsbKTWA%HMtWgF{6n4Gm4?smRaIIe){se8K3>%y-Xw?`_|^?*RG2 z2`Y=olEpL^VS3n*Z8y$leyLRo$Q%+u|5bpVEeEd&;W!i*< z_$w~olk`v0tiit1C^CFBC>Q z5_71*4>6YrS1z=dyXr*v4h;{(_?ricMHpNKR%3J`F;Nx@_H$d6*#{zp3Yszcgg4h1s`W^ z`{QSD=71Io=h1q5br4{9A?{jYY^^=TKNx!2+tDMXSw zi<=kF`@!j_pQ7%kU0GRuo_yq&KT#Hd9-_XAnmb>-^$ztdKK$ro z2C&p`-uLzV{9N_mDYc(_{=bj?`f>GQxcrq@w_qCl(;pvAN|HR|2otYuc}qrP!}@a^ zWrA(*ye~hd+itx{xjTZ<4}bK49G@+B?y>*hW54<1_r81Y#tYUfBWXxQwtkDGi%CsNHc^H6T&0kGKSg0w`gtkBr+H!kG z2PSPIO_ek_j@QmwkE8||4A{nT9bolG2Vi$BRZ#;78iuFOdPrr7aJGgoQGa22VI%q?v_z1{r-6fzrE zDMCFsFd#57KA!YPmi7*clmV;ytSh&t8HwV`TM}y%2+R%wy#reRV7Xo$v6))TRCNIE zn-MAL`MkkrY7LXmBj3p2p-q?O2-M{BxaL{RN{SA!c+mnxZDpNbzw6tw{H^rhE4b_K z?+Vr#$Q#xFNFPm`ba&O7h_{DEI7i&?NB|Ln6)Cv=-4m=6!|Rb!N(sT!@;G@ z9FFdPW@LnuXTv-J*0C{4IqoJ7GvCNw>AjN&;uqB?4YgbA;oyA#42 zFn8FCJG(go1A|%~d{z62@&-&p2jFizK3MYe&YB5IzEP;Z>P0rHlyvLj*B z-m>M*MGFh$P6Yb9@BJQtUe9xVUnJNqX;{pFrL z`#6M^^tIc+BomF8>bJl9lWc?k+0P$-uM8`H#o5vNGiUDgFM+mv3e~lrT9{&^>p5O=Jq1 z5`bc`E&@Y?Lxh<^^$rdW2@NsnrV52;j|IKSY{o%1G&1bx=ff)krva>YF6`~;BcwJm zBAnP<-CH=*$y5?ANm2u}-#gA+t{H>$Puy*MTpUs^+6zmC|09pV8$b`aapbbQ_%Y=E z*x1;0t5>m%{Ra;6YGONFWlv1xrj^i00L972%X@TWbkJUuK|hAX@!~n{5o*Ak!Y^*_&Ik!!3kmyS4~3)kna@{AgKYf_9l{V6z1KNpxG0#(-`@6~%xOUdy6sCh zA{ir6|L}jmt&r)t3aR?J=U*-_uRL&|NLls!AABTB%y<~?z2{C0hw>>d{PB;z%U7~2 z?knSI?B2acwy9(7{_c0~QI^CbU`f%QW$>4v4yy@Tpdnv-;l{%}A55wcsN~L{{@?c%9e|#b zPhN{A^XOxLpbb0d(MJyJA@X4HTOcrp2q65CE3>n+i|E_XkYHqA^*6>pa4UA zQAs&U3Ar+pJrbvsz(={!iEEG^w7877Y!z>Qm1`KP$DtX%f80bK_ zeXs}h_x6!x72U(zF#Y>Zd%;t>aKe8jQ<_B#76^O>5f~ZOItZHvj-9$k1}fC(OR67| zejZa3n6?fu>gi$hm1J>6Mm*8aNWPKD;2}{)R3As6R427fBv)A`)}HY2xa!Kw=2i{3 z;reSeU~>4K`|r8ps_R+pwrw9AQ3E_zuU^5A;}+;4u$V6>L}yHU^7r&R?|vYUy#M~Y z6&*nCL2kI=`fKjATm99uZF}eNC13fb)@n{o^$2=!0-qp?;(om*3{P9db*R7l2Vfr z@d>C`(%;ul)!5>)vby>v#6HsLlMyH?DngQvkAniFz6GXwK3KTx8XB-2WM!tuMn@U+ z>X(t_6TUu53u0?zLW>M2N6_p=9m$ z^dvfhw3t-ot#4>xWKnSmuL!DoQ9%;+pr#VA`i`^HMhhZm|AC_7y81@mjaiu)1-UtR zDG6^lo&^8`N}v)&J?T_qI9JdYlvs;N2fM^cp$53bV-SmQM+8V>tg&;)8GITX(g*2o zjU+#$`k7o4I368J_ z^H$?*zq{S3Ydt5>C^r3MC$ zOE^RLZ&7L4?!vt&`6FXvfu_KisEBC1mf@kq){=(j_!o>0AUPbmki46W{)VXV@R;Zr zU4fez)`o`0`i4e463|iPP$k_3@TP)01bZGK9=42H!0nZSYb~e&F;P)S_LK)u&tMEN z!nDcF&cbPMu&8+d!6LHs5>CL&Kf^awcU9`kPjnl$(x2Z_lPG&h z3YHRdI{A?`0n-1=J^_S&^@Ycy11R%!^h$C$Tu-Ivgf`?Gb@WR&Rev0TQlFg%ZN+^d zD?;puL_n8cc|EbJY8`-YWsKa)cQf={dGB%rFmCIKppcyg>a%j1PIZrNyW7^S+dp~d zv;TP!?c(qMct))Q$l|_yq1tvx&jsh7EB9}E=RF!o7_V-Aod%bvjrvk1S^I~wpmIa= zTaHDh6WL31N*oFVW*-6KeGiqC*45XOR6i^%3gyXQN;Nu4 z1z%$XiEk#ThD#VjePbhzyMO@yF2OOPb`>gfp3nxkv2oNe*6_*B-NmJ) zJ-t1tsYweL7NjI5hK5d|aEm7GfoChJeA(TT?|iEh2D7%M=8!iF^Vxq62_tL)S<`hz~EaAb@gylH(t#F`OU&gvtzjajN5em40mJwE3Qp$+!%=`Ig(|vm~m!WYfmH zyqv^@c-fgim@El%lxt~_HV1*5Z%}oo(nhu5dtEt{8>Akhli!d2>H*Cu_2D$4;s{6n z#eYzxEcj8b~H6FZhy87a}4k z>xnp09Smz_YD%)wuQY0E>g0BKSg6uDN#n#l=t*uWPJMO|z@fKmcOis6m@uiyNtDy# z-?>6BA%lKpP3?h$MHJPlsjEknN1ob5Ifu}bei|Ov|g*gU96Fnxq>*lggr~z|{zPPtrBM@Nl>KvaSG&4HT<7fgHr#9!P z32+&q!?*}=6gX2OY?9klwhygJGT^qJsBG;d*G}UUH{z;+vGJ53)tB(4 zB_CQlt?Gm`bSk2xdi+eatE+3M(W{vap*G&4|* z3)vc>wz{U)Q9eF+=wYAP)`nJ8Wv zI!x(Q9Y%Q=lk)%eBO~fUYU}Ai$|p@Q`UYx)lA{wk5K=pC1XOF7a>Yffr7GPlPzn}mYi|dT0|yTc^!4*jMzz4XhZe!hL4Eg`ZFApFs}-M2eN$6) zbsgI`7<}X7)3Y-(vog|oNwP>?HOBd6KR0kcF0!nHlg-DmKWd?UW| zm{V=gas=u)Z^}2^|Fd@Ag(aq-T3)7nWW`6zQOXy`Vl7_1WHg|L1#l z#D^fFh++c~5Tthm1eRU4?`G3`pUI?7l1b11bLVXC-b~v`&nD+GWY3&??kV4M=iXoc zi5^sfTkY_@{Rh?Zychod_*2e(k_tdn?mX+H12G=1qUOR2c017Myl63_7iW1@h{E|( z8HNAwhlfOs_U{7^JgEID%DZ-L7loHzdd>MP@8hSQe$JhG!MVM*2Kxr_RcqESYAPzK zg#8k4I_)KtFT3dK57=Rs7fWPC*LOUN~`!qH-4iDK9XJzIYv&m1ay;hVl@xf;orNsF7WK?8$QhYoS$+Xi@FCo5ZS65dTLc;dbnJ=?ky?^SPH^MoH4q(aEgT zaTlV{-P=Q8(6{#Nd+M3z_a8jO!?w7n@bXI#zwAy+Nk$Jam*_xZ!USIe7I=y9a3yY% zYRS0}%UP;EB^$6*$jfohcmyJJj!*WKsF32w+2}*HoWQ*30R*^v%)_076G)-@`&}!e z=W!1hf`K{)CX!+tEx(u5*_HS zyMH5wAZCszJo1rg zYqaI!;zF^6U;pL-;kWR?sdNEqGZZP9Nb!|43#46B>nXq$eD8lwW;(m(>JO*_yjg5C z@>J1tdHJcRrrNP&St8&80o(8};U;0B%isaJdJw?p7>$I%fjfn)6c-|Khm7WThg}W! zmPpf)eLxUrWf(BrM+B}i{|Jw90D@2O^*zb+I}9yybrElL&^83|jSxK|JY2p1v2|%7 z35dxIPfH|9r0gX8f;4yNgs&K6*3>mHCFJjD7cqv>PD9(C47wgNON$%dFkh4oicwu^>MWlO*;FmW+u3qld|R zIftQ1{3+&tJCMN#7x3@`gzj?GTq*2{5fa!wL~<&8jiNI+y}MO<_MSh%4=_^(LzN7@fTx*U*7$*Pks7Jyn`X!`4Bb8 z&)**#8yX1hiV(xASMi>^^XEUh?d#vA{`wm}P9*+K8`tsXK3-D#%Bydv7hZhv1?nYU z7MQJQ`L(Zq_lE1Q+OlO6?^2xq9)IF#0C(33uiGm>c=^4*{=M4Zf+?m*t)b1&@A%=z zKXEI|gj+D1J1@KJLIjFXIpmCkH=yONT{}n;r(QCPjo!R@gSeb9rr33a1c#h={y7eo zV`~4hAQ5mt0Lt6cYO1NLtE{fUN9C*yTZ;;EApsT9@|5!~Ht@$w%W7)siA56=9og4X zOe)|206+jqL_t(HfMpD90I6!D-2@YJ7)AYxwxPAH4IUe%0gq@*|DiS2fnZ3=Dk{ku z2CtEr5QoK)eI}0LCwgN_Oc+ieD>I$&omv^cI+iG4yo3qOiPEw)#Y8yEAt9RD0GPkE2`SrZg;F0T*2zW#wJ|d{GbDHhJ4r7eZtk?j?ffFeH$y*)=oY_gF$}d$7 z!Uo{$#xr{19EBB`mYoeCo`yDmFw+I1nN8Y@)<~hg_06w-{?^+>+rK{iclDwl|LDK( z{KdT(iK;d8RX`kg$;IbC^5{SA|J|SYXuDm%Zq039y;ZHjD)c|T`*q~;)G#;g^r*pF zMv&=R{W4;{yYKqx=RSX%AooT1d>X?8+;jKs-~ZvyoJnvfX7UGr{|7&#+5Nx!6Mr2J z_ypCA!QqsLuTb8wG|xWwBEbH{Al%oxK+j0Z`C#~jGl1|$ zK#dR>7|_|-gMASi(UFlMjI7WJK%*0H6txBp1F%*6r5&Rv`HU$|Uqfyg|hF`k^5 zBw!J%X7hib4SUC3=dCjLXW%SW{F8zkv%Jy{pTamjZ0Y(9j45oXV8# zNtfrP+hx^>WCNDfcF4(`VF)Bfg*vbS5upKJ+M0IH{^liLiJ#r}yv#cGYL)Gx+)$Lu zF0)h3%RK3veh#%yWTu@;J}-I(qIns@p_5G;*Z<|u_x<$tyVQuB1lRw!FMSrv9M}Md z#`E>{Yqx!gH@!;i(k*2AO*dZqv0H9(c>Q1b!S^#CH~}p~0t4`$-~9#@wqOGsW<@}r z=bwG_l~-TqtkpUY5gCDf&d!}X2n^!TQvLdYE8a&ik3aqSVU=wVr=a7RlDqKy>g6sA zkUMY}q~83)AO9+N644A-fvP`$Fml7XT7N{M_uGQZ^h^-Hb z3kYbfi4p7#+5os692_DeBh{El9_H_G3Q2rkZVs@lTT_H0w1GgUEp3=89XWP_2Mb9L zcuD{%DhR{`Q7|jv;ZXlj*aTTp*#Mhu2rDT&GcelG)n&0*dU^;3(MJ|TvLdhwT9T<3 zRYtlYEi*mMp5`o^B`=&iGAb12Gmh^s4$&*_kZiz;+fuopMMNMnEFel3)H9%X;;P5R zYZCr(+~j2*G4-kiD)7|$+cE3T%n+aM9-hkxoaTKXEJ2ab^pE(&#wJXu0!~^`0uB&) zGvYN@U&+UtmTDUa$_IXT4{t#t@$ouAT5lKE`8@mdBWfE__{7IQ!be-lJL$c>|J2ra zQ>Ooqf9xY4{m2bfRW*c~Pn!td|I=2w)lC)!Tyw2tREM&9U&|H;arP z`kpp|`V*peEO3x>Qy&`@MKUkQbbd1YJQYj&=|&^`@HxiE$DEw%6@M54-t)`Fk_Vjw z)HCkIYM6P5P9*nOrSmhvv<7+?CP7QGtJ5ZZftg+`mH>Z0Tmnd2#zR0ot1aN|ibYLb zV-vDy;t4~~@K?-)Tx>iXaGpkeVI$-5(9q!EfZ`jVL?yMs zHsIJ$n3o4K3mTu4+4FK?RwPbN9JH~U?$$2q{Q?58;6ii68qrsvoe=kr=c|_XtXFU7 zrJbT2T_UiY5irDtIExr1;<-S~lpQE>r0@<}7=-W*eSSc71&Vs691~hh3nx>cw1qQ-gao~{w zR}Uf1rVuCzMysT(?45V_`}j^`{%23qcKSz+%Sn1!sSDR*8^$iQwV9F=6N%vJ`9chy zSU5Xn>gb4XH^C0+^$R;g&-3x->~f!Bmzr_Kw@NYlaoSVy&-Zrm<9>EAUp(~ zt{yPP1YVF6T3u6@pO@oOWjqTEk;>qe#)X&zWhBS)^j8@GDp3Uh&MdlJZI@s*`{l2E z6Ycq)clZDJhyPCvj{^<}&;ENVgwBQyYnClCyv2WY@BLzWm?SORdCG}N1l%EDwOSjS zng(nGQ2!~(2{AD-&T;pV-xI5zXhMpmcmP%?{Do)@hEyFH9)`w+u+{dD?3jlnLVd#T zgod0 zmU zRy}sJ{w~}PC^KP@M1N@ax$sr^r77qXWJ5zqgv?(>M-ZwcI8!KoyE+uciG9KP2tVd< zy$zueyw9qP9+)rU+pMq?H^ z4(B*AUSRM5JiAYr#)+aJp62wavI4*|$01h9<%9yFGQ+m1~H8ll09PI?O<%#hLk!%Z7 zMsl2KV+4t2a4h%+;G3&N3etHSDM&knyE4*r-Z;c_gZIF`X#^*X(NV=HYJ40m0BQ>5 z&-l2w97xFtJqqBFZhtonZyWiR*2`55|iK%NYJIeZrlw$$9krXM8Cb=+|bli z)SU;0o;!qXVHfaWXl!amm1NA!n07;WzIchwN;Y7LfS1FrAOvFcf$6c1zQU~Uljo%K zcWF5RRUzOv;q$|{y8iQ=m<_2ugjCN^RNk}q6Tlc16C+j!4-l6C51@q6n37~ETMHn- zqLk!uIs_0P-SM;UfBU=tBf^Q|L+o(HjvZV7=fA(B+Ri$hUBa(WD%vL8(&_+ z`N*Lq0<%V7n0Pzgy^)dOBm?H)ndZJL*Z??yK*)5+RC|Re+e2K~s8Fx+&fYj(F@Bu03SqTZ#!;r8+5MC>Ms_=by| zqCpmKj)>4e0CCsD8CSn{O(BkM4(@dGy9!=uxBujSU;F19&%f{r$$AC61klXO&msKI z`!Bx?kmq;AdFhQfNF;E;pAVVk_HCO!eAD#{iqgEyS#}~3aESm8sl%hglM_0G(AcGD zg&Ho~i%R75Nb51CH<^%Dljmz%k}UePboDegwXR2WbJ z4iqhHz`)=DQ8VoUHVMDxfhX}WyJ@FjIqf$zCzB5}~9OP&cfw>}3m==DZ292tt3lY{qnQ>uvzFxOf zv4cXZ~h?Z+-XZ_3Oil9R#@v0Y^wmZ~TTaX2okwkj9prq8 ztdR&TPXw?|!K9ni0b#l@Oi+;aJI@m;S&3$EKg3ynwwTb6Xsn^Jaj>TcDT%0u0ZyL7BdB(Saf$8YzB=`{Wb&?;e?$plPG>b=umJgZuH3chkw@wkF}cHm z$MC&3t$n4$yd-J?6aoR0N>X7|75)k*F!_A-z~R>6tBdu!jiHeBe0c34#y|+fI{;}A z&p6s)tjRk=#CgENm5^;>T_^#%Fr0e03Hccy%zN5k2Rv8&S8pQitauRQ z0wn^Ai2#yv2zEl|V~h`7?$R6|765592UNb8o1zVfjv`DamN^9W?YGCw>W1opKVQC3O9KBlFP4G8KNlCaG&kNU~u5`W%cxGdh zgL(vKDiB*tGaFdAojbPHH#F}*cnGg8!fYtPj9hspu#ePZ0JeSWmg<_C>Y7?o%Oxem z$Hv7nVMIIgg~mMgBiVp?1XFgk+7XBg4}u6j-q`C51W`m$3!GmNzqh9A`4i?7z0-0J zJGYz&FJ|H6)I2zL-@)FOD*Mkf>b4p}qI@9ohdjG8TLveZdVE6l5sC33iX;RZ z(vv*EDRUr}4+!%+dD)vpKq4R!SZD-DT#FqJ;(igs-X$qaupOS01h~X-NU=@#_ro*= z5}yNyR|Nbdz!mev)Sl>^I8Y(fM|2I@>JXWSPH?TEA0@Z0T~xf#3-r)Gn%(HgoB*$>u?e5hNz8;MYkS8V zkMuo!w68cms30N85FMDH_m2$m4+&H#d$OYS4UKmX`Pjz%1A~KOBXseJN~#xy0T8A@ zh`H?24MZT=0!bdg;||D^5&?<8nT-I%J+UrrLpCKye{?j)Gdu~g_t1xh;xw#X8|F8} z9U?<82?mM^3kW@=J-gh>WI||dZ9@-?7#k019`MU;hRlcb3$QB`U;@Z#=uCny+?-+I zkn!UZKrm3$KBeUqSXe>Rhq_@!;Oj_q zfH-`MF}keT>g+MB&N3w`gwO8$ShZ$x3Ou|Ri2sFwE6Grl|CD@<*t|{>y%}d>^Q5oO zh){X^`GrhIhWbR<<3L0GbJ$q`r7*<;C~m>{1mh1NZGjeN6Xhrp0g1qpAb>d#6f+J0 z(0LG}f%fn|IDcXxqEe;G<8*Qor2+n|^^MI%1qDR~d5D6SWWw4(?aypKKP*%1f&3Lo z&Q#z55{I?6naInVnw$j5tJZ5TU-B|M7^%j1cPaFD$SL!xMVJ^Pau`xmva>SSUxIF9 z@tMC7h3s&q;~CKQ9I4z-lo_3DqnLzBmUcp8(?GojRp7Q`+(n z<51NAzATf)N*-Vi+afQO2uK9Z00dwI@b@LtFti|MAv^^!q=7so4!#=p9+AqBZK%)M z-$?|9zP`wa@VuOC%vhFuc|81y5u^{(!KFa=509J*YJ_h9+5p}QBp<*vg6I2^&vqG3 zAl;C5?m4@_r?R>l-(SKjvFY3i?xu+AmeTGzwZO zZnf(8Rk{1cGQD8YqBMvy(b8;ECl zNN@;&?U^&-LCJlFOr1-JOJ?n}_Vo2)_kuQnSP|lJ@2;O!TTi}%FrBWsrPXAzK-0rJ zk<&rRASYyEPPkw>mYZWF4C}uAhiFXtWb!@ZQlbsj>U7Z(R7f^p2|$-at{wy+kz@2x zrrzPEPTMkL1|aVhx?eB@ya5FVVE;R9f2J6KQ)fJ8tda0ViP z-S#BuVJ9a70|J8-5x??mbU1ML?CG^Ox3%FRimxiR{#oe;oQVmtX)>G1AB>?2NdUri zI_T=A=9a3e8tf)B)6)rY4-c?#@^#^(jHyz;wcl*9IHWPwu7Y(zfrjaIumP|rxHRzm zCk8b64!Am8r-!JG2-joi;u2K-1AAn_yZsM$$F^-dlT2(I6U@Z6GqG(>Y$p>>?2fI8 zZA@(A>GM6mbN=Uf0exLvdso%I>#nsv3uvcR*`VN>?`WXcst>C|7GRlIE(Zz?TBjyk zm(`Bman8v|G`~<;?n`}eYh`k38<$TlRs$bbAUcR#f06^*Cd%9$C+1B~j|uBzb0;#p z_vs>ry9@!@qrPSTp2MJ@hozyYr9!2`My10s1^$Tr*Sm#8$0NqaZ$zfRl~yCf+E3?} z2giQatM@Qu$=_OOI|APEUaMM01llOOP95)u>ZyW^=j`H6?plri!1{+L**N& z#`1MG_4-f@r5Y8{L{iXKQ_Xl*Skyu3mxl3{*aM!})^VRJVp;2qk~xkUTfpX_T_`> zqLVr+lt>%gheHc+jYC45mcOn?iM>aTc|eIpK~YAEkBN_AOe&{_5@7?Z!e31kCT$DD z@dX9H^#{FEh(l1i2L1(#L?^-P7HAuLBToTCF~_4LWaruj!%$^!FfyQRK(et;`$K%!`fSYoQ-Iw z{VFlBzS&J(OpNG`imJ#fHNRLQ9efCi&%ZvRc13Lnoes1BA(dBFGV*Z*jec!uCK1#Z z3##NA45gQi9G~OW1_dd*s2HLNASobnN;m9G5lDwRkt6WH(o$1_n0~ry%Y0^MW}oe; z(xYJFVWZFDFPbPXtyG5n(u-)DteLiIc|B`S(2@lYjZ+L@oT>bK`i~1)?kt0;$$zf~ zDN2AM{KDqSf`;n%xw$!M0a76pTfkpmh&S;nFoNz5`Oe`-Pbr%)sygYwRV&c(cjQR^ zx%o|;8Q$L+m~F9usQj{)HOmRA0aK6GDQXFoeMh)2_MAnsaH1Hsc45`%AA@wXJd)oi zf?h1At;d;w1wwzFTHyvIMf&9}vsA;<^1td5Tv-jt5VLa!S##ho%`e*Nf)5i;=<-*N zZQ>5mpV+ao+Lm~Gg=2LnNC_shIb2ggQ?W={9$_MrMc(A?-L)xJ=B zjP|tC=eVC$rjR(KF1&^RDP0o4dp5Y`5(C(*e_PtLXQ?fRL!L7;8OX^D3XFC8@${2~ znZCOGw-|R`W_EgBn$5&iP(T>k+4-r}Wu4)#cwaeZH8o9hnA9zgEilG5ommeqCb71N zbmpNnmHYyFoPAlCO+WyOt2VbVAoMRN02>jD`U{P*gK$g5pR)?27Z_Mrc&Q9LQe_)E z;Z+WVO>pDSu}e($@ewsu>)XQoqRC-ME5XrHP$$ui4)dRkSU0aS=2P&|b)nyukT44@ zM&6KkZq%CehJ-k*Z|Eyq&zjnqT()UWWIpukhaSwT#A%2Hj~3I8H}(IFb{qnT5qPg% z4RU^rV-tu@Zq2-Ykn9O`Xs z43KM7h(irILLX!Db$HjQA`DY<2@qLpbyr4t0Qw2aLE5$+ zYS!1SB&Y%#?gi&wxrm7|!6@P8v=F*mq={!|UU1M2?xYeEDcGBXYxM^t z78pf1xM0XWw>t(l$N;i9=uB1<&slr$9G5|U zr1uH9IhQ+=c=W$R2cJBQ;Ix@=d|a}0en<@ubL{Rl+iGWJq!_iV^E9dKcN60vy7ICB zW%n1NB2-2W==o4a`NTYe7PoC|WE9CErYjh`=tM>PV7{!_wn99jqKM5#N0T|rk1-fR zB2`pCWlGG)Zm&?s3h`J5i(1)Q;p3B(d@V&M#*Wmgzui{A&JmZl(fMv>X61=(umj|F z_|an4@AZa{l@jW07wqC7uMrH7W`&P%>&(*i1c9?DJmdc~QXe(Ou->${yK6XPxL{mV z1V4U>5z?ld1!YHcWpRE^)5U@m&B`{+FzPbBF4=hGhlq4n)-@*O)osl_oofz^=EeU1 zTgw=Mp;CZ`k3CwsYXp&Q`H<}U(1Aa{!Ysa6P>qIU+1gv3Ui=Hpw;_QC@FsBFf+u-Mb3uFJpCP3LKz z_`Sl?HM25~3;n}#4`&+&-_@nf^&6=(!jMedq(tqfEMM?cQ{WbbOE9+$sJjAgrn6C( zX)V3(zL-XhOt1|kS^>GqK-FETc#bpX>J+j+wG9F3yxIHNv>emK;4&{4n6mMImU*23 zI!MUG*)$~o5*vF#VtT#V3bMPmS9GorGBP7M3emp6e+DN$(NDouW&4Ylm8}nwP+)?P z_H(k-SOKhz-2g`r~CI*I)v9YV|n`k2i zPYn$hdCsXn9?a5G3W&U83}6H;8!iP2oe`|HACB9^F*>*Wr%19z2d!orAq?C)Rp*pDi4ddyetx}N&S(W(Du zLm)#>fMY^|*n|7&OQT4f`sep=yDV=Xu2?j_siHMs$o64cDHpJU)wmF{Z1}Br zlkg-t*f2pRG>3IKEJQ-DSEyS^U1)ffI|v!=@XW2gE6J?6x;h6gSE8@CyQG{=n4fZk z+^b?0GEKz57-Md8w$1leYQ*@Qh(}%u;ulgi&22YiIGD~9@e>n^Q{A|EB_qS)a#<>y zqN#Cao|2dww`ty1z`PQ0 z&`jwp^q=j~(34z6YwMe;p0WsrX`w}4)5`6*gQue2loSOUF>u`!HVkH1dic(W@60p* zlKu4Y{%2MmA_YdJD~f?|Et0$?DK>uS4$qB;DM%)kSQn*KS^C+Wkf6`4r?CC73lcW+ zqs@LYvoPqb_1H2A(2DdWM1-KEH}WPbakl;`9j_HyM&H&1%mOf^b!4-&w-HC2Szk3* zrU$u>cyPs7A(%6#3lE|l(72L7?N8Z!pCCZ89U&13DBA{s$tJFb3k{jY3z`#HsW;j zK_I+^+S&{r77-pker^I9crZIjJ9q2TVtFaHATdg&R|7q`w*v>|=Ei25rI-SW#AD|M z?7hK}2rJQp#z{@tjF$QHo+sw$uIC}tl2R(>^WT@=+eW(AEL~UGv8T~#ZZy#Xd=!la z?+>gX(S*V1-+dqtlfByHO*_OI*sJ$P+^ zTJ(U!i}MqFeA52(Vf&4O5Fhe~&JL7Tafn|D!ka^X$qkW1Xm)+_MrDKi7!K*?IHCAa zO$i&(eM%b}-%^$~*~~32`E1rQ3&kMzS~<;n1#-T@ltZw|%E`;pWco?92YMP`hI{~} zAmVmM>i1qzNe;~#aTG2OzxPdfgPHsz4{1rB#w;4*$s$NQxGm-|bw$tp6 z^Hw!<7d%h4Jg7cb=+vxrI#u_tXxyh7RMfoq;AR_j zwpmWxC3jWOyW1BuN%&Rd-dIdsYb(N(kBP~2ul=WMO~z*9_nb(Bfgb|~SSd1Z*9bJO z7>6Q+S3NXWznlC`O_|74WLajwnY|u#>9AjzC9I>OqIMI*9s$rHuI0G8Qa7Sk(|8Rxhl{a$`+b>>TO0^993E_`- z>wt*uI4jQ_(x5HY0Fey5t5*2aT7|8pX;c@oGf_w3L6C{9t1Ag^=vPM@owbo;xG>q& zDV9IRqE#lN`sry}32Cr)WARg-JjENuOpLYV6o<+ZAwt5e?x#b@$6u;6ZOp)AbV}*? zv|mjbt0qMzf04t8*SKp9)F-|V>_n7|k5x{scAMP}-M3=#KX!6hlkKW{CA{?-$~1ZF zDj5HY_XDkqeuTRp7tH=$h!w;h`bJbiA4wHIKBn+^s|e|qW(x@N=fm+E?Oca% z8i;lJp^4B90gJjUW8T+4mt$`+nrN^*{F20~tRzBFM+H}0LZj!psdPRA*W>RqT zANdnX^el2f0rJ(t%ICpm^?_o;3<7cJs z;$f|2p%Wq5e&f^MyLV@j0wdaIq)?D!^C=hp-Dy`>F|yD^XKYY|5@8J`sy4|@QHg}) zR`+7=zQib~eEGIGZ;Yv|xxKjfkh>{F5eNn@)6mcq(@-a30@R=4l;qXr8OLDnJlFtF zQ+xwhH(p~FQsS?vxqm^&%UiOfaNwo`Eal(IB&iivfR@7(yK%sUuw%qk z6%`bj31o;669sG(0aHg`f1gM^sES8>?_VH%M);akXymvNsiA!N4np_uvQ!PxKfrNo z{(VzTCI|`a*6US9HmPAO;9$+-9|%=ZPcubvb;A46$m^BwFluu)fgr!Gs!ka9Qahc+ zqPG$!Uz1Aqag_uMti#AV@T~r!`JGchAk#?ZdrK+kKpa66YKMjVs!m@~E<&fLS;b~! zdDZ;4gXQ)8qoB>H)cNr*&$n}7#~6rxLm%B3FP#3lvEM)B-3=66O}&0_I6cm*Z(^y$ z%+GVz;bqx{JlpCT?6WY19c6H);!t>0o6s@<2NF{M*t|+PPQu*duHsK={gyu_*52;bz%kdV z%#>PlGxkGW+QQk{$4RtiT#`JF&#SYlWKuwY!+Ju2k!9l6+&wOjuH^?TKa<`UDS~#3 z+Fg=_q@;w5+){nNRp0ABW)@n?l4f>hij?Q!(ozH3;OGxLnQ}puE1#ag=a1mwp`jsB zq~kG$-=Z+8$GrS4SJq1pE~|g|5^`u{pxD!d>0XS|#u;of{7pmb?Nt5boGI3{w6@L! zJpCkwq6kju45x($WACVKd7n>JgI5KhX8cWbRH0w z6JA~$U0rx53BE`#xmWr7EF49#Auc4=VoTu zu<=Bpu-njJt!j(i_+itaWUC%JT*Q$;d`D{1gUPV+6{gg=2n5tJ!2RoO)zY7ARwxD2 zH?WWtqCU9J(F1jlb~3uPqM|J^uYGiV(L9X02n&M6{nHL5e4n~K!Yn~p(zr+ zo(*Q7W>17{mpY)+3ksF&>iXvQAguZyV03&Nky8pq{$J%~k-cVWmE)6(uDy#_Z!b6( zx0B^Yqe;aj{er`y-k|4R>D>Jch(!0L+E2RGu9x-!^vKL(r&aVWyqvo_xhpo8St5NPL;MpHPMi@)qg^W4X>`v0f{3ds83 zufY~bm+`58gu=Y+PcGeP>HMp)CB}QZp7!q-*S5QwDN=Ugwb8PX*lFY}%RoTC?Av<( zr`i;5m$le;f~NKI!0(UvS+w{nc;S9pCS2vWfMecB$r8S|;Qi?EQKd)lZed;=m^+qi zDgA96?)Ky6DtV^X8X3AL{N0g$mXCd}VQpo_cLA35d6=`-u%ni{^frFoqXZHcEFtna zVkHfL!JgFjp9}9e#{6nfsee#&H859OuFsOtybH7Za}npB`@!5m;;78-yPD?x$W|VD ztfxkF{kF3PHz?~B`Q{}aRZxkxprE(!MaeZiB~ebR&}X%W1$H-W1eJlET;H2l7q*Cq zPpwc>=>DuSO}~*)>b+X<;v&0CS%$pS3z7hNa{ACgy@ zJ8+C4nvhAa!x!_@zI7VJJ%Z%X`HiJ;9)h&ommwMot)xpNVbWu7UBA$JgkF(&m_juuyg*lV09_YH|K&&^b>VuEdP0$u8gi!0ZKxM z^ecGn+dcExp!~^scK9VW_Fi*jWaR#4Cua0ikCwvv-a(?=z;H-d7~!aGVY-M7QIq^2 zALrwP*ix{r_3>k5rJ4*11_pM}dPIN%L10pYB*2skKWzSR(Tz^P5)mtH>tpq(sWM!k z9h^<)d0=WmpkR*JhcxxEn=34G2ZAgn{AK$vpj4XC)_>D7ocDS+T%*P6f1C5pfGV;~ zF+Zc?(HIif8>1$3%}(ii?4YdLcGT7XRlx#svtB-^|DLapDME-8oLvl!3P{YcnNa() z`6V%P=x*+_<5GI-HEax2j_JrEaCeogA}JvF53^s<(lsnB=+n*CwSDK;ZQWN+E&eiC znjx*t2%i3u5-N5<25_#iFgytv8yOkv*EMhp=EncMqvtp7@6e2kh+D@_+K2Y> zIe;A&jV+q}uCmbU$pUGo1o3!*Vct<5d25A5nrf$ZHKd5#`@6r-{+hvSHV)2e=hID3 zgeQa|YCu$aT|q{w|MRJ^^B<0HvB<7NdXFEfDtV0|9pbWmrhY&3Fla_@>#fAuTfTqy zle z%qUTaIyJw&>MnGz4YRcD$_IMH=m0<|8Jt(a`BfoU_O%1cKPQ^FWnw=SOi)BN&=rz( z-3=Qi&M>>MfQ%l0Y3-!?F?Fufz`ixg=6GZoI*j7m$4k~CH4w1(&k>B{v;Kvlk{d!b zHa*EaF+MrTPD4xGmr9lu@G?Le!1FjTUt3i}gWFpgd+K(%TG8!A#Al#k0ECTk{rCWY z1=u`5N}j-tB_4#l8kW$GJuqaOPt!R_Vi5Y-6Z*N0?qs$#bJCndB^eVlBu=9*erSM- zW{8@W8htKOrI^j+3W~>rj<8Pm++Wwe(G*g*kAjgJ;x-v#!6%4?R%IBDT|x z_iMbq|H8p8tyi6TTE5%H7YI{g)^AIw7sZa-SMadh0lvbY>p4sMo)y~Y)`8xa{t>CH zT@Q=W4y|f;Z@1olsKvjUbO$ge_VXN~VMspwwtaCOaYVp&3xpfzM%|Lf*Il#m^=u}g z+Mc$fdRl}1jVj`3-ibTE;O&p6$tC->#;N`j-CVDiP=99=$CKd8j;me7X&iT&_71Ru z-Mbgw=d!~9$MTlbsJSu35#xs0f2e1maJTsHm8(aPcTX;e`@? zf@EX>H#K-FNo#H%mO!dnRV-*aD4u0sNsTWhp(+GV&(N?i&Kv?1*{`sWY!n2{&p6c>-qijtONRl&d{2{hq`a^_ZdL7FQ=9d zJ!Zf3SqQxZulWyV9gbW(kEpNC&=$krnSnLaN^US*MB#CCSi-|K#95L%lkQl4Fa+NY zfKPI-HbQqoc0>Um&G)!r zDg9Mzf!kVDaxA2{?RP1OLZf;K5`V!Bz(-I0S6*IPY^Wdt)GP*05UN?L1T&)3JuC~a z>JNHtlv(Fe|E?|EOC7KDeuc}HjgIEYAXr0)%L~B~gA3E@5Fy5X$2~5sxBL1sRl24u zzL2dczgNY<=(p6Y8Vmsdu2_QaOX{gcgJ3;{LMIfh+i96l)tGVHvqRfIagBwa$9F1C zvfLtuO+5ZUgEGW>)H~8TWR&=25A8`;U15LWGm()I4Ymwr2e_~%!2~X(S@?Cb+JFQy zYPpgJCbP4<&6SS$N;YK4=oJD zV$nYtAA}$JxBLls!yodCtKMc3_twB3sCKI^c78;496G)5(UDpR;4-uEi;>X%W?;Vu zQnLT~nI8XU&n=T065iRWl^f7W`58w>M=Y6qEd=(BT!XO&*uBvJ&t}Hv=&OQz8L`f=JvmD-gN_^Fo3tm1 z9BSLl6f*jDd*?cfy)Ys!mW=c!Glh%!?o{OP&KFIC&p)uKJm)0|i$%e$NvwV7ql^8O zVtpkbrC*piSt~mDCr%XQ0mvTiTSh6!9u|3Gghs9*q-@X=<{_kg7df))bZHMT0=;--onX?h8D`VIqopbem5n&v&ff|AEC?x z+zMRfnD=lPtX)sKSY9XGRW8K1^C;uPK=Dos5+54O6tm&YScu2@{gk`SnU5r8Q5x??d_*t???5IpI zHo0ozK_M8}f{evwoi)g+U_y%P?*YE)HM}PaNIRPR>MNr$j)5H3L`nbl;_kN(fKaBe z_Q)ig740g|{R!tmk*nC5JP(7_h|1J`la5JYByOG5oIzJsLc?ea`US|caX()V8XO4} zAD$7o>fXnvJxh1L6rh)Lu(U*9+VnempCXRRT;#sBS_zo{H=8gJ3RavW5E`~*=gv+n zWPmg)%n+W2a?W^1XPxlr2@vPUAS~)BQTo|&_JwSu17IaTl0Q383(*`@gUG7sr;e)g zbF#)cZ2T{`*=5AjMaU)HR$|8JI(|!gb5lut?`SXl@v1a9Jjl0>(dY!<-OPw;cKJB? zno1IuHTZrQ$9BVpQ1;DPcRaEp4K9_Cd1Z*eDo+9i>splvLQ+Z=! zcJX+^A>MbRqaLgN)$^>cszd9f%(4Bq>b*I`UfRbV3NgFFF{0?`MIogDJqQlG@ZKPO zOvJ^VA0))uI6IPBYCn{W8>%LT`hq$erdL^30v3EQ$C_#tpwMg$UJJ$tR<9ZcED||b zky2o{8PUllA<1iS%))yT;C^s}cB;M_TnnO2>Sh)XuR_0d`p(x(@yZ)PdhqO`f@f;S zXB`GyXokb42S-5sD2Zs2T>M;f1#vqg59Ul`Oq5DhI$Y1lR>su&fylqks8HPeJaXA zit^tz8~#@^pW7muQUr~Zy>!=T0W;EsAOo+^Dq1>4a7zis94z7udEa?)>{OD)94aCc z>UEiPOIs zHD+WcC8efD`BL|4V>=tPq9{m9obg*)QN0nCAS^I53)y;Ux_F~?PEP^D$S{WEvze?V#!R8He^qKDNuLF9YE&i2h zUBHbbKPc9I@9Dm$Ci!&|x+?Z7r(&IP)dASwL_91Et-3;41byQ;4J3_2bD867{jZwVlg zE0wHBzOFMIKfoXE&FE_%m#k1)4h~5~Zefv^H7eomV!+-q&%@zu@De`F;&~f8!ACL? zg(Vx{q5#j_>TX4UkV++R6-r@X&;JWxsCBReN%?qK(tQc6s^8y}gG0(LwQ_Bb_=Vel z1z2dhcg-@H5X)p*B_lsPif{9@k~{!s*??7F?r)Jd{P zKR5&mswgDFprzSzZE?~OEBz7Fev5|VMl&VOzvLKgtU2%=gZ%4uW#M~2C+P+v5$^N6 z^(kQl^fz@K)E=nllr)oxajsGt+9Cl}`G0Vb#TAh?lm6|MX+0wU>g9bds8W4ctGaZ&vi+QgmU_PYBG%`pwATZW`LD|GrU|8 z1^t70nq$OEpZO>9q$#NjUZ}{(JYIux7!cc{{?l_m(juOSk(w(7&acON3Flr+d{y=V zW}MoHwmLUcHIOY6{HA_)g-93Uu`sHOn&WUTJAe*2} z!EQQieNg(poMLt+vG=NBa#@C#`V>}0^|YG$*zxIDIy<8~wa#p4nd)Q*eSl6j0v`i- zo!l3!PXD_g#dGbx_=+kXq0X?SzctfnuUOD5SR6b9xxeh+kR7BEJiO+;T`r!9_;#a# zYd0Ir&IrjJFtmyy+19LIF+gh0GKPO-Zx(9-RX1j7ZPmZTP0m7cPg(lB`tT-0JB)pr z15T}xpnYiU2pcJvk#Q6oC;M39)*QzRjfp`UYJf#&r6Cq*B zQl<(&1aRWZ7CrnA3m`EfIg&rpm$%tRAk(o4P1a*5m#{|q5VHp^9?5rHK zJ)|k}q#sl0Yl{CRahM)syRKBBj}9}YWE?i*e+ zO(wSczHV(Ep%K9dABIT{&TIuDFE^VJrzo6t3%|ueOjFuDQ18!)d0!o4PP=G&lRbQF z#$WjD{!3G>usPLB#nPO{r|PX41aB zO;{~>s<`s%d)-aFr?gsK&d$BJsb0no{yeM}bU-+3I+?gs0ur0?JLpS`+n=MdXQ*iz zwom6%8_658UNo?r|6u3huoH*6j&dhlifkyZF%e~z{5W~jGlcy)p}Se$$4MgZSaGa3+?I(x~*-9p6UdN&BZ zw>ulPAn|^yXn8yf)|0;SpM^fszwVZ=X+29)BwTb7hNDzCKR{Fsy9=LEmX%v?@?ERR zS%W{ku5H=!J;-yo;`Mry=+OJwiMH2%3huaHBqZKr1U^e_XQJvew2PC2Is!Q$R$a~# zpYpt~^OOZ2f9DIRpa?wvB}_PrKpkEG!phltyq?qNb(Hq_{;VyFU#J){?*2&nu@@Xa zC)_upcpB9NNgja~=oMo7QFWe$#$-k4a~u`@G=?Ng74wwLK@)F@I&y7#QPk_PF!{RgpP7~`&cOE^X;fa9-|=`DkB zsXiAgKZIqc;RsUG=eBCE2gn!x2n}Yn)h#pqJ8@(pS4J$_F?j}6X(*RCv`LWX zmuCt5cP>%Gw%)6*Qs6x8XqLrB8D8IiCX-<08EFjrV~TZ*xlO*-+g#UTNL%3(?FHZxu`@`^aaE{(-N)va_#7$K-~yw*1>KZ4LbW#ZA<``B7f_ zU+UQU&M`Uu23u;9-whA5Q-EP4jLfzB>?F9jX@XOLo?=@zdG*y+7dMrv zz@fG9qT*zqT#})o(9faIZ6PJYWCH=n2F4Kh6=YJfG@9voE%tU!MxsVaZZsdjfug{l zo<|$L4j57|+eW+Lg>;~3(8`O?jw3&%m*%b?%4)=RWc_6Q9_{8v%V%uMmgnuc`zF6f zc{f-B=}5*zg+)n(A%umqk8^O8hy%bR4kd3K))hOhgB$;b#pO4UjXXG#z!e+ zZJm5{&~!_zTQBUEl&ZYZ88+US2Mx^*12BMn+2FzODe@kkP=8u8^c%@8>kEG8L9?U1 zn_e`Pa3NHo8fe%;-I+LW1F>(#!VV{cS|*Zy&@fnk}3#QU_8Qv+lLJ$6` z>tC-K;eQS+NKk`=$fNwIVF{=iXx&#C@hZZsk6GiPJl~RZciStslxK9bC4^3@#W;_@ zfWEEmoqkT%`bZT=hi&aqDj6|J$ly0ZSdQ+Q+F$yJ#fR1Fa z-l?I)Ko69-mZP1DFR_74)509As(9WmpwtcKNBC7Kc*(XwB_GXkUJAlBa#`54{|#&^ zJv>}|n3_@=IDbQe-wAyZ{)xPEjDh|7`&cGPIDl4J(hfCR(_GFnMdJ0?1O3=knI2PyhOJ8jRZgtao7KQC&Z;?mB9Ffl)1uV z=iuwST&`DM=fRKMNbtoSt3{1o)q}HY_XPvBRxrR|W-;b|aC+mdq2r=VUoz%~$UTIF z4M3@eHbmY>q#FSF(;GaU5*=eIj_5AE{a@840$VQ`a+4@z*)&Aq03?%I!_qlB6e zRc*RoLgV`r5(c6O*fZ>OxB(+QpTqGLPTdl^VGMKXt8Q99=QF8=?JYTHPK71(g;hsuUx#cq^J+(-b{$jR+C|_D@#0u%ObvZ} z1gv!1P8%UbXVSDZQC7kVn%UpQ1W-$4AeV%Iasx+3Vv~-r+n6(JOYy3t1HS6=h~%R1 zlJRu78zvqe9>zYpVq&&ZUS4ieUdF}(Lm#W6O=gGvwHOE~!QM!NK|%_!wfPBE4`_vS z2%a%>)uX0LWSAPRSojg&(f^tmsb44(k)KCc7~>-&!IB}Nq86-cqR5GhLkW{b31=u5$S#~>@He1 zkBhtij%{=Q)5dvFWBi=;4*#R|?W|u+9FF{qDL1bc-u>}zH(>xWg6@k;ygX0tVyWWeeRcStLOMXJD6z zpK-e1YWjwT@*2XymnZ5u3BZoOj@edw#pR0TZyla1`QJ4Zt0;ju-EGjklGVjyR`XX> zGZLCJ;>As#TPKUDQ+QuGz1jKVfAKqCqU^caF{Uzxivz%xLFbKE~TE~M{T~!0D z5SSePV3SBhYbZF5^P?|v1qPP9*2LJ@aA$YV#AB861NV$*8dID8s>MQAn`LTFz%E|{ zj<~Y8orr({Z~wa;`*$WgI~se24igvBA2jnz85#Hpv>6$3d=X7`3TZ8q3SV`tAy?GvjaRS#8K)S5j zcH353QJXzce*j+ToY zVq~Eg?;i~e938lfi4Qh(|H_`euqi}M&9(x7YlFdu&9WxO3y{Pk%nFc;R*nc}neH#8 zWJKIS(WJX*ch;(f!n_GyMwEDo{sB0pl((SOw3r~0t!pd7G;!Z2fa^y0>*WO-cLqVm zQpe=(*hy)h=l-LnM0hd}oVB{m>x$-yrv)*Ig9&#6maPTMzc1fj~t&O$~e*>M#ek8@>KU)lEVpjXv3yk>yQsgqyFW|4|w>JjY~%D&4YM^##SC| zW>&dP@@FQTq7ar}`8zv#- zsE2tya9<-}F&uRC8CRp!>9^x%_|xn4rS3sh2?@E7NfNv^pqZB68>Bp_fCISRW1BM7conX=E!tqBqz5=k?Gz#e)E z+33!5i0UL|7cTqd1<_3LMv8wS-RICiZ#VQyMBz#RK|X&Tc`kR9^2VYl|8;h?*J&rU zx?C5_OeUmZGNsIlxxr=I;m9E9+aAkBOSudV&Wg45umT)1jt;85Elb%;m8QD1v|Li8 zUf9vTh$N_#A)}`3wX0R9+!S)1obvR4b?Ms>!1B^*zg-v(Z?qVVr=U4FaSq#znvNG| zXHZ+KlqNGO6gV|q&nsM9*H{lsUnz)UC!{S-vjR?j!9hK^TLyY+VkBye3A`W9w7 zP?S!_%TwG}zicP#m=_xp7lHN$xOSxXlI5Q=hEI69qE%3?KgTBylsD=_dwdUuUh`4R-`;AMesfuxp$WfW9U9k@JnOnAFL<6+WB#+MbgFzU=sz@@rFdKX(iw)K^1fg^rDZj7?TvbL-*aDGJ zdvg*}_{ICaXYTw)%+UiAC%C4bmZ4Oo&)YN+q7ZH+bAe7f*&&}(Cj1MaiKkaa6oAU* zF4Y8lGskk=p47TI$KK&of%fdvOU%Rfa7Vv7WJ&>Zc5&F*9)(G5*CdnXptDko_`ef|};wJ3SOcBf6 z@c-3Hb|J_`K>b&L4WBOLY>>}q_!XNb3Tk<|xjyvb>+E2x5LeBc7TCY~-{w6GpfcRH z`3XmPO_|MpTZuTJM?THjFO-Lb2;@r3Ato&#n+9yMG--NRSolgT6ovz*^9H_9yYvoSVerZbDOidl%;iW7(hA^s)u6oCE0^V!Enmx)Y$ zQEF@}ZYap^-$g=5D>!t&iI_r+Gu7%y*2+k>YoR+O76HRB0WEsX-WD_*ka(?8rQIin z%|S{WmFvM1(svi!9@_Btx@QBFC(q_%LGuvI@{1$-C!SM^kA`u~%QL;-^v=#o20r*Y zmV%ud0ZSox1Vfx;+V>R|L;VX44Fd6Ovm)UYg@`KsN`Qv5_lTL?|K|hS#sMNJ=q5>^ z_0Cku)TM0miT1+vHt9LKd3ZEdc2w5aXN-tYdH0!M%Q0>kYDW*(&%&`sD@Hve4YG>k zyNFQmLk&tt2I{>BY;53|1N@E8?9U9?$9plXRq9ts$;rT=cC_obU!i;N0ChBpnK=;! zC38$2Oqc;{Vv+s$V}rZV^|zmv-^IxOkzZZQgJNJKxdZ}ox>5g(zhc`^hkk_{lLDY=u za@CKXhv6}yu=&5fuRu7F;C55UFzI2k$i(RIu-1GpC#6Axj?UlKpS}G##Ci!egObnB zo~?n!n1v+D0SC7EL3zPqZm>{>=OJqxLQUfR_!Ky_G}qQE~b< z!WU2ov%In7HxH>~vC090a`X_s>F_MUJ#Yvry2DOIa5esm1|o;=!6}1PA3HGPW6YvO4zr z_rrtR@poqguqF%~fm%{p%5&F@)YJC>f^_r{{+dq)fsq~fn8wp+$}^aQi;+^Celf?& zqf6a01py58MEE0(Bc~)sh&Ql8P$66c0fud2FL13dZwqsCh?%P1?7}x;w?KvC*}$|6 zGSSeoCjQ4E`#)wwTXYZ=%-+w4vcuG7aL}Cub)hAZnl-x-Q>f!GQ*{;C3cU;pNcmEO z4&Y#r-d@?*IG~4m2`3YVK>i$vx@l zBkJ7lfxK`9G1P!IpRCakX0#xULhapw%&cTRU6q8?B;z9>4j;ix5|Bx3iFM`5d3%K- z-%$?;EXLkb8k&j{fGjD&zE_-tN}&G0XyJ3IHW6a9yi6C5Psh%ivc+mFj! z){}$|+J+6kZ`|J}*7;f#zvBNyM+BJKzK`ASu#s1iTd#9dbkn4PPp?N$vIWU?WACs2 z?_kN$uL1x#qC`|BgZ)W7SpzkqxpIw)$!$edzoS}3a&k7{;o&8tI7Nim&%lXP-#V;O zH^$U40!ze1Brqvz*V}iEF&e>cV)w@fXlNMFb+fB`vQ8X7(X?YQITtyL5*Q-Tr0A^s zAH(c_@2aVIz(RG5G#aWeJk->@t1P5V50878x@ww!$5*OndtYk|k|z^0WD8lu7Fn-d z53VqPmuO@HSgHj{7`sJ<6mY{KPo!L0tSdxSi#JhYFJYxbCaLWF@_&Gvz4SW&*SEKe z2J#8g=ANYj$|wgPlM>={x@(Uy%tFq$WKC4ikJ>~>-`+THqgj?#`3-tORkc>@Z6IQx zhwK`g>=~QDh}&KNGB&A$>oeLOnZ@|4kQ|rJBL+6vY_vq`cKx4qR^A#qpIoj zG=k2+ZMU9aF)^SW@l8<;mFzN+6CL=bt(KfTN*fTzn7s~>fuC{JQ9cP%`+bzkbOez*Y9a((wiU+Na`KTMZkU74&9g_)SGvr>#Ri{D0P%;dcr{!aqMB zANnBAgdO3W{ZCUT+g2hJu?0m8^NW9_9^{V7dIo|KA#VX-cSdU`=9{&t>%1@-U=x&( zqSYlb4-zuQIXNnDGF>SCTb^HK&jGzEI&!r zlX4)$!AYD$Ox7*B7yj%2>higTg+EsknYo>u6!b<$&>RYDHa0e5M>hlJUy3lK95Gs0 z6?ajund@Ixy}-<;nTd!xNu5f)x@5q|Cw!u&GCaUf9jnhma(Q;<6}(s~Xe1*pF2XM+ zE2{mhvHzg6I5)9yGXzk@OS(>advS8&`bDQ93BrX1lK=LNHTvyf zhgn_+G4W~$FwPE%mbj;yXYBd!>jpgm(+tMk$R}*9gQ>$wW2akFB3-}GJtFs~DbPv} z*P8x?*igI>AUqkK6oNz|3%bIf3=HTRsATTcaVP{G12W{w)-5N0jCe8wDBfutQ`B4H z_}5Zaz`(h&Edl=MI<|OP8EJ8W2D?AuUl)va3NqvnDVVs3D4ZO$N`-L{#^|ig+#58U z*V6(k^>m}P3(#d8&8=p-&Bk=$$>@|SBRZw}mmbuAzMS&`@DqlY&y|pfa2mS2-S2oS zcK_5PHcyZrn`CDNA4*lCr=LE!mDz&U!)Z&2$uydO5Q&=E(Yr@DSz5A)ib6zCV%I5_ z7{e&zl;^4c^S`DIkn}kX>^NE)svX`zwxgT8$h5MC%^$lAfl;pgEY!Sp_tAFsxU*CaVPwL zG5|49g!<9JVL0hdC;Z8L_y29?`8w|um}Jw9!N7TPhq!A7=02{BB( zVIR=SN1za%~OHZBm zBts%BU7JB@5)NkPD|DFp9}7pF%Aw46#kCETOeP5&rl|!56Ozn{H5_XqgLVJj;=P*)_ZQC6XR?nM{IZ#?54Q?WG)9O&IEN!-Pb?r?^O-)Ix z8s9a7G0g(fkiDw^av{3ZAoMfUcu@+MCLxO!o#as&S$Mf~!~mtQ>N)jycmEok`>F*p zLicR;n-LW12={Su@leBSd4$%|kl=h?jOQ_1>`Cm66J7ECUj|*sWJ*UBSudd${`T$g zC@1_aR*IZuleAIww?&3PsM_4YAshQUj;mI3!4mrOzf z*5>xNDMPzFhfAcOQFZ@i@9+oo@;`-e#e;O#=>*-{Cof7zF*B2(_wnK5bc zd^TmkpN7vv`r6T78$M5Le3fL@Y|Ucqyz`T6JGNQmR4QG{4ayFWSG1wd=6EZ%g z9xe6)EkJ<^0IvYUm6hhyx7K^qF8mkuB^ov##43E3aw1A15am{=4N)+)hAem<-L{2hfj@s1C5~#J8-#zJKwoq#xhvz|^vAL5_o7buFD6&w z>R(otUG#q+<^}BlS%~=B6Z)6XMixRI10WhaS5~FaV1vUR!Z25*O2;F9{r(+>h5cf3 zBJF)D0sidm?H^WFHo37-^rI~Fs4=BQ2)0TuraR`mhi(k1uAw4akia4#&Ubu{|8v){ zLZ^45g#~mL2e<=_QP?hNr_lX{#W`t!^dF+P*bp2DK%T5@2-981%+vee%Qg&nQklUQ z@$ChvQnup7*{@t`?^$4`owTyc&zDKH2KD((<8s+co-Vr#{{~=yNEFt#B*nIOg|a=S z?I24I3i zprA*PmGx$U!%lnh_kgnuP%bH|&>*j(yi{^>)^BG9r(K4TLUqn!NZ`>f_!&JB`7|FW z&y`BLgE`-#SmFx}%^tdbvZ20JIJgQiF_}P>@D3{lCuEG+RR1!{M0xj5Dcj$Jd>{t~ zN}k|o2)>p;TD=L1R1Fh%rml|m9MrL1SLd$cz$gfCxjPn&K#sAIbI}8!eCY^Wo z<@~$1i9rAu(m5sLtwpZ-E2HX=v_~^Q(j+e->O1L$mo5oLYBAdwFSUZfqjbHc#tdO>> z!BApyt55AF_8S`-Iay8x7h8)ZMh06JK_Pq}S3E(kT+-9;Rl`toaDdnw zgUU(6Im45xeyeC~9F2!LT?iea)EcfxMa;#;bcFB+OoE{b)#jMw(I1>~00l&Ib_ID( zIx7np0+chAXGA>R;lKs`!0A;y-Rs9KRF6Y(CMT2TX(6kF;f$u=VcIWV6h12*B!A6M z|1`Hoh6(|DQ`ZBH66wOoQ>^d;A82m(31$-(lMWwFzDSuW;~;w%^ydk_UTKe{boU4g za{fUU3w{OJF{cm_*&L@3sfIk-Aj42t3W%GqwR=t{($4@DUl7%K%jKm=sruaP`1I^# zEV`{|WY_xf*9jFNJcFFp$nWM=`i+aLWKnM+Qzi%K=B#Er?O|{?i2Bp{I69faXOAuq zmqtgIiY9HF08NT}6HoBj3D3t2>P|!j`9J=4V>ZhbVwtwCuG@mMKq`i|<#mYBpU?s~ z)r9J~#RBjvFgg%MJTJ@0BCBD&wmWmX-i1llECtokyG0vAXZST~dERn%5|BBs0>SP$QC`%=AJSpRgN&9K9o+ zbUn)5+ut8#O>RPDb!6nC4{KDPz{HI8DZXkaoZfYZ;y=a)U_u5$28V|`?}~Y-_&yNO zG7wp-a)oa+yV^50Quh7kxCBjAwatB8OVTo}3Z@Hls!aU2L zY&T+K0gjWuu_A6?w~ywQm+%>?vw|TUPJJv`@52ofTQ3i+@}N|7W}S&fQYuuvZ}BHd zLH~D#2f`5ZKOfLi$9>N~#t5e}9ox+#KpF7?YxM?ya&yyHyZBn3ZDagn@n+r4s!XNKtaw7hYp7JGuK z6}lJB`g*c+BP9VNjb1rttP%;vv(ZndxJ)QJ3?*ewE>}DLea|`d#*5Bfw5M{d=$|0b zeKRFqG}o^gBZyYYe2?>j+S-HJb^q6tVYPD=Kf6%mEH_y<2~M!6ci@c2NIpjUQG=7S z@ZWuw5P>8!JIsJ&i!ZPyLkO182Yk1#Px(O8PRiyZ%~1zBjRW^%f>)Otx8QH+kkz=8{5TI!7H$f`%vf~4ruVGP?x8A8ga$2}> zfSOb#+Y4B%N*SZXvd)^DStD=@((=Jy%q=YDC4x-ICFu2(+MJAUkm2hxpUGXUw(C#( zZ5QVrf^E0lk5?Bd>OUWGP9Nh@E?hR&zk#=^xUF1rn%uWy{A#?cBdK`)&ZVtoH~g%u z`nLPI)ROCz2&S&mdKAd;S=~i6LbqJjH+LzIDQEd8%WI@X3JXIH%k1fW7AlH6n5PCI z=lo+=2Y2(ji)^hP&C+02mmpMtWM_K?w7%wXK^Sl+CKUeo9Yi-py6LK=-D{=hsl~)^ zN+9X3No8wVzD*mM_drjb3YyNXE>BwitO__51(q|NgkEo5;8_A(*e~a8dhQmT7(61p z4eQgK_?MB@1}q!3mm$1?d(YFBuiwbG{~V-j@tM@E)n~iw3^Eq{=qEz=q1uU@!xn?b z>2Y6SmK4^UBrE#`uu7K?jkVOCEeYlY@fC|2UIpJ6$q7WYlN2(oF@Bx zbzR=h5f!Ex#5~@aW=`ZsJ;-e;b73*rQ~96$pR>r7@FFIXIGY#v7KA11^s?qr{7d< zD_6G5_}y1h9y*NW(@So~FV|cVF$9Tz%(Wa*$xH_v88*T7#<9J8?*!)f|Uhnal+CkZxykb1nKf z3M3=mYV6prGowxp<)U=UMKYTjogLi`$|rRV27CK58+;vazgeLB;i;Btv8VJ$^|=+e zJ}Z9@p~vM0QGY|1tUvsNJJvFeo+}nH^p(wQ3s&FUXO@R=fgRWE64IHj^!Hnlupr!k)(TPRUiMZB0Bo#0(w)Pf5y=2g5ah9fF9~QL4|oz? zCO$>^{X>WW1j8{X-;`$rfHwr^x=MR1gz;hZZLTnn0)XPDVYzVN;%diig#f&^C&fov z@K3Bm9s!)-;CtOW;Ej5Jb*uBucPG}j3gDOJ;DOGe^WKF0pE5EcBu^-DkjuB^D9fXArB(u@%&9I_vH}5il*^x)Pr}q$PTqN9j3H^88PK=yFS( z3!mwk%l%&abDDf3vLU;m=+>~E(+@V?D+keWN?xPZQweKTZD$!F)kfcB&V5WKpP0jI z;!Q~#rguFnxrbI=ZF60EOQt)tsj{Rxf&9n|eP1{mpq#0TFjQaU6#twE|B?`YN60{w zh|v;i6iq2o%qf?93t1Vmbn8@;8va#U{JVxs;z4WmcUXh_PyL#7QY@aPFgsh*?|wOC zVIkkJ!8V$BpxqE*-8iGnD5%~eu=H`~)`pJD^=OBsm;*3%GgwNzZ@Jdisvo~@vAV74 z=a22G7XJWDbuHfpDt|16LIsWcv{&cf9Sp|9Cm%iJGwGStEqpz4Hy3bc5kJZJw2YOn z*Dv<>y3bc=Y#|TSN zKfQa__^*i)T;M!EO4^Jds1Re;6!^h8CJ5q&r;@vocqWkcFkY2zAOgUKFC^sF2@e8x zqVnFT2fO@YElz}l)JLM!u5`{UnJO%Uohe6HcB^l9wZl4AM^K$JyjNdq*DZL_@^A`F zw6Sc=HlY!B6Pyi<4txEBg>scR`yok(Uk;n?~iBEqkJidl3GkKic z5Hami8(qTU5;uS6%VC#$aaf+2l&>8E?R|%MR$5Y8fiNTT*6Yw`Iwb;Of4A7a(=NVP z^8!&s7q(W`*B9cf8Ze6G5`236P9aN*hAs?s$^@V!)4b`bmClhN!ZEY?TpOIi1Nc$no(c?G8*1IINWMa@j6hdFZh5htL6lOTj_hCQ3 z`pd1lcbHTofj1p@IZ_ht-K28tf8vdo&Szh`Y+mIZwYW_)XlmGWm#-dae);CobcJf~ zmP!w5lyzHnq7*i0VmIkEK3;$P^Y!FN980Oen&+)(T}W?4u*cqGwqm9cBja+3HT>MW zqMs=)O}+h(5rE^oS2XERf>Qk0c$i6#HCsXQxbNW+Y*RVQ23s%MH_@~`8VxZpfS$qAAIpf+ni2Doi%lROp6?w=-%kT=+{bQi=v?k| znA?M{UQd`ZCD10dCOMswrD}S7?C@9&#W;7k9N`RPHNw*&ZEmrwWbg_1y* zu1_CIcyL?^zh;a{D3)4;f%`)Noq8EDN{}j(`z*8oy^?GJ0s8={euM0B`Jo%05zo{n znQ!Z@(6(cUhdQU0of;*+M~up37>ZgJV0fWoaUv_xNcqu^MR47EN%iyxa%T3Ku#3Q5 z-m7f&en213)2Dt%5|VdiXU)c!K^ozfLH4VE+9f~wM+tP_FSCU&1#lO~2^KarrdqW$ z-tA~5-A(u%`I-Z^2Qp&?YS>?3t<2w6Ic&YeNyV;geP-N5rA3kXe3z>rMhkh>di2S% zY~_`tpuv;s3MVY5*Vl?GsV4k6>Wr1MmD5=s0xDnL4vdp7h0q&XOHDeOg7N*00}KUE zLod!RJI@((r+-o6&Er=pVWgRFP!2379g={o6yT52KEy1DjGqt2Xcw24R&n^bl3=KY zJBvvub%G)=Dr5xrNd{+GdHR3z<`#*3aaju$@kHaMr{FFR{$Ss^H;)>Q`X&*6^*IFo z$rb7pOBe0R!JeL=w8yV>a&#~kJf^}}XJdG8ccRQp@R7E)_ucn<>ZyU2*jU?(hRFue zwd&X@ibWMks;)%<)N*T8M*>;a;2vy{ydR{^@z!qhX}jmZ!R$%wx_lOh?Pra+Wpv8)NE*dvFJ^`DO5{0L4lhF*RTE8Edd)`@7Z*4-( zXbL7;c9)$ZPMAxrR)%pD)XP1&nXpczGOxGN{z@>j{oK6JozN3+Z#YKH6i%qP4C7j8pR(HbuWAT3=z#c> z>4L`;Bd6d|QEH2Ljlp>%tDkBqG$g=g9gZKn7fO+UIbW`Dg^pfIYyJ-_umrExYbcW? zR1yqre&~Qv#sW^o0Adys@QE7@>o?MvbgHT7G2KN}I*2_nYPYCDQX!x@72_Qle;BdN zLb=~wP)1X=%9`@kvXU}$o0q%%k!JoBn9K}~VuenVFbZYXHNEakB6O~`gRZ_5uf)=p z{zc8V|I#yk{LtFOM7KI3JIG$DD{*4rcC+wlT5#aO)$&chQ}wKiaM?fuXY+#4wgGY1 zR~!GV>YE(-=c@+?0abB!7rNt;`&-9~k#esLRCzUEl}(uW?hQkG#jk@cpS?L^ zJDYyGDq-v80d=PgeG}bG{zZ@0Vbgb^m?Dz-!=^{?kJzw#pxbQ8AI%-OY=Q(?t+yHc zYnZiehN2LfcZYf}B_+HQ3Yd>ItaN3-1oA<(@8)dNJ23F45uBe zN`AT&+F2pUnsg8$Pp53m#w!W-bYGf$-7R%=8$l(}czbRHTbhXL6KF8F`_ancGHR85 z7=N^o_8y2#dF|QzrpyinVE$@S0Mki=+up`4e$4Bj6>Fc9!}X9g`M4xPYV-%cVf| zVM?EQ4VBzNr#eI#=Rw8zPpbj>6;=k!;Wo&r;LHfEG^6k312dmSlr`yKA3zbnoK`!j z>wQDGl{7G89FRWe-wROmEG`N|bt?jZ9xF2a)kmq6!Z~R}@{G;DuU_djR@<56-v{0Y z;xjD#IU7}JBe;yImKjiD3pl}S)k_aP{(R}jljb6>2i|>u=D%1i`6K%ghLJ&GNVEt2 zTvD`#LtUUyv4+m&07I*Dgn>wWpM_0oLH8pGC!v)&WdOdeg}kxiTTJ~hDf*mmyQls^ zqqg2eq+HlFU?eZz72*lY-o-EG?{^E;K?;$b!r=heb6G6-N8D>%WhShqg(v3O?0rI! zF`@lej>JpYvagMJtf%x_>Z&zI9^9H9y^?krFs!)D4cyQB>scF(VteiL`>^p4D=2c} zWRQ(F;CuFnR2H}84{YAD`zb?j*0httc2Bl}`1oe24t5ugv$K2Y<1?$@Wba@7F7MZChC9sm6A6HeR;SL9aRZeskJ!K+#p``@pXjkuw(wN?XO$_${Mz zuGTjFhpqQgl!qnRPglv_b-CQm!YE#;<-Av#F@>N`D6?9X3aiTN!oMYsMyV7Uprd<< zEyDY%dDvRzLjIMh8Z5Wc_eK<}&%V0V5^AP|!F9pMsdCVg&pPl6A*V*>rWBKEPFaHb zYYOeD-BNe@5Z|nt`Sd0Fju0Dg#7D~WD;!hM`_lmfh*pKc(9~qz7jHqzcEoI3a%Byx z6+*7%IgOktDeSoQjYS0Zw*1@9R4J^LS)!Gie*ex6JbhHCqZ2H$rEdSmd|*I`&WJgDq)7YAez)-t(*lyq zZ!Y$i(|GrXNLY&8p!T$^a%$;nZtz1>QPah!?i-Oqa`QBfVMt8m7ES~&zGMbu{lVa-&lKd*!7TRXayVsslj zA+|bM`Fwi!4?fUoze!Na1%sZ@Xn}0;*Dug+GAUL$wQek+XcAW;vp+GlrUo zg3fS37FqJQVki#Ysg-W@DSakv!?s#Z?z8Uqo?V%CRvL`aYuZP^|Kqr!O*yWXsFby^G zSNVmz5$pKL7VNq!(k2*h+W=Xvx!r!&qQ&Lr*c&u^wS{rX%P`cu^9Xq-Ki$}RKS$BV zFV|39WV^zdIJVl5!@yRJ0G$+AXFzO;c}tofP*9?iJErZ+>nEKM!$^4~d`xx8jIjDVg|K^SU^C08v`e2!>M9R;)ZgG!IA9g%0cDh~v^1JO7 z{nO{n1=`Q9Hw84VR&T_49i6z2u>PwBz<>H>MNhF_Hcn85T#ku}Aak#xGO+d|@4^Xu z`o8r_&cp!qs{V=ZlKxBFwhn>OEG4CyG(Bs29GhMW-#@K?g`>X{s{O)nTTFPywzGg<(!&5)^;Zpn9}GUkIEDivRX_ZMByf z3$6`?fYEue95Gi2=v&+3mpOwE-(i+t6D-N?DRTnqJ_GPpy!quZ1{397FUdW)N1qRc~w3Fqkek`z$JO)!g9a*Rk#`Qr1h<8b0uTm-ZA$)mAu<{ z&Ze2I6e`&)%uQNS_f4N$?d1>16KuxkfVh0 z8o@K+tNu7MqGNWh_fHippg|V&yxZc<4$AXJM*{a9F^u>f>{bkcC4=(guHPAv%b(_6 z7MDLRP2ef>7z^<2H`Jjh8z`^;vj4e~oWqCD+q&~+5Q$fG_I>b`(Y#gWVVS|Anzt@Y zbNCEnSlRy|a0wyD{)T*lz>sT(T3leO5C3sjJW^eVQjWfU_81b@9>gsqc|1HMbiy$( z_cUwoyQl#HK2z6qj#k(YY1*4EWR^T%(f5cf!Cz+0=<=HOg^sMy3ww>&-l~_gPNK ze|RQIK>EbKm%rY`OP`RLPf`>7j;s6`;C=X`q%PupRzQZnEe0WNIK;KA*ac91hpr@S zw;ACPz%@WrvLu?KgIvk$C7bstyiKh$n4+)KZv?S0Fdmp5?kBVfH_kvjbI|E0RV4ro zN^KV7wfoqcx{cZBpH1rHOkatH&7))k*wtTqSc?buSbY+^FYrVkAaXD&^G%2{Aa$$T zzZaj6AW5b0r&DD{7d&-E?lA{hU0vObcYhgw?}4Il7>a}#^0u=|KTXyJ0sLT4+L;<$ z1>82V2AXU&Y*~L!9M~i*_As~SaOaaVM}dB1F35&_NCx7{pyP_M!QG;io6k9z+uB`s zN*?}`iA*JibJR4XZo%1wgoHx5Co8zxwAi0@Zpg8o{kk1ZpQjvr@Z6TW`n|284)P6(vsviS;BfVoqe0L^b}xb%E^B{)LAbFha_K>%%8gWs>NIdQ#48gOR? zH4nBK(AC^UuPbu@otXP85qJ>}h$$`S;AAZ-UVXZYcU^4bIBxwxvsiJiXyX}+d5tFC zGC-;mSB$pGRy6CYBBq?_FLbN1J=bOjd;5es&~Jp~9N=TP7^i6Bs4c=Ba8mJ={%GZx zJqn0NpJ3P~%IMf5q6vViMc%wZ&>5pW?tiElGi%fsX zQCNmW$nD_eRW3iBtJx7A7OHod3zO6c9Ttp{<0+}MDKASuIC=9j!Z$PJzZpqJaDOD= z;7$?tsKH>rVv;nuvoymF0{B6MNK_pTrRd#$N1zWT3zb9tyhMk{Qw%U&LM&-Gpdd8` z#yB|piRhTYdN3p~6vM0(SNq8t&X2w*AuS@1E5^l!?O<}7FS(i;!u+3s27VzMELPB9a5(D{#!dy&&gSnby&&e zsi3%d4^Zuj2GG)Q!X%7!s|FVXy&UY#ER#4ZCBt+-oD-IwCVFU3Rw_tdc*BvF{( z%zE=9wdW@n@jUWy>mJa9ka}-MWpGm{@bm)TuL_#}h*l7=o0?_nNTNz0&!|gz_F#OX zbMsF&Ev0%4e_qyWnJm_B>vhf6kENAXv0HWWKZ5_8dPlQO=$H|)FQOFse*q2ElWS%+ zCf;l2he$P;6suL?2Gsn(3WKep0V}LF{;4`TjG5`Vkmx9nDVGZe=VC`HT0Ak5k`$kk z;e)6!Qpdj3F~Aq6llwDRs1%C{lBL4#+i+LFQ{*wLp2i~we$|&m%ed}#szo<5;;?Up zVJNXD47YY4+bT;P%DH|w=1&t!i~9P2dh;){X97h6=jJ9ht}r#TBr%r(Y#RvuMw8;r z?||2`e4lL{oI96(=H;_#e%zg#TOxdompJ!`Z(TfarCdqC2&AOc6PF_%`&hkv@^H3( z9h1^H5|k7c)wK-+xs8T|$rV(+p+U@AzEjv=b9(}Hl#BzK^O3$=zeh5>V}n{uFl=N+ z=gA$tb73u z){(|ao3dYmhZ5w&{yvjPX(+14<0omqOIz9GUTTq&o*_P3 zkwXW=t@WPov4J58m1Wi=?Fox*Z}hp~>8Nc|PcK|TX}k}xbhnfU0JT*;v9D~oS-nc` zufKhrUNEF0Kfd@`sjag;!0?DDY^4Logn&K+*`tF!9qh`cbtvz zMLr@M%6Om40xKEEWk!h|w*UURNB%LT2+bKrJ6a4zMEthVL9&-Ab=Z3|rTm(*PjZ#d z7#k!6zG!NycMvdMJaRQhd=Ev+@tuZOZ&&nu@K5UxgY$qH0Vr<<+1Df|O$zUf$c!9= zH?W2$U+-S5F%U{NpKFVtAk#YDLgieWMv(^J9Opa2Ab;5480$8%@-@wYNSU~iFcO=(zTZ&@B|J`vTH^VP34F8`ZY?;> z!|5e7^IHj>M%cje4ruiqN+|W$9}4j;=w-KkxI}dgt-FXFR7~S@a*BcFIIVC`tXw#(MH_? z>4yGx(HBgHHG9rCb=8J^{25-qDo%_RYAOgy+=pO@R<4aG1(-^y-fdKxaJ%o96Bo7v zY~@ztj}S#-d7eqm zOP*xdL(&RSrJf!Kj&dj~WC%$G_Doalf@0ufVI&DLF>|H2=zPnY7%fqU979m-5EZtB zZ0dV<9gc_3ba)>N3`lpl^P2vNl@ZT+j#W}&xz)zF@1p(Tqj})@>TSp?f!kaamdL(= zwQVPxN)GBbIYgo7u-li;M+qA7^uWJZ&>w&yVs$yqVal*P1+K8zn3%fc)lC4Eu6vJv z2hbev79nh};qjb#tvWvbDT?NL4DZTtuxNuMVHM4PWvT&mhHGkSGVSY~QjkMJDj*0y z*Dq4Zg5xVxF-mXb@_OegVp7mI0rBAXa5?eSL(Pz()OtFHdI4@HeHZP`7C1oW)wS8m zXCVIe#7NphBMz5TQamc25ut&q4-Cy-A!5WT=uh0o3~8<;xz=*ql0gDNM?_KpO8^f( z?q}fs6HvN5?RltctP%kcnmPAlTE^6;$$*+B;lxX`YBd-$ERyG4msym;!mg)zv`?!f z*C&s9s3|GVSGEK&Bk{hML37q~9`1cvb5w2T2LaKwkdM+2dnqJELypYnDT>~iYZRgC z38QbT(<40^L*l6#*B=r`nJ0;?wqy@9d= zfQQSFZD&G@W-EO1eo{GeIFQJ4SL0T?qm=X--!iW2onokygx;TKxJ8CjiFGR@BDjT- zJP80(G4U z1@6!o2~PStoX?tz47Wp+yMMFUqT`dRoMsmn8l$C!S^97EP=-_&y>czR@ssJ_=AR8iXbkVRdNF@ zoi!GA-Ta$t&BC z&nRxu_LYY2$2j*P$ZxZjJl%3?n*CKKz;B^9iHW8FtU$Rv7C3s~eH8bkDJoU29eN&fm^CR}$j*byJ13W>yoB% znT4vS9}9^4pL%Z3bcN0Td^1;urk6PHM~QAn9=M8s@%LB3XMeEzmF`Re+}I#Enbn;T zrxA+kzL}k8A&N`=>y(C}K0z3Vo_l${5GB#>w?f`#)O5(3R%o-oPiF}+1>98A$1m?+ zMRczEg7{@kxfC)CDKWj0MG!zYSco7KvD$>HmE9b`vq#h<-Y3xfRQ=^h$2a8#`kc{{ zMgy9W`T7A%A;!{+jR_$#%=P4CG@|}iu0)8w5;zF{9{sOCLWL|C>4W!Dvk4Qe1qGHf zOLMqHtuhO|U9c2TT6bfiJp1*>B)(^V^N!t=O#vr#YUQ~RGYeCRjwrqeT`fYLRlXvZ zWG7Ss_a~|M?;HtV+dy;bhDY2Q8WKL9j7?5&zvFL`lRb~LdGX>!bC4l+6!0NqRwJGm zc>8UH^Z%eb4loiJ8Gx(itY?IXkO(UBa15-itgNqWesHVH(urwz@;fjAV}ZWw4JDdh zlKAnp-*l+)trj~zE4_X=BVQ-5wd6$13N-LL=ry?N=iaV_?={tejzQ*!`MFG9$@{M@ z1`d0+mE8EO9L}K=cRItN00A%&p>?S;xfs}{=dJyJab<{CJV5=;p1u9rC>2-e3KP1J zYI0m=#l890Tc%`59boT6{511|w+2_`g_vAKAT3Z>CsTTY3JXl{sF(co(^kl8#xetf z=|_lsgw4UF0p}XQ3&;H#kQ5+P*NX5hvVaB4vh&$90x@tJn8pkC*X!UfCb{JBJ~Ay!YY)QNU7LGGmHsjDx;>brwTD(|)Lt zP}W4qf5Dwz59A3;(q5VBh7+9<>hi=*!6xTp&HA&#XRFnVtN7rpp|GhFSk$={9H8I2 zA|)Uth%vn6$cHMh8C5ZL$13(<2P$=UuO@(cJi9)%u8l>b%a@n{D^l~=VQNm&KL?nmh`5Av=I^kzqF@P+f!h zm9Wvf3x7HxfOTDIb6#6so=K&4^!HDoZOZoYU#FlC&+0rN;Lt35sAePPn&sy$>!OA` zBQ*|mJ=#-cZtl)550`!DlU|yJRnU37NYd8gv2>q4 z^GD!60MLPd{&akyarp6ni;q4~q99n!OvyNAc^MZ)oo4YHI_!hTrauXi^9b794NOWQ zD-Urnn`3}8i`zYjS)vK$Ue+zts^@C_(5h!ZV6Rf_Eqcy1ZNp`{<*OK4HkGnS178ps zCx$7E1mj(xc>*wwVR!<=H9rAgizRg;>z`fsg+zwQ&DbH>>e6HUD_N=V{l3yCYJpus zVjJ}gwDqCsYP1yH)-rnc8;As8LLhaxm6TMgaVxsUY4AIV`D|)Y_ho}M3wWlvRlax< z#w(ol#*IaS!sPFQ4JuYzk}T0q%W(|!sQ7UcssD`H3xQ*ymV%usy>1#RTZ1sF%+j9u z#kJ1&au(O8gaNK^_}l^5pvb#NP-O9lCnhljB5^PMimZ>V zy1A?@DGg{Us}o9(U`y^ogfdWCBG#2_x3Ep;dMQdwsY;pti9Fyy5s5xd8o~{ZP9hO9 zR1@EO#e7L6FP^1A@^j(rJ7>RY=80&|l8cAYqRUiEDEb_R4EDW!`&G{+EyMW zD-}4Cs#{d#ZRXJOkK2WW48;K&?3e&0WU64oxdXi)zwzV&NBEc5#HS1a_uR1rUS9QH z^}4<(XzBoa7hM4*&nPzI^z9n3oqM`#qWDu9BmRMyWI`?F0`t0)lt zXOU3h3IHxTZ|@G&&>tUpoCrsX4_FRhW324>o!H|UDXP!f3g=zFI)M~tYW z2fiGJ|BtG-j*7DFqQ+Ls0Ratw{Y5CkS4a99xwr*7CL?N zrfS_YQAag-Iyc;<Q{GTcMKkZO+@_>n++7{IJ+wY2jAqG*z z#He-a?J;=T1(l$=e@_Ku{t5t!VsyVYU^HyZF89Zi9udf^#C z^v1bp8tQXYJSudgokRjwBK`PVTr?@bFn}uNHTpk`P!`KZ0mIhiByF;G(2w}~f0X9vDx(9;vVtYK|2jZ!Iy<9P8jR*U(@aCnfJ^_`tiz*1zx15*SlD!F-Un#kE7@cNu{~7e?1;Xl%Cl2i^>4smJSQHn8aZFPTCfzuin=Vt28kWJLf!AQt!xUfInw zFb}_qKZXv^`0llRaIP+|Lbd`A0W(65v76DDiB%&}%EMef40=WrobEw!`~W6Xkyym{ zn3LX_KY_R@)6Xc69(JXg&*X}kM2*U``1G*US?4V+(c&ckwk!PB_RE+;{9s1{)?HY;0}4qJ9vftC0qZzGk;1Nu$ryMH3g|1E^!0Y&dL)zvqU zhxfV)9z#fkye5V25Cb`mljCV_#`)QmHOZ>i#^K)mF*&ofGzik<%7PnQq}8Qk38r$>U@^9~K^ zWbf*yzrEp%h%-Vv_mzDH;WqiR6s0^E74?!faS=5-@nos(nO|fkHZO8F07j|f<9mkq zkK+f&MQO*zyyhjXvZW#kAEs9JEdv55^Aa!VYjk<*$VPxEuRwGEuA1)eV1Pi9;R`x~ z=vqDYlo<3Mj*@s*j4Af)q@Qb-@-z+1xPdBNSE0F^1nFt3F>|Q{$<&(47229>bOo^zdD4HqC;4=%15we?1(QSm1q% z=|me2i_Q`xRmp=d2mk%ASfjF<8d6u35Xd^8B6Y>iSmoXJdmSG4tPpWg8pIMSIG|;Kk z)#yuIaZA`JLv$OB&9^^D;|1_2wGG9y0@fgqa-1a)K|&B4LMnE`!6=} znevMVwFn53x_g>BCyZSijK^4i-E-KmZe_}ff@5`GpvAEhg7>o$=L{=_jw>sBEccMY z<6*GJ3Lzn+&GV3bWD~=GdPB(@6*Zebsy2T4Bp1V0rn3f-w0wC~7@1IKfo4vP4BNs;p&qZCZ-X zBeH_|ap2Ra<@Vd#)#Z`9pxj`<>z6^D@)+C8c<;=@j3{On1|0?C7stx6(ypq15}tj- z|0jsm>=0(fk&=clintz+^KLKy;`-2V?%TWlK}%yPUO8{kM!y`%TYC|4|0kfMb3J8x zKRes^1x8$<_#K+A-bTyrq2~=n^CVq{^%=Br@kl;&%6^LB4Pg?-HV83LaT3ulnSPGVbiZq(mqnvD_IKGV?Z zze7~uBSLU#`o}<2a(UegvRv+sb4q#MYY<+~#rMjFmeO(}O=zUds-ooj`8`-3f>Cq# zo0JxXF#;!|7bmV12~3c9dtVpId0L}NVyd!=RuZO92o|!c?*p+l@>qPo z))ZqH?r zWvATys4ePb2RXO1#h`Cp-rIPzAn5|!V?02GPdN1sOY@EJ(4N#XOk^(Jqm)4;=UzYZ zW?$t6w1_0j+Z~Ro89>C{FCZ{BrjF9e7%r!6ZJY45->&2z;f(*FkQ-RP zHfr6N;{m*G!~GcTZ%TW4Wa8W3-c;%ijoPp0+1U;`pwD<#55{#ttMu8ol*2n^>#rsI zesj@b#)CthEd!Ys|X!~BF+-+XF0Q-obbodq3d*TALQ_~I>APDbG* zE${4*;GLaWJrcC?ZfM}e3}ev>H3vR<)U<)H@iFVd-zEzNaJ7r6Fk+}N#M59!I)4}( z8nV~W5Q@OxqA(N(BY`&BK96_+n`Lgoc)U!vc*~3a|HMys^hT=2(nzDZ<%r0sS1$h} z5RFFyMv?G<4PoE++J4*{&EnU%kygBcy!gg^>{jQZhI7OFRE9a=zy$Ljz=Bq*de^(y zcYpKY@KB?sw(oT)>!CHpJlwzC=sBrNJ`d1!nX>-)nI(Y#@vMCdM~qpdU08F$88KC( z&K;g@w0?r=mygncbjGM0eQ8sBg)zm0RL7M1QoBjrx z-A`y-`AE!xJA-KTXYHaOIvFt-8nSjmKuXHBKLjYI!a`er zX6YkN)I=&VpC%*vT%Sc(9u?r~${u)@MHDh@CETN5_RU?i37^^1O?>_E$HD;vW=V^S z>=M8{#L@A<%WgsG5s6c^^wDGGpB#iaB>z1@%A0g*duz`g1zMkjF!Ns&Ew!Hf{_?Z^ z+jna&Zs420q8E|)xK@7s5)n8q4z}sv8=BF+#QwANpvzcb<+91$L1mskerV8S|JO_m z;xIMFIi!BoZ1)+~O+NC!nK@Msi<8;_c;kw#H?h=`)X|3|ZTYEZHeSCwR!NTp1MVID z-?7rfg5ku@4{u@5?($kHm?ng6BwzzDOm zb$wx7Yi`Tt#n{WHf6gDEd?7QMXmO!0%}N23LAlwdyo6M_vLu_r>*Iix=R{BHoATzO zsze(I`reCslpS&CwQl63%Nlv6xG9v_=u09yvF zQ=+~!A{k#Vnah_e_Xz%fc?dQd7z3P)JEmk=Q}l+zGR;D>Zifa0e%HNCu^8iSLmQYF z#U3BVTJ}zmnk;N=&#Se9tGrGSZ7pZrs}+3ow!pmXb*5!5Nt}{c6Ml4kQD?^H1sU$A zkYbu^n1 z*e&71ou{Fra3f$JW@iuO@~d9>q064^3FZpnl~nKEW0Krkk&;0A&SLBWu>u{_zkmI% zS~eGUdFv~Q)ZOx(2N#|#!h%=Nkg}O;+6F$S@#Fdv2A*az6X{HJp{N5d7m4nGgY|J| zo+UM`Bu@|yw(b!riqHSsh3uFpxvmfy0B-OQs>FYXvxQOopj( zb@&7X{KT=0pG)z-ZV_PCQMkIeDpU;ff09$^VINx070O94jR2cXcLLkLMcHj#_9z)f z<)W5b0d#@Mx4D|TQ+s<#6emlIwR86TR-^Qx`ECbZ#*yj-uiflz@b(7^6NY#&EV z-J4Osu@U&xQ7g#nV7{myDbZ3&nNGo12O4K`lY8%{!QR!=v# zWZp+Q`T{f}{{)PT!(`w`9ESoi*0~af?iQ@cu^}>3s3w{fCnxyDmVydV%@{TYisb~u z1jD>Ge+-EYKonCUSfL8A=Vr-c)0lPEoSGp+9_RPi$W?WMrt}`w-4{juk%{v zFp{}zS;+iU&|G-IDiyM7j+eiE{K|yQECW4M{t1G-#42$@K91Clsf7QBZFyEEv%0!C z7jCYXo_-oQXcBjvKTo&X>>B*o_DygP|FrWu&%tNEjvY-HFDn_ia&FO-C+>|gintq; zK07ezXlJMS#>Y^@O}HlPzsYyDk&Lo-n{9KdEz`u6vqaqt*>(>fw9*#swxM~2T1Sok z){*%$Ep0(eKM9l*qfBKV1qad?!|ICzx5TO=7rm$leZj)i+@e>$uvEmwk7V*?N&Wz+ zjrufW?WTeyARxRfFZd>P8o1!xvYH84-zQSVcOiCm8Rf`zLb>OT6n0O z8)E)5XT3X+#Hh+h_*m5Rz37%}TtD%P@aP}% zcST0NpRew6D%NpxF$#-<13f$f1AEuqY!WEY7>jT{M9oydQlgSL9l&=HHLnfqkQEw* zG$SXsv(jODx|nW-C*&XO#@EO(ml2iSO1;98VH zM@w0mt9R!8mB1v6EkOHXh$*R(TT1XzTxqSlr;oxsP-x;dXl*lF&EC;b9lmzF*db64 zM8ZnX0KlWJUcA0t&=-hq^;48oi51P-IN@J(Q_DBT+>icz9-=hz?S5{-ydtO2R&=@w z+X7nw5Y~-&SVy)YDHu#$fiqobNy^L_R;=uU_DrdeAzS^8kwYjrC6;Z4yj{%GO7>xB z>Qr!kPL-wZe3&D8Ci_MlDKKUzNREZUR`wMsA$&h8FeweME<U-qq%`jY$dJ|IQ&^4Q!?%Uca)4p*Ip{i(Cm6PJ z8uBdB^oP>IDgv%@Fnf#GJ{9?UH84xf`CmoA)>C@;+QdsbKN@N8YTx^7HTq;_FxosA zr=Q;wQ!5T!GfekK&R=PCkzEl-C#>eD$Da#$bNU<@C0ufQok9 z4!vaB4Fz(O%VB6#R@O65g0gz|K=How8g&X|`QijrmBGB`CW?T~3Y33Ca*y)FW+Ev) z%hPpP(J~UdGj4=))##)D^BG^Dcq+@e!STAmSdY~>kti#^ zKJs*-VR2IQ|>o4QJMCha_*Gq7c32Ck;q!gA3_KWW+ zqDA$xZJ1a&RYJM#L5ym94eFK`(`u@Pm}U?tj?8MQwu$^|x`m|!D9pby2ran?I~2U@ zq1NB+9XoPxjfqRxMem`AHQe{h3L7n6SGG5WR~;#fI7nnzS6Lo=1t?!j`+?U45Do5b z{t>ZCl#dY)SwQ_weFY#R%P1+g;f!o|0ZH4oybFC9mO>)WjHTh^)3R(1dV?!-zNLfk z-KveI53q9d|7xxF*kEAc_gBck%%kVtTWGF^kYsWgySzSG7)+K>myW*v;s|B*9w@>; zZ_N5~qN`3r3$;=N$p^9|^G3P-ix8o!KdkP;fZHIyH!xj6bcdh%-L{dBhxpx{O|Qb% zJ2wZlH);B57JOeS^7k&P0<@kK(uxShgeRI@Uwd0T^_JB)0#^esE9oOtLfhz{ zy4!A#7SsRWwN4#F>Pnw3GP@*v_pr1$y=WgNWlm*QZgwR31kd6gp_^JL1#r0BRqvqxDYCbz(Y51X zWK^I`ZGymsr&aO+nyR3HEL1EhnKb@9mI*mMw7C8LG_v}oTV1osetmD6B;;;0D9`LK z7C2_$ZVn0l!Ve6(o_cX_m@qZo-6DJ+E3s^V0UK>6PdIP3o*qO(B!i!3k=~p44M!^- zm-y8I+nqrHGvX^AhnTQn8PcghnCB#I;Nj9rf9C4d*9G&Cze0icCaay#ii@7ICj%=Q zO0%ogVQr+2L@cnTF4(35NCrbsbO0&e1?{ZdJa+A>oi|PuS8}}nH9VsweSeibae{nN zU+6$TN=x^ztAkj~Hw7`CH&7rYO(n6wqPS4S%u)15XXjg-xLWE-ffpgT@WQ)HtTxgH z=8PQVuo0Z zegF8;l);t(Tebrglv+_QI~q|fC%b$Z$G$D^Erhk zP8RC-l|JiB5hI8NW@n`pV^9@^7tMwy6T~mJCJZO{y;;)s6JV7JXJ6D9Eqm;!;YXj_X z^^Rb~-t&;_^jmrPgtO<_T8a%X6|YS>e(*(?3}QVg__J|1zu{5=Vxvj)^zMnRy6r}( z+^5zgJXYJ9KZme*#|7c1c3@^GwH~;}6Vi3KWU;>o{p26V!}Rv?QRd7Y`jW*Jm|9j4 zOu#lYl$+>!bL5G+atlXasRfWo@=eGfRxPCA(;!pd_4{F9Y9w*D`pviwBo1mP^N5sp zy7zK?Rx>2}8k^|w&;l0dSSa2}Wx0+^*eZRsuEj==$yuAhmVYNQ@uRx)!n5Gs@Vjof zeSJ5ZHzQqOr$Jq?bKs}yg8a{~NKi9WxKONDk?ZMA!NS@a??e~;n7*I|R*V&#UJ}Z) z#zt(HO9M(`tM;f1@8k68STEFvu^In?_u$Z5{VF!VdR(xkd$}Z9j%|7`Gc6-UdhbL$J z-@bO>2kfW@w=vW%-*hH@xOMyV>fkkXRymUmmv#NYPR?opCn_XM_g5mV#CgGKGntIA zQCsmveZiyZ8w{18&gRIMNfcl`6MQLb3@vVQ7q{U8!WW(zDHRst4fOE6k7Yw#>TTf5h)b!$b~IdzS{C%|299iCpjGF%ONiMX6u z=-i3gdN2OLx%>S^I3(w3D0($6E6XzO{8-xm2<;a}e*EO>c|!r>3bWkYwlp-mMA%?` zQ0Cs~f}{QVt4QZ@rRxr=B4izYdN40g5@b-jW@``X*1cgx6?|1grgliC0Iu_+a{*rVUO2p68m1`kV9LWq#t`h1Y zv8Ip%ruO%kp!24##~HKLmQ1#_{D9!6ZJr?3S9rhLWf1p3_{GJ%#;T~%Tsup#h7#s7 zUgYr0%0F5F{>To57A>dCBZ0|Fp*#FGOGM|E*`Bf=8*p|NmRHSY3lIeK!R{v~POq%h z&&r3*%hBCREnp+NzEpr~%NV(>6ElfBVW{dW7rcV~O*YX-Z<^J%$7imAeNM>V$h;#A zSx?jojc>_Oe`DXn;+)|-3~ZCQ4Mu3L4U6=Nz}h?7LeA^yFEYXW`|+XXYREXmaA*

AGRJ&$74{eo>a*fJ1b;(Q^({nxL^Vl!$@lFH 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%0AM=PCR(FuCH=WBbuub=Zn$ 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"mdn4SPqM;tP>FWjtH1to+(jM0X*9S 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 Reporting*. -From this view, you can monitor the generation of a report and +From this view, you can monitor the status of a report and download reports that you previously generated. -[float] -[[automatically-generate-reports]] -== Automatically generate a report - -To automatically generate a report from a script or with -{watcher}, see <>. - -- include::automating-report-generation.asciidoc[] diff --git a/docs/user/security/authentication/index.asciidoc b/docs/user/security/authentication/index.asciidoc index b3be4d64921cd..022d1dd47f7ef 100644 --- a/docs/user/security/authentication/index.asciidoc +++ b/docs/user/security/authentication/index.asciidoc @@ -379,6 +379,7 @@ xpack.security.authc.providers: -------------------------------------------------------------------------------- [float] +[[anonymous-access-and-embedding]] ===== Anonymous access and embedding One of the most popular use cases for anonymous access is when you embed {kib} into other applications and don't want to force your users to log in to view it. If you configured {kib} to use anonymous access as the sole authentication mechanism, you don't need to do anything special while embedding {kib}. From 296b7af209bc347e3a07b56381f612d23c277765 Mon Sep 17 00:00:00 2001 From: Tre Date: Wed, 24 Feb 2021 09:20:19 -0700 Subject: [PATCH 44/45] [QA][Code Coverage] Log less output (#92289) Log less output to speed things up --- src/dev/code_coverage/ingest_coverage/ingest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/code_coverage/ingest_coverage/ingest.js b/src/dev/code_coverage/ingest_coverage/ingest.js index 819d9f128d62d..0d1108ef4acf4 100644 --- a/src/dev/code_coverage/ingest_coverage/ingest.js +++ b/src/dev/code_coverage/ingest_coverage/ingest.js @@ -51,7 +51,7 @@ function dontSendButLog(log) { async function send(logF, idx, redactedEsHostUrl, client, requestBody) { try { await client.index(requestBody); - logF(requestBody); + // logF(requestBody); // A simple way to speed things up, just log less output. } catch (e) { const { body } = requestBody; const parsed = parse(body); From e1fa0bfa9c0a7e441be7004c1a735719dacdfd61 Mon Sep 17 00:00:00 2001 From: spalger Date: Wed, 13 Jan 2021 08:38:41 -0700 Subject: [PATCH 45/45] skip flaky suite (#88177) --- x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts index 7274105413145..a631bf3781d09 100644 --- a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts @@ -9,7 +9,8 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { - describe('uptime alerts', () => { + // FLAKY: https://github.com/elastic/kibana/issues/88177 + describe.skip('uptime alerts', () => { const pageObjects = getPageObjects(['common', 'uptime']); const supertest = getService('supertest'); const retry = getService('retry');