From 129c0a1e7f716985deffef68371d21a52c8f1c3c Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Thu, 10 Oct 2024 16:16:52 +0200 Subject: [PATCH 01/22] [dev docs] Add recently viewed docs (#195001) ## Summary Add Recently Viewed dev docs --------- Co-authored-by: Tim Sullivan Co-authored-by: Clint Andrew Hall --- dev_docs/nav-kibana-dev.docnav.json | 4 ++ .../chrome_recently_accessed.mdx | 66 ++++++++++++++++++ .../chrome_recently_accessed.png | Bin 0 -> 125734 bytes dev_docs/shared_ux/shared_ux_landing.mdx | 5 ++ 4 files changed, 75 insertions(+) create mode 100644 dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.mdx create mode 100644 dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.png diff --git a/dev_docs/nav-kibana-dev.docnav.json b/dev_docs/nav-kibana-dev.docnav.json index 8b8cd64a44664..a7d696fc10574 100644 --- a/dev_docs/nav-kibana-dev.docnav.json +++ b/dev_docs/nav-kibana-dev.docnav.json @@ -278,6 +278,10 @@ { "id": "kibDevReactKibanaContext", "label": "Kibana React Contexts" + }, + { + "id": "kibDevDocsChromeRecentlyAccessed", + "label": "Recently Viewed" } ] }, diff --git a/dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.mdx b/dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.mdx new file mode 100644 index 0000000000000..cca466bcf1ac3 --- /dev/null +++ b/dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.mdx @@ -0,0 +1,66 @@ +--- +id: kibDevDocsChromeRecentlyAccessed +slug: /kibana-dev-docs/chrome/recently-accessed +title: Chrome Recently Viewed +description: How to use chrome's recently accessed service to add your links to the recently viewed list in the side navigation. +date: 2024-10-04 +tags: ['kibana', 'dev', 'contributor', 'chrome', 'navigation', 'shared-ux'] +--- + +## Introduction + +The service allows applications to register recently visited objects. These items are displayed in the "Recently Viewed" section of a side navigation menu, providing users with quick access to their previously visited resources. This service includes methods for adding, retrieving, and subscribing to the recently accessed history. + +![Recently viewed section in the sidenav](./chrome_recently_accessed.png) + +## Guidelines + +The service should be used thoughtfully to provide users with easy access to key resources they've interacted with. Unlike browser history, this feature is for important items that users may want to revisit. + +### DOs + +- Register important resources that users may want to revisit. Like a dashboard, a saved search, or another specific object. +- Update the link when the state of the current resource changes. For example, if a user changes the time range while on a dashboard, update the recently viewed link to reflect the latest viewed state where possible. See below for instructions on how to update the link when state changes. + +### DON'Ts + +- Don't register every page view. +- Don't register temporary or transient states as individual items. +- Prevent overloading. Keep the list focused on high-value resources. +- Don't add a recently viewed object without first speaking to relevant Product Managers. + +## Usage + +To register an item with the `ChromeRecentlyAccessed` service, provide a unique `id`, a `label`, and a `link`. The `id` is used to identify and deduplicate the item, the `label` is displayed in the "Recently Viewed" list and the `link` is used to navigate to the item when selected. + +```ts +const link = '/app/map/1234'; +const label = 'Map 1234'; +const id = 'map-1234'; + +coreStart.chrome.recentlyAccessed.add(link, label, id); +``` + +To update the link when state changes, add another item with the same `id`. This will replace the existing item in the "Recently Viewed" list. + +```ts +const link = '/app/map/1234'; +const label = 'Map 1234'; + +coreStart.chrome.recentlyAccessed.add(`/app/map/1234`, label, id); + +// User changes the time range and we want to update the link in the "Recently Viewed" list +coreStart.chrome.recentlyAccessed.add( + `/app/map/1234?timeRangeFrom=now-30m&timeRangeTo=now`, + label, + id +); +``` + +## Implementation details + +The services is based on package. This package provides a `RecentlyAccessedService` that uses browser local storage to manage records of recently accessed objects. Internally it implements the queue with a maximum length of 20 items. When the queue is full, the oldest item is removed. +Applications can create their own instance of `RecentlyAccessedService` to manage their own list of recently accessed items scoped to their application. + +- is a service available via `coreStart.chrome.recentlyAccessed` and should be used to add items to chrome's sidenav. +- is package that `ChromeRecentlyAccessed` is using internally and the package can be used to create your own instance and manage your own list of recently accessed items that is independent for chrome's sidenav. \ No newline at end of file diff --git a/dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.png b/dev_docs/shared_ux/chrome_recently_accessed/chrome_recently_accessed.png new file mode 100644 index 0000000000000000000000000000000000000000..41d3913b048a21fa23573f26de02d45ffb21f6a0 GIT binary patch literal 125734 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%0D-oDwiUwxJNTS2z?D=``O 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 Iol`;+08M<;jsO4v literal 0 HcmV?d00001 diff --git a/dev_docs/shared_ux/shared_ux_landing.mdx b/dev_docs/shared_ux/shared_ux_landing.mdx index 4be8ad134be15..d96798eefa61f 100644 --- a/dev_docs/shared_ux/shared_ux_landing.mdx +++ b/dev_docs/shared_ux/shared_ux_landing.mdx @@ -66,5 +66,10 @@ layout: landing title: 'Kibana React Contexts', description: 'Learn how to use common React contexts in Kibana', }, + { + pageId: 'kibDevDocsChromeRecentlyAccessed', + title: 'Chrome Recently Viewed', + description: 'Learn how to add recently viewed items to the side navigation', + }, ]} /> From bf72e414206e7eafedb92b127df7f318604fc78e Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Thu, 10 Oct 2024 16:19:52 +0200 Subject: [PATCH 02/22] [Dataset quality] Failure store support in synthtrace (#195726) This PR enables the creation of scenarios using failure store in synthtrace. #### How to test? 1. Run the scenario `node scripts/synthtrace failed_logs` 2. Go to dev console - For getting documents ingested `GET logs-*-*/_search`. This is equivalent to `GET logs-*-*/_search?failure_store=exclude` and will only include the documents that were properly ingested. - For getting documents in failure store `GET logs-*-*/_search?failure_store=only` https://github.com/user-attachments/assets/5013a0af-fdfc-453a-b70c-fb2c452ad4d8 --- .../lib/logs/custom_logsdb_index_templates.ts | 1 + .../src/lib/logs/logs_synthtrace_es_client.ts | 49 ++++- .../src/scenarios/degraded_logs.ts | 4 +- .../scenarios/degraded_synthetics_monitors.ts | 5 +- .../src/scenarios/failed_logs.ts | 195 ++++++++++++++++++ .../src/scenarios/helpers/logs_mock_data.ts | 3 + .../src/scenarios/logs_traces_hosts.ts | 18 +- .../src/scenarios/simple_logs.ts | 16 +- 8 files changed, 263 insertions(+), 28 deletions(-) create mode 100644 packages/kbn-apm-synthtrace/src/scenarios/failed_logs.ts diff --git a/packages/kbn-apm-synthtrace/src/lib/logs/custom_logsdb_index_templates.ts b/packages/kbn-apm-synthtrace/src/lib/logs/custom_logsdb_index_templates.ts index a0b155444919e..3eadd3f3941de 100644 --- a/packages/kbn-apm-synthtrace/src/lib/logs/custom_logsdb_index_templates.ts +++ b/packages/kbn-apm-synthtrace/src/lib/logs/custom_logsdb_index_templates.ts @@ -25,6 +25,7 @@ export const indexTemplates: { template: { settings: { mode: 'logsdb', + default_pipeline: 'logs@default-pipeline', }, }, priority: 500, diff --git a/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts b/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts index a6a64429f9b86..9673d1678132b 100644 --- a/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts +++ b/packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts @@ -7,16 +7,20 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { Client } from '@elastic/elasticsearch'; +import { Client, estypes } from '@elastic/elasticsearch'; import { pipeline, Readable } from 'stream'; import { LogDocument } from '@kbn/apm-synthtrace-client/src/lib/logs'; -import { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/types'; +import { IngestProcessorContainer, MappingTypeMapping } from '@elastic/elasticsearch/lib/api/types'; +import { ValuesType } from 'utility-types'; import { SynthtraceEsClient, SynthtraceEsClientOptions } from '../shared/base_client'; import { getSerializeTransform } from '../shared/get_serialize_transform'; import { Logger } from '../utils/create_logger'; import { indexTemplates, IndexTemplateName } from './custom_logsdb_index_templates'; import { getRoutingTransform } from '../shared/data_stream_get_routing_transform'; +export const LogsIndex = 'logs'; +export const LogsCustom = 'logs@custom'; + export type LogsSynthtraceEsClientOptions = Omit; export class LogsSynthtraceEsClient extends SynthtraceEsClient { @@ -60,6 +64,47 @@ export class LogsSynthtraceEsClient extends SynthtraceEsClient { this.logger.error(`Index creation failed: ${index} - ${err.message}`); } } + + async updateIndexTemplate( + indexName: string, + modify: ( + template: ValuesType< + estypes.IndicesGetIndexTemplateResponse['index_templates'] + >['index_template'] + ) => estypes.IndicesPutIndexTemplateRequest + ) { + try { + const response = await this.client.indices.getIndexTemplate({ + name: indexName, + }); + + await Promise.all( + response.index_templates.map((template) => { + return this.client.indices.putIndexTemplate({ + ...modify(template.index_template), + name: template.name, + }); + }) + ); + + this.logger.info(`Updated ${indexName} index template`); + } catch (err) { + this.logger.error(`Update index template failed: ${indexName} - ${err.message}`); + } + } + + async createCustomPipeline(processors: IngestProcessorContainer[]) { + try { + this.client.ingest.putPipeline({ + id: LogsCustom, + processors, + version: 1, + }); + this.logger.info(`Custom pipeline created: ${LogsCustom}`); + } catch (err) { + this.logger.error(`Custom pipeline creation failed: ${LogsCustom} - ${err.message}`); + } + } } function logsPipeline() { diff --git a/packages/kbn-apm-synthtrace/src/scenarios/degraded_logs.ts b/packages/kbn-apm-synthtrace/src/scenarios/degraded_logs.ts index 47dd4ffd2652f..b3e41bbdd4e28 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/degraded_logs.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/degraded_logs.ts @@ -16,12 +16,10 @@ import { getCluster, getCloudRegion, getCloudProvider, + MORE_THAN_1024_CHARS, } from './helpers/logs_mock_data'; import { parseLogsScenarioOpts } from './helpers/logs_scenario_opts_parser'; -const MORE_THAN_1024_CHARS = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; - // Logs Data logic const MESSAGE_LOG_LEVELS = [ { message: 'A simple log', level: 'info' }, diff --git a/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts b/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts index c61fecd8b7109..6e00bfd0abf15 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/degraded_synthetics_monitors.ts @@ -14,12 +14,9 @@ import { } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { withClient } from '../lib/utils/with_client'; -import { getIpAddress } from './helpers/logs_mock_data'; +import { MORE_THAN_1024_CHARS, getIpAddress } from './helpers/logs_mock_data'; import { getAtIndexOrRandom } from './helpers/get_at_index_or_random'; -const MORE_THAN_1024_CHARS = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; - const MONITOR_NAMES = Array(4) .fill(null) .map((_, idx) => `synth-monitor-${idx}`); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/failed_logs.ts b/packages/kbn-apm-synthtrace/src/scenarios/failed_logs.ts new file mode 100644 index 0000000000000..91ddedac270b5 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/failed_logs.ts @@ -0,0 +1,195 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { LogDocument, log, generateShortId, generateLongId } from '@kbn/apm-synthtrace-client'; +import { merge } from 'lodash'; +import { Scenario } from '../cli/scenario'; +import { IndexTemplateName } from '../lib/logs/custom_logsdb_index_templates'; +import { withClient } from '../lib/utils/with_client'; +import { + getServiceName, + getCluster, + getCloudRegion, + getCloudProvider, + MORE_THAN_1024_CHARS, +} from './helpers/logs_mock_data'; +import { parseLogsScenarioOpts } from './helpers/logs_scenario_opts_parser'; +import { LogsIndex } from '../lib/logs/logs_synthtrace_es_client'; + +const processors = [ + { + script: { + tag: 'normalize log level', + lang: 'painless', + source: ` + String level = ctx['log.level']; + if ('0'.equals(level)) { + ctx['log.level'] = 'info'; + } else if ('1'.equals(level)) { + ctx['log.level'] = 'debug'; + } else if ('2'.equals(level)) { + ctx['log.level'] = 'warning'; + } else if ('3'.equals(level)) { + ctx['log.level'] = 'error'; + } else { + throw new Exception("Not a valid log level"); + } + `, + }, + }, +]; + +// Logs Data logic +const MESSAGE_LOG_LEVELS = [ + { message: 'A simple log', level: '0' }, + { + message: 'Another log message', + level: '1', + }, + { + message: 'A log message generated from a warning', + level: '2', + }, + { message: 'Error with certificate: "ca_trusted_fingerprint"', level: '3' }, +]; + +const scenario: Scenario = async (runOptions) => { + const { isLogsDb } = parseLogsScenarioOpts(runOptions.scenarioOpts); + return { + bootstrap: async ({ logsEsClient }) => { + await logsEsClient.createCustomPipeline(processors); + if (isLogsDb) await logsEsClient.createIndexTemplate(IndexTemplateName.LogsDb); + + await logsEsClient.updateIndexTemplate( + isLogsDb ? IndexTemplateName.LogsDb : LogsIndex, + (template) => { + const next = { + name: LogsIndex, + data_stream: { + failure_store: true, + }, + }; + + return merge({}, template, next); + } + ); + }, + generate: ({ range, clients: { logsEsClient } }) => { + const { logger } = runOptions; + + const constructLogsCommonData = () => { + const index = Math.floor(Math.random() * 3); + const serviceName = getServiceName(index); + const logMessage = MESSAGE_LOG_LEVELS[index]; + const { clusterId, clusterName } = getCluster(index); + const cloudRegion = getCloudRegion(index); + + const commonLongEntryFields: LogDocument = { + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'orchestrator.cluster.name': clusterName, + 'orchestrator.cluster.id': clusterId, + 'orchestrator.resource.id': generateShortId(), + 'cloud.provider': getCloudProvider(), + 'cloud.region': cloudRegion, + 'cloud.availability_zone': `${cloudRegion}a`, + 'cloud.project.id': generateShortId(), + 'cloud.instance.id': generateShortId(), + 'log.file.path': `/logs/${generateLongId()}/error.txt`, + }; + + return { + index, + serviceName, + logMessage, + cloudRegion, + commonLongEntryFields, + }; + }; + + const datasetSynth1Logs = (timestamp: number) => { + const { + serviceName, + logMessage: { level, message }, + commonLongEntryFields, + } = constructLogsCommonData(); + + return log + .create({ isLogsDb }) + .dataset('synth.1') + .message(message) + .logLevel(level) + .service(serviceName) + .defaults(commonLongEntryFields) + .timestamp(timestamp); + }; + + const datasetSynth2Logs = (i: number, timestamp: number) => { + const { + serviceName, + logMessage: { level, message }, + commonLongEntryFields, + } = constructLogsCommonData(); + const isFailed = i % 60 === 0; + return log + .create({ isLogsDb }) + .dataset('synth.2') + .message(message) + .logLevel(isFailed ? '4' : level) // "script_exception": Not a valid log level + .service(serviceName) + .defaults(commonLongEntryFields) + .timestamp(timestamp); + }; + + const datasetSynth3Logs = (i: number, timestamp: number) => { + const { + serviceName, + logMessage: { level, message }, + cloudRegion, + commonLongEntryFields, + } = constructLogsCommonData(); + const isMalformed = i % 10 === 0; + const isFailed = i % 80 === 0; + return log + .create({ isLogsDb }) + .dataset('synth.3') + .message(message) + .logLevel(isFailed ? '5' : level) // "script_exception": Not a valid log level + .service(serviceName) + .defaults({ + ...commonLongEntryFields, + 'cloud.availability_zone': isMalformed + ? MORE_THAN_1024_CHARS // "ignore_above": 1024 in mapping + : `${cloudRegion}a`, + }) + .timestamp(timestamp); + }; + + const logs = range + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(200) + .fill(0) + .flatMap((_, index) => [ + datasetSynth1Logs(timestamp), + datasetSynth2Logs(index, timestamp), + datasetSynth3Logs(index, timestamp), + ]); + }); + + return withClient( + logsEsClient, + logger.perf('generating_logs', () => logs) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts b/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts index e974528f16a80..5f3cbd5f054dd 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/helpers/logs_mock_data.ts @@ -59,6 +59,9 @@ const SERVICE_NAMES = Array(3) .fill(null) .map((_, idx) => `synth-service-${idx}`); +export const MORE_THAN_1024_CHARS = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; + // Functions to get random elements export const getCluster = (index?: number) => getAtIndexOrRandom(CLUSTER, index); export const getIpAddress = (index?: number) => getAtIndexOrRandom(IP_ADDRESSES, index); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/logs_traces_hosts.ts b/packages/kbn-apm-synthtrace/src/scenarios/logs_traces_hosts.ts index 8a6bdf409a573..6dac3fc9f3226 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/logs_traces_hosts.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/logs_traces_hosts.ts @@ -8,21 +8,22 @@ */ import { - log, - LogDocument, + ApmFields, InfraDocument, - apm, Instance, - infra, - ApmFields, + LogDocument, + apm, generateShortId, + infra, + log, } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; +import { IndexTemplateName } from '../lib/logs/custom_logsdb_index_templates'; import { Logger } from '../lib/utils/create_logger'; -import { withClient } from '../lib/utils/with_client'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; +import { MORE_THAN_1024_CHARS } from './helpers/logs_mock_data'; import { parseLogsScenarioOpts, parseStringToBoolean } from './helpers/logs_scenario_opts_parser'; -import { IndexTemplateName } from '../lib/logs/custom_logsdb_index_templates'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); @@ -475,6 +476,3 @@ const DATASETS = [ ]; const LOG_LEVELS = ['info', 'error', 'warn', 'debug']; - -const MORE_THAN_1024_CHARS = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts index 3c1fdc5131395..08d914c1017dd 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts @@ -7,19 +7,20 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { LogDocument, log, generateShortId, generateLongId } from '@kbn/apm-synthtrace-client'; +import { LogDocument, generateLongId, generateShortId, log } from '@kbn/apm-synthtrace-client'; import moment from 'moment'; import { Scenario } from '../cli/scenario'; import { IndexTemplateName } from '../lib/logs/custom_logsdb_index_templates'; import { withClient } from '../lib/utils/with_client'; import { - getServiceName, - getGeoCoordinate, - getIpAddress, - getCluster, + MORE_THAN_1024_CHARS, + getAgentName, getCloudProvider, getCloudRegion, - getAgentName, + getCluster, + getGeoCoordinate, + getIpAddress, + getServiceName, } from './helpers/logs_mock_data'; import { parseLogsScenarioOpts } from './helpers/logs_scenario_opts_parser'; @@ -30,9 +31,6 @@ const MESSAGE_LOG_LEVELS = [ { message: 'Error with certificate: "ca_trusted_fingerprint"', level: 'error' }, ]; -const MORE_THAN_1024_CHARS = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; - const scenario: Scenario = async (runOptions) => { const { isLogsDb } = parseLogsScenarioOpts(runOptions.scenarioOpts); From 6f1449b1f589b05a0919753dbb1afa51dac02185 Mon Sep 17 00:00:00 2001 From: Khristinin Nikita Date: Thu, 10 Oct 2024 16:28:48 +0200 Subject: [PATCH 03/22] Skip Backfill groups in the periodic pipeline (#195760) ## Summary This test shouldn't run in periodic pipeline. We expect only FTR and Cypress running in periodic and 2nd quality gate pipelines enabled in https://github.com/elastic/kibana/pull/193666. --- .../rule_management/rule_details/backfill_group.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts index f747e6be43e5a..6466c20dfde21 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts @@ -34,7 +34,7 @@ import { describe( 'Backfill groups', { - tags: ['@ess', '@serverless'], + tags: ['@ess', '@serverless', '@skipInServerlessMKI'], }, function () { before(() => { From e53e54550f9ab9ce2db83ec56a5c704a96f37355 Mon Sep 17 00:00:00 2001 From: Paulo Silva Date: Thu, 10 Oct 2024 07:52:49 -0700 Subject: [PATCH 04/22] [Cloud Security] [CDR] Handle grouping fields with missing mapping (#195702) ## Summary This PR fixes https://github.com/elastic/security-team/issues/10632 by adding runtime mapping support for fields that are missing in mapping, this is useful when querying a DataView that points to multiple indices where the mapping is not guaranteed to exist as it's the case with CDR that adds supports to Third Party data. Also added runtime mapping to sorted fields, as it's not guaranteed that all fields shown on the table have mapped fields. --- .../latest_findings/use_latest_findings.ts | 16 +++++ .../use_latest_findings_grouping.tsx | 72 +++++++++++++++++++ .../hooks/use_latest_vulnerabilities.tsx | 21 ++++++ .../use_latest_vulnerabilities_grouping.tsx | 46 ++++++++++++ .../utils/custom_sort_script.ts | 8 ++- 5 files changed, 162 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts index f6f27e15ee7a4..955f5a45a9743 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts @@ -21,6 +21,7 @@ import type { CspFinding } from '@kbn/cloud-security-posture-common'; import type { CspBenchmarkRulesStates } from '@kbn/cloud-security-posture-common/schema/rules/latest'; import type { FindingsBaseEsQuery } from '@kbn/cloud-security-posture'; import { useGetCspBenchmarkRulesStatesApi } from '@kbn/cloud-security-posture/src/hooks/use_get_benchmark_rules_state_api'; +import type { RuntimePrimitiveTypes } from '@kbn/data-views-plugin/common'; import { useKibana } from '../../../common/hooks/use_kibana'; import { getAggregationCount, getFindingsCountAggQuery } from '../utils/utils'; @@ -39,6 +40,20 @@ interface FindingsAggs { count: estypes.AggregationsMultiBucketAggregateBase; } +const getRuntimeMappingsFromSort = (sort: string[][]) => { + return sort.reduce((acc, [field]) => { + // TODO: Add proper type for all fields available in the field selector + const type: RuntimePrimitiveTypes = field === '@timestamp' ? 'date' : 'keyword'; + + return { + ...acc, + [field]: { + type, + }, + }; + }, {}); +}; + export const getFindingsQuery = ( { query, sort }: UseFindingsOptions, rulesStates: CspBenchmarkRulesStates, @@ -49,6 +64,7 @@ export const getFindingsQuery = ( return { index: CDR_MISCONFIGURATIONS_INDEX_PATTERN, sort: getMultiFieldsSort(sort), + runtime_mappings: getRuntimeMappingsFromSort(sort), size: MAX_FINDINGS_TO_LOAD, aggs: getFindingsCountAggQuery(), ignore_unavailable: true, diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx index cc409fb95024d..6482d864347a1 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_grouping.tsx @@ -114,6 +114,72 @@ const getAggregationsByGroupField = (field: string): NamedAggregation[] => { return aggMetrics; }; +/** + * Get runtime mappings for the given group field + * Some fields require additional runtime mappings to aggregate additional information + * Fallback to keyword type to support custom fields grouping + */ +const getRuntimeMappingsByGroupField = ( + field: string +): Record | undefined => { + switch (field) { + case FINDINGS_GROUPING_OPTIONS.RESOURCE_NAME: + return { + [FINDINGS_GROUPING_OPTIONS.RESOURCE_NAME]: { + type: 'keyword', + }, + 'resource.id': { + type: 'keyword', + }, + 'resource.sub_type': { + type: 'keyword', + }, + 'resource.type': { + type: 'keyword', + }, + }; + case FINDINGS_GROUPING_OPTIONS.RULE_NAME: + return { + [FINDINGS_GROUPING_OPTIONS.RULE_NAME]: { + type: 'keyword', + }, + 'rule.benchmark.version': { + type: 'keyword', + }, + }; + case FINDINGS_GROUPING_OPTIONS.CLOUD_ACCOUNT_NAME: + return { + [FINDINGS_GROUPING_OPTIONS.CLOUD_ACCOUNT_NAME]: { + type: 'keyword', + }, + 'rule.benchmark.name': { + type: 'keyword', + }, + 'rule.benchmark.id': { + type: 'keyword', + }, + }; + case FINDINGS_GROUPING_OPTIONS.ORCHESTRATOR_CLUSTER_NAME: + return { + [FINDINGS_GROUPING_OPTIONS.ORCHESTRATOR_CLUSTER_NAME]: { + type: 'keyword', + }, + 'rule.benchmark.name': { + type: 'keyword', + }, + 'rule.benchmark.id': { + type: 'keyword', + }, + }; + default: + return { + [field]: { + type: 'keyword', + }, + }; + } +}; + /** * Type Guard for checking if the given source is a FindingsRootGroupingAggregation */ @@ -189,6 +255,12 @@ export const useLatestFindingsGrouping = ({ size: pageSize, sort: [{ groupByField: { order: 'desc' } }, { complianceScore: { order: 'asc' } }], statsAggregations: getAggregationsByGroupField(currentSelectedGroup), + runtimeMappings: { + ...getRuntimeMappingsByGroupField(currentSelectedGroup), + 'result.evaluation': { + type: 'keyword', + }, + }, rootAggregations: [ { failedFindings: { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx index 0d0ea9ba5a22f..0b9cf6978c258 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx @@ -23,6 +23,7 @@ import { } from '@kbn/cloud-security-posture-common'; import { FindingsBaseEsQuery, showErrorToast } from '@kbn/cloud-security-posture'; import type { CspVulnerabilityFinding } from '@kbn/cloud-security-posture-common/schema/vulnerabilities/latest'; +import type { RuntimePrimitiveTypes } from '@kbn/data-views-plugin/common'; import { VULNERABILITY_FIELDS } from '../../../common/constants'; import { useKibana } from '../../../common/hooks/use_kibana'; import { getCaseInsensitiveSortScript } from '../utils/custom_sort_script'; @@ -52,6 +53,25 @@ const getMultiFieldsSort = (sort: string[][]) => { }); }; +const getRuntimeMappingsFromSort = (sort: string[][]) => { + return sort.reduce((acc, [field]) => { + // TODO: Add proper type for all fields available in the field selector + const type: RuntimePrimitiveTypes = + field === VULNERABILITY_FIELDS.SCORE_BASE + ? 'double' + : field === '@timestamp' + ? 'date' + : 'keyword'; + + return { + ...acc, + [field]: { + type, + }, + }; + }, {}); +}; + export const getVulnerabilitiesQuery = ( { query, sort }: VulnerabilitiesQuery, pageParam: number @@ -59,6 +79,7 @@ export const getVulnerabilitiesQuery = ( index: CDR_VULNERABILITIES_INDEX_PATTERN, ignore_unavailable: true, sort: getMultiFieldsSort(sort), + runtime_mappings: getRuntimeMappingsFromSort(sort), size: MAX_FINDINGS_TO_LOAD, query: { ...query, diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx index 516cbed0c3975..3c52590f8fd80 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities_grouping.tsx @@ -94,6 +94,51 @@ const getAggregationsByGroupField = (field: string): NamedAggregation[] => { return aggMetrics; }; +/** + * Get runtime mappings for the given group field + * Some fields require additional runtime mappings to aggregate additional information + * Fallback to keyword type to support custom fields grouping + */ +const getRuntimeMappingsByGroupField = ( + field: string +): Record | undefined => { + switch (field) { + case VULNERABILITY_GROUPING_OPTIONS.CLOUD_ACCOUNT_NAME: + return { + [VULNERABILITY_GROUPING_OPTIONS.CLOUD_ACCOUNT_NAME]: { + type: 'keyword', + }, + [VULNERABILITY_FIELDS.CLOUD_PROVIDER]: { + type: 'keyword', + }, + }; + case VULNERABILITY_GROUPING_OPTIONS.RESOURCE_NAME: + return { + [VULNERABILITY_GROUPING_OPTIONS.RESOURCE_NAME]: { + type: 'keyword', + }, + [VULNERABILITY_FIELDS.RESOURCE_ID]: { + type: 'keyword', + }, + }; + case VULNERABILITY_GROUPING_OPTIONS.CVE: + return { + [VULNERABILITY_GROUPING_OPTIONS.CVE]: { + type: 'keyword', + }, + [VULNERABILITY_FIELDS.DESCRIPTION]: { + type: 'keyword', + }, + }; + default: + return { + [field]: { + type: 'keyword', + }, + }; + } +}; + /** * Type Guard for checking if the given source is a VulnerabilitiesRootGroupingAggregation */ @@ -163,6 +208,7 @@ export const useLatestVulnerabilitiesGrouping = ({ size: pageSize, sort: [{ groupByField: { order: 'desc' } }], statsAggregations: getAggregationsByGroupField(currentSelectedGroup), + runtimeMappings: getRuntimeMappingsByGroupField(currentSelectedGroup), }); const { data, isFetching } = useGroupedVulnerabilities({ diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts index 780cd539305b3..e517d622e71c5 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/utils/custom_sort_script.ts @@ -14,7 +14,13 @@ export const getCaseInsensitiveSortScript = (field: string, direction: string) = type: 'string', order: direction, script: { - source: `doc["${field}"].value.toLowerCase()`, + source: ` + if (doc.containsKey('${field}') && !doc['${field}'].empty) { + return doc['${field}'].value.toLowerCase(); + } else { + return ""; + } + `, lang: 'painless', }, }, From 745fb6225f499d2a30c51683556a79afc04dc6da Mon Sep 17 00:00:00 2001 From: Brad White Date: Thu, 10 Oct 2024 08:57:35 -0600 Subject: [PATCH 05/22] skip failing test suite (#195602) --- .../apis/ml/anomaly_detectors/forecast_with_spaces.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts index a330edd9a41d7..32e82c67e348d 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts @@ -58,7 +58,8 @@ export default ({ getService }: FtrProviderContext) => { return body; } - describe('POST anomaly_detectors _forecast with spaces', function () { + // Failing see: https://github.com/elastic/kibana/issues/195602 + describe.skip('POST anomaly_detectors _forecast with spaces', function () { let forecastId: string; before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); From bc75d03f5ca01889a4a7813f8abbeeee239921c3 Mon Sep 17 00:00:00 2001 From: Karen Grigoryan Date: Thu, 10 Oct 2024 17:29:49 +0200 Subject: [PATCH 06/22] ci(deploy): dead deploy fix script (#195753) This fixes edge case with dead deploys failing current server deploy jobs in https://github.com/elastic/kibana/pull/191898 --- .buildkite/scripts/steps/cloud/build_and_deploy.sh | 2 +- .buildkite/scripts/steps/serverless/deploy.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/scripts/steps/cloud/build_and_deploy.sh b/.buildkite/scripts/steps/cloud/build_and_deploy.sh index 25e7d8fc631c9..220ab497aaf7b 100755 --- a/.buildkite/scripts/steps/cloud/build_and_deploy.sh +++ b/.buildkite/scripts/steps/cloud/build_and_deploy.sh @@ -51,7 +51,7 @@ fi if is_pr_with_label "ci:cloud-redeploy"; then echo "--- Shutdown Previous Deployment" CLOUD_DEPLOYMENT_ID=$(ecctl deployment list --output json | jq -r '.deployments[] | select(.name == "'$CLOUD_DEPLOYMENT_NAME'") | .id') - if [ -z "${CLOUD_DEPLOYMENT_ID}" ]; then + if [ -z "${CLOUD_DEPLOYMENT_ID}" ] || [ "${CLOUD_DEPLOYMENT_ID}" == "null" ]; then echo "No deployment to remove" else echo "Shutting down previous deployment..." diff --git a/.buildkite/scripts/steps/serverless/deploy.sh b/.buildkite/scripts/steps/serverless/deploy.sh index d30723393dacd..cbbc6c6c664dd 100644 --- a/.buildkite/scripts/steps/serverless/deploy.sh +++ b/.buildkite/scripts/steps/serverless/deploy.sh @@ -56,7 +56,7 @@ deploy() { PROJECT_ID=$(jq -r '[.items[] | select(.name == "'$PROJECT_NAME'")] | .[0].id' $PROJECT_EXISTS_LOGS) if is_pr_with_label "ci:project-redeploy"; then - if [ -z "${PROJECT_ID}" ]; then + if [ -z "${PROJECT_ID}" ] || [ "${PROJECT_ID}" == "null" ]; then echo "No project to remove" else echo "Shutting down previous project..." From ed75ef67ca34795e88cc81e739daa3a6ec655d6a Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Thu, 10 Oct 2024 17:33:23 +0200 Subject: [PATCH 07/22] [data.search] Disable bfetch by default (#192789) ## Summary Part of https://github.com/elastic/kibana/issues/186139. Disables `bfetch` by default. ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Peter Pisljar --- src/plugins/bfetch/server/ui_settings.ts | 2 +- .../tests/browser.ts | 165 +++++++----------- 2 files changed, 62 insertions(+), 105 deletions(-) diff --git a/src/plugins/bfetch/server/ui_settings.ts b/src/plugins/bfetch/server/ui_settings.ts index aee4903d226c0..132dd19ef8b9c 100644 --- a/src/plugins/bfetch/server/ui_settings.ts +++ b/src/plugins/bfetch/server/ui_settings.ts @@ -18,7 +18,7 @@ export function getUiSettings(): Record> { name: i18n.translate('bfetch.disableBfetch', { defaultMessage: 'Disable request batching', }), - value: false, + value: true, description: i18n.translate('bfetch.disableBfetchDesc', { defaultMessage: 'Disables requests batching. This increases number of HTTP requests from Kibana, but allows to debug requests individually.', diff --git a/x-pack/test/functional_execution_context/tests/browser.ts b/x-pack/test/functional_execution_context/tests/browser.ts index e1d7ba6a3b965..c7228528ee756 100644 --- a/x-pack/test/functional_execution_context/tests/browser.ts +++ b/x-pack/test/functional_execution_context/tests/browser.ts @@ -85,14 +85,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { type: 'application', name: 'discover', url: '/app/discover', - child: { - name: 'discover', - url: '/app/discover', - type: 'application', - page: 'app', - id: 'new', - description: 'fetch documents', - }, + page: 'app', + id: 'new', + description: 'fetch documents', }), }); }); @@ -105,20 +100,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { type: 'application', name: 'discover', url: '/app/discover', + page: 'app', + id: 'new', + description: 'fetch chart data and total hits', child: { - name: 'discover', - url: '/app/discover', - type: 'application', - page: 'app', - id: 'new', - description: 'fetch chart data and total hits', - child: { - type: 'lens', - name: 'lnsXY', - id: 'unifiedHistogramLensComponent', - description: 'Edit visualization', - url: '/app/lens#/edit_by_value', - }, + type: 'lens', + name: 'lnsXY', + id: 'unifiedHistogramLensComponent', + description: 'Edit visualization', + url: '/app/lens#/edit_by_value', }, }), }); @@ -185,9 +175,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('propagates to Elasticsearch via "x-opaque-id" header', async () => { await logContains({ description: 'execution context propagates to Elasticsearch via "x-opaque-id" header', - predicate: checkHttpRequestId( - 'dashboard:dashboards:7adfa750-4c81-11e8-b3d7-01146121b73d;lens:lnsXY:086ac2e9-dd16-4b45-92b8-1e43ff7e3f65' - ), + predicate: checkHttpRequestId('lens:lnsXY:086ac2e9-dd16-4b45-92b8-1e43ff7e3f65'), }); }); @@ -195,23 +183,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await logContains({ description: 'execution context propagates to Kibana logs', predicate: checkExecutionContextEntry({ - type: 'application', + type: 'dashboard', name: 'dashboards', url: '/app/dashboards', + page: 'app', + id: '7adfa750-4c81-11e8-b3d7-01146121b73d', + description: '[Flights] Global Flight Dashboard', child: { - name: 'dashboards', - url: '/app/dashboards', - type: 'dashboard', - page: 'app', - id: '7adfa750-4c81-11e8-b3d7-01146121b73d', - description: '[Flights] Global Flight Dashboard', - child: { - type: 'lens', - name: 'lnsXY', - id: '086ac2e9-dd16-4b45-92b8-1e43ff7e3f65', - description: '[Flights] Flight count', - url: '/app/lens#/edit_by_value', - }, + type: 'lens', + name: 'lnsXY', + id: '086ac2e9-dd16-4b45-92b8-1e43ff7e3f65', + description: '[Flights] Flight count', + url: '/app/lens#/edit_by_value', }, }), }); @@ -222,9 +205,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('propagates to Elasticsearch via "x-opaque-id" header', async () => { await logContains({ description: 'execution context propagates to Elasticsearch via "x-opaque-id" header', - predicate: checkHttpRequestId( - 'dashboard:dashboards:7adfa750-4c81-11e8-b3d7-01146121b73d;lens:lnsMetric:b766e3b8-4544-46ed-99e6-9ecc4847e2a2' - ), + predicate: checkHttpRequestId('lens:lnsMetric:b766e3b8-4544-46ed-99e6-9ecc4847e2a2'), }); }); @@ -232,23 +213,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await logContains({ description: 'execution context propagates to Kibana logs', predicate: checkExecutionContextEntry({ + type: 'dashboard', name: 'dashboards', url: '/app/dashboards', - type: 'application', + page: 'app', + id: '7adfa750-4c81-11e8-b3d7-01146121b73d', + description: '[Flights] Global Flight Dashboard', child: { - name: 'dashboards', - url: '/app/dashboards', - type: 'dashboard', - page: 'app', - id: '7adfa750-4c81-11e8-b3d7-01146121b73d', - description: '[Flights] Global Flight Dashboard', - child: { - type: 'lens', - name: 'lnsMetric', - id: 'b766e3b8-4544-46ed-99e6-9ecc4847e2a2', - description: '', - url: '/app/lens#/edit_by_value', - }, + type: 'lens', + name: 'lnsMetric', + id: 'b766e3b8-4544-46ed-99e6-9ecc4847e2a2', + description: '', + url: '/app/lens#/edit_by_value', }, }), }); @@ -260,7 +236,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await logContains({ description: 'execution context propagates to Elasticsearch via "x-opaque-id" header', predicate: checkHttpRequestId( - 'dashboard:dashboards:7adfa750-4c81-11e8-b3d7-01146121b73d;lens:lnsDatatable:fb86b32f-fb7a-45cf-9511-f366fef51bbd' + 'lens:lnsDatatable:fb86b32f-fb7a-45cf-9511-f366fef51bbd' ), }); }); @@ -269,23 +245,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await logContains({ description: 'execution context propagates to Kibana logs', predicate: checkExecutionContextEntry({ + type: 'dashboard', name: 'dashboards', url: '/app/dashboards', - type: 'application', + page: 'app', + id: '7adfa750-4c81-11e8-b3d7-01146121b73d', + description: '[Flights] Global Flight Dashboard', child: { - name: 'dashboards', - url: '/app/dashboards', - type: 'dashboard', - page: 'app', - id: '7adfa750-4c81-11e8-b3d7-01146121b73d', - description: '[Flights] Global Flight Dashboard', - child: { - type: 'lens', - name: 'lnsDatatable', - id: 'fb86b32f-fb7a-45cf-9511-f366fef51bbd', - description: 'Cities by delay, cancellation', - url: '/app/lens#/edit_by_value', - }, + type: 'lens', + name: 'lnsDatatable', + id: 'fb86b32f-fb7a-45cf-9511-f366fef51bbd', + description: 'Cities by delay, cancellation', + url: '/app/lens#/edit_by_value', }, }), }); @@ -296,9 +267,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('propagates to Elasticsearch via "x-opaque-id" header', async () => { await logContains({ description: 'execution context propagates to Elasticsearch via "x-opaque-id" header', - predicate: checkHttpRequestId( - 'dashboard:dashboards:7adfa750-4c81-11e8-b3d7-01146121b73d;lens:lnsPie:5d53db36-2d5a-4adc-af7b-cec4c1a294e0' - ), + predicate: checkHttpRequestId('lens:lnsPie:5d53db36-2d5a-4adc-af7b-cec4c1a294e0'), }); }); @@ -306,23 +275,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await logContains({ description: 'execution context propagates to Kibana logs', predicate: checkExecutionContextEntry({ + type: 'dashboard', name: 'dashboards', url: '/app/dashboards', - type: 'application', + page: 'app', + id: '7adfa750-4c81-11e8-b3d7-01146121b73d', + description: '[Flights] Global Flight Dashboard', child: { - name: 'dashboards', - url: '/app/dashboards', - type: 'dashboard', - page: 'app', - id: '7adfa750-4c81-11e8-b3d7-01146121b73d', - description: '[Flights] Global Flight Dashboard', - child: { - type: 'lens', - name: 'lnsPie', - id: '5d53db36-2d5a-4adc-af7b-cec4c1a294e0', - description: '[Flights] Delay Type', - url: '/app/lens#/edit_by_value', - }, + type: 'lens', + name: 'lnsPie', + id: '5d53db36-2d5a-4adc-af7b-cec4c1a294e0', + description: '[Flights] Delay Type', + url: '/app/lens#/edit_by_value', }, }), }); @@ -334,9 +298,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('propagates to Elasticsearch via "x-opaque-id" header', async () => { await logContains({ description: 'execution context propagates to Elasticsearch via "x-opaque-id" header', - predicate: checkHttpRequestId( - 'dashboard:dashboards:7adfa750-4c81-11e8-b3d7-01146121b73d;search:discover:571aaf70-4c88-11e8-b3d7-01146121b73d' - ), + predicate: checkHttpRequestId('search:discover:571aaf70-4c88-11e8-b3d7-01146121b73d'), }); }); @@ -344,23 +306,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await logContains({ description: 'execution context propagates to Kibana logs', predicate: checkExecutionContextEntry({ - type: 'application', + type: 'dashboard', name: 'dashboards', url: '/app/dashboards', + page: 'app', + id: '7adfa750-4c81-11e8-b3d7-01146121b73d', + description: '[Flights] Global Flight Dashboard', child: { - type: 'dashboard', - name: 'dashboards', - url: '/app/dashboards', - page: 'app', - id: '7adfa750-4c81-11e8-b3d7-01146121b73d', - description: '[Flights] Global Flight Dashboard', - child: { - type: 'search', - name: 'discover', - id: '571aaf70-4c88-11e8-b3d7-01146121b73d', - description: '[Flights] Flight Log', - url: '/app/discover#/view/571aaf70-4c88-11e8-b3d7-01146121b73d', - }, + type: 'search', + name: 'discover', + id: '571aaf70-4c88-11e8-b3d7-01146121b73d', + description: '[Flights] Flight Log', + url: '/app/discover#/view/571aaf70-4c88-11e8-b3d7-01146121b73d', }, }), }); From dffe0b571899b2ed0c71ee9f090095311d4d2b55 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Thu, 10 Oct 2024 09:33:55 -0600 Subject: [PATCH 08/22] [ES|QL] only suggest pipe at the end of the field list (#195679) ## Summary Close https://github.com/elastic/kibana/issues/191100 ### Improvements 1. You no longer get a comma suggestion when you're out of fields... https://github.com/user-attachments/assets/3ed3617b-99e2-44a5-917e-294b98f16ef4 2. Fixed https://github.com/elastic/kibana/issues/191100 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Elastic Machine --- .../src/autocomplete/autocomplete.test.ts | 83 +++++++++++++++---- .../src/autocomplete/autocomplete.ts | 38 +++++---- 2 files changed, 88 insertions(+), 33 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 84779f1dd36b5..a0a4a359c5ff6 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -387,6 +387,23 @@ describe('autocomplete', () => { '```````````````````````````````round(doubleField) + 1```````````````` + 1```````` + 1```` + 1`` + 1`', ] ); + + it('should not suggest already-used fields and variables', async () => { + const { suggest: suggestTest } = await setup(); + const getSuggestions = async (query: string) => + (await suggestTest(query)).map((value) => value.text); + + expect(await getSuggestions('from a_index | EVAL foo = 1 | KEEP /')).toContain('foo'); + expect(await getSuggestions('from a_index | EVAL foo = 1 | KEEP foo, /')).not.toContain( + 'foo' + ); + expect(await getSuggestions('from a_index | EVAL foo = 1 | KEEP /')).toContain( + 'doubleField' + ); + expect( + await getSuggestions('from a_index | EVAL foo = 1 | KEEP doubleField, /') + ).not.toContain('doubleField'); + }); }); } @@ -1111,11 +1128,14 @@ describe('autocomplete', () => { ]); }); - describe('KEEP ', () => { + describe.each(['KEEP', 'DROP'])('%s ', (commandName) => { // KEEP field - testSuggestions('FROM a | KEEP /', getFieldNamesByType('any').map(attachTriggerCommand)); testSuggestions( - 'FROM a | KEEP d/', + `FROM a | ${commandName} /`, + getFieldNamesByType('any').map(attachTriggerCommand) + ); + testSuggestions( + `FROM a | ${commandName} d/`, getFieldNamesByType('any') .map((text) => ({ text, @@ -1124,11 +1144,11 @@ describe('autocomplete', () => { .map(attachTriggerCommand) ); testSuggestions( - 'FROM a | KEEP doubleFiel/', + `FROM a | ${commandName} doubleFiel/`, getFieldNamesByType('any').map(attachTriggerCommand) ); testSuggestions( - 'FROM a | KEEP doubleField/', + `FROM a | ${commandName} doubleField/`, ['doubleField, ', 'doubleField | '] .map((text) => ({ text, @@ -1141,7 +1161,7 @@ describe('autocomplete', () => { // Let's get funky with the field names testSuggestions( - 'FROM a | KEEP @timestamp/', + `FROM a | ${commandName} @timestamp/`, ['@timestamp, ', '@timestamp | '] .map((text) => ({ text, @@ -1150,10 +1170,15 @@ describe('autocomplete', () => { })) .map(attachTriggerCommand), undefined, - [[{ name: '@timestamp', type: 'date' }]] + [ + [ + { name: '@timestamp', type: 'date' }, + { name: 'utc_stamp', type: 'date' }, + ], + ] ); testSuggestions( - 'FROM a | KEEP foo.bar/', + `FROM a | ${commandName} foo.bar/`, ['foo.bar, ', 'foo.bar | '] .map((text) => ({ text, @@ -1162,26 +1187,34 @@ describe('autocomplete', () => { })) .map(attachTriggerCommand), undefined, - [[{ name: 'foo.bar', type: 'double' }]] + [ + [ + { name: 'foo.bar', type: 'double' }, + { name: 'baz', type: 'date' }, + ], + ] ); describe('escaped field names', () => { // This isn't actually the behavior we want, but this test is here // to make sure no weird suggestions start cropping up in this case. - testSuggestions('FROM a | KEEP `foo.bar`/', ['foo.bar'], undefined, [ + testSuggestions(`FROM a | ${commandName} \`foo.bar\`/`, ['foo.bar'], undefined, [ [{ name: 'foo.bar', type: 'double' }], ]); // @todo re-enable these tests when we can use AST to support this case - testSuggestions.skip('FROM a | KEEP `foo.bar`/', ['foo.bar, ', 'foo.bar | '], undefined, [ - [{ name: 'foo.bar', type: 'double' }], - ]); testSuggestions.skip( - 'FROM a | KEEP `foo`.`bar`/', + `FROM a | ${commandName} \`foo.bar\`/`, ['foo.bar, ', 'foo.bar | '], undefined, [[{ name: 'foo.bar', type: 'double' }]] ); - testSuggestions.skip('FROM a | KEEP `any#Char$Field`/', [ + testSuggestions.skip( + `FROM a | ${commandName} \`foo\`.\`bar\`/`, + ['foo.bar, ', 'foo.bar | '], + undefined, + [[{ name: 'foo.bar', type: 'double' }]] + ); + testSuggestions.skip(`FROM a | ${commandName} \`any#Char$Field\`/`, [ '`any#Char$Field`, ', '`any#Char$Field` | ', ]); @@ -1189,12 +1222,28 @@ describe('autocomplete', () => { // Subsequent fields testSuggestions( - 'FROM a | KEEP doubleField, dateFiel/', + `FROM a | ${commandName} doubleField, dateFiel/`, getFieldNamesByType('any') .filter((s) => s !== 'doubleField') .map(attachTriggerCommand) ); - testSuggestions('FROM a | KEEP doubleField, dateField/', ['dateField, ', 'dateField | ']); + testSuggestions(`FROM a | ${commandName} doubleField, dateField/`, [ + 'dateField, ', + 'dateField | ', + ]); + + // out of fields + testSuggestions( + `FROM a | ${commandName} doubleField, dateField/`, + ['dateField | '], + undefined, + [ + [ + { name: 'doubleField', type: 'double' }, + { name: 'dateField', type: 'date' }, + ], + ] + ); }); }); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index 2433f5d496521..6f9fb66a8c715 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -627,7 +627,7 @@ async function getExpressionSuggestionsByType( literals: argDef.constantOnly, }, { - ignoreFields: isNewExpression + ignoreColumns: isNewExpression ? command.args.filter(isColumnItem).map(({ name }) => name) : [], } @@ -656,10 +656,15 @@ async function getExpressionSuggestionsByType( })); } - return [ - { ...pipeCompleteItem, text: ' | ' }, - { ...commaCompleteItem, text: ', ' }, - ].map((s) => ({ + const finalSuggestions = [{ ...pipeCompleteItem, text: ' | ' }]; + if (fieldSuggestions.length > 1) + // when we fix the editor marker, this should probably be checked against 0 instead of 1 + // this is because the last field in the AST is currently getting removed (because it contains + // the editor marker) so it is not included in the ignored list which is used to filter out + // existing fields above. + finalSuggestions.push({ ...commaCompleteItem, text: ', ' }); + + return finalSuggestions.map((s) => ({ ...s, filterText: fragment, text: fragment + s.text, @@ -1176,15 +1181,15 @@ async function getFieldsOrFunctionsSuggestions( }, { ignoreFn = [], - ignoreFields = [], + ignoreColumns = [], }: { ignoreFn?: string[]; - ignoreFields?: string[]; + ignoreColumns?: string[]; } = {} ): Promise { const filteredFieldsByType = pushItUpInTheList( (await (fields - ? getFieldsByType(types, ignoreFields, { + ? getFieldsByType(types, ignoreColumns, { advanceCursor: commandName === 'sort', openSuggestions: commandName === 'sort', }) @@ -1195,7 +1200,10 @@ async function getFieldsOrFunctionsSuggestions( const filteredVariablesByType: string[] = []; if (variables) { for (const variable of variables.values()) { - if (types.includes('any') || types.includes(variable[0].type)) { + if ( + (types.includes('any') || types.includes(variable[0].type)) && + !ignoreColumns.includes(variable[0].name) + ) { filteredVariablesByType.push(variable[0].name); } } @@ -1515,7 +1523,7 @@ async function getListArgsSuggestions( fields: true, variables: anyVariables, }, - { ignoreFields: [firstArg.name, ...otherArgs.map(({ name }) => name)] } + { ignoreColumns: [firstArg.name, ...otherArgs.map(({ name }) => name)] } )) ); } @@ -1875,18 +1883,16 @@ async function getOptionArgsSuggestions( * for a given fragment of text in a generic way. A good example is * a field name. * - * When typing a field name, there are three scenarios + * When typing a field name, there are 2 scenarios * - * 1. user hasn't begun typing + * 1. field name is incomplete (includes the empty string) * KEEP / - * - * 2. user is typing a partial field name * KEEP fie/ * - * 3. user has typed a complete field name + * 2. field name is complete * KEEP field/ * - * This function provides a framework for handling all three scenarios in a clean way. + * This function provides a framework for detecting and handling both scenarios in a clean way. * * @param innerText - the query text before the current cursor position * @param isFragmentComplete — return true if the fragment is complete From 52148775b1ff4b4379f0049cc2332fb27e405a07 Mon Sep 17 00:00:00 2001 From: Jusheng Huang <117657272+viajes7@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:05:23 +0800 Subject: [PATCH 09/22] [Index Management] Fix filter index list by lifecycle status (#195350) ## Summary Fixes #180970 In `indexLifecycleDataEnricher`, add `only_managed: true` query parameter to fetch lifecycle data. It causes the `ilm` property to be empty in the response. And `EuiSearchBar` `field_value_selection` doesn't support filtering a `undefined` filed value. So, maybe `only_managed: true` should be removed. Before: image After: image Co-authored-by: Elastic Machine Co-authored-by: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> --- .../server/plugin.ts | 1 - .../index_management/data_enrichers/ilm.ts | 22 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/index_lifecycle_management/server/plugin.ts b/x-pack/plugins/index_lifecycle_management/server/plugin.ts index 0d88acbaaa4ff..a5002cd36da44 100644 --- a/x-pack/plugins/index_lifecycle_management/server/plugin.ts +++ b/x-pack/plugins/index_lifecycle_management/server/plugin.ts @@ -27,7 +27,6 @@ const indexLifecycleDataEnricher = async ( const { indices: ilmIndicesData } = await client.asCurrentUser.ilm.explainLifecycle({ index: '*,.*', - only_managed: true, }); return indicesList.map((index: Index) => { return { diff --git a/x-pack/test/api_integration/apis/management/index_management/data_enrichers/ilm.ts b/x-pack/test/api_integration/apis/management/index_management/data_enrichers/ilm.ts index 234a1518a9c59..3ae9b554bf3ee 100644 --- a/x-pack/test/api_integration/apis/management/index_management/data_enrichers/ilm.ts +++ b/x-pack/test/api_integration/apis/management/index_management/data_enrichers/ilm.ts @@ -55,16 +55,17 @@ export default function ({ getService }: FtrProviderContext) { const testAlias = 'test_alias'; const testIlmPolicy = 'test_policy'; describe('GET indices with data enrichers', () => { - before(async () => { + beforeEach(async () => { await createIndex(testIndex); - await createIlmPolicy('test_policy'); - await addPolicyToIndex(testIlmPolicy, testIndex, testAlias); }); - after(async () => { + afterEach(async () => { await esDeleteAllIndices([testIndex]); }); it(`ILM data is fetched by the ILM data enricher`, async () => { + await createIlmPolicy('test_policy'); + await addPolicyToIndex(testIlmPolicy, testIndex, testAlias); + const { body: indices } = await supertest .get(`${API_BASE_PATH}/indices`) .set('kbn-xsrf', 'xxx') @@ -75,5 +76,18 @@ export default function ({ getService }: FtrProviderContext) { const { ilm } = index; expect(ilm.policy).to.eql(testIlmPolicy); }); + + it(`ILM data is not empty even if the index unmanaged`, async () => { + const { body: indices } = await supertest + .get(`${API_BASE_PATH}/indices`) + .set('kbn-xsrf', 'xxx') + .expect(200); + + const index = indices.find((item: Index) => item.name === testIndex); + + const { ilm } = index; + expect(ilm.index).to.eql(testIndex); + expect(ilm.managed).to.eql(false); + }); }); } From 8a3832188ac0f9660f243fdf0181e007af623dc3 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 11 Oct 2024 03:58:15 +1100 Subject: [PATCH 10/22] skip failing test suite (#184558) --- .../detection_engine/rule_creation/esql_rule.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule.cy.ts index 0045a79ff4394..64423a921e595 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule.cy.ts @@ -67,7 +67,8 @@ const workaroundForResizeObserver = () => } }); -describe( +// Failing: See https://github.com/elastic/kibana/issues/184558 +describe.skip( 'Detection ES|QL rules, creation', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'], From 35bbb49176c3a933ca6d68e770602bdb2931e71f Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 11 Oct 2024 03:58:44 +1100 Subject: [PATCH 11/22] skip failing test suite (#195804) --- .../e2e/investigations/threat_intelligence/indicators.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/indicators.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/indicators.cy.ts index ebfc5d4e9a0cb..f485ead495949 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/indicators.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/indicators.cy.ts @@ -67,7 +67,8 @@ const URL = '/app/security/threat_intelligence/indicators'; const URL_WITH_CONTRADICTORY_FILTERS = '/app/security/threat_intelligence/indicators?indicators=(filterQuery:(language:kuery,query:%27%27),filters:!((%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:threat.indicator.type,negate:!f,params:(query:file),type:phrase),query:(match_phrase:(threat.indicator.type:file))),(%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:threat.indicator.type,negate:!f,params:(query:url),type:phrase),query:(match_phrase:(threat.indicator.type:url)))),timeRange:(from:now/d,to:now/d))'; -describe('Single indicator', { tags: ['@ess'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/195804 +describe.skip('Single indicator', { tags: ['@ess'] }, () => { before(() => cy.task('esArchiverLoad', { archiveName: 'ti_indicators_data_single' })); after(() => cy.task('esArchiverUnload', { archiveName: 'ti_indicators_data_single' })); From 2bb9c3cc92957faea5985169371e75197f86e407 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 10 Oct 2024 19:12:29 +0200 Subject: [PATCH 12/22] [ES|QL] Omits sorting non sortable fields on Discover histogram (#195531) ## Summary Closes https://github.com/elastic/kibana/issues/195510 Sorting by `geo_point`, tsdb counter fields and _source is not supported in ES|QL. This PR is omitting the sorting for these types and now the breakdown works fine. image Note: This behavior is unreleased. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- packages/kbn-esql-utils/index.ts | 1 + packages/kbn-esql-utils/src/index.ts | 1 + .../src/utils/esql_fields_utils.test.ts | 66 +++++++++++++++++++ .../src/utils/esql_fields_utils.ts | 40 +++++++++++ .../lens_vis_service.suggestions.test.ts | 58 +++++++++++++++- .../public/services/lens_vis_service.ts | 19 ++++-- 6 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 packages/kbn-esql-utils/src/utils/esql_fields_utils.test.ts create mode 100644 packages/kbn-esql-utils/src/utils/esql_fields_utils.ts diff --git a/packages/kbn-esql-utils/index.ts b/packages/kbn-esql-utils/index.ts index 223181f2bd154..333557964d873 100644 --- a/packages/kbn-esql-utils/index.ts +++ b/packages/kbn-esql-utils/index.ts @@ -29,6 +29,7 @@ export { isQueryWrappedByPipes, retrieveMetadataColumns, getQueryColumnsFromESQLQuery, + isESQLColumnSortable, TextBasedLanguages, } from './src'; diff --git a/packages/kbn-esql-utils/src/index.ts b/packages/kbn-esql-utils/src/index.ts index e36283c7a9238..3b3228e7a2a4a 100644 --- a/packages/kbn-esql-utils/src/index.ts +++ b/packages/kbn-esql-utils/src/index.ts @@ -31,3 +31,4 @@ export { getStartEndParams, hasStartEndParams, } from './utils/run_query'; +export { isESQLColumnSortable } from './utils/esql_fields_utils'; diff --git a/packages/kbn-esql-utils/src/utils/esql_fields_utils.test.ts b/packages/kbn-esql-utils/src/utils/esql_fields_utils.test.ts new file mode 100644 index 0000000000000..ef8a24e686bd6 --- /dev/null +++ b/packages/kbn-esql-utils/src/utils/esql_fields_utils.test.ts @@ -0,0 +1,66 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; +import { isESQLColumnSortable } from './esql_fields_utils'; + +describe('esql fields helpers', () => { + describe('isESQLColumnSortable', () => { + it('returns false for geo fields', () => { + const geoField = { + id: 'geo.coordinates', + name: 'geo.coordinates', + meta: { + type: 'geo_point', + esType: 'geo_point', + }, + isNull: false, + } as DatatableColumn; + expect(isESQLColumnSortable(geoField)).toBeFalsy(); + }); + + it('returns false for source fields', () => { + const sourceField = { + id: '_source', + name: '_source', + meta: { + type: '_source', + esType: '_source', + }, + isNull: false, + } as DatatableColumn; + expect(isESQLColumnSortable(sourceField)).toBeFalsy(); + }); + + it('returns false for counter fields', () => { + const tsdbField = { + id: 'tsbd_counter', + name: 'tsbd_counter', + meta: { + type: 'number', + esType: 'counter_long', + }, + isNull: false, + } as DatatableColumn; + expect(isESQLColumnSortable(tsdbField)).toBeFalsy(); + }); + + it('returns true for everything else', () => { + const keywordField = { + id: 'sortable', + name: 'sortable', + meta: { + type: 'string', + esType: 'keyword', + }, + isNull: false, + } as DatatableColumn; + expect(isESQLColumnSortable(keywordField)).toBeTruthy(); + }); + }); +}); diff --git a/packages/kbn-esql-utils/src/utils/esql_fields_utils.ts b/packages/kbn-esql-utils/src/utils/esql_fields_utils.ts new file mode 100644 index 0000000000000..f5a0fe7b81340 --- /dev/null +++ b/packages/kbn-esql-utils/src/utils/esql_fields_utils.ts @@ -0,0 +1,40 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; + +const SPATIAL_FIELDS = ['geo_point', 'geo_shape', 'point', 'shape']; +const SOURCE_FIELD = '_source'; +const TSDB_COUNTER_FIELDS_PREFIX = 'counter_'; + +/** + * Check if a column is sortable. + * + * @param column The DatatableColumn of the field. + * @returns True if the column is sortable, false otherwise. + */ + +export const isESQLColumnSortable = (column: DatatableColumn): boolean => { + // We don't allow sorting on spatial fields + if (SPATIAL_FIELDS.includes(column.meta?.type)) { + return false; + } + + // we don't allow sorting on the _source field + if (column.meta?.type === SOURCE_FIELD) { + return false; + } + + // we don't allow sorting on tsdb counter fields + if (column.meta?.esType && column.meta?.esType?.indexOf(TSDB_COUNTER_FIELDS_PREFIX) !== -1) { + return false; + } + + return true; +}; diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts index 28819f7a5c54b..1719adebe7a49 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts @@ -12,6 +12,7 @@ import { DataViewField } from '@kbn/data-views-plugin/common'; import { deepMockedFields, buildDataViewMock } from '@kbn/discover-utils/src/__mocks__'; import { allSuggestionsMock } from '../__mocks__/suggestions'; import { getLensVisMock } from '../__mocks__/lens_vis'; +import { convertDatatableColumnToDataViewFieldSpec } from '@kbn/data-view-utils'; import { UnifiedHistogramSuggestionType } from '../types'; describe('LensVisService suggestions', () => { @@ -198,6 +199,11 @@ describe('LensVisService suggestions', () => { }); test('should return histogramSuggestion if no suggestions returned by the api with the breakdown field if it is given', async () => { + const breakdown = convertDatatableColumnToDataViewFieldSpec({ + name: 'var0', + id: 'var0', + meta: { type: 'number' }, + }); const lensVis = await getLensVisMock({ filters: [], query: { esql: 'from the-data-view | limit 100' }, @@ -207,7 +213,7 @@ describe('LensVisService suggestions', () => { from: '2023-09-03T08:00:00.000Z', to: '2023-09-04T08:56:28.274Z', }, - breakdownField: { name: 'var0' } as DataViewField, + breakdownField: breakdown as DataViewField, columns: [ { id: 'var0', @@ -247,4 +253,54 @@ describe('LensVisService suggestions', () => { expect(lensVis.visContext?.attributes.state.query).toStrictEqual(histogramQuery); }); + + test('should return histogramSuggestion if no suggestions returned by the api with a geo point breakdown field correctly', async () => { + const lensVis = await getLensVisMock({ + filters: [], + query: { esql: 'from the-data-view | limit 100' }, + dataView: dataViewMock, + timeInterval: 'auto', + timeRange: { + from: '2023-09-03T08:00:00.000Z', + to: '2023-09-04T08:56:28.274Z', + }, + breakdownField: { name: 'coordinates' } as DataViewField, + columns: [ + { + id: 'coordinates', + name: 'coordinates', + meta: { + type: 'geo_point', + }, + }, + ], + isPlainRecord: true, + allSuggestions: [], + hasHistogramSuggestionForESQL: true, + }); + + expect(lensVis.currentSuggestionContext?.type).toBe( + UnifiedHistogramSuggestionType.histogramForESQL + ); + expect(lensVis.currentSuggestionContext?.suggestion).toBeDefined(); + expect(lensVis.currentSuggestionContext?.suggestion?.visualizationState).toHaveProperty( + 'layers', + [ + { + layerId: '662552df-2cdc-4539-bf3b-73b9f827252c', + seriesType: 'bar_stacked', + xAccessor: '@timestamp every 30 second', + accessors: ['results'], + layerType: 'data', + }, + ] + ); + + const histogramQuery = { + esql: `from the-data-view | limit 100 +| EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats results = count(*) by timestamp, \`coordinates\` | rename timestamp as \`@timestamp every 30 minute\``, + }; + + expect(lensVis.visContext?.attributes.state.query).toStrictEqual(histogramQuery); + }); }); diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.ts index eccfd663b2557..25bb8be6f6242 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.ts @@ -9,7 +9,11 @@ import { BehaviorSubject, distinctUntilChanged, map, Observable } from 'rxjs'; import { isEqual } from 'lodash'; -import { removeDropCommandsFromESQLQuery, appendToESQLQuery } from '@kbn/esql-utils'; +import { + removeDropCommandsFromESQLQuery, + appendToESQLQuery, + isESQLColumnSortable, +} from '@kbn/esql-utils'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import type { CountIndexPatternColumn, @@ -553,12 +557,17 @@ export class LensVisService { const queryInterval = interval ?? computeInterval(timeRange, this.services.data); const language = getAggregateQueryMode(query); const safeQuery = removeDropCommandsFromESQLQuery(query[language]); - const breakdown = breakdownColumn - ? `, \`${breakdownColumn.name}\` | sort \`${breakdownColumn.name}\` asc` - : ''; + const breakdown = breakdownColumn ? `, \`${breakdownColumn.name}\`` : ''; + + // sort by breakdown column if it's sortable + const sortBy = + breakdownColumn && isESQLColumnSortable(breakdownColumn) + ? ` | sort \`${breakdownColumn.name}\` asc` + : ''; + return appendToESQLQuery( safeQuery, - `| EVAL timestamp=DATE_TRUNC(${queryInterval}, ${dataView.timeFieldName}) | stats results = count(*) by timestamp${breakdown} | rename timestamp as \`${dataView.timeFieldName} every ${queryInterval}\`` + `| EVAL timestamp=DATE_TRUNC(${queryInterval}, ${dataView.timeFieldName}) | stats results = count(*) by timestamp${breakdown}${sortBy} | rename timestamp as \`${dataView.timeFieldName} every ${queryInterval}\`` ); }; From 8d1bc50335892cc2eecf9fadce569e6facc282e5 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Thu, 10 Oct 2024 12:42:05 -0500 Subject: [PATCH 13/22] skip failing configs (#195811) --- .buildkite/ftr_oblt_serverless_configs.yml | 6 ++++-- .buildkite/ftr_search_serverless_configs.yml | 6 ++++-- .buildkite/ftr_security_serverless_configs.yml | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.buildkite/ftr_oblt_serverless_configs.yml b/.buildkite/ftr_oblt_serverless_configs.yml index fbf0406f37be4..75909e7c21c46 100644 --- a/.buildkite/ftr_oblt_serverless_configs.yml +++ b/.buildkite/ftr_oblt_serverless_configs.yml @@ -6,6 +6,10 @@ disabled: - x-pack/test_serverless/functional/test_suites/observability/cypress/config_headless.ts - x-pack/test_serverless/functional/test_suites/observability/cypress/config_runner.ts + # serverless config files that run deployment-agnostic tests + # Failing https://github.com/elastic/kibana/issues/195811 + - x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts + defaultQueue: 'n2-4-spot' enabled: - x-pack/test_serverless/api_integration/test_suites/observability/config.ts @@ -25,5 +29,3 @@ enabled: - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts - x-pack/test_serverless/functional/test_suites/observability/config.screenshots.ts - # serverless config files that run deployment-agnostic tests - - x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts diff --git a/.buildkite/ftr_search_serverless_configs.yml b/.buildkite/ftr_search_serverless_configs.yml index e6efee5860806..413558bffa0fe 100644 --- a/.buildkite/ftr_search_serverless_configs.yml +++ b/.buildkite/ftr_search_serverless_configs.yml @@ -1,6 +1,10 @@ disabled: # Base config files, only necessary to inform config finding script + # serverless config files that run deployment-agnostic tests + # Failing https://github.com/elastic/kibana/issues/195811 + - x-pack/test/api_integration/deployment_agnostic/configs/serverless/search.serverless.config.ts + defaultQueue: 'n2-4-spot' enabled: - x-pack/test_serverless/api_integration/test_suites/search/config.ts @@ -18,5 +22,3 @@ enabled: - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group4.ts - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts - # serverless config files that run deployment-agnostic tests - - x-pack/test/api_integration/deployment_agnostic/configs/serverless/search.serverless.config.ts diff --git a/.buildkite/ftr_security_serverless_configs.yml b/.buildkite/ftr_security_serverless_configs.yml index 6d42c030b2d4f..caf9fcc5ac92a 100644 --- a/.buildkite/ftr_security_serverless_configs.yml +++ b/.buildkite/ftr_security_serverless_configs.yml @@ -20,6 +20,10 @@ disabled: - x-pack/test_serverless/functional/config.base.ts - x-pack/test_serverless/shared/config.base.ts + # serverless config files that run deployment-agnostic tests + # Failing https://github.com/elastic/kibana/issues/195811 + - x-pack/test/api_integration/deployment_agnostic/configs/serverless/security.serverless.config.ts + defaultQueue: 'n2-4-spot' enabled: - x-pack/test_serverless/api_integration/test_suites/security/config.ts @@ -100,5 +104,3 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/configs/serverless.config.ts - x-pack/test/security_solution_endpoint/configs/serverless.endpoint.config.ts - x-pack/test/security_solution_endpoint/configs/serverless.integrations.config.ts - # serverless config files that run deployment-agnostic tests - - x-pack/test/api_integration/deployment_agnostic/configs/serverless/security.serverless.config.ts From 84ebcb07c9aa83a59629e0591cdf560855c4a13c Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 11 Oct 2024 05:17:18 +1100 Subject: [PATCH 14/22] skip failing test suite (#184557) --- .../detection_engine/rule_edit/esql_rule.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts index 9fa45987407f0..cc8acadc412b1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts @@ -55,7 +55,8 @@ const expectedValidEsqlQuery = 'from auditbeat* | stats _count=count(event.category) by event.category'; // Skipping in MKI due to flake -describe( +// Failing: See https://github.com/elastic/kibana/issues/184557 +describe.skip( 'Detection ES|QL rules, edit', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'], From 7a53d8104602dcb510621b31f85a7a74c0fe7809 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 11 Oct 2024 05:22:10 +1100 Subject: [PATCH 15/22] skip failing test suite (#184556) --- .../detection_engine/rule_edit/esql_rule.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts index cc8acadc412b1..34f301602b692 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts @@ -56,6 +56,7 @@ const expectedValidEsqlQuery = // Skipping in MKI due to flake // Failing: See https://github.com/elastic/kibana/issues/184557 +// Failing: See https://github.com/elastic/kibana/issues/184556 describe.skip( 'Detection ES|QL rules, edit', { From ad8cec13b6ebb8270dd91fc4012ed8ff2b531353 Mon Sep 17 00:00:00 2001 From: Jorge Sanz Date: Thu, 10 Oct 2024 21:02:23 +0200 Subject: [PATCH 16/22] [Docs][Maps] Update EMS Server instructions (#195419) ## Summary Small improvements to the Elastic Maps Service documentation: * fixes the reference to the Docker image to pull * adds details about using `cosign` to verify the image pulled * updates the screenshot to a more recent UI. --- docs/maps/connect-to-ems.asciidoc | 45 ++++++++++++------ .../elastic-maps-server-instructions.png | Bin 48671 -> 107478 bytes 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/docs/maps/connect-to-ems.asciidoc b/docs/maps/connect-to-ems.asciidoc index e41d544d64e4d..1ccdedb1da2a9 100644 --- a/docs/maps/connect-to-ems.asciidoc +++ b/docs/maps/connect-to-ems.asciidoc @@ -1,6 +1,6 @@ :ems: Elastic Maps Service :ems-docker-repo: docker.elastic.co/elastic-maps-service/elastic-maps-server -:ems-docker-image: {ems-docker-repo}:{version}-amd64 +:ems-docker-image: {ems-docker-repo}:{version} :ems-headers-url: https://deployment-host [[maps-connect-to-ems]] @@ -81,34 +81,53 @@ If you cannot connect to {ems} from the {kib} server or browser clients, and you {hosted-ems} is a self-managed version of {ems} offered as a Docker image that provides both the EMS basemaps and EMS boundaries. The image is bundled with basemaps up to zoom level 8. After connecting it to your {es} cluster for license validation, you have the option to download and configure a more detailed basemaps database. -You can use +docker pull+ to download the {hosted-ems} image from the Elastic Docker registry. - +. Pull the {hosted-ems} Docker image. ++ ifeval::["{release-state}"=="unreleased"] -Version {version} of {hosted-ems} has not yet been released, so no Docker image is currently available for this version. +WARNING: Version {version} of {hosted-ems} has not yet been released. +No Docker image is currently available for this version. endif::[] - -ifeval::["{release-state}"!="unreleased"] - ++ ["source","bash",subs="attributes"] ---------------------------------- docker pull {ems-docker-image} ---------------------------------- -Start {hosted-ems} and expose the default port `8080`: +. Optional: Install +https://docs.sigstore.dev/system_config/installation/[Cosign] for your +environment. Then use Cosign to verify the {es} image's signature. ++ +[source,sh,subs="attributes"] +---- +wget https://artifacts.elastic.co/cosign.pub +cosign verify --key cosign.pub {ems-docker-image} +---- ++ +The `cosign` command prints the check results and the signature payload in JSON format: ++ +[source,sh,subs="attributes"] +-------------------------------------------- +Verification for {ems-docker-image} -- +The following checks were performed on each of these signatures: + - The cosign claims were validated + - Existence of the claims in the transparency log was verified offline + - The signatures were verified against the specified public key +-------------------------------------------- + +. Start {hosted-ems} and expose the default port `8080`: ++ ["source","bash",subs="attributes"] ---------------------------------- docker run --rm --init --publish 8080:8080 \ {ems-docker-image} ---------------------------------- - ++ Once {hosted-ems} is running, follow instructions from the webpage at `localhost:8080` to define a configuration file and optionally download a more detailed basemaps database. - ++ [role="screenshot"] image::images/elastic-maps-server-instructions.png[Set-up instructions] -endif::[] - [float] [[elastic-maps-server-configuration]] ==== Configuration @@ -193,7 +212,6 @@ One way to configure {hosted-ems} is to provide `elastic-maps-server.yml` via bi ["source","yaml",subs="attributes"] -------------------------------------------- -version: '2' services: ems-server: image: {ems-docker-image} @@ -212,7 +230,6 @@ These variables can be set with +docker-compose+ like this: ["source","yaml",subs="attributes"] ---------------------------------------------------------- -version: '2' services: ems-server: image: {ems-docker-image} diff --git a/docs/maps/images/elastic-maps-server-instructions.png b/docs/maps/images/elastic-maps-server-instructions.png index 5c0b47ce8f49f34278e6f5515b940585ee74cb52..524ae2192b5e57a91d538fefea302e6f5b1421a8 100644 GIT binary patch literal 107478 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

WRf>n&7Y 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�c@_+`AqvL}#)jNh5|2F0;pEc_zHjN)n!-xwcG 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�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 literal 48671 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

!XY%h{+U)}( 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 Date: Thu, 10 Oct 2024 14:59:20 -0500 Subject: [PATCH 17/22] Skip only Risk Engine initializing test with a FIPS issue (#195651) ## Summary More investigation is needed to ensure that the `remove legacy risk score transform` test is passing in promotion pipelines. However, that particular feature that the test asserts (Legacy Entity Risk Scoring) was never available in Serverless. Therefore, we're enabling the broader tests, and just skipping the one containing the FIPS issue. --- .../trial_license_complete_tier/init_and_status_apis.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts index bd3493b82d348..19a9bb85326fa 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts @@ -26,8 +26,7 @@ export default ({ getService }: FtrProviderContext) => { const riskEngineRoutes = riskEngineRouteHelpersFactory(supertest); const log = getService('log'); - // Failing: See https://github.com/elastic/kibana/issues/191637 - describe.skip('@ess @serverless @serverlessQA init_and_status_apis', () => { + describe('@ess @serverless @serverlessQA init_and_status_apis', () => { before(async () => { await riskEngineRoutes.cleanUp(); }); @@ -298,8 +297,8 @@ export default ({ getService }: FtrProviderContext) => { firstResponse?.saved_objects?.[0]?.id ); }); - - describe('remove legacy risk score transform', function () { + // Failing: See https://github.com/elastic/kibana/issues/191637 + describe.skip('remove legacy risk score transform', function () { this.tags('skipFIPS'); it('should remove legacy risk score transform if it exists', async () => { await installLegacyRiskScore({ supertest }); From 3ec190823fa39520dc50f5c4631eb81cd223ed3e Mon Sep 17 00:00:00 2001 From: Sandra G Date: Thu, 10 Oct 2024 15:59:48 -0400 Subject: [PATCH 18/22] [Data Usage] process autoops mock data (#195640) - validates autoOps response data using mock data and new type - processes autoOps data to return an object of {x,y} values from our API instead of array of [timestamp, value]. updates UI accordingly --- .../common/rest_types/usage_metrics.test.ts | 79 +++++++-------- .../common/rest_types/usage_metrics.ts | 99 ++++++++++--------- .../public/app/components/chart_panel.tsx | 13 +-- .../public/app/components/charts.tsx | 4 +- .../data_usage/public/app/data_usage.tsx | 29 +++--- x-pack/plugins/data_usage/public/app/types.ts | 24 ----- .../public/hooks/use_get_usage_metrics.ts | 18 ++-- .../server/routes/internal/usage_metrics.ts | 6 +- .../routes/internal/usage_metrics_handler.ts | 59 +++++------ 9 files changed, 153 insertions(+), 178 deletions(-) delete mode 100644 x-pack/plugins/data_usage/public/app/types.ts diff --git a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.test.ts b/x-pack/plugins/data_usage/common/rest_types/usage_metrics.test.ts index f6c08e2caddc0..473e64c6b03d9 100644 --- a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.test.ts +++ b/x-pack/plugins/data_usage/common/rest_types/usage_metrics.test.ts @@ -10,48 +10,29 @@ import { UsageMetricsRequestSchema } from './usage_metrics'; describe('usage_metrics schemas', () => { it('should accept valid request query', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), metricTypes: ['storage_retained'], - }) - ).not.toThrow(); - }); - - it('should accept a single `metricTypes` in request query', () => { - expect(() => - UsageMetricsRequestSchema.query.validate({ - from: new Date().toISOString(), - to: new Date().toISOString(), - metricTypes: 'ingest_rate', + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], }) ).not.toThrow(); }); it('should accept multiple `metricTypes` in request query', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), metricTypes: ['ingest_rate', 'storage_retained', 'index_rate'], - }) - ).not.toThrow(); - }); - - it('should accept a single string as `dataStreams` in request query', () => { - expect(() => - UsageMetricsRequestSchema.query.validate({ - from: new Date().toISOString(), - to: new Date().toISOString(), - metricTypes: 'storage_retained', - dataStreams: 'data_stream_1', + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], }) ).not.toThrow(); }); it('should accept `dataStream` list', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), metricTypes: ['storage_retained'], @@ -62,74 +43,76 @@ describe('usage_metrics schemas', () => { it('should error if `dataStream` list is empty', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), metricTypes: ['storage_retained'], dataStreams: [], }) - ).toThrowError('expected value of type [string] but got [Array]'); + ).toThrowError('[dataStreams]: array size is [0], but cannot be smaller than [1]'); }); - it('should error if `dataStream` is given an empty string', () => { + it('should error if `dataStream` is given type not array', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), metricTypes: ['storage_retained'], dataStreams: ' ', }) - ).toThrow('[dataStreams] must have at least one value'); + ).toThrow('[dataStreams]: could not parse array value from json input'); }); it('should error if `dataStream` is given an empty item in the list', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), metricTypes: ['storage_retained'], dataStreams: ['ds_1', ' '], }) - ).toThrow('[dataStreams] list can not contain empty values'); + ).toThrow('[dataStreams]: [dataStreams] list cannot contain empty values'); }); it('should error if `metricTypes` is empty string', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: ' ', }) ).toThrow(); }); - it('should error if `metricTypes` is empty item', () => { + it('should error if `metricTypes` contains an empty item', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), - metricTypes: [' ', 'storage_retained'], + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], + metricTypes: [' ', 'storage_retained'], // First item is invalid }) - ).toThrow('[metricTypes] list can not contain empty values'); + ).toThrowError(/list cannot contain empty values/); }); - it('should error if `metricTypes` is not a valid value', () => { + it('should error if `metricTypes` is not a valid type', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: 'foo', }) - ).toThrow( - '[metricTypes] must be one of storage_retained, ingest_rate, search_vcu, ingest_vcu, ml_vcu, index_latency, index_rate, search_latency, search_rate' - ); + ).toThrow('[metricTypes]: could not parse array value from json input'); }); it('should error if `metricTypes` is not a valid list', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: new Date().toISOString(), + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: ['storage_retained', 'foo'], }) ).toThrow( @@ -139,9 +122,10 @@ describe('usage_metrics schemas', () => { it('should error if `from` is not a valid input', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: 1010, to: new Date().toISOString(), + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: ['storage_retained', 'foo'], }) ).toThrow('[from]: expected value of type [string] but got [number]'); @@ -149,9 +133,10 @@ describe('usage_metrics schemas', () => { it('should error if `to` is not a valid input', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: 1010, + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: ['storage_retained', 'foo'], }) ).toThrow('[to]: expected value of type [string] but got [number]'); @@ -159,9 +144,10 @@ describe('usage_metrics schemas', () => { it('should error if `from` is empty string', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: ' ', to: new Date().toISOString(), + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: ['storage_retained', 'foo'], }) ).toThrow('[from]: Date ISO string must not be empty'); @@ -169,9 +155,10 @@ describe('usage_metrics schemas', () => { it('should error if `to` is empty string', () => { expect(() => - UsageMetricsRequestSchema.query.validate({ + UsageMetricsRequestSchema.validate({ from: new Date().toISOString(), to: ' ', + dataStreams: ['data_stream_1', 'data_stream_2', 'data_stream_3'], metricTypes: ['storage_retained', 'foo'], }) ).toThrow('[to]: Date ISO string must not be empty'); diff --git a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts b/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts index f2bbdb616fc79..3dceeadc198b0 100644 --- a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts +++ b/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts @@ -37,51 +37,31 @@ const metricTypesSchema = schema.oneOf( // @ts-expect-error TS2769: No overload matches this call METRIC_TYPE_VALUES.map((metricType) => schema.literal(metricType)) // Create a oneOf schema for the keys ); -export const UsageMetricsRequestSchema = { - query: schema.object({ - from: DateSchema, - to: DateSchema, - metricTypes: schema.oneOf([ - schema.arrayOf(schema.string(), { - minSize: 1, - validate: (values) => { - if (values.map((v) => v.trim()).some((v) => !v.length)) { - return '[metricTypes] list can not contain empty values'; - } else if (values.map((v) => v.trim()).some((v) => !isValidMetricType(v))) { - return `[metricTypes] must be one of ${METRIC_TYPE_VALUES.join(', ')}`; - } - }, - }), - schema.string({ - validate: (v) => { - if (!v.trim().length) { - return '[metricTypes] must have at least one value'; - } else if (!isValidMetricType(v)) { - return `[metricTypes] must be one of ${METRIC_TYPE_VALUES.join(', ')}`; - } - }, - }), - ]), - dataStreams: schema.maybe( - schema.oneOf([ - schema.arrayOf(schema.string(), { - minSize: 1, - validate: (values) => { - if (values.map((v) => v.trim()).some((v) => !v.length)) { - return '[dataStreams] list can not contain empty values'; - } - }, - }), - schema.string({ - validate: (v) => - v.trim().length ? undefined : '[dataStreams] must have at least one value', - }), - ]) - ), +export const UsageMetricsRequestSchema = schema.object({ + from: DateSchema, + to: DateSchema, + metricTypes: schema.arrayOf(schema.string(), { + minSize: 1, + validate: (values) => { + const trimmedValues = values.map((v) => v.trim()); + if (trimmedValues.some((v) => !v.length)) { + return '[metricTypes] list cannot contain empty values'; + } else if (trimmedValues.some((v) => !isValidMetricType(v))) { + return `[metricTypes] must be one of ${METRIC_TYPE_VALUES.join(', ')}`; + } + }, }), -}; + dataStreams: schema.arrayOf(schema.string(), { + minSize: 1, + validate: (values) => { + if (values.map((v) => v.trim()).some((v) => !v.length)) { + return '[dataStreams] list cannot contain empty values'; + } + }, + }), +}); -export type UsageMetricsRequestSchemaQueryParams = TypeOf; +export type UsageMetricsRequestSchemaQueryParams = TypeOf; export const UsageMetricsResponseSchema = { body: () => @@ -92,11 +72,40 @@ export const UsageMetricsResponseSchema = { schema.object({ name: schema.string(), data: schema.arrayOf( - schema.arrayOf(schema.number(), { minSize: 2, maxSize: 2 }) // Each data point is an array of 2 numbers + schema.object({ + x: schema.number(), + y: schema.number(), + }) ), }) ) ), }), }; -export type UsageMetricsResponseSchemaBody = TypeOf; +export type UsageMetricsResponseSchemaBody = Omit< + TypeOf, + 'metrics' +> & { + metrics: Partial>; +}; +export type MetricSeries = TypeOf< + typeof UsageMetricsResponseSchema.body +>['metrics'][MetricTypes][number]; + +export const UsageMetricsAutoOpsResponseSchema = { + body: () => + schema.object({ + metrics: schema.recordOf( + metricTypesSchema, + schema.arrayOf( + schema.object({ + name: schema.string(), + data: schema.arrayOf(schema.arrayOf(schema.number(), { minSize: 2, maxSize: 2 })), + }) + ) + ), + }), +}; +export type UsageMetricsAutoOpsResponseSchemaBody = TypeOf< + typeof UsageMetricsAutoOpsResponseSchema.body +>; diff --git a/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx b/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx index c7937ae149de9..1ba3f0fe3f454 100644 --- a/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx +++ b/x-pack/plugins/data_usage/public/app/components/chart_panel.tsx @@ -19,8 +19,7 @@ import { } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { LegendAction } from './legend_action'; -import { MetricTypes } from '../../../common/rest_types'; -import { MetricSeries } from '../types'; +import { MetricTypes, MetricSeries } from '../../../common/rest_types'; // TODO: Remove this when we have a title for each metric type type ChartKey = Extract; @@ -50,7 +49,7 @@ export const ChartPanel: React.FC = ({ }) => { const theme = useEuiTheme(); - const chartTimestamps = series.flatMap((stream) => stream.data.map((d) => d[0])); + const chartTimestamps = series.flatMap((stream) => stream.data.map((d) => d.x)); const [minTimestamp, maxTimestamp] = [Math.min(...chartTimestamps), Math.max(...chartTimestamps)]; @@ -72,6 +71,7 @@ export const ChartPanel: React.FC = ({ }, [idx, popoverOpen, togglePopover] ); + return ( @@ -94,9 +94,9 @@ export const ChartPanel: React.FC = ({ data={stream.data} xScaleType={ScaleType.Time} yScaleType={ScaleType.Linear} - xAccessor={0} // x is the first element in the tuple - yAccessors={[1]} // y is the second element in the tuple - stackAccessors={[0]} + xAccessor="x" + yAccessors={['y']} + stackAccessors={['x']} /> ))} @@ -118,6 +118,7 @@ export const ChartPanel: React.FC = ({ ); }; + const formatBytes = (bytes: number) => { return numeral(bytes).format('0.0 b'); }; diff --git a/x-pack/plugins/data_usage/public/app/components/charts.tsx b/x-pack/plugins/data_usage/public/app/components/charts.tsx index 6549f7e03830a..8d04324fb2246 100644 --- a/x-pack/plugins/data_usage/public/app/components/charts.tsx +++ b/x-pack/plugins/data_usage/public/app/components/charts.tsx @@ -6,11 +6,11 @@ */ import React, { useCallback, useState } from 'react'; import { EuiFlexGroup } from '@elastic/eui'; -import { MetricsResponse } from '../types'; import { MetricTypes } from '../../../common/rest_types'; import { ChartPanel } from './chart_panel'; +import { UsageMetricsResponseSchemaBody } from '../../../common/rest_types'; interface ChartsProps { - data: MetricsResponse; + data: UsageMetricsResponseSchemaBody; } export const Charts: React.FC = ({ data }) => { diff --git a/x-pack/plugins/data_usage/public/app/data_usage.tsx b/x-pack/plugins/data_usage/public/app/data_usage.tsx index c32f86d68b5bf..bea9f2b511a77 100644 --- a/x-pack/plugins/data_usage/public/app/data_usage.tsx +++ b/x-pack/plugins/data_usage/public/app/data_usage.tsx @@ -26,7 +26,6 @@ import { PLUGIN_NAME } from '../../common'; import { useGetDataUsageMetrics } from '../hooks/use_get_usage_metrics'; import { DEFAULT_DATE_RANGE_OPTIONS, useDateRangePicker } from './hooks/use_date_picker'; import { useDataUsageMetricsUrlParams } from './hooks/use_charts_url_params'; -import { MetricsResponse } from './types'; export const DataUsage = () => { const { @@ -42,37 +41,37 @@ export const DataUsage = () => { setUrlDateRangeFilter, } = useDataUsageMetricsUrlParams(); - const [queryParams, setQueryParams] = useState({ + const [metricsFilters, setMetricsFilters] = useState({ metricTypes: ['storage_retained', 'ingest_rate'], - dataStreams: [], + // TODO: Replace with data streams from /data_streams api + dataStreams: [ + '.alerts-ml.anomaly-detection-health.alerts-default', + '.alerts-stack.alerts-default', + ], from: DEFAULT_DATE_RANGE_OPTIONS.startDate, to: DEFAULT_DATE_RANGE_OPTIONS.endDate, }); useEffect(() => { if (!metricTypesFromUrl) { - setUrlMetricTypesFilter( - typeof queryParams.metricTypes !== 'string' - ? queryParams.metricTypes.join(',') - : queryParams.metricTypes - ); + setUrlMetricTypesFilter(metricsFilters.metricTypes.join(',')); } if (!startDateFromUrl || !endDateFromUrl) { - setUrlDateRangeFilter({ startDate: queryParams.from, endDate: queryParams.to }); + setUrlDateRangeFilter({ startDate: metricsFilters.from, endDate: metricsFilters.to }); } }, [ endDateFromUrl, metricTypesFromUrl, - queryParams.from, - queryParams.metricTypes, - queryParams.to, + metricsFilters.from, + metricsFilters.metricTypes, + metricsFilters.to, setUrlDateRangeFilter, setUrlMetricTypesFilter, startDateFromUrl, ]); useEffect(() => { - setQueryParams((prevState) => ({ + setMetricsFilters((prevState) => ({ ...prevState, metricTypes: metricTypesFromUrl?.length ? metricTypesFromUrl : prevState.metricTypes, dataStreams: dataStreamsFromUrl?.length ? dataStreamsFromUrl : prevState.dataStreams, @@ -89,7 +88,7 @@ export const DataUsage = () => { refetch: refetchDataUsageMetrics, } = useGetDataUsageMetrics( { - ...queryParams, + ...metricsFilters, from: dateRangePickerState.startDate, to: dateRangePickerState.endDate, }, @@ -140,7 +139,7 @@ export const DataUsage = () => { - {isFetched && data ? : } + {isFetched && data ? : } ); diff --git a/x-pack/plugins/data_usage/public/app/types.ts b/x-pack/plugins/data_usage/public/app/types.ts deleted file mode 100644 index 13f53bc2ea6dd..0000000000000 --- a/x-pack/plugins/data_usage/public/app/types.ts +++ /dev/null @@ -1,24 +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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { MetricTypes } from '../../common/rest_types'; - -export type DataPoint = [number, number]; // [timestamp, value] - -export interface MetricSeries { - name: string; // Name of the data stream - data: DataPoint[]; // Array of data points in tuple format [timestamp, value] -} -// Use MetricTypes dynamically as keys for the Metrics interface -export type Metrics = Partial>; - -export interface MetricsResponse { - metrics: Metrics; -} -export interface MetricsResponse { - metrics: Metrics; -} diff --git a/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.ts b/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.ts index 6b9860e997c12..3d648eb183f07 100644 --- a/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.ts +++ b/x-pack/plugins/data_usage/public/hooks/use_get_usage_metrics.ts @@ -21,24 +21,24 @@ interface ErrorType { } export const useGetDataUsageMetrics = ( - query: UsageMetricsRequestSchemaQueryParams, + body: UsageMetricsRequestSchemaQueryParams, options: UseQueryOptions> = {} ): UseQueryResult> => { const http = useKibanaContextForPlugin().services.http; return useQuery>({ - queryKey: ['get-data-usage-metrics', query], + queryKey: ['get-data-usage-metrics', body], ...options, keepPreviousData: true, queryFn: async () => { - return http.get(DATA_USAGE_METRICS_API_ROUTE, { + return http.post(DATA_USAGE_METRICS_API_ROUTE, { version: '1', - query: { - from: query.from, - to: query.to, - metricTypes: query.metricTypes, - dataStreams: query.dataStreams, - }, + body: JSON.stringify({ + from: body.from, + to: body.to, + metricTypes: body.metricTypes, + dataStreams: body.dataStreams, + }), }); }, }); diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.ts b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.ts index 5bf3008ef668a..0013102f697fb 100644 --- a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.ts +++ b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics.ts @@ -17,7 +17,7 @@ export const registerUsageMetricsRoute = ( ) => { if (dataUsageContext.serverConfig.enabled) { router.versioned - .get({ + .post({ access: 'internal', path: DATA_USAGE_METRICS_API_ROUTE, }) @@ -25,7 +25,9 @@ export const registerUsageMetricsRoute = ( { version: '1', validate: { - request: UsageMetricsRequestSchema, + request: { + body: UsageMetricsRequestSchema, + }, response: { 200: UsageMetricsResponseSchema, }, diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts index 6f992c9fb2a38..09e9f88721c63 100644 --- a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts +++ b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts @@ -9,8 +9,10 @@ import { RequestHandler } from '@kbn/core/server'; import { IndicesGetDataStreamResponse } from '@elastic/elasticsearch/lib/api/types'; import { MetricTypes, + UsageMetricsAutoOpsResponseSchema, + UsageMetricsAutoOpsResponseSchemaBody, UsageMetricsRequestSchemaQueryParams, - UsageMetricsResponseSchema, + UsageMetricsResponseSchemaBody, } from '../../../common/rest_types'; import { DataUsageContext, DataUsageRequestHandlerContext } from '../../types'; @@ -34,45 +36,26 @@ export const getUsageMetricsHandler = ( const core = await context.core; const esClient = core.elasticsearch.client.asCurrentUser; - // @ts-ignore - const { from, to, metricTypes, dataStreams: dsNames, size } = request.query; + const { from, to, metricTypes, dataStreams: requestDsNames } = request.query; logger.debug(`Retrieving usage metrics`); const { data_streams: dataStreamsResponse }: IndicesGetDataStreamResponse = await esClient.indices.getDataStream({ - name: '*', + name: requestDsNames, expand_wildcards: 'all', }); - const hasDataStreams = dataStreamsResponse.length > 0; - let userDsNames: string[] = []; - - if (dsNames?.length) { - userDsNames = typeof dsNames === 'string' ? [dsNames] : dsNames; - } else if (!userDsNames.length && hasDataStreams) { - userDsNames = dataStreamsResponse.map((ds) => ds.name); - } - - // If no data streams are found, return an empty response - if (!userDsNames.length) { - return response.ok({ - body: { - metrics: {}, - }, - }); - } - const metrics = await fetchMetricsFromAutoOps({ from, to, metricTypes: formatStringParams(metricTypes) as MetricTypes[], - dataStreams: formatStringParams(userDsNames), + dataStreams: formatStringParams(dataStreamsResponse.map((ds) => ds.name)), }); + const processedMetrics = transformMetricsData(metrics); + return response.ok({ - body: { - metrics, - }, + body: processedMetrics, }); } catch (error) { logger.error(`Error retrieving usage metrics: ${error.message}`); @@ -94,7 +77,7 @@ const fetchMetricsFromAutoOps = async ({ }) => { // TODO: fetch data from autoOps using userDsNames /* - const response = await axios.post('https://api.auto-ops.{region}.{csp}.cloud.elastic.co/monitoring/serverless/v1/projects/{project_id}/metrics', { + const response = await axios.post({AUTOOPS_URL}, { from: Date.parse(from), to: Date.parse(to), metric_types: metricTypes, @@ -231,7 +214,25 @@ const fetchMetricsFromAutoOps = async ({ }, }; // Make sure data is what we expect - const validatedData = UsageMetricsResponseSchema.body().validate(mockData); + const validatedData = UsageMetricsAutoOpsResponseSchema.body().validate(mockData); - return validatedData.metrics; + return validatedData; }; +function transformMetricsData( + data: UsageMetricsAutoOpsResponseSchemaBody +): UsageMetricsResponseSchemaBody { + return { + metrics: Object.fromEntries( + Object.entries(data.metrics).map(([metricType, series]) => [ + metricType, + series.map((metricSeries) => ({ + name: metricSeries.name, + data: (metricSeries.data as Array<[number, number]>).map(([timestamp, value]) => ({ + x: timestamp, + y: value, + })), + })), + ]) + ), + }; +} From eefabb0f534234d6c2c0e3468bbdc65a16009e93 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 10 Oct 2024 22:00:38 +0200 Subject: [PATCH 19/22] ci(bump automation): bump ubi9 for ironbank (#191660) --- .github/updatecli/values.d/ironbank.yml | 2 + .github/updatecli/values.d/scm.yml | 11 ++++++ .../updatecli/values.d/updatecli-compose.yml | 3 ++ .github/workflows/updatecli-compose.yml | 38 +++++++++++++++++++ src/dev/precommit_hook/casing_check_config.js | 3 ++ updatecli-compose.yaml | 14 +++++++ 6 files changed, 71 insertions(+) create mode 100644 .github/updatecli/values.d/ironbank.yml create mode 100644 .github/updatecli/values.d/scm.yml create mode 100644 .github/updatecli/values.d/updatecli-compose.yml create mode 100644 .github/workflows/updatecli-compose.yml create mode 100644 updatecli-compose.yaml diff --git a/.github/updatecli/values.d/ironbank.yml b/.github/updatecli/values.d/ironbank.yml new file mode 100644 index 0000000000000..fd1134eda376a --- /dev/null +++ b/.github/updatecli/values.d/ironbank.yml @@ -0,0 +1,2 @@ +config: + - path: src/dev/build/tasks/os_packages/docker_generator/templates/ironbank \ No newline at end of file diff --git a/.github/updatecli/values.d/scm.yml b/.github/updatecli/values.d/scm.yml new file mode 100644 index 0000000000000..34d902fb389d5 --- /dev/null +++ b/.github/updatecli/values.d/scm.yml @@ -0,0 +1,11 @@ +scm: + enabled: true + owner: elastic + repository: kibana + branch: main + commitusingapi: true + # begin updatecli-compose policy values + user: kibanamachine + email: 42973632+kibanamachine@users.noreply.github.com + # end updatecli-compose policy values + diff --git a/.github/updatecli/values.d/updatecli-compose.yml b/.github/updatecli/values.d/updatecli-compose.yml new file mode 100644 index 0000000000000..02df609f2a30c --- /dev/null +++ b/.github/updatecli/values.d/updatecli-compose.yml @@ -0,0 +1,3 @@ +spec: + files: + - "updatecli-compose.yaml" \ No newline at end of file diff --git a/.github/workflows/updatecli-compose.yml b/.github/workflows/updatecli-compose.yml new file mode 100644 index 0000000000000..cbab42d3a63b1 --- /dev/null +++ b/.github/workflows/updatecli-compose.yml @@ -0,0 +1,38 @@ +--- +name: updatecli-compose + +on: + workflow_dispatch: + schedule: + - cron: '0 6 * * *' + +permissions: + contents: read + +jobs: + compose: + runs-on: ubuntu-latest + permissions: + contents: write + packages: read + pull-requests: write + steps: + - uses: actions/checkout@v4 + + - uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: elastic/oblt-actions/updatecli/run@v1 + with: + command: --experimental compose diff + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: elastic/oblt-actions/updatecli/run@v1 + with: + command: --experimental compose apply + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 2eaeb64f8be5f..3572781c4b262 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -87,6 +87,9 @@ export const IGNORE_FILE_GLOBS = [ // Support for including http-client.env.json configurations '**/http-client.env.json', + + // updatecli configuration for driving the UBI/Ironbank image updates + 'updatecli-compose.yaml', ]; /** diff --git a/updatecli-compose.yaml b/updatecli-compose.yaml new file mode 100644 index 0000000000000..8ad9bd6df8afb --- /dev/null +++ b/updatecli-compose.yaml @@ -0,0 +1,14 @@ +# Config file for `updatecli compose ...`. +# https://www.updatecli.io/docs/core/compose/ +policies: + - name: Handle ironbank bumps + policy: ghcr.io/elastic/oblt-updatecli-policies/ironbank/templates:0.3.0@sha256:b0c841d8fb294e6b58359462afbc83070dca375ac5dd0c5216c8926872a98bb1 + values: + - .github/updatecli/values.d/scm.yml + - .github/updatecli/values.d/ironbank.yml + + - name: Update Updatecli policies + policy: ghcr.io/updatecli/policies/autodiscovery/updatecli:0.4.0@sha256:254367f5b1454fd6032b88b314450cd3b6d5e8d5b6c953eb242a6464105eb869 + values: + - .github/updatecli/values.d/scm.yml + - .github/updatecli/values.d/updatecli-compose.yml \ No newline at end of file From 84d6899a4f2f97e0d015e733cc20064b43636154 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Thu, 10 Oct 2024 21:20:50 +0100 Subject: [PATCH 20/22] [Security Solution][Detection Engine] removes feature flag for logged requests for preview (#195569) ## Summary - removes feature flag for logged requests for preview --- .../common/experimental_features.ts | 5 ----- .../components/rule_preview/index.test.tsx | 21 ------------------- .../components/rule_preview/index.tsx | 6 +----- .../config/ess/config.base.ts | 1 - .../configs/serverless.config.ts | 1 - .../execution_logic/eql.ts | 3 +-- .../execution_logic/esql.ts | 3 +-- .../test/security_solution_cypress/config.ts | 1 - .../detection_engine/rule_edit/preview.cy.ts | 5 ----- .../serverless_config.ts | 1 - 10 files changed, 3 insertions(+), 44 deletions(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 1ae20af759611..1e5ffee50afc7 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -138,11 +138,6 @@ export const allowedExperimentalValues = Object.freeze({ */ esqlRulesDisabled: false, - /** - * enables logging requests during rule preview - */ - loggingRequestsEnabled: false, - /** * Enables Protection Updates tab in the Endpoint Policy Details page */ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.test.tsx index 4ebb460177476..25d5b90d5408a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.test.tsx @@ -23,7 +23,6 @@ import { stepDefineDefaultValue, } from '../../../../detections/pages/detection_engine/rules/utils'; import { usePreviewInvocationCount } from './use_preview_invocation_count'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; jest.mock('../../../../common/lib/kibana'); jest.mock('./use_preview_route'); @@ -40,7 +39,6 @@ jest.mock('../../../../common/hooks/use_experimental_features', () => ({ useIsExperimentalFeatureEnabled: jest.fn(), })); -const useIsExperimentalFeatureEnabledMock = useIsExperimentalFeatureEnabled as jest.Mock; // rule types that do not support logged requests const doNotSupportLoggedRequests: Type[] = [ 'threshold', @@ -114,8 +112,6 @@ describe('PreviewQuery', () => { }); (usePreviewInvocationCount as jest.Mock).mockReturnValue({ invocationCount: 500 }); - - useIsExperimentalFeatureEnabledMock.mockReturnValue(true); }); afterEach(() => { @@ -172,23 +168,6 @@ describe('PreviewQuery', () => { }); }); - supportLoggedRequests.forEach((ruleType) => { - test(`does not render "Show Elasticsearch requests" for ${ruleType} rule type when feature is disabled`, () => { - useIsExperimentalFeatureEnabledMock.mockReturnValue(false); - - render( - - - - ); - - expect(screen.queryByTestId('show-elasticsearch-requests')).toBeNull(); - }); - }); - doNotSupportLoggedRequests.forEach((ruleType) => { test(`does not render "Show Elasticsearch requests" for ${ruleType} rule type`, () => { render( diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx index 2a86600d94e7a..f941cad91d3a4 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx @@ -40,7 +40,6 @@ import type { TimeframePreviewOptions, } from '../../../../detections/pages/detection_engine/rules/types'; import { usePreviewInvocationCount } from './use_preview_invocation_count'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; export const REASONABLE_INVOCATION_COUNT = 200; @@ -90,8 +89,6 @@ const RulePreviewComponent: React.FC = ({ const { indexPattern, ruleType } = defineRuleData; const { spaces } = useKibana().services; - const isLoggingRequestsFeatureEnabled = useIsExperimentalFeatureEnabled('loggingRequestsEnabled'); - const [spaceId, setSpaceId] = useState(''); useEffect(() => { if (spaces) { @@ -282,8 +279,7 @@ const RulePreviewComponent: React.FC = ({ - {isLoggingRequestsFeatureEnabled && - RULE_TYPES_SUPPORTING_LOGGED_REQUESTS.includes(ruleType) ? ( + {RULE_TYPES_SUPPORTING_LOGGED_REQUESTS.includes(ruleType) ? ( diff --git a/x-pack/test/security_solution_api_integration/config/ess/config.base.ts b/x-pack/test/security_solution_api_integration/config/ess/config.base.ts index 3ab6d5059fd07..a0d2ee79a7b46 100644 --- a/x-pack/test/security_solution_api_integration/config/ess/config.base.ts +++ b/x-pack/test/security_solution_api_integration/config/ess/config.base.ts @@ -82,7 +82,6 @@ export function createTestConfig(options: CreateTestConfigOptions, testFiles?: s '--xpack.ruleRegistry.unsafe.legacyMultiTenancy.enabled=true', `--xpack.securitySolution.enableExperimental=${JSON.stringify([ 'previewTelemetryUrlEnabled', - 'loggingRequestsEnabled', 'riskScoringPersistence', 'riskScoringRoutesEnabled', ])}`, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/configs/serverless.config.ts index ce949d5cc23fc..137ee1f67b9b3 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/configs/serverless.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/configs/serverless.config.ts @@ -17,6 +17,5 @@ export default createTestConfig({ 'testing_ignored.constant', '/testing_regex*/', ])}`, // See tests within the file "ignore_fields.ts" which use these values in "alertIgnoreFields" - `--xpack.securitySolution.enableExperimental=${JSON.stringify(['loggingRequestsEnabled'])}`, ], }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts index aff2ccc6bccb3..9077873274fa5 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql.ts @@ -1190,8 +1190,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - // skipped on MKI since feature flags are not supported there - describe('@skipInServerlessMKI preview logged requests', () => { + describe('preview logged requests', () => { it('should not return requests property when not enabled', async () => { const { logs } = await previewRule({ supertest, diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts index 166a62b9b08ad..ee976de14186d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts @@ -1409,8 +1409,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - // skipped on MKI since feature flags are not supported there - describe('@skipInServerlessMKI preview logged requests', () => { + describe('preview logged requests', () => { let rule: EsqlRuleCreateProps; let id: string; beforeEach(async () => { diff --git a/x-pack/test/security_solution_cypress/config.ts b/x-pack/test/security_solution_cypress/config.ts index 05bc2e381527a..f02968945087d 100644 --- a/x-pack/test/security_solution_cypress/config.ts +++ b/x-pack/test/security_solution_cypress/config.ts @@ -44,7 +44,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { // See https://github.com/elastic/kibana/pull/125396 for details '--xpack.alerting.rules.minimumScheduleInterval.value=1s', '--xpack.ruleRegistry.unsafe.legacyMultiTenancy.enabled=true', - `--xpack.securitySolution.enableExperimental=${JSON.stringify(['loggingRequestsEnabled'])}`, // mock cloud to enable the guided onboarding tour in e2e tests '--xpack.cloud.id=test', `--home.disableWelcomeScreen=true`, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/preview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/preview.cy.ts index c2e41c9d4680c..268968c76ecc0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/preview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/preview.cy.ts @@ -33,11 +33,6 @@ describe( 'Detection rules, preview', { tags: ['@ess', '@serverless'], - env: { - kbnServerArgs: [ - `--xpack.securitySolution.enableExperimental=${JSON.stringify(['loggingRequestsEnabled'])}`, - ], - }, }, () => { beforeEach(() => { diff --git a/x-pack/test/security_solution_cypress/serverless_config.ts b/x-pack/test/security_solution_cypress/serverless_config.ts index 71a63b697187f..f3f04dda79dbb 100644 --- a/x-pack/test/security_solution_cypress/serverless_config.ts +++ b/x-pack/test/security_solution_cypress/serverless_config.ts @@ -34,7 +34,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { { product_line: 'endpoint', product_tier: 'complete' }, { product_line: 'cloud', product_tier: 'complete' }, ])}`, - `--xpack.securitySolution.enableExperimental=${JSON.stringify(['loggingRequestsEnabled'])}`, '--csp.strict=false', '--csp.warnLegacyBrowsers=false', ], From 4df2d9f068445d3606a0cea58be6c32e00721d3f Mon Sep 17 00:00:00 2001 From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Thu, 10 Oct 2024 22:22:23 +0200 Subject: [PATCH 21/22] [ES|QL] Add pretty-printing support for list literals (#195383) ## Summary Closes https://github.com/elastic/kibana/issues/194840 This PR add pretty-printing support for list literal expressions. For example, this query: ``` ROW ["..............................................", "..............................................", ".............................................."] ``` will be formatted as so: ``` ROW [ "..............................................", "..............................................", ".............................................."] ``` ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) Co-authored-by: Stratoula Kalafateli --- .../__tests__/wrapping_pretty_printer.test.ts | 79 +++++++++++++++++++ .../pretty_print/wrapping_pretty_printer.ts | 23 +++--- packages/kbn-esql-ast/src/types.ts | 1 + packages/kbn-esql-ast/src/visitor/contexts.ts | 12 ++- packages/kbn-esql-ast/src/visitor/utils.ts | 31 +++++++- 5 files changed, 132 insertions(+), 14 deletions(-) diff --git a/packages/kbn-esql-ast/src/pretty_print/__tests__/wrapping_pretty_printer.test.ts b/packages/kbn-esql-ast/src/pretty_print/__tests__/wrapping_pretty_printer.test.ts index 21330d0fea3b1..2dfe239ce5b88 100644 --- a/packages/kbn-esql-ast/src/pretty_print/__tests__/wrapping_pretty_printer.test.ts +++ b/packages/kbn-esql-ast/src/pretty_print/__tests__/wrapping_pretty_printer.test.ts @@ -593,6 +593,85 @@ ROW (asdf + asdf)::string, 1.2::string, "1234"::integer, (12321342134 + 23412341 - "aaaaaaaaaaa")::boolean`); }); }); + + describe('list literals', () => { + describe('numeric', () => { + test('wraps long list literals one line', () => { + const query = + 'ROW [1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890]'; + const text = reprint(query).text; + + expect('\n' + text).toBe(` +ROW + [1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890]`); + }); + + test('wraps long list literals to multiple lines one line', () => { + const query = `ROW [1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890]`; + const text = reprint(query).text; + + expect('\n' + text).toBe(` +ROW + [1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, 1234567890, + 1234567890, 1234567890, 1234567890]`); + }); + + test('breaks very long values one-per-line', () => { + const query = `ROW fn1(fn2(fn3(fn4(fn5(fn6(fn7(fn8([1234567890, 1234567890, 1234567890, 1234567890, 1234567890]))))))))`; + const text = reprint(query, { wrap: 40 }).text; + + expect('\n' + text).toBe(` +ROW + FN1( + FN2( + FN3( + FN4( + FN5( + FN6( + FN7( + FN8( + [ + 1234567890, + 1234567890, + 1234567890, + 1234567890, + 1234567890]))))))))`); + }); + }); + + describe('string', () => { + test('wraps long list literals one line', () => { + const query = + 'ROW ["some text", "another text", "one more text literal", "and another one", "and one more", "and one more", "and one more", "and one more", "and one more"]'; + const text = reprint(query).text; + + expect('\n' + text).toBe(` +ROW + ["some text", "another text", "one more text literal", "and another one", + "and one more", "and one more", "and one more", "and one more", + "and one more"]`); + }); + + test('can break very long strings per line', () => { + const query = + 'ROW ["..............................................", "..............................................", ".............................................."]'; + const text = reprint(query).text; + + expect('\n' + text).toBe(` +ROW + [ + "..............................................", + "..............................................", + ".............................................."]`); + }); + }); + }); }); test.todo('Idempotence on multiple times pretty printing'); diff --git a/packages/kbn-esql-ast/src/pretty_print/wrapping_pretty_printer.ts b/packages/kbn-esql-ast/src/pretty_print/wrapping_pretty_printer.ts index fde7f60a1dba5..91f65a389f0c3 100644 --- a/packages/kbn-esql-ast/src/pretty_print/wrapping_pretty_printer.ts +++ b/packages/kbn-esql-ast/src/pretty_print/wrapping_pretty_printer.ts @@ -15,9 +15,10 @@ import { CommandVisitorContext, ExpressionVisitorContext, FunctionCallExpressionVisitorContext, + ListLiteralExpressionVisitorContext, Visitor, } from '../visitor'; -import { singleItems } from '../visitor/utils'; +import { children, singleItems } from '../visitor/utils'; import { BasicPrettyPrinter, BasicPrettyPrinterOptions } from './basic_pretty_printer'; import { getPrettyPrintStats } from './helpers'; import { LeafPrinter } from './leaf_printer'; @@ -235,7 +236,11 @@ export class WrappingPrettyPrinter { } private printArguments( - ctx: CommandVisitorContext | CommandOptionVisitorContext | FunctionCallExpressionVisitorContext, + ctx: + | CommandVisitorContext + | CommandOptionVisitorContext + | FunctionCallExpressionVisitorContext + | ListLiteralExpressionVisitorContext, inp: Input ) { let txt = ''; @@ -247,7 +252,7 @@ export class WrappingPrettyPrinter { let remainingCurrentLine = inp.remaining; let oneArgumentPerLine = false; - for (const child of singleItems(ctx.node.args)) { + for (const child of children(ctx.node)) { if (getPrettyPrintStats(child).hasLineBreakingDecorations) { oneArgumentPerLine = true; break; @@ -489,13 +494,11 @@ export class WrappingPrettyPrinter { }) .on('visitListLiteralExpression', (ctx, inp: Input): Output => { - let elements = ''; - - for (const out of ctx.visitElements(inp)) { - elements += (elements ? ', ' : '') + out.txt; - } - - const formatted = `[${elements}]${inp.suffix ?? ''}`; + const args = this.printArguments(ctx, { + indent: inp.indent, + remaining: inp.remaining - 1, + }); + const formatted = `[${args.txt}]${inp.suffix ?? ''}`; const { txt, indented } = this.decorateWithComments(inp.indent, ctx.node, formatted); return { txt, indented }; diff --git a/packages/kbn-esql-ast/src/types.ts b/packages/kbn-esql-ast/src/types.ts index 0ca48b2326f7d..1bac6e0cff5b3 100644 --- a/packages/kbn-esql-ast/src/types.ts +++ b/packages/kbn-esql-ast/src/types.ts @@ -40,6 +40,7 @@ export type ESQLAstField = ESQLFunction | ESQLColumn; export type ESQLAstItem = ESQLSingleAstItem | ESQLAstItem[]; export type ESQLAstNodeWithArgs = ESQLCommand | ESQLCommandOption | ESQLFunction; +export type ESQLAstNodeWithChildren = ESQLAstNodeWithArgs | ESQLList; /** * *Proper* are nodes which are objects with `type` property, once we get rid diff --git a/packages/kbn-esql-ast/src/visitor/contexts.ts b/packages/kbn-esql-ast/src/visitor/contexts.ts index 0f637962b7ddd..4b4f04fdca4bb 100644 --- a/packages/kbn-esql-ast/src/visitor/contexts.ts +++ b/packages/kbn-esql-ast/src/visitor/contexts.ts @@ -12,11 +12,12 @@ // and makes it harder to understand the code structure. import { type GlobalVisitorContext, SharedData } from './global_visitor_context'; -import { firstItem, singleItems } from './utils'; +import { children, firstItem, singleItems } from './utils'; import type { ESQLAstCommand, ESQLAstItem, ESQLAstNodeWithArgs, + ESQLAstNodeWithChildren, ESQLAstRenameExpression, ESQLColumn, ESQLCommandOption, @@ -47,6 +48,11 @@ import { Builder } from '../builder'; const isNodeWithArgs = (x: unknown): x is ESQLAstNodeWithArgs => !!x && typeof x === 'object' && Array.isArray((x as any).args); +const isNodeWithChildren = (x: unknown): x is ESQLAstNodeWithChildren => + !!x && + typeof x === 'object' && + (Array.isArray((x as any).args) || Array.isArray((x as any).values)); + export class VisitorContext< Methods extends VisitorMethods = VisitorMethods, Data extends SharedData = SharedData, @@ -99,13 +105,13 @@ export class VisitorContext< public arguments(): ESQLAstExpressionNode[] { const node = this.node; - if (!isNodeWithArgs(node)) { + if (!isNodeWithChildren(node)) { return []; } const args: ESQLAstExpressionNode[] = []; - for (const arg of singleItems(node.args)) { + for (const arg of children(node)) { args.push(arg); } diff --git a/packages/kbn-esql-ast/src/visitor/utils.ts b/packages/kbn-esql-ast/src/visitor/utils.ts index 2e54a89c2bf52..0dc95b73cf9d7 100644 --- a/packages/kbn-esql-ast/src/visitor/utils.ts +++ b/packages/kbn-esql-ast/src/visitor/utils.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ESQLAstItem, ESQLSingleAstItem } from '../types'; +import { ESQLAstItem, ESQLProperNode, ESQLSingleAstItem } from '../types'; /** * Normalizes AST "item" list to only contain *single* items. @@ -48,3 +48,32 @@ export const lastItem = (items: ESQLAstItem[]): ESQLSingleAstItem | undefined => if (Array.isArray(last)) return lastItem(last as ESQLAstItem[]); return last as ESQLSingleAstItem; }; + +export function* children(node: ESQLProperNode): Iterable { + switch (node.type) { + case 'function': + case 'command': + case 'option': { + for (const arg of singleItems(node.args)) { + yield arg; + } + break; + } + case 'list': { + for (const item of singleItems(node.values)) { + yield item; + } + break; + } + case 'inlineCast': { + if (Array.isArray(node.value)) { + for (const item of singleItems(node.value)) { + yield item; + } + } else { + yield node.value; + } + break; + } + } +} From 3974845d24c16d6d9da91d00ad3d2a226ac457bf Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Thu, 10 Oct 2024 22:29:36 +0200 Subject: [PATCH 22/22] [Security Solution] - skipping CSP Cypress test failing on MKI (#195794) ## Summary This PR is skipping a CSP test that is failing on MKI (see failing [build](https://buildkite.com/elastic/kibana-serverless-security-solution-quality-gate-investigations/builds/1390#01927579-caed-41bc-9440-3cf29629a263)) The CSP tests are currently under the `expandable_flyout` folder own by the @elastic/security-threat-hunting-investigations team. This is temporary until the CSP has the time to create their own folder and all the associated scripts for CI to run. --- .../expandable_flyout/vulnerabilities_contextual_flyout.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/vulnerabilities_contextual_flyout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/vulnerabilities_contextual_flyout.cy.ts index 591d458af56c1..fb83df1c79141 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/vulnerabilities_contextual_flyout.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/vulnerabilities_contextual_flyout.cy.ts @@ -138,7 +138,8 @@ const deleteDataStream = () => { }); }; -describe('Alert Host details expandable flyout', { tags: ['@ess', '@serverless'] }, () => { +// skipping because failure on MKI environment (https://buildkite.com/elastic/kibana-serverless-security-solution-quality-gate-investigations/builds/1390#01927579-caed-41bc-9440-3cf29629a263) +describe.skip('Alert Host details expandable flyout', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteAlertsAndRules(); login();