From 15e55986dd3cdfc7016737242cdd87e172335e6c Mon Sep 17 00:00:00 2001 From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Wed, 24 Apr 2024 04:07:11 +0200 Subject: [PATCH 01/82] [Reporting] Limit report document chunk size to 4MB (#181395) ## Summary Closes https://github.com/elastic/kibana/issues/180829 ### 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: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/lib/content_stream.test.ts | 8 +-- .../reporting/server/lib/content_stream.ts | 63 ++++--------------- 2 files changed, 13 insertions(+), 58 deletions(-) diff --git a/x-pack/plugins/reporting/server/lib/content_stream.test.ts b/x-pack/plugins/reporting/server/lib/content_stream.test.ts index 288d528c722bf..d4f179c5c9359 100644 --- a/x-pack/plugins/reporting/server/lib/content_stream.test.ts +++ b/x-pack/plugins/reporting/server/lib/content_stream.test.ts @@ -280,9 +280,7 @@ describe('ContentStream', () => { }); it('should split raw data into chunks', async () => { - client.cluster.getSettings.mockResponseOnce( - set({}, 'defaults.http.max_content_length', 1028) - ); + stream.chunkSize = 2; stream.end('123456'); await new Promise((resolve) => stream.once('finish', resolve)); @@ -322,9 +320,7 @@ describe('ContentStream', () => { }); it('should encode every chunk separately', async () => { - client.cluster.getSettings.mockResponseOnce( - set({}, 'defaults.http.max_content_length', 1028) - ); + base64Stream.chunkSize = 3; base64Stream.end('12345678'); await new Promise((resolve) => base64Stream.once('finish', resolve)); diff --git a/x-pack/plugins/reporting/server/lib/content_stream.ts b/x-pack/plugins/reporting/server/lib/content_stream.ts index 0be61705d84b5..17362516d2c9d 100644 --- a/x-pack/plugins/reporting/server/lib/content_stream.ts +++ b/x-pack/plugins/reporting/server/lib/content_stream.ts @@ -5,22 +5,15 @@ * 2.0. */ -import { defaults, get } from 'lodash'; import { Duplex } from 'stream'; import { v4 as uuidv4 } from 'uuid'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { ByteSizeValue } from '@kbn/config-schema'; import type { ElasticsearchClient, Logger } from '@kbn/core/server'; import type { ReportSource } from '@kbn/reporting-common/types'; import type { ReportingCore } from '..'; -/** - * @note The Elasticsearch `http.max_content_length` is including the whole POST body. - * But the update/index request also contains JSON-serialized query parameters. - * 1Kb span should be enough for that. - */ -const REQUEST_SPAN_SIZE_IN_BYTES = 1024; +const ONE_MB = 1024 * 1024; type Callback = (error?: Error) => void; type SearchRequest = estypes.SearchRequest; @@ -52,21 +45,6 @@ interface ContentStreamParameters { } export class ContentStream extends Duplex { - /** - * @see https://en.wikipedia.org/wiki/Base64#Output_padding - */ - private static getMaxBase64EncodedSize(max: number) { - return Math.floor(max / 4) * 3; - } - - /** - * @note Raw data might be escaped during JSON serialization. - * In the worst-case, every character is escaped, so the max raw data length is twice less. - */ - private static getMaxJsonEscapedSize(max: number) { - return Math.floor(max / 2); - } - private buffers: Buffer[] = []; private bytesBuffered = 0; @@ -74,7 +52,6 @@ export class ContentStream extends Duplex { private chunksRead = 0; private chunksWritten = 0; private jobSize?: number; - private maxChunkSize?: number; private parameters: Required; private primaryTerm?: number; private seqNo?: number; @@ -85,6 +62,14 @@ export class ContentStream extends Duplex { */ bytesWritten = 0; + /** + * The chunking size of reporting files. Larger CSV files will be split into + * multiple documents, where the stream is chunked into pieces of approximately + * this size. The actual document size will be slightly larger due to Base64 + * encoding and JSON metadata. + */ + chunkSize = 4 * ONE_MB; + constructor( private client: ElasticsearchClient, private logger: Logger, @@ -103,30 +88,6 @@ export class ContentStream extends Duplex { return buffer.toString(this.parameters.encoding === 'base64' ? 'base64' : undefined); } - private async getMaxContentSize() { - const body = await this.client.cluster.getSettings({ include_defaults: true }); - const { persistent, transient, defaults: defaultSettings } = body; - const settings = defaults({}, persistent, transient, defaultSettings); - const maxContentSize = get(settings, 'http.max_content_length', '100mb'); - - return ByteSizeValue.parse(maxContentSize).getValueInBytes(); - } - - private async getMaxChunkSize() { - if (!this.maxChunkSize) { - const maxContentSize = (await this.getMaxContentSize()) - REQUEST_SPAN_SIZE_IN_BYTES; - - this.maxChunkSize = - this.parameters.encoding === 'base64' - ? ContentStream.getMaxBase64EncodedSize(maxContentSize) - : ContentStream.getMaxJsonEscapedSize(maxContentSize); - - this.logger.debug(`Chunk size is ${this.maxChunkSize} bytes.`); - } - - return this.maxChunkSize; - } - private async readHead() { const { id, index } = this.document; const body: SearchRequest['body'] = { @@ -306,10 +267,8 @@ export class ContentStream extends Duplex { } private async flushAllFullChunks() { - const maxChunkSize = await this.getMaxChunkSize(); - - while (this.bytesBuffered >= maxChunkSize && this.buffers.length) { - await this.flush(maxChunkSize); + while (this.bytesBuffered >= this.chunkSize && this.buffers.length) { + await this.flush(this.chunkSize); } } From bdac77d3203cc41a89074b32de689050b559da0b Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Wed, 24 Apr 2024 08:36:45 +0200 Subject: [PATCH 02/82] [Discover] Fix time range filters for CSV when a relative time filter is specified in UI (#181067) - Closes https://github.com/elastic/kibana/issues/181061 ## Summary `searchSource` got polluted during UI rendering and then it was used for CSV generation again. It resulted in the redundant relative time range filter next to the absolute time range filter. Now only absolute time range filter will be present. ### 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 --- .../public/utils/get_sharing_data.test.ts | 109 +++++++++++++++++- .../discover/public/utils/get_sharing_data.ts | 14 ++- 2 files changed, 113 insertions(+), 10 deletions(-) diff --git a/src/plugins/discover/public/utils/get_sharing_data.test.ts b/src/plugins/discover/public/utils/get_sharing_data.test.ts index a0c7581fd9419..473c31ff09453 100644 --- a/src/plugins/discover/public/utils/get_sharing_data.test.ts +++ b/src/plugins/discover/public/utils/get_sharing_data.test.ts @@ -7,9 +7,9 @@ */ import { Capabilities, IUiSettingsClient } from '@kbn/core/public'; +import { FilterStateStore, RangeFilter } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { DiscoverServices } from '../build_services'; -import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { createSearchSourceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { DOC_HIDE_TIME_COLUMN_SETTING, @@ -17,14 +17,16 @@ import { SEARCH_FIELDS_FROM_SOURCE, } from '@kbn/discover-utils'; import { buildDataViewMock, dataViewMock } from '@kbn/discover-utils/src/__mocks__'; +import { createDiscoverServicesMock } from '../__mocks__/services'; import { getSharingData, showPublicUrlSwitch } from './get_sharing_data'; describe('getSharingData', () => { let services: DiscoverServices; beforeEach(() => { + const discoverServiceMock = createDiscoverServicesMock(); services = { - data: dataPluginMock.createStartContract(), + ...discoverServiceMock, uiSettings: { get: (key: string) => { if (key === SEARCH_FIELDS_FROM_SOURCE) { @@ -38,8 +40,8 @@ describe('getSharingData', () => { } return false; }, - }, - } as DiscoverServices; + } as IUiSettingsClient, + }; }); test('returns valid data for sharing', async () => { @@ -303,6 +305,105 @@ describe('getSharingData', () => { } `); }); + + test('getSearchSource works correctly', async () => { + const searchSourceMock = createSearchSourceMock({ index: dataViewMock }); + const appFilter = { + $state: { + store: FilterStateStore.APP_STATE, + }, + meta: { + alias: null, + disabled: false, + index: dataViewMock.id, + key: 'extension.keyword', + negate: false, + params: { + query: 'zip', + }, + type: 'phrase', + }, + query: { + match_phrase: { + 'extension.keyword': 'zip', + }, + }, + }; + const absoluteTimeFilter = { + meta: { + index: dataViewMock.id, + params: {}, + field: 'timestamp', + type: 'range', + }, + query: { + range: { + timestamp: { + format: 'strict_date_optional_time', + gte: '2024-04-18T12:07:56.713Z', + lte: '2024-04-18T12:22:56.713Z', + }, + }, + }, + } as RangeFilter; + const relativeTimeFilter = { + meta: { + index: dataViewMock.id, + params: {}, + field: 'timestamp', + type: 'range', + }, + query: { + range: { + timestamp: { + format: 'strict_date_optional_time', + gte: 'now-15m', + lte: 'now', + }, + }, + }, + } as RangeFilter; + searchSourceMock.setField('filter', [appFilter]); + const servicesMock = createDiscoverServicesMock(); + servicesMock.data.query.timefilter.timefilter.createFilter = jest.fn(() => absoluteTimeFilter); + servicesMock.data.query.timefilter.timefilter.createRelativeFilter = jest.fn( + () => relativeTimeFilter + ); + + // with app filters as an array + const result = await getSharingData( + searchSourceMock, + { + columns: ['cool-field-1'], + }, + servicesMock + ); + expect( + result.getSearchSource({ addGlobalTimeFilter: true, absoluteTime: false }).filter + ).toEqual([relativeTimeFilter, appFilter]); + expect( + result.getSearchSource({ addGlobalTimeFilter: true, absoluteTime: true }).filter + ).toEqual([absoluteTimeFilter, appFilter]); + expect( + result.getSearchSource({ addGlobalTimeFilter: false, absoluteTime: false }).filter + ).toEqual([appFilter]); + expect( + result.getSearchSource({ addGlobalTimeFilter: false, absoluteTime: true }).filter + ).toEqual([appFilter]); + + // with app filter as a single filter and the same as the absolute time filter + searchSourceMock.setField('filter', absoluteTimeFilter); + const result2 = await getSharingData( + searchSourceMock, + { + columns: ['cool-field-1'], + }, + servicesMock + ); + expect( + result2.getSearchSource({ addGlobalTimeFilter: true, absoluteTime: true }).filter + ).toEqual([absoluteTimeFilter]); + }); }); describe('showPublicUrlSwitch', () => { diff --git a/src/plugins/discover/public/utils/get_sharing_data.ts b/src/plugins/discover/public/utils/get_sharing_data.ts index 9e3b2b2369469..9387053698017 100644 --- a/src/plugins/discover/public/utils/get_sharing_data.ts +++ b/src/plugins/discover/public/utils/get_sharing_data.ts @@ -39,7 +39,6 @@ export async function getSharingData( const { uiSettings, data } = services; const searchSource = currentSearchSource.createCopy(); const index = searchSource.getField('index')!; - let existingFilter = searchSource.getField('filter') as Filter[] | Filter | undefined; searchSource.setField( 'sort', @@ -50,7 +49,6 @@ export async function getSharingData( }) ); - searchSource.removeField('filter'); searchSource.removeField('highlight'); searchSource.removeField('highlightAll'); searchSource.removeField('aggs'); @@ -81,6 +79,10 @@ export async function getSharingData( addGlobalTimeFilter?: boolean; absoluteTime?: boolean; }): SerializedSearchSourceFields => { + let existingFilter = searchSource.getField('filter') as Filter[] | Filter | undefined; + const searchSourceUpdated = searchSource.createCopy(); + searchSourceUpdated.removeField('filter'); + const timeFilter = absoluteTime ? absoluteTimeFilter : relativeTimeFilter; if (addGlobalTimeFilter && timeFilter) { // remove timeFilter from existing filter @@ -102,7 +104,7 @@ export async function getSharingData( } if (existingFilter) { - searchSource.setField('filter', existingFilter); + searchSourceUpdated.setField('filter', existingFilter); } /* @@ -112,7 +114,7 @@ export async function getSharingData( */ const useFieldsApi = !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE); if (useFieldsApi) { - searchSource.removeField('fieldsFromSource'); + searchSourceUpdated.removeField('fieldsFromSource'); const fields = columns.length ? columns.map((column) => { let field = column; @@ -127,9 +129,9 @@ export async function getSharingData( }) : [{ field: '*', include_unmapped: 'true' }]; - searchSource.setField('fields', fields); + searchSourceUpdated.setField('fields', fields); } - return searchSource.getSerializedFields(true); + return searchSourceUpdated.getSerializedFields(true); }, columns, }; From 773626f67730e2167f69f9f8c6d2c60d9b834669 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 03:20:56 -0400 Subject: [PATCH 03/82] [api-docs] 2024-04-24 Daily api_docs build (#181516) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/683 --- api_docs/actions.devdocs.json | 90 ++++++-- api_docs/actions.mdx | 4 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.devdocs.json | 26 ++- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.devdocs.json | 3 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.devdocs.json | 212 ------------------ api_docs/discover.mdx | 4 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.mdx | 2 +- api_docs/kbn_esql_utils.devdocs.json | 48 ++++ api_docs/kbn_esql_utils.mdx | 4 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- .../kbn_presentation_publishing.devdocs.json | 76 +++++++ api_docs/kbn_presentation_publishing.mdx | 4 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_solution_nav_es.mdx | 2 +- api_docs/kbn_solution_nav_oblt.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 14 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 24 ++ api_docs/security_solution.mdx | 4 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 686 files changed, 922 insertions(+), 937 deletions(-) diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index 95740f00086f3..a2d636190c118 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -231,7 +231,7 @@ "section": "def-server.CaseConnector", "text": "CaseConnector" }, - " extends ", + " extends ", { "pluginId": "actions", "scope": "server", @@ -240,7 +240,8 @@ "text": "SubActionConnector" }, " implements ", - "CaseConnectorInterface" + "CaseConnectorInterface", + "" ], "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", "deprecated": false, @@ -281,6 +282,29 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "actions", + "id": "def-server.CaseConnector.Unnamed.$2", + "type": "Object", + "tags": [], + "label": "pushToServiceIncidentParamsSchema", + "description": [], + "signature": [ + "Record>" + ], + "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [] @@ -293,7 +317,7 @@ "label": "addComment", "description": [], "signature": [ - "({ incidentId, comment, }: { incidentId: string; comment: string; }) => Promise" + "({ incidentId, comment, }: { incidentId: string; comment: string; }) => Promise" ], "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", "deprecated": false, @@ -345,7 +369,7 @@ "label": "createIncident", "description": [], "signature": [ - "(incident: Record) => Promise<", + "(incident: Incident) => Promise<", "ExternalServiceIncidentResponse", ">" ], @@ -356,12 +380,12 @@ { "parentPluginId": "actions", "id": "def-server.CaseConnector.createIncident.$1", - "type": "Object", + "type": "Uncategorized", "tags": [], "label": "incident", "description": [], "signature": [ - "Record" + "Incident" ], "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", "deprecated": false, @@ -379,7 +403,7 @@ "label": "updateIncident", "description": [], "signature": [ - "({ incidentId, incident, }: { incidentId: string; incident: Record; }) => Promise<", + "({ incidentId, incident, }: { incidentId: string; incident: Incident; }) => Promise<", "ExternalServiceIncidentResponse", ">" ], @@ -412,12 +436,12 @@ { "parentPluginId": "actions", "id": "def-server.CaseConnector.updateIncident.$1.incident", - "type": "Object", + "type": "Uncategorized", "tags": [], "label": "incident", "description": [], "signature": [ - "{ [x: string]: unknown; }" + "Incident" ], "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", "deprecated": false, @@ -436,9 +460,7 @@ "label": "getIncident", "description": [], "signature": [ - "({ id }: { id: string; }) => Promise<", - "ExternalServiceIncidentResponse", - ">" + "({ id }: { id: string; }) => Promise" ], "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", "deprecated": false, @@ -479,9 +501,7 @@ "label": "pushToService", "description": [], "signature": [ - "(params: ", - "PushToServiceParams", - ") => Promise<", + "(params: { incident: { externalId: string | null; } & Incident; comments: { commentId: string; comment: string; }[]; }) => Promise<", "PushToServiceResponse", ">" ], @@ -496,13 +516,39 @@ "tags": [], "label": "params", "description": [], - "signature": [ - "PushToServiceParams" - ], "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "children": [ + { + "parentPluginId": "actions", + "id": "def-server.CaseConnector.pushToService.$1.incident", + "type": "CompoundType", + "tags": [], + "label": "incident", + "description": [], + "signature": [ + "{ externalId: string | null; } & Incident" + ], + "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "actions", + "id": "def-server.CaseConnector.pushToService.$1.comments", + "type": "Array", + "tags": [], + "label": "comments", + "description": [], + "signature": [ + "{ commentId: string; comment: string; }[]" + ], + "path": "x-pack/plugins/actions/server/sub_action_framework/case.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "returnComment": [] @@ -3724,9 +3770,9 @@ "label": "getCaseConnectorClass", "description": [], "signature": [ - "() => ", - "IServiceAbstract", - "" + "() => ", + "ICaseServiceAbstract", + "" ], "path": "x-pack/plugins/actions/server/plugin.ts", "deprecated": false, diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 1fd7347b53a07..235eb1266444a 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 298 | 0 | 292 | 32 | +| 301 | 0 | 295 | 32 | ## Client diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 4ad58dc5c0285..9f715de756869 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 044214e705094..56c82f528294c 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index bd5c1d94c367a..36a180e2b4c3f 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 80b5ab08b9fc2..ddaf4a2a4c7f8 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 05fe4879625a3..1eabcac165064 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -273,9 +273,9 @@ "APMPluginSetupDependencies", ") => { config$: ", "Observable", - "; searchAggregatedTransactions: ", + "; }>; autoCreateApmDataView: boolean; serviceMapEnabled: boolean; serviceMapFingerprintBucketSize: number; serviceMapFingerprintGlobalBucketSize: number; serviceMapTraceIdBucketSize: number; serviceMapTraceIdGlobalBucketSize: number; serviceMapMaxTracesPerRequest: number; serviceMapTerminateAfter: number; serviceMapMaxTraces: number; ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; searchAggregatedTransactions: ", "SearchAggregatedTransactionSetting", - "; telemetryCollectionEnabled: boolean; metricsInterval: number; agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>; }" + "; telemetryCollectionEnabled: boolean; metricsInterval: number; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>; }" ], "path": "x-pack/plugins/observability_solution/apm/server/plugin.ts", "deprecated": false, @@ -448,9 +448,9 @@ "label": "APMConfig", "description": [], "signature": [ - "{ readonly enabled: boolean; readonly autoCreateApmDataView: boolean; readonly serviceMapEnabled: boolean; readonly serviceMapFingerprintBucketSize: number; readonly serviceMapFingerprintGlobalBucketSize: number; readonly serviceMapTraceIdBucketSize: number; readonly serviceMapTraceIdGlobalBucketSize: number; readonly serviceMapMaxTracesPerRequest: number; readonly serviceMapTerminateAfter: number; readonly serviceMapMaxTraces: number; readonly ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; readonly searchAggregatedTransactions: ", + "{ readonly enabled: boolean; readonly agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; readonly autoCreateApmDataView: boolean; readonly serviceMapEnabled: boolean; readonly serviceMapFingerprintBucketSize: number; readonly serviceMapFingerprintGlobalBucketSize: number; readonly serviceMapTraceIdBucketSize: number; readonly serviceMapTraceIdGlobalBucketSize: number; readonly serviceMapMaxTracesPerRequest: number; readonly serviceMapTerminateAfter: number; readonly serviceMapMaxTraces: number; readonly ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; readonly searchAggregatedTransactions: ", "SearchAggregatedTransactionSetting", - "; readonly telemetryCollectionEnabled: boolean; readonly metricsInterval: number; readonly agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; readonly forceSyntheticSource: boolean; readonly latestAgentVersionsUrl: string; readonly serverless: Readonly<{} & { enabled: true; }>; readonly serverlessOnboarding: boolean; readonly managedServiceUrl: string; readonly featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }" + "; readonly telemetryCollectionEnabled: boolean; readonly metricsInterval: number; readonly forceSyntheticSource: boolean; readonly latestAgentVersionsUrl: string; readonly serverless: Readonly<{} & { enabled: true; }>; readonly serverlessOnboarding: boolean; readonly managedServiceUrl: string; readonly featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }" ], "path": "x-pack/plugins/observability_solution/apm/server/index.ts", "deprecated": false, @@ -917,19 +917,21 @@ "StringC", "; 'container.id': ", "StringC", + "; 'kubernetes.pod.name': ", + "StringC", "; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { query: { alert_started_at: string; } & { 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; }; }; }) => Promise<{ serviceSummary?: ", + " & { params: { query: { alert_started_at: string; } & { 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; }; }; }) => Promise<{ serviceSummary?: ", "ServiceSummary", " | undefined; downstreamDependencies?: ", "APMDownstreamDependency", - "[] | undefined; logCategories: ", + "[] | undefined; logCategories?: ", "LogCategories", - "; serviceChangePoints: { title: string; changes: ", + "; serviceChangePoints?: { title: string; changes: ", "TimeseriesChangePoint", - "[]; }[]; exitSpanChangePoints: { title: string; changes: ", + "[]; }[] | undefined; exitSpanChangePoints?: { title: string; changes: ", "TimeseriesChangePoint", - "[]; }[]; anomalies: { '@timestamp': string; metricName: string; \"service.name\": string; \"service.environment\": \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + "[]; }[] | undefined; anomalies?: { '@timestamp': string; metricName: string; \"service.name\": string; \"service.environment\": \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", "; \"transaction.type\": string; anomalyScore: string | number | null; actualValue: number; expectedBoundsLower: number; expectedBoundsUpper: number; }[]; }>; } & ", + ">; \"transaction.type\": string; anomalyScore: string | number | null; actualValue: number; expectedBoundsLower: number; expectedBoundsUpper: number; }[] | undefined; }>; } & ", "APMRouteCreateOptions", "; \"POST /internal/apm/assistant/get_apm_timeseries\": { endpoint: \"POST /internal/apm/assistant/get_apm_timeseries\"; params?: ", "TypeC", @@ -7926,9 +7928,9 @@ "description": [], "signature": [ "Observable", - "; searchAggregatedTransactions: ", + "; }>; autoCreateApmDataView: boolean; serviceMapEnabled: boolean; serviceMapFingerprintBucketSize: number; serviceMapFingerprintGlobalBucketSize: number; serviceMapTraceIdBucketSize: number; serviceMapTraceIdGlobalBucketSize: number; serviceMapMaxTracesPerRequest: number; serviceMapTerminateAfter: number; serviceMapMaxTraces: number; ui: Readonly<{} & { enabled: boolean; maxTraceItems: number; }>; searchAggregatedTransactions: ", "SearchAggregatedTransactionSetting", - "; telemetryCollectionEnabled: boolean; metricsInterval: number; agent: Readonly<{} & { migrations: Readonly<{} & { enabled: boolean; }>; }>; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>" + "; telemetryCollectionEnabled: boolean; metricsInterval: number; forceSyntheticSource: boolean; latestAgentVersionsUrl: string; serverless: Readonly<{} & { enabled: true; }>; serverlessOnboarding: boolean; managedServiceUrl: string; featureFlags: Readonly<{} & { agentConfigurationAvailable: boolean; configurableIndicesAvailable: boolean; infrastructureTabAvailable: boolean; infraUiAvailable: boolean; migrationToFleetAvailable: boolean; sourcemapApiAvailable: boolean; storageExplorerAvailable: boolean; profilingIntegrationAvailable: boolean; ruleFormV2Enabled: boolean; }>; }>>" ], "path": "x-pack/plugins/observability_solution/apm/server/types.ts", "deprecated": false, diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 8665ca630783d..2f87aa59a7751 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 2e7f9cfde4693..c4c03333823c9 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 43aa7b6842f2e..3f67f06dc42a5 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index e0cb6d6fbf276..b0d31fb29446e 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index cf8b9671663fa..1d53fde562bee 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 87fa606df1ed1..f090926eb8a66 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 2d2970efadfd4..a08ec62044c1f 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 07f13bff0c33e..744434d03b9e3 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 3b886a5aa17d6..50ec3784ee51d 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 27a738e5f29de..5789a1bafec32 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 16dd20cda1b19..a08a47e4542e3 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 00132de728bcd..48ede8336aaa2 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index c876a57c2f8b5..e2c44d0c3b033 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 84efeaa26e25f..7aec6b5f42ff9 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index d2a23746cbd28..a70ac9c2e0eb1 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 306313aaa4df3..bfed4d645626e 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 6b629b09fd8be..fcf993fd83945 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index a77f98f8ac102..9026c7aaf99f6 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -1841,6 +1841,7 @@ "label": "executionContext", "description": [], "signature": [ + "{ readonly type?: string | undefined; readonly name?: string | undefined; readonly page?: string | undefined; readonly id?: string | undefined; readonly description?: string | undefined; readonly url?: string | undefined; readonly meta?: { [key: string]: string | number | boolean | undefined; } | undefined; child?: ", { "pluginId": "@kbn/core-execution-context-common", "scope": "common", @@ -1848,7 +1849,7 @@ "section": "def-common.KibanaExecutionContext", "text": "KibanaExecutionContext" }, - " | undefined" + " | undefined; }" ], "path": "src/plugins/dashboard/common/dashboard_container/types.ts", "deprecated": false, diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index ac078e4337b98..7b994dd255d7e 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index e294ac4462ae3..0677e2d4a1017 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 54ae2d29b90cd..b39328966ea9c 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 670b749777582..0e22cdc482aca 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 1aff16458a1aa..c2ff9efe3af71 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 1db1f5fb214f9..b31b991de2530 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 1ade689c92649..b7dd9d023af35 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 4b25306777b9b..26b4c6f10ed71 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index dc4c2899f3aba..24c07b0cfbf20 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 5dd35e53aaad1..fac8c97f8aa7c 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 039d4d01f504b..43bce00047f50 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 33b126ad89297..051e7415a342f 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index f676745d3a966..aae677be01c4a 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index f2ee962027da4..7b40831d1685f 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 9f0a585fe296c..ade608994ec68 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index 621887eb7825d..f0e9fcc18d422 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -662,74 +662,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverProfileOptions", - "type": "Interface", - "tags": [], - "label": "DiscoverProfileOptions", - "description": [], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "discover", - "id": "def-public.DiscoverProfileOptions.customize", - "type": "Function", - "tags": [], - "label": "customize", - "description": [], - "signature": [ - "(options: ", - "CustomizationCallbackContext", - ") => void | (() => void) | Promise void)>" - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "discover", - "id": "def-public.DiscoverProfileOptions.customize.$1", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - "CustomizationCallbackContext" - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverProfileOptions.deepLinks", - "type": "Array", - "tags": [], - "label": "deepLinks", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-application-browser", - "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.AppDeepLink", - "text": "AppDeepLink" - }, - "[] | undefined" - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "discover", "id": "def-public.DiscoverStateContainer", @@ -1568,21 +1500,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverProfileId", - "type": "Type", - "tags": [], - "label": "DiscoverProfileId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "discover", "id": "def-public.ISearchEmbeddable", @@ -1618,63 +1535,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "discover", - "id": "def-public.RegisterCustomizationProfile", - "type": "Type", - "tags": [], - "label": "RegisterCustomizationProfile", - "description": [], - "signature": [ - "(id: string, options: ", - { - "pluginId": "discover", - "scope": "public", - "docId": "kibDiscoverPluginApi", - "section": "def-public.DiscoverProfileOptions", - "text": "DiscoverProfileOptions" - }, - ") => void" - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "discover", - "id": "def-public.RegisterCustomizationProfile.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "discover", - "id": "def-public.RegisterCustomizationProfile.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "discover", - "scope": "public", - "docId": "kibDiscoverPluginApi", - "section": "def-public.DiscoverProfileOptions", - "text": "DiscoverProfileOptions" - } - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "discover", "id": "def-public.SEARCH_EMBEDDABLE_CELL_ACTIONS_TRIGGER_ID", @@ -1892,62 +1752,6 @@ "path": "src/plugins/discover/public/plugin.tsx", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverStart.registerCustomizationProfile", - "type": "Function", - "tags": [], - "label": "registerCustomizationProfile", - "description": [], - "signature": [ - "(id: string, options: ", - { - "pluginId": "discover", - "scope": "public", - "docId": "kibDiscoverPluginApi", - "section": "def-public.DiscoverProfileOptions", - "text": "DiscoverProfileOptions" - }, - ") => void" - ], - "path": "src/plugins/discover/public/plugin.tsx", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "discover", - "id": "def-public.DiscoverStart.registerCustomizationProfile.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "discover", - "id": "def-public.DiscoverStart.registerCustomizationProfile.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "discover", - "scope": "public", - "docId": "kibDiscoverPluginApi", - "section": "def-public.DiscoverProfileOptions", - "text": "DiscoverProfileOptions" - } - ], - "path": "src/plugins/discover/public/customizations/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] } ], "lifecycle": "start", @@ -3050,22 +2854,6 @@ "path": "src/plugins/discover/common/app_locator.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "discover", - "id": "def-common.DiscoverAppLocatorParams.profile", - "type": "string", - "tags": [], - "label": "profile", - "description": [ - "\nThe Discover profile to use" - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/discover/common/app_locator.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index df156033e596b..e7cc9c0433189 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 156 | 0 | 108 | 27 | +| 144 | 0 | 97 | 27 | ## Client diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index cfb5492155604..ec2b1653b1ecf 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 2bca37f7d9e54..5073c811f88bd 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index c612bd39cc10c..e69a37548dac6 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index a2a627bc03350..84f5b4da0e481 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index ea9a2c39ad002..145b383759ee9 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 50bccd787a9f0..e890f605ab27f 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 7fc9120d309ea..be775ba090f11 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 06c02cfa9b605..c01e4b5491890 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 65e4893f9104e..8bbdd258cb71f 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 96fde09a46d67..a868685e0aa6c 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index f1a4fa3b57020..a395ebaf5fe8e 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 2f46e78554732..c169985583d61 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 0b7095a0352c3..35d3fb33eb5c0 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 39ff778c6684e..c1384d0493f0f 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 4460faf1bbfd4..02632d6c70308 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 0b8e2ee9ecb29..34e62baea614d 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 90d4f7c8a13a1..10989b4d27d3e 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 83b96e2c972ee..23a28acbab697 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index b24f93a95b7c9..26d4c9bd16d67 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index e07a4ca0512eb..627e5ebb047b0 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index c528fefbb987e..95133924e7040 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 69945a6d00f79..eb5be730a6e94 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 252ed72ef9892..e40c9570e903f 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 98280252f47c7..3d273cea5b21a 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 0a98bf0d7f600..af4e24b6d53d4 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 5c6585756dc31..33736bc6b7646 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 7c42d35af4235..0705c0f61454f 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 79699821c1e1d..65dcc4d14b590 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 17e725046c2f0..d9db257d5f427 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 7bb001c6b9c4e..d52753688099f 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 3c3e2fc6d9bb8..1b719d00692e4 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index b6e54e1ea3baf..2bc8c2c922f90 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index cff29d529056f..0026b7b14891d 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index f5e75e7882467..9c0abfd9f8503 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 8e59ba4db41bb..c12d2ec33e90c 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index f174c67ed4b5f..a607adb784c31 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 8928a207d60e4..6674010f245f4 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index da50e6d4f7d80..52d72954dce56 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 0223f47e6b2a1..dd0a36d20525f 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 0f6265cbc160d..6f88226b93574 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index b80e101155e7e..7b2fc2fd7a675 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index e0d0af4c47fb6..01fac0a87fb13 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index df9f795e16fcd..d5b6891424e13 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index f791c73ed0c4e..301a6a6450b04 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 8f46edf664cbf..0c0a617652fab 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 9fc50aee2f196..f8c3d59e10f37 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 9add71133906e..61c4fe116b14b 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 072bd4fe4fe0b..5dff30d92a0fb 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index bf6fca7f67d51..939ac46ec08a8 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 002efeb7a350f..0c87a9a1bc7fa 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 394ff33e48ab0..d3541c8cc1bd1 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index a2bbfa67c9810..3da465b85eb3a 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 0266206c37a26..690a200240a69 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index ef07914f8fa36..c99246faddff3 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 20fbda8215e16..dab51002b381d 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 27d4d95554922..568a9973bccb3 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index bee0e2c709105..c70ea896335f6 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index d14361538bf59..d64d158ba540d 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 68b35b803efac..8c65716765fe0 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 9024a0fdb276a..1545c6d4e7125 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index a84d07d07ee11..325909e4480e9 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index e8298efdf1a43..26ca80ec65f7d 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 35805e4c80791..f76b0993977b2 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index e85d293453fa7..096a975c09a41 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 4ceb8c139a34c..86f1908d62574 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index b0232819f2275..9e47e776a5f99 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 4d3a1d37fd775..c9c14a6ef0ab1 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 5dfe19dd3d140..9dc645f34f1f7 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 78cf30bb57b53..ff6992ca6e152 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 5aa84dc9322e1..ad952476aa655 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index c00de26cb7fdf..260bd120cdbc6 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index db52651adecbd..1a2cf277616c2 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 1a3cda9a55bdc..cbfbc0654a47e 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 0c9f0f96093bb..9cf43a8bf4e5f 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 96121f4540681..e2aa5242cba73 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 4d6b5be2fedad..6f54f83359313 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 9506c654076e4..4dee60b0400f2 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 866c865b3b593..1d321c53a1fd6 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 6b529bb6e9c8b..98f5a0893e848 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 6ef0056b50d5f..3dd133a7c9991 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 8f7e0e8a1815a..92cd886766239 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index fe1bc5a0c7f35..9dd1240a9e63f 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index e08798fbb9c7f..1bcd7b59d822b 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 7d8151d799226..9079b7eaa123d 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index e09776bd510a6..877570dce5a5b 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index d2e80260a6ca4..04aa3d5da3b4a 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 5c1a03d59984a..68c0ec18e0850 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 63ac806e2ecd0..7c5305431f531 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 240948d3e4a28..da368c084ea0c 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 7ff3adf888e4d..0a204a56afa15 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 7b177db5f7b11..b6668b3b7b7b3 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index c9047b1e5258c..9662072ce8c4d 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 26c0fddb3db62..8fb068910ef2d 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index f075d189f26db..7a18c0d053f24 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index c6886bd2fdd16..0e98a183afa03 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index f17ec400266c2..12342aabaf769 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 2f12a8ef907c7..f8d32769b8b15 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index f9b12f3c4734c..54d79bc639ee9 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index ddc8e6544832e..4214aff23ba0d 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index fb055e600fa8c..506ab63b5de4c 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index dea53c00dee8f..59d27fbf6d9d2 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 876268518a70d..c9f1d555786a9 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index cdaa56f8a455b..89f218b480d06 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index ef7b5be3c5b80..2ca2c3d09f42f 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index a46e85e500416..bfb3dfbecc3a1 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index eb220edb9a6e6..0ea99a78ba273 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 39401285becb6..ddc4ba57f7b1e 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 578ff065b5836..5a443590dbefd 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 55adfd0793fbd..4264623e3c459 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 7d3075c45d248..3f53d58543840 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index dbcb1bb67321f..66a6cea1bd75b 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 3f25cf3801fe1..6b29876c1001b 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 3877f1998ee0a..8f7a15c981933 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index dbbbd5aec530a..657a771deaf15 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 2590374afdea3..ca5d98231a7e0 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index e2e8051d3e569..efafe81496b5f 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index eb53060cdef80..9b45bc6fb4625 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index f5206bb2ea733..bf39acdeb71d3 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index c1e2058bbde3d..e24ea96e8546f 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 59162f3d7e46a..23c98d99ee4a0 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 5afc3310f73bb..fe9094ca403ac 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 4009621a5ee0f..ad12b70b172d3 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index a7503e761648b..9d7ce31d8f39e 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index b1fde4c717cf2..2850f6b3a8717 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index c769b7cdedb26..ff290c1d60bf9 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index eb89b1f92fd8b..1f60a36b0aa8e 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index c5a0dadf2efaf..093fad53a5eff 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 0662f814f57c4..32d3af2cbc31f 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index cd70bfa6c489c..66cd6ad3871b3 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 1a0593c6fd866..bd6e61ea6f045 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index fbf7f888383a9..06b4dad10f173 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 9469f4a30e821..5106b0e50183a 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index deebb231252ab..fda28d6de853a 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index cec76e7d6b57d..1d4c321dcf166 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 4d2e8bf270196..1b07f53ce0909 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 65dd63ea828f2..869ddc51920af 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 627cc2520da4b..1fdf99dd10787 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 640cc365b6f0d..2282f04fcaf9b 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 51a716da07273..0d7f4bacf65aa 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 218f3ee46e35b..4365762d5bf54 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 832ebdc4f505e..0d2ed14d9224c 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index cdde287062066..7e45f6f5f9b2d 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 65bad55967eea..cc869e7634e2d 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 081f510bab1f9..c1d41eb5f5b2d 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 95926f50176a7..5381f0fdab50c 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index c48495224d547..2dd1638442817 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index f8877417e36a8..99798c93b1b74 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index b558c9312f63f..de404fb3e0c05 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 3d17c5fb6e74f..903b5859325ce 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 326239d33ecc9..f8a441132bff3 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 2e48f5da6a139..7fa5824dafb66 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 978788c30a0b7..2a6c98d76001c 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 2f2cd02edc94e..88dfccd74b6c8 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index f2cc29f33a559..105d07744289a 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index e552deeee03d9..10ba6c5171998 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 103d963185953..f5d4a42b63a63 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index c0e51954b659b..0b609b0d9fb05 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 1e863f5557bdb..304c25dc83d4c 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 1593bd2c338c6..0ab6d565a670e 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 0fd75d7030f42..75c1d32578974 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index feba59ea87527..4c6417664901a 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index c6acf55d57c15..fd4a198e34fae 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index db72b53d5ac95..07bc8129e321e 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index f5819e791ba57..9a0b73a66d182 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 6a30c8c9f31ae..639b97329653f 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 2df1befcfc750..32bc2534136c8 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 6206e6dde14a4..f400a2bb8d0d5 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 03dfea619fb28..723cf32dfd847 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index dfe6e16942527..7441444df9dec 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 6c0478473d5eb..15eb3f157f830 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 32635a2fd2399..c41a43af63c4a 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 3bbc63bf01679..772708bbd92e2 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 90241b2897625..a02739a32c80d 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index a3ec7cab2ccb0..6debe13186733 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 6113d2b60d61f..7e6b52528f740 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 6d5b8e09b765d..75185d79a6b72 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 096b85dbfdb88..8d45f15a9dc61 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 5262603d6478e..9d74924886779 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index aa867cb1b93b7..9bb63720d4519 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index e4e4c8eb2c3cb..99c9ea5429eb1 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 677f15700444a..5c847095613b4 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 845e74808475f..e9a9fbc64a4ed 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index ff6cfbdca6eb5..7ecd0b043606a 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index b89bcebfede68..3a54ebfe39d8a 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 33a79164503f9..ecd1974e0621e 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index aea0fdf9701a0..6663cb037daf2 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index d806418afd319..0f440625c9090 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index b607a07221395..0067d326438c4 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 419278892e801..4ca72d13812fe 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index b44d18fec7aee..648fa9a59a66f 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 9547089954f6e..2f544dfa0b595 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 81c9332bee482..31b8363631d90 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 19f7e95299fc3..f869fb78ab434 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index b0a98007ac6a3..4ce6b25dc82f1 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 33cf5715a414e..74e2f1ca5e624 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 6a25757aa525f..d98ca06bf612d 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 325d27316909e..2d06a8b3ff14e 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 5a91383572762..28db3d9cac474 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 8468f3196415a..645e0b02764ad 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index c73e535065fbe..25c412ab41489 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index ea93e9e4ad41c..8a2da5d889d01 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 45c38f78a76f9..76f56aab806d6 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 4dbe0929624e9..febad0a87348b 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index b687493b1908d..b516bd556a7be 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 2003684fe2fa5..d05993b3ee862 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 520b00bc4683a..e0342c2296a32 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 0440e77befc47..80d5522d09a87 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index cba98a2c44d91..6a45ebe10cb2d 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 56b3f3fcae640..c5cc35c38d536 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 0b5ec1725fc57..9dab18ce0dda3 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 175d3615df9b1..4a617ceca43a3 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index b8f8509b3d085..556c52eb0cf70 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index c0ec7684588bf..d4011ecc8ac09 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index d9f54d516e95d..09bc97c71f389 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index b3ddc7108b63a..1d3e53e5f37d6 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 554388073c9ac..d54c9a06c999f 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 055ff99eecc81..5d253a1fcebfe 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 4457a55cd0b04..bc90bb029a561 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 19d9d6d98a3d6..f0acc463e0d71 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 1e142b66d2856..d10976e32036d 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 09099196954c3..c133dd6496f4d 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 4ae6b60a55606..6189862dde2fe 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 12a74fb1f4223..1e0ac27003ed2 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 1f872d6745c24..c822adadfd52b 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index e119f75f43bdc..74f4494728607 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 32d21af09688e..21d7c07863849 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 91fb4150abc18..245fb3fe42383 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 01266ac8bf68d..89f3194d4c5b6 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index cbe0ee9b0c136..f288e62b8c557 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index a571d3881a413..b5129581076d6 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 65138cfd3613e..30c76329f6cc1 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 1b01a8a6000ac..6c6807dda84ac 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 87a7fc61321ad..88ff212d20753 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index ae4adf1296bb2..be958b13cde01 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 0eef0d401957f..c296da59987c1 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 7cb6ea6631a6b..5eb1532587066 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 72068a5586c23..6d32ea2acd858 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index aa582a4c54e24..bf5ab83cd3dbd 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 2a024ac64fa92..ed2c87c8d603a 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 0f7c487a7b131..4f825f001700f 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 8fdc9f9bf0e44..85f4acceadcee 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index a11ae8572b3fa..f85cb113b68f0 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 1abcef2cef0b1..5128e17c1785f 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 86e92a754753c..d94e517c67b2c 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index dcfc5302cdecd..4120662a38f5d 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 5b655735d154f..d09f1cf33f833 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 86710ab969d19..ca048814e059a 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 717f7c673b00e..4b5ecb14752c7 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 74ee9688828f9..27b16fa43ccea 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 7ce60ee6c70ac..8e6c8a1ff904e 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 3e88ed0884024..cc84cea0f733c 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 57631e9c886a4..a18a4b9e607a6 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 6c8b57057b43a..8156723ed27fc 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index de3eb5db57c0b..74c5eaf226c27 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 275c0194b27a7..0747c4c994a0d 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index aa13d65f380ff..7e09294109071 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 1d97580b4a95d..513ee828dc01f 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 295836997ef55..285cd9c3de222 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index d18725804a080..afe508066ac73 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 3a2b0b82b2f8d..8290aa0680f95 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index f0bac9ac900f5..8218cdc2b1d03 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index f2df9d5740657..06051368c6b14 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index d245d7a25459f..e6113baf753ad 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 8607aee930157..3d4d3e7658870 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index ce7d9c940c420..70fc182a06204 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 309b5f8707d1e..3e7172fd8879c 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 61c6ade944808..66fc3dfa31517 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 3c3ed137f2004..e6355a2af33ff 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index bb0e586571fb6..b769caf16d7c0 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 8f4d63c40747a..2f4c2c7aa7fe2 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 1f076393b34ca..f6c2f902f3976 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 1c02f87a11674..d00f7ad0a87d9 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 0916d8645b244..9837cb248de99 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index e6eda43dc1d9d..19484a172a087 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 9ec9cc34c98b7..67c104a34037f 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 3d49804a57e0e..36d5b2fc5f0c8 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 392fb09b15433..6cf1e08f65461 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 8892b12474a4c..876fa9595c288 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index c6eef0acabbba..2b01a3124dd62 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index d93a907e6f9bb..040e6d5faaa37 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 1986c32f1b154..b19c838382cb2 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index ae20b67a11f1f..02f6932678e50 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index cce6fe3b155e7..ae1f72bd85d71 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index aa00fc60b8bbf..d317ef3710703 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 8e99112b0087a..2d01243368a30 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index e3695ef29c5ff..49721c873cc67 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 0cd988a69ad42..5c4f362c48a12 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index bbb0367472860..2684fd2a92ebe 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 9cea7141133ad..843556bb76e86 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index cd7f0f6d71b09..26ee1604a56f3 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index ba486cabf38f2..7611184bdc72d 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index e5323e9cd85e9..a5926d79cbf35 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 0adec688d527e..3c3a630cfcc40 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index b0c266a62093b..720805bac91d9 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 37595d6249acd..6f2a1acac4a0b 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 9cef5c76ea35d..2e35e13d9fbcc 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 6214dd18df301..0d6be432c7cb4 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index a7c73595a52a9..93a8bd2af4624 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json index 508643d19c733..1e363e4a18013 100644 --- a/api_docs/kbn_esql_utils.devdocs.json +++ b/api_docs/kbn_esql_utils.devdocs.json @@ -19,6 +19,54 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendToESQLQuery", + "type": "Function", + "tags": [], + "label": "appendToESQLQuery", + "description": [], + "signature": [ + "(baseESQLQuery: string, appendedText: string) => string" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendToESQLQuery.$1", + "type": "string", + "tags": [], + "label": "baseESQLQuery", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendToESQLQuery.$2", + "type": "string", + "tags": [], + "label": "appendedText", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/esql-utils", "id": "def-common.getESQLAdHocDataview", diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index ffde42542170b..d71db17d712f0 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 21 | 0 | 19 | 0 | +| 24 | 0 | 22 | 0 | ## Common diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 56b136a54efee..34a6bc10ec4df 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 221f2c30cf6fb..cf0955335a7c4 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index bf27153c4e7c3..94c55c2f567b7 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 4269967973d1a..dec3de8c3aef6 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 17b46004bf0a9..faabec75c60a6 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index a03df66b77475..5871762d2f4c5 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index f92ab3a34c730..ec42cf2864d98 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index c8ba408daf619..05fb69a9a5359 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index feb8604fb3646..9726682708ff6 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 491f6523e9529..7d5ba302d589a 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index b12baf073d776..d3ab46fb8243e 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 2c790f3da81c3..32f45c5d3e66b 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index f82a92b094589..7ceab50833a33 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index b9af074b2623b..bf635a787b613 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 0c906fb75ec19..a798a6232ac78 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 618d47ecfc65b..f6476aa85f8c0 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 422683b953552..d64368d90434c 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index cd5168e84cf8a..2ec262bf0a490 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index dc6a117c90263..d874ae0f492d3 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 58510a059dbd6..5034fea39ef50 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index e03a3a95c2af1..fa202acb55e98 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 586ac233fcddd..5be59bf1765fd 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 335feb03d8ce3..2b0bc72b4a78a 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 2c2fa671e64b8..4b1cea3faa0a8 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index be091dc5f9592..58edb77960672 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 4bbb15fbab069..30b14ef007e47 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 63aadc04cedef..d8aff44ed92ef 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 8ee70f160a430..352fd5a6e7644 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 9fda234b233b1..5288a84074343 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 87757e0894797..14554bc27be30 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index d224f04cee432..e1b95f33de2d8 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index dbb2f32684b5a..84a1d8c9a047b 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index cbc138f89632a..98d93636a78fa 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 9e674b89458f5..e87343a8db43d 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 5d8d9f7b87355..c0276c761129e 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index f5ccfb3a64916..be4e9b44f0ae7 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 943b10511f5f2..a0607f0fea477 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index d7d3b9f8acd5f..d33b5dac741a9 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index aed24d67d0dd7..54713786ec8ec 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 96bc1a86f86f4..7373d134481b2 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index d04838e4938f2..7551a182374e4 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 1b87bebc08071..2097976e80ebc 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 4feefc373b08a..5557b445e78c2 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 3c96ca74a3677..1ac6abbe9e8f7 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 8761d42f06fb1..38a3afc3f9c1d 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 09be3f7fd6aa2..fa7ef5a6f768f 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index b444474169642..b09de60eb4965 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 73454f0d95f92..7bc2f941fe5be 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 212bbd53d98f0..a03b7792a1593 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index e7407446f348e..4972c98eddeb0 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 416b78095c297..56b17d6e02d16 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 3257f7b33a841..5c4317f3c528b 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index d153e5180f408..0691ad3aedae9 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index d79b2b25cf817..43f9abb401f27 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index afdea3fb155b5..c4cc462820932 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 3544adf2fd455..5c13873398c4c 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index a90ce9462477d..bb0c792630f70 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index f110682ad006c..74e6cb408c3ff 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 2fe73be5d159a..40b374b6d736d 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 4f942927bbef3..6bd5c13aee9de 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 961d114abd911..3102cedb835eb 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 33e0bc1be1e9b..2e309236ea36a 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index d0a9aaaad49ca..db7fe409c4b42 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 6ce5cfc9d18e4..a78b5ae2eca0e 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 55324c9a47279..9714f11a62edd 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 3ccdafee6cd1b..c8d5e4036e9fa 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index b57b0e60c258d..b4bb7127af81f 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index ea5d63ace1ad0..ffae1a36906ae 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index ceb4129264fb9..92a6490f72083 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index f85437c7b9603..7015638815bda 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 802f8771d0eca..ca003e0b85e1a 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 3cedb6813fc24..e53ca3beff41a 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 88d561303257c..72ce416d8b2e8 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 0ad1e1c9bc595..2be14d0b71b98 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 1841f3cbd924d..ff1a29dd31816 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index d41cf9a3754d2..3865dcb911b28 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index b2190a02d6998..9276ddd60086b 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index cd8a27e6a13fa..d07dae5fb8c6e 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 53daec43d0de5..b9fe78f1115e7 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 3ac8724212c4d..11ca210448c19 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index dc526a833aa84..5c1800b933813 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 170ac463081ef..0f994545367db 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 2252db0c70069..c03a31d3548af 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 62787b05194fe..f700b0fde7b11 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 50aad51ed4c49..d210480b0b993 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 09b41b8b85d85..84cfb8ab20c98 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index d50914bb09e8d..0ac5e5ae8dca3 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index ad16f66198712..ccd0d3c971521 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index b63f19fc83981..e423cf0365ec0 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index a2d3d1a3c4895..e72869de4dd24 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 22bdea0d5b08f..c7ada3cb9770f 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index a40273499006c..6960df5039d2b 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 7418d6b3bdecf..eb7f1dd33e2b6 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index b2ee69a7bec27..91d7ae0b6041a 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 3514d0f1556ce..b3b961bbcd005 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 661b5dcff51e2..9f1ee04d13617 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index e290dee7335a8..844fe5ab1dbdc 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -101,6 +101,46 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.apiHasExecutionContext", + "type": "Function", + "tags": [], + "label": "apiHasExecutionContext", + "description": [], + "signature": [ + "(unknownApi: unknown) => unknownApi is ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.HasExecutionContext", + "text": "HasExecutionContext" + } + ], + "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.apiHasExecutionContext.$1", + "type": "Unknown", + "tags": [], + "label": "unknownApi", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.apiHasLegacyLibraryTransforms", @@ -2152,6 +2192,42 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.HasExecutionContext", + "type": "Interface", + "tags": [], + "label": "HasExecutionContext", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.HasExecutionContext.executionContext", + "type": "Object", + "tags": [], + "label": "executionContext", + "description": [], + "signature": [ + "{ readonly type?: string | undefined; readonly name?: string | undefined; readonly page?: string | undefined; readonly id?: string | undefined; readonly description?: string | undefined; readonly url?: string | undefined; readonly meta?: { [key: string]: string | number | boolean | undefined; } | undefined; child?: ", + { + "pluginId": "@kbn/core-execution-context-common", + "scope": "common", + "docId": "kibKbnCoreExecutionContextCommonPluginApi", + "section": "def-common.KibanaExecutionContext", + "text": "KibanaExecutionContext" + }, + " | undefined; }" + ], + "path": "packages/presentation/presentation_publishing/interfaces/has_execution_context.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.HasLibraryTransforms", diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 4f4d4dbc1782f..9a271d82ea631 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 178 | 0 | 149 | 6 | +| 182 | 0 | 153 | 6 | ## Common diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index e790fc39705fb..176ae441a5edf 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 7e0d2c0b0c592..42259e5fab175 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 85130fa423398..c5ec4724fee48 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index bbc78e668fc61..a237c986af4e8 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 6718701b33c9e..654179342abce 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index f398ec9013544..55dd8d53280dd 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 31649d75be30b..7df976906cc14 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 04b9664fa445c..c20cd3874afb8 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 24416d7474f13..9efd027979601 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index ebd71ace440bf..05b3bc011bd51 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 8284e418530d5..b93b45518e28a 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index d91c7ba39bff9..ef4974756cd50 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index e52f522aa4955..8594f47dc2611 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 21350a2f4ec50..6ce06f7bc01b6 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index db334115dd640..6d11f2f681bb0 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index f646136f3d493..cec52373b81fb 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 6d2b54679edea..0dd7c9d06ec8b 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 280e16ce27497..8a98772e74b41 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index c0dc57141f65e..9a79f72471d74 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index b349c8be19966..b78630e85976d 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 8fa06e7ca4177..3585a1b9c3866 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 5d1f5cf9bbd29..3a583eb67b9a1 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 614c8c02953be..33e65b08c6d37 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 6b8173fcfdc6f..3918484f6d533 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index e6745d785eb15..dda61e40adaeb 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index f8b1fb95a236a..31da9365a3cc3 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 1ac34e2206da1..1bb28995ceb7f 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index a2dd584c4bfaf..ef26b3268248d 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 9d781d3881290..89b6ab7a8df5a 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 3d0a282f6369c..cbb11bdc333c1 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index b48c1ea97dbb9..c261588b1aeb6 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index bdfd4c0518376..1fe032b36768a 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 2bd098cc95d0c..76aee667c55be 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 203faba8a4f66..5df18e329fd48 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 36070f154c148..ed05ce5a48b6b 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index f3d95afeea1f9..247a2701da252 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 15ec4e90fd12c..a54edb0b37db8 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 388ba057ac16b..f6150a52db994 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 0e7a4ed615c94..6d5116c8ca3be 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 0f4a4baa9e5c3..57d7eb854e1e6 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 826f884424a36..b4470435eddb0 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index ca62f797cc067..0d7d6c7a15dc0 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 8c363ca19171e..c1fd7387f206f 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index a0bc3eef0123f..dd8ae9c32f66f 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 8690f820548b0..e747b6bf2b90d 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 05be1ac6b4431..1f6b4617741f5 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index a66b1e398fc4e..0f5e3283f7019 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index b9ce0c7cfb874..c59edda61a904 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 568f8aa841d36..a3cc7636e63ea 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 54d8ce79da466..68e8880b1e09e 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 6ba9ad3d78d96..81094f9434a20 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 5b4ea9e66cfd3..c9519ebe11738 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index fa788c120c1d2..3809da24ae101 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index e50f718991799..d13b1ad3476f2 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 5dc6a8ca5ad6c..3ca421334edd1 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index f4bbaaca6deb7..b1a5a5b1839e8 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 03d33ea6c0576..babfe00912cf2 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 8b741b452ad6a..468847a493614 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index e114208a3cf68..2ffff79453547 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 9dd927b8e2c55..7d1f1f4f36264 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index a6a6311baac5d..2310a9fa2a4ee 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 646fc85dcc516..47535eabd4070 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 7de2e8d0bf5d6..4fa2bb77089f1 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index f21bec0400267..f492dd5ef3d84 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index df6867453dfd2..9de480cdff020 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index c52f5d08f5d22..ecff937d5b558 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index f6165ecf7b45e..5e632b81d7f3b 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 92c144e10f0eb..3ce4a5549dbe6 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index a6efc395eab0b..a781effb8d010 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 0f80d4c7777f6..9661db2a52079 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 30eceaf6319fa..2d8f9fcd23373 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 980da6c5b7640..1bd8db5759791 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 200ffc30a4f8c..acbd1b83db795 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 5b25f0ae1f668..0e21aa851fa47 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index d5f7bfc4c0665..398108101438b 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 4856c9984b94b..7696e073285ce 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 1d322fe65e72f..4be49cb7dd672 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 995525179de5d..8c4918b591f83 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 80ba71f574725..39f0f6876308f 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 1c61558053801..66e49d756c6f2 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 187d49dbf558f..4e9a3f17fbb3e 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 97ae9f724bcb1..81d58b66a4b03 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index a13cb87ed598e..020d14bb2ca08 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 368eecd6285e8..825d923c74a00 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index e60c59f3ad72c..11ab8dc6a23c4 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 519b67c25e4c3..0e4c79987e9a9 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index e083e00adfa74..6492ed4a30d9e 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 12847b693ed15..237b5ab2dba99 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index d4fa3b798924f..1cd5a7ff986d0 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index cb5b61f759cd3..3ad934d65e8d9 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 0bb46278a69be..570a8dda68163 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 85a943301b7ec..bb3a476cf39c1 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 1d9fab180d78f..8ea7c4aa3c88c 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index f5145d8702291..e3f6dbca49bbf 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 8d2e8b6f4e2c4..a545dcae9143f 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index db0472879de68..ebc4fd1a8a29b 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 35c2111fc3a93..1cb40772ebbd8 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 773ab1f17ba30..d74d06b37a12d 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 1e82b53a37c4b..22f433c30cb2c 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 4d999f4026ad3..9098a5be60723 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 997d23cb52f3d..d389de7231bfe 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 53510078c841d..1606123f72d64 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 70b028078d06f..594a990141f77 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 84fa04865477a..bc2656033df21 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 3217ebd50b66c..d517d414df9e2 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index fef28daed9e7e..6f26619f9cde5 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 1c85c7df350d1..a16cfb6614548 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 07aaf3d1c0aaa..92b5a6df17c9f 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index acc62ad844f10..81b13a095708c 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index e07d03a05a6a2..75941d38b8873 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index db9d8f9c28e6d..0550bae39a231 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx index 7a328f5d4362e..20f9186826419 100644 --- a/api_docs/kbn_solution_nav_es.mdx +++ b/api_docs/kbn_solution_nav_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es title: "@kbn/solution-nav-es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-es plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es'] --- import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx index 4a849649ca053..9e558c3c946ae 100644 --- a/api_docs/kbn_solution_nav_oblt.mdx +++ b/api_docs/kbn_solution_nav_oblt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt title: "@kbn/solution-nav-oblt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-oblt plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt'] --- import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 3aa7659f95db4..3f8573d9b8e8e 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 97039b49e6f21..d9436afb04105 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 0150a14b493fb..538923164fc12 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index b392c95f0e0b5..bc958d4b721a0 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index e4172673c1429..a268072eb487d 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index a30b07b4aaae4..23e6322ee8515 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 2628adfd4f610..58498e19f2b43 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index ed347b9acf915..0907c06b17776 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 2e8943ef227cb..3cd1925d40ed4 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 54d47c38a2be2..dc7ecd0eeeeef 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index ce8a421b147fb..2247924a4a4ea 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 16c07b2ef8f54..24fd45c53588c 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 3f97f465b4de5..f1958ab975ba9 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index f7acef4bfb9c3..5cc34cd80c44a 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 2aef99077f008..e9c71b024b783 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 815d2bfa36b62..8d3e4a6016ffe 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index bdde3ed98110a..698447797bf8c 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 826e79e66fd25..78c8a8bb5d26b 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 50d01084281f5..836503275d2ec 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 33160bce799d9..49c4b0c1e5329 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index e5d08401e8fea..903c9387e0e3b 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 5fcf1bfbb7db3..16a70fbd21b8f 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index e7c537ad9d76d..05f0be93f7401 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 0840d75eefc96..fe863c054b850 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index ef07b749d9635..2dc526f31abd5 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index ec53c936d3a26..cb9059f84c52b 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index bb0a2dd42b0a0..e81eedce31954 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 854d3ad9a45cf..d00a83c8440f8 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 3bdf77b3414a8..9c72d1d9b89c9 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 6c996d9f087ed..f86381940589b 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 1269823bde005..f30e200ac5380 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index e69c51ef125a9..c6504033681b2 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 2c8d6a7499eb1..b60cb5e8ce0d2 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index bad93d4b2797e..aebc47458cc62 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index eeb69d3e1a96a..54484886475a1 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 14cb41ffe26ab..f4c35ef29e1e2 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index ea4f6a9d05610..9f83470f9e626 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 83b1038ed65dc..bca03b7837fa4 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index c18d704388da8..5299a9d1710a4 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 2b7f2b915bc68..aba69fa13ceaf 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 0a1d9c1c2b15b..306f78f53cd55 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 7941d098593c8..fdb50f2ccc2b7 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index ce609a9e6646e..610e4108261bf 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 6fee5aa2ad7ad..b080aea2a43bc 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 91a0bb3550bea..f7d4d3600a9d5 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index bd9c15dc16cda..85dd5712ae962 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 66e31ee61b2ba..546e6b97cd3b0 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index b911a0689fa00..ec6443dcad528 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 727cca5d62fce..478140ca221c0 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 2930e5921f8c6..aa8b3e3de703c 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 0b07a10ab6dc3..6ca8e7352b9b4 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index c3278a566916e..08b65d4c15e60 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 07c354d1e062b..03e013bcfc34d 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index fcdb03dbc3cd2..af46c6ef1d1aa 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index c43b991193244..9aef4e1126466 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index da6607b897c9f..84a9dc5e2ddc3 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 647c5189da88e..be2446528425c 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index e5afa252618a5..06cdfdff0bd8d 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index cfe2dc7c24064..ab4dc9d7ad1d6 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 7462476d32e3c..4ab0e3b388c6a 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 4496d3df5cf76..057c5222d61a8 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index b6377b0711794..2c8f4f2ccd889 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 5f9e528f77bb2..52a0c702278d0 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index cc118c353a48d..ac5c6fc965ba0 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index c8d5db8dd0fd5..8d4ebf8f35261 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index a916a8d0b3c72..4ba9b1cc4af1f 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 41ca99cb5c9fb..ba20360721af3 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,13 +21,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 47428 | 240 | 36084 | 1851 | +| 47427 | 240 | 36084 | 1851 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 298 | 0 | 292 | 32 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 301 | 0 | 295 | 32 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 67 | 0 | 4 | 1 | @@ -64,7 +64,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 3 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 10 | 0 | 10 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 15 | 0 | 9 | 2 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 156 | 0 | 108 | 27 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 144 | 0 | 97 | 27 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 35 | 0 | 33 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 45 | 0 | 31 | 0 | @@ -170,7 +170,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 15 | 0 | 9 | 1 | | searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 410 | 0 | 200 | 2 | -| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 189 | 0 | 119 | 36 | +| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 190 | 0 | 120 | 36 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 25 | 0 | 24 | 0 | @@ -482,7 +482,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 26 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 63 | 1 | 63 | 6 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 21 | 0 | 19 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 24 | 0 | 22 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 184 | 8 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | @@ -579,7 +579,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 65 | 0 | 61 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 178 | 0 | 149 | 6 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 182 | 0 | 153 | 6 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index e1c347247dc08..e99ee946fdae1 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 5ba47ca3f8b39..e907544ef2d2c 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 30223b9b8b386..ba21dbf7d65c9 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 8a7059447a774..1c623f816637c 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index f33bc9526e01c..bd595ffcc5cfd 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 3bfffcff0a671..bbfcbfed6b5df 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 51359229cd989..40f78d24a8e3a 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 147d1ff4b17e7..84e1e4a0efb9c 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index eeebd13eb952a..6f69d632cdbe6 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 2493f231c4e9e..5c608fb37bf75 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 0ac3b88491fd5..f831d1c3ba4c3 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 88bd0f315fc72..0f19dc555d805 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 8335c5523c4be..9d65e49015861 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 1dbd2bdd9a822..7982c2fb6264c 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 0a399d7726750..ada34b7a9a651 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index d9d93cf289cbf..1ac4cb4c375ad 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 63a05fadbbc22..292ada3f776b5 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 50234bd0158ad..b37a360a7b4b3 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 8bd1c9928ef70..aa482f475883d 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 0734255c6dc3c..e2ddd029a7e6c 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index bc5281fe1c98b..4f0d5fd4388d3 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 37fb9b4540fe2..1330b20f12171 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -2849,6 +2849,30 @@ ], "returnComment": [] }, + { + "parentPluginId": "securitySolution", + "id": "def-server.SecuritySolutionApiRequestHandlerContext.getAuditLogger", + "type": "Function", + "tags": [], + "label": "getAuditLogger", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.AuditLogger", + "text": "AuditLogger" + }, + " | undefined" + ], + "path": "x-pack/plugins/security_solution/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "securitySolution", "id": "def-server.SecuritySolutionApiRequestHandlerContext.getExceptionListClient", diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 3a780bb2b743f..08c4470a54fea 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-solution](https://github.com/orgs/elastic/teams/secur | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 189 | 0 | 119 | 36 | +| 190 | 0 | 120 | 36 | ## Client diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index d876284999c3e..061742e193ded 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 7f8cd1e9e3c59..f1753ca1300f7 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 858f52ec2679a..7c2f658239003 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 9560568496a68..654b23d3903ba 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 8b22f7abaca63..3d6d2518ba545 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 7b9f51a9f0f01..f138a283dbdd7 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index b26f1c2a4d8e1..8fa0e1986e4d8 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index d06e6c8de46c0..1bde8b80968c0 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index aec1404302652..6d8845b386af3 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 8b3d044d92bec..2d560031b8fee 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index aa46073968f11..2e34b1aaec17a 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 033811a9c1e54..ac9c5ce210674 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index d9211312777e2..9f2244b89eaf4 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 53bf5eeac8d6f..1c8662db8adb9 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index a50a79e1ab6ce..a527034afef62 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index df68620da05f8..b7dbada2f98f8 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 6696916cc1c14..36bd881cdde33 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index cbeeecf23e6fd..8da665e2fab5f 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index bdc10f2952f26..edb2ccb6a752c 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index a3ee52d900b0f..20b5ee70fc0f9 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 5b251f7a1792c..8cd0e82168679 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 933de564fa363..be1ab03249546 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 310432e2fdad5..d32e6b85bc089 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 41759f84631df..507f3a13a40f9 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index ffdfbbbd4206d..e13592db995f1 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index bf3896d5649cf..12e282b63b639 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 556a490b2b1fd..c8040b51e819e 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index b594e4434d351..e9863492dcab2 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index cdd78c505f3a7..fd740fbc46b9d 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 1e0957f9243a3..3ff967b9b9761 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 64cf7a3cd8a17..a3e26e9788d26 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 85aa37d1de037..019cbb76bfe78 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 5911fcbb7e217..715cd40f9871c 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 0d3d23a280aa1..b3c72708227c6 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 21f384e2eaa06..f544db74a3b14 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 648776cb3efc1..c6bd7dc9df1af 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 0e017df6a7007..d8907d1c8fae7 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index ea0f1acc95e5b..91ba8f336060f 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 8ac3c85233644..37d613a330bc1 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index efd0efbe79b91..fa826b2aba4f4 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index cde653d3b7478..f60dc022cff08 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index f430bda90ad99..1241ee6d1465a 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 046872d18271d..27d359281b6ae 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-04-23 +date: 2024-04-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From c91217463713d90ff454b7cb968151e3a2caa533 Mon Sep 17 00:00:00 2001 From: Rudolf Meijering Date: Wed, 24 Apr 2024 09:34:42 +0200 Subject: [PATCH 04/82] Make readWithPit integration tests less sensitive to ES response size (#180261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Stateless ES increased their `pit_id` length from 185 to 465 chars. Our tests were quite sensitive to response sizes so these started failing. This PR makes tests less sensitive to the exact response size because I don't think it matters that much, as long as we know that `batchSize: 1` is ✅ while a `batchSize: 1000` is 🔴 . ### 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: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../migrations/group3/actions/actions.test.ts | 17 +++++++-------- .../group3/actions/actions_test_suite.ts | 21 ++++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts index 0b4c885484053..e6938bb7a26bb 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts @@ -1309,11 +1309,15 @@ describe('migration actions', () => { query: { match_all: {} }, batchSize: 1, // small batch size so we don't exceed the maxResponseSize searchAfter: undefined, - maxResponseSizeBytes: 500, // set a small size to force the error + maxResponseSizeBytes: 1000, // set a small size to force the error }); - const rightResponse = (await readWithPitTask()) as Either.Right; + const rightResponse = await readWithPitTask(); - await expect(Either.isRight(rightResponse)).toBe(true); + if (Either.isLeft(rightResponse)) { + throw new Error( + `Expected a successful response but got ${JSON.stringify(rightResponse.left)}` + ); + } readWithPitTask = readWithPit({ client, @@ -1321,17 +1325,12 @@ describe('migration actions', () => { query: { match_all: {} }, batchSize: 10, // a bigger batch will exceed the maxResponseSize searchAfter: undefined, - maxResponseSizeBytes: 500, // set a small size to force the error + maxResponseSizeBytes: 1000, // set a small size to force the error }); const leftResponse = (await readWithPitTask()) as Either.Left; expect(leftResponse.left.type).toBe('es_response_too_large'); - // ES response contains a field that indicates how long it took ES to get the response, e.g.: "took": 7 - // if ES takes more than 9ms, the payload will be 1 byte bigger. - // see https://github.com/elastic/kibana/issues/160994 - // Thus, the statements below account for response times up to 99ms expect(leftResponse.left.contentLength).toBeGreaterThanOrEqual(3184); - expect(leftResponse.left.contentLength).toBeLessThanOrEqual(3185); }); it('rejects if PIT does not exist', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts index b11efed76e529..f89b9891b8b21 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts @@ -1348,9 +1348,7 @@ export const runActionTestSuite = ({ ); }); - // consistently breaking in CI: - // https://github.com/elastic/kibana/issues/167288 - it.skip('returns a left es_response_too_large error when a read batch exceeds the maxResponseSize', async () => { + it('returns a left es_response_too_large error when a read batch exceeds the maxResponseSize', async () => { const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); const pitResponse = (await openPitTask()) as Either.Right; @@ -1360,11 +1358,15 @@ export const runActionTestSuite = ({ query: { match_all: {} }, batchSize: 1, // small batch size so we don't exceed the maxResponseSize searchAfter: undefined, - maxResponseSizeBytes: 500, // set a small size to force the error + maxResponseSizeBytes: 1000, // set a small size to force the error }); - const rightResponse = (await readWithPitTask()) as Either.Right; + const rightResponse = await readWithPitTask(); - await expect(Either.isRight(rightResponse)).toBe(true); + if (Either.isLeft(rightResponse)) { + throw new Error( + `Expected a successful response but got ${JSON.stringify(rightResponse.left)}` + ); + } readWithPitTask = readWithPit({ client, @@ -1372,17 +1374,12 @@ export const runActionTestSuite = ({ query: { match_all: {} }, batchSize: 10, // a bigger batch will exceed the maxResponseSize searchAfter: undefined, - maxResponseSizeBytes: 500, // set a small size to force the error + maxResponseSizeBytes: 1000, // set a small size to force the error }); const leftResponse = (await readWithPitTask()) as Either.Left; expect(leftResponse.left.type).toBe('es_response_too_large'); - // ES response contains a field that indicates how long it took ES to get the response, e.g.: "took": 7 - // if ES takes more than 9ms, the payload will be 1 byte bigger. - // see https://github.com/elastic/kibana/issues/160994 - // Thus, the statements below account for response times up to 99ms expect(leftResponse.left.contentLength).toBeGreaterThanOrEqual(3184); - expect(leftResponse.left.contentLength).toBeLessThanOrEqual(3185); }); it('rejects if PIT does not exist', async () => { From b3b665bfc82f7f23b73d4f1a812e3a983a7da899 Mon Sep 17 00:00:00 2001 From: Mykola Harmash Date: Wed, 24 Apr 2024 09:57:35 +0200 Subject: [PATCH 05/82] [Onboarding] Scroll to the featured cards when clicking on the category (#181438) Closes https://github.com/elastic/kibana/issues/180827 Adds the logic to wait for the packages to load and scroll them into view. https://github.com/elastic/kibana/assets/793851/38a36c39-c851-449d-ab31-28dccbfd8825 --- .../onboarding_flow_form.tsx | 27 +++++++++++++++++-- .../application/packages_list/index.tsx | 10 ++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx index 1e10139963a75..dde4e5b1b108d 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/onboarding_flow_form.tsx @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import type { FunctionComponent } from 'react'; import { @@ -82,8 +82,29 @@ export const OnboardingFlowForm: FunctionComponent = () => { const [searchParams, setSearchParams] = useSearchParams(); - const packageListRef = React.useRef(null); + const [hasPackageListLoaded, setHasPackageListLoaded] = useState(false); + const onPackageListLoaded = useCallback(() => { + setHasPackageListLoaded(true); + }, []); + const packageListRef = useRef(null); + const customCardsRef = useRef(null); const [integrationSearch, setIntegrationSearch] = useState(searchParams.get('search') ?? ''); + const selectedCategory: Category | null = searchParams.get('category') as Category | null; + + useEffect(() => { + if (selectedCategory === null || !hasPackageListLoaded) { + return; + } + + const timeout = setTimeout(() => { + customCardsRef.current?.scrollIntoView({ + behavior: 'smooth', + block: 'end', + }); + }, 10); + + return () => clearTimeout(timeout); + }, [selectedCategory, hasPackageListLoaded]); useEffect(() => { const searchParam = searchParams.get('search') ?? ''; @@ -168,9 +189,11 @@ export const OnboardingFlowForm: FunctionComponent = () => { {Array.isArray(customCards) && ( )} diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx index ad02ad7b977cb..967cf1c5834e8 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/index.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiButton, EuiCallOut, EuiSearchBar, EuiSkeletonText } from '@elastic/eui'; import { css } from '@emotion/react'; -import React, { useRef, Suspense } from 'react'; +import React, { useRef, Suspense, useEffect } from 'react'; import useAsyncRetry from 'react-use/lib/useAsyncRetry'; import { PackageList, fetchAvailablePackagesHook } from './lazy'; import { useIntegrationCardList } from './use_integration_card_list'; @@ -38,6 +38,7 @@ interface Props { * When enabled, custom and integration cards are joined into a single list. */ joinCardLists?: boolean; + onLoaded?: () => void; } type WrapperProps = Props & { @@ -57,6 +58,7 @@ const PackageListGridWrapper = ({ flowCategory, flowSearch, joinCardLists = false, + onLoaded, }: WrapperProps) => { const customMargin = useCustomMargin(); const { filteredCards, isLoading } = useAvailablePackages({ @@ -72,6 +74,12 @@ const PackageListGridWrapper = ({ joinCardLists ); + useEffect(() => { + if (!isLoading && onLoaded !== undefined) { + onLoaded(); + } + }, [isLoading, onLoaded]); + if (isLoading) return ; const showPackageList = (showSearchBar && !!searchQuery) || showSearchBar === false; From 0f3ecf739e2040a8831c508f1df92c11bb5028dc Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 24 Apr 2024 10:20:05 +0200 Subject: [PATCH 06/82] [Security into Core] expose `userProfile` service from Core (#180372) ## Summary Fix https://github.com/elastic/kibana/issues/178932 - Introduce the new `userProfile` core service, both on the browser and server-side. - Have the security plugin register its API to Core for re-exposition --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 7 + package.json | 7 + .../src/core_route_handler_context.test.ts | 29 ++++ .../src/core_route_handler_context.ts | 16 ++ .../core_route_handler_context_params.mock.ts | 2 + .../tsconfig.json | 2 + .../src/request_handler_context.ts | 2 + .../tsconfig.json | 3 +- .../src/internal_core_setup.ts | 7 +- .../src/internal_core_start.ts | 4 +- .../tsconfig.json | 3 +- .../src/core_setup.mock.ts | 2 + .../src/core_start.mock.ts | 2 + .../tsconfig.json | 3 +- .../core-lifecycle-browser/src/core_setup.ts | 3 + .../core-lifecycle-browser/src/core_start.ts | 3 + .../core-lifecycle-browser/tsconfig.json | 3 +- .../src/internal_core_setup.ts | 2 + .../src/internal_core_start.ts | 2 + .../tsconfig.json | 3 +- .../src/core_setup.mock.ts | 2 + .../src/core_start.mock.ts | 2 + .../src/internal_core_setup.mock.ts | 2 + .../src/internal_core_start.mock.ts | 2 + .../core-lifecycle-server-mocks/tsconfig.json | 1 + .../core-lifecycle-server/src/core_setup.ts | 3 + .../core-lifecycle-server/src/core_start.ts | 3 + .../core-lifecycle-server/tsconfig.json | 3 +- .../src/plugin_context.ts | 7 +- .../src/plugins_service.test.ts | 5 + .../tsconfig.json | 1 + .../src/plugin_context.ts | 7 +- .../src/core_system.test.mocks.ts | 9 ++ .../src/core_system.test.ts | 13 ++ .../src/core_system.ts | 8 + .../core-root-browser-internal/tsconfig.json | 2 + .../src/server.test.mocks.ts | 6 + .../src/server.test.ts | 8 + .../core-root-server-internal/src/server.ts | 8 + .../core-root-server-internal/tsconfig.json | 2 + .../src/security_service.test.ts | 18 +-- .../src/security_service.ts | 6 +- .../src/utils/convert_security_api.test.ts | 4 +- .../src/utils/convert_security_api.ts | 4 +- .../src/utils/default_implementation.test.ts | 4 +- .../src/utils/default_implementation.ts | 4 +- .../src/security_service.mock.ts | 4 +- .../security/core-security-browser/index.ts | 5 +- .../core-security-browser/src/api_provider.ts | 2 +- .../core-security-browser/src/contracts.ts | 4 +- .../src/security_service.test.ts | 18 +-- .../src/security_service.ts | 6 +- .../src/utils/convert_security_api.test.ts | 4 +- .../src/utils/convert_security_api.ts | 4 +- .../src/utils/default_implementation.test.ts | 4 +- .../src/utils/default_implementation.ts | 4 +- .../src/security_service.mock.ts | 4 +- .../security/core-security-server/index.ts | 5 +- .../core-security-server/src/api_provider.ts | 2 +- .../core-security-server/src/contracts.ts | 4 +- .../README.md | 3 + .../index.ts | 12 ++ .../jest.config.js | 13 ++ .../kibana.jsonc | 5 + .../package.json | 6 + .../src/internal_contracts.ts | 15 ++ .../src/user_profile_service.test.mocks.ts | 19 +++ .../src/user_profile_service.test.ts | 97 ++++++++++++ .../src/user_profile_service.ts | 48 ++++++ .../src/utils/convert_api.test.ts | 76 ++++++++++ .../src/utils/convert_api.ts | 23 +++ .../src/utils/default_implementation.test.ts | 34 +++++ .../src/utils/default_implementation.ts | 26 ++++ .../src/utils/index.ts | 10 ++ .../tsconfig.json | 26 ++++ .../core-user-profile-browser-mocks/README.md | 3 + .../core-user-profile-browser-mocks/index.ts | 9 ++ .../jest.config.js | 13 ++ .../kibana.jsonc | 5 + .../package.json | 6 + .../src/user_profile_service.mock.ts | 76 ++++++++++ .../tsconfig.json | 22 +++ .../core-user-profile-browser/README.md | 3 + .../core-user-profile-browser/index.ts | 17 +++ .../core-user-profile-browser/jest.config.js | 13 ++ .../core-user-profile-browser/kibana.jsonc | 5 + .../core-user-profile-browser/package.json | 6 + .../src/api_provider.ts | 14 ++ .../src/contracts.ts | 31 ++++ .../core-user-profile-browser/src/service.ts | 135 +++++++++++++++++ .../core-user-profile-browser/tsconfig.json | 22 +++ .../core-user-profile-common/README.md | 3 + .../core-user-profile-common/index.ts | 16 ++ .../core-user-profile-common/jest.config.js | 13 ++ .../core-user-profile-common/kibana.jsonc | 5 + .../core-user-profile-common/package.json | 6 + .../src}/user_profile.ts | 5 +- .../core-user-profile-common/tsconfig.json | 19 +++ .../README.md | 3 + .../index.ts | 14 ++ .../jest.config.js | 13 ++ .../kibana.jsonc | 5 + .../package.json | 6 + .../src/internal_contracts.ts | 17 +++ .../src/user_profile_route_handler_context.ts | 31 ++++ .../src/user_profile_service.test.mocks.ts | 19 +++ .../src/user_profile_service.test.ts | 97 ++++++++++++ .../src/user_profile_service.ts | 48 ++++++ .../src/utils/convert_api.test.ts | 28 ++++ .../src/utils/convert_api.ts | 16 ++ .../src/utils/default_implementation.test.ts | 36 +++++ .../src/utils/default_implementation.ts | 18 +++ .../src/utils/index.ts | 10 ++ .../tsconfig.json | 25 ++++ .../core-user-profile-server-mocks/README.md | 3 + .../core-user-profile-server-mocks/index.ts | 9 ++ .../jest.config.js | 13 ++ .../kibana.jsonc | 5 + .../package.json | 6 + .../src/user_profile_service.mock.ts | 81 ++++++++++ .../tsconfig.json | 20 +++ .../core-user-profile-server/README.md | 3 + .../core-user-profile-server/index.ts | 18 +++ .../core-user-profile-server/jest.config.js | 13 ++ .../core-user-profile-server/kibana.jsonc | 5 + .../core-user-profile-server/package.json | 6 + .../src/api_provider.ts | 19 +++ .../core-user-profile-server/src/contracts.ts | 31 ++++ .../src/request_handler_context.ts | 19 +++ .../core-user-profile-server/src/service.ts | 17 ++- .../core-user-profile-server/tsconfig.json | 20 +++ src/core/public/index.ts | 16 ++ src/core/server/index.ts | 14 ++ src/core/server/mocks.ts | 3 + src/core/tsconfig.json | 4 + tsconfig.base.json | 14 ++ .../src/user_profile/index.ts | 2 +- .../plugin_types_common/tsconfig.json | 3 +- .../user_profile/user_profile_api_client.ts | 130 ++-------------- .../plugin_types_public/tsconfig.json | 4 +- .../src/user_profile/index.ts | 2 +- .../plugin_types_server/tsconfig.json | 1 + .../fleet/.storybook/context/index.tsx | 7 +- .../public/build_delegate_api.test.ts | 141 ++++++++++++++++++ .../security/public/build_delegate_api.ts | 33 ++++ .../public/build_security_api.test.ts | 40 ----- .../security/public/build_security_api.ts | 21 --- .../plugins/security/public/plugin.test.tsx | 16 +- x-pack/plugins/security/public/plugin.tsx | 7 +- .../server/build_delegate_apis.test.ts | 121 +++++++++++++++ .../security/server/build_delegate_apis.ts | 39 +++++ .../server/build_security_api.test.ts | 44 ------ .../security/server/build_security_api.ts | 24 --- x-pack/plugins/security/server/plugin.test.ts | 10 +- x-pack/plugins/security/server/plugin.ts | 9 +- .../routes/user_profile/get_current.test.ts | 51 ++++--- .../server/routes/user_profile/get_current.ts | 7 +- x-pack/plugins/security/tsconfig.json | 2 + yarn.lock | 28 ++++ 159 files changed, 2279 insertions(+), 357 deletions(-) create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/README.md create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/index.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/package.json create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/README.md create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/index.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/package.json create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts create mode 100644 packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json create mode 100644 packages/core/user-profile/core-user-profile-browser/README.md create mode 100644 packages/core/user-profile/core-user-profile-browser/index.ts create mode 100644 packages/core/user-profile/core-user-profile-browser/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-browser/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-browser/package.json create mode 100644 packages/core/user-profile/core-user-profile-browser/src/api_provider.ts create mode 100644 packages/core/user-profile/core-user-profile-browser/src/contracts.ts create mode 100644 packages/core/user-profile/core-user-profile-browser/src/service.ts create mode 100644 packages/core/user-profile/core-user-profile-browser/tsconfig.json create mode 100644 packages/core/user-profile/core-user-profile-common/README.md create mode 100644 packages/core/user-profile/core-user-profile-common/index.ts create mode 100644 packages/core/user-profile/core-user-profile-common/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-common/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-common/package.json rename {x-pack/packages/security/plugin_types_common/src/user_profile => packages/core/user-profile/core-user-profile-common/src}/user_profile.ts (92%) create mode 100644 packages/core/user-profile/core-user-profile-common/tsconfig.json create mode 100644 packages/core/user-profile/core-user-profile-server-internal/README.md create mode 100644 packages/core/user-profile/core-user-profile-server-internal/index.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-server-internal/package.json create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts create mode 100644 packages/core/user-profile/core-user-profile-server-internal/tsconfig.json create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/README.md create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/index.ts create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/package.json create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts create mode 100644 packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json create mode 100644 packages/core/user-profile/core-user-profile-server/README.md create mode 100644 packages/core/user-profile/core-user-profile-server/index.ts create mode 100644 packages/core/user-profile/core-user-profile-server/jest.config.js create mode 100644 packages/core/user-profile/core-user-profile-server/kibana.jsonc create mode 100644 packages/core/user-profile/core-user-profile-server/package.json create mode 100644 packages/core/user-profile/core-user-profile-server/src/api_provider.ts create mode 100644 packages/core/user-profile/core-user-profile-server/src/contracts.ts create mode 100644 packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts rename x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts => packages/core/user-profile/core-user-profile-server/src/service.ts (91%) create mode 100644 packages/core/user-profile/core-user-profile-server/tsconfig.json create mode 100644 x-pack/plugins/security/public/build_delegate_api.test.ts create mode 100644 x-pack/plugins/security/public/build_delegate_api.ts delete mode 100644 x-pack/plugins/security/public/build_security_api.test.ts delete mode 100644 x-pack/plugins/security/public/build_security_api.ts create mode 100644 x-pack/plugins/security/server/build_delegate_apis.test.ts create mode 100644 x-pack/plugins/security/server/build_delegate_apis.ts delete mode 100644 x-pack/plugins/security/server/build_security_api.test.ts delete mode 100644 x-pack/plugins/security/server/build_security_api.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ae22f91bb038d..4a6c4b24a6800 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -313,6 +313,13 @@ packages/core/usage-data/core-usage-data-base-server-internal @elastic/kibana-co packages/core/usage-data/core-usage-data-server @elastic/kibana-core packages/core/usage-data/core-usage-data-server-internal @elastic/kibana-core packages/core/usage-data/core-usage-data-server-mocks @elastic/kibana-core +packages/core/user-profile/core-user-profile-browser @elastic/kibana-core +packages/core/user-profile/core-user-profile-browser-internal @elastic/kibana-core +packages/core/user-profile/core-user-profile-browser-mocks @elastic/kibana-core +packages/core/user-profile/core-user-profile-common @elastic/kibana-core +packages/core/user-profile/core-user-profile-server @elastic/kibana-core +packages/core/user-profile/core-user-profile-server-internal @elastic/kibana-core +packages/core/user-profile/core-user-profile-server-mocks @elastic/kibana-core packages/core/user-settings/core-user-settings-server @elastic/kibana-security packages/core/user-settings/core-user-settings-server-internal @elastic/kibana-security packages/core/user-settings/core-user-settings-server-mocks @elastic/kibana-security diff --git a/package.json b/package.json index fd15d8a4ce34a..5a1689beb3de3 100644 --- a/package.json +++ b/package.json @@ -368,6 +368,13 @@ "@kbn/core-usage-data-base-server-internal": "link:packages/core/usage-data/core-usage-data-base-server-internal", "@kbn/core-usage-data-server": "link:packages/core/usage-data/core-usage-data-server", "@kbn/core-usage-data-server-internal": "link:packages/core/usage-data/core-usage-data-server-internal", + "@kbn/core-user-profile-browser": "link:packages/core/user-profile/core-user-profile-browser", + "@kbn/core-user-profile-browser-internal": "link:packages/core/user-profile/core-user-profile-browser-internal", + "@kbn/core-user-profile-browser-mocks": "link:packages/core/user-profile/core-user-profile-browser-mocks", + "@kbn/core-user-profile-common": "link:packages/core/user-profile/core-user-profile-common", + "@kbn/core-user-profile-server": "link:packages/core/user-profile/core-user-profile-server", + "@kbn/core-user-profile-server-internal": "link:packages/core/user-profile/core-user-profile-server-internal", + "@kbn/core-user-profile-server-mocks": "link:packages/core/user-profile/core-user-profile-server-mocks", "@kbn/core-user-settings-server": "link:packages/core/user-settings/core-user-settings-server", "@kbn/core-user-settings-server-internal": "link:packages/core/user-settings/core-user-settings-server-internal", "@kbn/core-user-settings-server-mocks": "link:packages/core/user-settings/core-user-settings-server-mocks", diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts index 63aa61c3eced1..1125c7da5f403 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts +++ b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.test.ts @@ -232,3 +232,32 @@ describe('#security', () => { }); }); }); + +describe('#userProfile', () => { + describe('getCurrent', () => { + test('calls coreStart.userProfile.getCurrent with the correct parameters', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = createCoreRouteHandlerContextParamsMock(); + const context = new CoreRouteHandlerContext(coreStart, request); + + context.userProfile?.getCurrent({ dataPath: '/data-path' }); + expect(coreStart.userProfile.getCurrent).toHaveBeenCalledTimes(1); + expect(coreStart.userProfile.getCurrent).toHaveBeenCalledWith({ + request, + dataPath: '/data-path', + }); + }); + + test('returns the result of coreStart.userProfile.getCurrent', () => { + const request = httpServerMock.createKibanaRequest(); + const coreStart = createCoreRouteHandlerContextParamsMock(); + const context = new CoreRouteHandlerContext(coreStart, request); + + const stubProfile: any = Symbol.for('stubProfile'); + coreStart.userProfile.getCurrent.mockReturnValue(stubProfile); + + const profile = context.userProfile?.getCurrent(); + expect(profile).toBe(stubProfile); + }); + }); +}); diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts index f8e428f45ed76..85290fc62698c 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts +++ b/packages/core/http/core-http-request-handler-context-server-internal/src/core_route_handler_context.ts @@ -28,6 +28,10 @@ import { CoreSecurityRouteHandlerContext, type InternalSecurityServiceStart, } from '@kbn/core-security-server-internal'; +import { + CoreUserProfileRouteHandlerContext, + type InternalUserProfileServiceStart, +} from '@kbn/core-user-profile-server-internal'; /** * Subset of `InternalCoreStart` used by {@link CoreRouteHandlerContext} @@ -39,6 +43,7 @@ export interface CoreRouteHandlerContextParams { uiSettings: InternalUiSettingsServiceStart; deprecations: InternalDeprecationsServiceStart; security: InternalSecurityServiceStart; + userProfile: InternalUserProfileServiceStart; } /** @@ -52,6 +57,7 @@ export class CoreRouteHandlerContext implements CoreRequestHandlerContext { #uiSettings?: CoreUiSettingsRouteHandlerContext; #deprecations?: CoreDeprecationsRouteHandlerContext; #security?: CoreSecurityRouteHandlerContext; + #userProfile?: CoreUserProfileRouteHandlerContext; constructor( private readonly coreStart: CoreRouteHandlerContextParams, @@ -105,4 +111,14 @@ export class CoreRouteHandlerContext implements CoreRequestHandlerContext { } return this.#security; } + + public get userProfile() { + if (!this.#userProfile) { + this.#userProfile = new CoreUserProfileRouteHandlerContext( + this.coreStart.userProfile, + this.request + ); + } + return this.#userProfile; + } } diff --git a/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts b/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts index 5e9f30c93e523..735b9e504b3a3 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts +++ b/packages/core/http/core-http-request-handler-context-server-internal/src/test_helpers/core_route_handler_context_params.mock.ts @@ -11,6 +11,7 @@ import { savedObjectsServiceMock } from '@kbn/core-saved-objects-server-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export const createCoreRouteHandlerContextParamsMock = () => { return { @@ -19,5 +20,6 @@ export const createCoreRouteHandlerContextParamsMock = () => { uiSettings: uiSettingsServiceMock.createStartContract(), deprecations: deprecationsServiceMock.createInternalStartContract(), security: securityServiceMock.createInternalStart(), + userProfile: userProfileServiceMock.createInternalStart(), }; }; diff --git a/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json b/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json index 607c0cf7cea7f..9e5ab96901e86 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json +++ b/packages/core/http/core-http-request-handler-context-server-internal/tsconfig.json @@ -25,6 +25,8 @@ "@kbn/core-deprecations-server-mocks", "@kbn/core-security-server-internal", "@kbn/core-security-server-mocks", + "@kbn/core-user-profile-server-internal", + "@kbn/core-user-profile-server-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts b/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts index 6513775395911..735b30abc3b76 100644 --- a/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts +++ b/packages/core/http/core-http-request-handler-context-server/src/request_handler_context.ts @@ -12,6 +12,7 @@ import type { SavedObjectsRequestHandlerContext } from '@kbn/core-saved-objects- import type { DeprecationsRequestHandlerContext } from '@kbn/core-deprecations-server'; import type { UiSettingsRequestHandlerContext } from '@kbn/core-ui-settings-server'; import type { SecurityRequestHandlerContext } from '@kbn/core-security-server'; +import type { UserProfileRequestHandlerContext } from '@kbn/core-user-profile-server'; /** * The `core` context provided to route handler. @@ -33,6 +34,7 @@ export interface CoreRequestHandlerContext { uiSettings: UiSettingsRequestHandlerContext; deprecations: DeprecationsRequestHandlerContext; security: SecurityRequestHandlerContext; + userProfile: UserProfileRequestHandlerContext; } /** diff --git a/packages/core/http/core-http-request-handler-context-server/tsconfig.json b/packages/core/http/core-http-request-handler-context-server/tsconfig.json index 5b20b03ce5918..4606770c753d7 100644 --- a/packages/core/http/core-http-request-handler-context-server/tsconfig.json +++ b/packages/core/http/core-http-request-handler-context-server/tsconfig.json @@ -16,7 +16,8 @@ "@kbn/core-saved-objects-server", "@kbn/core-deprecations-server", "@kbn/core-ui-settings-server", - "@kbn/core-security-server" + "@kbn/core-security-server", + "@kbn/core-user-profile-server" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts index cc2404071ecd5..31116e7060b6d 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_setup.ts @@ -11,12 +11,17 @@ import type { InternalApplicationSetup } from '@kbn/core-application-browser-int import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; import type { InternalHttpSetup } from '@kbn/core-http-browser-internal'; import type { InternalSecurityServiceSetup } from '@kbn/core-security-browser-internal'; +import type { InternalUserProfileServiceSetup } from '@kbn/core-user-profile-browser-internal'; /** @internal */ export interface InternalCoreSetup - extends Omit { + extends Omit< + CoreSetup, + 'application' | 'plugins' | 'getStartServices' | 'http' | 'security' | 'userProfile' + > { application: InternalApplicationSetup; injectedMetadata: InternalInjectedMetadataSetup; http: InternalHttpSetup; security: InternalSecurityServiceSetup; + userProfile: InternalUserProfileServiceSetup; } diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts index 2bfdeaf1da584..7ac2b4e34f102 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/src/internal_core_start.ts @@ -11,12 +11,14 @@ import type { InternalApplicationStart } from '@kbn/core-application-browser-int import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata-browser-internal'; import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { InternalSecurityServiceStart } from '@kbn/core-security-browser-internal'; +import type { InternalUserProfileServiceStart } from '@kbn/core-user-profile-browser-internal'; /** @internal */ export interface InternalCoreStart - extends Omit { + extends Omit { application: InternalApplicationStart; injectedMetadata: InternalInjectedMetadataStart; http: InternalHttpStart; security: InternalSecurityServiceStart; + userProfile: InternalUserProfileServiceStart; } diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json index ae9e07fa47a54..4fd531018418d 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/tsconfig.json @@ -16,7 +16,8 @@ "@kbn/core-application-browser-internal", "@kbn/core-injected-metadata-browser-internal", "@kbn/core-http-browser-internal", - "@kbn/core-security-browser-internal" + "@kbn/core-security-browser-internal", + "@kbn/core-user-profile-browser-internal" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts index 8d6f1daddc8e2..1ce30deb63782 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_setup.mock.ts @@ -18,6 +18,7 @@ import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { applicationServiceMock } from '@kbn/core-application-browser-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks'; import { securityServiceMock } from '@kbn/core-security-browser-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks'; import { createCoreStartMock } from './core_start.mock'; export function createCoreSetupMock({ @@ -46,6 +47,7 @@ export function createCoreSetupMock({ deprecations: deprecationsServiceMock.createSetupContract(), theme: themeServiceMock.createSetupContract(), security: securityServiceMock.createSetup(), + userProfile: userProfileServiceMock.createSetup(), plugins: { onSetup: jest.fn(), onStart: jest.fn(), diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts index 8451778dbe62e..b33b22c12f9c8 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/src/core_start.mock.ts @@ -22,6 +22,7 @@ import { applicationServiceMock } from '@kbn/core-application-browser-mocks'; import { chromeServiceMock } from '@kbn/core-chrome-browser-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks'; import { securityServiceMock } from '@kbn/core-security-browser-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks'; export function createCoreStartMock({ basePath = '' } = {}) { const mock = { @@ -42,6 +43,7 @@ export function createCoreStartMock({ basePath = '' } = {}) { theme: themeServiceMock.createStartContract(), fatalErrors: fatalErrorsServiceMock.createStartContract(), security: securityServiceMock.createStart(), + userProfile: userProfileServiceMock.createStart(), plugins: { onStart: jest.fn(), }, diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json index ba02ede1a594e..b6df8220f8603 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/tsconfig.json @@ -27,7 +27,8 @@ "@kbn/core-application-browser-mocks", "@kbn/core-chrome-browser-mocks", "@kbn/core-custom-branding-browser-mocks", - "@kbn/core-security-browser-mocks" + "@kbn/core-security-browser-mocks", + "@kbn/core-user-profile-browser-mocks" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts index ac5861cf5667b..fa276f375414b 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_setup.ts @@ -17,6 +17,7 @@ import type { ApplicationSetup } from '@kbn/core-application-browser'; import type { CustomBrandingSetup } from '@kbn/core-custom-branding-browser'; import type { PluginsServiceSetup } from '@kbn/core-plugins-contracts-browser'; import type { SecurityServiceSetup } from '@kbn/core-security-browser'; +import type { UserProfileServiceSetup } from '@kbn/core-user-profile-browser'; import type { CoreStart } from './core_start'; /** @@ -59,6 +60,8 @@ export interface CoreSetup; } diff --git a/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts b/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts index 5d1f590b75058..2ea7d3b63d151 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-browser/src/core_start.ts @@ -23,6 +23,7 @@ import type { ChromeStart } from '@kbn/core-chrome-browser'; import type { CustomBrandingStart } from '@kbn/core-custom-branding-browser'; import type { PluginsServiceStart } from '@kbn/core-plugins-contracts-browser'; import type { SecurityServiceStart } from '@kbn/core-security-browser'; +import type { UserProfileServiceStart } from '@kbn/core-user-profile-browser'; /** * Core services exposed to the `Plugin` start lifecycle @@ -74,4 +75,6 @@ export interface CoreStart { plugins: PluginsServiceStart; /** {@link SecurityServiceStart} */ security: SecurityServiceStart; + /** {@link UserProfileServiceStart} */ + userProfile: UserProfileServiceStart; } diff --git a/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json b/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json index 7bfe8720f403b..558694c2c1c91 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-browser/tsconfig.json @@ -28,7 +28,8 @@ "@kbn/core-chrome-browser", "@kbn/core-custom-branding-browser", "@kbn/core-plugins-contracts-browser", - "@kbn/core-security-browser" + "@kbn/core-security-browser", + "@kbn/core-user-profile-browser" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts index 29f07032df027..43a8287e51919 100644 --- a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_setup.ts @@ -27,6 +27,7 @@ import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-serve import type { InternalCustomBrandingSetup } from '@kbn/core-custom-branding-server-internal'; import type { InternalUserSettingsServiceSetup } from '@kbn/core-user-settings-server-internal'; import type { InternalSecurityServiceSetup } from '@kbn/core-security-server-internal'; +import type { InternalUserProfileServiceSetup } from '@kbn/core-user-profile-server-internal'; /** @internal */ export interface InternalCoreSetup { @@ -51,4 +52,5 @@ export interface InternalCoreSetup { customBranding: InternalCustomBrandingSetup; userSettings: InternalUserSettingsServiceSetup; security: InternalSecurityServiceSetup; + userProfile: InternalUserProfileServiceSetup; } diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts index 353b35f92f365..b2c9da09003d2 100644 --- a/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts +++ b/packages/core/lifecycle/core-lifecycle-server-internal/src/internal_core_start.ts @@ -19,6 +19,7 @@ import type { InternalUiSettingsServiceStart } from '@kbn/core-ui-settings-serve import type { CoreUsageDataStart } from '@kbn/core-usage-data-server'; import type { CustomBrandingStart } from '@kbn/core-custom-branding-server'; import type { InternalSecurityServiceStart } from '@kbn/core-security-server-internal'; +import type { InternalUserProfileServiceStart } from '@kbn/core-user-profile-server-internal'; /** * @internal @@ -37,4 +38,5 @@ export interface InternalCoreStart { deprecations: InternalDeprecationsServiceStart; customBranding: CustomBrandingStart; security: InternalSecurityServiceStart; + userProfile: InternalUserProfileServiceStart; } diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json index dc5f481833ad4..1e5c8cb22233a 100644 --- a/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-server-internal/tsconfig.json @@ -34,7 +34,8 @@ "@kbn/core-custom-branding-server-internal", "@kbn/core-custom-branding-server", "@kbn/core-user-settings-server-internal", - "@kbn/core-security-server-internal" + "@kbn/core-security-server-internal", + "@kbn/core-user-profile-server-internal" ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts index 3acd1ff2fb6b0..4f0f8cd7a66dd 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts @@ -27,6 +27,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; import { createCoreStartMock } from './core_start.mock'; type CoreSetupMockType = MockedKeys & { @@ -69,6 +70,7 @@ export function createCoreSetupMock({ deprecations: deprecationsServiceMock.createSetupContract(), executionContext: executionContextServiceMock.createInternalSetupContract(), security: securityServiceMock.createSetup(), + userProfile: userProfileServiceMock.createSetup(), coreUsageData: { registerUsageCounter: coreUsageDataServiceMock.createSetupContract().registerUsageCounter, }, diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts index c01c3c4ec616a..1ca7b1a096e39 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_start.mock.ts @@ -20,6 +20,7 @@ import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export function createCoreStartMock() { const mock: MockedKeys = { @@ -35,6 +36,7 @@ export function createCoreStartMock() { executionContext: executionContextServiceMock.createInternalStartContract(), customBranding: customBrandingServiceMock.createStartContract(), security: securityServiceMock.createStart(), + userProfile: userProfileServiceMock.createStart(), plugins: { onStart: jest.fn(), }, diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts index 066ae6633fff8..fe998ddf721b1 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_setup.mock.ts @@ -27,6 +27,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export function createInternalCoreSetupMock() { const setupDeps = { @@ -51,6 +52,7 @@ export function createInternalCoreSetupMock() { customBranding: customBrandingServiceMock.createSetupContract(), userSettings: userSettingsServiceMock.createSetupContract(), security: securityServiceMock.createInternalSetup(), + userProfile: userProfileServiceMock.createInternalSetup(), }; return setupDeps; } diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts index 8831435dfbeff..5230ce25a0ead 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/internal_core_start.mock.ts @@ -19,6 +19,7 @@ import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export function createInternalCoreStartMock() { const startDeps = { @@ -35,6 +36,7 @@ export function createInternalCoreStartMock() { deprecations: deprecationsServiceMock.createInternalStartContract(), customBranding: customBrandingServiceMock.createStartContract(), security: securityServiceMock.createInternalStart(), + userProfile: userProfileServiceMock.createInternalStart(), }; return startDeps; } diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json b/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json index dfeb7485e9f9c..bacda3278557b 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/tsconfig.json @@ -36,6 +36,7 @@ "@kbn/core-custom-branding-server-mocks", "@kbn/core-user-settings-server-mocks", "@kbn/core-security-server-mocks", + "@kbn/core-user-profile-server-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts index eca43897e554f..c590d562a433c 100644 --- a/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts +++ b/packages/core/lifecycle/core-lifecycle-server/src/core_setup.ts @@ -26,6 +26,7 @@ import type { CustomBrandingSetup } from '@kbn/core-custom-branding-server'; import type { UserSettingsServiceSetup } from '@kbn/core-user-settings-server'; import type { PluginsServiceSetup } from '@kbn/core-plugins-contracts-server'; import type { SecurityServiceSetup } from '@kbn/core-security-server'; +import type { UserProfileServiceSetup } from '@kbn/core-user-profile-server'; import type { CoreStart } from './core_start'; /** @@ -79,6 +80,8 @@ export interface CoreSetup deps.security.registerSecurityApi(api), + registerSecurityDelegate: (api) => deps.security.registerSecurityDelegate(api), + }, + userProfile: { + registerUserProfileDelegate: (delegate) => + deps.userProfile.registerUserProfileDelegate(delegate), }, plugins: { onSetup: (...dependencyNames) => runtimeResolver.onSetup(plugin.name, dependencyNames), @@ -162,6 +166,7 @@ export function createPluginStartContext< security: { authc: deps.security.authc, }, + userProfile: deps.userProfile, plugins: { onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames), }, diff --git a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts index 72ba2b6312316..d4f693fff25d0 100644 --- a/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts +++ b/packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts @@ -42,6 +42,7 @@ import type { CoreSetup, CoreStart } from '@kbn/core-lifecycle-browser'; import { savedObjectsServiceMock } from '@kbn/core-saved-objects-browser-mocks'; import { deprecationsServiceMock } from '@kbn/core-deprecations-browser-mocks'; import { securityServiceMock } from '@kbn/core-security-browser-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks'; export let mockPluginInitializers: Map; @@ -100,6 +101,7 @@ describe('PluginsService', () => { uiSettings: uiSettingsServiceMock.createSetupContract(), theme: themeServiceMock.createSetupContract(), security: securityServiceMock.createInternalSetup(), + userProfile: userProfileServiceMock.createInternalSetup(), }; mockSetupContext = { ...omit(mockSetupDeps, 'injectedMetadata'), @@ -107,6 +109,7 @@ describe('PluginsService', () => { plugins: expect.any(Object), getStartServices: expect.any(Function), security: expect.any(Object), + userProfile: expect.any(Object), http: { ...mockSetupDeps.http, staticAssets: expect.any(Object), @@ -130,6 +133,7 @@ describe('PluginsService', () => { deprecations: deprecationsServiceMock.createStartContract(), theme: themeServiceMock.createStartContract(), security: securityServiceMock.createInternalStart(), + userProfile: userProfileServiceMock.createInternalStart(), }; mockStartContext = { ...omit(mockStartDeps, 'injectedMetadata'), @@ -137,6 +141,7 @@ describe('PluginsService', () => { plugins: expect.any(Object), chrome: omit(mockStartDeps.chrome, 'getComponent'), security: expect.any(Object), + userProfile: expect.any(Object), http: { ...mockStartDeps.http, staticAssets: expect.any(Object), diff --git a/packages/core/plugins/core-plugins-browser-internal/tsconfig.json b/packages/core/plugins/core-plugins-browser-internal/tsconfig.json index 1df9acab0451e..e2e502e821362 100644 --- a/packages/core/plugins/core-plugins-browser-internal/tsconfig.json +++ b/packages/core/plugins/core-plugins-browser-internal/tsconfig.json @@ -38,6 +38,7 @@ "@kbn/utility-types", "@kbn/core-plugins-contracts-browser", "@kbn/core-security-browser-mocks", + "@kbn/core-user-profile-browser-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts index 6928c5791c0a8..830df5c94e008 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts @@ -285,7 +285,11 @@ export function createPluginSetupContext({ onStart: (...dependencyNames) => runtimeResolver.onStart(plugin.name, dependencyNames), }, security: { - registerSecurityApi: (api) => deps.security.registerSecurityApi(api), + registerSecurityDelegate: (api) => deps.security.registerSecurityDelegate(api), + }, + userProfile: { + registerUserProfileDelegate: (delegate) => + deps.userProfile.registerUserProfileDelegate(delegate), }, }; } @@ -366,5 +370,6 @@ export function createPluginStartContext({ security: { authc: deps.security.authc, }, + userProfile: deps.userProfile, }; } diff --git a/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts b/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts index 638024a2eb8ed..e3c4aa171fa93 100644 --- a/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts +++ b/packages/core/root/core-root-browser-internal/src/core_system.test.mocks.ts @@ -26,6 +26,7 @@ import { coreAppsMock } from '@kbn/core-apps-browser-mocks'; import { loggingSystemMock } from '@kbn/core-logging-browser-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks'; import { securityServiceMock } from '@kbn/core-security-browser-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-browser-mocks'; export const analyticsServiceStartMock = analyticsServiceMock.createAnalyticsServiceStart(); export const MockAnalyticsService = analyticsServiceMock.create(); @@ -163,3 +164,11 @@ export const SecurityServiceConstructor = jest.fn().mockImplementation(() => Moc jest.doMock('@kbn/core-security-browser-internal', () => ({ SecurityService: SecurityServiceConstructor, })); + +export const MockUserProfileService = userProfileServiceMock.create(); +export const UserProfileServiceConstructor = jest + .fn() + .mockImplementation(() => MockUserProfileService); +jest.doMock('@kbn/core-user-profile-browser-internal', () => ({ + UserProfileService: UserProfileServiceConstructor, +})); diff --git a/packages/core/root/core-root-browser-internal/src/core_system.test.ts b/packages/core/root/core-root-browser-internal/src/core_system.test.ts index bfe995114b842..e2f3a98ee8e03 100644 --- a/packages/core/root/core-root-browser-internal/src/core_system.test.ts +++ b/packages/core/root/core-root-browser-internal/src/core_system.test.ts @@ -46,6 +46,8 @@ import { CustomBrandingServiceConstructor, MockSecurityService, SecurityServiceConstructor, + MockUserProfileService, + UserProfileServiceConstructor, } from './core_system.test.mocks'; import type { EnvironmentMode } from '@kbn/config'; import { CoreSystem } from './core_system'; @@ -153,6 +155,7 @@ describe('constructor', () => { expect(LoggingSystemConstructor).toHaveBeenCalledTimes(1); expect(CustomBrandingServiceConstructor).toHaveBeenCalledTimes(1); expect(SecurityServiceConstructor).toHaveBeenCalledTimes(1); + expect(UserProfileServiceConstructor).toHaveBeenCalledTimes(1); }); it('passes injectedMetadata param to InjectedMetadataService', () => { @@ -317,6 +320,11 @@ describe('#setup()', () => { await setupCore(); expect(MockSecurityService.setup).toHaveBeenCalledTimes(1); }); + + it('calls userProfile#setup()', async () => { + await setupCore(); + expect(MockUserProfileService.setup).toHaveBeenCalledTimes(1); + }); }); describe('#start()', () => { @@ -508,6 +516,11 @@ describe('#start()', () => { await startCore(); expect(MockSecurityService.start).toHaveBeenCalledTimes(1); }); + + it('calls userProfile#start()', async () => { + await startCore(); + expect(MockUserProfileService.start).toHaveBeenCalledTimes(1); + }); }); describe('#stop()', () => { diff --git a/packages/core/root/core-root-browser-internal/src/core_system.ts b/packages/core/root/core-root-browser-internal/src/core_system.ts index 1bd06082d0a5e..c9dcbf064823a 100644 --- a/packages/core/root/core-root-browser-internal/src/core_system.ts +++ b/packages/core/root/core-root-browser-internal/src/core_system.ts @@ -37,6 +37,7 @@ import type { InternalCoreSetup, InternalCoreStart } from '@kbn/core-lifecycle-b import { PluginsService } from '@kbn/core-plugins-browser-internal'; import { CustomBrandingService } from '@kbn/core-custom-branding-browser-internal'; import { SecurityService } from '@kbn/core-security-browser-internal'; +import { UserProfileService } from '@kbn/core-user-profile-browser-internal'; import { KBN_LOAD_MARKS } from './events'; import { fetchOptionalMemoryInfo } from './fetch_optional_memory_info'; import { @@ -105,6 +106,7 @@ export class CoreSystem { private readonly executionContext: ExecutionContextService; private readonly customBranding: CustomBrandingService; private readonly security: SecurityService; + private readonly userProfile: UserProfileService; private fatalErrorsSetup: FatalErrorsSetup | null = null; constructor(params: CoreSystemParams) { @@ -130,6 +132,7 @@ export class CoreSystem { this.stop(); }); this.security = new SecurityService(this.coreContext); + this.userProfile = new UserProfileService(this.coreContext); this.theme = new ThemeService(); this.notifications = new NotificationsService(); this.http = new HttpService(); @@ -238,6 +241,7 @@ export class CoreSystem { executionContext, }); const security = this.security.setup(); + const userProfile = this.userProfile.setup(); this.chrome.setup({ analytics }); const uiSettings = this.uiSettings.setup({ http, injectedMetadata }); const settings = this.settings.setup({ http, injectedMetadata }); @@ -260,6 +264,7 @@ export class CoreSystem { executionContext, customBranding, security, + userProfile, }; // Services that do not expose contracts at setup @@ -285,6 +290,7 @@ export class CoreSystem { try { const analytics = this.analytics.start(); const security = this.security.start(); + const userProfile = this.userProfile.start(); const injectedMetadata = await this.injectedMetadata.start(); const uiSettings = await this.uiSettings.start(); const settings = await this.settings.start(); @@ -360,6 +366,7 @@ export class CoreSystem { deprecations, customBranding, security, + userProfile, }; await this.plugins.start(core); @@ -423,6 +430,7 @@ export class CoreSystem { this.theme.stop(); this.analytics.stop(); this.security.stop(); + this.userProfile.stop(); this.rootDomElement.textContent = ''; } diff --git a/packages/core/root/core-root-browser-internal/tsconfig.json b/packages/core/root/core-root-browser-internal/tsconfig.json index 8029235949a53..152c7d3683e38 100644 --- a/packages/core/root/core-root-browser-internal/tsconfig.json +++ b/packages/core/root/core-root-browser-internal/tsconfig.json @@ -64,6 +64,8 @@ "@kbn/core-custom-branding-browser-mocks", "@kbn/core-security-browser-mocks", "@kbn/core-security-browser-internal", + "@kbn/core-user-profile-browser-mocks", + "@kbn/core-user-profile-browser-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/root/core-root-server-internal/src/server.test.mocks.ts b/packages/core/root/core-root-server-internal/src/server.test.mocks.ts index 6e4f18637ab15..dd44faeb97bd6 100644 --- a/packages/core/root/core-root-server-internal/src/server.test.mocks.ts +++ b/packages/core/root/core-root-server-internal/src/server.test.mocks.ts @@ -23,6 +23,7 @@ import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks'; import { docLinksServiceMock } from '@kbn/core-doc-links-server-mocks'; import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export const mockHttpService = httpServiceMock.create(); jest.doMock('@kbn/core-http-server-internal', () => ({ @@ -140,6 +141,11 @@ jest.doMock('@kbn/core-security-server-internal', () => ({ SecurityService: jest.fn(() => mockSecurityService), })); +export const mockUserProfileService = userProfileServiceMock.create(); +jest.doMock('@kbn/core-user-profile-server-internal', () => ({ + UserProfileService: jest.fn(() => mockUserProfileService), +})); + export const mockUsageDataService = coreUsageDataServiceMock.create(); jest.doMock('@kbn/core-usage-data-server-internal', () => ({ CoreUsageDataService: jest.fn(() => mockUsageDataService), diff --git a/packages/core/root/core-root-server-internal/src/server.test.ts b/packages/core/root/core-root-server-internal/src/server.test.ts index e226e670d5e31..60073cc5fcfd4 100644 --- a/packages/core/root/core-root-server-internal/src/server.test.ts +++ b/packages/core/root/core-root-server-internal/src/server.test.ts @@ -28,6 +28,7 @@ import { mockCustomBrandingService, mockUserSettingsService, mockSecurityService, + mockUserProfileService, } from './server.test.mocks'; import { BehaviorSubject } from 'rxjs'; @@ -129,6 +130,8 @@ test('sets up services on "setup"', async () => { expect(mockCustomBrandingService.setup).not.toHaveBeenCalled(); expect(mockUserSettingsService.setup).not.toHaveBeenCalled(); expect(mockSecurityService.setup).not.toHaveBeenCalled(); + expect(mockSecurityService.setup).not.toHaveBeenCalled(); + expect(mockUserProfileService.setup).not.toHaveBeenCalled(); await server.setup(); @@ -148,6 +151,7 @@ test('sets up services on "setup"', async () => { expect(mockCustomBrandingService.setup).toHaveBeenCalledTimes(1); expect(mockUserSettingsService.setup).toHaveBeenCalledTimes(1); expect(mockSecurityService.setup).toHaveBeenCalledTimes(1); + expect(mockUserProfileService.setup).toHaveBeenCalledTimes(1); }); test('injects legacy dependency to context#setup()', async () => { @@ -201,6 +205,7 @@ test('runs services on "start"', async () => { expect(mockDocLinksService.start).not.toHaveBeenCalled(); expect(mockCustomBrandingService.start).not.toHaveBeenCalled(); expect(mockSecurityService.start).not.toHaveBeenCalled(); + expect(mockUserProfileService.start).not.toHaveBeenCalled(); await server.start(); @@ -213,6 +218,7 @@ test('runs services on "start"', async () => { expect(mockDocLinksService.start).toHaveBeenCalledTimes(1); expect(mockCustomBrandingService.start).toHaveBeenCalledTimes(1); expect(mockSecurityService.start).toHaveBeenCalledTimes(1); + expect(mockUserProfileService.start).toHaveBeenCalledTimes(1); }); test('does not fail on "setup" if there are unused paths detected', async () => { @@ -241,6 +247,7 @@ test('stops services on "stop"', async () => { expect(mockLoggingService.stop).not.toHaveBeenCalled(); expect(mockCustomBrandingService.stop).not.toHaveBeenCalled(); expect(mockSecurityService.stop).not.toHaveBeenCalled(); + expect(mockUserProfileService.stop).not.toHaveBeenCalled(); await server.stop(); @@ -255,6 +262,7 @@ test('stops services on "stop"', async () => { expect(mockLoggingService.stop).toHaveBeenCalledTimes(1); expect(mockCustomBrandingService.stop).toHaveBeenCalledTimes(1); expect(mockSecurityService.stop).toHaveBeenCalledTimes(1); + expect(mockUserProfileService.stop).toHaveBeenCalledTimes(1); }); test(`doesn't preboot core services if config validation fails`, async () => { diff --git a/packages/core/root/core-root-server-internal/src/server.ts b/packages/core/root/core-root-server-internal/src/server.ts index b26fcb1dce9bf..1439fa19cb64d 100644 --- a/packages/core/root/core-root-server-internal/src/server.ts +++ b/packages/core/root/core-root-server-internal/src/server.ts @@ -52,6 +52,7 @@ import type { import { DiscoveredPlugins, PluginsService } from '@kbn/core-plugins-server-internal'; import { CoreAppsService } from '@kbn/core-apps-server-internal'; import { SecurityService } from '@kbn/core-security-server-internal'; +import { UserProfileService } from '@kbn/core-user-profile-server-internal'; import { registerServiceConfig } from './register_service_config'; import { MIGRATION_EXCEPTION_CODE } from './constants'; import { coreConfig, type CoreConfigType } from './core_config'; @@ -89,6 +90,7 @@ export class Server { private readonly customBranding: CustomBrandingService; private readonly userSettingsService: UserSettingsService; private readonly security: SecurityService; + private readonly userProfile: UserProfileService; private readonly savedObjectsStartPromise: Promise; private resolveSavedObjectsStartPromise?: (value: SavedObjectsServiceStart) => void; @@ -138,6 +140,7 @@ export class Server { this.customBranding = new CustomBrandingService(core); this.userSettingsService = new UserSettingsService(core); this.security = new SecurityService(core); + this.userProfile = new UserProfileService(core); this.savedObjectsStartPromise = new Promise((resolve) => { this.resolveSavedObjectsStartPromise = resolve; @@ -258,6 +261,7 @@ export class Server { const executionContextSetup = this.executionContext.setup(); const docLinksSetup = this.docLinks.setup(); const securitySetup = this.security.setup(); + const userProfileSetup = this.userProfile.setup(); const httpSetup = await this.http.setup({ context: contextServiceSetup, @@ -355,6 +359,7 @@ export class Server { coreUsageData: coreUsageDataSetup, userSettings: userSettingsServiceSetup, security: securitySetup, + userProfile: userProfileSetup, }; const pluginsSetup = await this.plugins.setup(coreSetup); @@ -375,6 +380,7 @@ export class Server { const analyticsStart = this.analytics.start(); const securityStart = this.security.start(); + const userProfileStart = this.userProfile.start(); const executionContextStart = this.executionContext.start(); const docLinkStart = this.docLinks.start(); @@ -435,6 +441,7 @@ export class Server { coreUsageData: coreUsageDataStart, deprecations: deprecationsStart, security: securityStart, + userProfile: userProfileStart, }; await this.plugins.start(this.coreStart); @@ -470,6 +477,7 @@ export class Server { this.node.stop(); this.deprecations.stop(); this.security.stop(); + this.userProfile.stop(); } private registerCoreContext(coreSetup: InternalCoreSetup) { diff --git a/packages/core/root/core-root-server-internal/tsconfig.json b/packages/core/root/core-root-server-internal/tsconfig.json index 6eed4c2e59413..528e1aacc0a93 100644 --- a/packages/core/root/core-root-server-internal/tsconfig.json +++ b/packages/core/root/core-root-server-internal/tsconfig.json @@ -74,6 +74,8 @@ "@kbn/core-security-server-mocks", "@kbn/core-security-server-internal", "@kbn/core-usage-data-server-mocks", + "@kbn/core-user-profile-server-mocks", + "@kbn/core-user-profile-server-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/security/core-security-browser-internal/src/security_service.test.ts b/packages/core/security/core-security-browser-internal/src/security_service.test.ts index e848742586785..4362a80532ff7 100644 --- a/packages/core/security/core-security-browser-internal/src/security_service.test.ts +++ b/packages/core/security/core-security-browser-internal/src/security_service.test.ts @@ -13,11 +13,11 @@ import { import { loggerMock } from '@kbn/logging-mocks'; import { coreContextMock } from '@kbn/core-base-browser-mocks'; -import type { CoreSecurityContract } from '@kbn/core-security-browser'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; import { SecurityService } from './security_service'; -const createStubInternalContract = (): CoreSecurityContract => { - return Symbol('stubContract') as unknown as CoreSecurityContract; +const createStubInternalContract = (): CoreSecurityDelegateContract => { + return Symbol('stubContract') as unknown as CoreSecurityDelegateContract; }; describe('SecurityService', () => { @@ -33,14 +33,14 @@ describe('SecurityService', () => { }); describe('#setup', () => { - describe('#registerSecurityApi', () => { + describe('#registerSecurityDelegate', () => { it('throws if called more than once', () => { - const { registerSecurityApi } = service.setup(); + const { registerSecurityDelegate } = service.setup(); const contract = createStubInternalContract(); - registerSecurityApi(contract); + registerSecurityDelegate(contract); - expect(() => registerSecurityApi(contract)).toThrowErrorMatchingInlineSnapshot( + expect(() => registerSecurityDelegate(contract)).toThrowErrorMatchingInlineSnapshot( `"security API can only be registered once"` ); }); @@ -62,10 +62,10 @@ describe('SecurityService', () => { }); it('calls convertSecurityApi with the registered API', () => { - const { registerSecurityApi } = service.setup(); + const { registerSecurityDelegate } = service.setup(); const contract = createStubInternalContract(); - registerSecurityApi(contract); + registerSecurityDelegate(contract); service.start(); diff --git a/packages/core/security/core-security-browser-internal/src/security_service.ts b/packages/core/security/core-security-browser-internal/src/security_service.ts index e3981ab9d8499..fa249c8868ed6 100644 --- a/packages/core/security/core-security-browser-internal/src/security_service.ts +++ b/packages/core/security/core-security-browser-internal/src/security_service.ts @@ -8,7 +8,7 @@ import type { Logger } from '@kbn/logging'; import type { CoreContext, CoreService } from '@kbn/core-base-browser-internal'; -import type { CoreSecurityContract } from '@kbn/core-security-browser'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; import type { InternalSecurityServiceSetup, InternalSecurityServiceStart, @@ -19,7 +19,7 @@ export class SecurityService implements CoreService { private readonly log: Logger; - private securityApi?: CoreSecurityContract; + private securityApi?: CoreSecurityDelegateContract; constructor(coreContext: CoreContext) { this.log = coreContext.logger.get('security-service'); @@ -27,7 +27,7 @@ export class SecurityService public setup(): InternalSecurityServiceSetup { return { - registerSecurityApi: (api) => { + registerSecurityDelegate: (api) => { if (this.securityApi) { throw new Error('security API can only be registered once'); } diff --git a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts index 11841c5cd25bf..80be695e244e6 100644 --- a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts +++ b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.test.ts @@ -6,12 +6,12 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-browser'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; import { convertSecurityApi } from './convert_security_api'; describe('convertSecurityApi', () => { it('returns the API from the source', () => { - const source: CoreSecurityContract = { authc: { getCurrentUser: jest.fn() } }; + const source: CoreSecurityDelegateContract = { authc: { getCurrentUser: jest.fn() } }; const output = convertSecurityApi(source); expect(output.authc.getCurrentUser).toBe(source.authc.getCurrentUser); }); diff --git a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts index 2b8dfcfb5e849..a916258c1a773 100644 --- a/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts +++ b/packages/core/security/core-security-browser-internal/src/utils/convert_security_api.ts @@ -6,11 +6,11 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-browser'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; import type { InternalSecurityServiceStart } from '../internal_contracts'; export const convertSecurityApi = ( - privateApi: CoreSecurityContract + privateApi: CoreSecurityDelegateContract ): InternalSecurityServiceStart => { // shapes are the same for now given we only have one API exposed. return privateApi; diff --git a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts index 0ea1a7e158e9b..45416820919dc 100644 --- a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts +++ b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.test.ts @@ -6,11 +6,11 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-browser'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; import { getDefaultSecurityImplementation } from './default_implementation'; describe('getDefaultSecurityImplementation', () => { - let implementation: CoreSecurityContract; + let implementation: CoreSecurityDelegateContract; beforeEach(() => { implementation = getDefaultSecurityImplementation(); diff --git a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts index 2d55d05a1ce9f..636be1c2eb618 100644 --- a/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts +++ b/packages/core/security/core-security-browser-internal/src/utils/default_implementation.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-browser'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; -export const getDefaultSecurityImplementation = (): CoreSecurityContract => { +export const getDefaultSecurityImplementation = (): CoreSecurityDelegateContract => { return { authc: { getCurrentUser: () => { diff --git a/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts b/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts index 46cf384f35816..9fea0a6808170 100644 --- a/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts +++ b/packages/core/security/core-security-browser-mocks/src/security_service.mock.ts @@ -14,7 +14,7 @@ import type { const createSetupMock = () => { const mock: jest.Mocked = { - registerSecurityApi: jest.fn(), + registerSecurityDelegate: jest.fn(), }; return mock; @@ -32,7 +32,7 @@ const createStartMock = () => { const createInternalSetupMock = () => { const mock: jest.Mocked = { - registerSecurityApi: jest.fn(), + registerSecurityDelegate: jest.fn(), }; return mock; diff --git a/packages/core/security/core-security-browser/index.ts b/packages/core/security/core-security-browser/index.ts index be698afdb1bd9..531e84dbd84d3 100644 --- a/packages/core/security/core-security-browser/index.ts +++ b/packages/core/security/core-security-browser/index.ts @@ -8,4 +8,7 @@ export type { SecurityServiceSetup, SecurityServiceStart } from './src/contracts'; export type { CoreAuthenticationService } from './src/authc'; -export type { CoreSecurityContract, AuthenticationServiceContract } from './src/api_provider'; +export type { + CoreSecurityDelegateContract, + AuthenticationServiceContract, +} from './src/api_provider'; diff --git a/packages/core/security/core-security-browser/src/api_provider.ts b/packages/core/security/core-security-browser/src/api_provider.ts index 846c9295e1c6d..2bcd9bd9b2b97 100644 --- a/packages/core/security/core-security-browser/src/api_provider.ts +++ b/packages/core/security/core-security-browser/src/api_provider.ts @@ -14,7 +14,7 @@ import type { CoreAuthenticationService } from './authc'; * * @public */ -export interface CoreSecurityContract { +export interface CoreSecurityDelegateContract { authc: AuthenticationServiceContract; } diff --git a/packages/core/security/core-security-browser/src/contracts.ts b/packages/core/security/core-security-browser/src/contracts.ts index b5dfa1b45ec72..8c75b352c5556 100644 --- a/packages/core/security/core-security-browser/src/contracts.ts +++ b/packages/core/security/core-security-browser/src/contracts.ts @@ -7,7 +7,7 @@ */ import type { CoreAuthenticationService } from './authc'; -import type { CoreSecurityContract } from './api_provider'; +import type { CoreSecurityDelegateContract } from './api_provider'; /** * Setup contract for Core's security service. @@ -20,7 +20,7 @@ export interface SecurityServiceSetup { * * @remark this should **exclusively** be used by the security plugin. */ - registerSecurityApi(api: CoreSecurityContract): void; + registerSecurityDelegate(api: CoreSecurityDelegateContract): void; } /** diff --git a/packages/core/security/core-security-server-internal/src/security_service.test.ts b/packages/core/security/core-security-server-internal/src/security_service.test.ts index 4448f4840136b..4f5ae5e86cbab 100644 --- a/packages/core/security/core-security-server-internal/src/security_service.test.ts +++ b/packages/core/security/core-security-server-internal/src/security_service.test.ts @@ -13,11 +13,11 @@ import { import { loggerMock, MockedLogger } from '@kbn/logging-mocks'; import { mockCoreContext } from '@kbn/core-base-server-mocks'; -import type { CoreSecurityContract } from '@kbn/core-security-server'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; import { SecurityService } from './security_service'; -const createStubInternalContract = (): CoreSecurityContract => { - return Symbol('stubContract') as unknown as CoreSecurityContract; +const createStubInternalContract = (): CoreSecurityDelegateContract => { + return Symbol('stubContract') as unknown as CoreSecurityDelegateContract; }; describe('SecurityService', () => { @@ -33,14 +33,14 @@ describe('SecurityService', () => { }); describe('#setup', () => { - describe('#registerSecurityApi', () => { + describe('#registerSecurityDelegate', () => { it('throws if called more than once', () => { - const { registerSecurityApi } = service.setup(); + const { registerSecurityDelegate } = service.setup(); const contract = createStubInternalContract(); - registerSecurityApi(contract); + registerSecurityDelegate(contract); - expect(() => registerSecurityApi(contract)).toThrowErrorMatchingInlineSnapshot( + expect(() => registerSecurityDelegate(contract)).toThrowErrorMatchingInlineSnapshot( `"security API can only be registered once"` ); }); @@ -62,10 +62,10 @@ describe('SecurityService', () => { }); it('calls convertSecurityApi with the registered API', () => { - const { registerSecurityApi } = service.setup(); + const { registerSecurityDelegate } = service.setup(); const contract = createStubInternalContract(); - registerSecurityApi(contract); + registerSecurityDelegate(contract); service.start(); diff --git a/packages/core/security/core-security-server-internal/src/security_service.ts b/packages/core/security/core-security-server-internal/src/security_service.ts index eb9830b6b98e1..826019f773b93 100644 --- a/packages/core/security/core-security-server-internal/src/security_service.ts +++ b/packages/core/security/core-security-server-internal/src/security_service.ts @@ -8,7 +8,7 @@ import type { Logger } from '@kbn/logging'; import type { CoreContext, CoreService } from '@kbn/core-base-server-internal'; -import type { CoreSecurityContract } from '@kbn/core-security-server'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; import type { InternalSecurityServiceSetup, InternalSecurityServiceStart, @@ -19,7 +19,7 @@ export class SecurityService implements CoreService { private readonly log: Logger; - private securityApi?: CoreSecurityContract; + private securityApi?: CoreSecurityDelegateContract; constructor(coreContext: CoreContext) { this.log = coreContext.logger.get('security-service'); @@ -27,7 +27,7 @@ export class SecurityService public setup(): InternalSecurityServiceSetup { return { - registerSecurityApi: (api) => { + registerSecurityDelegate: (api) => { if (this.securityApi) { throw new Error('security API can only be registered once'); } diff --git a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts index 19ec68cc5cba6..6fe51b6873862 100644 --- a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts +++ b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.test.ts @@ -6,12 +6,12 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-server'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; import { convertSecurityApi } from './convert_security_api'; describe('convertSecurityApi', () => { it('returns the API from the source', () => { - const source: CoreSecurityContract = { authc: { getCurrentUser: jest.fn() } }; + const source: CoreSecurityDelegateContract = { authc: { getCurrentUser: jest.fn() } }; const output = convertSecurityApi(source); expect(output.authc.getCurrentUser).toBe(source.authc.getCurrentUser); }); diff --git a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts index 2d8e985d4b523..31056bf337ff9 100644 --- a/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts +++ b/packages/core/security/core-security-server-internal/src/utils/convert_security_api.ts @@ -6,11 +6,11 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-server'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; import type { InternalSecurityServiceStart } from '../internal_contracts'; export const convertSecurityApi = ( - privateApi: CoreSecurityContract + privateApi: CoreSecurityDelegateContract ): InternalSecurityServiceStart => { // shapes are the same for now given we only have one API exposed. return privateApi; diff --git a/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts b/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts index 06a48ef34ab9d..17393d5994bf1 100644 --- a/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts +++ b/packages/core/security/core-security-server-internal/src/utils/default_implementation.test.ts @@ -6,11 +6,11 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-server'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; import { getDefaultSecurityImplementation } from './default_implementation'; describe('getDefaultSecurityImplementation', () => { - let implementation: CoreSecurityContract; + let implementation: CoreSecurityDelegateContract; beforeEach(() => { implementation = getDefaultSecurityImplementation(); diff --git a/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts b/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts index ebf19119989c1..bd4ce287fd498 100644 --- a/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts +++ b/packages/core/security/core-security-server-internal/src/utils/default_implementation.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import type { CoreSecurityContract } from '@kbn/core-security-server'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; -export const getDefaultSecurityImplementation = (): CoreSecurityContract => { +export const getDefaultSecurityImplementation = (): CoreSecurityDelegateContract => { return { authc: { getCurrentUser: () => null, diff --git a/packages/core/security/core-security-server-mocks/src/security_service.mock.ts b/packages/core/security/core-security-server-mocks/src/security_service.mock.ts index 54dd9718471c3..99f86c84461f3 100644 --- a/packages/core/security/core-security-server-mocks/src/security_service.mock.ts +++ b/packages/core/security/core-security-server-mocks/src/security_service.mock.ts @@ -18,7 +18,7 @@ import type { const createSetupMock = () => { const mock: jest.Mocked = { - registerSecurityApi: jest.fn(), + registerSecurityDelegate: jest.fn(), }; return mock; @@ -36,7 +36,7 @@ const createStartMock = () => { const createInternalSetupMock = () => { const mock: jest.Mocked = { - registerSecurityApi: jest.fn(), + registerSecurityDelegate: jest.fn(), }; return mock; diff --git a/packages/core/security/core-security-server/index.ts b/packages/core/security/core-security-server/index.ts index e9507cfee04f4..c8dd3efda695c 100644 --- a/packages/core/security/core-security-server/index.ts +++ b/packages/core/security/core-security-server/index.ts @@ -8,7 +8,10 @@ export type { SecurityServiceSetup, SecurityServiceStart } from './src/contracts'; export type { CoreAuthenticationService } from './src/authc'; -export type { CoreSecurityContract, AuthenticationServiceContract } from './src/api_provider'; +export type { + CoreSecurityDelegateContract, + AuthenticationServiceContract, +} from './src/api_provider'; export type { SecurityRequestHandlerContext, AuthcRequestHandlerContext, diff --git a/packages/core/security/core-security-server/src/api_provider.ts b/packages/core/security/core-security-server/src/api_provider.ts index 846c9295e1c6d..2bcd9bd9b2b97 100644 --- a/packages/core/security/core-security-server/src/api_provider.ts +++ b/packages/core/security/core-security-server/src/api_provider.ts @@ -14,7 +14,7 @@ import type { CoreAuthenticationService } from './authc'; * * @public */ -export interface CoreSecurityContract { +export interface CoreSecurityDelegateContract { authc: AuthenticationServiceContract; } diff --git a/packages/core/security/core-security-server/src/contracts.ts b/packages/core/security/core-security-server/src/contracts.ts index b5dfa1b45ec72..8c75b352c5556 100644 --- a/packages/core/security/core-security-server/src/contracts.ts +++ b/packages/core/security/core-security-server/src/contracts.ts @@ -7,7 +7,7 @@ */ import type { CoreAuthenticationService } from './authc'; -import type { CoreSecurityContract } from './api_provider'; +import type { CoreSecurityDelegateContract } from './api_provider'; /** * Setup contract for Core's security service. @@ -20,7 +20,7 @@ export interface SecurityServiceSetup { * * @remark this should **exclusively** be used by the security plugin. */ - registerSecurityApi(api: CoreSecurityContract): void; + registerSecurityDelegate(api: CoreSecurityDelegateContract): void; } /** diff --git a/packages/core/user-profile/core-user-profile-browser-internal/README.md b/packages/core/user-profile/core-user-profile-browser-internal/README.md new file mode 100644 index 0000000000000..51f91f0a7c38f --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-browser-internal + +This package contains the internal types and implementation for Core's browser-side `userProfile` service. diff --git a/packages/core/user-profile/core-user-profile-browser-internal/index.ts b/packages/core/user-profile/core-user-profile-browser-internal/index.ts new file mode 100644 index 0000000000000..f4c8a9ff31eec --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +export { UserProfileService } from './src/user_profile_service'; +export type { + InternalUserProfileServiceSetup, + InternalUserProfileServiceStart, +} from './src/internal_contracts'; diff --git a/packages/core/user-profile/core-user-profile-browser-internal/jest.config.js b/packages/core/user-profile/core-user-profile-browser-internal/jest.config.js new file mode 100644 index 0000000000000..599ca1dfee688 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-browser-internal'], +}; diff --git a/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc new file mode 100644 index 0000000000000..00e00c831988e --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-browser-internal", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-browser-internal/package.json b/packages/core/user-profile/core-user-profile-browser-internal/package.json new file mode 100644 index 0000000000000..71325aba3a547 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-browser-internal", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts new file mode 100644 index 0000000000000..3b2bca4c39b55 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/internal_contracts.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { + UserProfileServiceSetup, + UserProfileServiceStart, +} from '@kbn/core-user-profile-browser'; + +export type InternalUserProfileServiceSetup = UserProfileServiceSetup; +export type InternalUserProfileServiceStart = UserProfileServiceStart; diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts new file mode 100644 index 0000000000000..81c954d2f0869 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.mocks.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const getDefaultUserProfileImplementationMock = jest.fn(); +export const convertUserProfileAPIMock = jest.fn(); + +jest.doMock('./utils', () => { + const actual = jest.requireActual('./utils'); + return { + ...actual, + getDefaultUserProfileImplementation: getDefaultUserProfileImplementationMock, + convertUserProfileAPI: convertUserProfileAPIMock, + }; +}); diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts new file mode 100644 index 0000000000000..ec89fa1a7fb02 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.test.ts @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + convertUserProfileAPIMock, + getDefaultUserProfileImplementationMock, +} from './user_profile_service.test.mocks'; + +import { loggerMock, MockedLogger } from '@kbn/logging-mocks'; +import { mockCoreContext } from '@kbn/core-base-server-mocks'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import { UserProfileService } from './user_profile_service'; + +const createStubContract = (): CoreUserProfileDelegateContract => { + return Symbol('stubContract') as unknown as CoreUserProfileDelegateContract; +}; + +describe('UserProfileService', () => { + let coreContext: ReturnType; + let service: UserProfileService; + + beforeEach(() => { + coreContext = mockCoreContext.create(); + service = new UserProfileService(coreContext); + + convertUserProfileAPIMock.mockReset(); + getDefaultUserProfileImplementationMock.mockReset(); + }); + + describe('#setup', () => { + describe('#registerUserProfileDelegate', () => { + it('throws if called more than once', () => { + const { registerUserProfileDelegate } = service.setup(); + + const contract = createStubContract(); + registerUserProfileDelegate(contract); + + expect(() => registerUserProfileDelegate(contract)).toThrowErrorMatchingInlineSnapshot( + `"userProfile API can only be registered once"` + ); + }); + }); + }); + + describe('#start', () => { + it('logs a warning if the userProfile API was not registered', () => { + service.setup(); + service.start(); + + expect(loggerMock.collect(coreContext.logger as MockedLogger).warn).toMatchInlineSnapshot(` + Array [ + Array [ + "userProfile API was not registered, using default implementation", + ], + ] + `); + }); + + it('calls convertUserProfileAPI with the registered API', () => { + const { registerUserProfileDelegate } = service.setup(); + + const contract = createStubContract(); + registerUserProfileDelegate(contract); + + service.start(); + + expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1); + expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract); + }); + + it('calls convertUserProfileAPI with the default implementation when no API was registered', () => { + const contract = createStubContract(); + getDefaultUserProfileImplementationMock.mockReturnValue(contract); + + service.setup(); + service.start(); + + expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1); + expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract); + }); + + it('returns the result of convertUserProfileAPI as contract', () => { + const convertedContract = { stub: true }; + convertUserProfileAPIMock.mockReturnValue(convertedContract); + + service.setup(); + const startContract = service.start(); + + expect(startContract).toEqual(convertedContract); + }); + }); +}); diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts new file mode 100644 index 0000000000000..92dc01d92f603 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/user_profile_service.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Logger } from '@kbn/logging'; +import type { CoreContext, CoreService } from '@kbn/core-base-browser-internal'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import type { + InternalUserProfileServiceSetup, + InternalUserProfileServiceStart, +} from './internal_contracts'; +import { getDefaultUserProfileImplementation, convertUserProfileAPI } from './utils'; + +export class UserProfileService + implements CoreService +{ + private readonly log: Logger; + private delegate?: CoreUserProfileDelegateContract; + + constructor(coreContext: CoreContext) { + this.log = coreContext.logger.get('user-profile-service'); + } + + public setup(): InternalUserProfileServiceSetup { + return { + registerUserProfileDelegate: (delegate) => { + if (this.delegate) { + throw new Error('userProfile API can only be registered once'); + } + this.delegate = delegate; + }, + }; + } + + public start(): InternalUserProfileServiceStart { + if (!this.delegate) { + this.log.warn('userProfile API was not registered, using default implementation'); + } + const apiContract = this.delegate ?? getDefaultUserProfileImplementation(); + return convertUserProfileAPI(apiContract); + } + + public stop() {} +} diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts new file mode 100644 index 0000000000000..123e1357bdcc4 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.test.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { of } from 'rxjs'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import type { InternalUserProfileServiceStart } from '../internal_contracts'; +import { convertUserProfileAPI } from './convert_api'; + +describe('convertUserProfileAPI', () => { + let source: jest.Mocked; + let output: InternalUserProfileServiceStart; + + beforeEach(() => { + source = { + userProfile$: of(null), + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + update: jest.fn(), + partialUpdate: jest.fn(), + }; + output = convertUserProfileAPI(source); + }); + + describe('getUserProfile$', () => { + it('returns the observable from the source', () => { + expect(output.getUserProfile$()).toBe(source.userProfile$); + }); + }); + + describe('getCurrent', () => { + it('calls the API from the source with the correct parameters', () => { + output.getCurrent(); + expect(source.getCurrent).toHaveBeenCalledTimes(1); + expect(source.getCurrent).toHaveBeenCalledWith(); + }); + }); + + describe('bulkGet', () => { + it('calls the API from the source with the correct parameters', () => { + const params = { uids: new Set(['fake-uid-1', 'fake-uid-2', 'fake-uid-3']) }; + output.bulkGet(params); + expect(source.bulkGet).toHaveBeenCalledTimes(1); + expect(source.bulkGet).toHaveBeenCalledWith(params); + }); + }); + + describe('suggest', () => { + it('calls the API from the source with the correct parameters', () => { + output.suggest('path', { name: 'foo' }); + expect(source.suggest).toHaveBeenCalledTimes(1); + expect(source.suggest).toHaveBeenCalledWith('path', { name: 'foo' }); + }); + }); + + describe('update', () => { + it('calls the API from the source with the correct parameters', () => { + output.update({ foo: 'dolly' }); + expect(source.update).toHaveBeenCalledTimes(1); + expect(source.update).toHaveBeenCalledWith({ foo: 'dolly' }); + }); + }); + + describe('partialUpdate', () => { + it('calls the API from the source with the correct parameters', () => { + output.partialUpdate({ foo: 'dolly' }); + expect(source.partialUpdate).toHaveBeenCalledTimes(1); + expect(source.partialUpdate).toHaveBeenCalledWith({ foo: 'dolly' }); + }); + }); +}); diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts new file mode 100644 index 0000000000000..0ef054683bf17 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/convert_api.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import type { InternalUserProfileServiceStart } from '../internal_contracts'; + +export const convertUserProfileAPI = ( + delegate: CoreUserProfileDelegateContract +): InternalUserProfileServiceStart => { + return { + getUserProfile$: () => delegate.userProfile$, + getCurrent: delegate.getCurrent.bind(delegate), + bulkGet: delegate.bulkGet.bind(delegate), + suggest: delegate.suggest.bind(delegate), + update: delegate.update.bind(delegate), + partialUpdate: delegate.partialUpdate.bind(delegate), + }; +}; diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts new file mode 100644 index 0000000000000..717fb3e24ef3d --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import { getDefaultUserProfileImplementation } from './default_implementation'; + +describe('getDefaultUserProfileImplementation', () => { + let implementation: CoreUserProfileDelegateContract; + + beforeEach(() => { + implementation = getDefaultUserProfileImplementation(); + }); + + it('getCurrent resolves to null', async () => { + expect(await implementation.getCurrent({ dataPath: '/data-path' })).toBeNull(); + }); + it('bulkGet resolves to empty list', async () => { + expect(await implementation.bulkGet({ uids: new Set() })).toEqual([]); + }); + it('suggest resolves to empty list', async () => { + expect(await implementation.suggest('/suggest', { name: 'foo' })).toEqual([]); + }); + it('update resolves to undefined', async () => { + expect(await implementation.update({})).toBeUndefined(); + }); + it('partialUpdate resolves to undefined', async () => { + expect(await implementation.update({})).toBeUndefined(); + }); +}); diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts new file mode 100644 index 0000000000000..c4bcfa1f29b48 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/default_implementation.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { of } from 'rxjs'; +import type { + CoreUserProfileDelegateContract, + GetUserProfileResponse, +} from '@kbn/core-user-profile-browser'; +import { UserProfileData } from '@kbn/core-user-profile-common'; + +export const getDefaultUserProfileImplementation = (): CoreUserProfileDelegateContract => { + return { + userProfile$: of(null), + getCurrent: () => + Promise.resolve(null as unknown as GetUserProfileResponse), + bulkGet: () => Promise.resolve([]), + suggest: () => Promise.resolve([]), + update: () => Promise.resolve(), + partialUpdate: () => Promise.resolve(), + }; +}; diff --git a/packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts new file mode 100644 index 0000000000000..e7e39fbf3e6f7 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/src/utils/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { convertUserProfileAPI } from './convert_api'; +export { getDefaultUserProfileImplementation } from './default_implementation'; diff --git a/packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json b/packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json new file mode 100644 index 0000000000000..ab75fcaab6575 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-internal/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-user-profile-browser", + "@kbn/logging-mocks", + "@kbn/core-base-server-mocks", + "@kbn/logging", + "@kbn/core-base-browser-internal", + "@kbn/core-user-profile-common", + ] +} diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/README.md b/packages/core/user-profile/core-user-profile-browser-mocks/README.md new file mode 100644 index 0000000000000..fde320e84e63d --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-browser-mocks + +This package contains mocks types for Core's browser-side `userProfile` service. diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/index.ts b/packages/core/user-profile/core-user-profile-browser-mocks/index.ts new file mode 100644 index 0000000000000..b114ce1d93d2a --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { userProfileServiceMock } from './src/user_profile_service.mock'; diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js b/packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js new file mode 100644 index 0000000000000..62a2799bab8b4 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-browser-mocks'], +}; diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc new file mode 100644 index 0000000000000..49e11fd3d169d --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-browser-mocks", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/package.json b/packages/core/user-profile/core-user-profile-browser-mocks/package.json new file mode 100644 index 0000000000000..3fb503ad8c242 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-browser-mocks", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts b/packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts new file mode 100644 index 0000000000000..c43dfa6b915c7 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/src/user_profile_service.mock.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { + UserProfileServiceSetup, + UserProfileServiceStart, +} from '@kbn/core-user-profile-browser'; +import type { + InternalUserProfileServiceSetup, + InternalUserProfileServiceStart, +} from '@kbn/core-user-profile-browser-internal'; + +const createSetupMock = () => { + const mock: jest.Mocked = { + registerUserProfileDelegate: jest.fn(), + }; + + return mock; +}; + +const createStartMock = () => { + const mock: jest.Mocked = { + getUserProfile$: jest.fn(), + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + update: jest.fn(), + partialUpdate: jest.fn(), + }; + + return mock; +}; + +const createInternalSetupMock = () => { + const mock: jest.Mocked = { + registerUserProfileDelegate: jest.fn(), + }; + + return mock; +}; + +const createInternalStartMock = () => { + const mock: jest.Mocked = { + getUserProfile$: jest.fn(), + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + update: jest.fn(), + partialUpdate: jest.fn(), + }; + + return mock; +}; + +const createServiceMock = () => { + const mock = { + setup: jest.fn().mockReturnValue(createSetupMock()), + start: jest.fn().mockReturnValue(createStartMock()), + stop: jest.fn(), + }; + + return mock; +}; + +export const userProfileServiceMock = { + create: createServiceMock, + createSetup: createSetupMock, + createStart: createStartMock, + createInternalSetup: createInternalSetupMock, + createInternalStart: createInternalStartMock, +}; diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json b/packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json new file mode 100644 index 0000000000000..b4f4683993884 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser-mocks/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-user-profile-browser", + "@kbn/core-user-profile-browser-internal", + ] +} diff --git a/packages/core/user-profile/core-user-profile-browser/README.md b/packages/core/user-profile/core-user-profile-browser/README.md new file mode 100644 index 0000000000000..fc68cd364872d --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-browser + +This package contains the public types for Core's browser-side `userProfile` service. diff --git a/packages/core/user-profile/core-user-profile-browser/index.ts b/packages/core/user-profile/core-user-profile-browser/index.ts new file mode 100644 index 0000000000000..d98d1fa1437c2 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export type { UserProfileServiceSetup, UserProfileServiceStart } from './src/contracts'; +export type { CoreUserProfileDelegateContract } from './src/api_provider'; +export type { + UserProfileService, + UserProfileSuggestParams, + UserProfileBulkGetParams, + GetUserProfileResponse, + UserProfileGetCurrentParams, +} from './src/service'; diff --git a/packages/core/user-profile/core-user-profile-browser/jest.config.js b/packages/core/user-profile/core-user-profile-browser/jest.config.js new file mode 100644 index 0000000000000..4fac3199bb1f3 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-browser'], +}; diff --git a/packages/core/user-profile/core-user-profile-browser/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser/kibana.jsonc new file mode 100644 index 0000000000000..376ee21cdb901 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-browser", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-browser/package.json b/packages/core/user-profile/core-user-profile-browser/package.json new file mode 100644 index 0000000000000..7598349094a73 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-browser", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-browser/src/api_provider.ts b/packages/core/user-profile/core-user-profile-browser/src/api_provider.ts new file mode 100644 index 0000000000000..6e21886009063 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/src/api_provider.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import type { Observable } from 'rxjs'; +import type { UserProfileData } from '@kbn/core-user-profile-common'; +import type { UserProfileService } from './service'; + +export type CoreUserProfileDelegateContract = Omit & { + userProfile$: Observable; +}; diff --git a/packages/core/user-profile/core-user-profile-browser/src/contracts.ts b/packages/core/user-profile/core-user-profile-browser/src/contracts.ts new file mode 100644 index 0000000000000..dc7b50e9cd171 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/src/contracts.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { UserProfileService } from './service'; +import type { CoreUserProfileDelegateContract } from './api_provider'; + +/** + * Setup contract for Core's userProfile service. + * + * @public + */ +export interface UserProfileServiceSetup { + /** + * Register the userProfile implementation that will be used and re-exposed by Core. + * + * @remark this should **exclusively** be used by the security plugin. + */ + registerUserProfileDelegate(delegate: CoreUserProfileDelegateContract): void; +} + +/** + * Start contract for Core's userProfile service. + * + * @public + */ +export type UserProfileServiceStart = UserProfileService; diff --git a/packages/core/user-profile/core-user-profile-browser/src/service.ts b/packages/core/user-profile/core-user-profile-browser/src/service.ts new file mode 100644 index 0000000000000..98db65991c9ef --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/src/service.ts @@ -0,0 +1,135 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Observable } from 'rxjs'; +import type { AuthenticatedUser } from '@kbn/core-security-common'; +import type { + UserProfileData, + UserProfileWithSecurity, + UserProfile, +} from '@kbn/core-user-profile-common'; + +export interface UserProfileService { + /** + * Retrieve an observable emitting when the user profile is loaded. + */ + getUserProfile$(): Observable; + + /** + * Retrieves the user profile of the current user. If the profile isn't available, e.g. for the anonymous users or + * users authenticated via authenticating proxies, the `null` value is returned. + * @param [params] Get current user profile operation parameters. + * @param params.dataPath By default `getCurrent()` returns user information, but does not return any user data. The + * optional "dataPath" parameter can be used to return personal data for this user (within `kibana` namespace only). + */ + getCurrent( + params?: UserProfileGetCurrentParams + ): Promise>; + + /** + * Retrieves multiple user profiles by their identifiers. + * @param params Bulk get operation parameters. + * @param params.uids List of user profile identifiers. + * @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The + * optional "dataPath" parameter can be used to return personal data for the requested user + * profiles (within `kibana` namespace only). + */ + bulkGet( + params: UserProfileBulkGetParams + ): Promise>>; + + /** + * Suggests multiple user profiles by search criteria. + * + * Note: This endpoint is not provided out-of-the-box by the platform. You need to expose your own + * version within your app. An example of how to do this can be found in: + * `examples/user_profile_examples/server/plugin.ts` + * + * @param path Path to your app's suggest endpoint. + * @param params Suggest operation parameters. + * @param params.name Query string used to match name-related fields in user profiles. The + * following fields are treated as name-related: username, full_name and email. + * @param params.size Desired number of suggestions to return. The default value is 10. + * @param params.dataPath By default, suggest API returns user information, but does not return + * any user data. The optional "dataPath" parameter can be used to return personal data for this + * user (within `kibana` namespace only). + */ + suggest( + path: string, + params: UserProfileSuggestParams + ): Promise>>; + + /** + * Updates user profile data of the current user. + * @param data Application data to be written (merged with existing data). + */ + update(data: D): Promise; + + /** + * Partially updates user profile data of the current user, merging the previous data with the provided data. + * @param data Application data to be merged with existing data. + */ + partialUpdate>(data: D): Promise; +} + +/** + * Parameters for the get user profile for the current user API. + */ +export interface UserProfileGetCurrentParams { + /** + * By default, get API returns user information, but does not return any user data. The optional "dataPath" + * parameter can be used to return personal data for this user (within `kibana` namespace only). + */ + dataPath: string; +} + +export interface GetUserProfileResponse + extends UserProfileWithSecurity { + /** + * Information about the currently authenticated user that owns the profile. + */ + user: UserProfileWithSecurity['user'] & Pick; +} + +/** + * Parameters for the bulk get API. + */ +export interface UserProfileBulkGetParams { + /** + * List of user profile identifiers. + */ + uids: Set; + + /** + * By default, suggest API returns user information, but does not return any user data. The optional "dataPath" + * parameter can be used to return personal data for this user (within `kibana` namespace only). + */ + dataPath?: string; +} + +/** + * Parameters for the suggest API. + */ +export interface UserProfileSuggestParams { + /** + * Query string used to match name-related fields in user profiles. The following fields are treated as + * name-related: username, full_name and email. + */ + name: string; + + /** + * Desired number of suggestions to return. The default value is 10. + */ + size?: number; + + /** + * By default, suggest API returns user information, but does not return any user data. The optional "dataPath" + * parameter can be used to return personal data for this user (within `kibana` namespace only). + */ + dataPath?: string; +} diff --git a/packages/core/user-profile/core-user-profile-browser/tsconfig.json b/packages/core/user-profile/core-user-profile-browser/tsconfig.json new file mode 100644 index 0000000000000..47b7d8c2017fe --- /dev/null +++ b/packages/core/user-profile/core-user-profile-browser/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-user-profile-common", + "@kbn/core-security-common", + ] +} diff --git a/packages/core/user-profile/core-user-profile-common/README.md b/packages/core/user-profile/core-user-profile-common/README.md new file mode 100644 index 0000000000000..c3d7a6784bf70 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-common/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-common + +This package contains the common public types for Core's `userProfile` domain. diff --git a/packages/core/user-profile/core-user-profile-common/index.ts b/packages/core/user-profile/core-user-profile-common/index.ts new file mode 100644 index 0000000000000..89341d28c117c --- /dev/null +++ b/packages/core/user-profile/core-user-profile-common/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export type { + UserProfileData, + UserProfileLabels, + UserProfileWithSecurity, + UserProfile, + UserProfileUserInfoWithSecurity, + UserProfileUserInfo, +} from './src/user_profile'; diff --git a/packages/core/user-profile/core-user-profile-common/jest.config.js b/packages/core/user-profile/core-user-profile-common/jest.config.js new file mode 100644 index 0000000000000..1911410ec00a4 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-common/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-common'], +}; diff --git a/packages/core/user-profile/core-user-profile-common/kibana.jsonc b/packages/core/user-profile/core-user-profile-common/kibana.jsonc new file mode 100644 index 0000000000000..1cc049fd41717 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-common/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-common", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-common/package.json b/packages/core/user-profile/core-user-profile-common/package.json new file mode 100644 index 0000000000000..fcc5b79e1256b --- /dev/null +++ b/packages/core/user-profile/core-user-profile-common/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-common", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/x-pack/packages/security/plugin_types_common/src/user_profile/user_profile.ts b/packages/core/user-profile/core-user-profile-common/src/user_profile.ts similarity index 92% rename from x-pack/packages/security/plugin_types_common/src/user_profile/user_profile.ts rename to packages/core/user-profile/core-user-profile-common/src/user_profile.ts index 13743974afea1..91e7b82217cba 100644 --- a/x-pack/packages/security/plugin_types_common/src/user_profile/user_profile.ts +++ b/packages/core/user-profile/core-user-profile-common/src/user_profile.ts @@ -1,8 +1,9 @@ /* * 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. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ /** diff --git a/packages/core/user-profile/core-user-profile-common/tsconfig.json b/packages/core/user-profile/core-user-profile-common/tsconfig.json new file mode 100644 index 0000000000000..b05325b824a67 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-common/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/packages/core/user-profile/core-user-profile-server-internal/README.md b/packages/core/user-profile/core-user-profile-server-internal/README.md new file mode 100644 index 0000000000000..7e089c466f903 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-server-internal + +This package contains the internal types and implementation for Core's server-side `userProfile` service. diff --git a/packages/core/user-profile/core-user-profile-server-internal/index.ts b/packages/core/user-profile/core-user-profile-server-internal/index.ts new file mode 100644 index 0000000000000..fc8fb9848883c --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { UserProfileService } from './src/user_profile_service'; +export { CoreUserProfileRouteHandlerContext } from './src/user_profile_route_handler_context'; +export type { + InternalUserProfileServiceSetup, + InternalUserProfileServiceStart, +} from './src/internal_contracts'; diff --git a/packages/core/user-profile/core-user-profile-server-internal/jest.config.js b/packages/core/user-profile/core-user-profile-server-internal/jest.config.js new file mode 100644 index 0000000000000..6bf5e351dbb95 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-server-internal'], +}; diff --git a/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc b/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc new file mode 100644 index 0000000000000..dc23dd4450d28 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-server-internal", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-server-internal/package.json b/packages/core/user-profile/core-user-profile-server-internal/package.json new file mode 100644 index 0000000000000..0f37653649bf9 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-server-internal", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts b/packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts new file mode 100644 index 0000000000000..b1220eb9adf97 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/internal_contracts.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { + UserProfileServiceSetup, + UserProfileServiceStart, + CoreUserProfileDelegateContract, +} from '@kbn/core-user-profile-server'; + +export type InternalUserProfileServiceSetup = UserProfileServiceSetup; +export type InternalUserProfileServiceStart = UserProfileServiceStart & + Pick; diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts new file mode 100644 index 0000000000000..3fe3652872a93 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_route_handler_context.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { UserProfileRequestHandlerContext } from '@kbn/core-user-profile-server'; +import type { + UserProfileData, + UserProfileLabels, + UserProfileWithSecurity, +} from '@kbn/core-user-profile-common'; +import type { InternalUserProfileServiceStart } from './internal_contracts'; + +export class CoreUserProfileRouteHandlerContext implements UserProfileRequestHandlerContext { + constructor( + private readonly userProfileStart: InternalUserProfileServiceStart, + private readonly request: KibanaRequest + ) {} + + getCurrent({ + dataPath, + }: { + dataPath?: string; + } = {}): Promise | null> { + return this.userProfileStart.getCurrent({ request: this.request, dataPath }); + } +} diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts new file mode 100644 index 0000000000000..81c954d2f0869 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.mocks.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const getDefaultUserProfileImplementationMock = jest.fn(); +export const convertUserProfileAPIMock = jest.fn(); + +jest.doMock('./utils', () => { + const actual = jest.requireActual('./utils'); + return { + ...actual, + getDefaultUserProfileImplementation: getDefaultUserProfileImplementationMock, + convertUserProfileAPI: convertUserProfileAPIMock, + }; +}); diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts new file mode 100644 index 0000000000000..0fdbc5572109e --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.test.ts @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + convertUserProfileAPIMock, + getDefaultUserProfileImplementationMock, +} from './user_profile_service.test.mocks'; + +import { loggerMock, MockedLogger } from '@kbn/logging-mocks'; +import { mockCoreContext } from '@kbn/core-base-server-mocks'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; +import { UserProfileService } from './user_profile_service'; + +const createStubContract = (): CoreUserProfileDelegateContract => { + return Symbol('stubContract') as unknown as CoreUserProfileDelegateContract; +}; + +describe('UserProfileService', () => { + let coreContext: ReturnType; + let service: UserProfileService; + + beforeEach(() => { + coreContext = mockCoreContext.create(); + service = new UserProfileService(coreContext); + + convertUserProfileAPIMock.mockReset(); + getDefaultUserProfileImplementationMock.mockReset(); + }); + + describe('#setup', () => { + describe('#registerUserProfileDelegate', () => { + it('throws if called more than once', () => { + const { registerUserProfileDelegate } = service.setup(); + + const contract = createStubContract(); + registerUserProfileDelegate(contract); + + expect(() => registerUserProfileDelegate(contract)).toThrowErrorMatchingInlineSnapshot( + `"userProfile API can only be registered once"` + ); + }); + }); + }); + + describe('#start', () => { + it('logs a warning if the userProfile API was not registered', () => { + service.setup(); + service.start(); + + expect(loggerMock.collect(coreContext.logger as MockedLogger).warn).toMatchInlineSnapshot(` + Array [ + Array [ + "userProfile API was not registered, using default implementation", + ], + ] + `); + }); + + it('calls convertUserProfileAPI with the registered API', () => { + const { registerUserProfileDelegate } = service.setup(); + + const contract = createStubContract(); + registerUserProfileDelegate(contract); + + service.start(); + + expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1); + expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract); + }); + + it('calls convertUserProfileAPI with the default implementation when no API was registered', () => { + const contract = createStubContract(); + getDefaultUserProfileImplementationMock.mockReturnValue(contract); + + service.setup(); + service.start(); + + expect(convertUserProfileAPIMock).toHaveBeenCalledTimes(1); + expect(convertUserProfileAPIMock).toHaveBeenCalledWith(contract); + }); + + it('returns the result of convertUserProfileAPI as contract', () => { + const convertedContract = { stub: true }; + convertUserProfileAPIMock.mockReturnValue(convertedContract); + + service.setup(); + const startContract = service.start(); + + expect(startContract).toEqual(convertedContract); + }); + }); +}); diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts new file mode 100644 index 0000000000000..3c876c7d807a4 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/user_profile_service.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Logger } from '@kbn/logging'; +import type { CoreContext, CoreService } from '@kbn/core-base-server-internal'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; +import type { + InternalUserProfileServiceSetup, + InternalUserProfileServiceStart, +} from './internal_contracts'; +import { getDefaultUserProfileImplementation, convertUserProfileAPI } from './utils'; + +export class UserProfileService + implements CoreService +{ + private readonly log: Logger; + private delegate?: CoreUserProfileDelegateContract; + + constructor(coreContext: CoreContext) { + this.log = coreContext.logger.get('user-profile-service'); + } + + public setup(): InternalUserProfileServiceSetup { + return { + registerUserProfileDelegate: (delegate) => { + if (this.delegate) { + throw new Error('userProfile API can only be registered once'); + } + this.delegate = delegate; + }, + }; + } + + public start(): InternalUserProfileServiceStart { + if (!this.delegate) { + this.log.warn('userProfile API was not registered, using default implementation'); + } + const apiContract = this.delegate ?? getDefaultUserProfileImplementation(); + return convertUserProfileAPI(apiContract); + } + + public stop() {} +} diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts new file mode 100644 index 0000000000000..74822aeea603b --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.test.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; +import { convertUserProfileAPI } from './convert_api'; + +describe('convertUserProfileAPI', () => { + it('returns the API from the source', () => { + const source: CoreUserProfileDelegateContract = { + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + update: jest.fn(), + }; + + const output = convertUserProfileAPI(source); + + expect(output.getCurrent).toBe(source.getCurrent); + expect(output.bulkGet).toBe(source.bulkGet); + expect(output.suggest).toBe(source.suggest); + expect(output.update).toBe(source.update); + }); +}); diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts new file mode 100644 index 0000000000000..5cd6edbfa920f --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/convert_api.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; +import type { InternalUserProfileServiceStart } from '../internal_contracts'; + +export const convertUserProfileAPI = ( + delegate: CoreUserProfileDelegateContract +): InternalUserProfileServiceStart => { + return delegate; +}; diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts new file mode 100644 index 0000000000000..31811dcadb48b --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.test.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; +import { getDefaultUserProfileImplementation } from './default_implementation'; + +describe('getDefaultUserProfileImplementation', () => { + let implementation: CoreUserProfileDelegateContract; + + const mockRequest = () => { + return {} as unknown as KibanaRequest; + }; + + beforeEach(() => { + implementation = getDefaultUserProfileImplementation(); + }); + + it('getCurrent resolves to null', async () => { + expect(await implementation.getCurrent({ request: mockRequest() })).toBeNull(); + }); + it('bulkGet resolves to empty list', async () => { + expect(await implementation.bulkGet({ uids: new Set() })).toEqual([]); + }); + it('suggest resolves to empty list', async () => { + expect(await implementation.suggest({})).toEqual([]); + }); + it('update resolves to undefined', async () => { + expect(await implementation.update('foo', {})).toBeUndefined(); + }); +}); diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts new file mode 100644 index 0000000000000..c837696c0158c --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/default_implementation.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; + +export const getDefaultUserProfileImplementation = (): CoreUserProfileDelegateContract => { + return { + getCurrent: () => Promise.resolve(null), + bulkGet: () => Promise.resolve([]), + suggest: () => Promise.resolve([]), + update: () => Promise.resolve(), + }; +}; diff --git a/packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts b/packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts new file mode 100644 index 0000000000000..e7e39fbf3e6f7 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/src/utils/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { convertUserProfileAPI } from './convert_api'; +export { getDefaultUserProfileImplementation } from './default_implementation'; diff --git a/packages/core/user-profile/core-user-profile-server-internal/tsconfig.json b/packages/core/user-profile/core-user-profile-server-internal/tsconfig.json new file mode 100644 index 0000000000000..db09577dded94 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-internal/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-user-profile-server", + "@kbn/core-http-server", + "@kbn/core-user-profile-common", + "@kbn/logging", + "@kbn/core-base-server-internal", + "@kbn/logging-mocks", + "@kbn/core-base-server-mocks", + ] +} diff --git a/packages/core/user-profile/core-user-profile-server-mocks/README.md b/packages/core/user-profile/core-user-profile-server-mocks/README.md new file mode 100644 index 0000000000000..f1dc294a4198f --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-server-mocks + +This package contains mocks types for Core's server-side `userProfile` service. diff --git a/packages/core/user-profile/core-user-profile-server-mocks/index.ts b/packages/core/user-profile/core-user-profile-server-mocks/index.ts new file mode 100644 index 0000000000000..b114ce1d93d2a --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { userProfileServiceMock } from './src/user_profile_service.mock'; diff --git a/packages/core/user-profile/core-user-profile-server-mocks/jest.config.js b/packages/core/user-profile/core-user-profile-server-mocks/jest.config.js new file mode 100644 index 0000000000000..746236502cafc --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-server-mocks'], +}; diff --git a/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc b/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc new file mode 100644 index 0000000000000..bd62cf371dbc3 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-server-mocks", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-server-mocks/package.json b/packages/core/user-profile/core-user-profile-server-mocks/package.json new file mode 100644 index 0000000000000..a77996ce9f5e8 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-server-mocks", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts b/packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts new file mode 100644 index 0000000000000..193428b32a21c --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/src/user_profile_service.mock.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { + UserProfileServiceSetup, + UserProfileServiceStart, + UserProfileRequestHandlerContext, +} from '@kbn/core-user-profile-server'; +import type { + InternalUserProfileServiceSetup, + InternalUserProfileServiceStart, +} from '@kbn/core-user-profile-server-internal'; + +const createSetupMock = () => { + const mock: jest.Mocked = { + registerUserProfileDelegate: jest.fn(), + }; + + return mock; +}; + +const createStartMock = () => { + const mock: jest.Mocked = { + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + }; + + return mock; +}; + +const createInternalSetupMock = () => { + const mock: jest.Mocked = { + registerUserProfileDelegate: jest.fn(), + }; + + return mock; +}; + +const createInternalStartMock = () => { + const mock: jest.Mocked = { + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + update: jest.fn(), + }; + + return mock; +}; + +const createServiceMock = () => { + const mock = { + setup: jest.fn().mockReturnValue(createSetupMock()), + start: jest.fn().mockReturnValue(createStartMock()), + stop: jest.fn(), + }; + + return mock; +}; + +const createRequestHandlerContextMock = () => { + const mock: jest.Mocked = { + getCurrent: jest.fn(), + }; + + return mock; +}; + +export const userProfileServiceMock = { + create: createServiceMock, + createSetup: createSetupMock, + createStart: createStartMock, + createInternalSetup: createInternalSetupMock, + createInternalStart: createInternalStartMock, + createRequestHandlerContext: createRequestHandlerContextMock, +}; diff --git a/packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json b/packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json new file mode 100644 index 0000000000000..a2f13d1e160c7 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server-mocks/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-user-profile-server", + "@kbn/core-user-profile-server-internal", + ] +} diff --git a/packages/core/user-profile/core-user-profile-server/README.md b/packages/core/user-profile/core-user-profile-server/README.md new file mode 100644 index 0000000000000..18dd654962b89 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/README.md @@ -0,0 +1,3 @@ +# @kbn/core-user-profile-server + +This package contains the public types for Core's server-side `userProfile` service. diff --git a/packages/core/user-profile/core-user-profile-server/index.ts b/packages/core/user-profile/core-user-profile-server/index.ts new file mode 100644 index 0000000000000..a6056a5eb5f0b --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export type { UserProfileServiceSetup, UserProfileServiceStart } from './src/contracts'; +export type { CoreUserProfileDelegateContract } from './src/api_provider'; +export type { + UserProfileService, + UserProfileSuggestParams, + UserProfileBulkGetParams, + UserProfileRequiredPrivileges, + UserProfileGetCurrentParams, +} from './src/service'; +export type { UserProfileRequestHandlerContext } from './src/request_handler_context'; diff --git a/packages/core/user-profile/core-user-profile-server/jest.config.js b/packages/core/user-profile/core-user-profile-server/jest.config.js new file mode 100644 index 0000000000000..6b79add0b553d --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/user-profile/core-user-profile-server'], +}; diff --git a/packages/core/user-profile/core-user-profile-server/kibana.jsonc b/packages/core/user-profile/core-user-profile-server/kibana.jsonc new file mode 100644 index 0000000000000..8d47dde6b5a6f --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/core-user-profile-server", + "owner": "@elastic/kibana-core" +} diff --git a/packages/core/user-profile/core-user-profile-server/package.json b/packages/core/user-profile/core-user-profile-server/package.json new file mode 100644 index 0000000000000..0bc1664de8163 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/core-user-profile-server", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-server/src/api_provider.ts b/packages/core/user-profile/core-user-profile-server/src/api_provider.ts new file mode 100644 index 0000000000000..d65140536dfbf --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/src/api_provider.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { UserProfileData } from '@kbn/core-user-profile-common'; +import type { UserProfileService } from './service'; + +export type CoreUserProfileDelegateContract = UserProfileService & { + /** + * Updates user preferences by identifier. + * @param uid User ID + * @param data Application data to be written (merged with existing data). + */ + update(uid: string, data: D): Promise; +}; diff --git a/packages/core/user-profile/core-user-profile-server/src/contracts.ts b/packages/core/user-profile/core-user-profile-server/src/contracts.ts new file mode 100644 index 0000000000000..dc7b50e9cd171 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/src/contracts.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { UserProfileService } from './service'; +import type { CoreUserProfileDelegateContract } from './api_provider'; + +/** + * Setup contract for Core's userProfile service. + * + * @public + */ +export interface UserProfileServiceSetup { + /** + * Register the userProfile implementation that will be used and re-exposed by Core. + * + * @remark this should **exclusively** be used by the security plugin. + */ + registerUserProfileDelegate(delegate: CoreUserProfileDelegateContract): void; +} + +/** + * Start contract for Core's userProfile service. + * + * @public + */ +export type UserProfileServiceStart = UserProfileService; diff --git a/packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts b/packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts new file mode 100644 index 0000000000000..c6e4914dada19 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/src/request_handler_context.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + UserProfileData, + UserProfileLabels, + UserProfileWithSecurity, +} from '@kbn/core-user-profile-common'; + +export interface UserProfileRequestHandlerContext { + getCurrent(options?: { + dataPath?: string; + }): Promise | null>; +} diff --git a/x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts b/packages/core/user-profile/core-user-profile-server/src/service.ts similarity index 91% rename from x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts rename to packages/core/user-profile/core-user-profile-server/src/service.ts index ab68b973139ed..40b422c6d939e 100644 --- a/x-pack/packages/security/plugin_types_server/src/user_profile/user_profile_service.ts +++ b/packages/core/user-profile/core-user-profile-server/src/service.ts @@ -1,29 +1,31 @@ /* * 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. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import type { KibanaRequest } from '@kbn/core/server'; +import type { KibanaRequest } from '@kbn/core-http-server'; import type { UserProfileData, UserProfileLabels, UserProfileWithSecurity, UserProfile, -} from '@kbn/security-plugin-types-common'; +} from '@kbn/core-user-profile-common'; /** * A set of methods to work with Kibana user profiles. */ -export interface UserProfileServiceStart { +export interface UserProfileService { /** * Retrieves a user profile for the current user extracted from the specified request. If the profile isn't available, * e.g. for the anonymous users or users authenticated via authenticating proxies, the `null` value is returned. * @param params Get current user profile operation parameters. * @param params.request User request instance to get user profile for. * @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The - * optional "dataPath" parameter can be used to return personal data for the requested user profiles. + * optional "dataPath" parameter can be used to return personal data for the requested user + * profiles (within `kibana` namespace only). */ getCurrent( params: UserProfileGetCurrentParams @@ -34,7 +36,8 @@ export interface UserProfileServiceStart { * @param params Bulk get operation parameters. * @param params.uids List of user profile identifiers. * @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The - * optional "dataPath" parameter can be used to return personal data for the requested user profiles. + * optional "dataPath" parameter can be used to return personal data for the requested user + * profiles (within `kibana` namespace only). */ bulkGet( params: UserProfileBulkGetParams diff --git a/packages/core/user-profile/core-user-profile-server/tsconfig.json b/packages/core/user-profile/core-user-profile-server/tsconfig.json new file mode 100644 index 0000000000000..85f418a0eb6c9 --- /dev/null +++ b/packages/core/user-profile/core-user-profile-server/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-user-profile-common", + "@kbn/core-http-server", + ] +} diff --git a/src/core/public/index.ts b/src/core/public/index.ts index b5e08a1c81818..2260b78f90d9a 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -210,8 +210,24 @@ export type { SecurityServiceSetup, SecurityServiceStart, CoreAuthenticationService, + CoreSecurityDelegateContract, } from '@kbn/core-security-browser'; +export type { + UserProfile, + UserProfileLabels, + UserProfileWithSecurity, + UserProfileUserInfoWithSecurity, + UserProfileUserInfo, + UserProfileData, +} from '@kbn/core-user-profile-common'; +export type { + UserProfileServiceSetup, + UserProfileServiceStart, + UserProfileService, + CoreUserProfileDelegateContract, +} from '@kbn/core-user-profile-browser'; + export type { OverlayStart, OverlayBannersStart, diff --git a/src/core/server/index.ts b/src/core/server/index.ts index c011a6f98be01..47f5da8bad226 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -130,6 +130,20 @@ export type { AuthenticationProvider, } from '@kbn/core-security-common'; +export type { + UserProfileUserInfo, + UserProfile, + UserProfileUserInfoWithSecurity, + UserProfileWithSecurity, + UserProfileLabels, + UserProfileData, +} from '@kbn/core-user-profile-common'; +export type { + UserProfileRequestHandlerContext, + UserProfileServiceSetup, + UserProfileServiceStart, +} from '@kbn/core-user-profile-server'; + export { CspConfig } from '@kbn/core-http-server-internal'; export { CoreKibanaRequest, kibanaResponseFactory } from '@kbn/core-http-router-server-internal'; diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 89fbd1a560758..826ac703d40c6 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -20,6 +20,7 @@ import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; import { coreLifecycleMock, coreInternalLifecycleMock } from '@kbn/core-lifecycle-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; import type { SharedGlobalConfig, PluginInitializerContext } from '@kbn/core-plugins-server'; export { configServiceMock, configDeprecationsMock } from '@kbn/config-mocks'; @@ -47,6 +48,7 @@ export { executionContextServiceMock } from '@kbn/core-execution-context-server- export { docLinksServiceMock } from '@kbn/core-doc-links-server-mocks'; export { analyticsServiceMock } from '@kbn/core-analytics-server-mocks'; export { securityServiceMock } from '@kbn/core-security-server-mocks'; +export { userProfileServiceMock } from '@kbn/core-user-profile-server-mocks'; export type { ElasticsearchClientMock, @@ -135,6 +137,7 @@ function createCoreRequestHandlerContextMock() { client: deprecationsServiceMock.createClient(), }, security: securityServiceMock.createRequestHandlerContext(), + userProfile: userProfileServiceMock.createRequestHandlerContext(), }; } diff --git a/src/core/tsconfig.json b/src/core/tsconfig.json index ea4b84eedd71d..05ae89cb1be93 100644 --- a/src/core/tsconfig.json +++ b/src/core/tsconfig.json @@ -164,6 +164,10 @@ "@kbn/core-security-browser", "@kbn/core-security-browser-mocks", "@kbn/core-execution-context-server-internal", + "@kbn/core-user-profile-common", + "@kbn/core-user-profile-server", + "@kbn/core-user-profile-server-mocks", + "@kbn/core-user-profile-browser", ], "exclude": [ "target/**/*", diff --git a/tsconfig.base.json b/tsconfig.base.json index 14f4b0a198cce..17e13abcd5b5d 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -620,6 +620,20 @@ "@kbn/core-usage-data-server-internal/*": ["packages/core/usage-data/core-usage-data-server-internal/*"], "@kbn/core-usage-data-server-mocks": ["packages/core/usage-data/core-usage-data-server-mocks"], "@kbn/core-usage-data-server-mocks/*": ["packages/core/usage-data/core-usage-data-server-mocks/*"], + "@kbn/core-user-profile-browser": ["packages/core/user-profile/core-user-profile-browser"], + "@kbn/core-user-profile-browser/*": ["packages/core/user-profile/core-user-profile-browser/*"], + "@kbn/core-user-profile-browser-internal": ["packages/core/user-profile/core-user-profile-browser-internal"], + "@kbn/core-user-profile-browser-internal/*": ["packages/core/user-profile/core-user-profile-browser-internal/*"], + "@kbn/core-user-profile-browser-mocks": ["packages/core/user-profile/core-user-profile-browser-mocks"], + "@kbn/core-user-profile-browser-mocks/*": ["packages/core/user-profile/core-user-profile-browser-mocks/*"], + "@kbn/core-user-profile-common": ["packages/core/user-profile/core-user-profile-common"], + "@kbn/core-user-profile-common/*": ["packages/core/user-profile/core-user-profile-common/*"], + "@kbn/core-user-profile-server": ["packages/core/user-profile/core-user-profile-server"], + "@kbn/core-user-profile-server/*": ["packages/core/user-profile/core-user-profile-server/*"], + "@kbn/core-user-profile-server-internal": ["packages/core/user-profile/core-user-profile-server-internal"], + "@kbn/core-user-profile-server-internal/*": ["packages/core/user-profile/core-user-profile-server-internal/*"], + "@kbn/core-user-profile-server-mocks": ["packages/core/user-profile/core-user-profile-server-mocks"], + "@kbn/core-user-profile-server-mocks/*": ["packages/core/user-profile/core-user-profile-server-mocks/*"], "@kbn/core-user-settings-server": ["packages/core/user-settings/core-user-settings-server"], "@kbn/core-user-settings-server/*": ["packages/core/user-settings/core-user-settings-server/*"], "@kbn/core-user-settings-server-internal": ["packages/core/user-settings/core-user-settings-server-internal"], diff --git a/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts b/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts index bffb7939c2fc8..2727f316fe868 100644 --- a/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts +++ b/x-pack/packages/security/plugin_types_common/src/user_profile/index.ts @@ -12,4 +12,4 @@ export type { UserProfileUserInfoWithSecurity, UserProfile, UserProfileWithSecurity, -} from './user_profile'; +} from '@kbn/core-user-profile-common'; diff --git a/x-pack/packages/security/plugin_types_common/tsconfig.json b/x-pack/packages/security/plugin_types_common/tsconfig.json index 84288bab1b4b9..353f6770352a9 100644 --- a/x-pack/packages/security/plugin_types_common/tsconfig.json +++ b/x-pack/packages/security/plugin_types_common/tsconfig.json @@ -11,6 +11,7 @@ ], "kbn_references": [ "@kbn/licensing-plugin", - "@kbn/core-security-common" + "@kbn/core-security-common", + "@kbn/core-user-profile-common" ] } diff --git a/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts b/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts index a397a16e5ad3a..eedf6e87a6483 100644 --- a/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts +++ b/x-pack/packages/security/plugin_types_public/src/user_profile/user_profile_api_client.ts @@ -5,15 +5,18 @@ * 2.0. */ -import type { - UserProfileData, - AuthenticatedUser, - UserProfileWithSecurity, - UserProfile, -} from '@kbn/security-plugin-types-common'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import type { UserProfileData } from '@kbn/core-user-profile-common'; import type { Observable } from 'rxjs'; -export interface UserProfileAPIClient { +export type { + GetUserProfileResponse, + UserProfileSuggestParams, + UserProfileBulkGetParams, + UserProfileGetCurrentParams, +} from '@kbn/core-user-profile-browser'; + +export type UserProfileAPIClient = CoreUserProfileDelegateContract & { readonly userProfile$: Observable; /** * Indicates if the user profile data has been loaded from the server. @@ -23,115 +26,4 @@ export interface UserProfileAPIClient { readonly userProfileLoaded$: Observable; /** Flag to indicate if the current user has a user profile. Anonymous users don't have user profiles. */ readonly enabled$: Observable; - /** - * Retrieves the user profile of the current user. If the profile isn't available, e.g. for the anonymous users or - * users authenticated via authenticating proxies, the `null` value is returned. - * @param [params] Get current user profile operation parameters. - * @param params.dataPath By default `getCurrent()` returns user information, but does not return any user data. The - * optional "dataPath" parameter can be used to return personal data for this user. - */ - getCurrent( - params?: UserProfileGetCurrentParams - ): Promise>; - - /** - * Retrieves multiple user profiles by their identifiers. - * @param params Bulk get operation parameters. - * @param params.uids List of user profile identifiers. - * @param params.dataPath By default Elasticsearch returns user information, but does not return any user data. The - * optional "dataPath" parameter can be used to return personal data for the requested user profiles. - */ - bulkGet( - params: UserProfileBulkGetParams - ): Promise>>; - - /** - * Suggests multiple user profiles by search criteria. - * - * Note: This endpoint is not provided out-of-the-box by the platform. You need to expose your own - * version within your app. An example of how to do this can be found in: - * `examples/user_profile_examples/server/plugin.ts` - * - * @param path Path to your app's suggest endpoint. - * @param params Suggest operation parameters. - * @param params.name Query string used to match name-related fields in user profiles. The - * following fields are treated as name-related: username, full_name and email. - * @param params.size Desired number of suggestions to return. The default value is 10. - * @param params.dataPath By default, suggest API returns user information, but does not return - * any user data. The optional "dataPath" parameter can be used to return personal data for this - * user (within `kibana` namespace only). - */ - suggest( - path: string, - params: UserProfileSuggestParams - ): Promise>>; - - /** - * Updates user profile data of the current user. - * @param data Application data to be written (merged with existing data). - */ - update(data: D): Promise; - - /** - * Partially updates user profile data of the current user, merging the previous data with the provided data. - * @param data Application data to be merged with existing data. - */ - partialUpdate>(data: D): Promise; -} - -/** - * Parameters for the get user profile for the current user API. - */ -export interface UserProfileGetCurrentParams { - /** - * By default, get API returns user information, but does not return any user data. The optional "dataPath" - * parameter can be used to return personal data for this user (within `kibana` namespace only). - */ - dataPath: string; -} - -export interface GetUserProfileResponse - extends UserProfileWithSecurity { - /** - * Information about the currently authenticated user that owns the profile. - */ - user: UserProfileWithSecurity['user'] & Pick; -} - -/** - * Parameters for the bulk get API. - */ -export interface UserProfileBulkGetParams { - /** - * List of user profile identifiers. - */ - uids: Set; - - /** - * By default, suggest API returns user information, but does not return any user data. The optional "dataPath" - * parameter can be used to return personal data for this user (within `kibana` namespace only). - */ - dataPath?: string; -} - -/** - * Parameters for the suggest API. - */ -export interface UserProfileSuggestParams { - /** - * Query string used to match name-related fields in user profiles. The following fields are treated as - * name-related: username, full_name and email. - */ - name: string; - - /** - * Desired number of suggestions to return. The default value is 10. - */ - size?: number; - - /** - * By default, suggest API returns user information, but does not return any user data. The optional "dataPath" - * parameter can be used to return personal data for this user (within `kibana` namespace only). - */ - dataPath?: string; -} +}; diff --git a/x-pack/packages/security/plugin_types_public/tsconfig.json b/x-pack/packages/security/plugin_types_public/tsconfig.json index 23e34902d2c12..28f07062f6807 100644 --- a/x-pack/packages/security/plugin_types_public/tsconfig.json +++ b/x-pack/packages/security/plugin_types_public/tsconfig.json @@ -10,6 +10,8 @@ "target/**/*" ], "kbn_references": [ - "@kbn/security-plugin-types-common" + "@kbn/security-plugin-types-common", + "@kbn/core-user-profile-browser", + "@kbn/core-user-profile-common" ] } diff --git a/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts b/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts index 15be67e7601f0..7817ac8a543e9 100644 --- a/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts +++ b/x-pack/packages/security/plugin_types_server/src/user_profile/index.ts @@ -11,4 +11,4 @@ export type { UserProfileBulkGetParams, UserProfileRequiredPrivileges, UserProfileGetCurrentParams, -} from './user_profile_service'; +} from '@kbn/core-user-profile-server'; diff --git a/x-pack/packages/security/plugin_types_server/tsconfig.json b/x-pack/packages/security/plugin_types_server/tsconfig.json index 1883d50f328e5..0edcc935ca144 100644 --- a/x-pack/packages/security/plugin_types_server/tsconfig.json +++ b/x-pack/packages/security/plugin_types_server/tsconfig.json @@ -13,5 +13,6 @@ "@kbn/config-schema", "@kbn/core", "@kbn/security-plugin-types-common", + "@kbn/core-user-profile-server", ] } diff --git a/x-pack/plugins/fleet/.storybook/context/index.tsx b/x-pack/plugins/fleet/.storybook/context/index.tsx index 8f118a31e0a17..608414af27887 100644 --- a/x-pack/plugins/fleet/.storybook/context/index.tsx +++ b/x-pack/plugins/fleet/.storybook/context/index.tsx @@ -13,7 +13,11 @@ import { createBrowserHistory } from 'history'; import { I18nProvider } from '@kbn/i18n-react'; -import type { PluginsServiceStart, SecurityServiceStart } from '@kbn/core/public'; +import type { + PluginsServiceStart, + SecurityServiceStart, + UserProfileServiceStart, +} from '@kbn/core/public'; import { CoreScopedHistory } from '@kbn/core/public'; import { getStorybookContextProvider } from '@kbn/custom-integrations-plugin/storybook'; @@ -96,6 +100,7 @@ export const StorybookContext: React.FC<{ storyContext?: Parameters getTheme: () => ({ darkMode: false }), }, security: {} as unknown as SecurityServiceStart, + userProfile: {} as unknown as UserProfileServiceStart, plugins: {} as unknown as PluginsServiceStart, authz: { fleet: { diff --git a/x-pack/plugins/security/public/build_delegate_api.test.ts b/x-pack/plugins/security/public/build_delegate_api.test.ts new file mode 100644 index 0000000000000..f8d4233b3edef --- /dev/null +++ b/x-pack/plugins/security/public/build_delegate_api.test.ts @@ -0,0 +1,141 @@ +/* + * 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 { of } from 'rxjs'; + +import type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import type { UserProfileAPIClient } from '@kbn/security-plugin-types-public'; + +import { authenticationMock } from './authentication/index.mock'; +import { buildSecurityApi, buildUserProfileApi } from './build_delegate_api'; +import { securityMock } from './mocks'; + +describe('buildSecurityApi', () => { + let authc: ReturnType; + let api: CoreSecurityDelegateContract; + + beforeEach(() => { + authc = authenticationMock.createSetup(); + api = buildSecurityApi({ authc }); + }); + + describe('authc.getCurrentUser', () => { + it('properly delegates to the service', async () => { + await api.authc.getCurrentUser(); + + expect(authc.getCurrentUser).toHaveBeenCalledTimes(1); + }); + + it('returns the result from the service', async () => { + const delegateReturn = securityMock.createMockAuthenticatedUser(); + + authc.getCurrentUser.mockReturnValue(Promise.resolve(delegateReturn)); + + const currentUser = await api.authc.getCurrentUser(); + + expect(currentUser).toBe(delegateReturn); + }); + }); +}); + +describe('buildUserProfileApi', () => { + let userProfile: jest.Mocked; + let api: CoreUserProfileDelegateContract; + + beforeEach(() => { + userProfile = { + userProfile$: of(null), + userProfileLoaded$: of(false), + enabled$: of(true), + getCurrent: jest.fn(), + bulkGet: jest.fn(), + suggest: jest.fn(), + update: jest.fn(), + partialUpdate: jest.fn(), + }; + api = buildUserProfileApi({ userProfile }); + }); + + describe('userProfile$', () => { + it('returns the reference from the service', async () => { + expect(api.userProfile$).toBe(userProfile.userProfile$); + }); + }); + + describe('getCurrent', () => { + it('properly delegates to the service', async () => { + await api.getCurrent({ dataPath: 'dataPath' }); + + expect(userProfile.getCurrent).toHaveBeenCalledTimes(1); + expect(userProfile.getCurrent).toHaveBeenCalledWith({ dataPath: 'dataPath' }); + }); + + it('returns the result from the service', async () => { + userProfile.getCurrent.mockResolvedValue({ stub: true } as any); + + const returnValue = await api.getCurrent({ dataPath: 'dataPath' }); + + expect(returnValue).toEqual({ stub: true }); + }); + }); + + describe('bulkGet', () => { + it('properly delegates to the service', async () => { + const uids = new Set(['foo', 'bar']); + await api.bulkGet({ uids, dataPath: 'dataPath' }); + + expect(userProfile.bulkGet).toHaveBeenCalledTimes(1); + expect(userProfile.bulkGet).toHaveBeenCalledWith({ uids, dataPath: 'dataPath' }); + }); + + it('returns the result from the service', async () => { + userProfile.bulkGet.mockResolvedValue([]); + + const returnValue = await api.bulkGet({ uids: new Set(), dataPath: 'dataPath' }); + + expect(returnValue).toEqual([]); + }); + }); + + describe('suggest', () => { + it('properly delegates to the service', async () => { + await api.suggest('path', { name: 'foo' }); + + expect(userProfile.suggest).toHaveBeenCalledTimes(1); + expect(userProfile.suggest).toHaveBeenCalledWith('path', { name: 'foo' }); + }); + + it('returns the result from the service', async () => { + userProfile.suggest.mockResolvedValue([]); + + const returnValue = await api.suggest('path', { name: 'foo' }); + + expect(returnValue).toEqual([]); + }); + }); + + describe('update', () => { + it('properly delegates to the service', async () => { + const updated = { foo: 'bar' }; + await api.update(updated); + + expect(userProfile.update).toHaveBeenCalledTimes(1); + expect(userProfile.update).toHaveBeenCalledWith(updated); + }); + }); + + describe('partialUpdate', () => { + it('properly delegates to the service', async () => { + const updated = { foo: 'bar' }; + await api.partialUpdate(updated); + + expect(userProfile.partialUpdate).toHaveBeenCalledTimes(1); + expect(userProfile.partialUpdate).toHaveBeenCalledWith(updated); + }); + }); +}); diff --git a/x-pack/plugins/security/public/build_delegate_api.ts b/x-pack/plugins/security/public/build_delegate_api.ts new file mode 100644 index 0000000000000..b8444c19adbe0 --- /dev/null +++ b/x-pack/plugins/security/public/build_delegate_api.ts @@ -0,0 +1,33 @@ +/* + * 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 type { CoreSecurityDelegateContract } from '@kbn/core-security-browser'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-browser'; +import type { + AuthenticationServiceSetup, + UserProfileAPIClient, +} from '@kbn/security-plugin-types-public'; + +export const buildSecurityApi = ({ + authc, +}: { + authc: AuthenticationServiceSetup; +}): CoreSecurityDelegateContract => { + return { + authc: { + getCurrentUser: () => authc.getCurrentUser(), + }, + }; +}; + +export const buildUserProfileApi = ({ + userProfile, +}: { + userProfile: UserProfileAPIClient; +}): CoreUserProfileDelegateContract => { + return userProfile; +}; diff --git a/x-pack/plugins/security/public/build_security_api.test.ts b/x-pack/plugins/security/public/build_security_api.test.ts deleted file mode 100644 index 344e3daea5467..0000000000000 --- a/x-pack/plugins/security/public/build_security_api.test.ts +++ /dev/null @@ -1,40 +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 type { CoreSecurityContract } from '@kbn/core-security-browser'; - -import { authenticationMock } from './authentication/index.mock'; -import { buildSecurityApi } from './build_security_api'; -import { securityMock } from './mocks'; - -describe('buildSecurityApi', () => { - let authc: ReturnType; - let api: CoreSecurityContract; - - beforeEach(() => { - authc = authenticationMock.createSetup(); - api = buildSecurityApi({ authc }); - }); - - describe('authc.getCurrentUser', () => { - it('properly delegates to the service', async () => { - await api.authc.getCurrentUser(); - - expect(authc.getCurrentUser).toHaveBeenCalledTimes(1); - }); - - it('returns the result from the service', async () => { - const delegateReturn = securityMock.createMockAuthenticatedUser(); - - authc.getCurrentUser.mockReturnValue(Promise.resolve(delegateReturn)); - - const currentUser = await api.authc.getCurrentUser(); - - expect(currentUser).toBe(delegateReturn); - }); - }); -}); diff --git a/x-pack/plugins/security/public/build_security_api.ts b/x-pack/plugins/security/public/build_security_api.ts deleted file mode 100644 index 5c2849c2266c9..0000000000000 --- a/x-pack/plugins/security/public/build_security_api.ts +++ /dev/null @@ -1,21 +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 type { CoreSecurityContract } from '@kbn/core-security-browser'; -import type { AuthenticationServiceSetup } from '@kbn/security-plugin-types-public'; - -export const buildSecurityApi = ({ - authc, -}: { - authc: AuthenticationServiceSetup; -}): CoreSecurityContract => { - return { - authc: { - getCurrentUser: () => authc.getCurrentUser(), - }, - }; -}; diff --git a/x-pack/plugins/security/public/plugin.test.tsx b/x-pack/plugins/security/public/plugin.test.tsx index d3dadbfb87665..e58ff7ba5e325 100644 --- a/x-pack/plugins/security/public/plugin.test.tsx +++ b/x-pack/plugins/security/public/plugin.test.tsx @@ -84,7 +84,7 @@ describe('Security Plugin', () => { }); }); - it('calls core.security.registerSecurityApi', () => { + it('calls core.security.registerSecurityDelegate', () => { const coreSetupMock = getCoreSetupMock(); const plugin = new SecurityPlugin(coreMock.createPluginInitializerContext()); @@ -93,7 +93,19 @@ describe('Security Plugin', () => { licensing: licensingMock.createSetup(), }); - expect(coreSetupMock.security.registerSecurityApi).toHaveBeenCalledTimes(1); + expect(coreSetupMock.security.registerSecurityDelegate).toHaveBeenCalledTimes(1); + }); + + it('calls core.userProfile.registerUserProfileDelegate', () => { + const coreSetupMock = getCoreSetupMock(); + + const plugin = new SecurityPlugin(coreMock.createPluginInitializerContext()); + + plugin.setup(coreSetupMock, { + licensing: licensingMock.createSetup(), + }); + + expect(coreSetupMock.userProfile.registerUserProfileDelegate).toHaveBeenCalledTimes(1); }); }); diff --git a/x-pack/plugins/security/public/plugin.tsx b/x-pack/plugins/security/public/plugin.tsx index 333f8736731ac..9077db924f87c 100644 --- a/x-pack/plugins/security/public/plugin.tsx +++ b/x-pack/plugins/security/public/plugin.tsx @@ -36,7 +36,7 @@ import { AnalyticsService } from './analytics'; import { AnonymousAccessService } from './anonymous_access'; import { AuthenticationService } from './authentication'; import { AuthorizationService } from './authorization'; -import { buildSecurityApi } from './build_security_api'; +import { buildSecurityApi, buildUserProfileApi } from './build_delegate_api'; import type { SecurityApiClients } from './components'; import type { ConfigType } from './config'; import { ManagementService, UserAPIClient } from './management'; @@ -143,7 +143,10 @@ export class SecurityPlugin securityApiClients: this.securityApiClients, }); - core.security.registerSecurityApi(buildSecurityApi({ authc: this.authc })); + core.security.registerSecurityDelegate(buildSecurityApi({ authc: this.authc })); + core.userProfile.registerUserProfileDelegate( + buildUserProfileApi({ userProfile: this.securityApiClients.userProfiles }) + ); if (management) { this.managementService.setup({ diff --git a/x-pack/plugins/security/server/build_delegate_apis.test.ts b/x-pack/plugins/security/server/build_delegate_apis.test.ts new file mode 100644 index 0000000000000..9511110cdc173 --- /dev/null +++ b/x-pack/plugins/security/server/build_delegate_apis.test.ts @@ -0,0 +1,121 @@ +/* + * 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 { httpServerMock } from '@kbn/core-http-server-mocks'; +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; + +import { authenticationServiceMock } from './authentication/authentication_service.mock'; +import { buildSecurityApi, buildUserProfileApi } from './build_delegate_apis'; +import { securityMock } from './mocks'; +import { userProfileServiceMock } from './user_profile/user_profile_service.mock'; + +describe('buildSecurityApi', () => { + let authc: ReturnType; + let api: CoreSecurityDelegateContract; + + beforeEach(() => { + authc = authenticationServiceMock.createStart(); + api = buildSecurityApi({ getAuthc: () => authc }); + }); + + describe('authc.getCurrentUser', () => { + it('properly delegates to the service', () => { + const request = httpServerMock.createKibanaRequest(); + api.authc.getCurrentUser(request); + + expect(authc.getCurrentUser).toHaveBeenCalledTimes(1); + expect(authc.getCurrentUser).toHaveBeenCalledWith(request); + }); + + it('returns the result from the service', async () => { + const request = httpServerMock.createKibanaRequest(); + const delegateReturn = securityMock.createMockAuthenticatedUser(); + + authc.getCurrentUser.mockReturnValue(delegateReturn); + + const currentUser = api.authc.getCurrentUser(request); + + expect(currentUser).toBe(delegateReturn); + }); + }); +}); + +describe('buildUserProfileApi', () => { + let userProfile: ReturnType; + let api: CoreUserProfileDelegateContract; + + beforeEach(() => { + userProfile = userProfileServiceMock.createStart(); + api = buildUserProfileApi({ getUserProfile: () => userProfile }); + }); + + describe('getCurrent', () => { + it('properly delegates to the service', async () => { + const request = httpServerMock.createKibanaRequest(); + await api.getCurrent({ request, dataPath: 'dataPath' }); + + expect(userProfile.getCurrent).toHaveBeenCalledTimes(1); + expect(userProfile.getCurrent).toHaveBeenCalledWith({ request, dataPath: 'dataPath' }); + }); + + it('returns the result from the service', async () => { + const request = httpServerMock.createKibanaRequest(); + + userProfile.getCurrent.mockResolvedValue(null); + + const returnValue = await api.getCurrent({ request, dataPath: 'dataPath' }); + + expect(returnValue).toBe(null); + }); + }); + + describe('bulkGet', () => { + it('properly delegates to the service', async () => { + const uids = new Set(['foo', 'bar']); + await api.bulkGet({ uids, dataPath: 'dataPath' }); + + expect(userProfile.bulkGet).toHaveBeenCalledTimes(1); + expect(userProfile.bulkGet).toHaveBeenCalledWith({ uids, dataPath: 'dataPath' }); + }); + + it('returns the result from the service', async () => { + userProfile.bulkGet.mockResolvedValue([]); + + const returnValue = await api.bulkGet({ uids: new Set(), dataPath: 'dataPath' }); + + expect(returnValue).toEqual([]); + }); + }); + + describe('suggest', () => { + it('properly delegates to the service', async () => { + await api.suggest({ name: 'foo' }); + + expect(userProfile.suggest).toHaveBeenCalledTimes(1); + expect(userProfile.suggest).toHaveBeenCalledWith({ name: 'foo' }); + }); + + it('returns the result from the service', async () => { + userProfile.suggest.mockResolvedValue([]); + + const returnValue = await api.suggest({ name: 'foo' }); + + expect(returnValue).toEqual([]); + }); + }); + + describe('update', () => { + it('properly delegates to the service', async () => { + const updated = { foo: 'bar' }; + await api.update('foo', updated); + + expect(userProfile.update).toHaveBeenCalledTimes(1); + expect(userProfile.update).toHaveBeenCalledWith('foo', updated); + }); + }); +}); diff --git a/x-pack/plugins/security/server/build_delegate_apis.ts b/x-pack/plugins/security/server/build_delegate_apis.ts new file mode 100644 index 0000000000000..b4fd4474aaace --- /dev/null +++ b/x-pack/plugins/security/server/build_delegate_apis.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CoreSecurityDelegateContract } from '@kbn/core-security-server'; +import type { CoreUserProfileDelegateContract } from '@kbn/core-user-profile-server'; + +import type { InternalAuthenticationServiceStart } from './authentication'; +import type { UserProfileServiceStartInternal } from './user_profile'; + +export const buildSecurityApi = ({ + getAuthc, +}: { + getAuthc: () => InternalAuthenticationServiceStart; +}): CoreSecurityDelegateContract => { + return { + authc: { + getCurrentUser: (request) => { + return getAuthc().getCurrentUser(request); + }, + }, + }; +}; + +export const buildUserProfileApi = ({ + getUserProfile, +}: { + getUserProfile: () => UserProfileServiceStartInternal; +}): CoreUserProfileDelegateContract => { + return { + getCurrent: (params) => getUserProfile().getCurrent(params), + suggest: (params) => getUserProfile().suggest(params), + bulkGet: (params) => getUserProfile().bulkGet(params), + update: (uids, data) => getUserProfile().update(uids, data), + }; +}; diff --git a/x-pack/plugins/security/server/build_security_api.test.ts b/x-pack/plugins/security/server/build_security_api.test.ts deleted file mode 100644 index ffbf0fb28d3b4..0000000000000 --- a/x-pack/plugins/security/server/build_security_api.test.ts +++ /dev/null @@ -1,44 +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 { httpServerMock } from '@kbn/core-http-server-mocks'; -import type { CoreSecurityContract } from '@kbn/core-security-server'; - -import { authenticationServiceMock } from './authentication/authentication_service.mock'; -import { buildSecurityApi } from './build_security_api'; -import { securityMock } from './mocks'; - -describe('buildSecurityApi', () => { - let authc: ReturnType; - let api: CoreSecurityContract; - - beforeEach(() => { - authc = authenticationServiceMock.createStart(); - api = buildSecurityApi({ getAuthc: () => authc }); - }); - - describe('authc.getCurrentUser', () => { - it('properly delegates to the service', () => { - const request = httpServerMock.createKibanaRequest(); - api.authc.getCurrentUser(request); - - expect(authc.getCurrentUser).toHaveBeenCalledTimes(1); - expect(authc.getCurrentUser).toHaveBeenCalledWith(request); - }); - - it('returns the result from the service', async () => { - const request = httpServerMock.createKibanaRequest(); - const delegateReturn = securityMock.createMockAuthenticatedUser(); - - authc.getCurrentUser.mockReturnValue(delegateReturn); - - const currentUser = api.authc.getCurrentUser(request); - - expect(currentUser).toBe(delegateReturn); - }); - }); -}); diff --git a/x-pack/plugins/security/server/build_security_api.ts b/x-pack/plugins/security/server/build_security_api.ts deleted file mode 100644 index fa4d5f25f8ffa..0000000000000 --- a/x-pack/plugins/security/server/build_security_api.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 type { CoreSecurityContract } from '@kbn/core-security-server'; - -import type { InternalAuthenticationServiceStart } from './authentication'; - -export const buildSecurityApi = ({ - getAuthc, -}: { - getAuthc: () => InternalAuthenticationServiceStart; -}): CoreSecurityContract => { - return { - authc: { - getCurrentUser: (request) => { - return getAuthc().getCurrentUser(request); - }, - }, - }; -}; diff --git a/x-pack/plugins/security/server/plugin.test.ts b/x-pack/plugins/security/server/plugin.test.ts index 78da2544922af..be3d00b77cff9 100644 --- a/x-pack/plugins/security/server/plugin.test.ts +++ b/x-pack/plugins/security/server/plugin.test.ts @@ -133,10 +133,16 @@ describe('Security Plugin', () => { `); }); - it('calls core.security.registerSecurityApi', () => { + it('calls core.security.registerSecurityDelegate', () => { plugin.setup(mockCoreSetup, mockSetupDependencies); - expect(mockCoreSetup.security.registerSecurityApi).toHaveBeenCalledTimes(1); + expect(mockCoreSetup.security.registerSecurityDelegate).toHaveBeenCalledTimes(1); + }); + + it('calls core.userProfile.registerUserProfileDelegate', () => { + plugin.setup(mockCoreSetup, mockSetupDependencies); + + expect(mockCoreSetup.userProfile.registerUserProfileDelegate).toHaveBeenCalledTimes(1); }); }); diff --git a/x-pack/plugins/security/server/plugin.ts b/x-pack/plugins/security/server/plugin.ts index 936a581ab2b59..828c8b42ea1b7 100644 --- a/x-pack/plugins/security/server/plugin.ts +++ b/x-pack/plugins/security/server/plugin.ts @@ -44,7 +44,7 @@ import type { InternalAuthenticationServiceStart } from './authentication'; import { AuthenticationService } from './authentication'; import type { AuthorizationServiceSetupInternal } from './authorization'; import { AuthorizationService } from './authorization'; -import { buildSecurityApi } from './build_security_api'; +import { buildSecurityApi, buildUserProfileApi } from './build_delegate_apis'; import type { ConfigSchema, ConfigType } from './config'; import { createConfig } from './config'; import { getPrivilegeDeprecationsService, registerKibanaUserRoleDeprecation } from './deprecations'; @@ -310,11 +310,16 @@ export class SecurityPlugin this.registerDeprecations(core, license); - core.security.registerSecurityApi( + core.security.registerSecurityDelegate( buildSecurityApi({ getAuthc: this.getAuthentication.bind(this), }) ); + core.userProfile.registerUserProfileDelegate( + buildUserProfileApi({ + getUserProfile: this.getUserProfileService.bind(this), + }) + ); defineRoutes({ router: core.http.createRouter(), diff --git a/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts b/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts index aad0e201e996b..a6bca14642f62 100644 --- a/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts +++ b/x-pack/plugins/security/server/routes/user_profile/get_current.test.ts @@ -8,7 +8,7 @@ import type { ObjectType } from '@kbn/config-schema'; import type { RequestHandler, RouteConfig } from '@kbn/core/server'; import { kibanaResponseFactory } from '@kbn/core/server'; -import { httpServerMock } from '@kbn/core/server/mocks'; +import { coreMock, httpServerMock } from '@kbn/core/server/mocks'; import { defineGetCurrentUserProfileRoute } from './get_current'; import { mockAuthenticatedUser } from '../../../common/model/authenticated_user.mock'; @@ -20,21 +20,24 @@ import { userProfileServiceMock } from '../../user_profile/user_profile_service. import { routeDefinitionParamsMock } from '../index.mock'; function getMockContext() { - return { + return coreMock.createCustomRequestHandlerContext({ licensing: { license: { check: jest.fn().mockReturnValue({ check: 'valid' }) }, }, - } as unknown as SecurityRequestHandlerContext; + }) as unknown as SecurityRequestHandlerContext; } describe('Get current user profile routes', () => { let router: jest.Mocked; + let mockContext: SecurityRequestHandlerContext; let userProfileService: jest.Mocked; let authenticationService: ReturnType; beforeEach(() => { const routeParamsMock = routeDefinitionParamsMock.create(); router = routeParamsMock.router; + mockContext = getMockContext(); + userProfileService = userProfileServiceMock.createStart(); routeParamsMock.getUserProfileService.mockReturnValue(userProfileService); @@ -74,7 +77,7 @@ describe('Get current user profile routes', () => { authenticationService.getCurrentUser.mockReturnValue(null); await expect( - routeHandler(getMockContext(), httpServerMock.createKibanaRequest(), kibanaResponseFactory) + routeHandler(mockContext, httpServerMock.createKibanaRequest(), kibanaResponseFactory) ).resolves.toEqual(expect.objectContaining({ status: 404 })); expect(userProfileService.getCurrent).not.toHaveBeenCalled(); @@ -83,28 +86,32 @@ describe('Get current user profile routes', () => { it('returns `404` if profile is not available', async () => { const mockRequest = httpServerMock.createKibanaRequest(); authenticationService.getCurrentUser.mockReturnValue(mockAuthenticatedUser()); - userProfileService.getCurrent.mockResolvedValue(null); - await expect( - routeHandler(getMockContext(), mockRequest, kibanaResponseFactory) - ).resolves.toEqual(expect.objectContaining({ status: 404 })); + const coreContextMock = await mockContext.core; + (coreContextMock.userProfile.getCurrent as jest.Mock).mockResolvedValue(null); + + await expect(routeHandler(mockContext, mockRequest, kibanaResponseFactory)).resolves.toEqual( + expect.objectContaining({ status: 404 }) + ); - expect(userProfileService.getCurrent).toBeCalledTimes(1); - expect(userProfileService.getCurrent).toBeCalledWith({ request: mockRequest }); + expect(coreContextMock.userProfile.getCurrent).toBeCalledTimes(1); + expect(coreContextMock.userProfile.getCurrent).toBeCalledWith({}); }); it('fails if `getCurrent` call fails.', async () => { const unhandledException = new Error('Something went wrong.'); const mockRequest = httpServerMock.createKibanaRequest(); authenticationService.getCurrentUser.mockReturnValue(mockAuthenticatedUser()); - userProfileService.getCurrent.mockRejectedValue(unhandledException); - await expect( - routeHandler(getMockContext(), mockRequest, kibanaResponseFactory) - ).resolves.toEqual(expect.objectContaining({ status: 500, payload: unhandledException })); + const coreContextMock = await mockContext.core; + (coreContextMock.userProfile.getCurrent as jest.Mock).mockRejectedValue(unhandledException); + + await expect(routeHandler(mockContext, mockRequest, kibanaResponseFactory)).resolves.toEqual( + expect.objectContaining({ status: 500, payload: unhandledException }) + ); - expect(userProfileService.getCurrent).toBeCalledTimes(1); - expect(userProfileService.getCurrent).toBeCalledWith({ request: mockRequest }); + expect(coreContextMock.userProfile.getCurrent).toBeCalledTimes(1); + expect(coreContextMock.userProfile.getCurrent).toBeCalledWith({}); }); it('returns user profile for the current user.', async () => { @@ -114,11 +121,11 @@ describe('Get current user profile routes', () => { authenticationService.getCurrentUser.mockReturnValue(mockUser); const mockProfile = userProfileMock.createWithSecurity({ uid: 'uid-1' }); - userProfileService.getCurrent.mockResolvedValue(mockProfile); - await expect( - routeHandler(getMockContext(), mockRequest, kibanaResponseFactory) - ).resolves.toEqual( + const coreContextMock = await mockContext.core; + (coreContextMock.userProfile.getCurrent as jest.Mock).mockResolvedValue(mockProfile); + + await expect(routeHandler(mockContext, mockRequest, kibanaResponseFactory)).resolves.toEqual( expect.objectContaining({ status: 200, payload: { @@ -131,8 +138,8 @@ describe('Get current user profile routes', () => { }) ); - expect(userProfileService.getCurrent).toBeCalledTimes(1); - expect(userProfileService.getCurrent).toBeCalledWith({ request: mockRequest, dataPath: '*' }); + expect(coreContextMock.userProfile.getCurrent).toBeCalledTimes(1); + expect(coreContextMock.userProfile.getCurrent).toBeCalledWith({ dataPath: '*' }); }); }); }); diff --git a/x-pack/plugins/security/server/routes/user_profile/get_current.ts b/x-pack/plugins/security/server/routes/user_profile/get_current.ts index 25cdbf35cba6c..9661570e36b4e 100644 --- a/x-pack/plugins/security/server/routes/user_profile/get_current.ts +++ b/x-pack/plugins/security/server/routes/user_profile/get_current.ts @@ -25,16 +25,17 @@ export function defineGetCurrentUserProfileRoute({ }, }, createLicensedRouteHandler(async (context, request, response) => { - const authenticationService = await getAuthenticationService(); + const authenticationService = getAuthenticationService(); const currentUser = authenticationService.getCurrentUser(request); if (!currentUser) { return response.notFound(); } + const { userProfile } = await context.core; + let profile: UserProfileWithSecurity | null; try { - profile = await getUserProfileService().getCurrent({ - request, + profile = await userProfile.getCurrent({ dataPath: request.query.dataPath, }); } catch (error) { diff --git a/x-pack/plugins/security/tsconfig.json b/x-pack/plugins/security/tsconfig.json index 3dde17effc710..61eb1bb0147f3 100644 --- a/x-pack/plugins/security/tsconfig.json +++ b/x-pack/plugins/security/tsconfig.json @@ -82,6 +82,8 @@ "@kbn/core-i18n-browser-mocks", "@kbn/core-theme-browser-mocks", "@kbn/core-analytics-browser-mocks", + "@kbn/core-user-profile-server", + "@kbn/core-user-profile-browser" ], "exclude": [ "target/**/*", diff --git a/yarn.lock b/yarn.lock index 47b6a266bd734..5709927c111bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4286,6 +4286,34 @@ version "0.0.0" uid "" +"@kbn/core-user-profile-browser-internal@link:packages/core/user-profile/core-user-profile-browser-internal": + version "0.0.0" + uid "" + +"@kbn/core-user-profile-browser-mocks@link:packages/core/user-profile/core-user-profile-browser-mocks": + version "0.0.0" + uid "" + +"@kbn/core-user-profile-browser@link:packages/core/user-profile/core-user-profile-browser": + version "0.0.0" + uid "" + +"@kbn/core-user-profile-common@link:packages/core/user-profile/core-user-profile-common": + version "0.0.0" + uid "" + +"@kbn/core-user-profile-server-internal@link:packages/core/user-profile/core-user-profile-server-internal": + version "0.0.0" + uid "" + +"@kbn/core-user-profile-server-mocks@link:packages/core/user-profile/core-user-profile-server-mocks": + version "0.0.0" + uid "" + +"@kbn/core-user-profile-server@link:packages/core/user-profile/core-user-profile-server": + version "0.0.0" + uid "" + "@kbn/core-user-settings-server-internal@link:packages/core/user-settings/core-user-settings-server-internal": version "0.0.0" uid "" From 2b51740d9efa3ef42cede12255fba56d36431704 Mon Sep 17 00:00:00 2001 From: Umberto Pepato Date: Wed, 24 Apr 2024 10:47:45 +0200 Subject: [PATCH 07/82] [Cases] Add missing alerts table dependency to Cases plugin (#181303) ## Summary Adds the missing `fieldFormats` dependency needed by the alerts table to the Cases plugin. Fixes #181301 ## To verify 1. Create a stack rule that fires alerts from `Stack Management > Rules` (i.e. ElasticSearch Query) 2. Assign a Case action to that rule 3. Wait for alerts to be created 4. Navigate to `Stack Management > Cases` and open the automatically created case 5. In the case detail page, navigate to the `Alerts` tab 6. Verify that the alerts table renders correctly --- x-pack/plugins/cases/kibana.jsonc | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/cases/kibana.jsonc b/x-pack/plugins/cases/kibana.jsonc index feecbc66ee445..84c04da1fe0f6 100644 --- a/x-pack/plugins/cases/kibana.jsonc +++ b/x-pack/plugins/cases/kibana.jsonc @@ -20,6 +20,7 @@ "licensing", "features", "triggersActionsUi", + "fieldFormats", "management", "security", "notifications", From 37d47da7711710ded8d30f0514f4da2e1810dc8f Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Wed, 24 Apr 2024 10:48:30 +0200 Subject: [PATCH 08/82] [Security Solution] Labels adjustments (#181371) Following up from https://github.com/elastic/kibana/pull/180773 ## Summary In this PR we are introducing the `@skipServerlessMKI` label, with it, a test will be excluded from the execution on any MKI environment but it will be executed as part of the CI check if the `@serverless` tag is present. With the new changes the serverless labels will work as follows: * `@serverless`: The test is executed as part of the PR check process and in the periodic pipeline (MKI environment). * `@serverlessQA`: The test is executed as part of the kibana release process in the QA environment (MKI environment). * `@skipInServerless`: The test is skipped from being executed in CI as part of the PR check and is skipped from being executed in any MKI environment. `@skipInServerlessMKI`: The test is skipped from being executed in any MKI environment but it will continue being executed as part of the PR process if the `@serverless` tag is present. **IMPORTANT:** The skip labels have been created for those tests that use `@serverless` or `@serverlessQA` labels. The absence of them (`@serverless` or `@serverlessQA`) will exclude automatically the execution of the test in the targeted environments. I.E: A test without `@serverlessQA` will never be executed as part of the Kibana release process. A test without `@serverless` will never be executed as part of the PR CI check neither the periodic pipeline. --- .../run_cypress/parallel_serverless.ts | 3 +- .../cypress/README.md | 1 + .../cypress_ci_serverless_qa.config.ts | 2 +- ...ws_suppression_serverless_essentials.cy.ts | 2 +- .../event_correlation_rule_suppression.cy.ts | 2 +- ...orrelation_rule_suppression_sequence.cy.ts | 2 +- ...le_suppression_serverless_essentials.cy.ts | 2 +- .../rule_creation/new_terms_rule.cy.ts | 2 +- .../rule_edit/new_terms_rule.cy.ts | 2 +- .../value_lists/value_list_items.cy.ts | 2 +- .../install_update_authorization.cy.ts | 2 +- .../install_update_error_handling.cy.ts | 2 +- .../prebuilt_rules/install_workflow.cy.ts | 2 +- .../prebuilt_rules/management.cy.ts | 2 +- .../prebuilt_rules/notifications.cy.ts | 4 +- .../related_integrations.cy.ts | 2 +- .../bulk_actions/bulk_edit_rules.cy.ts | 6 +- .../bulk_edit_rules_actions.cy.ts | 2 +- .../import_export/export_rule.cy.ts | 4 +- .../rules_table/rules_table_selection.cy.ts | 94 ++++++++++--------- .../e2e/entity_analytics/entity_flyout.cy.ts | 2 +- .../e2e/explore/inspect/inspect_button.cy.ts | 2 +- .../e2e/explore/ml/ml_conditional_links.cy.ts | 2 +- .../e2e/explore/overview/overview.cy.ts | 2 +- .../unified_components/query_tab.cy.ts | 2 +- 25 files changed, 78 insertions(+), 72 deletions(-) diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts index d9418b81b538d..2c5ca1e049fae 100644 --- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts +++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts @@ -475,7 +475,8 @@ ${JSON.stringify(argv, null, 2)} !process.env.KIBANA_MKI_USE_LATEST_COMMIT || process.env.KIBANA_MKI_USE_LATEST_COMMIT !== '1' ) { - cypressConfigFile.env.grepTags = '@serverlessQA --@skipInServerless'; + cypressConfigFile.env.grepTags = + '@serverlessQA --@skipInServerless --@skipInServerlessMKI '; } const tier: string = argv.tier; const endpointAddon: boolean = argv.endpointAddon; diff --git a/x-pack/test/security_solution_cypress/cypress/README.md b/x-pack/test/security_solution_cypress/cypress/README.md index d7ec660e1b24d..965d4a3cee13c 100644 --- a/x-pack/test/security_solution_cypress/cypress/README.md +++ b/x-pack/test/security_solution_cypress/cypress/README.md @@ -48,6 +48,7 @@ Note that we use tags in order to select which tests we want to execute: - `@serverlessQA` includes a test in the Serverless test suite for the Kibana release process of serverless. You need to explicitly add this tag to any test you want yo run in CI for the second quality gate. These tests should be stable, otherviswe they will be blocking the release pipeline. They should be alsy critical enough, so that when they fail, there's a high chance of an SDH or blocker issue to be reported. - `@ess` includes a test in the normal, non-Serverless test suite. You need to explicitly add this tag to any test you want to run against a non-Serverless environment. - `@skipInEss` excludes a test from the non-Serverless test suite. The test will not be executed as part for the PR process. All the skipped tests should have a link to a ticket describing the reason why the test got skipped. +- `@skipInServerlessMKI` excludes a test from the execution on any MKI environment (even if it's tagged as `@serverless` or `@serverlessQA`). Could indicate many things, e.g. "the test is flaky in Serverless MKI", "the test has been temporarily excluded, see the comment above why". All the skipped tests should have a link to a ticket describing the reason why the test got skipped. - `@skipInServerless` excludes a test from the Serverless test suite and Serverless QA environment for both, periodic pipeline and second quality gate (even if it's tagged as `@serverless`). Could indicate many things, e.g. "the test is flaky in Serverless", "the test is Flaky in any type of environment", "the test has been temporarily excluded, see the comment above why". All the skipped tests should have a link to a ticket describing the reason why the test got skipped. Please, before opening a PR with a new test, make sure that the test fails. If you never see your test fail you don’t know if your test is actually testing the right thing, or testing anything at all. diff --git a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts index c2c3c9abccda1..d0d5dd3f00154 100644 --- a/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts +++ b/x-pack/test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts @@ -19,7 +19,7 @@ export default defineCypressConfig({ env: { grepFilterSpecs: true, grepOmitFiltered: true, - grepTags: '@serverless --@skipInServerless', + grepTags: '@serverless --@skipInServerless --@skipInServerlessMKI', }, execTimeout: 300000, pageLoadTimeout: 300000, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts index a1aae6c8d7b49..684828e8a42ab 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows_suppression_serverless_essentials.cy.ts @@ -21,7 +21,7 @@ import { CREATE_RULE_URL } from '../../../../urls/navigation'; describe( 'Detection rules, Alert Suppression for Essentials tier', { - tags: ['@serverless'], + tags: ['@serverless', '@skipServerlessMKI'], env: { ftrConfig: { productTypes: [ diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts index 700403600e6b1..a93d2d5edb3ab 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression.cy.ts @@ -37,7 +37,7 @@ const SUPPRESS_BY_FIELDS = ['agent.type']; describe( 'Detection Rule Creation - EQL Rules - With Alert Suppression', { - tags: ['@ess', '@serverless', '@skipInServerless'], + tags: ['@ess', '@serverless', '@skipServerlessMKI'], // alertSuppressionForNonSequenceEqlRuleEnabled feature flag is also enabled in a global config env: { ftrConfig: { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts index 5c9d6a64e4664..1c8f28a2c2c35 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_sequence.cy.ts @@ -21,7 +21,7 @@ import { describe( 'Detection Rule Creation - EQL Rules - With Alert Suppression', { - tags: ['@ess', '@serverless', '@skipInServerless'], + tags: ['@ess', '@serverless', '@skipServerlessMKI'], // alertSuppressionForNonSequenceEqlRuleEnabled feature flag is also enabled in a global config env: { ftrConfig: { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts index 02e81b3d97304..4830c1c50cc6c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/event_correlation_rule_suppression_serverless_essentials.cy.ts @@ -28,7 +28,7 @@ const SUPPRESS_BY_FIELDS = ['agent.type']; describe( 'Detection Rule Creation - EQL Rules - With Alert Suppression - Serverless Essentials License', { - tags: ['@serverless', '@skipInServerless'], + tags: ['@serverless', '@skipServerlessMKI'], // alertSuppressionForNonSequenceEqlRuleEnabled feature flag is also enabled in a global config env: { ftrConfig: { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts index cb05087f008aa..a93797e8045d2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/new_terms_rule.cy.ts @@ -74,7 +74,7 @@ import { openRuleManagementPageViaBreadcrumbs } from '../../../../tasks/rules_ma describe( 'New Terms rules', { - tags: ['@ess', '@serverless'], + tags: ['@ess', '@serverless', '@skipServerlessMKI'], env: { // alertSuppressionForNewTermsRuleEnabled feature flag is also enabled in a global config kbnServerArgs: [ diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts index 7604903d2b47e..3bfe7839d6252 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts @@ -44,7 +44,7 @@ const rule = getNewTermsRule(); describe( 'Detection rules, New terms, Edit', { - tags: ['@ess', '@serverless'], + tags: ['@ess', '@serverless', '@skipServerlessMKI'], env: { // alertSuppressionForNewTermsRuleEnabled feature flag is also enabled in a global config kbnServerArgs: [ diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts index 9dc094153235a..c8fd74fa64397 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts @@ -43,7 +43,7 @@ import { RULES_MANAGEMENT_URL } from '../../../../urls/rules_management'; describe( 'Value list items', { - tags: ['@ess', '@serverless', '@skipInServerless'], + tags: ['@ess', '@serverless', '@skipServerlessMKI'], env: { ftrConfig: { kbnServerArgs: [ diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts index 4e2b57e7a5e26..c9349ea6d083c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts @@ -68,7 +68,7 @@ const loginPageAsWriteAuthorizedUser = (url: string) => { // https://github.com/elastic/kibana/issues/179965 describe( 'Detection rules, Prebuilt Rules Installation and Update - Authorization/RBAC', - { tags: ['@ess', '@serverless', '@skipInServerless'] }, + { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { preventPrebuiltRulesPackageInstallation(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts index 0102cfb349edf..f0f5c9c42a8e8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts @@ -39,7 +39,7 @@ import { visitRulesManagementTable } from '../../../../tasks/rules_management'; // https://github.com/elastic/kibana/issues/179970 describe( 'Detection rules, Prebuilt Rules Installation and Update - Error handling', - { tags: ['@ess', '@serverless', '@skipInServerless'] }, + { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { preventPrebuiltRulesPackageInstallation(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts index 259440f1c2abd..782672ccb1c45 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_workflow.cy.ts @@ -32,7 +32,7 @@ import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; describe( 'Detection rules, Prebuilt Rules Installation and Update workflow', - { tags: ['@ess', '@serverless', '@skipInServerless'] }, + { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { describe('Installation of prebuilt rules', () => { const RULE_1 = createRuleAssetSavedObject({ diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts index 63290d850729c..b49426b9b515a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts @@ -51,7 +51,7 @@ const rules = Array.from(Array(5)).map((_, i) => { }); // https://github.com/elastic/kibana/issues/179973 -describe('Prebuilt rules', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { +describe('Prebuilt rules', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { login(); deleteAlertsAndRules(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts index 02a59e1b17f2e..f92e4b0f5a1ef 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts @@ -57,7 +57,7 @@ describe( // https://github.com/elastic/kibana/issues/179967 it( 'should NOT display install or update notifications when latest rules are installed', - { tags: ['@skipInServerless'] }, + { tags: ['@skipInServerlessMKI'] }, () => { visitRulesManagementTable(); createAndInstallMockedPrebuiltRules([RULE_1]); @@ -72,7 +72,7 @@ describe( }); // https://github.com/elastic/kibana/issues/179968 - describe('Notifications', { tags: ['@skipInServerless'] }, () => { + describe('Notifications', { tags: ['@skipInServerlessMKI'] }, () => { beforeEach(() => { installPrebuiltRuleAssets([RULE_1]); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts index ad0cc76f623f5..413504800c2a7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts @@ -47,7 +47,7 @@ import { // https://github.com/elastic/kibana/issues/179943 -describe('Related integrations', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { +describe('Related integrations', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { const DATA_STREAM_NAME = 'logs-related-integrations-test'; const PREBUILT_RULE_NAME = 'Prebuilt rule with related integrations'; const RULE_RELATED_INTEGRATIONS: IntegrationDefinition[] = [ diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts index c98f28fef2da0..573fc2c556abe 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts @@ -183,7 +183,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => }); // github.com/elastic/kibana/issues/179954 - it('Only prebuilt rules selected', { tags: ['@skipInServerless'] }, () => { + it('Only prebuilt rules selected', { tags: ['@skipInServerlessMKI'] }, () => { createAndInstallMockedPrebuiltRules(PREBUILT_RULES); // select Elastic(prebuilt) rules, check if we can't proceed further, as Elastic rules are not editable @@ -204,7 +204,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => // https://github.com/elastic/kibana/issues/179955 it( 'Prebuilt and custom rules selected: user proceeds with custom rules editing', - { tags: ['@skipInServerless'] }, + { tags: ['@skipInServerlessMKI'] }, () => { getRulesManagementTableRows().then((existedRulesRows) => { createAndInstallMockedPrebuiltRules(PREBUILT_RULES); @@ -235,7 +235,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => // https://github.com/elastic/kibana/issues/179956 it( 'Prebuilt and custom rules selected: user cancels action', - { tags: ['@skipInServerless'] }, + { tags: ['@skipInServerlessMKI'] }, () => { createAndInstallMockedPrebuiltRules(PREBUILT_RULES); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts index 5762e273e9686..251932e6e8b30 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts @@ -75,7 +75,7 @@ const expectedSlackMessage = 'Slack action test message'; // https://github.com/elastic/kibana/issues/179958 describe( 'Detection rules, bulk edit of rule actions', - { tags: ['@ess', '@serverless', '@skipInServerless'] }, + { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { login(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts index 36bdcd7c23379..cc270d41c10a6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts @@ -96,7 +96,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => { // https://github.com/elastic/kibana/issues/179959 it( 'shows a modal saying that no rules can be exported if all the selected rules are prebuilt', - { tags: ['@skipInServerless'] }, + { tags: ['@skipInServerlessMKI'] }, function () { createAndInstallMockedPrebuiltRules(prebuiltRules); @@ -164,7 +164,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => { }); // https://github.com/elastic/kibana/issues/180029 - it('exports custom rules with exceptions', { tags: ['@skipInServerless'] }, function () { + it('exports custom rules with exceptions', { tags: ['@skipInServerlessMKI'] }, function () { // one rule with exception, one without it const expectedNumberCustomRulesToBeExported = 2; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts index b07069b65a4ef..e79f6d1e751bc 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts @@ -35,65 +35,69 @@ const RULE_2 = createRuleAssetSavedObject({ }); // https://github.com/elastic/kibana/issues/179961 -describe('Rules table: selection', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => { - beforeEach(() => { - login(); - /* Create and install two mock rules */ - createAndInstallMockedPrebuiltRules([RULE_1, RULE_2]); - visit(RULES_MANAGEMENT_URL); - waitForPrebuiltDetectionRulesToBeLoaded(); - disableAutoRefresh(); - }); +describe( + 'Rules table: selection', + { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, + () => { + beforeEach(() => { + login(); + /* Create and install two mock rules */ + createAndInstallMockedPrebuiltRules([RULE_1, RULE_2]); + visit(RULES_MANAGEMENT_URL); + waitForPrebuiltDetectionRulesToBeLoaded(); + disableAutoRefresh(); + }); - it('should correctly update the selection label when rules are individually selected and unselected', () => { - waitForPrebuiltDetectionRulesToBeLoaded(); + it('should correctly update the selection label when rules are individually selected and unselected', () => { + waitForPrebuiltDetectionRulesToBeLoaded(); - selectRulesByName(['Test rule 1', 'Test rule 2']); + selectRulesByName(['Test rule 1', 'Test rule 2']); - cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '2'); + cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '2'); - unselectRulesByName(['Test rule 1', 'Test rule 2']); + unselectRulesByName(['Test rule 1', 'Test rule 2']); - cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0'); - }); + cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0'); + }); - it('should correctly update the selection label when rules are bulk selected and then bulk un-selected', () => { - waitForPrebuiltDetectionRulesToBeLoaded(); + it('should correctly update the selection label when rules are bulk selected and then bulk un-selected', () => { + waitForPrebuiltDetectionRulesToBeLoaded(); - cy.get(SELECT_ALL_RULES_BTN).click(); + cy.get(SELECT_ALL_RULES_BTN).click(); - getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { - cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount); - }); + getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { + cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount); + }); - // Un-select all rules via the Bulk Selection button from the Utility bar - cy.get(SELECT_ALL_RULES_BTN).click(); + // Un-select all rules via the Bulk Selection button from the Utility bar + cy.get(SELECT_ALL_RULES_BTN).click(); - // Current selection should be 0 rules - cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0'); - // Bulk selection button should be back to displaying all rules - getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { - cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount); + // Current selection should be 0 rules + cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0'); + // Bulk selection button should be back to displaying all rules + getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { + cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount); + }); }); - }); - it('should correctly update the selection label when rules are bulk selected and then unselected via the table select all checkbox', () => { - waitForPrebuiltDetectionRulesToBeLoaded(); + it('should correctly update the selection label when rules are bulk selected and then unselected via the table select all checkbox', () => { + waitForPrebuiltDetectionRulesToBeLoaded(); - cy.get(SELECT_ALL_RULES_BTN).click(); + cy.get(SELECT_ALL_RULES_BTN).click(); - getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { - cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount); - }); + getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { + cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', availablePrebuiltRulesCount); + }); - // Un-select all rules via the Un-select All checkbox from the table - cy.get(SELECT_ALL_RULES_ON_PAGE_CHECKBOX).click(); + // Un-select all rules via the Un-select All checkbox from the table + cy.get(SELECT_ALL_RULES_ON_PAGE_CHECKBOX).click(); - // Current selection should be 0 rules - cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0'); - // Bulk selection button should be back to displaying all rules - getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { - cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount); + // Current selection should be 0 rules + cy.get(SELECTED_RULES_NUMBER_LABEL).should('contain.text', '0'); + // Bulk selection button should be back to displaying all rules + getAvailablePrebuiltRulesCount().then((availablePrebuiltRulesCount) => { + cy.get(SELECT_ALL_RULES_BTN).should('contain.text', availablePrebuiltRulesCount); + }); }); - }); -}); + } +); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts index 18a1cc218ec0e..0b98ae36f1ec9 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_flyout.cy.ts @@ -144,7 +144,7 @@ describe( }); // https://github.com/elastic/kibana/issues/179248 - describe('Managed data section', { tags: ['@skipInServerless'] }, () => { + describe('Managed data section', { tags: ['@skipInServerlessMKI'] }, () => { beforeEach(() => { mockFleetInstalledIntegrations([ { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts index e015d26887148..484ef1e9ed475 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts @@ -27,7 +27,7 @@ const DATA_VIEW = 'auditbeat-*'; // FLAKY: https://github.com/elastic/kibana/issues/178367 describe.skip( 'Inspect Explore pages', - { tags: ['@ess', '@serverless', '@skipInServerless'] }, + { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { before(() => { // illegal_argument_exception: unknown setting [index.lifecycle.name] diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts index bcd132c56d10a..70ac94ca3a163 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts @@ -27,7 +27,7 @@ import { } from '../../../urls/ml_conditional_links'; // FLAKY: https://github.com/elastic/kibana/issues/180748 -describe.skip('ml conditional links', { tags: ['@ess', '@skipInServerless'] }, () => { +describe.skip('ml conditional links', { tags: ['@ess', '@skipInServerlessMKI'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts index 8ad3315bf36b1..78135fbd77235 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts @@ -66,7 +66,7 @@ describe('Overview Page', { tags: ['@ess', '@serverless'] }, () => { }); }); -describe('Overview page with no data', { tags: '@skipInServerless' }, () => { +describe('Overview page with no data', { tags: '@skipInServerlessMKI' }, () => { it('Splash screen should be here', () => { login(); visitWithTimeRange(OVERVIEW_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts index c54b593472dcd..625beff4fe21a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/query_tab.cy.ts @@ -28,7 +28,7 @@ import { ALERTS_URL } from '../../../../urls/navigation'; describe( 'Unsaved Timeline query tab', { - tags: ['@ess', '@serverless', '@skipInServerless'], + tags: ['@ess', '@serverless', '@skipInServerlessMKI'], env: { ftrConfig: { kbnServerArgs: [ From 800289c506aeceb7e1dffa650481d7e10dc5e70c Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 24 Apr 2024 10:59:00 +0200 Subject: [PATCH 09/82] [EDR Workflows] Proper undefined routeState handling (#181432) https://github.com/elastic/kibana/issues/181261 Check if `routeState` is defined before accessing it's properties in `useCallback` dependency list. With changes: https://github.com/elastic/kibana/assets/29123534/4561c5d6-e354-4e0b-ac8a-dd231a26d722 Cypress tests when no undefined check is performed (application throws): ![Screenshot 2024-04-23 at 14 46 37](https://github.com/elastic/kibana/assets/29123534/ed7817dc-f11c-4f5e-bdf3-c6ee9f4c8ea6) --- .../e2e/artifacts/artifact_tabs_in_policy_details.cy.ts | 6 ++++++ .../public/management/cypress/fixtures/artifacts_page.ts | 9 +++++---- .../management/pages/policy/view/tabs/policy_tabs.tsx | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts index b6040691c485f..3feb681f47f5c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts @@ -56,6 +56,10 @@ const getRoleWithoutArtifactPrivilege = (privilegePrefix: string) => { const visitArtifactTab = (tabId: string) => { visitPolicyDetailsPage(); + clickArtifactTab(tabId); +}; + +const clickArtifactTab = (tabId: string) => { cy.get(`#${tabId}`).click(); }; @@ -135,6 +139,8 @@ describe('Artifact tabs in Policy Details page', { tags: ['@ess', '@serverless'] cy.getByTestSubj('backToOrigin').click(); cy.getByTestSubj('policyDetailsPage').should('exist'); + clickArtifactTab(testData.nextTabId); // Make sure the next tab is accessible and backLink doesn't throw errors + cy.getByTestSubj('policyDetailsPage'); }); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts b/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts index bbd173b60cb88..f47818208cb8f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/fixtures/artifacts_page.ts @@ -21,6 +21,7 @@ interface ArtifactsFixtureType { title: string; pagePrefix: string; tabId: string; + nextTabId: string; artifactName: string; privilegePrefix: string; urlPath: string; @@ -46,6 +47,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ title: 'Trusted applications', pagePrefix: 'trustedAppsListPage', tabId: 'trustedApps', + nextTabId: 'eventFilters', artifactName: 'Trusted application name', privilegePrefix: 'trusted_applications_', create: { @@ -142,7 +144,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ }, urlPath: 'trusted_apps', emptyState: 'trustedAppsListPage-emptyState', - createRequestBody: { list_id: ENDPOINT_ARTIFACT_LISTS.trustedApps.id, entries: [ @@ -172,6 +173,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ title: 'Event Filters', pagePrefix: 'EventFiltersListPage', tabId: 'eventFilters', + nextTabId: 'blocklists', artifactName: 'Event filter name', privilegePrefix: 'event_filters_', create: { @@ -274,7 +276,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ }, urlPath: 'event_filters', emptyState: 'EventFiltersListPage-emptyState', - createRequestBody: { list_id: ENDPOINT_ARTIFACT_LISTS.eventFilters.id, entries: [ @@ -292,6 +293,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ title: 'Blocklist', pagePrefix: 'blocklistPage', tabId: 'blocklists', + nextTabId: 'hostIsolationExceptions', artifactName: 'Blocklist name', privilegePrefix: 'blocklist_', create: { @@ -397,7 +399,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ }, urlPath: 'blocklist', emptyState: 'blocklistPage-emptyState', - createRequestBody: { list_id: ENDPOINT_ARTIFACT_LISTS.blocklists.id, entries: [ @@ -421,6 +422,7 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ title: 'Host isolation exceptions', pagePrefix: 'hostIsolationExceptionsListPage', tabId: 'hostIsolationExceptions', + nextTabId: 'trustedApps', artifactName: 'Host Isolation exception name', privilegePrefix: 'host_isolation_exceptions_', create: { @@ -499,7 +501,6 @@ export const getArtifactsListTestsData = (): ArtifactsFixtureType[] => [ }, urlPath: 'host_isolation_exceptions', emptyState: 'hostIsolationExceptionsListPage-emptyState', - createRequestBody: { list_id: ENDPOINT_ARTIFACT_LISTS.hostIsolationExceptions.id, entries: [ diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx index 5b37aa798effd..fd7e8793535e2 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/tabs/policy_tabs.tsx @@ -457,7 +457,7 @@ export const PolicyTabs = React.memo(() => { cancelUnsavedChangesModal, history, policyId, - routeState.backLink, + routeState?.backLink, unsavedChangesModal.showModal, ] ); From ba76b505b1faa2e3ca69d8eb2d822843fb8a6440 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Wed, 24 Apr 2024 11:28:59 +0200 Subject: [PATCH 10/82] [Obs AI Assistant] Instructions & Claude improvements (#181058) When we send over a conversation to the LLM for completion, we include a system message. System messages are a way for the consumer (in this case, us as developers) to control the LLM's behavior. This system message was previously constructed by using a concept called `ContextDefinition` - originally this was a way to define a set of functions and behavior for a specific context, e.g. core functionality, APM-specific functionality, platform-specific functionality etc. However we never actually did anything with this, and much of its intended functionality is now captured with the screen context API. In https://github.com/elastic/kibana/issues/179736, we added user instructions, which are ways for the user to control the Assistant's behaviour, by appending to the system message we construct with the registered context definitions. With this PR, we are making several changes: - Remove the concept of concept definitions entirely - Replace it with `registerInstruction`, which allows the consumer to register pieces of text that will be included in the system message. - `registerInstruction` _also_ takes a callback. That callback receives the available function names for that specific chat request. For instance, when we reach the function call limit, the LLM will have no functions to call. This allows consumers to cater their instructions to this specific scenario, which somewhat limits the possibility of the LLM calling a function that it is not allowed to - Claude is especially prone to this (likely related to the fact we use simulated function calling). This leads to the following functional changes: - A system message is now constructed by combining the registered instructions (system-specific) with the knowledge base and request instructions (user-specific) - `GET /internal/observability_ai_assistant/functions` no longer returns the contexts. Instead it returns the system message - `GET /internal/observability_ai_assistant/chat/complete` now creates a system message at the start, and overrides the system message from the request. - For each invocation of `chat`, it re-calculates the system message by "materializing" the registered instructions with the available function names for that chat invocation Additionally, I've made some attempted improvements to simulated function calling: - simplified the system message - more emphasis on generating valid JSON (e.g. I saw multiline delimiters `"""` which are not supported) - more emphasis on not providing any input if the function does not accept any parameters. e.g. Claude was trying to provide entire search requests or SPL-like query strings as input, which led to hallucinations) There are also some other changes, which I've commented on in the file changes. **Addendum: I have pushed some more changes, related to the evaluation framework (and running it with Claude). Will comment inline in [`9ebd207` (#181058)](https://github.com/elastic/kibana/pull/181058/commits/9ebd207acd47c33077627356c464958240c9d446).** --- .../get_apm_dataset_info.ts | 1 - .../get_apm_downstream_dependencies.ts | 4 +- .../get_apm_services_list.ts | 1 - .../assistant_functions/get_apm_timeseries.ts | 1 - .../apm/server/assistant_functions/index.ts | 2 +- .../common/functions/types.ts | 9 - .../common/types.ts | 2 + .../utils/emit_with_concatenated_message.ts | 41 ++-- .../common/utils/extend_system_message.tsx | 22 -- .../utils/filter_function_definitions.ts | 8 +- ...throw_serialized_chat_completion_errors.ts | 14 +- .../message_panel/esql_code_block.tsx | 64 ++++-- .../components/message_panel/message_text.tsx | 13 +- .../public/hooks/use_chat.test.ts | 8 +- .../public/hooks/use_chat.ts | 10 +- .../public/index.ts | 2 - .../public/mock.tsx | 10 +- .../public/service/create_chat_service.ts | 17 +- .../service/create_mock_chat_service.ts | 9 +- .../service/get_assistant_system_message.ts | 28 --- .../public/storybook_mock.tsx | 9 +- .../public/types.ts | 8 +- .../public/utils/builders.ts | 2 - .../scripts/evaluation/evaluation.ts | 19 +- .../scripts/evaluation/kibana_client.ts | 188 +++++++++++------- .../evaluation/scenarios/apm/index.spec.ts | 40 ++-- .../scenarios/elasticsearch/index.spec.ts | 4 +- .../evaluation/scenarios/esql/index.spec.ts | 25 +-- .../server/functions/context.ts | 9 - .../server/functions/elasticsearch.ts | 3 +- .../server/functions/execute_connector.ts | 1 - .../functions/get_dataset_info/index.ts | 1 - .../server/functions/index.ts | 135 ++++++------- .../server/functions/kibana.ts | 1 - .../server/functions/summarize.ts | 8 +- .../server/routes/functions/route.ts | 32 ++- .../chat_function_client/index.test.ts | 6 - .../service/chat_function_client/index.ts | 31 ++- .../bedrock/process_bedrock_stream.test.ts | 4 +- .../get_system_message_instructions.ts | 23 +-- .../parse_inline_function_calls.ts | 28 +-- .../server/service/client/index.test.ts | 49 ++--- .../server/service/client/index.ts | 116 ++++++----- .../server/service/types.ts | 18 +- .../catch_function_limit_exceeded_error.ts | 66 ++++++ ...t_system_message_from_instructions.test.ts | 78 ++++++++ .../get_system_message_from_instructions.ts | 62 ++++++ .../service/util/replace_system_message.ts | 21 ++ .../components/chat/chat_body.stories.tsx | 8 +- .../components/chat/chat_flyout.stories.tsx | 4 +- .../public/utils/builders.ts | 6 +- .../public/utils/create_mock_chat_service.ts | 13 +- .../server/functions/alerts.ts | 1 - .../server/functions/changes/index.ts | 1 - .../correct_common_esql_mistakes.test.ts | 19 ++ .../query/correct_common_esql_mistakes.ts | 4 +- .../query/correct_query_with_actions.ts | 1 + .../server/functions/query/index.ts | 74 +++++-- .../functions/query/validate_esql_query.ts | 71 +++++++ .../server/functions/visualize_esql.ts | 39 +--- .../server/rule_connector/index.test.ts | 6 +- .../server/rule_connector/index.ts | 11 +- 62 files changed, 960 insertions(+), 551 deletions(-) delete mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx delete mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts index a2821ff913f0b..e0f3f82128ddd 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_dataset_info.ts @@ -20,7 +20,6 @@ export function registerGetApmDatasetInfoFunction({ registerFunction( { name: 'get_apm_dataset_info', - contexts: ['core'], visibility: FunctionVisibility.AssistantOnly, description: `Use this function to get information about APM data.`, parameters: { diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts index 419cdcd1e6dce..c1d1c511dac4d 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts @@ -16,7 +16,6 @@ export function registerGetApmDownstreamDependenciesFunction({ registerFunction( { name: 'get_apm_downstream_dependencies', - contexts: ['core'], description: `Get the downstream dependencies (services or uninstrumented backends) for a service. This allows you to map the downstream dependency name to a service, by returning both span.destination.service.resource and service.name. Use this to @@ -39,7 +38,8 @@ export function registerGetApmDownstreamDependenciesFunction({ }, 'service.environment': { type: 'string', - description: 'The environment that the service is running in', + description: + 'The environment that the service is running in. Leave empty to query for all environments.', }, start: { type: 'string', diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts index 325d73b55070d..1ca34117f5f9d 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts @@ -22,7 +22,6 @@ export function registerGetApmServicesListFunction({ registerFunction( { name: 'get_apm_services_list', - contexts: ['apm'], description: `Gets a list of services`, descriptionForUser: i18n.translate( 'xpack.apm.observabilityAiAssistant.functions.registerGetApmServicesList.descriptionForUser', diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts index 4d5cd841ff4d1..63bdbd422c658 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_timeseries.ts @@ -122,7 +122,6 @@ export function registerGetApmTimeseriesFunction({ }: FunctionRegistrationParameters) { registerFunction( { - contexts: ['core'], name: 'get_apm_timeseries', description: `Visualise and analyse different APM metrics, like throughput, failure rate, or latency, for any service or all services, or any or all of its dependencies, both as a timeseries and as a single statistic. A visualisation will be displayed above your reply - DO NOT attempt to display or generate an image yourself, or any other placeholder. Additionally, the function will return any changes, such as spikes, step and trend changes, or dips. You can also use it to compare data by requesting two different time ranges, or for instance two different service versions.`, parameters, diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts index eebbcf021426c..ccc643cf4dc76 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/index.ts @@ -48,7 +48,7 @@ export function registerAssistantFunctions({ ruleDataClient: IRuleDataClient; plugins: APMRouteHandlerResources['plugins']; }): RegistrationCallback { - return async ({ resources, functions: { registerContext, registerFunction } }) => { + return async ({ resources, functions: { registerFunction } }) => { const apmRouteHandlerResources: MinimalAPMRouteHandlerResources = { context: resources.context, request: resources.request, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts index 12feb88bb6582..bd786e9ba3c75 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts @@ -28,11 +28,6 @@ export type CompatibleJSONSchema = { description?: string; }; -export interface ContextDefinition { - name: string; - description: string; -} - export type FunctionResponse = | { content?: any; @@ -46,10 +41,6 @@ export interface FunctionDefinition void; - -export type ContextRegistry = Map; export type FunctionRegistry = Map; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts index a51db2ebc0fc6..77e9fd33532ca 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/types.ts @@ -94,6 +94,8 @@ export interface UserInstruction { text: string; } +export type UserInstructionOrPlainText = string | UserInstruction; + export interface ObservabilityAIAssistantScreenContextRequest { screenDescription?: string; data?: Array<{ diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts index b3df0af4b2eb4..af283b78698f1 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/emit_with_concatenated_message.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { concat, last, mergeMap, Observable, shareReplay, withLatestFrom } from 'rxjs'; +import { concat, from, last, mergeMap, Observable, shareReplay, withLatestFrom } from 'rxjs'; import { ChatCompletionChunkEvent, MessageAddEvent, @@ -16,8 +16,32 @@ import { ConcatenatedMessage, } from './concatenate_chat_completion_chunks'; +type ConcatenateMessageCallback = ( + concatenatedMessage: ConcatenatedMessage +) => Promise; + +function mergeWithEditedMessage( + originalMessage: ConcatenatedMessage, + chunkEvent: ChatCompletionChunkEvent, + callback?: ConcatenateMessageCallback +): Observable { + return from( + (callback ? callback(originalMessage) : Promise.resolve(originalMessage)).then((message) => { + const next: MessageAddEvent = { + type: StreamingChatResponseEventType.MessageAdd as const, + id: chunkEvent.id, + message: { + '@timestamp': new Date().toISOString(), + ...message, + }, + }; + return next; + }) + ); +} + export function emitWithConcatenatedMessage( - callback?: (concatenatedMessage: ConcatenatedMessage) => Promise + callback?: ConcatenateMessageCallback ): ( source$: Observable ) => Observable { @@ -30,17 +54,8 @@ export function emitWithConcatenatedMessage( concatenateChatCompletionChunks(), last(), withLatestFrom(source$), - mergeMap(async ([message, chunkEvent]) => { - const next: MessageAddEvent = { - type: StreamingChatResponseEventType.MessageAdd as const, - id: chunkEvent.id, - message: { - '@timestamp': new Date().toISOString(), - ...(callback ? await callback(message) : message), - }, - }; - - return next; + mergeMap(([message, chunkEvent]) => { + return mergeWithEditedMessage(message, chunkEvent, callback); }) ) ); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx deleted file mode 100644 index 77a7d99c763ee..0000000000000 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/extend_system_message.tsx +++ /dev/null @@ -1,22 +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 { Message } from '../types'; - -export function extendSystemMessage(messages: Message[], extensions: string[]) { - const [systemMessage, ...rest] = messages; - - const extendedSystemMessage: Message = { - ...systemMessage, - message: { - ...systemMessage.message, - content: `${systemMessage.message.content}\n\n${extensions.join('\n\n').trim()}`, - }, - }; - - return [extendedSystemMessage].concat(rest); -} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts index 63b7661ee105a..b9d41fb498056 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/filter_function_definitions.ts @@ -8,22 +8,18 @@ import type { FunctionDefinition } from '../functions/types'; export function filterFunctionDefinitions({ - contexts, filter, definitions, }: { - contexts?: string[]; filter?: string; definitions: FunctionDefinition[]; }) { - return contexts || filter + return filter ? definitions.filter((fn) => { - const matchesContext = - !contexts || fn.contexts.some((context) => contexts.includes(context)); const matchesFilter = !filter || fn.name.includes(filter) || fn.description.includes(filter); - return matchesContext && matchesFilter; + return matchesFilter; }) : definitions; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts index 8e4718158280b..2c23109a1bac0 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/throw_serialized_chat_completion_errors.ts @@ -5,20 +5,21 @@ * 2.0. */ -import { filter, Observable, tap } from 'rxjs'; +import { filter, OperatorFunction, tap } from 'rxjs'; import { ChatCompletionError, ChatCompletionErrorCode, type StreamingChatResponseEvent, StreamingChatResponseEventType, type ChatCompletionErrorEvent, + BufferFlushEvent, } from '../conversation_complete'; -export function throwSerializedChatCompletionErrors() { - return ( - source$: Observable - ): Observable> => { - return source$.pipe( +export function throwSerializedChatCompletionErrors< + T extends StreamingChatResponseEvent | BufferFlushEvent +>(): OperatorFunction> { + return (source$) => + source$.pipe( tap((event) => { // de-serialise error if (event.type === StreamingChatResponseEventType.ChatCompletionError) { @@ -33,5 +34,4 @@ export function throwSerializedChatCompletionErrors() { event.type !== StreamingChatResponseEventType.ChatCompletionError ) ); - }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx index 4fe05d323572f..24347c3aadb5e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/esql_code_block.tsx @@ -10,6 +10,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiPanel, + UseEuiTheme, useEuiTheme, } from '@elastic/eui'; import { css } from '@emotion/css'; @@ -17,6 +18,47 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { ChatActionClickHandler, ChatActionClickType } from '../chat/types'; +const getCodeBlockClassName = (theme: UseEuiTheme) => css` + background-color: ${theme.euiTheme.colors.lightestShade}; + .euiCodeBlock__pre { + margin-bottom: 0; + padding: ${theme.euiTheme.size.m}; + min-block-size: 48px; + } + .euiCodeBlock__controls { + inset-block-start: ${theme.euiTheme.size.m}; + inset-inline-end: ${theme.euiTheme.size.m}; + } +`; + +function CodeBlockWrapper({ children }: { children: React.ReactNode }) { + const theme = useEuiTheme(); + return ( + + {children} + + ); +} + +export function CodeBlock({ children }: { children: React.ReactNode }) { + return ( + + + + + {children} + + + + + ); +} + export function EsqlCodeBlock({ value, actionsDisabled, @@ -26,26 +68,8 @@ export function EsqlCodeBlock({ actionsDisabled: boolean; onActionClick: ChatActionClickHandler; }) { - const theme = useEuiTheme(); - return ( - + @@ -87,6 +111,6 @@ export function EsqlCodeBlock({ - + ); } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx index 337ae9503fe65..85fa0f4609903 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx @@ -21,7 +21,7 @@ import type { Code, InlineCode, Parent, Text } from 'mdast'; import React, { useMemo, useRef } from 'react'; import type { Node } from 'unist'; import { ChatActionClickHandler } from '../chat/types'; -import { EsqlCodeBlock } from './esql_code_block'; +import { CodeBlock, EsqlCodeBlock } from './esql_code_block'; interface Props { content: string; @@ -104,6 +104,9 @@ const esqlLanguagePlugin = () => { if (node.type === 'code' && node.lang === 'esql') { node.type = 'esql'; + } else if (node.type === 'code') { + // switch to type that allows us to control rendering + node.type = 'codeBlock'; } }; @@ -131,6 +134,14 @@ export function MessageText({ loading, content, onActionClick }: Props) { processingPlugins[1][1].components = { ...components, cursor: Cursor, + codeBlock: (props) => { + return ( + <> + {props.value} + + + ); + }, esql: (props) => { return ( <> diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts index 838feb18330e7..1f36b49175eea 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.test.ts @@ -26,11 +26,17 @@ const mockChatService: MockedChatService = { chat: jest.fn(), complete: jest.fn(), sendAnalyticsEvent: jest.fn(), - getContexts: jest.fn().mockReturnValue([{ name: 'core', description: '' }]), getFunctions: jest.fn().mockReturnValue([]), hasFunction: jest.fn().mockReturnValue(false), hasRenderFunction: jest.fn().mockReturnValue(true), renderFunction: jest.fn(), + getSystemMessage: jest.fn().mockReturnValue({ + '@timestamp': new Date().toISOString(), + message: { + content: 'system', + role: MessageRole.System, + }, + }), }; const addErrorMock = jest.fn(); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts index 2ab4fd294dffa..7291557642669 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts @@ -18,11 +18,7 @@ import { isTokenLimitReachedError, StreamingChatResponseEventType, } from '../../common'; -import { - getAssistantSystemMessage, - type ObservabilityAIAssistantChatService, - type ObservabilityAIAssistantService, -} from '..'; +import type { ObservabilityAIAssistantChatService, ObservabilityAIAssistantService } from '..'; import { useKibana } from './use_kibana'; import { useOnce } from './use_once'; import { useUserPreferredLanguage } from './use_user_preferred_language'; @@ -75,13 +71,11 @@ function useChatWithoutContext({ persist, }: UseChatPropsWithoutContext): UseChatResult { const [chatState, setChatState] = useState(ChatState.Ready); - const systemMessage = useMemo(() => { - return getAssistantSystemMessage({ contexts: chatService.getContexts() }); + return chatService.getSystemMessage(); }, [chatService]); useOnce(initialMessages); - useOnce(initialConversationId); const [conversationId, setConversationId] = useState(initialConversationId); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts index d42c96715523e..52d2511f9877f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts @@ -57,8 +57,6 @@ export { VISUALIZE_ESQL_USER_INTENTIONS, } from '../common/functions/visualize_esql'; -export { getAssistantSystemMessage } from './service/get_assistant_system_message'; - export { isSupportedConnectorType } from '../common'; export { FunctionVisibility } from '../common'; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx index c38307e920641..28b05433b2e1e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/mock.tsx @@ -9,7 +9,7 @@ import { noop } from 'lodash'; import React from 'react'; import { Observable, of } from 'rxjs'; import type { StreamingChatResponseEventWithoutError } from '../common/conversation_complete'; -import { ScreenContextActionDefinition } from '../common/types'; +import { MessageRole, ScreenContextActionDefinition } from '../common/types'; import type { ObservabilityAIAssistantAPIClient } from './api'; import type { ObservabilityAIAssistantChatService, @@ -23,7 +23,6 @@ export const mockChatService: ObservabilityAIAssistantChatService = { sendAnalyticsEvent: noop, chat: (options) => new Observable(), complete: (options) => new Observable(), - getContexts: () => [], getFunctions: () => [buildFunctionElasticsearch(), buildFunctionServiceSummary()], renderFunction: (name) => (
@@ -35,6 +34,13 @@ export const mockChatService: ObservabilityAIAssistantChatService = { ), hasFunction: () => true, hasRenderFunction: () => true, + getSystemMessage: () => ({ + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: '', + }, + }), }; export const mockService: ObservabilityAIAssistantService = { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts index 09c12004591aa..4995aa1b584ba 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts @@ -22,6 +22,7 @@ import { switchMap, timestamp, } from 'rxjs'; +import { Message, MessageRole } from '../../common'; import { type BufferFlushEvent, StreamingChatResponseEventType, @@ -106,7 +107,7 @@ export async function createChatService({ const renderFunctionRegistry: Map> = new Map(); - const [{ functionDefinitions, contextDefinitions }] = await Promise.all([ + const [{ functionDefinitions, systemMessage }] = await Promise.all([ apiClient('GET /internal/observability_ai_assistant/functions', { signal: setupAbortSignal, }), @@ -133,9 +134,7 @@ export async function createChatService({ const client: Pick = { chat(name: string, { connectorId, messages, function: callFunctions = 'auto', signal }) { return new Observable((subscriber) => { - const contexts = ['core', 'apm']; - - const functions = getFunctions({ contexts }).filter((fn) => { + const functions = getFunctions().filter((fn) => { const visibility = fn.visibility ?? FunctionVisibility.All; return ( @@ -270,7 +269,6 @@ export async function createChatService({ onActionClick, }); }, - getContexts: () => contextDefinitions, getFunctions, hasFunction: (name: string) => { return functionRegistry.has(name); @@ -278,6 +276,15 @@ export async function createChatService({ hasRenderFunction: (name: string) => { return renderFunctionRegistry.has(name); }, + getSystemMessage: (): Message => { + return { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: systemMessage, + }, + }; + }, ...client, }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts index caef109f237fc..fc26499b1f63e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_mock_chat_service.ts @@ -6,6 +6,7 @@ */ import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; +import { MessageRole } from '../../common'; import type { ObservabilityAIAssistantChatService } from '../types'; type MockedChatService = DeeplyMockedKeys; @@ -15,11 +16,17 @@ export const createMockChatService = (): MockedChatService => { chat: jest.fn(), complete: jest.fn(), sendAnalyticsEvent: jest.fn(), - getContexts: jest.fn().mockReturnValue([{ name: 'core', description: '' }]), getFunctions: jest.fn().mockReturnValue([]), hasFunction: jest.fn().mockReturnValue(false), hasRenderFunction: jest.fn().mockReturnValue(true), renderFunction: jest.fn(), + getSystemMessage: jest.fn().mockReturnValue({ + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: 'system', + }, + }), }; return mockChatService; }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts deleted file mode 100644 index b1050b8caa4a9..0000000000000 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/get_assistant_system_message.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { without } from 'lodash'; -import { MessageRole } from '../../common'; -import { ContextDefinition } from '../../common/functions/types'; -import type { Message } from '../../common/types'; - -export function getAssistantSystemMessage({ - contexts, -}: { - contexts: ContextDefinition[]; -}): Message { - const coreContext = contexts.find((context) => context.name === 'core')!; - - const otherContexts = without(contexts.concat(), coreContext); - return { - '@timestamp': new Date().toISOString(), - message: { - role: MessageRole.System as const, - content: [coreContext, ...otherContexts].map((context) => context.description).join('\n'), - }, - }; -} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx index 01c2f658e360b..1d9d79838bd3a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/storybook_mock.tsx @@ -8,6 +8,7 @@ import { i18n } from '@kbn/i18n'; import { noop } from 'lodash'; import React from 'react'; import { Observable, of } from 'rxjs'; +import { MessageRole } from '.'; import type { StreamingChatResponseEventWithoutError } from '../common/conversation_complete'; import type { ObservabilityAIAssistantAPIClient } from './api'; import type { ObservabilityAIAssistantChatService, ObservabilityAIAssistantService } from './types'; @@ -17,7 +18,6 @@ export const createStorybookChatService = (): ObservabilityAIAssistantChatServic sendAnalyticsEvent: () => {}, chat: (options) => new Observable(), complete: (options) => new Observable(), - getContexts: () => [], getFunctions: () => [buildFunctionElasticsearch(), buildFunctionServiceSummary()], renderFunction: (name) => (
@@ -29,6 +29,13 @@ export const createStorybookChatService = (): ObservabilityAIAssistantChatServic ), hasFunction: () => true, hasRenderFunction: () => true, + getSystemMessage: () => ({ + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: '', + }, + }), }); export const createStorybookService = (): ObservabilityAIAssistantService => ({ diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts index 071e8e748ebf4..0567324e164dc 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts @@ -14,11 +14,7 @@ import type { MessageAddEvent, StreamingChatResponseEventWithoutError, } from '../common/conversation_complete'; -import type { - ContextDefinition, - FunctionDefinition, - FunctionResponse, -} from '../common/functions/types'; +import type { FunctionDefinition, FunctionResponse } from '../common/functions/types'; import type { Message, ObservabilityAIAssistantScreenContext, @@ -60,9 +56,9 @@ export interface ObservabilityAIAssistantChatService { signal: AbortSignal; responseLanguage: string; }) => Observable; - getContexts: () => ContextDefinition[]; getFunctions: (options?: { contexts?: string[]; filter?: string }) => FunctionDefinition[]; hasFunction: (name: string) => boolean; + getSystemMessage: () => Message; hasRenderFunction: (name: string) => boolean; renderFunction: ( name: string, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts index a7f9df09b47a5..e233bf6da5d11 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/builders.ts @@ -10,7 +10,6 @@ import type { FunctionDefinition } from '../../common/functions/types'; export function buildFunction(): FunctionDefinition { return { name: 'elasticsearch', - contexts: ['core'], description: 'Call Elasticsearch APIs on behalf of the user', descriptionForUser: 'Call Elasticsearch APIs on behalf of the user', parameters: { @@ -36,7 +35,6 @@ export const buildFunctionElasticsearch = buildFunction; export function buildFunctionServiceSummary(): FunctionDefinition { return { name: 'get_service_summary', - contexts: ['core'], description: 'Gets a summary of a single service, including: the language, service version, deployments, infrastructure, alerting, etc. ', descriptionForUser: 'Get a summary for a single service.', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts index 24797ab42269e..650a5cedceaa8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/evaluation.ts @@ -125,7 +125,7 @@ function runEvaluations() { const mocha = new Mocha({ grep: argv.grep, - timeout: '5m', + timeout: '10m', }); const chatClient = kibanaClient.createChatClient({ @@ -253,7 +253,7 @@ function runEvaluations() { mocha.addFile(filename); } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { mocha.run((failures: any) => { if (failures) { log.write(table.table(failedScenarios, tableConfig)); @@ -262,6 +262,21 @@ function runEvaluations() { } resolve(); }); + }).finally(() => { + const score = results + .flatMap((result) => result.scores) + .reduce( + (prev, result) => { + prev.score += result.score; + prev.total += 1; + return prev; + }, + { score: 0, total: 0 } + ); + + log.write('-------------------------------------------'); + log.write(`Scored ${score.score} out of ${score.total}`); + log.write('-------------------------------------------'); }); }, { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts index a3385be2950ff..7604b7bca4a17 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/kibana_client.ts @@ -5,13 +5,26 @@ * 2.0. */ -import axios, { AxiosInstance, AxiosResponse } from 'axios'; -import { isArray, pick, remove } from 'lodash'; -import { concatMap, filter, lastValueFrom, toArray } from 'rxjs'; -import { format, parse, UrlObject } from 'url'; import { ToolingLog } from '@kbn/tooling-log'; +import axios, { AxiosInstance, AxiosResponse, isAxiosError } from 'axios'; +import { isArray, pick, remove } from 'lodash'; import pRetry from 'p-retry'; -import { Message, MessageRole } from '../../common'; +import { + concatMap, + defer, + filter, + from, + lastValueFrom, + of, + OperatorFunction, + retry, + switchMap, + timer, + toArray, +} from 'rxjs'; +import { format, parse, UrlObject } from 'url'; +import { inspect } from 'util'; +import { ChatCompletionErrorCode, isChatCompletionError, Message, MessageRole } from '../../common'; import { isSupportedConnectorType } from '../../common/connectors'; import { BufferFlushEvent, @@ -21,16 +34,14 @@ import { MessageAddEvent, StreamingChatResponseEvent, StreamingChatResponseEventType, - TokenCountEvent, } from '../../common/conversation_complete'; +import { FunctionDefinition } from '../../common/functions/types'; import { ObservabilityAIAssistantScreenContext } from '../../common/types'; import { concatenateChatCompletionChunks } from '../../common/utils/concatenate_chat_completion_chunks'; import { throwSerializedChatCompletionErrors } from '../../common/utils/throw_serialized_chat_completion_errors'; import { APIReturnType, ObservabilityAIAssistantAPIClientRequestParamsOf } from '../../public'; -import { getAssistantSystemMessage } from '../../public/service/get_assistant_system_message'; import { streamIntoObservable } from '../../server/service/util/stream_into_observable'; import { EvaluationResult } from './types'; -import { FunctionDefinition } from '../../common/functions/types'; // eslint-disable-next-line spaced-comment /// @@ -170,13 +181,13 @@ export class KibanaClient { async function getFunctions() { const { - data: { functionDefinitions, contextDefinitions }, + data: { functionDefinitions }, }: AxiosResponse> = await that.axios.get( that.getUrl({ pathname: '/internal/observability_ai_assistant/functions' }) ); - return { functionDefinitions, contextDefinitions }; + return { functionDefinitions }; } let currentTitle: string = ''; @@ -202,6 +213,61 @@ export class KibanaClient { unregister: () => void; }> = []; + function serializeAndHandleRetryableErrors< + T extends StreamingChatResponseEvent + >(): OperatorFunction> { + return (source$) => { + const processed$ = source$.pipe( + concatMap((buffer: Buffer) => + buffer + .toString('utf-8') + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line) as T | BufferFlushEvent) + ), + throwSerializedChatCompletionErrors(), + retry({ + count: 1, + delay: (error) => { + that.log.error('Error in stream'); + + if (isAxiosError(error)) { + that.log.error( + inspect( + { + message: error.message, + status: error.status, + response: error.response?.data, + }, + { depth: 10 } + ) + ); + } else { + that.log.error(inspect(error, { depth: 10 })); + } + + if ( + isChatCompletionError(error) && + error.code !== ChatCompletionErrorCode.InternalError + ) { + that.log.info(`Not retrying error ${error.code}`); + return of(); + } + that.log.info(`Retrying in 5s`); + return timer(5000); + }, + }), + filter( + (event): event is Exclude => + event.type !== StreamingChatResponseEventType.BufferFlush + ) + ); + + return processed$; + }; + } + async function chat( name: string, { @@ -216,46 +282,37 @@ export class KibanaClient { connectorIdOverride?: string; } ) { - const params: ObservabilityAIAssistantAPIClientRequestParamsOf<'POST /internal/observability_ai_assistant/chat'>['params']['body'] = - { - name, - messages, - connectorId: connectorIdOverride || connectorId, - functions: functions.map((fn) => pick(fn, 'name', 'description', 'parameters')), - functionCall, - }; - const stream$ = streamIntoObservable( - ( - await that.axios.post( - that.getUrl({ - pathname: '/internal/observability_ai_assistant/chat', - }), - params, - { responseType: 'stream', timeout: NaN } - ) - ).data - ).pipe( - concatMap((buffer: Buffer) => - buffer - .toString('utf-8') - .split('\n') - .map((line) => line.trim()) - .filter(Boolean) - .map( - (line) => - JSON.parse(line) as StreamingChatResponseEvent | BufferFlushEvent | TokenCountEvent - ) - ), + that.log.info('Chat', name); + + const chat$ = defer(() => { + that.log.debug(`Calling chat API`); + const params: ObservabilityAIAssistantAPIClientRequestParamsOf<'POST /internal/observability_ai_assistant/chat'>['params']['body'] = + { + name, + messages, + connectorId: connectorIdOverride || connectorId, + functions: functions.map((fn) => pick(fn, 'name', 'description', 'parameters')), + functionCall, + }; + + return that.axios.post( + that.getUrl({ + pathname: '/internal/observability_ai_assistant/chat', + }), + params, + { responseType: 'stream', timeout: NaN } + ); + }).pipe( + switchMap((response) => streamIntoObservable(response.data)), + serializeAndHandleRetryableErrors(), filter( - (line): line is ChatCompletionChunkEvent | ChatCompletionErrorEvent => - line.type === StreamingChatResponseEventType.ChatCompletionChunk || - line.type === StreamingChatResponseEventType.ChatCompletionError + (line): line is ChatCompletionChunkEvent => + line.type === StreamingChatResponseEventType.ChatCompletionChunk ), - throwSerializedChatCompletionErrors(), concatenateChatCompletionChunks() ); - const message = await lastValueFrom(stream$); + const message = await lastValueFrom(chat$); return message.message; } @@ -264,9 +321,8 @@ export class KibanaClient { return { chat: async (message) => { - const { functionDefinitions, contextDefinitions } = await getFunctions(); + const { functionDefinitions } = await getFunctions(); const messages = [ - getAssistantSystemMessage({ contexts: contextDefinitions }), ...getMessages(message).map((msg) => ({ message: msg, '@timestamp': new Date().toISOString(), @@ -275,6 +331,7 @@ export class KibanaClient { return chat('chat', { messages, functions: functionDefinitions }); }, complete: async (...args) => { + that.log.info(`Complete`); let messagesArg: StringOrMessageList; let conversationId: string | undefined; let options: Options = {}; @@ -301,18 +358,17 @@ export class KibanaClient { options = args[2]; } - const { contextDefinitions } = await getFunctions(); const messages = [ - getAssistantSystemMessage({ contexts: contextDefinitions }), ...getMessages(messagesArg!).map((msg) => ({ message: msg, '@timestamp': new Date().toISOString(), })), ]; - const stream$ = streamIntoObservable( - ( - await that.axios.post( + const stream$ = defer(() => { + that.log.debug(`Calling /chat/complete API`); + return from( + that.axios.post( that.getUrl({ pathname: '/internal/observability_ai_assistant/chat/complete', }), @@ -326,28 +382,17 @@ export class KibanaClient { }, { responseType: 'stream', timeout: NaN } ) - ).data - ).pipe( - concatMap((buffer: Buffer) => - buffer - .toString('utf-8') - .split('\n') - .map((line) => line.trim()) - .filter(Boolean) - .map( - (line) => - JSON.parse(line) as - | StreamingChatResponseEvent - | BufferFlushEvent - | TokenCountEvent - ) - ), + ); + }).pipe( + switchMap((response) => { + return streamIntoObservable(response.data); + }), + serializeAndHandleRetryableErrors(), filter( (event): event is MessageAddEvent | ConversationCreateEvent => event.type === StreamingChatResponseEventType.MessageAdd || event.type === StreamingChatResponseEventType.ConversationCreate ), - throwSerializedChatCompletionErrors(), toArray() ); @@ -401,7 +446,9 @@ export class KibanaClient { This is the conversation: - ${JSON.stringify(messages)}`, + ${JSON.stringify( + messages.map((msg) => pick(msg, 'content', 'name', 'function_call', 'role')) + )}`, }, }, ], @@ -437,7 +484,6 @@ export class KibanaClient { }, required: ['criteria'], }, - contexts: [], description: 'Call this function to return scores for the criteria', }, ], diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts index 24a1b21f95237..6d715dd911dbf 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/apm/index.spec.ts @@ -91,33 +91,31 @@ describe('apm', () => { ); }); - it('service summary, troughput, dependencies and errors', async () => { - let conversation = await chatClient.complete( - 'What is the status of the service ai-assistant-service in the test environment?' + it('service throughput', async () => { + const conversation = await chatClient.complete( + 'What is the average throughput per minute for the ai-assistant-service service over the past 4 hours?' ); - conversation = await chatClient.complete( - conversation.conversationId!, - conversation.messages.concat({ - content: - 'What is the average throughput for the ai-assistant-service service over the past 4 hours?', - role: MessageRole.User, - }) - ); + const result = await chatClient.evaluate(conversation, [ + 'Uses the get_apm_dataset_info function to get information about the APM data streams', + 'Uses the query function to generate an ES|QL query', + 'Generates a valid ES|QL query that returns the throughput over the past 4 hours.', + 'Uses the execute_query function to get the results for the generated query', + 'Summarizes the results for the user', + 'Calculates a throughput of 30 transactions per minute', + ]); - conversation = await chatClient.complete( - conversation.conversationId!, - conversation.messages.concat({ - content: 'What are the downstream dependencies of the ai-assistant-service-front service?', - role: MessageRole.User, - }) + expect(result.passed).to.be(true); + }); + + it('service dependencies', async () => { + const conversation = await chatClient.complete( + 'What are the downstream dependencies of the ai-assistant-service-front service?' ); const result = await chatClient.evaluate(conversation, [ - 'Uses get_apm_service_summary to obtain the status of the ai-assistant-service service', - 'Executes get_apm_timeseries to obtain the throughput of the services ai-assistant-service for the last 4 hours', - 'Gives a summary of the throughput stats for ai-assistant-service', - 'Provides the downstream dependencies of ai-assistant-service-front', + 'Uses the get_apm_downstream_dependencies function with the `service.name` parameter being "ai-assistant-service-front"', + 'Returns the results to the user ("ai-assistant-service-back" is the only dependency)', ]); expect(result.passed).to.be(true); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts index 1dba311a64495..20f78d487a4bf 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/elasticsearch/index.spec.ts @@ -61,8 +61,8 @@ describe('elasticsearch functions', () => { const conversation = await chatClient.complete('How many documents are in the index kb?'); const result = await chatClient.evaluate(conversation, [ - 'Calls the Elasticsearch function', - 'Finds how many documents are in that index', + 'Calls the `elasticsearch` function OR the `query` function', + 'Finds how many documents are in that index (one document)', ]); expect(result.passed).to.be(true); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts index 4dfaa6df835c1..3bd6fc6a0c207 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts @@ -34,7 +34,7 @@ async function evaluateEsqlQuery({ : []), ...(execute ? [`The query successfully executed without an error`] - : [`The query was not executed`]), + : [`The query was not executed, it was only explained`]), ...criteria, ]); @@ -154,7 +154,8 @@ describe('ES|QL query generation', () => { question: 'From employees, I want to sort the documents by salary, and then return 10 results per page, and then see the second page', criteria: [ - 'The assistant should mention that pagination is currently not supported in ES|QL', + 'The assistant should clearly mention that pagination is currently not supported in ES|QL', + 'IF the assistant decides to execute the query, it should correctly execute, and the Assistant should clearly mention pagination is not currently supported', ], }); }); @@ -180,7 +181,7 @@ describe('ES|QL query generation', () => { it('logs avg cpu', async () => { await evaluateEsqlQuery({ question: - 'My metric data (ECS) is in .ds-metrics-apm* Show me a query that gets the average CPU per service, limit it to the top 10 results, in 1m buckets, and only include the last 15m. ', + 'My metrics data is in `metrics-*`. I want to see what a query would look like that gets the average CPU per service, limit it to the top 10 results, in 1m buckets, and only include the last 15m.', expected: `FROM .ds-metrics-apm* | WHERE @timestamp >= NOW() - 15 minutes | EVAL bucket = DATE_TRUNC(1 minute, @timestamp) @@ -193,7 +194,7 @@ describe('ES|QL query generation', () => { it('metricbeat avg cpu', async () => { await evaluateEsqlQuery({ - question: `From metricbeat*, using ES|QL, show me a query to see the percentage of CPU time (system.cpu.system.pct) normalized by the number of CPU cores (system.cpu.cores), broken down by hostname`, + question: `Assume my data is in \`metricbeat*\`. Show me a query to see the percentage of CPU time (system.cpu.system.pct) normalized by the number of CPU cores (system.cpu.cores), broken down by host name`, expected: `FROM metricbeat* | EVAL system_pct_normalized = TO_DOUBLE(system.cpu.system.pct) / system.cpu.cores | STATS avg_system_pct_normalized = AVG(system_pct_normalized) BY host.name @@ -205,7 +206,7 @@ describe('ES|QL query generation', () => { it('postgres avg duration dissect', async () => { await evaluateEsqlQuery({ question: - 'Show me an ESQL query to extract the query duration from postgres log messages in postgres-logs*, with this format "2021-01-01 00:00:00 UTC [12345]: [1-1] user=postgres,db=mydb,app=[unknown],client=127.0.0.1 LOG: duration: 123.456 ms statement: SELECT * FROM my_table", using ECS fields, and calculate the avg', + 'Show me an example ESQL query to extract the query duration from postgres log messages in postgres-logs*, with this format:\n `2021-01-01 00:00:00 UTC [12345]: [1-1] user=postgres,db=mydb,app=[unknown],client=127.0.0.1 LOG: duration: 123.456 ms statement: SELECT * FROM my_table`. \n Use ECS fields, and calculate the avg.', expected: `FROM postgres-logs* | DISSECT message "%{}: duration: %{query_duration} ms %{}" | EVAL duration_double = TO_DOUBLE(duration) @@ -256,14 +257,12 @@ describe('ES|QL query generation', () => { ); }); - it('metrics avg duration', async () => { + // histograms are not supported yet in ES|QL + it.skip('metrics avg duration', async () => { await evaluateEsqlQuery({ question: 'Execute a query for metrics-apm*, filtering on metricset.name:service_transaction and metricset.interval:1m, the average duration (via transaction.duration.histogram), in 50 buckets.', execute: true, - criteria: [ - 'The assistant know that transaction.duration.histogram cannot be used in ESQL and proposes an alertative solution', - ], }); }); @@ -274,8 +273,7 @@ describe('ES|QL query generation', () => { expected: `FROM traces-apm* | WHERE @timestamp >= NOW() - 24 hours | EVAL is_failure = CASE(event.outcome == "failure", 1, 0), is_success = CASE(event.outcome == "success", 1, 0) - | STATS total_requests = COUNT(*), avg_duration = AVG(transaction.duration.us), total_failures = SUM(is_failure), total_success = SUM(is_success) BY service.name - | EVAL success_rate = total_success / (total_failures + total_success) + | STATS total_requests = COUNT(*), avg_duration = AVG(transaction.duration.us), success_rate = SUM(is_success) / COUNT(*) BY service.name | KEEP service.name, avg_duration, success_rate, total_requests`, execute: true, }); @@ -328,9 +326,12 @@ describe('ES|QL query generation', () => { expected: `FROM logs-apm* | SORT @timestamp DESC | EVAL formatted_date = DATE_FORMAT("hh:mm a, d 'of' MMMM yyyy", @timestamp) - | KEEP formatted_date, log.level, message + | KEEP formatted_date, processor.event, message | LIMIT 5`, execute: true, + criteria: [ + 'The Assistant uses KEEP, to make sure the AT LEAST the formatted date, processor event and message fields are displayed. More columns are fine, fewer are not', + ], }); }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts index 15d34d36a4ffc..7c785392dfaf4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts @@ -35,7 +35,6 @@ export function registerContextFunction({ functions.registerFunction( { name: 'context', - contexts: ['core'], description: 'This function provides context as to what the user is looking at on their screen, and recalled documents from the knowledge base that matches their query', visibility: FunctionVisibility.AssistantOnly, @@ -68,10 +67,6 @@ export function registerContextFunction({ const { queries, categories } = args; async function getContext() { - const systemMessage = messages.find( - (message) => message.message.role === MessageRole.System - ); - const screenDescription = compact( screenContexts.map((context) => context.screenDescription) ).join('\n\n'); @@ -93,10 +88,6 @@ export function registerContextFunction({ return { content }; } - if (!systemMessage) { - throw new Error('No system message found'); - } - const userMessage = last( messages.filter((message) => message.message.role === MessageRole.User) ); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts index 05900a2d47555..61a8b6adf3ed3 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/elasticsearch.ts @@ -14,7 +14,6 @@ export function registerElasticsearchFunction({ functions.registerFunction( { name: 'elasticsearch', - contexts: ['core'], description: 'Call Elasticsearch APIs on behalf of the user. Make sure the request body is valid for the API that you are using. Only call this function when the user has explicitly requested it.', descriptionForUser: 'Call Elasticsearch APIs on behalf of the user', @@ -47,7 +46,7 @@ export function registerElasticsearchFunction({ body, }); - return { content: response }; + return { content: { response } }; } ); } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts index 8e668d0295ba5..0088e35a6f6af 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/execute_connector.ts @@ -15,7 +15,6 @@ export function registerExecuteConnectorFunction({ functions.registerFunction( { name: 'execute_connector', - contexts: ['core'], description: 'Use this function when user explicitly asks to call a kibana connector.', visibility: FunctionVisibility.AssistantOnly, parameters: { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts index bfd0ef43d546c..1554df10175a2 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts @@ -16,7 +16,6 @@ export function registerGetDatasetInfoFunction({ functions.registerFunction( { name: 'get_dataset_info', - contexts: ['core'], visibility: FunctionVisibility.AssistantOnly, description: `Use this function to get information about indices/datasets available and the fields available on them. diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts index c24c8d9f38803..7f706046a693c 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts @@ -34,97 +34,84 @@ export const registerFunctions: RegistrationCallback = async ({ const isServerless = !!resources.plugins.serverless; - return client.getKnowledgeBaseStatus().then((response) => { - const isReady = response.ready; + functions.registerInstruction(`You are a helpful assistant for Elastic Observability. Your goal is to help the Elastic Observability users to quickly assess what is happening in their observed systems. You can help them visualise and analyze data, investigate their systems, perform root cause analysis or identify optimisation opportunities. - let description = dedent( - `You are a helpful assistant for Elastic Observability. Your goal is to help the Elastic Observability users to quickly assess what is happening in their observed systems. You can help them visualise and analyze data, investigate their systems, perform root cause analysis or identify optimisation opportunities. + It's very important to not assume what the user is meaning. Ask them for clarification if needed. - It's very important to not assume what the user is meaning. Ask them for clarification if needed. + If you are unsure about which function should be used and with what arguments, ask the user for clarification or confirmation. - If you are unsure about which function should be used and with what arguments, ask the user for clarification or confirmation. + In KQL ("kqlFilter")) escaping happens with double quotes, not single quotes. Some characters that need escaping are: ':()\\\ + /\". Always put a field value in double quotes. Best: service.name:\"opbeans-go\". Wrong: service.name:opbeans-go. This is very important! - In KQL ("kqlFilter")) escaping happens with double quotes, not single quotes. Some characters that need escaping are: ':()\\\ - /\". Always put a field value in double quotes. Best: service.name:\"opbeans-go\". Wrong: service.name:opbeans-go. This is very important! + You can use Github-flavored Markdown in your responses. If a function returns an array, consider using a Markdown table to format the response. + + Note that ES|QL (the Elasticsearch Query Language which is a new piped language) is the preferred query language. - You can use Github-flavored Markdown in your responses. If a function returns an array, consider using a Markdown table to format the response. + DO NOT UNDER ANY CIRCUMSTANCES USE ES|QL syntax (\`service.name == "foo"\`) with "kqlFilter" (\`service.name:"foo"\`). + + The user is able to change the language which they want you to reply in on the settings page of the AI Assistant for Observability, which can be found in the ${ + isServerless ? `Project settings.` : `Stack Management app under the option AI Assistants` + }. + If the user asks how to change the language, reply in the same language the user asked in.`); - Note that ES|QL (the Elasticsearch Query Language which is a new piped language) is the preferred query language. + const { ready: isReady } = await client.getKnowledgeBaseStatus(); - You MUST use the "query" function when the user wants to: - - visualize data - - run any arbitrary query - - breakdown or filter ES|QL queries that are displayed on the current page - - convert queries from another language to ES|QL - - asks general questions about ES|QL + functions.registerInstruction(({ availableFunctionNames }) => { + const instructions: string[] = []; - DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself. - DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "query" function for this. - - DO NOT UNDER ANY CIRCUMSTANCES USE ES|QL syntax (\`service.name == "foo"\`) with "kqlFilter" (\`service.name:"foo"\`). - - Even if the "context" function was used before that, follow it up with the "query" function. If a query fails, do not attempt to correct it yourself. Again you should call the "query" function, - even if it has been called before. - - When the "visualize_query" function has been called, a visualization has been displayed to the user. DO NOT UNDER ANY CIRCUMSTANCES follow up a "visualize_query" function call with your own visualization attempt. - If the "execute_query" function has been called, summarize these results for the user. The user does not see a visualization in this case. - - You MUST use the get_dataset_info function ${ - functions.hasFunction('get_apm_dataset_info') ? 'or get_apm_dataset_info' : '' - } function before calling the "query" or "changes" function. - - If a function requires an index, you MUST use the results from the dataset info functions. + if (availableFunctionNames.includes('get_dataset_info')) { + instructions.push(`You MUST use the get_dataset_info function ${ + functions.hasFunction('get_apm_dataset_info') ? 'or get_apm_dataset_info' : '' + } function before calling the "query" or "changes" function. + + If a function requires an index, you MUST use the results from the dataset info functions.`); + } - ${ - functions.hasFunction('get_data_on_screen') - ? `You have access to data on the screen by calling the "get_data_on_screen" function. + if (availableFunctionNames.includes('get_data_on_screen')) { + instructions.push(`You have access to data on the screen by calling the "get_data_on_screen" function. Use it to help the user understand what they are looking at. A short summary of what they are looking at is available in the return of the "context" function. - Data that is compact enough automatically gets included in the response for the "context" function. - ` - : '' - } - - The user is able to change the language which they want you to reply in on the settings page of the AI Assistant for Observability, which can be found in the ${ - isServerless ? `Project settings.` : `Stack Management app under the option AI Assistants` - }. - If the user asks how to change the language, reply in the same language the user asked in. - ` - ); + Data that is compact enough automatically gets included in the response for the "context" function.`); + } if (isReady) { - description += `You can use the "summarize" functions to store new information you have learned in a knowledge database. Once you have established that you did not know the answer to a question, and the user gave you this information, it's important that you create a summarisation of what you have learned and store it in the knowledge database. Don't create a new summarization if you see a similar summarization in the conversation, instead, update the existing one by re-using its ID. - All summaries MUST be created in English, even if the conversation was carried out in a different language. - - Additionally, you can use the "context" function to retrieve relevant information from the knowledge database. - - `; - - registerSummarizationFunction(registrationParameters); + if (availableFunctionNames.includes('summarize')) { + instructions.push(`You can use the "summarize" functions to store new information you have learned in a knowledge database. + Only use this function when the user asks for it. + All summaries MUST be created in English, even if the conversation was carried out in a different language.`); + } + + if (availableFunctionNames.includes('context')) { + instructions.push( + `Additionally, you can use the "context" function to retrieve relevant information from the knowledge database.` + ); + } } else { - description += `You do not have a working memory. If the user expects you to remember the previous conversations, tell them they can set up the knowledge base.`; + instructions.push( + `You do not have a working memory. If the user expects you to remember the previous conversations, tell them they can set up the knowledge base.` + ); } + return instructions.map((instruction) => dedent(instruction)); + }); - registerContextFunction({ ...registrationParameters, isKnowledgeBaseAvailable: isReady }); + if (isReady) { + registerSummarizationFunction(registrationParameters); + } - registerElasticsearchFunction(registrationParameters); - const request = registrationParameters.resources.request; + registerContextFunction({ ...registrationParameters, isKnowledgeBaseAvailable: isReady }); - if ('id' in request) { - registerKibanaFunction({ - ...registrationParameters, - resources: { - ...registrationParameters.resources, - request, - }, - }); - } - registerGetDatasetInfoFunction(registrationParameters); + registerElasticsearchFunction(registrationParameters); + const request = registrationParameters.resources.request; - registerExecuteConnectorFunction(registrationParameters); - - functions.registerContext({ - name: 'core', - description: dedent(description), + if ('id' in request) { + registerKibanaFunction({ + ...registrationParameters, + resources: { + ...registrationParameters.resources, + request, + }, }); - }); + } + registerGetDatasetInfoFunction(registrationParameters); + + registerExecuteConnectorFunction(registrationParameters); }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts index 4af123a43f891..f939e3a79799b 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts @@ -20,7 +20,6 @@ export function registerKibanaFunction({ functions.registerFunction( { name: 'kibana', - contexts: ['core'], description: 'Call Kibana APIs on behalf of the user. Only call this function when the user has explicitly requested it, and you know how to call it, for example by querying the knowledge base or having the user explain it to you. Assume that pathnames, bodies and query parameters may have changed since your knowledge cut off date.', descriptionForUser: 'Call Kibana APIs on behalf of the user', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts index 39b73aefa89f6..4ff8e3ee4da91 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts @@ -15,9 +15,11 @@ export function registerSummarizationFunction({ functions.registerFunction( { name: 'summarize', - contexts: ['core'], - description: - "Use this function to summarize things learned from the conversation. You can score the learnings with a confidence metric, whether it is a correction on a previous learning. An embedding will be created that you can recall later with a semantic search. There is no need to ask the user for permission to store something you have learned, unless you do not feel confident. When you create this summarisation, make sure you craft it in a way that can be recalled with a semantic search later, and that it would have answered the user's original request.", + description: `Use this function to store facts in the knowledge database if the user requests it. + You can score the learnings with a confidence metric, whether it is a correction on a previous learning. + An embedding will be created that you can recall later with a semantic search. + When you create this summarisation, make sure you craft it in a way that can be recalled with a semantic + search later, and that it would have answered the user's original request.`, descriptionForUser: 'This function allows the Elastic Assistant to summarize things from the conversation.', parameters: { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts index 9b48dc3f472d1..58c93737b6617 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts @@ -7,9 +7,10 @@ import { notImplemented } from '@hapi/boom'; import { nonEmptyStringRt, toBooleanRt } from '@kbn/io-ts-utils'; import * as t from 'io-ts'; -import { ContextDefinition, FunctionDefinition } from '../../../common/functions/types'; +import { FunctionDefinition } from '../../../common/functions/types'; import { KnowledgeBaseEntryRole } from '../../../common/types'; import type { RecalledEntry } from '../../service/knowledge_base_service'; +import { getSystemMessageFromInstructions } from '../../service/util/get_system_message_from_instructions'; import { createObservabilityAIAssistantServerRoute } from '../create_observability_ai_assistant_server_route'; const getFunctionsRoute = createObservabilityAIAssistantServerRoute({ @@ -21,7 +22,7 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({ resources ): Promise<{ functionDefinitions: FunctionDefinition[]; - contextDefinitions: ContextDefinition[]; + systemMessage: string; }> => { const { service, request } = resources; @@ -32,16 +33,29 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({ const client = await service.getClient({ request }); - const functionClient = await service.getFunctionClient({ - signal: controller.signal, - resources, - client, - screenContexts: [], - }); + const [functionClient, knowledgeBaseInstructions] = await Promise.all([ + service.getFunctionClient({ + signal: controller.signal, + resources, + client, + screenContexts: [], + }), + // error is caught in client + client.fetchKnowledgeBaseInstructions(), + ]); + + const functionDefinitions = functionClient.getFunctions().map((fn) => fn.definition); + + const availableFunctionNames = functionDefinitions.map((def) => def.name); return { functionDefinitions: functionClient.getFunctions().map((fn) => fn.definition), - contextDefinitions: functionClient.getContexts(), + systemMessage: getSystemMessageFromInstructions({ + registeredInstructions: functionClient.getInstructions(), + knowledgeBaseInstructions, + requestInstructions: [], + availableFunctionNames, + }), }; }, }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts index a55098c5ec4fe..9ecbd450cba30 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts @@ -20,14 +20,9 @@ describe('chatFunctionClient', () => { }); client = new ChatFunctionClient([]); - client.registerContext({ - description: '', - name: 'core', - }); client.registerFunction( { - contexts: ['core'], description: '', name: 'myFunction', parameters: { @@ -93,7 +88,6 @@ describe('chatFunctionClient', () => { expect(functions[0]).toEqual({ definition: { - contexts: ['core'], description: expect.any(String), name: 'get_data_on_screen', parameters: expect.any(Object), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts index ea09024a137e7..d0b019d635c12 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts @@ -9,16 +9,17 @@ import Ajv, { type ErrorObject, type ValidateFunction } from 'ajv'; import dedent from 'dedent'; import { compact, keyBy } from 'lodash'; -import { - FunctionVisibility, - type ContextDefinition, - type ContextRegistry, - type FunctionResponse, - type RegisterContextDefinition, -} from '../../../common/functions/types'; +import { FunctionVisibility, type FunctionResponse } from '../../../common/functions/types'; import type { Message, ObservabilityAIAssistantScreenContextRequest } from '../../../common/types'; import { filterFunctionDefinitions } from '../../../common/utils/filter_function_definitions'; -import type { ChatFn, FunctionHandler, FunctionHandlerRegistry, RegisterFunction } from '../types'; +import type { + ChatFn, + FunctionHandler, + FunctionHandlerRegistry, + RegisteredInstruction, + RegisterFunction, + RegisterInstruction, +} from '../types'; export class FunctionArgsValidationError extends Error { constructor(public readonly errors: ErrorObject[]) { @@ -31,7 +32,7 @@ const ajv = new Ajv({ }); export class ChatFunctionClient { - private readonly contextRegistry: ContextRegistry = new Map(); + private readonly instructions: RegisteredInstruction[] = []; private readonly functionRegistry: FunctionHandlerRegistry = new Map(); private readonly validators: Map = new Map(); @@ -46,7 +47,6 @@ export class ChatFunctionClient { this.registerFunction( { name: 'get_data_on_screen', - contexts: ['core'], description: dedent(`Get data that is on the screen: ${allData.map((data) => `${data.name}: ${data.description}`).join('\n')} `), @@ -89,8 +89,8 @@ export class ChatFunctionClient { this.functionRegistry.set(definition.name, { definition, respond }); }; - registerContext: RegisterContextDefinition = (context) => { - this.contextRegistry.set(context.name, context); + registerInstruction: RegisterInstruction = (instruction) => { + this.instructions.push(instruction); }; validate(name: string, parameters: unknown) { @@ -105,8 +105,8 @@ export class ChatFunctionClient { } } - getContexts(): ContextDefinition[] { - return Array.from(this.contextRegistry.values()); + getInstructions(): RegisteredInstruction[] { + return this.instructions; } hasAction(name: string) { @@ -114,10 +114,8 @@ export class ChatFunctionClient { } getFunctions({ - contexts, filter, }: { - contexts?: string[]; filter?: string; } = {}): FunctionHandler[] { const allFunctions = Array.from(this.functionRegistry.values()); @@ -125,7 +123,6 @@ export class ChatFunctionClient { const functionsByName = keyBy(allFunctions, (definition) => definition.definition.name); const matchingDefinitions = filterFunctionDefinitions({ - contexts, filter, definitions: allFunctions.map((fn) => fn.definition), }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts index ee426db515322..90f7d6f5ee69c 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/bedrock/process_bedrock_stream.test.ts @@ -173,7 +173,9 @@ describe('processBedrockStream', () => { ); } - await expect(fn).rejects.toThrowErrorMatchingInlineSnapshot(`"no elements in sequence"`); + await expect(fn).rejects.toThrowErrorMatchingInlineSnapshot( + `"Unexpected token 'i', \\"invalid json\\" is not valid JSON"` + ); }); it('successfully invokes a function without parameters', async () => { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts index dd74052ce7bbe..dae509e169e10 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts @@ -16,26 +16,18 @@ export function getSystemMessageInstructions({ if (functions?.length) { return `In this environment, you have access to a set of tools you can use to answer the user's question. - When deciding what tool to use, keep in mind that you can call other tools in successive requests, so decide what tool - would be a good first step. - - You MUST only invoke a single tool, and invoke it once. Other invocations will be ignored. - You MUST wait for the results before invoking another. - You can call multiple tools in successive messages. This means you can chain tool calls. If any tool was used in a previous - message, consider whether it still makes sense to follow it up with another tool call. - ${ functions?.find((fn) => fn.name === 'context') ? `The "context" tool is ALWAYS used after a user question. Even if it was used before, your job is to answer the last user question, even if the "context" tool was executed after that. Consider the tools you need to answer the user's question.` : '' } - - Rather than explaining how you would call a tool, just generate the JSON to call the tool. It will automatically be - executed and returned to you. - These results are generally not visible to the user. Treat them as if they are not, - unless specified otherwise. + DO NOT call a tool when it is not listed. + ONLY define input that is defined in the tool properties. + If a tool does not have properties, leave them out. + + It is EXTREMELY important that you generate valid JSON between the \`\`\`json and \`\`\` delimiters. You may call them like this. @@ -77,7 +69,8 @@ export function getSystemMessageInstructions({ ${TOOL_USE_START} \`\`\`json { - "name": "my_tool_without_parameters" + "name": "my_tool_without_parameters", + "input": {} } \`\`\`\ ${TOOL_USE_END} @@ -95,5 +88,5 @@ export function getSystemMessageInstructions({ `; } - return `No tools are available anymore. Ignore everything that was said about tools before. DO NOT UNDER ANY CIRCUMSTANCES call any tool, regardless of whether it was previously called.`; + return `No tools are available anymore. DO NOT UNDER ANY CIRCUMSTANCES call any tool, regardless of whether it was previously called.`; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts index db32eb581249c..49fc87b908112 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/parse_inline_function_calls.ts @@ -43,13 +43,15 @@ export function parseInlineFunctionCalls({ logger }: { logger: Logger }) { function parseFunctionCall(id: string, buffer: string) { logger.debug('Parsing function call:\n' + buffer); - const functionCallBody = buffer - .replace(TOOL_USE_START, '') - .replace(TOOL_USE_END, '') - .trim() - .replace(/^```(json?)/, '') - .replace(/```$/, '') - .trim(); + const match = buffer.match( + /<\|tool_use_start\|>\s*```json\n?(.*?)(\n```\s*).*<\|tool_use_end\|>/s + ); + + const functionCallBody = match?.[1]; + + if (!functionCallBody) { + throw createInternalServerError(`Invalid function call syntax`); + } const parsedFunctionCall = JSON.parse(functionCallBody) as { name?: string; @@ -109,11 +111,13 @@ export function parseInlineFunctionCalls({ logger }: { logger: Logger }) { if (functionCallBuffer.includes(TOOL_USE_END)) { const [beforeEndSignal, afterEndSignal] = functionCallBuffer.split(TOOL_USE_END); - parseFunctionCall(id, beforeEndSignal + TOOL_USE_END); - - functionCallBuffer = ''; - - next(afterEndSignal); + try { + parseFunctionCall(id, beforeEndSignal + TOOL_USE_END); + functionCallBuffer = ''; + next(afterEndSignal); + } catch (error) { + subscriber.error(error); + } } } else { functionCallBuffer = ''; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts index 0dfef2bb50643..a35e50d538bcb 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts @@ -33,6 +33,8 @@ type ChunkDelta = CreateChatCompletionResponseChunk['choices'][number]['delta']; type LlmSimulator = ReturnType; +const EXPECTED_STORED_SYSTEM_MESSAGE = `system\n\nWhat follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n\nYou MUST respond in the users preferred language which is: English.`; + const nextTick = () => { return new Promise(process.nextTick); }; @@ -120,6 +122,7 @@ describe('Observability AI Assistant client', () => { hasAction: jest.fn(), getActions: jest.fn(), validate: jest.fn(), + getInstructions: jest.fn(), } as any; let llmSimulator: LlmSimulator; @@ -156,6 +159,8 @@ describe('Observability AI Assistant client', () => { knowledgeBaseServiceMock.getInstructions.mockResolvedValue([]); + functionClientMock.getInstructions.mockReturnValue(['system']); + return new ObservabilityAIAssistantClient({ actionsClient: actionsClientMock, esClient: { @@ -342,8 +347,8 @@ describe('Observability AI Assistant client', () => { last_updated: expect.any(String), token_count: { completion: 2, - prompt: 100, - total: 102, + prompt: 156, + total: 158, }, }, type: StreamingChatResponseEventType.ConversationCreate, @@ -401,8 +406,8 @@ describe('Observability AI Assistant client', () => { last_updated: expect.any(String), token_count: { completion: 8, - prompt: 284, - total: 292, + prompt: 340, + total: 348, }, }, type: StreamingChatResponseEventType.ConversationCreate, @@ -419,8 +424,8 @@ describe('Observability AI Assistant client', () => { title: 'An auto-generated title', token_count: { completion: 8, - prompt: 284, - total: 292, + prompt: 340, + total: 348, }, }, labels: {}, @@ -434,8 +439,7 @@ describe('Observability AI Assistant client', () => { { '@timestamp': expect.any(String), message: { - content: - 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.', + content: EXPECTED_STORED_SYSTEM_MESSAGE, role: MessageRole.System, }, }, @@ -546,8 +550,8 @@ describe('Observability AI Assistant client', () => { last_updated: expect.any(String), token_count: { completion: 2, - prompt: 100, - total: 102, + prompt: 156, + total: 158, }, }, type: StreamingChatResponseEventType.ConversationUpdate, @@ -565,8 +569,8 @@ describe('Observability AI Assistant client', () => { title: 'My stored conversation', token_count: { completion: 2, - prompt: 100, - total: 102, + prompt: 156, + total: 158, }, }, labels: {}, @@ -580,8 +584,7 @@ describe('Observability AI Assistant client', () => { { '@timestamp': expect.any(String), message: { - content: - 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.', + content: EXPECTED_STORED_SYSTEM_MESSAGE, role: MessageRole.System, }, }, @@ -801,8 +804,7 @@ describe('Observability AI Assistant client', () => { '@timestamp': expect.any(String), message: { role: MessageRole.System, - content: - 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.', + content: EXPECTED_STORED_SYSTEM_MESSAGE, }, }, { @@ -934,8 +936,7 @@ describe('Observability AI Assistant client', () => { { '@timestamp': expect.any(String), message: { - content: - 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.', + content: EXPECTED_STORED_SYSTEM_MESSAGE, role: MessageRole.System, }, }, @@ -1307,7 +1308,7 @@ describe('Observability AI Assistant client', () => { async function requestAlertsFunctionCall() { const body = JSON.parse( (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body - ); + ) as OpenAI.ChatCompletionCreateParams; let nextLlmCallPromise: Promise; @@ -1326,7 +1327,7 @@ describe('Observability AI Assistant client', () => { await nextTick(); - for (let i = 0; i <= maxFunctionCalls; i++) { + for (let i = 0; i <= maxFunctionCalls + 1; i++) { await requestAlertsFunctionCall(); } @@ -1337,7 +1338,7 @@ describe('Observability AI Assistant client', () => { expect(functionClientMock.executeFunction).toHaveBeenCalledTimes(maxFunctionCalls); }); - it('does not give the LLM the choice to call a function anymore', () => { + it('asks the LLM to suggest next steps', () => { const firstBody = JSON.parse( (actionsClientMock.execute.mock.calls[0][0].params as any).subActionParams.body ); @@ -1345,7 +1346,7 @@ describe('Observability AI Assistant client', () => { (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body ); - expect(firstBody.tools.length).toBe(1); + expect(firstBody.tools.length).toEqual(1); expect(body.tools).toBeUndefined(); }); @@ -1546,7 +1547,7 @@ describe('Observability AI Assistant client', () => { await nextTick(); expect(chatSpy.mock.calls[0][1].messages[0].message.content).toEqual( - 'This is a system message\n\nYou MUST respond in the users preferred language which is: English.' + EXPECTED_STORED_SYSTEM_MESSAGE ); }); @@ -1576,7 +1577,7 @@ describe('Observability AI Assistant client', () => { await nextTick(); expect(chatSpy.mock.calls[0][1].messages[0].message.content).toEqual( - 'This is a system message\n\nYou MUST respond in the users preferred language which is: Orcish.' + EXPECTED_STORED_SYSTEM_MESSAGE.replace('English', 'Orcish') ); }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts index 0800cf816579a..e4cb53be99754 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts @@ -14,11 +14,12 @@ import apm from 'elastic-apm-node'; import { decode, encode } from 'gpt-tokenizer'; import { findLastIndex, last, merge, noop, omit, pick, take } from 'lodash'; import { - catchError, filter, + identity, isObservable, last as lastOperator, lastValueFrom, + map, Observable, shareReplay, tap, @@ -26,16 +27,12 @@ import { } from 'rxjs'; import { Readable } from 'stream'; import { v4 } from 'uuid'; -import { withTokenBudget } from '../../../common/utils/with_token_budget'; -import { extendSystemMessage } from '../../../common/utils/extend_system_message'; import { ObservabilityAIAssistantConnectorType } from '../../../common/connectors'; import { ChatCompletionChunkEvent, ChatCompletionErrorEvent, createConversationNotFoundError, - createFunctionLimitExceededError, createTokenLimitReachedError, - isFunctionNotFoundError, MessageAddEvent, StreamingChatResponseEventType, TokenCountEvent, @@ -65,12 +62,15 @@ import { RecalledEntry, } from '../knowledge_base_service'; import type { ChatFn, ObservabilityAIAssistantResourceNames } from '../types'; +import { catchFunctionLimitExceededError } from '../util/catch_function_limit_exceeded_error'; import { getAccessQuery } from '../util/get_access_query'; +import { getSystemMessageFromInstructions } from '../util/get_system_message_from_instructions'; import { rejectTokenCountEvents } from '../util/reject_token_count_events'; +import { replaceSystemMessage } from '../util/replace_system_message'; import { createBedrockClaudeAdapter } from './adapters/bedrock/bedrock_claude_adapter'; +import { failOnNonExistingFunctionCall } from './adapters/fail_on_non_existing_function_call'; import { createOpenAiAdapter } from './adapters/openai_adapter'; import { LlmApiAdapter } from './adapters/types'; -import { failOnNonExistingFunctionCall } from './adapters/fail_on_non_existing_function_call'; export class ObservabilityAIAssistantClient { constructor( @@ -172,21 +172,32 @@ export class ObservabilityAIAssistantClient { kibanaPublicUrl, simulateFunctionCalling, isPublic = false, + instructions: requestInstructions = [], } = params; const isConversationUpdate = persist && !!params.conversationId; const conversationId = persist ? params.conversationId || v4() : ''; const title = params.title || ''; const responseLanguage = params.responseLanguage || 'English'; - const requestInstructions = params.instructions || []; + + const registeredInstructions = functionClient.getInstructions(); + + const knowledgeBaseInstructions: UserInstruction[] = []; + + if (responseLanguage) { + requestInstructions.push( + `You MUST respond in the users preferred language which is: ${responseLanguage}.` + ); + } + + let storedSystemMessage: string = ''; // will be set as soon as kb instructions are loaded if (persist && !isConversationUpdate && kibanaPublicUrl) { - const systemMessage = messages.find( - (message) => message.message.role === MessageRole.System + registeredInstructions.push( + `This conversation will be persisted in Kibana and available at this url: ${ + kibanaPublicUrl + `/app/observabilityAIAssistant/conversations/${conversationId}` + }.` ); - systemMessage!.message.content += `This conversation will be persisted in Kibana and available at this url: ${ - kibanaPublicUrl + `/app/observabilityAIAssistant/conversations/${conversationId}` - }.`; } const tokenCountResult = { @@ -281,17 +292,24 @@ export class ObservabilityAIAssistantClient { return await next(nextMessages.concat(contextFunctionRequest)); } else if (isUserMessage) { - const functions = - numFunctionsCalled >= MAX_FUNCTION_CALLS ? [] : allFunctions.concat(allActions); + const functionCallsExceeded = numFunctionsCalled > MAX_FUNCTION_CALLS; + const functions = functionCallsExceeded ? [] : allFunctions.concat(allActions); const spanName = lastMessage.message.name && lastMessage.message.name !== 'context' ? 'function_response' : 'user_message'; + const systemMessageForChatRequest = getSystemMessageFromInstructions({ + registeredInstructions, + requestInstructions, + knowledgeBaseInstructions, + availableFunctionNames: functions.map((fn) => fn.name) || [], + }); + const response$ = ( await chatWithTokenCountIncrement(spanName, { - messages: nextMessages, + messages: replaceSystemMessage(systemMessageForChatRequest, nextMessages), connectorId, signal, functions, @@ -299,12 +317,7 @@ export class ObservabilityAIAssistantClient { ).pipe( emitWithConcatenatedMessage(), shareReplay(), - catchError((error) => { - if (isFunctionNotFoundError(error) && functions.length === 0) { - throw createFunctionLimitExceededError(); - } - throw error; - }) + Boolean(functions.length) ? identity : catchFunctionLimitExceededError() ); response$.subscribe({ @@ -319,6 +332,18 @@ export class ObservabilityAIAssistantClient { (event): event is MessageAddEvent => event.type === StreamingChatResponseEventType.MessageAdd ), + // LLMs like to hallucinate parameters if the function does not define + // them, and it can lead to other hallicunations down the line + map((messageEvent) => { + const fnName = messageEvent.message.message.function_call?.name; + + if (fnName && !functions.find((fn) => fn.name === fnName)?.parameters) { + const clone = { ...messageEvent }; + clone.message.message.function_call!.arguments = ''; + return clone; + } + return messageEvent; + }), toArray() ) ); @@ -379,7 +404,7 @@ export class ObservabilityAIAssistantClient { chat: chatWithTokenCountIncrement, connectorId, name: functionCallName, - messages: nextMessages, + messages: replaceSystemMessage(storedSystemMessage, nextMessages), args: lastMessage.message.function_call!.arguments, signal, }) @@ -513,7 +538,7 @@ export class ObservabilityAIAssistantClient { omit(conversation._source, 'messages'), // update messages - { messages: nextMessages }, + { messages: replaceSystemMessage(storedSystemMessage, nextMessages) }, // update token count { @@ -528,6 +553,7 @@ export class ObservabilityAIAssistantClient { } ) ); + subscriber.next({ type: StreamingChatResponseEventType.ConversationUpdate, conversation: updatedConversation.conversation, @@ -545,7 +571,7 @@ export class ObservabilityAIAssistantClient { token_count: tokenCountResult, id: conversationId, }, - messages: nextMessages, + messages: replaceSystemMessage(storedSystemMessage, nextMessages), labels: {}, numeric_labels: {}, public: isPublic, @@ -560,14 +586,18 @@ export class ObservabilityAIAssistantClient { subscriber.complete(); }; - this.resolveInstructions(requestInstructions) - .then((instructions) => { - return next( - extendSystemMessage(messages, [ - `You MUST respond in the users preferred language which is: ${responseLanguage}.`, - instructions, - ]) - ); + this.fetchKnowledgeBaseInstructions() + .then((loadedKnowledgeBaseInstructions) => { + knowledgeBaseInstructions.push(...loadedKnowledgeBaseInstructions); + + storedSystemMessage = getSystemMessageFromInstructions({ + registeredInstructions, + requestInstructions, + knowledgeBaseInstructions, + availableFunctionNames: allFunctions.map((fn) => fn.name), + }); + + return next(messages); }) .catch((error) => { if (!signal.aborted) { @@ -972,30 +1002,12 @@ export class ObservabilityAIAssistantClient { return this.dependencies.knowledgeBaseService.deleteEntry({ id }); }; - private resolveInstructions = async (requestInstructions: Array) => { + fetchKnowledgeBaseInstructions = async () => { const knowledgeBaseInstructions = await this.dependencies.knowledgeBaseService.getInstructions( this.dependencies.namespace, this.dependencies.user ); - if (requestInstructions.length + knowledgeBaseInstructions.length === 0) { - return ''; - } - - const priorityInstructions = requestInstructions.map((instruction) => - typeof instruction === 'string' ? { doc_id: v4(), text: instruction } : instruction - ); - const overrideIds = priorityInstructions.map((instruction) => instruction.doc_id); - const instructions = priorityInstructions.concat( - knowledgeBaseInstructions.filter((instruction) => !overrideIds.includes(instruction.doc_id)) - ); - - const instructionsWithinBudget = withTokenBudget(instructions, 1000); - - const instructionsPrompt = `What follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n`; - - return `${instructionsPrompt}${instructionsWithinBudget - .map((instruction) => instruction.text) - .join('\n\n')}`; + return knowledgeBaseInstructions; }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts index 90cc6f3693e41..241ecd1350c68 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts @@ -13,7 +13,11 @@ import type { FunctionDefinition, FunctionResponse, } from '../../common/functions/types'; -import type { Message, ObservabilityAIAssistantScreenContextRequest } from '../../common/types'; +import type { + Message, + ObservabilityAIAssistantScreenContextRequest, + UserInstructionOrPlainText, +} from '../../common/types'; import type { ObservabilityAIAssistantRouteHandlerResources } from '../routes/types'; import { ChatFunctionClient } from './chat_function_client'; import type { ObservabilityAIAssistantClient } from './client'; @@ -43,6 +47,18 @@ export interface FunctionHandler { respond: RespondFunction; } +export type RegisteredInstruction = UserInstructionOrPlainText | RegisterInstructionCallback; + +type RegisterInstructionCallback = ({ + availableFunctionNames, +}: { + availableFunctionNames: string[]; +}) => UserInstructionOrPlainText | UserInstructionOrPlainText[] | undefined; + +export type RegisterInstruction = ( + ...instructions: Array +) => void; + export type RegisterFunction = < TParameters extends CompatibleJSONSchema = any, TResponse extends FunctionResponse = any, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.ts new file mode 100644 index 0000000000000..25eecc7e7723e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/catch_function_limit_exceeded_error.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { catchError, filter, of, OperatorFunction, shareReplay, throwError } from 'rxjs'; +import { + ChatCompletionChunkEvent, + MessageAddEvent, + MessageRole, + StreamingChatResponseEventType, +} from '../../../common'; +import { isFunctionNotFoundError } from '../../../common/conversation_complete'; +import { emitWithConcatenatedMessage } from '../../../common/utils/emit_with_concatenated_message'; + +export function catchFunctionLimitExceededError(): OperatorFunction< + ChatCompletionChunkEvent | MessageAddEvent, + ChatCompletionChunkEvent | MessageAddEvent +> { + return (source$) => { + const shared$ = source$.pipe(shareReplay()); + const chunksWithoutErrors$ = shared$.pipe( + catchError(() => of()), + shareReplay() + ); + + return shared$.pipe( + catchError((error) => { + if (isFunctionNotFoundError(error)) { + const withInjectedErrorMessage$ = chunksWithoutErrors$.pipe( + filter( + (msg): msg is ChatCompletionChunkEvent => + msg.type === StreamingChatResponseEventType.ChatCompletionChunk + ), + emitWithConcatenatedMessage(async (concatenatedMessage) => { + return { + ...concatenatedMessage, + message: { + ...concatenatedMessage.message, + content: `${concatenatedMessage.message.content}\n\n${i18n.translate( + 'xpack.observabilityAiAssistant.functionCallLimitExceeded', + { + defaultMessage: + '\n\nNote: the Assistant tried to call a function, even though the limit was exceeded', + } + )}`, + function_call: { + name: '', + arguments: '', + trigger: MessageRole.Assistant, + }, + }, + }; + }) + ); + + return withInjectedErrorMessage$; + } + return throwError(() => error); + }) + ); + }; +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts new file mode 100644 index 0000000000000..9706871a63c62 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getSystemMessageFromInstructions } from './get_system_message_from_instructions'; + +describe('getSystemMessageFromInstructions', () => { + it('handles plain instructions', () => { + expect( + getSystemMessageFromInstructions({ + registeredInstructions: ['first', 'second'], + knowledgeBaseInstructions: [], + requestInstructions: [], + availableFunctionNames: [], + }) + ).toEqual(`first\n\nsecond`); + }); + + it('handles callbacks', () => { + expect( + getSystemMessageFromInstructions({ + registeredInstructions: [ + 'first', + ({ availableFunctionNames }) => { + return availableFunctionNames[0]; + }, + ], + knowledgeBaseInstructions: [], + requestInstructions: [], + availableFunctionNames: ['myFunction'], + }) + ).toEqual(`first\n\nmyFunction`); + }); + + it('overrides kb instructions with request instructions', () => { + expect( + getSystemMessageFromInstructions({ + registeredInstructions: ['first'], + knowledgeBaseInstructions: [{ doc_id: 'second', text: 'second_kb' }], + requestInstructions: [{ doc_id: 'second', text: 'second_request' }], + availableFunctionNames: [], + }) + ).toEqual( + `first\n\nWhat follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n\nsecond_request` + ); + }); + + it('includes kb instructions if there is no request instruction', () => { + expect( + getSystemMessageFromInstructions({ + registeredInstructions: ['first'], + knowledgeBaseInstructions: [{ doc_id: 'second', text: 'second_kb' }], + requestInstructions: [], + availableFunctionNames: [], + }) + ).toEqual( + `first\n\nWhat follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:\n\nsecond_kb` + ); + }); + + it('handles undefined values', () => { + expect( + getSystemMessageFromInstructions({ + registeredInstructions: [ + 'first', + ({ availableFunctionNames }) => { + return undefined; + }, + ], + knowledgeBaseInstructions: [], + requestInstructions: [], + availableFunctionNames: [], + }) + ).toEqual(`first`); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts new file mode 100644 index 0000000000000..4ea5aaecb67f9 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts @@ -0,0 +1,62 @@ +/* + * 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 { compact } from 'lodash'; +import { v4 } from 'uuid'; +import { UserInstruction } from '../../../common/types'; +import { withTokenBudget } from '../../../common/utils/with_token_budget'; +import { RegisteredInstruction } from '../types'; + +export function getSystemMessageFromInstructions({ + registeredInstructions, + knowledgeBaseInstructions, + requestInstructions, + availableFunctionNames, +}: { + registeredInstructions: RegisteredInstruction[]; + knowledgeBaseInstructions: UserInstruction[]; + requestInstructions: Array; + availableFunctionNames: string[]; +}): string { + const allRegisteredInstructions = compact( + registeredInstructions.flatMap((instruction) => { + if (typeof instruction === 'function') { + return instruction({ availableFunctionNames }); + } + return instruction; + }) + ); + + const requestInstructionsWithId = requestInstructions.map((instruction) => + typeof instruction === 'string' ? { doc_id: v4(), text: instruction } : instruction + ); + + const requestOverrideIds = requestInstructionsWithId.map((instruction) => instruction.doc_id); + + // all request instructions, and those from the KB that are not defined as a request instruction + const allUserInstructions = requestInstructionsWithId.concat( + knowledgeBaseInstructions.filter( + (instruction) => !requestOverrideIds.includes(instruction.doc_id) + ) + ); + + const instructionsWithinBudget = withTokenBudget(allUserInstructions, 1000); + + return [ + ...allRegisteredInstructions, + ...(instructionsWithinBudget.length + ? [ + `What follows is a set of instructions provided by the user, please abide by them as long as they don't conflict with anything you've been told so far:`, + ...instructionsWithinBudget, + ] + : []), + ] + .map((instruction) => { + return typeof instruction === 'string' ? instruction : instruction.text; + }) + .join('\n\n'); +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts new file mode 100644 index 0000000000000..c8c3b251c53e5 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/replace_system_message.ts @@ -0,0 +1,21 @@ +/* + * 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 { Message, MessageRole } from '../../../common'; + +export function replaceSystemMessage(systemMessage: string, messages: Message[]): Message[] { + return [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: systemMessage, + }, + }, + ...messages.filter((msg) => msg.message.role !== MessageRole.System), + ]; +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx index a6768198441da..b556617726fef 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.stories.tsx @@ -7,12 +7,10 @@ import { ComponentMeta, ComponentStoryObj } from '@storybook/react'; import React from 'react'; -import { - getAssistantSystemMessage, - MessageRole, -} from '@kbn/observability-ai-assistant-plugin/public'; +import { MessageRole } from '@kbn/observability-ai-assistant-plugin/public'; import { KibanaReactStorybookDecorator } from '../../utils/storybook_decorator'; import { ChatBody as Component } from './chat_body'; +import { buildSystemMessage } from '../../utils/builders'; const meta: ComponentMeta = { component: Component, @@ -25,7 +23,7 @@ const defaultProps: ComponentStoryObj = { args: { initialTitle: 'My Conversation', initialMessages: [ - getAssistantSystemMessage({ contexts: [] }), + buildSystemMessage(), { '@timestamp': new Date().toISOString(), message: { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx index 827c15ed44be2..edae806698662 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_flyout.stories.tsx @@ -7,7 +7,7 @@ import { ComponentStory } from '@storybook/react'; import React from 'react'; -import { getAssistantSystemMessage } from '@kbn/observability-ai-assistant-plugin/public'; +import { buildSystemMessage } from '../../utils/builders'; import { KibanaReactStorybookDecorator } from '../../utils/storybook_decorator'; import { ChatFlyout as Component } from './chat_flyout'; @@ -30,7 +30,7 @@ const Template: ComponentStory = (props: ChatFlyoutProps) => { const defaultProps: ChatFlyoutProps = { isOpen: true, initialTitle: 'How is this working', - initialMessages: [getAssistantSystemMessage({ contexts: [] })], + initialMessages: [buildSystemMessage()], onClose: () => {}, }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts index 57bdf17bd9a73..c92915897baf0 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/builders.ts @@ -12,7 +12,6 @@ import { type Message, MessageRole, } from '@kbn/observability-ai-assistant-plugin/common'; -import { getAssistantSystemMessage } from '@kbn/observability-ai-assistant-plugin/public'; type BuildMessageProps = DeepPartial & { message: { @@ -104,7 +103,7 @@ export function buildFunctionResponseMessage( ); } -export function buildConversation(params?: Partial) { +export function buildConversation(params?: Partial): Conversation { return { '@timestamp': '', user: { @@ -115,10 +114,11 @@ export function buildConversation(params?: Partial) { title: '', last_updated: '', }, - messages: [getAssistantSystemMessage({ contexts: [] })], + messages: [buildSystemMessage()], labels: {}, numeric_labels: {}, namespace: '', + public: false, ...params, }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts index 07fde4462abb6..460722c49be64 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/create_mock_chat_service.ts @@ -6,7 +6,10 @@ */ import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; -import type { ObservabilityAIAssistantChatService } from '@kbn/observability-ai-assistant-plugin/public'; +import { + MessageRole, + ObservabilityAIAssistantChatService, +} from '@kbn/observability-ai-assistant-plugin/public'; type MockedChatService = DeeplyMockedKeys; @@ -15,11 +18,17 @@ export const createMockChatService = (): MockedChatService => { chat: jest.fn(), complete: jest.fn(), sendAnalyticsEvent: jest.fn(), - getContexts: jest.fn().mockReturnValue([{ name: 'core', description: '' }]), getFunctions: jest.fn().mockReturnValue([]), hasFunction: jest.fn().mockReturnValue(false), hasRenderFunction: jest.fn().mockReturnValue(true), renderFunction: jest.fn(), + getSystemMessage: jest.fn().mockReturnValue({ + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: '', + }, + }), }; return mockChatService; }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts index f287c26e6cd83..7b62ca4f5a6d2 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts @@ -47,7 +47,6 @@ export function registerAlertsFunction({ functions.registerFunction( { name: 'alerts', - contexts: ['core'], description: 'Get alerts for Observability. Display the response in tabular format if appropriate.', descriptionForUser: 'Get alerts for Observability', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts index c86fe66a4c6e2..89ebfa90cb774 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts @@ -28,7 +28,6 @@ export function registerChangesFunction({ { name: 'changes', description: 'Returns change points like spikes and dips for logs and metrics.', - contexts: ['core'], parameters: changesFunctionParameters, }, async ({ diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts index e9490a725a640..dd21e8d082eb9 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.test.ts @@ -108,5 +108,24 @@ describe('correctCommonEsqlMistakes', () => { | WHERE statement LIKE "SELECT%" | STATS avg_duration = AVG(duration)` ); + + expectQuery( + `FROM metrics-apm* + | WHERE metricset.name == "service_destination" AND @timestamp > NOW() - 24 hours + | EVAL total_events = span.destination.service.response_time.count + | EVAL total_latency = span.destination.service.response_time.sum.us + | EVAL is_failure = CASE(event.outcome == "failure", 1, 0) + | STATS + avg_throughput = AVG(total_events), + avg_latency_per_request = AVG(total_latency / total_events), + failure_rate = AVG(is_failure) + BY span.destination.service.resource`, + `FROM metrics-apm* + | WHERE metricset.name == "service_destination" AND @timestamp > NOW() - 24 hours + | EVAL total_events = span.destination.service.response_time.count + | EVAL total_latency = span.destination.service.response_time.sum.us + | EVAL is_failure = CASE(event.outcome == "failure", 1, 0) + | STATS avg_throughput = AVG(total_events), avg_latency_per_request = AVG(total_latency / total_events), failure_rate = AVG(is_failure) BY span.destination.service.resource` + ); }); }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts index 8b3f18359ce09..01d6e67fe217a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_common_esql_mistakes.ts @@ -104,7 +104,7 @@ function isValidColumnName(column: string) { } function escapeColumns(line: string) { - const [, command, body] = line.match(/^([A-Za-z_]+)(.*)$/) ?? ['', '', '']; + const [, command, body] = line.match(/^([A-Za-z_]+)(.*)$/s) ?? ['', '', '']; const escapedBody = split(body.trim(), ',') .map((statement) => { @@ -198,7 +198,7 @@ function escapeExpressionsInSort(sortCommand: string) { export function correctCommonEsqlMistakes(content: string, log: Logger) { return content.replaceAll(/```esql\n(.*?)\n```/gms, (_, query: string) => { - const commands = splitIntoCommands(query); + const commands = splitIntoCommands(query.trim()); const formattedCommands: string[] = commands.map(({ name, command }, index) => { let formattedCommand = command; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts index 213b7e967970a..15b050c3a3897 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/correct_query_with_actions.ts @@ -22,6 +22,7 @@ const fixedQueryByOneAction = async (queryString: string) => { const correctText = firstAction.edits[0].text; const problematicString = queryString.substring(range.startColumn - 1, range.endColumn - 1); const fixedQuery = queryString.replace(problematicString, correctText); + return { query: fixedQuery, shouldRunAgain: Boolean(actions.length), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts index 7c33b119340aa..2cf8600d9db2f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts @@ -23,9 +23,10 @@ import { } from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks'; import { emitWithConcatenatedMessage } from '@kbn/observability-ai-assistant-plugin/common/utils/emit_with_concatenated_message'; import { createFunctionResponseMessage } from '@kbn/observability-ai-assistant-plugin/common/utils/create_function_response_message'; +import { ESQLSearchReponse } from '@kbn/es-types'; import type { FunctionRegistrationParameters } from '..'; import { correctCommonEsqlMistakes } from './correct_common_esql_mistakes'; -import { correctQueryWithActions } from './correct_query_with_actions'; +import { validateEsqlQuery } from './validate_esql_query'; const readFile = promisify(Fs.readFile); const readdir = promisify(Fs.readdir); @@ -68,15 +69,30 @@ const loadEsqlDocs = once(async () => { ); }); -export function registerQueryFunction({ - client, - functions, - resources, -}: FunctionRegistrationParameters) { +export function registerQueryFunction({ functions, resources }: FunctionRegistrationParameters) { + functions.registerInstruction(({ availableFunctionNames }) => + availableFunctionNames.includes('query') + ? `You MUST use the "query" function when the user wants to: + - visualize data + - run any arbitrary query + - breakdown or filter ES|QL queries that are displayed on the current page + - convert queries from another language to ES|QL + - asks general questions about ES|QL + + DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself. + DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "query" function for this. + + Even if the "context" function was used before that, follow it up with the "query" function. If a query fails, do not attempt to correct it yourself. Again you should call the "query" function, + even if it has been called before. + + When the "visualize_query" function has been called, a visualization has been displayed to the user. DO NOT UNDER ANY CIRCUMSTANCES follow up a "visualize_query" function call with your own visualization attempt. + If the "execute_query" function has been called, summarize these results for the user. The user does not see a visualization in this case.` + : undefined + ); + functions.registerFunction( { name: 'execute_query', - contexts: ['core'], visibility: FunctionVisibility.UserOnly, description: 'Display the results of an ES|QL query. ONLY use this if the "query" function has been used before or if the user or screen context has provided a query you can use.', @@ -91,25 +107,39 @@ export function registerQueryFunction({ } as const, }, async ({ arguments: { query } }) => { - const response = await ( - await resources.context.core - ).elasticsearch.client.asCurrentUser.transport.request({ + const client = (await resources.context.core).elasticsearch.client.asCurrentUser; + const { error, errorMessages } = await validateEsqlQuery({ + query, + client, + }); + + if (!!error) { + return { + content: { + message: 'The query failed to execute', + error, + errorMessages, + }, + }; + } + const response = (await client.transport.request({ method: 'POST', path: '_query', body: { query, version: ESQL_LATEST_VERSION, }, - }); + })) as ESQLSearchReponse; - return { content: response }; + return { + content: response, + }; } ); functions.registerFunction( { name: 'query', - contexts: ['core'], - description: `This function generates, executes and/or visualizes a query based on the user's request. It also explains how ES|QL works and how to convert queries from one language to another. Make sure you call one of the get_dataset functions first if you need index or field names. This function takes no arguments.`, + description: `This function generates, executes and/or visualizes a query based on the user's request. It also explains how ES|QL works and how to convert queries from one language to another. Make sure you call one of the get_dataset functions first if you need index or field names. This function takes no input.`, visibility: FunctionVisibility.AssistantOnly, }, async ({ messages, connectorId, chat }, signal) => { @@ -140,10 +170,16 @@ export function registerQueryFunction({ Extract data? Request \`DISSECT\` AND \`GROK\`. Convert a column based on a set of conditionals? Request \`EVAL\` and \`CASE\`. + ONLY use ${VisualizeESQLUserIntention.executeAndReturnResults} if you are absolutely sure + it is executable. If one of the get_dataset_info functions were not called before, OR if + one of the get_dataset_info functions returned no data, opt for an explanation only and + mention that there is no data for these indices. You can still use + ${VisualizeESQLUserIntention.generateQueryOnly} and generate an example ES|QL query. + For determining the intention of the user, the following options are available: ${VisualizeESQLUserIntention.generateQueryOnly}: the user only wants to generate the query, - but not run it. + but not run it, or they ask a general question about ES|QL. ${VisualizeESQLUserIntention.executeAndReturnResults}: the user wants to execute the query, and have the assistant return/analyze/summarize the results. they don't need a @@ -356,10 +392,9 @@ export function registerQueryFunction({ if (msg.message.function_call.name) { return msg; } - let esqlQuery = correctCommonEsqlMistakes(msg.message.content, resources.logger).match( - /```esql([\s\S]*?)```/ - )?.[1]; - esqlQuery = await correctQueryWithActions(esqlQuery ?? ''); + const esqlQuery = correctCommonEsqlMistakes(msg.message.content, resources.logger) + .match(/```esql([\s\S]*?)```/)?.[1] + ?.trim(); let functionCall: ConcatenatedMessage['message']['function_call'] | undefined; @@ -401,6 +436,7 @@ export function registerQueryFunction({ name: 'query', content: {}, data: { + // add the included docs for debugging documentation: { intention: args.intention, keywords, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts new file mode 100644 index 0000000000000..dafba4352634e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { validateQuery } from '@kbn/esql-validation-autocomplete'; +import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import type { ElasticsearchClient } from '@kbn/core/server'; +import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; +import { ESQLSearchReponse } from '@kbn/es-types'; +import { esFieldTypeToKibanaFieldType, type KBN_FIELD_TYPES } from '@kbn/field-types'; + +export async function validateEsqlQuery({ + query, + client, +}: { + query: string; + client: ElasticsearchClient; +}): Promise<{ + columns?: Array<{ + id: string; + name: string; + meta: { + type: KBN_FIELD_TYPES; + }; + }>; + error?: Error; + errorMessages?: string[]; +}> { + const { errors } = await validateQuery(query, getAstAndSyntaxErrors, { + // setting this to true, we don't want to validate the index / fields existence + ignoreOnMissingCallbacks: true, + }); + + const errorMessages = errors?.map((error) => { + return 'text' in error ? error.text : error.message; + }); + + // With limit 0 I get only the columns, it is much more performant + const performantQuery = `${query} | limit 0`; + + return client.transport + .request({ + method: 'POST', + path: '_query', + body: { + query: performantQuery, + version: ESQL_LATEST_VERSION, + }, + }) + .then((res) => { + const esqlResponse = res as ESQLSearchReponse; + + const columns = + esqlResponse.columns?.map(({ name, type }) => ({ + id: name, + name, + meta: { type: esFieldTypeToKibanaFieldType(type) }, + })) ?? []; + + return { columns }; + }) + .catch((error) => { + return { + error, + errorMessages, + }; + }); +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts index e8b2320b917c1..1a7d64c0d324f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts @@ -4,14 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; -import type { ESQLSearchReponse } from '@kbn/es-types'; -import { validateQuery } from '@kbn/esql-validation-autocomplete'; -import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { VisualizeESQLUserIntention } from '@kbn/observability-ai-assistant-plugin/common/functions/visualize_esql'; import { visualizeESQLFunction } from '../../common/functions/visualize_esql'; import { FunctionRegistrationParameters } from '.'; +import { validateEsqlQuery } from './query/validate_esql_query'; const getMessageForLLM = ( intention: VisualizeESQLUserIntention, @@ -34,37 +30,12 @@ export function registerVisualizeESQLFunction({ functions.registerFunction( visualizeESQLFunction, async ({ arguments: { query, intention }, connectorId, messages }, signal) => { - // recomputing the errors here as the user might click the Visualize query button - // and call the function manually. - const { errors } = await validateQuery(query, getAstAndSyntaxErrors, { - // setting this to true, we don't want to validate the index / fields existence - ignoreOnMissingCallbacks: true, + const { columns, errorMessages } = await validateEsqlQuery({ + query, + client: (await resources.context.core).elasticsearch.client.asCurrentUser, }); - const errorMessages = errors?.map((error) => { - return 'text' in error ? error.text : error.message; - }); - // With limit 0 I get only the columns, it is much more performant - const performantQuery = `${query} | limit 0`; - const coreContext = await resources.context.core; - - const response = (await ( - await coreContext - ).elasticsearch.client.asCurrentUser.transport.request({ - method: 'POST', - path: '_query', - body: { - query: performantQuery, - version: ESQL_LATEST_VERSION, - }, - })) as ESQLSearchReponse; - const columns = - response.columns?.map(({ name, type }) => ({ - id: name, - name, - meta: { type: esFieldTypeToKibanaFieldType(type) }, - })) ?? []; - const message = getMessageForLLM(intention, query, Boolean(errorMessages.length)); + const message = getMessageForLLM(intention, query, Boolean(errorMessages?.length)); return { data: { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts index 7990f353062da..190ce8c9ef95c 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.test.ts @@ -82,7 +82,8 @@ describe('observabilityAIAssistant rule_connector', () => { service: { getClient: async () => ({ complete: completeMock }), getFunctionClient: async () => ({ - getContexts: () => [{ name: 'core', description: 'my_system_message' }], + getFunctions: () => [], + getInstructions: () => [], }), }, context: { @@ -119,6 +120,7 @@ describe('observabilityAIAssistant rule_connector', () => { expect(result).toEqual({ actionId: 'observability-ai-assistant', status: 'ok' }); expect(initResources).toHaveBeenCalledTimes(1); expect(completeMock).toHaveBeenCalledTimes(1); + expect(completeMock).toHaveBeenCalledWith( expect.objectContaining({ persist: true, @@ -130,7 +132,7 @@ describe('observabilityAIAssistant rule_connector', () => { '@timestamp': expect.any(String), message: { role: MessageRole.System, - content: 'my_system_message', + content: '', }, }, { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts index 567c326945ef8..b46fec93d1dd1 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts @@ -32,6 +32,7 @@ import { } from '@kbn/observability-ai-assistant-plugin/common'; import { concatenateChatCompletionChunks } from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks'; import { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types'; +import { getSystemMessageFromInstructions } from '@kbn/observability-ai-assistant-plugin/server/service/util/get_system_message_from_instructions'; import { convertSchemaToOpenApi } from './convert_schema_to_open_api'; import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector'; @@ -171,9 +172,6 @@ async function executor( }); }); - const systemMessage = functionClient - .getContexts() - .find((def) => def.name === 'core')?.description; const backgroundInstruction = getBackgroundProcessInstruction( execOptions.params.rule, execOptions.params.alerts @@ -193,7 +191,12 @@ async function executor( '@timestamp': new Date().toISOString(), message: { role: MessageRole.System, - content: systemMessage, + content: getSystemMessageFromInstructions({ + availableFunctionNames: functionClient.getFunctions().map((fn) => fn.definition.name), + registeredInstructions: functionClient.getInstructions(), + knowledgeBaseInstructions: [], + requestInstructions: [], + }), }, }, { From 9d5abba33898de51b41d3b9397db05e66b13f16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Wed, 24 Apr 2024 11:35:36 +0200 Subject: [PATCH 11/82] [Search] Move Attach Index to top (#181446) ## Summary https://github.com/elastic/kibana/assets/1410658/de571e71-88c1-4576-94ee-55763ba8af98 Screenshot 2024-04-23 at 16 27 52 ### 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) --- .../connector_configuration.tsx | 533 +++++++++--------- .../native_connector_configuration.tsx | 191 ++++--- 2 files changed, 350 insertions(+), 374 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx index 09814ebab8b7c..3f05c4d305110 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx @@ -96,307 +96,278 @@ export const ConnectorConfiguration: React.FC = () => { - - ) : ( - i18n.translate( - 'xpack.enterpriseSearch.content.connectorDetail.configuration.apiKey.noApiKeyLabel', - { - defaultMessage: - 'Before you can generate an API key, you need to attach an index. Scroll to the bottom of this page for instructions.', - } - ) - ), - status: hasApiKey ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.generateApiKey.title', + { + <> + + + + } + {connector.index_name && ( + <> + + - - - - {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.configurationFileLink', - { defaultMessage: 'example config file' } - )} - - ), - }} - /> - - - - {getConnectorTemplate({ - apiKeyData, - connectorData: { - id: connector.id, - service_type: connector.service_type, - }, - host: cloudContext.elasticsearchUrl, - })} - - - - - {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.deploymentModeLink', - { defaultMessage: 'documentation' } - )} - - ), - }} + children: ( + - - - ), - status: - !connector.status || connector.status === ConnectorStatus.CREATED - ? 'incomplete' - : 'complete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.deployConnector.title', + ), + status: hasApiKey ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.generateApiKey.title', + { + defaultMessage: 'Generate an API key', + } + ), + titleSize: 'xs', + }, { - defaultMessage: 'Set up and deploy connector', - } - ), - titleSize: 'xs', - }, - { - children: ( - - updateConnectorConfiguration({ - configuration, - connectorId: connector.id, - }) - } - subscriptionLink={docLinks.licenseManagement} - stackManagementLink={http.basePath.prepend( - '/app/management/stack/license_management' - )} - > - {!connector.status || connector.status === ConnectorStatus.CREATED ? ( - - {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnectorText', - { - defaultMessage: - 'Your connector has not connected to Search. Troubleshoot your configuration and refresh the page.', - } - )} - - fetchConnector({ connectorId: connector.id })} - isLoading={isLoading} - > - {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnector.button.label', - { - defaultMessage: 'Recheck now', - } - )} - - - ) : ( - - )} - - {connector.status && hasAdvancedFilteringFeature && !!advancedSnippet && ( - + + + + {i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.configurationFileLink', + { defaultMessage: 'example config file' } + )} + + ), + }} + /> + + + + {getConnectorTemplate({ + apiKeyData, + connectorData: { + id: connector.id, + service_type: connector.service_type, + }, + host: cloudContext.elasticsearchUrl, + })} + + + + + {i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.deploymentModeLink', + { defaultMessage: 'documentation' } + )} + + ), + }} + /> + + + ), + status: + !connector.status || connector.status === ConnectorStatus.CREATED + ? 'incomplete' + : 'complete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.deployConnector.title', + { + defaultMessage: 'Set up and deploy connector', + } + ), + titleSize: 'xs', + }, + { + children: ( + + updateConnectorConfiguration({ + configuration, + connectorId: connector.id, + }) + } + subscriptionLink={docLinks.licenseManagement} + stackManagementLink={http.basePath.prepend( + '/app/management/stack/license_management' )} - iconType="iInCircle" - color="warning" > - - {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.advancedSyncRulesDocs', - { defaultMessage: 'Advanced Sync Rules' } - )} - - ), - }} - /> - - )} - - ), - status: - connector.status === ConnectorStatus.CONNECTED ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.enhance.title', - { - defaultMessage: 'Configure your connector', - } - ), - titleSize: 'xs', - }, - { - children: ( - - {!connector.index_name && ( - - - - + {!connector.status || connector.status === ConnectorStatus.CREATED ? ( + {i18n.translate( - 'xpack.enterpriseSearch.content.connectors.configuration.connectorNoIndexCallOut.description', + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnectorText', { defaultMessage: - "You won't be able to start syncing content until your connector is attached to an index.", + 'Your connector has not connected to Search. Troubleshoot your configuration and refresh the page.', } )} - - - - - )} - - - {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.scheduleSync.description', - { - defaultMessage: - 'Finalize your connector by triggering a one-time sync, or setting a recurring sync to keep your data source in sync over time', - } + + fetchConnector({ connectorId: connector.id })} + isLoading={isLoading} + > + {i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.waitingForConnector.button.label', + { + defaultMessage: 'Recheck now', + } + )} + + + ) : ( + )} - - - - - - + {connector.status && hasAdvancedFilteringFeature && !!advancedSnippet && ( + + + {i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.connectorPackage.advancedSyncRulesDocs', + { defaultMessage: 'Advanced Sync Rules' } + )} + + ), + }} + /> + + )} + + ), + status: + connector.status === ConnectorStatus.CONNECTED ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.enhance.title', + { + defaultMessage: 'Configure your connector', + } + ), + titleSize: 'xs', + }, + { + children: ( + + + {i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.button.label', + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.scheduleSync.description', { - defaultMessage: 'Set schedule and sync', + defaultMessage: + 'Finalize your connector by triggering a one-time sync, or setting a recurring sync to keep your data source in sync over time', } )} - + - - + + + + + {i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.button.label', + { + defaultMessage: 'Set schedule and sync', + } + )} + + + + + + - - - ), - status: connector.scheduling.full.enabled ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.title', - { - defaultMessage: 'Sync your data', - } - ), - titleSize: 'xs', - }, - ]} - /> + ), + status: connector.scheduling.full.enabled ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.steps.schedule.title', + { + defaultMessage: 'Sync your data', + } + ), + titleSize: 'xs', + }, + ]} + /> + + )} - { - <> - - - - } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx index cc89fc84c2432..4660ad75fe905 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx @@ -142,106 +142,111 @@ export const NativeConnectorConfiguration: React.FC = () => { )} - , - status: hasResearched ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.researchConfigurationTitle', + { + <> + + + + } + {connector.index_name && ( + <> + + - ), - status: hasConfigured ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.configurationTitle', + children: , + status: hasResearched ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.researchConfigurationTitle', + { + defaultMessage: 'Research configuration requirements', + } + ), + titleSize: 'xs', + }, { - defaultMessage: 'Configuration', - } - ), - titleSize: 'xs', - }, - { - children: ( - - ), - status: hasApiKey ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.manageApiKeyTitle', + children: ( + + ), + status: hasConfigured ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.configurationTitle', + { + defaultMessage: 'Configuration', + } + ), + titleSize: 'xs', + }, { - defaultMessage: 'Manage API key', - } - ), - titleSize: 'xs', - }, - { - children: ( - - - - - - - - - - - {i18n.translate( - 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnectorAdvancedConfiguration.schedulingButtonLabel', - { - defaultMessage: 'Set schedule and sync', - } - )} - + children: ( + + ), + status: hasApiKey ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.manageApiKeyTitle', + { + defaultMessage: 'Manage API key', + } + ), + titleSize: 'xs', + }, + { + children: ( + + + + + - - + + + + + {i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnectorAdvancedConfiguration.schedulingButtonLabel', + { + defaultMessage: 'Set schedule and sync', + } + )} + + + + + + - - - ), - status: hasConfiguredAdvanced ? 'complete' : 'incomplete', - title: i18n.translate( - 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.advancedConfigurationTitle', - { - defaultMessage: 'Sync your data', - } - ), - titleSize: 'xs', - }, - ]} - /> + ), + status: hasConfiguredAdvanced ? 'complete' : 'incomplete', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.steps.advancedConfigurationTitle', + { + defaultMessage: 'Sync your data', + } + ), + titleSize: 'xs', + }, + ]} + /> + + )} - { - <> - - - - } From 42e6f0cd73f9d80944136925f844757a0d775dc2 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Wed, 24 Apr 2024 10:41:21 +0100 Subject: [PATCH 12/82] [SecuritySolution] Add "exist filter" when value count is filtered in Lens cell action (#181151) ## Summary Original issue and steps to reproduce: https://github.com/elastic/kibana/issues/181120 Before: https://github.com/elastic/kibana/assets/6295984/10c7a2ce-d814-4750-8481-8f05b55384f8 After: https://github.com/elastic/kibana/assets/6295984/00dfbcb6-244b-4f2b-8dd4-a1f7435385cf ### 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 --------- Co-authored-by: Sergi Massaneda --- .../src/actions/filter/add_filter.ts | 41 ++++ .../src/actions/filter/create_filter.ts | 5 +- .../src/actions/filter/filter_in.ts | 6 +- .../src/actions/filter/filter_out.ts | 7 +- .../src/actions/filter/index.ts | 1 + packages/kbn-cell-actions/src/index.ts | 1 + .../actions/filter/lens/create_action.test.ts | 190 ++++++++++++++++++ .../actions/filter/lens/create_action.ts | 40 +++- 8 files changed, 270 insertions(+), 21 deletions(-) create mode 100644 packages/kbn-cell-actions/src/actions/filter/add_filter.ts create mode 100644 x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts diff --git a/packages/kbn-cell-actions/src/actions/filter/add_filter.ts b/packages/kbn-cell-actions/src/actions/filter/add_filter.ts new file mode 100644 index 0000000000000..484a2bd9792cb --- /dev/null +++ b/packages/kbn-cell-actions/src/actions/filter/add_filter.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { FilterManager } from '@kbn/data-plugin/public'; +import type { DefaultActionsSupportedValue } from '../types'; +import { createExistsFilter, createFilter } from './create_filter'; + +interface AddFilterParams { + filterManager: FilterManager; + key: string; + value: DefaultActionsSupportedValue; + negate: boolean; + dataViewId?: string; +} + +export const addFilter = ({ filterManager, key, value, negate, dataViewId }: AddFilterParams) => { + filterManager.addFilters(createFilter({ key, value, negate, dataViewId })); +}; + +interface AddExistsFilterParams { + filterManager: FilterManager; + key: string; + negate: boolean; + dataViewId?: string; +} +export const addExistsFilter = ({ + filterManager, + key, + negate, + dataViewId, +}: AddExistsFilterParams) => { + filterManager.addFilters(createExistsFilter({ key, negate, dataViewId })); +}; + +export const isEmptyFilterValue = (value: Array) => + value.length === 0 || value.every((v) => v === ''); diff --git a/packages/kbn-cell-actions/src/actions/filter/create_filter.ts b/packages/kbn-cell-actions/src/actions/filter/create_filter.ts index fe10ab7df43d6..a34786ebb693a 100644 --- a/packages/kbn-cell-actions/src/actions/filter/create_filter.ts +++ b/packages/kbn-cell-actions/src/actions/filter/create_filter.ts @@ -15,10 +15,7 @@ import { } from '@kbn/es-query'; import { DefaultActionsSupportedValue } from '../types'; -export const isEmptyFilterValue = (value: Array) => - value.length === 0 || value.every((v) => v === ''); - -const createExistsFilter = ({ +export const createExistsFilter = ({ key, negate, dataViewId, diff --git a/packages/kbn-cell-actions/src/actions/filter/filter_in.ts b/packages/kbn-cell-actions/src/actions/filter/filter_in.ts index 8dd4487bfd944..9e88b97208ba7 100644 --- a/packages/kbn-cell-actions/src/actions/filter/filter_in.ts +++ b/packages/kbn-cell-actions/src/actions/filter/filter_in.ts @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { FilterManager, KBN_FIELD_TYPES } from '@kbn/data-plugin/public'; import { NotificationsStart } from '@kbn/core-notifications-browser'; -import { createFilter, isEmptyFilterValue } from './create_filter'; +import { addFilter, isEmptyFilterValue } from './add_filter'; import { FILTER_CELL_ACTION_TYPE } from '../../constants'; import { createCellActionFactory } from '../factory'; import { @@ -77,12 +77,12 @@ export const addFilterIn = ({ dataViewId?: string; }) => { if (filterManager != null) { - const filter = createFilter({ + addFilter({ + filterManager, key: fieldName, value, negate: isEmptyFilterValue(value), dataViewId, }); - filterManager.addFilters(filter); } }; diff --git a/packages/kbn-cell-actions/src/actions/filter/filter_out.ts b/packages/kbn-cell-actions/src/actions/filter/filter_out.ts index e20d7c267b910..56cea2541143e 100644 --- a/packages/kbn-cell-actions/src/actions/filter/filter_out.ts +++ b/packages/kbn-cell-actions/src/actions/filter/filter_out.ts @@ -8,7 +8,8 @@ import { i18n } from '@kbn/i18n'; import type { FilterManager, KBN_FIELD_TYPES } from '@kbn/data-plugin/public'; import { NotificationsStart } from '@kbn/core-notifications-browser'; -import { createFilter, isEmptyFilterValue } from './create_filter'; +import { addFilter, isEmptyFilterValue } from './add_filter'; + import { FILTER_CELL_ACTION_TYPE } from '../../constants'; import { createCellActionFactory } from '../factory'; import { @@ -81,12 +82,12 @@ export const addFilterOut = ({ dataViewId?: string; }) => { if (filterManager != null) { - const filter = createFilter({ + addFilter({ + filterManager, key: fieldName, value, negate: !isEmptyFilterValue(value), dataViewId, }); - filterManager.addFilters(filter); } }; diff --git a/packages/kbn-cell-actions/src/actions/filter/index.ts b/packages/kbn-cell-actions/src/actions/filter/index.ts index 19a32c05db6cb..61908d4700dce 100644 --- a/packages/kbn-cell-actions/src/actions/filter/index.ts +++ b/packages/kbn-cell-actions/src/actions/filter/index.ts @@ -8,3 +8,4 @@ export { createFilterInActionFactory, addFilterIn } from './filter_in'; export { createFilterOutActionFactory, addFilterOut } from './filter_out'; +export { addExistsFilter } from './add_filter'; diff --git a/packages/kbn-cell-actions/src/index.ts b/packages/kbn-cell-actions/src/index.ts index 4e478baec441f..4b7dde4cdcaf1 100644 --- a/packages/kbn-cell-actions/src/index.ts +++ b/packages/kbn-cell-actions/src/index.ts @@ -34,6 +34,7 @@ export { createFilterOutActionFactory, addFilterIn, addFilterOut, + addExistsFilter, } from './actions/filter'; // Action factory diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts new file mode 100644 index 0000000000000..1efbbc9960146 --- /dev/null +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts @@ -0,0 +1,190 @@ +/* + * 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 { addExistsFilter, addFilterIn, addFilterOut } from '@kbn/cell-actions'; +import { of } from 'rxjs'; +import type { CellValueContext } from '@kbn/embeddable-plugin/public'; +import type { CreateFilterLensActionParams } from './create_action'; +import { createFilterLensAction } from './create_action'; +import type { Trigger } from '@kbn/ui-actions-plugin/public'; + +jest.mock('@kbn/cell-actions', () => ({ + addFilterIn: jest.fn(), + addFilterOut: jest.fn(), + addExistsFilter: jest.fn(), +})); + +jest.mock('../../../timelines/store', () => ({ + timelineSelectors: { + getTimelineByIdSelector: jest.fn().mockReturnValue(() => ({})), + }, +})); + +describe('createFilterLensAction', () => { + const mockServices = { + timelineFilterManager: 'mockTimelineFilterManager', + data: { query: { filterManager: 'mockFilterManager' } }, + application: { currentAppId$: of('appId') }, + topValuesPopover: { + closePopover: jest.fn(), + }, + notifications: { + toasts: { + addWarning: jest.fn(), + }, + }, + }; + const mockStore = { + getState: jest.fn(), + }; + + const mockUserCountData = [ + { + columnMeta: { + field: 'user.count', + sourceParams: { + type: 'value_count', + indexPatternId: 'indexPatternId', + }, + }, + value: [1], + }, + ] as unknown as CellValueContext['data']; + + const mockUserNameData = [ + { + columnMeta: { + field: 'user.name', + sourceParams: { + type: 'string', + indexPatternId: 'indexPatternId', + }, + }, + value: 'elastic', + }, + ] as unknown as CellValueContext['data']; + + const mockTrigger = { + id: 'triggerId', + title: 'triggerTitle', + description: 'triggerDescription', + } as Trigger; + + const params = { + id: 'embeddable_filterIn', + order: 0, + store: mockStore, + services: mockServices, + } as unknown as CreateFilterLensActionParams; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should create a "filter In" action with the field value', async () => { + const { execute } = createFilterLensAction(params); + await execute({ + data: mockUserNameData, + trigger: mockTrigger, + }); + expect(addFilterIn).toHaveBeenCalledWith({ + filterManager: 'mockFilterManager', + fieldName: 'user.name', + value: ['elastic'], + dataViewId: 'indexPatternId', + }); + expect(addFilterOut).not.toHaveBeenCalled(); + }); + + it('should create a "filter Out" action with the field value', async () => { + const testParams = { + ...params, + id: 'embeddable_filterOut', + negate: true, + }; + const { execute } = createFilterLensAction(testParams); + await execute({ + data: mockUserNameData, + trigger: mockTrigger, + }); + expect(addFilterIn).not.toHaveBeenCalled(); + expect(addFilterOut).toHaveBeenCalledWith({ + filterManager: 'mockFilterManager', + fieldName: 'user.name', + value: ['elastic'], + dataViewId: 'indexPatternId', + }); + }); + + it('should create an "exists" filter when value type equals "value_count"', async () => { + const { execute } = createFilterLensAction(params); + await execute({ + data: mockUserCountData, + trigger: mockTrigger, + }); + expect(addExistsFilter).toHaveBeenCalledWith({ + filterManager: 'mockFilterManager', + key: 'user.count', + negate: false, + dataViewId: 'indexPatternId', + }); + }); + + it('should create an "Not exists" filter when value type equals "value_count"', async () => { + const testParams = { + ...params, + negate: true, + }; + const { execute } = createFilterLensAction(testParams); + await execute({ + data: mockUserCountData, + trigger: mockTrigger, + }); + expect(addExistsFilter).toHaveBeenCalledWith({ + filterManager: 'mockFilterManager', + key: 'user.count', + negate: true, + dataViewId: 'indexPatternId', + }); + expect(addFilterIn).not.toHaveBeenCalled(); + }); + + it('should show a warning toast when the value is not supported', async () => { + const { execute } = createFilterLensAction(params); + await execute({ + data: [ + { + columnMeta: { + field: 'user.name', + sourceParams: { + type: 'string', + indexPatternId: 'indexPatternId', + }, + }, + value: [[1], '1', 'foo'], + }, + ] as unknown as CellValueContext['data'], + trigger: mockTrigger, + }); + expect(mockServices.notifications.toasts.addWarning).toHaveBeenCalled(); + }); + + it('should not create a filter when the field is missing', async () => { + const { execute } = createFilterLensAction(params); + await execute({ + data: [ + { + columnMeta: {}, + value: 'elastic', + }, + ] as unknown as CellValueContext['data'], + trigger: mockTrigger, + }); + expect(addFilterIn).not.toHaveBeenCalled(); + expect(addFilterOut).not.toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts index e0da4447506cf..ecfe71bc3a112 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { addFilterIn, addFilterOut } from '@kbn/cell-actions'; +import { addExistsFilter, addFilterIn, addFilterOut } from '@kbn/cell-actions'; import { isValueSupportedByDefaultActions, valueToArray, @@ -31,19 +31,21 @@ function isDataColumnsValid(data?: CellValueContext['data']): boolean { ); } +export interface CreateFilterLensActionParams { + id: string; + order: number; + store: SecurityAppStore; + services: StartServices; + negate?: boolean; +} + export const createFilterLensAction = ({ id, order, store, services, negate, -}: { - id: string; - order: number; - store: SecurityAppStore; - services: StartServices; - negate?: boolean; -}) => { +}: CreateFilterLensActionParams) => { const { application, notifications, data: dataService, topValuesPopover } = services; let currentAppId: string | undefined; @@ -72,6 +74,7 @@ export const createFilterLensAction = ({ isInSecurityApp(currentAppId), execute: async ({ data }) => { const field = data[0]?.columnMeta?.field; + const isCounter = data[0]?.columnMeta?.sourceParams?.type === 'value_count'; const rawValue = data[0]?.value; const mayBeDataViewId = data[0]?.columnMeta?.sourceParams?.indexPatternId; const dataViewId = typeof mayBeDataViewId === 'string' ? mayBeDataViewId : undefined; @@ -87,15 +90,30 @@ export const createFilterLensAction = ({ topValuesPopover.closePopover(); - const addFilter = negate === true ? addFilterOut : addFilterIn; - const timeline = getTimelineById(store.getState(), TimelineId.active); // timeline is open add the filter to timeline, otherwise add filter to global filters const filterManager = timeline?.show ? services.timelineFilterManager : dataService.query.filterManager; - addFilter({ filterManager, fieldName: field, value, dataViewId }); + // If value type is value_count, we want to filter an `Exists` filter instead of a `Term` filter + if (isCounter) { + addExistsFilter({ + filterManager, + key: field, + negate: !!negate, + dataViewId, + }); + return; + } + + const addFilter = negate === true ? addFilterOut : addFilterIn; + addFilter({ + filterManager, + fieldName: field, + value, + dataViewId, + }); }, }); }; From 214833af0bc45dad269529a1904cfbb934da945e Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Wed, 24 Apr 2024 11:51:58 +0200 Subject: [PATCH 13/82] [Obs AI Assistant] Hide unavailable connectors (#181455) Hides unavailable connectors (e.g. due to license mismatches). --- .../server/routes/connectors/route.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts index 79134b9fef8d0..24d63d3f7fa06 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/connectors/route.ts @@ -20,9 +20,24 @@ const listConnectorsRoute = createObservabilityAIAssistantServerRoute({ await plugins.actions.start() ).getActionsClientWithRequest(request); - const connectors = await actionsClient.getAll(); + const [availableTypes, connectors] = await Promise.all([ + actionsClient + .listTypes({ + includeSystemActionTypes: false, + }) + .then((types) => + types + .filter((type) => type.enabled && type.enabledInLicense && type.enabledInConfig) + .map((type) => type.id) + ), + actionsClient.getAll(), + ]); - return connectors.filter((connector) => isSupportedConnectorType(connector.actionTypeId)); + return connectors.filter( + (connector) => + availableTypes.includes(connector.actionTypeId) && + isSupportedConnectorType(connector.actionTypeId) + ); }, }); From c17ba8cd1078a2885fd8baa7ab8c9faaf6e39671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:08:26 +0100 Subject: [PATCH 14/82] [Profiling] Adding "estimated value" label on sample columns (#181449) The service samples and transaction samples are estimated values, so I'm adding a tooltip to make it clear for users. Screenshot 2024-04-23 at 15 51 44 --- .../apm_transactions.tsx | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx b/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx index 9d5986deca9b2..54ce9ebc9eddb 100644 --- a/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx +++ b/x-pack/plugins/observability_solution/profiling/public/components/frame_information_window/apm_transactions.tsx @@ -12,7 +12,9 @@ import { EuiFieldSearch, EuiFlexGroup, EuiFlexItem, + EuiIcon, EuiLink, + EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isEmpty } from 'lodash'; @@ -78,6 +80,22 @@ const findServicesAndTransactions = ( }; }; +function EstimatedLabel({ label }: { label: string }) { + return ( + + <> + {label} + + + ); +} + +const SAMPLES_COLUMN_WIDTH = '152px'; + export function APMTransactions({ functionName, serviceNames }: Props) { const { query: { rangeFrom, rangeTo }, @@ -199,11 +217,15 @@ export function APMTransactions({ functionName, serviceNames }: Props) { }, { field: 'serviceSamples', - name: i18n.translate('xpack.profiling.apmTransactions.columns.serviceSamplesName', { - defaultMessage: 'Service Samples', - }), - width: '150px', + width: SAMPLES_COLUMN_WIDTH, sortable: true, + name: ( + + ), render(_, { serviceSamples }) { return asNumber(serviceSamples); }, @@ -239,10 +261,14 @@ export function APMTransactions({ functionName, serviceNames }: Props) { }, { field: 'transactionSamples', - name: i18n.translate('xpack.profiling.apmTransactions.columns.transactionSamples', { - defaultMessage: 'Transaction Samples', - }), - width: '150px', + name: ( + + ), + width: SAMPLES_COLUMN_WIDTH, render(_, { transactionSamples }) { if (isLoadingTransactions) { return '--'; From 67a2eb54c98678b546b08bf6f810f44bd31e1055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Wed, 24 Apr 2024 12:36:41 +0200 Subject: [PATCH 15/82] [Obs AI Assistant] Hide insight components when license is incorrect or there are no configured connectors (#181519) Closes https://github.com/elastic/kibana/issues/181435 --- .../public/components/insight/insight.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx index fb06d77efee8b..6c96287a28132 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx @@ -16,8 +16,10 @@ import { EuiCallOut, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { cloneDeep, isArray, last, once } from 'lodash'; +import { cloneDeep, isArray, isEmpty, last, once } from 'lodash'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { ILicense } from '@kbn/licensing-plugin/public'; import { MessageRole, type Message } from '../../../common/types'; import { ObservabilityAIAssistantChatServiceContext } from '../../context/observability_ai_assistant_chat_service_context'; import { useAbortableAsync } from '../../hooks/use_abortable_async'; @@ -290,9 +292,20 @@ export function Insight({ }; const { - services: { http }, + services: { + http, + plugins: { + start: { licensing }, + }, + }, } = useKibana(); + const license = useObservable(licensing.license$); + const hasEnterpriseLicense = license?.hasAtLeast('enterprise'); + if (isEmpty(connectors.connectors) || !hasEnterpriseLicense) { + return null; + } + let children: React.ReactNode = null; if ( From e1ec9ee17e89e1299778cc639f7f4ea085471861 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Zahid Date: Wed, 24 Apr 2024 13:20:31 +0200 Subject: [PATCH 16/82] [Dataset quality] Flyout Summary section (#179479) Closes https://github.com/elastic/kibana/issues/170492 ## Summary The PR Implements the Dataset Quality Flyout summary KPIs: "Docs count", "Size", "Services", "Hosts" and "Degraded docs". |Stateful|Serverless| |:---:|:---| |Screenshot 2024-03-26 at 19 14 34|Screenshot 2024-03-26 at 17 02 05| "Show all" links for "Services" and "Hosts" metrics depend on some development in APM and Infra plugins and therefore will be implemented in a follow up issue. Note that "Size" metric is excluded on Serverless as the endpoint uses ES's `_stats` endpoint which is not available on Serverless (at the time of creation of this PR). The code contains some conditions and cases to tackle this, which should be considered as a temporary measure. All of the code related to these changes should either be removed or modified once there's a way to calculate the size of an index/dataStream on Serverless (see [related ](https://github.com/elastic/kibana/issues/178954)). The following changes are made in particular: - Size UI component on the Flyout will be hidden on Serverless - `dataset_quality/data_streams/{dataStream}/details` endpoint will return `NaN` for size on Serverless - Unit, integration and end-to-end tests on Serverless handle "sizeBytes" property accordingly --- .github/CODEOWNERS | 1 + .../dataset_quality/common/api_types.ts | 14 +- .../dataset_quality/common/constants.ts | 7 + .../common/data_streams_stats/types.ts | 13 +- .../dataset_quality/common/translations.ts | 27 ++ .../summary_panel/estimated_data.tsx | 5 +- .../dataset_quality/table/columns.tsx | 5 +- .../table/degraded_docs_percentage_link.tsx | 3 +- .../components/flyout/dataset_summary.tsx | 19 +- .../degraded_docs_trend/degraded_docs.tsx | 166 ++----- .../degraded_docs_chart.tsx | 51 +- .../degraded_docs_trend/lens_attributes.ts | 2 +- .../public/components/flyout/fields_list.tsx | 13 +- .../public/components/flyout/flyout.tsx | 71 ++- .../flyout/flyout_summary/flyout_summary.tsx | 104 +++++ .../flyout_summary/flyout_summary_header.tsx | 78 ++++ .../flyout_summary_kpi_item.tsx | 100 ++++ .../flyout_summary/flyout_summary_kpis.tsx | 77 +++ .../flyout_summary/get_summary_kpis.test.ts | 156 +++++++ .../flyout/flyout_summary/get_summary_kpis.ts | 137 ++++++ .../flyout/integration_actions_menu.tsx | 24 +- .../components/flyout/integration_summary.tsx | 14 +- .../hooks/use_dataset_quality_flyout.tsx | 27 +- .../hooks/use_dataset_quality_table.tsx | 8 +- .../public/hooks/use_degraded_docs_chart.tsx | 58 ++- .../public/hooks/use_link_to_logs_explorer.ts | 3 + .../data_stream_details_client.ts | 30 +- .../services/data_stream_details/types.ts | 3 + .../src/notifications.ts | 9 + .../src/state_machine.ts | 118 +++-- .../dataset_quality_controller/src/types.ts | 18 +- .../dataset_quality/public/types.ts | 5 +- .../get_data_stream_details.test.ts | 439 +++++++++++------- .../get_data_stream_settings.test.ts | 227 +++++++++ .../get_data_stream_details/index.ts | 149 +++++- .../server/routes/data_streams/routes.ts | 52 ++- .../dataset_quality/tsconfig.json | 4 +- .../data_streams/data_stream_details.spec.ts | 26 +- .../data_streams/data_stream_settings.spec.ts | 106 +++++ .../utils/data_stream.ts | 17 +- .../apps/dataset_quality/data/logs_data.ts | 8 +- .../dataset_quality/dataset_quality_flyout.ts | 133 ++++++ .../dataset_quality_summary.ts | 2 +- .../page_objects/dataset_quality.ts | 61 ++- .../common/reporting/generate_csv_discover.ts | 4 +- .../test_suites/observability/config.ts | 5 +- .../common/dataset_quality_api_supertest.ts | 129 +++++ .../common/services.ts | 38 ++ .../data_stream_details.ts | 96 ++++ .../data_stream_settings.ts | 101 ++++ .../dataset_quality_api_integration/index.ts | 14 + .../utils/data_stream.ts | 26 ++ .../utils/expect_to_reject.ts | 17 + .../utils/index.ts | 9 + .../test_suites/observability/index.ts | 1 + .../dataset_quality/data/logs_data.ts | 6 +- .../dataset_quality/dataset_quality_flyout.ts | 150 +++++- .../dataset_quality_summary.ts | 4 +- x-pack/test_serverless/tsconfig.json | 1 + 59 files changed, 2725 insertions(+), 466 deletions(-) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_header.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpi_item.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpis.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.test.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_settings.test.ts create mode 100644 x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/services.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/data_stream.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/expect_to_reject.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/index.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4a6c4b24a6800..0c57ef0d7dc9a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1133,6 +1133,7 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql # Logs /x-pack/test/api_integration/apis/logs_ui @elastic/obs-ux-logs-team /x-pack/test/dataset_quality_api_integration @elastic/obs-ux-logs-team +/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration @elastic/obs-ux-logs-team /x-pack/test/functional/apps/observability_logs_explorer @elastic/obs-ux-logs-team /x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer @elastic/obs-ux-logs-team /x-pack/test/functional/apps/dataset_quality @elastic/obs-ux-logs-team diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts index ae098c08c8ec8..4dac346e2a26a 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts @@ -76,9 +76,19 @@ export const degradedDocsRt = rt.type({ export type DegradedDocs = rt.TypeOf; +export const dataStreamSettingsRt = rt.partial({ + createdOn: rt.union([rt.null, rt.number]), // rt.null is needed because `createdOn` is not available on Serverless +}); + +export type DataStreamSettings = rt.TypeOf; + export const dataStreamDetailsRt = rt.partial({ - createdOn: rt.number, lastActivity: rt.number, + degradedDocsCount: rt.number, + docsCount: rt.number, + sizeBytes: rt.union([rt.null, rt.number]), // rt.null is only needed for https://github.com/elastic/kibana/issues/178954 + services: rt.record(rt.string, rt.array(rt.string)), + hosts: rt.record(rt.string, rt.array(rt.string)), }); export type DataStreamDetails = rt.TypeOf; @@ -95,6 +105,8 @@ export const getDataStreamsDegradedDocsStatsResponseRt = rt.exact( }) ); +export const getDataStreamsSettingsResponseRt = rt.exact(dataStreamSettingsRt); + export const getDataStreamsDetailsResponseRt = rt.exact(dataStreamDetailsRt); export const dataStreamsEstimatedDataInBytesRT = rt.type({ diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts index 325cae3dc99b3..a5be06438d3c8 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts @@ -18,4 +18,11 @@ export const DEFAULT_SORT_DIRECTION = 'asc'; export const NONE = 'none'; export const DEFAULT_TIME_RANGE = { from: 'now-24h', to: 'now' }; +export const DEFAULT_DATEPICKER_REFRESH = { value: 60000, pause: false }; + export const DEFAULT_DEGRADED_DOCS = { percentage: 0, count: 0 }; + +export const NUMBER_FORMAT = '0,0.[000]'; +export const BYTE_NUMBER_FORMAT = '0.0 b'; + +export const MAX_HOSTS_METRIC_VALUE = 50; diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts index 7fbbf4d8f3e90..66fbffd452dc6 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts @@ -30,8 +30,17 @@ export type GetDataStreamsDegradedDocsStatsResponse = export type DataStreamDegradedDocsStatServiceResponse = DegradedDocsStatType[]; export type DegradedDocsStatType = GetDataStreamsDegradedDocsStatsResponse['degradedDocs'][0]; -export type GetDataStreamDetailsParams = +export type GetDataStreamSettingsParams = + APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/settings`>['params']['path']; +export type GetDataStreamSettingsResponse = + APIReturnType<`GET /internal/dataset_quality/data_streams/{dataStream}/settings`>; + +type GetDataStreamDetailsPathParams = APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>['params']['path']; +type GetDataStreamDetailsQueryParams = + APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>['params']['query']; +export type GetDataStreamDetailsParams = GetDataStreamDetailsPathParams & + GetDataStreamDetailsQueryParams; export type GetDataStreamDetailsResponse = APIReturnType<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>; @@ -47,4 +56,4 @@ export type GetIntegrationDashboardsResponse = export type DashboardType = GetIntegrationDashboardsResponse['dashboards'][0]; export type { DataStreamStat } from './data_stream_stat'; -export type { DataStreamDetails } from '../api_types'; +export type { DataStreamDetails, DataStreamSettings } from '../api_types'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts index c2441a648566f..d31f3d537eb22 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts @@ -88,6 +88,10 @@ export const flyoutIntegrationNameText = i18n.translate( } ); +export const flyoutSummaryText = i18n.translate('xpack.datasetQuality.flyoutSummaryTitle', { + defaultMessage: 'Summary', +}); + export const flyoutDegradedDocsText = i18n.translate( 'xpack.datasetQuality.flyout.degradedDocsTitle', { @@ -110,6 +114,29 @@ export const flyoutDegradedDocsPercentageText = i18n.translate( } ); +export const flyoutDocsCountTotalText = i18n.translate( + 'xpack.datasetQuality.flyoutDocsCountTotal', + { + defaultMessage: 'Docs count (total)', + } +); + +export const flyoutSizeText = i18n.translate('xpack.datasetQuality.flyoutSizeText', { + defaultMessage: 'Size', +}); + +export const flyoutServicesText = i18n.translate('xpack.datasetQuality.flyoutServicesText', { + defaultMessage: 'Services', +}); + +export const flyoutHostsText = i18n.translate('xpack.datasetQuality.flyoutHostsText', { + defaultMessage: 'Hosts', +}); + +export const flyoutShowAllText = i18n.translate('xpack.datasetQuality.flyoutShowAllText', { + defaultMessage: 'Show all', +}); + /* Summary Panel */ diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx index 803cd6ab50a6a..f44bd78316916 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/estimated_data.tsx @@ -6,9 +6,10 @@ */ import React from 'react'; +import { formatNumber } from '@elastic/eui'; -import { formatBytes } from '@kbn/formatters'; import { useSummaryPanelContext } from '../../../hooks'; +import { BYTE_NUMBER_FORMAT } from '../../../../common/constants'; import { summaryPanelEstimatedDataText, summaryPanelEstimatedDataTooltipText, @@ -22,7 +23,7 @@ export function EstimatedData() { ); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx index 1fb229e1b7155..1558e2ce50615 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -16,6 +16,7 @@ import { EuiToolTip, EuiButtonIcon, EuiText, + formatNumber, EuiSkeletonRectangle, } from '@elastic/eui'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; @@ -24,10 +25,10 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; import { css } from '@emotion/react'; -import { formatBytes } from '@kbn/formatters'; import { DEGRADED_QUALITY_MINIMUM_PERCENTAGE, POOR_QUALITY_MINIMUM_PERCENTAGE, + BYTE_NUMBER_FORMAT, } from '../../../../common/constants'; import { DataStreamStat } from '../../../../common/data_streams_stats/data_stream_stat'; import { QualityIndicator } from '../../quality_indicator'; @@ -207,7 +208,7 @@ export const getDatasetQualityTableColumns = ({ borderRadius="m" isLoading={loadingDataStreamStats} > - {formatBytes(dataStreamStat.sizeBytes || 0)} + {formatNumber(dataStreamStat.sizeBytes || 0, BYTE_NUMBER_FORMAT)} ), width: '100px', diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx index 70f33c5a134bc..d8aade6d74e51 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/degraded_docs_percentage_link.tsx @@ -7,6 +7,7 @@ import { EuiSkeletonRectangle, EuiFlexGroup, EuiLink } from '@elastic/eui'; import React from 'react'; +import { _IGNORED } from '../../../../common/es_fields'; import { useLinkToLogsExplorer } from '../../../hooks'; import { QualityPercentageIndicator } from '../../quality_indicator'; import { DataStreamStat } from '../../../../common/data_streams_stats/data_stream_stat'; @@ -24,7 +25,7 @@ export const DegradedDocsPercentageLink = ({ const logsExplorerLinkProps = useLinkToLogsExplorer({ dataStreamStat, - query: { language: 'kuery', query: '_ignored:*' }, + query: { language: 'kuery', query: `${_IGNORED}: *` }, }); return ( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx index a0954ab44e49b..052f4b63f0da6 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/dataset_summary.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '@kbn/field-types'; -import { DataStreamDetails } from '../../../common/data_streams_stats'; +import { DataStreamDetails, DataStreamSettings } from '../../../common/data_streams_stats'; import { flyoutDatasetCreatedOnText, flyoutDatasetDetailsText, @@ -18,18 +18,27 @@ import { FieldsList, FieldsListLoading } from './fields_list'; interface DatasetSummaryProps { fieldFormats: FieldFormatsStart; + dataStreamSettings?: DataStreamSettings; + dataStreamSettingsLoading: boolean; dataStreamDetails?: DataStreamDetails; + dataStreamDetailsLoading: boolean; } -export function DatasetSummary({ dataStreamDetails, fieldFormats }: DatasetSummaryProps) { +export function DatasetSummary({ + dataStreamSettings, + dataStreamSettingsLoading, + dataStreamDetails, + dataStreamDetailsLoading, + fieldFormats, +}: DatasetSummaryProps) { const dataFormatter = fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.DATE, [ ES_FIELD_TYPES.DATE, ]); const formattedLastActivity = dataStreamDetails?.lastActivity ? dataFormatter.convert(dataStreamDetails?.lastActivity) : '-'; - const formattedCreatedOn = dataStreamDetails?.createdOn - ? dataFormatter.convert(dataStreamDetails.createdOn) + const formattedCreatedOn = dataStreamSettings?.createdOn + ? dataFormatter.convert(dataStreamSettings.createdOn) : '-'; return ( @@ -39,10 +48,12 @@ export function DatasetSummary({ dataStreamDetails, fieldFormats }: DatasetSumma { fieldTitle: flyoutDatasetLastActivityText, fieldValue: formattedLastActivity, + isLoading: dataStreamDetailsLoading, }, { fieldTitle: flyoutDatasetCreatedOnText, fieldValue: formattedCreatedOn, + isLoading: dataStreamSettingsLoading, }, ]} /> diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx index 9a5348ed1495d..89087a26a1960 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs.tsx @@ -5,166 +5,94 @@ * 2.0. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFlexGroup, + EuiFlexItem, EuiPanel, EuiSpacer, EuiTitle, - EuiText, - EuiSuperDatePicker, - OnRefreshProps, EuiToolTip, EuiIcon, EuiCode, + OnTimeChangeProps, EuiSkeletonRectangle, } from '@elastic/eui'; -import { - UnifiedBreakdownFieldSelector, - fieldSupportsBreakdown, -} from '@kbn/unified-histogram-plugin/public'; -import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import { UnifiedBreakdownFieldSelector } from '@kbn/unified-histogram-plugin/public'; +import type { DataViewField } from '@kbn/data-views-plugin/common'; +import { useDegradedDocsChart } from '../../../hooks'; -import { useCreateDataView } from '../../../hooks'; -import { indexNameToDataStreamParts } from '../../../../common/utils'; -import { DEFAULT_LOGS_DATA_VIEW, DEFAULT_TIME_RANGE } from '../../../../common/constants'; +import { DEFAULT_TIME_RANGE, DEFAULT_DATEPICKER_REFRESH } from '../../../../common/constants'; import { flyoutDegradedDocsText } from '../../../../common/translations'; import { TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; -import { useDatasetQualityContext } from '../../dataset_quality/context'; import { DegradedDocsChart } from './degraded_docs_chart'; -const DEFAULT_REFRESH = { value: 60000, pause: false }; - export function DegradedDocs({ dataStream, - timeRange = { ...DEFAULT_TIME_RANGE, refresh: DEFAULT_REFRESH }, - breakdownField, + timeRange = { ...DEFAULT_TIME_RANGE, refresh: DEFAULT_DATEPICKER_REFRESH }, + lastReloadTime, + onTimeRangeChange, }: { dataStream?: string; timeRange?: TimeRangeConfig; - breakdownField?: string; + lastReloadTime: number; + onTimeRangeChange: (props: Pick) => void; }) { - const { service } = useDatasetQualityContext(); - const { dataView } = useCreateDataView({ - indexPatternString: getDataViewIndexPattern(dataStream), - }); + const { dataView, breakdown, ...chartProps } = useDegradedDocsChart({ dataStream }); const [breakdownDataViewField, setBreakdownDataViewField] = useState( undefined ); - const [lastReloadTime, setLastReloadTime] = useState(Date.now()); useEffect(() => { - if (dataView) { - const dataViewField = getDataViewField(dataView, breakdownField); - if (dataViewField) { - const isFieldBreakable = fieldSupportsBreakdown(dataViewField); - if (isFieldBreakable) { - setBreakdownDataViewField(dataViewField); - } else { - setBreakdownDataViewField(undefined); - // TODO: If needed, notify user that the field is not breakable - } - } else { - setBreakdownDataViewField(undefined); - } + if (breakdown.dataViewField && breakdown.fieldSupportsBreakdown) { + setBreakdownDataViewField(breakdown.dataViewField); + } else { + setBreakdownDataViewField(undefined); } - }, [dataView, breakdownField]); - - const handleRefresh = useCallback((_refreshProps: OnRefreshProps) => { - setLastReloadTime(Date.now()); - }, []); - - const handleTimeChange = useCallback( - (durationRange) => { - service.send({ - type: 'UPDATE_INSIGHTS_TIME_RANGE', - timeRange: { - from: durationRange.start, - to: durationRange.end, - refresh: timeRange.refresh ?? DEFAULT_REFRESH, - }, - }); - }, - [service, timeRange.refresh] - ); - const handleBreakdownFieldChange = useCallback( - (field: DataViewField | undefined) => { - service.send({ - type: 'BREAKDOWN_FIELD_CHANGE', - breakdownField: field?.name ?? null, - }); - }, - [service] - ); + if (breakdown.dataViewField && !breakdown.fieldSupportsBreakdown) { + // TODO: If needed, notify user that the field is not breakable + } + }, [setBreakdownDataViewField, breakdown.dataViewField, breakdown.fieldSupportsBreakdown]); return ( - - + - - {flyoutDegradedDocsText} + +
{flyoutDegradedDocsText}
-
+
- - {dataView ? ( - - ) : ( - - )} - - - - - + + +
- + + + ); @@ -183,13 +111,3 @@ const degradedDocsTooltip = ( }} /> ); - -function getDataViewIndexPattern(dataStream: string | undefined) { - return dataStream ? `${indexNameToDataStreamParts(dataStream).type}-*-*` : DEFAULT_LOGS_DATA_VIEW; -} - -function getDataViewField(dataView: DataView | undefined, fieldName: string | undefined) { - return fieldName && dataView - ? dataView.fields.find((field) => field.name === fieldName) - : undefined; -} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs_chart.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs_chart.tsx index 7a861308ba1ee..9d13d0e3b26ba 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs_chart.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/degraded_docs_chart.tsx @@ -5,12 +5,11 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { css } from '@emotion/react'; -import { EuiFlexGroup, EuiLoadingChart } from '@elastic/eui'; +import { EuiFlexGroup, EuiLoadingChart, OnTimeChangeProps } from '@elastic/eui'; import { ViewMode } from '@kbn/embeddable-plugin/common'; import { KibanaErrorBoundary } from '@kbn/shared-ux-error-boundary'; -import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { flyoutDegradedDocsTrendText } from '../../../../common/translations'; import { TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; @@ -25,25 +24,35 @@ const DISABLED_ACTIONS = [ 'create-ml-ad-job-action', ]; +interface DegradedDocsChartProps + extends Pick< + ReturnType, + 'attributes' | 'isChartLoading' | 'onChartLoading' | 'extraActions' + > { + timeRange: TimeRangeConfig; + lastReloadTime: number; + onTimeRangeChange: (props: Pick) => void; +} + export function DegradedDocsChart({ - dataStream, + attributes, + isChartLoading, + onChartLoading, + extraActions, timeRange, lastReloadTime, - dataView, - breakdownDataViewField, -}: { - dataStream?: string; - timeRange: TimeRangeConfig; - lastReloadTime: number; - dataView?: DataView; - breakdownDataViewField?: DataViewField; -}) { + onTimeRangeChange, +}: DegradedDocsChartProps) { const { services: { lens }, } = useKibanaContextForPlugin(); - const { attributes, filterQuery, extraActions, isChartLoading, handleChartLoading } = - useDegradedDocsChart({ dataStream, breakdownDataViewField }); + const handleBrushEnd = useCallback( + ({ range: [start, end] }: { range: number[] }) => { + onTimeRangeChange({ start: new Date(start).toISOString(), end: new Date(end).toISOString() }); + }, + [onTimeRangeChange] + ); return ( <> @@ -59,8 +68,11 @@ export function DegradedDocsChart({ ) : ( )}
diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts index 0f106769d427b..c731c8f3cb77e 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts @@ -242,7 +242,7 @@ function getChartColumns(breakdownField?: string): Record; + fields: Array<{ fieldTitle: string; fieldValue: ReactNode; isLoading: boolean }>; actionsMenu?: ReactNode; }) { return ( @@ -36,7 +37,7 @@ export function FieldsList({
- {fields.map(({ fieldTitle, fieldValue }, index) => ( + {fields.map(({ fieldTitle, fieldValue, isLoading: isFieldLoading }, index) => ( @@ -44,9 +45,11 @@ export function FieldsList({ {fieldTitle} - - {fieldValue} - + + + {fieldValue} + + {index < fields.length - 1 ? : null} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout.tsx index 4960dd73ccc40..56caa18741477 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout.tsx @@ -5,6 +5,8 @@ * 2.0. */ +import React, { Fragment } from 'react'; +import { css } from '@emotion/react'; import { EuiButtonEmpty, EuiFlexGroup, @@ -13,26 +15,27 @@ import { EuiFlyoutBody, EuiFlyoutFooter, EuiSpacer, + EuiHorizontalRule, + EuiPanel, } from '@elastic/eui'; -import React, { Fragment } from 'react'; import { flyoutCancelText } from '../../../common/translations'; import { useDatasetQualityFlyout } from '../../hooks'; import { DatasetSummary, DatasetSummaryLoading } from './dataset_summary'; import { Header } from './header'; import { IntegrationSummary } from './integration_summary'; import { FlyoutProps } from './types'; -import { DegradedDocs } from './degraded_docs_trend/degraded_docs'; +import { FlyoutSummary } from './flyout_summary/flyout_summary'; // Allow for lazy loading // eslint-disable-next-line import/no-default-export export default function Flyout({ dataset, closeFlyout }: FlyoutProps) { const { dataStreamStat, + dataStreamSettings, dataStreamDetails, - dataStreamDetailsLoading, fieldFormats, timeRange, - breakdownField, + loadingState, } = useDatasetQualityFlyout(); return ( @@ -45,26 +48,44 @@ export default function Flyout({ dataset, closeFlyout }: FlyoutProps) { > <>
- - + + + + - + - {dataStreamDetailsLoading ? ( - - ) : dataStreamStat ? ( - - - - {dataStreamStat.integration && ( - - )} - - ) : null} + + {loadingState.dataStreamDetailsLoading && loadingState.dataStreamSettingsLoading ? ( + + ) : dataStreamStat ? ( + + + + {dataStreamStat.integration && ( + <> + + + + )} + + ) : null} + @@ -85,3 +106,9 @@ export default function Flyout({ dataset, closeFlyout }: FlyoutProps) { ); } + +const flyoutBodyStyles = css` + .euiFlyoutBody__overflowContent { + padding: 0; + } +`; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx new file mode 100644 index 0000000000000..7ba5f315e607f --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useState } from 'react'; +import { OnRefreshProps, OnTimeChangeProps, EuiSpacer } from '@elastic/eui'; + +import { DegradedDocs } from '../degraded_docs_trend/degraded_docs'; +import { DataStreamDetails } from '../../../../common/api_types'; +import { DEFAULT_TIME_RANGE, DEFAULT_DATEPICKER_REFRESH } from '../../../../common/constants'; +import { useDatasetQualityContext } from '../../dataset_quality/context'; +import { FlyoutDataset, TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; +import { FlyoutSummaryHeader } from './flyout_summary_header'; +import { FlyoutSummaryKpis, FlyoutSummaryKpisLoading } from './flyout_summary_kpis'; + +export function FlyoutSummary({ + dataStream, + dataStreamStat, + dataStreamDetails, + dataStreamDetailsLoading, + timeRange = { ...DEFAULT_TIME_RANGE, refresh: DEFAULT_DATEPICKER_REFRESH }, +}: { + dataStream: string; + dataStreamStat?: FlyoutDataset; + dataStreamDetails?: DataStreamDetails; + dataStreamDetailsLoading: boolean; + timeRange?: TimeRangeConfig; +}) { + const { service } = useDatasetQualityContext(); + const [lastReloadTime, setLastReloadTime] = useState(Date.now()); + + const updateTimeRange = useCallback( + ({ start, end, refreshInterval }: OnRefreshProps) => { + service.send({ + type: 'UPDATE_INSIGHTS_TIME_RANGE', + timeRange: { + from: start, + to: end, + refresh: { ...DEFAULT_DATEPICKER_REFRESH, value: refreshInterval }, + }, + }); + }, + [service] + ); + + const handleTimeChange = useCallback( + ({ isInvalid, ...timeRangeProps }: OnTimeChangeProps) => { + if (!isInvalid) { + updateTimeRange({ refreshInterval: timeRange.refresh.value, ...timeRangeProps }); + } + }, + [updateTimeRange, timeRange.refresh] + ); + + const handleTimeRangeChange = useCallback( + ({ start, end }: Pick) => { + updateTimeRange({ start, end, refreshInterval: timeRange.refresh.value }); + }, + [updateTimeRange, timeRange.refresh] + ); + + const handleRefresh = useCallback( + (refreshProps: OnRefreshProps) => { + updateTimeRange(refreshProps); + setLastReloadTime(Date.now()); + }, + [updateTimeRange] + ); + + return ( + <> + + + + + {dataStreamStat ? ( + + ) : ( + + )} + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_header.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_header.tsx new file mode 100644 index 0000000000000..518f4ef4b654e --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_header.tsx @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { css } from '@emotion/react'; +import { + EuiFlexGroup, + EuiIcon, + EuiSuperDatePicker, + EuiTitle, + EuiToolTip, + OnRefreshProps, + OnTimeChangeProps, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { flyoutSummaryText } from '../../../../common/translations'; +import { TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; + +export function FlyoutSummaryHeader({ + timeRange, + onTimeChange, + onRefresh, +}: { + timeRange: TimeRangeConfig; + onTimeChange: (timeChangeProps: OnTimeChangeProps) => void; + onRefresh: (refreshProps: OnRefreshProps) => void; +}) { + return ( + + + + {flyoutSummaryText} + + + + + + + + + + + ); +} + +const flyoutSummaryTooltip = ( + +); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpi_item.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpi_item.tsx new file mode 100644 index 0000000000000..358f0eaaacbb5 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpi_item.tsx @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiTitle, + EuiText, + EuiLink, + useEuiTheme, + EuiSkeletonTitle, + EuiSkeletonRectangle, +} from '@elastic/eui'; + +export function FlyoutSummaryKpiItem({ + title, + value, + link, + isLoading, +}: { + title: string; + value: string; + link?: { + label: string; + href: string; + }; + isLoading: boolean; +}) { + const { euiTheme } = useEuiTheme(); + + return ( + + + + +
{title}
+
+ {link ? ( + + + {link.label} + + + ) : null} +
+ + + +

{value}

+
+
+
+
+
+ ); +} + +export function FlyoutSummaryKpiItemLoading({ title }: { title: string }) { + return ( + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpis.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpis.tsx new file mode 100644 index 0000000000000..f377f139eb099 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary_kpis.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { _IGNORED } from '../../../../common/es_fields'; + +import { DataStreamDetails } from '../../../../common/api_types'; +import { useKibanaContextForPlugin } from '../../../utils'; +import { useLinkToLogsExplorer } from '../../../hooks'; +import { FlyoutDataset, TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; +import { FlyoutSummaryKpiItem, FlyoutSummaryKpiItemLoading } from './flyout_summary_kpi_item'; +import { getSummaryKpis } from './get_summary_kpis'; + +export function FlyoutSummaryKpis({ + dataStreamStat, + dataStreamDetails, + isLoading, + timeRange, +}: { + dataStreamStat: FlyoutDataset; + dataStreamDetails?: DataStreamDetails; + isLoading: boolean; + timeRange: TimeRangeConfig; +}) { + const { + services: { observabilityShared }, + } = useKibanaContextForPlugin(); + const hostsLocator = observabilityShared.locators.infra.hostsLocator; + + const logsExplorerLinkProps = useLinkToLogsExplorer({ + dataStreamStat, + query: { language: 'kuery', query: `${_IGNORED}: *` }, + }); + + const kpis = useMemo( + () => + getSummaryKpis({ + dataStreamDetails, + timeRange, + degradedDocsHref: logsExplorerLinkProps.href, + hostsLocator, + }), + [dataStreamDetails, logsExplorerLinkProps, hostsLocator, timeRange] + ); + + return ( + + + {kpis.map((kpi) => ( + + + + ))} + + + ); +} + +export function FlyoutSummaryKpisLoading() { + return ( + + + {getSummaryKpis({}).map(({ title }) => ( + + + + ))} + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.test.ts b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.test.ts new file mode 100644 index 0000000000000..fb47ddcddbfa7 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.test.ts @@ -0,0 +1,156 @@ +/* + * 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 { formatNumber } from '@elastic/eui'; +import type { useKibanaContextForPlugin } from '../../../utils'; +import { TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; + +import { + BYTE_NUMBER_FORMAT, + DEFAULT_DATEPICKER_REFRESH, + DEFAULT_TIME_RANGE, + MAX_HOSTS_METRIC_VALUE, +} from '../../../../common/constants'; +import { + flyoutDegradedDocsText, + flyoutDocsCountTotalText, + flyoutHostsText, + flyoutServicesText, + flyoutShowAllText, + flyoutSizeText, +} from '../../../../common/translations'; +import { getSummaryKpis } from './get_summary_kpis'; + +const dataStreamDetails = { + services: { + service1: ['service1Instance1', 'service1Instance2'], + service2: ['service2Instance1'], + }, + docsCount: 1000, + sizeBytes: 5000, + hosts: { + host1: ['host1Instance1', 'host1Instance2'], + host2: ['host2Instance1'], + }, + degradedDocsCount: 200, +}; + +const timeRange: TimeRangeConfig = { + ...DEFAULT_TIME_RANGE, + refresh: DEFAULT_DATEPICKER_REFRESH, + from: 'now-15m', + to: 'now', +}; + +const degradedDocsHref = 'http://exploratory-view/degraded-docs'; +const hostsRedirectUrl = 'http://hosts/metric/'; + +const hostsLocator = { + getRedirectUrl: () => hostsRedirectUrl, +} as unknown as ReturnType< + typeof useKibanaContextForPlugin +>['services']['observabilityShared']['locators']['infra']['hostsLocator']; + +describe('getSummaryKpis', () => { + it('should return the correct KPIs', () => { + const result = getSummaryKpis({ + dataStreamDetails, + timeRange, + degradedDocsHref, + hostsLocator, + }); + + expect(result).toEqual([ + { + title: flyoutDocsCountTotalText, + value: '1,000', + }, + { + title: flyoutSizeText, + value: formatNumber(dataStreamDetails.sizeBytes ?? 0, BYTE_NUMBER_FORMAT), + }, + { + title: flyoutServicesText, + value: '3', + link: undefined, + }, + { + title: flyoutHostsText, + value: '3', + link: { + label: flyoutShowAllText, + href: hostsRedirectUrl, + }, + }, + { + title: flyoutDegradedDocsText, + value: '200', + link: { + label: flyoutShowAllText, + href: degradedDocsHref, + }, + }, + ]); + }); + + it('show X+ if number of hosts or services exceed MAX_HOSTS_METRIC_VALUE', () => { + const services = { + service1: new Array(MAX_HOSTS_METRIC_VALUE + 1) + .fill('service1Instance') + .map((_, i) => `service1Instance${i}`), + }; + + const host3 = new Array(MAX_HOSTS_METRIC_VALUE + 1) + .fill('host3Instance') + .map((_, i) => `host3Instance${i}`); + + const detailsWithMaxPlusHosts = { + ...dataStreamDetails, + services, + hosts: { ...dataStreamDetails.hosts, host3 }, + }; + + const result = getSummaryKpis({ + dataStreamDetails: detailsWithMaxPlusHosts, + timeRange, + degradedDocsHref, + hostsLocator, + }); + + expect(result).toEqual([ + { + title: flyoutDocsCountTotalText, + value: '1,000', + }, + { + title: flyoutSizeText, + value: formatNumber(dataStreamDetails.sizeBytes ?? 0, BYTE_NUMBER_FORMAT), + }, + { + title: flyoutServicesText, + value: '50+', + link: undefined, + }, + { + title: flyoutHostsText, + value: '54+', + link: { + label: flyoutShowAllText, + href: hostsRedirectUrl, + }, + }, + { + title: flyoutDegradedDocsText, + value: '200', + link: { + label: flyoutShowAllText, + href: degradedDocsHref, + }, + }, + ]); + }); +}); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.ts b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.ts new file mode 100644 index 0000000000000..25d0bf0584bfa --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/get_summary_kpis.ts @@ -0,0 +1,137 @@ +/* + * 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 { formatNumber } from '@elastic/eui'; +import { + BYTE_NUMBER_FORMAT, + DEFAULT_DATEPICKER_REFRESH, + DEFAULT_TIME_RANGE, + MAX_HOSTS_METRIC_VALUE, + NUMBER_FORMAT, +} from '../../../../common/constants'; +import { + flyoutDegradedDocsText, + flyoutDocsCountTotalText, + flyoutHostsText, + flyoutServicesText, + flyoutShowAllText, + flyoutSizeText, +} from '../../../../common/translations'; +import { DataStreamDetails } from '../../../../common/api_types'; +import { useKibanaContextForPlugin } from '../../../utils'; +import { TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; + +export function getSummaryKpis({ + dataStreamDetails, + timeRange = { ...DEFAULT_TIME_RANGE, refresh: DEFAULT_DATEPICKER_REFRESH }, + degradedDocsHref, + hostsLocator, +}: { + dataStreamDetails?: DataStreamDetails; + timeRange?: TimeRangeConfig; + degradedDocsHref?: string; + hostsLocator?: ReturnType< + typeof useKibanaContextForPlugin + >['services']['observabilityShared']['locators']['infra']['hostsLocator']; +}): Array<{ title: string; value: string; link?: { label: string; href: string } }> { + const services = dataStreamDetails?.services ?? {}; + const serviceKeys = Object.keys(services); + const countOfServices = serviceKeys + .map((key: string) => services[key].length) + .reduce((a, b) => a + b, 0); + const servicesLink = undefined; // TODO: Add link to APM services page when possible + + const degradedDocsLink = degradedDocsHref + ? { + label: flyoutShowAllText, + href: degradedDocsHref, + } + : undefined; + + return [ + { + title: flyoutDocsCountTotalText, + value: formatNumber(dataStreamDetails?.docsCount ?? 0, NUMBER_FORMAT), + }, + // dataStreamDetails.sizeBytes = null indicates it's Serverless where `_stats` API isn't available + ...(dataStreamDetails?.sizeBytes !== null // Only show when not in Serverless + ? [ + { + title: flyoutSizeText, + value: formatNumber(dataStreamDetails?.sizeBytes ?? 0, BYTE_NUMBER_FORMAT), + }, + ] + : []), + { + title: flyoutServicesText, + value: formatMetricValueForMax(countOfServices, MAX_HOSTS_METRIC_VALUE, NUMBER_FORMAT), + link: servicesLink, + }, + getHostsKpi(dataStreamDetails?.hosts, timeRange, hostsLocator), + { + title: flyoutDegradedDocsText, + value: formatNumber(dataStreamDetails?.degradedDocsCount ?? 0, NUMBER_FORMAT), + link: degradedDocsLink, + }, + ]; +} + +function getHostsKpi( + dataStreamHosts: DataStreamDetails['hosts'], + timeRange: TimeRangeConfig, + hostsLocator?: ReturnType< + typeof useKibanaContextForPlugin + >['services']['observabilityShared']['locators']['infra']['hostsLocator'] +) { + const hosts = dataStreamHosts ?? {}; + const hostKeys = Object.keys(hosts); + const countOfHosts = hostKeys + .map((key: string) => hosts[key].length) + .reduce( + ({ count, anyHostExceedsMax }, hostCount) => ({ + count: count + hostCount, + anyHostExceedsMax: anyHostExceedsMax || hostCount > MAX_HOSTS_METRIC_VALUE, + }), + { count: 0, anyHostExceedsMax: false } + ); + + // Create a query so from hostKeys so that (key: value OR key: value2) + const hostsKuery = hostKeys + .filter((key) => hosts[key].length > 0) + .map((key) => hosts[key].map((value) => `${key}: "${value}"`).join(' OR ')) + .join(' OR '); + const hostsUrl = hostsLocator?.getRedirectUrl({ + query: { language: 'kuery', query: hostsKuery }, + dateRange: { from: timeRange.from, to: timeRange.to }, + limit: countOfHosts.count, + }); + const hostsLink = hostsUrl + ? { + label: flyoutShowAllText, + href: hostsUrl, + } + : undefined; + + return { + title: flyoutHostsText, + value: formatMetricValueForMax( + countOfHosts.anyHostExceedsMax ? countOfHosts.count + 1 : countOfHosts.count, + countOfHosts.count, + NUMBER_FORMAT + ), + link: hostsLink, + }; +} + +/** + * Formats a metric value to show a '+' sign if it's above a max value e.g. 50+ + */ +function formatMetricValueForMax(value: number, max: number, numberFormat: string): string { + const exceedsMax = value > max; + const valueToShow = exceedsMax ? max : value; + return `${formatNumber(valueToShow, numberFormat)}${exceedsMax ? '+' : ''}`; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_actions_menu.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_actions_menu.tsx index 7a3b2715f1782..9705cd8b5ffd2 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_actions_menu.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_actions_menu.tsx @@ -14,12 +14,18 @@ import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor, EuiPopover, + EuiSkeletonRectangle, } from '@elastic/eui'; import { css } from '@emotion/react'; import { RouterLinkProps } from '@kbn/router-utils/src/get_router_link_props'; import { Integration } from '../../../common/data_streams_stats/integration'; import { useDatasetQualityFlyout } from '../../hooks'; import { useFlyoutIntegrationActions } from '../../hooks/use_flyout_integration_actions'; + +const integrationActionsText = i18n.translate('xpack.datasetQuality.flyoutIntegrationActionsText', { + defaultMessage: 'Integration actions', +}); + const seeIntegrationText = i18n.translate('xpack.datasetQuality.flyoutSeeIntegrationActionText', { defaultMessage: 'See integration', }); @@ -32,7 +38,13 @@ const viewDashboardsText = i18n.translate('xpack.datasetQuality.flyoutViewDashbo defaultMessage: 'View dashboards', }); -export function IntegrationActionsMenu({ integration }: { integration: Integration }) { +export function IntegrationActionsMenu({ + integration, + dashboardsLoading, +}: { + integration: Integration; + dashboardsLoading: boolean; +}) { const { type, name } = useDatasetQualityFlyout().dataStreamStat!; const { dashboards = [], version, name: integrationName } = integration; const { @@ -46,6 +58,8 @@ export function IntegrationActionsMenu({ integration }: { integration: Integrati const actionButton = ( , + 'data-test-subj': 'datasetQualityFlyoutIntegrationActionDashboardsLoading', + disabled: true, + }); } const panel: EuiContextMenuPanelDescriptor[] = [ @@ -150,6 +171,7 @@ export function IntegrationActionsMenu({ integration }: { integration: Integrati name, type, version, + dashboardsLoading, ]); return ( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_summary.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_summary.tsx index d77c68e4ac33b..1450e830eac1e 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_summary.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/integration_summary.tsx @@ -18,10 +18,18 @@ import { IntegrationIcon } from '../common'; import { FieldsList } from './fields_list'; import { IntegrationActionsMenu } from './integration_actions_menu'; -export function IntegrationSummary({ integration }: { integration: Integration }) { +export function IntegrationSummary({ + integration, + dashboardsLoading, +}: { + integration: Integration; + dashboardsLoading: boolean; +}) { const { name, version } = integration; - const integrationActionsMenu = ; + const integrationActionsMenu = ( + + ); return ( ), + isLoading: false, }, { fieldTitle: flyoutIntegrationVersionText, fieldValue: version, + isLoading: false, }, ]} /> diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_flyout.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_flyout.tsx index 15b1ba311db0a..aab764f6f6396 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_flyout.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_flyout.tsx @@ -6,6 +6,7 @@ */ import { useSelector } from '@xstate/react'; +import { useMemo } from 'react'; import { useDatasetQualityContext } from '../components/dataset_quality/context'; import { useKibanaContextForPlugin } from '../utils'; @@ -18,25 +19,39 @@ export const useDatasetQualityFlyout = () => { const { dataset: dataStreamStat, + datasetSettings: dataStreamSettings, datasetDetails: dataStreamDetails, insightsTimeRange, breakdownField, } = useSelector(service, (state) => state.context.flyout); const { timeRange } = useSelector(service, (state) => state.context.filters); - const dataStreamDetailsLoading = useSelector( - service, - (state) => - state.matches('datasets.loaded.flyoutOpen.fetching') || - state.matches('flyout.initializing.dataStreamDetails.fetching') + const dataStreamDetailsLoading = useSelector(service, (state) => + state.matches('flyout.initializing.dataStreamDetails.fetching') ); + const dataStreamSettingsLoading = useSelector(service, (state) => + state.matches('flyout.initializing.dataStreamSettings.fetching') + ); + + const datasetIntegrationsLoading = useSelector(service, (state) => + state.matches('flyout.initializing.integrationDashboards.fetching') + ); + + const loadingState = useMemo(() => { + return { + dataStreamDetailsLoading, + dataStreamSettingsLoading, + datasetIntegrationsLoading, + }; + }, [dataStreamDetailsLoading, dataStreamSettingsLoading, datasetIntegrationsLoading]); return { dataStreamStat, + dataStreamSettings, dataStreamDetails, - dataStreamDetailsLoading, fieldFormats, timeRange: insightsTimeRange ?? timeRange, breakdownField, + loadingState, }; }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx index 116e15bd92c93..2d1980c74daee 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx @@ -61,10 +61,6 @@ export const useDatasetQualityTable = () => { const datasets = useSelector(service, (state) => state.context.datasets); - const isDatasetQualityPageIdle = useSelector(service, (state) => - state.matches('datasets.loaded.idle') - ); - const toggleInactiveDatasets = useCallback( () => service.send({ type: 'TOGGLE_INACTIVE_DATASETS' }), [service] @@ -86,7 +82,7 @@ export const useDatasetQualityTable = () => { return; } - if (isDatasetQualityPageIdle) { + if (!flyout?.insightsTimeRange) { service.send({ type: 'OPEN_FLYOUT', dataset: selectedDataset, @@ -99,7 +95,7 @@ export const useDatasetQualityTable = () => { dataset: selectedDataset, }); }, - [flyout?.dataset?.rawName, isDatasetQualityPageIdle, service] + [flyout?.dataset?.rawName, flyout?.insightsTimeRange, service] ); const isActive = useCallback( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx index 2e37f84a0abb1..6a92249477cb2 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx @@ -4,12 +4,15 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { useCallback, useState, useMemo, useEffect } from 'react'; import { Action } from '@kbn/ui-actions-plugin/public'; +import { fieldSupportsBreakdown } from '@kbn/unified-histogram-plugin/public'; import { i18n } from '@kbn/i18n'; import { useEuiTheme } from '@elastic/eui'; -import { DataViewField } from '@kbn/data-views-plugin/common'; +import { type DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import { useDatasetQualityContext } from '../components/dataset_quality/context'; import { DEFAULT_LOGS_DATA_VIEW } from '../../common/constants'; import { indexNameToDataStreamParts } from '../../common/utils'; import { getLensAttributes } from '../components/flyout/degraded_docs_trend/lens_attributes'; @@ -34,37 +37,47 @@ const ACTION_OPEN_IN_LENS = 'ACTION_OPEN_IN_LENS'; interface DegradedDocsChartDeps { dataStream?: string; - breakdownDataViewField?: DataViewField; + breakdownField?: string; } -export const useDegradedDocsChart = ({ - dataStream, - breakdownDataViewField, -}: DegradedDocsChartDeps) => { +export const useDegradedDocsChart = ({ dataStream }: DegradedDocsChartDeps) => { + const { euiTheme } = useEuiTheme(); const { services: { lens }, } = useKibanaContextForPlugin(); - const { euiTheme } = useEuiTheme(); + const { service } = useDatasetQualityContext(); - const { dataStreamStat, timeRange } = useDatasetQualityFlyout(); + const { dataStreamStat, timeRange, breakdownField } = useDatasetQualityFlyout(); const [isChartLoading, setIsChartLoading] = useState(undefined); const [attributes, setAttributes] = useState | undefined>( undefined ); - const datasetTypeIndexPattern = dataStream - ? `${indexNameToDataStreamParts(dataStream).type}-*-*` - : undefined; const { dataView } = useCreateDataView({ - indexPatternString: datasetTypeIndexPattern ?? DEFAULT_LOGS_DATA_VIEW, + indexPatternString: getDataViewIndexPattern(dataStream), }); + + const breakdownDataViewField = useMemo( + () => getDataViewField(dataView, breakdownField), + [breakdownField, dataView] + ); const filterQuery = `_index: ${dataStream ?? 'match-none'}`; const handleChartLoading = (isLoading: boolean) => { setIsChartLoading(isLoading); }; + const handleBreakdownFieldChange = useCallback( + (field: DataViewField | undefined) => { + service.send({ + type: 'BREAKDOWN_FIELD_CHANGE', + breakdownField: field?.name ?? null, + }); + }, + [service] + ); + useEffect(() => { if (dataView) { const lensAttributes = getLensAttributes({ @@ -111,6 +124,7 @@ export const useDegradedDocsChart = ({ dataStreamStat: dataStreamStat!, query: { language: 'kuery', query: '_ignored:*' }, timeRangeConfig: timeRange, + breakdownField: breakdownDataViewField?.name, }); const getOpenInLogsExplorerAction = useMemo(() => { @@ -141,11 +155,27 @@ export const useDegradedDocsChart = ({ return { attributes, dataView, - filterQuery, + breakdown: { + dataViewField: breakdownDataViewField, + fieldSupportsBreakdown: breakdownDataViewField + ? fieldSupportsBreakdown(breakdownDataViewField) + : true, + onChange: handleBreakdownFieldChange, + }, extraActions, isChartLoading, - handleChartLoading, + onChartLoading: handleChartLoading, setAttributes, setIsChartLoading, }; }; + +function getDataViewIndexPattern(dataStream: string | undefined) { + return dataStream ? `${indexNameToDataStreamParts(dataStream).type}-*-*` : DEFAULT_LOGS_DATA_VIEW; +} + +function getDataViewField(dataView: DataView | undefined, fieldName: string | undefined) { + return fieldName && dataView + ? dataView.fields.find((field) => field.name === fieldName) + : undefined; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_link_to_logs_explorer.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_link_to_logs_explorer.ts index c1a857da1cc71..ff442f970ab21 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_link_to_logs_explorer.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_link_to_logs_explorer.ts @@ -21,10 +21,12 @@ export const useLinkToLogsExplorer = ({ dataStreamStat, query, timeRangeConfig, + breakdownField, }: { dataStreamStat: DataStreamStat | FlyoutDataset; query?: Query | AggregateQuery; timeRangeConfig?: TimeRangeConfig; + breakdownField?: string; }) => { const { services: { share }, @@ -48,6 +50,7 @@ export const useLinkToLogsExplorer = ({ values: [dataStreamStat.namespace], }, }, + breakdownField, }; const singleDatasetLocator = diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts index 1dd5b2d2220cd..3b95814397f3a 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts @@ -8,26 +8,50 @@ import { HttpStart } from '@kbn/core/public'; import { decodeOrThrow } from '@kbn/io-ts-utils'; import { + getDataStreamsSettingsResponseRt, getDataStreamsDetailsResponseRt, integrationDashboardsRT, } from '../../../common/api_types'; import { GetDataStreamsStatsError, + GetDataStreamSettingsParams, + GetDataStreamSettingsResponse, GetDataStreamDetailsParams, GetDataStreamDetailsResponse, GetIntegrationDashboardsParams, GetIntegrationDashboardsResponse, } from '../../../common/data_streams_stats'; -import { DataStreamDetails } from '../../../common/data_streams_stats'; +import { DataStreamDetails, DataStreamSettings } from '../../../common/data_streams_stats'; import { IDataStreamDetailsClient } from './types'; export class DataStreamDetailsClient implements IDataStreamDetailsClient { constructor(private readonly http: HttpStart) {} - public async getDataStreamDetails({ dataStream }: GetDataStreamDetailsParams) { + public async getDataStreamSettings({ dataStream }: GetDataStreamSettingsParams) { + const response = await this.http + .get( + `/internal/dataset_quality/data_streams/${dataStream}/settings` + ) + .catch((error) => { + throw new GetDataStreamsStatsError(`Failed to fetch data stream settings": ${error}`); + }); + + const dataStreamSettings = decodeOrThrow( + getDataStreamsSettingsResponseRt, + (message: string) => + new GetDataStreamsStatsError(`Failed to decode data stream settings response: ${message}"`) + )(response); + + return dataStreamSettings as DataStreamSettings; + } + + public async getDataStreamDetails({ dataStream, start, end }: GetDataStreamDetailsParams) { const response = await this.http .get( - `/internal/dataset_quality/data_streams/${dataStream}/details` + `/internal/dataset_quality/data_streams/${dataStream}/details`, + { + query: { start, end }, + } ) .catch((error) => { throw new GetDataStreamsStatsError(`Failed to fetch data stream details": ${error}`); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts index 068b36bab4fb1..f85e05d0179f5 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts @@ -7,6 +7,8 @@ import { HttpStart } from '@kbn/core/public'; import { + GetDataStreamSettingsParams, + DataStreamSettings, GetDataStreamDetailsParams, DataStreamDetails, GetIntegrationDashboardsParams, @@ -24,6 +26,7 @@ export interface DataStreamDetailsServiceStartDeps { } export interface IDataStreamDetailsClient { + getDataStreamSettings(params: GetDataStreamSettingsParams): Promise; getDataStreamDetails(params: GetDataStreamDetailsParams): Promise; getIntegrationDashboards( params: GetIntegrationDashboardsParams diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/notifications.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/notifications.ts index 4d399552ec5e8..3d88e6645fe47 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/notifications.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/notifications.ts @@ -26,6 +26,15 @@ export const fetchDatasetDetailsFailedNotifier = (toasts: IToasts, error: Error) }); }; +export const fetchDatasetSettingsFailedNotifier = (toasts: IToasts, error: Error) => { + toasts.addDanger({ + title: i18n.translate('xpack.datasetQuality.fetchDatasetSettingsFailed', { + defaultMessage: "Dataset settings couldn't be loaded.", + }), + text: error.message, + }); +}; + export const fetchDegradedStatsFailedNotifier = (toasts: IToasts, error: Error) => { toasts.addDanger({ title: i18n.translate('xpack.datasetQuality.fetchDegradedStatsFailed', { diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts index 39d630a7aa770..f13e2c7340851 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts @@ -12,6 +12,7 @@ import { Integration } from '../../../../common/data_streams_stats/integration'; import { IDataStreamDetailsClient } from '../../../services/data_stream_details'; import { DashboardType, + DataStreamSettings, DataStreamDetails, DataStreamStat, GetDataStreamsStatsQuery, @@ -24,6 +25,7 @@ import { IDataStreamsStatsClient } from '../../../services/data_streams_stats'; import { generateDatasets } from '../../../utils'; import { DEFAULT_CONTEXT } from './defaults'; import { + fetchDatasetSettingsFailedNotifier, fetchDatasetDetailsFailedNotifier, fetchDatasetStatsFailedNotifier, fetchDegradedStatsFailedNotifier, @@ -173,6 +175,27 @@ export const createPureDatasetQualityControllerStateMachine = ( initializing: { type: 'parallel', states: { + dataStreamSettings: { + initial: 'fetching', + states: { + fetching: { + invoke: { + src: 'loadDataStreamSettings', + onDone: { + target: 'done', + actions: ['storeDataStreamSettings'], + }, + onError: { + target: 'done', + actions: ['notifyFetchDatasetSettingsFailed'], + }, + }, + }, + done: { + type: 'final', + }, + }, + }, dataStreamDetails: { initial: 'fetching', states: { @@ -185,12 +208,20 @@ export const createPureDatasetQualityControllerStateMachine = ( }, onError: { target: 'done', - actions: ['fetchDatasetDetailsFailedNotifier'], + actions: ['notifyFetchDatasetDetailsFailed'], }, }, }, done: { - type: 'final', + on: { + UPDATE_INSIGHTS_TIME_RANGE: { + target: 'fetching', + actions: ['storeFlyoutOptions'], + }, + BREAKDOWN_FIELD_CHANGE: { + actions: ['storeFlyoutOptions'], + }, + }, }, }, }, @@ -226,12 +257,6 @@ export const createPureDatasetQualityControllerStateMachine = ( target: 'closed', actions: ['resetFlyoutOptions'], }, - UPDATE_INSIGHTS_TIME_RANGE: { - actions: ['storeFlyoutOptions'], - }, - BREAKDOWN_FIELD_CHANGE: { - actions: ['storeFlyoutOptions'], - }, }, }, closed: { @@ -328,28 +353,25 @@ export const createPureDatasetQualityControllerStateMachine = ( : {}; }), storeFlyoutOptions: assign((context, event) => { - return 'dataset' in event - ? { - flyout: { - ...context.flyout, - dataset: event.dataset as FlyoutDataset, - }, - } - : 'timeRange' in event - ? { - flyout: { - ...context.flyout, - insightsTimeRange: event.timeRange, - }, - } - : 'breakdownField' in event - ? { - flyout: { - ...context.flyout, - breakdownField: event.breakdownField ?? undefined, - }, - } - : {}; + const insightsTimeRange = + 'timeRange' in event + ? event.timeRange + : context.flyout?.insightsTimeRange ?? context.filters?.timeRange; + const dataset = + 'dataset' in event ? (event.dataset as FlyoutDataset) : context.flyout?.dataset; + const breakdownField = + 'breakdownField' in event + ? event.breakdownField ?? undefined + : context.flyout?.breakdownField; + + return { + flyout: { + ...context.flyout, + dataset, + insightsTimeRange, + breakdownField, + }, + }; }), resetFlyoutOptions: assign((_context, _event) => ({ flyout: undefined })), storeDataStreamStats: assign((_context, event) => { @@ -366,6 +388,16 @@ export const createPureDatasetQualityControllerStateMachine = ( } : {}; }), + storeDataStreamSettings: assign((context, event) => { + return 'data' in event + ? { + flyout: { + ...context.flyout, + datasetSettings: (event.data ?? {}) as DataStreamSettings, + }, + } + : {}; + }), storeDatasetDetails: assign((context, event) => { return 'data' in event ? { @@ -438,6 +470,8 @@ export const createDatasetQualityControllerStateMachine = ({ fetchDatasetStatsFailedNotifier(toasts, event.data), notifyFetchDegradedStatsFailed: (_context, event: DoneInvokeEvent) => fetchDegradedStatsFailedNotifier(toasts, event.data), + notifyFetchDatasetSettingsFailed: (_context, event: DoneInvokeEvent) => + fetchDatasetSettingsFailedNotifier(toasts, event.data), notifyFetchDatasetDetailsFailed: (_context, event: DoneInvokeEvent) => fetchDatasetDetailsFailedNotifier(toasts, event.data), notifyFetchIntegrationDashboardsFailed: (_context, event: DoneInvokeEvent) => @@ -466,14 +500,34 @@ export const createDatasetQualityControllerStateMachine = ({ type: context.type as GetIntegrationsParams['query']['type'], }); }, - loadDataStreamDetails: (context) => { + loadDataStreamSettings: (context) => { if (!context.flyout.dataset) { + fetchDatasetSettingsFailedNotifier(toasts, new Error(noDatasetSelected)); + + return Promise.resolve({}); + } + + const { type, name: dataset, namespace } = context.flyout.dataset; + + return dataStreamDetailsClient.getDataStreamSettings({ + dataStream: dataStreamPartsToIndexName({ + type: type as DataStreamType, + dataset, + namespace, + }), + }); + }, + loadDataStreamDetails: (context) => { + if (!context.flyout.dataset || !context.flyout.insightsTimeRange) { fetchDatasetDetailsFailedNotifier(toasts, new Error(noDatasetSelected)); return Promise.resolve({}); } const { type, name: dataset, namespace } = context.flyout.dataset; + const { startDate: start, endDate: end } = getDateISORange( + context.flyout.insightsTimeRange + ); return dataStreamDetailsClient.getDataStreamDetails({ dataStream: dataStreamPartsToIndexName({ @@ -481,6 +535,8 @@ export const createDatasetQualityControllerStateMachine = ({ dataset, namespace, }), + start, + end, }); }, loadIntegrationDashboards: (context) => { diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts index 5af18adf8313d..3cfb3e9c5a548 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts @@ -13,11 +13,12 @@ import { DegradedDocsStat } from '../../../../common/data_streams_stats/malforme import { DashboardType, DataStreamDegradedDocsStatServiceResponse, + DataStreamSettings, DataStreamDetails, DataStreamStatServiceResponse, IntegrationsResponse, + DataStreamStat, } from '../../../../common/data_streams_stats'; -import { DataStreamStat } from '../../../../common/data_streams_stats/data_stream_stat'; export type FlyoutDataset = Omit< DataStreamStat, @@ -53,6 +54,7 @@ export interface WithTableOptions { export interface WithFlyoutOptions { flyout: { dataset?: FlyoutDataset; + datasetSettings?: DataStreamSettings; datasetDetails?: DataStreamDetails; insightsTimeRange?: TimeRangeConfig; breakdownField?: string; @@ -103,14 +105,6 @@ export type DatasetQualityControllerTypeState = value: 'datasets.loaded.idle'; context: DefaultDatasetQualityStateContext; } - | { - value: 'datasets.loaded.flyoutOpen.fetching'; - context: DefaultDatasetQualityStateContext; - } - | { - value: 'datasets.loaded.flyoutOpen'; - context: DefaultDatasetQualityStateContext; - } | { value: 'degradedDocs.fetching'; context: DefaultDatasetQualityStateContext; @@ -123,6 +117,10 @@ export type DatasetQualityControllerTypeState = value: 'integrations.fetching'; context: DefaultDatasetQualityStateContext; } + | { + value: 'flyout.initializing.dataStreamSettings.fetching'; + context: DefaultDatasetQualityStateContext; + } | { value: 'flyout.initializing.dataStreamDetails.fetching'; context: DefaultDatasetQualityStateContext; @@ -185,6 +183,8 @@ export type DatasetQualityControllerEvent = } | DoneInvokeEvent | DoneInvokeEvent + | DoneInvokeEvent + | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/types.ts index b9755a8c28628..7da7875978740 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/types.ts @@ -12,8 +12,10 @@ import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; -import type { DatasetQualityProps } from './components/dataset_quality'; +import type { ObservabilitySharedPluginSetup } from '@kbn/observability-shared-plugin/public'; + import type { CreateDatasetQualityController } from './controller'; +import type { DatasetQualityProps } from './components/dataset_quality'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface DatasetQualityPluginSetup {} @@ -30,6 +32,7 @@ export interface DatasetQualityStartDeps { unifiedSearch: UnifiedSearchPublicPluginStart; lens: LensPublicStart; dataViews: DataViewsPublicPluginStart; + observabilityShared: ObservabilitySharedPluginSetup; } export interface DatasetQualitySetupDeps { diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_details.test.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_details.test.ts index faaf3d1c44b6f..1b850ff2c9fd9 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_details.test.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_details.test.ts @@ -5,203 +5,175 @@ * 2.0. */ +import { SearchTotalHitsRelation } from '@elastic/elasticsearch/lib/api/types'; import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; +import { + findInventoryFields, + InventoryItemType, + inventoryModels, +} from '@kbn/metrics-data-access-plugin/common'; import { getDataStreamDetails } from '.'; const accessLogsDataStream = 'logs-nginx.access-default'; const errorLogsDataStream = 'logs-nginx.error-default'; -const dateStr1 = '1702998651925'; // .ds-logs-nginx.access-default-2023.12.19-000001 -const dateStr2 = '1703110671019'; // .ds-logs-nginx.access-default-2023.12.20-000002 -const dateStr3 = '1702998866744'; // .ds-logs-nginx.error-default-2023.12.19-000001 + +const defaultSummaryStats = { + degradedDocsCount: 98841, + docsCount: 617680, + hosts: { + 'aws.rds.db_instance.arn': [], + 'aws.s3.bucket.name': [], + 'aws.sqs.queue.name': [], + 'cloud.instance.id': ['0000000000009121', '0000000000009127', '0000000000009133'], + 'container.id': [], + 'host.name': ['synth-host'], + 'kubernetes.pod.uid': [], + }, + services: { + 'service.name': ['synth-service-0', 'synth-service-1', 'synth-service-2'], + }, + sizeBytes: 72596354, +}; + +const start = Number(new Date('2020-01-01T00:00:00.000Z')); +const end = Number(new Date('2020-01-30T00:00:00.000Z')); describe('getDataStreamDetails', () => { afterAll(() => { jest.clearAllMocks(); }); - it('throws error if index is not found', async () => { + it('returns {} if index is not found', async () => { const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); esClientMock.indices.getSettings.mockRejectedValue(MOCK_INDEX_ERROR); + esClientMock.search.mockRejectedValue(MOCK_INDEX_ERROR); + + const dataStreamDetails = await getDataStreamDetails({ + esClient: esClientMock, + dataStream: 'non-existent', + start, + end, + }); - try { - await getDataStreamDetails({ - esClient: esClientMock, - dataStream: 'non-existent', - }); - } catch (e) { - expect(e).toBe(MOCK_INDEX_ERROR); - } + expect(dataStreamDetails).toEqual({}); }); - it('returns creation date of a data stream', async () => { + it('returns summary of a data stream', async () => { const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - esClientMock.indices.getSettings.mockReturnValue( - Promise.resolve(MOCK_NGINX_ERROR_INDEX_SETTINGS) - ); + esClientMock.indices.stats.mockReturnValue(Promise.resolve(MOCK_STATS_RESPONSE)); + esClientMock.search.mockReturnValue(Promise.resolve(MOCK_SEARCH_RESPONSE)); const dataStreamDetails = await getDataStreamDetails({ esClient: esClientMock, dataStream: errorLogsDataStream, + start, + end, }); - expect(dataStreamDetails).toEqual({ createdOn: Number(dateStr3) }); + + expect(dataStreamDetails).toEqual(defaultSummaryStats); }); - it('returns the earliest creation date of a data stream with multiple backing indices', async () => { + it('returns the correct service.name list', async () => { const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - esClientMock.indices.getSettings.mockReturnValue( - Promise.resolve(MOCK_NGINX_ACCESS_INDEX_SETTINGS) + esClientMock.indices.stats.mockReturnValue(Promise.resolve(MOCK_STATS_RESPONSE)); + + const serviceName = 'service.name'; + const testServiceName = ['tst-srv-0', 'tst-srv-1']; + const mockSearchResponse = { ...MOCK_SEARCH_RESPONSE }; + mockSearchResponse.aggregations[serviceName].buckets = testServiceName.map((name) => ({ + key: name, + doc_count: 1, + })); + esClientMock.search.mockReturnValue(Promise.resolve(MOCK_SEARCH_RESPONSE)); + + const dataStreamDetails = await getDataStreamDetails({ + esClient: esClientMock, + dataStream: accessLogsDataStream, + start, + end, + }); + expect(dataStreamDetails.services).toEqual({ [serviceName]: testServiceName }); + }); + + it('returns the correct host.name list', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + esClientMock.indices.stats.mockReturnValue(Promise.resolve(MOCK_STATS_RESPONSE)); + + const hostName = 'host.name'; + const testHostName = ['tst-host-0', 'tst-host-1']; + const hostFields = inventoryModels.map( + (model) => findInventoryFields(model.id as InventoryItemType).id ); + const mockSearchResponse = { ...MOCK_SEARCH_RESPONSE }; + // Make all hosts buckets to [] + hostFields.forEach((field) => { + mockSearchResponse.aggregations[field as 'host.name'] = { buckets: [] } as any; + }); + + // Set the host.name buckets to testHostName + mockSearchResponse.aggregations[hostName].buckets = testHostName.map((name) => ({ + key: name, + doc_count: 1, + })); + + esClientMock.search.mockReturnValue(Promise.resolve(MOCK_SEARCH_RESPONSE)); + const dataStreamDetails = await getDataStreamDetails({ esClient: esClientMock, dataStream: accessLogsDataStream, + start, + end, }); - expect(dataStreamDetails).toEqual({ createdOn: Number(dateStr1) }); + + // Expect all host fields to be empty + const emptyHosts = hostFields.reduce((acc, field) => ({ ...acc, [field]: [] }), {}); + + expect(dataStreamDetails.hosts).toEqual({ ...emptyHosts, [hostName]: testHostName }); }); -}); -const MOCK_NGINX_ACCESS_INDEX_SETTINGS = { - [`.ds-${accessLogsDataStream}-2023.12.19-000001`]: { - settings: { - index: { - mapping: { - total_fields: { - limit: 10000, - }, - ignore_malformed: true, - }, - hidden: true, - provided_name: '.ds-logs-nginx.access-default-2023.12.19-000001', - final_pipeline: '.fleet_final_pipeline-1', - query: { - default_field: [ - 'cloud.account.id', - 'cloud.availability_zone', - 'cloud.instance.id', - 'cloud.instance.name', - 'cloud.machine.type', - 'cloud.provider', - 'cloud.region', - ], - }, - creation_date: dateStr1, - number_of_replicas: '1', - uuid: 'uml9fMQqQUibZi2pKkc5sQ', - version: { - created: '8500007', - }, - lifecycle: { - name: 'logs', - indexing_complete: true, - }, - codec: 'best_compression', - routing: { - allocation: { - include: { - _tier_preference: 'data_hot', - }, - }, - }, - number_of_shards: '1', - default_pipeline: 'logs-nginx.access-1.17.0', - }, - }, - }, - [`.ds-${accessLogsDataStream}-2023.12.20-000002`]: { - settings: { - index: { - mapping: { - total_fields: { - limit: 10000, - }, - ignore_malformed: true, - }, - hidden: true, - provided_name: '.ds-logs-nginx.access-default-2023.12.20-000002', - final_pipeline: '.fleet_final_pipeline-1', - query: { - default_field: [ - 'user.name', - 'user_agent.device.name', - 'user_agent.name', - 'user_agent.original', - 'user_agent.os.full', - 'user_agent.os.name', - 'user_agent.os.version', - 'user_agent.version', - 'nginx.access.remote_ip_list', - ], - }, - creation_date: dateStr2, - number_of_replicas: '1', - uuid: 'il9vJlOXRdiv44wU6WNtUQ', - version: { - created: '8500007', - }, - lifecycle: { - name: 'logs', - }, - codec: 'best_compression', - routing: { - allocation: { - include: { - _tier_preference: 'data_hot', - }, - }, - }, - number_of_shards: '1', - default_pipeline: 'logs-nginx.access-1.17.0', - }, - }, - }, -}; + it('returns correct size in bytes', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); -const MOCK_NGINX_ERROR_INDEX_SETTINGS = { - [`.ds-${errorLogsDataStream}-2023.12.19-000001`]: { - settings: { - index: { - mapping: { - total_fields: { - limit: 10000, - }, - ignore_malformed: true, - }, - hidden: true, - provided_name: '.ds-logs-nginx.error-default-2023.12.19-000001', - final_pipeline: '.fleet_final_pipeline-1', - query: { - default_field: [ - 'host.type', - 'input.type', - 'log.file.path', - 'log.level', - 'ecs.version', - 'message', - 'tags', - ], - }, - creation_date: dateStr3, - number_of_replicas: '1', - uuid: 'fGPYUppSRU62MZ3toF0MkQ', - version: { - created: '8500007', - }, - lifecycle: { - name: 'logs', - }, - codec: 'best_compression', - routing: { - allocation: { - include: { - _tier_preference: 'data_hot', - }, - }, - }, - number_of_shards: '1', - default_pipeline: 'logs-nginx.error-1.17.0', - }, - }, - }, -}; + const docsCount = 536; + const storeDocsCount = 1220; + const storeSizeInBytes = 2048; + const expectedSizeInBytes = Math.ceil((storeSizeInBytes / storeDocsCount) * docsCount); + + const testStatsResponse = { ...MOCK_STATS_RESPONSE }; + testStatsResponse._all.total.docs.count = storeDocsCount; + testStatsResponse._all.total.store.size_in_bytes = storeSizeInBytes; + esClientMock.indices.stats.mockReturnValue(Promise.resolve(testStatsResponse)); + + const mockSearchResponse = { ...MOCK_SEARCH_RESPONSE }; + mockSearchResponse.aggregations.total_count.value = docsCount; + esClientMock.search.mockReturnValue(Promise.resolve(mockSearchResponse)); + + const dataStreamDetails = await getDataStreamDetails({ + esClient: esClientMock, + dataStream: accessLogsDataStream, + start, + end, + }); + expect(dataStreamDetails.sizeBytes).toEqual(expectedSizeInBytes); + }); + + // This covers https://github.com/elastic/kibana/issues/178954 + it('returns size as NaN for when sizeStatsAvailable is false (serverless mode)', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + + esClientMock.indices.stats.mockReturnValue(Promise.resolve(MOCK_STATS_RESPONSE)); + esClientMock.search.mockReturnValue(Promise.resolve(MOCK_SEARCH_RESPONSE)); + + const dataStreamDetails = await getDataStreamDetails({ + esClient: esClientMock, + dataStream: accessLogsDataStream, + start, + end, + sizeStatsAvailable: false, + }); + expect(dataStreamDetails.sizeBytes).toBeNaN(); + }); +}); const MOCK_INDEX_ERROR = { error: { @@ -222,5 +194,142 @@ const MOCK_INDEX_ERROR = { index_uuid: '_na_', index: 'logs-nginx.error-default-01', }, - status: 404, + statusCode: 404, +}; + +const MOCK_SEARCH_RESPONSE = { + took: 2, + timed_out: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + total: { + value: 10000, + relation: 'gte' as SearchTotalHitsRelation, + }, + max_score: null, + hits: [], + }, + aggregations: { + total_count: { + value: 617680, + }, + degraded_count: { + doc_count: 98841, + }, + 'service.name': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'synth-service-0', + doc_count: 206116, + }, + { + key: 'synth-service-1', + doc_count: 206012, + }, + { + key: 'synth-service-2', + doc_count: 205552, + }, + ], + }, + 'host.name': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'synth-host', + doc_count: 617680, + }, + ], + }, + 'kubernetes.pod.uid': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + 'container.id': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + 'cloud.instance.id': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 614630, + buckets: [ + { + key: '0000000000009121', + doc_count: 61, + }, + { + key: '0000000000009127', + doc_count: 61, + }, + { + key: '0000000000009133', + doc_count: 61, + }, + ], + }, + 'aws.s3.bucket.name': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + 'aws.rds.db_instance.arn': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + 'aws.sqs.queue.name': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + }, +}; + +const MOCK_STATS_RESPONSE = { + _shards: { + total: 2, + successful: 2, + failed: 0, + }, + _all: { + primaries: {}, + total: { + docs: { + count: 1235360, + deleted: 0, + }, + shard_stats: { + total_count: 2, + }, + store: { + size_in_bytes: 145192707, + total_data_set_size_in_bytes: 145192707, + reserved_in_bytes: 0, + }, + indexing: { + index_total: 1235059, + index_time_in_millis: 98509, + index_current: 0, + index_failed: 0, + delete_total: 0, + delete_time_in_millis: 0, + delete_current: 0, + noop_update_total: 0, + is_throttled: false, + throttle_time_in_millis: 0, + write_load: 0.00022633763414114222, + }, + }, + }, + indices: {}, }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_settings.test.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_settings.test.ts new file mode 100644 index 0000000000000..dd2548d033c71 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/get_data_stream_settings.test.ts @@ -0,0 +1,227 @@ +/* + * 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 { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; + +import { getDataStreamSettings } from '.'; +const accessLogsDataStream = 'logs-nginx.access-default'; +const errorLogsDataStream = 'logs-nginx.error-default'; +const dateStr1 = '1702998651925'; // .ds-logs-nginx.access-default-2023.12.19-000001 +const dateStr2 = '1703110671019'; // .ds-logs-nginx.access-default-2023.12.20-000002 +const dateStr3 = '1702998866744'; // .ds-logs-nginx.error-default-2023.12.19-000001 + +describe('getDataStreamSettings', () => { + afterAll(() => { + jest.clearAllMocks(); + }); + + it('throws error if index is not found', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + esClientMock.indices.getSettings.mockRejectedValue(MOCK_INDEX_ERROR); + + try { + await getDataStreamSettings({ + esClient: esClientMock, + dataStream: 'non-existent', + }); + } catch (e) { + expect(e).toBe(MOCK_INDEX_ERROR); + } + }); + + it('returns creation date of a data stream', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + esClientMock.indices.getSettings.mockReturnValue( + Promise.resolve(MOCK_NGINX_ERROR_INDEX_SETTINGS) + ); + + const dataStreamSettings = await getDataStreamSettings({ + esClient: esClientMock, + dataStream: errorLogsDataStream, + }); + expect(dataStreamSettings).toEqual({ createdOn: Number(dateStr3) }); + }); + + it('returns the earliest creation date of a data stream with multiple backing indices', async () => { + const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); + esClientMock.indices.getSettings.mockReturnValue( + Promise.resolve(MOCK_NGINX_ACCESS_INDEX_SETTINGS) + ); + + const dataStreamSettings = await getDataStreamSettings({ + esClient: esClientMock, + dataStream: accessLogsDataStream, + }); + expect(dataStreamSettings).toEqual({ createdOn: Number(dateStr1) }); + }); +}); + +const MOCK_NGINX_ACCESS_INDEX_SETTINGS = { + [`.ds-${accessLogsDataStream}-2023.12.19-000001`]: { + settings: { + index: { + mapping: { + total_fields: { + limit: 10000, + }, + ignore_malformed: true, + }, + hidden: true, + provided_name: '.ds-logs-nginx.access-default-2023.12.19-000001', + final_pipeline: '.fleet_final_pipeline-1', + query: { + default_field: [ + 'cloud.account.id', + 'cloud.availability_zone', + 'cloud.instance.id', + 'cloud.instance.name', + 'cloud.machine.type', + 'cloud.provider', + 'cloud.region', + ], + }, + creation_date: dateStr1, + number_of_replicas: '1', + uuid: 'uml9fMQqQUibZi2pKkc5sQ', + version: { + created: '8500007', + }, + lifecycle: { + name: 'logs', + indexing_complete: true, + }, + codec: 'best_compression', + routing: { + allocation: { + include: { + _tier_preference: 'data_hot', + }, + }, + }, + number_of_shards: '1', + default_pipeline: 'logs-nginx.access-1.17.0', + }, + }, + }, + [`.ds-${accessLogsDataStream}-2023.12.20-000002`]: { + settings: { + index: { + mapping: { + total_fields: { + limit: 10000, + }, + ignore_malformed: true, + }, + hidden: true, + provided_name: '.ds-logs-nginx.access-default-2023.12.20-000002', + final_pipeline: '.fleet_final_pipeline-1', + query: { + default_field: [ + 'user.name', + 'user_agent.device.name', + 'user_agent.name', + 'user_agent.original', + 'user_agent.os.full', + 'user_agent.os.name', + 'user_agent.os.version', + 'user_agent.version', + 'nginx.access.remote_ip_list', + ], + }, + creation_date: dateStr2, + number_of_replicas: '1', + uuid: 'il9vJlOXRdiv44wU6WNtUQ', + version: { + created: '8500007', + }, + lifecycle: { + name: 'logs', + }, + codec: 'best_compression', + routing: { + allocation: { + include: { + _tier_preference: 'data_hot', + }, + }, + }, + number_of_shards: '1', + default_pipeline: 'logs-nginx.access-1.17.0', + }, + }, + }, +}; + +const MOCK_NGINX_ERROR_INDEX_SETTINGS = { + [`.ds-${errorLogsDataStream}-2023.12.19-000001`]: { + settings: { + index: { + mapping: { + total_fields: { + limit: 10000, + }, + ignore_malformed: true, + }, + hidden: true, + provided_name: '.ds-logs-nginx.error-default-2023.12.19-000001', + final_pipeline: '.fleet_final_pipeline-1', + query: { + default_field: [ + 'host.type', + 'input.type', + 'log.file.path', + 'log.level', + 'ecs.version', + 'message', + 'tags', + ], + }, + creation_date: dateStr3, + number_of_replicas: '1', + uuid: 'fGPYUppSRU62MZ3toF0MkQ', + version: { + created: '8500007', + }, + lifecycle: { + name: 'logs', + }, + codec: 'best_compression', + routing: { + allocation: { + include: { + _tier_preference: 'data_hot', + }, + }, + }, + number_of_shards: '1', + default_pipeline: 'logs-nginx.error-1.17.0', + }, + }, + }, +}; + +const MOCK_INDEX_ERROR = { + error: { + root_cause: [ + { + type: 'index_not_found_exception', + reason: 'no such index [logs-nginx.error-default-01]', + 'resource.type': 'index_or_alias', + 'resource.id': 'logs-nginx.error-default-01', + index_uuid: '_na_', + index: 'logs-nginx.error-default-01', + }, + ], + type: 'index_not_found_exception', + reason: 'no such index [logs-nginx.error-default-01]', + 'resource.type': 'index_or_alias', + 'resource.id': 'logs-nginx.error-default-01', + index_uuid: '_na_', + index: 'logs-nginx.error-default-01', + }, + status: 404, +}; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts index 65fa54babcc30..c6ee429c27f96 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts @@ -7,28 +7,163 @@ import { badRequest } from '@hapi/boom'; import type { ElasticsearchClient } from '@kbn/core/server'; -import { DataStreamDetails } from '../../../../common/api_types'; +import { + findInventoryFields, + InventoryItemType, + inventoryModels, +} from '@kbn/metrics-data-access-plugin/common'; +import { rangeQuery } from '@kbn/observability-plugin/server'; + +import { MAX_HOSTS_METRIC_VALUE } from '../../../../common/constants'; +import { _IGNORED } from '../../../../common/es_fields'; +import { DataStreamDetails, DataStreamSettings } from '../../../../common/api_types'; +import { createDatasetQualityESClient } from '../../../utils'; import { dataStreamService } from '../../../services'; -export async function getDataStreamDetails(args: { +export async function getDataStreamSettings({ + esClient, + dataStream, +}: { + esClient: ElasticsearchClient; + dataStream: string; +}): Promise { + throwIfInvalidDataStreamParams(dataStream); + + const createdOn = await getDataStreamCreatedOn(esClient, dataStream); + + return { + createdOn, + }; +} + +export async function getDataStreamDetails({ + esClient, + dataStream, + start, + end, + sizeStatsAvailable = true, +}: { esClient: ElasticsearchClient; dataStream: string; + start: number; + end: number; + sizeStatsAvailable?: boolean; // Only Needed to determine whether `_stats` endpoint is available https://github.com/elastic/kibana/issues/178954 }): Promise { - const { esClient, dataStream } = args; + throwIfInvalidDataStreamParams(dataStream); - if (!dataStream?.trim()) { - throw badRequest(`Data Stream name cannot be empty. Received value "${dataStream}"`); + try { + const dataStreamSummaryStats = await getDataStreamSummaryStats( + esClient, + dataStream, + start, + end + ); + + const whenSizeStatsNotAvailable = NaN; // This will indicate size cannot be calculated + const avgDocSizeInBytes = sizeStatsAvailable + ? dataStreamSummaryStats.docsCount > 0 + ? await getAvgDocSizeInBytes(esClient, dataStream) + : 0 + : whenSizeStatsNotAvailable; + const sizeBytes = Math.ceil(avgDocSizeInBytes * dataStreamSummaryStats.docsCount); + + return { + ...dataStreamSummaryStats, + sizeBytes, + }; + } catch (e) { + // Respond with empty object if data stream does not exist + if (e.statusCode === 404) { + return {}; + } + throw e; } +} +async function getDataStreamCreatedOn(esClient: ElasticsearchClient, dataStream: string) { const indexSettings = await dataStreamService.getDataSteamIndexSettings(esClient, dataStream); const indexesList = Object.values(indexSettings); - const indexCreationDate = indexesList + return indexesList .map((index) => Number(index.settings?.index?.creation_date)) .sort((a, b) => a - b)[0]; +} + +type TermAggregation = Record; + +const MAX_HOSTS = MAX_HOSTS_METRIC_VALUE + 1; // Adding 1 so that we can show e.g. '50+' + +// Gather service.name terms +const serviceNamesAgg: TermAggregation = { + ['service.name']: { terms: { field: 'service.name', size: MAX_HOSTS } }, +}; + +// Gather host terms like 'host', 'pod', 'container' +const hostsAgg: TermAggregation = inventoryModels + .map((model) => findInventoryFields(model.id as InventoryItemType)) + .reduce( + (acc, fields) => ({ ...acc, [fields.id]: { terms: { field: fields.id, size: MAX_HOSTS } } }), + {} as TermAggregation + ); + +async function getDataStreamSummaryStats( + esClient: ElasticsearchClient, + dataStream: string, + start: number, + end: number +): Promise<{ + docsCount: number; + degradedDocsCount: number; + services: Record; + hosts: Record; +}> { + const datasetQualityESClient = createDatasetQualityESClient(esClient); + + const response = await datasetQualityESClient.search({ + index: dataStream, + query: rangeQuery(start, end)[0], + size: 0, + aggs: { + total_count: { + value_count: { field: '_index' }, + }, + degraded_count: { + filter: { exists: { field: _IGNORED } }, + }, + ...serviceNamesAgg, + ...hostsAgg, + }, + }); + + const docsCount = Number(response.aggregations?.total_count.value ?? 0); + const degradedDocsCount = Number(response.aggregations?.degraded_count.doc_count ?? 0); return { - createdOn: indexCreationDate, + docsCount, + degradedDocsCount, + services: getTermsFromAgg(serviceNamesAgg, response.aggregations), + hosts: getTermsFromAgg(hostsAgg, response.aggregations), }; } + +async function getAvgDocSizeInBytes(esClient: ElasticsearchClient, index: string) { + const indexStats = await esClient.indices.stats({ index }); + const docCount = indexStats._all.total?.docs?.count ?? 0; + const sizeInBytes = indexStats._all.total?.store?.size_in_bytes ?? 0; + + return docCount ? sizeInBytes / docCount : 0; +} + +function getTermsFromAgg(termAgg: TermAggregation, aggregations: any) { + return Object.entries(termAgg).reduce((acc, [key, _value]) => { + const values = aggregations[key]?.buckets.map((bucket: any) => bucket.key) as string[]; + return { ...acc, [key]: values }; + }, {}); +} + +function throwIfInvalidDataStreamParams(dataStream?: string) { + if (!dataStream?.trim()) { + throw badRequest(`Data Stream name cannot be empty. Received value "${dataStream}"`); + } +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts index a8475ed8cc8ef..6dd8590c91f0b 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts @@ -7,16 +7,17 @@ import * as t from 'io-ts'; import { keyBy, merge, values } from 'lodash'; -import { DataStreamType } from '../../../common/types'; import { DataStreamDetails, DataStreamsEstimatedDataInBytes, + DataStreamSettings, DataStreamStat, DegradedDocs, } from '../../../common/api_types'; +import { indexNameToDataStreamParts } from '../../../common/utils'; import { rangeRt, typeRt } from '../../types/default_api_types'; import { createDatasetQualityServerRoute } from '../create_datasets_quality_server_route'; -import { getDataStreamDetails } from './get_data_stream_details'; +import { getDataStreamDetails, getDataStreamSettings } from './get_data_stream_details'; import { getDataStreams } from './get_data_streams'; import { getDataStreamsStats } from './get_data_streams_stats'; import { getDegradedDocsPaginated } from './get_degraded_docs'; @@ -94,37 +95,71 @@ const degradedDocsRoute = createDatasetQualityServerRoute({ }, }); +const dataStreamSettingsRoute = createDatasetQualityServerRoute({ + endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', + params: t.type({ + path: t.type({ + dataStream: t.string, + }), + }), + options: { + tags: [], + }, + async handler(resources): Promise { + const { context, params } = resources; + const { dataStream } = params.path; + const coreContext = await context.core; + + // Query datastreams as the current user as the Kibana internal user may not have all the required permissions + const esClient = coreContext.elasticsearch.client.asCurrentUser; + + const dataStreamSettings = await getDataStreamSettings({ + esClient, + dataStream, + }); + + return dataStreamSettings; + }, +}); + const dataStreamDetailsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/details', params: t.type({ path: t.type({ dataStream: t.string, }), + query: rangeRt, }), options: { tags: [], }, async handler(resources): Promise { - const { context, params } = resources; + const { context, params, getEsCapabilities } = resources; const { dataStream } = params.path; + const { start, end } = params.query; const coreContext = await context.core; // Query datastreams as the current user as the Kibana internal user may not have all the required permissions const esClient = coreContext.elasticsearch.client.asCurrentUser; - const [type, ...datasetQuery] = dataStream.split('-'); + const { type, dataset, namespace } = indexNameToDataStreamParts(dataStream); + const sizeStatsAvailable = !(await getEsCapabilities()).serverless; const [dataStreamsStats, dataStreamDetails] = await Promise.all([ getDataStreamsStats({ esClient, - type: type as DataStreamType, - datasetQuery: datasetQuery.join('-'), + type, + datasetQuery: `${dataset}-${namespace}`, }), - getDataStreamDetails({ esClient, dataStream }), + getDataStreamDetails({ esClient, dataStream, start, end, sizeStatsAvailable }), ]); return { - createdOn: dataStreamDetails?.createdOn, + docsCount: dataStreamDetails?.docsCount, + degradedDocsCount: dataStreamDetails?.degradedDocsCount, + services: dataStreamDetails?.services, + hosts: dataStreamDetails?.hosts, + sizeBytes: dataStreamDetails?.sizeBytes, lastActivity: dataStreamsStats.items?.[0]?.lastActivity, }; }, @@ -166,5 +201,6 @@ export const dataStreamsRouteRepository = { ...statsRoute, ...degradedDocsRoute, ...dataStreamDetailsRoute, + ...dataStreamSettingsRoute, ...estimatedDataInBytesRoute, }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json b/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json index 461c69492c852..58b8cfaf987e2 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json +++ b/x-pack/plugins/observability_solution/dataset_quality/tsconfig.json @@ -26,7 +26,6 @@ "@kbn/shared-ux-utility", "@kbn/ui-theme", "@kbn/core-notifications-browser", - "@kbn/formatters", "@kbn/data-service", "@kbn/observability-shared-plugin", "@kbn/data-plugin", @@ -42,7 +41,8 @@ "@kbn/deeplinks-management", "@kbn/deeplinks-analytics", "@kbn/core-elasticsearch-server", - "@kbn/ui-actions-plugin" + "@kbn/ui-actions-plugin", + "@kbn/metrics-data-access-plugin" ], "exclude": ["target/**/*"] } diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts index 2c809802e795e..efa183d2d336b 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_details.spec.ts @@ -10,18 +10,19 @@ import expect from '@kbn/expect'; import { DatasetQualityApiClientKey } from '../../common/config'; import { DatasetQualityApiError } from '../../common/dataset_quality_api_supertest'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { expectToReject, getDataStreamSettingsOfFirstIndex } from '../../utils'; +import { expectToReject } from '../../utils'; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); const synthtrace = getService('logSynthtraceEsClient'); - const esClient = getService('es'); const datasetQualityApiClient = getService('datasetQualityApiClient'); const start = '2023-12-11T18:00:00.000Z'; const end = '2023-12-11T18:01:00.000Z'; const type = 'logs'; const dataset = 'nginx.access'; const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; async function callApiAs(user: DatasetQualityApiClientKey, dataStream: string) { return await datasetQualityApiClient[user]({ @@ -30,6 +31,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { path: { dataStream, }, + query: { + start, + end, + }, }, }); } @@ -50,6 +55,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { .namespace(namespace) .defaults({ 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, }) ), ]); @@ -71,13 +78,16 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(resp.body).empty(); }); - it('returns data stream details correctly', async () => { - const dataStreamSettings = await getDataStreamSettingsOfFirstIndex( - esClient, - `logs-${dataset}-${namespace}` - ); + it('returns "sizeBytes" correctly', async () => { + const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + expect(isNaN(resp.body.sizeBytes as number)).to.be(false); + expect(resp.body.sizeBytes).to.be.greaterThan(0); + }); + + it('returns service.name and host.name correctly', async () => { const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); - expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + expect(resp.body.services).to.eql({ ['service.name']: [serviceName] }); + expect(resp.body.hosts?.['host.name']).to.eql([hostName]); }); after(async () => { diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts new file mode 100644 index 0000000000000..e6f75d53b6c77 --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts @@ -0,0 +1,106 @@ +/* + * 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 { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { DatasetQualityApiClientKey } from '../../common/config'; +import { DatasetQualityApiError } from '../../common/dataset_quality_api_supertest'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + expectToReject, + getDataStreamSettingsOfEarliestIndex, + rolloverDataStream, +} from '../../utils'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + const synthtrace = getService('logSynthtraceEsClient'); + const esClient = getService('es'); + const datasetQualityApiClient = getService('datasetQualityApiClient'); + const start = '2023-12-11T18:00:00.000Z'; + const end = '2023-12-11T18:01:00.000Z'; + const type = 'logs'; + const dataset = 'nginx.access'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + + async function callApiAs(user: DatasetQualityApiClientKey, dataStream: string) { + return await datasetQualityApiClient[user]({ + endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', + params: { + path: { + dataStream, + }, + }, + }); + } + + registry.when('DataStream Settings', { config: 'basic' }, () => { + describe('gets the data stream settings', () => { + before(async () => { + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(dataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + + it('returns error when dataStream param is not provided', async () => { + const expectedMessage = 'Data Stream name cannot be empty'; + const err = await expectToReject(() => + callApiAs('datasetQualityLogsUser', encodeURIComponent(' ')) + ); + expect(err.res.status).to.be(400); + expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); + }); + + it('returns {} if matching data stream is not available', async () => { + const nonExistentDataSet = 'Non-existent'; + const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; + const resp = await callApiAs('datasetQualityLogsUser', nonExistentDataStream); + expect(resp.body).empty(); + }); + + it('returns "createdOn" correctly', async () => { + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + `${type}-${dataset}-${namespace}` + ); + const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + }); + + it('returns "createdOn" correctly for rolled over dataStream', async () => { + await rolloverDataStream(esClient, `${type}-${dataset}-${namespace}`); + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + `${type}-${dataset}-${namespace}` + ); + const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + }); + + after(async () => { + await synthtrace.clean(); + }); + }); + }); +} diff --git a/x-pack/test/dataset_quality_api_integration/utils/data_stream.ts b/x-pack/test/dataset_quality_api_integration/utils/data_stream.ts index ff3a3cc95d1ac..bdf5187db0725 100644 --- a/x-pack/test/dataset_quality_api_integration/utils/data_stream.ts +++ b/x-pack/test/dataset_quality_api_integration/utils/data_stream.ts @@ -7,7 +7,20 @@ import { Client } from '@elastic/elasticsearch'; -export async function getDataStreamSettingsOfFirstIndex(es: Client, name: string) { +export async function rolloverDataStream(es: Client, name: string) { + return es.indices.rollover({ alias: name }); +} + +export async function getDataStreamSettingsOfEarliestIndex(es: Client, name: string) { const matchingIndexesObj = await es.indices.getSettings({ index: name }); - return Object.values(matchingIndexesObj ?? {})[0]?.settings; + + const matchingIndexes = Object.keys(matchingIndexesObj ?? {}); + matchingIndexes.sort((a, b) => { + return ( + Number(matchingIndexesObj[a].settings?.index?.creation_date) - + Number(matchingIndexesObj[b].settings?.index?.creation_date) + ); + }); + + return matchingIndexesObj[matchingIndexes[0]].settings; } diff --git a/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts b/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts index 3c9b7596feb64..68d96070990f0 100644 --- a/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts +++ b/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts @@ -28,12 +28,14 @@ export function getLogsForDataset({ count = 1, isMalformed = false, namespace = defaultNamespace, + services, }: { dataset: string; to: moment.MomentInput; count?: number; isMalformed?: boolean; namespace?: string; + services?: string[]; }) { return timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') @@ -46,7 +48,9 @@ export function getLogsForDataset({ timestamp, dataset, MESSAGE_LOG_LEVELS[index % MESSAGE_LOG_LEVELS.length], - SERVICE_NAMES[index % SERVICE_NAMES.length], + services?.[index] ?? + services?.[index % services.length] ?? + SERVICE_NAMES[index % SERVICE_NAMES.length], CLUSTER[index % CLUSTER.length], CLOUD_PROVIDERS[index % CLOUD_PROVIDERS.length], CLOUD_REGION[index % CLOUD_REGION.length], @@ -108,7 +112,7 @@ export function createLogRecord( cloudProvider: string, cloudRegion: string, isMalformed = false, - namespace = defaultNamespace + namespace: string = defaultNamespace ): ReturnType { return log .create() diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts index d5b2f0facfb37..a0daafef466b7 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts @@ -144,6 +144,139 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid expect(datasetSelectorText).to.eql(testDatasetName); }); + it('shows summary KPIs', async () => { + await PageObjects.datasetQuality.navigateTo(); + + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summary = await PageObjects.datasetQuality.parseFlyoutKpis(); + expect(summary).to.eql({ + docsCountTotal: '0', + size: '0.0 B', + services: '0', + hosts: '0', + degradedDocs: '0', + }); + }); + + it('shows the updated KPIs', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis(); + + // Set time range to 3 days ago + const flyoutBodyContainer = await testSubjects.find( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutBody + ); + await PageObjects.datasetQuality.setDatePickerLastXUnits(flyoutBodyContainer, 3, 'd'); + + // Index 2 doc 2 days ago + const time2DaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + }) + ); + + // Index 5 degraded docs 2 days ago + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 5, + dataset: apacheAccessDatasetName, + isMalformed: true, + }) + ); + + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis(); + + expect(parseInt(summaryAfter.docsCountTotal, 10)).to.be.greaterThan( + parseInt(summaryBefore.docsCountTotal, 10) + ); + + expect(parseInt(summaryAfter.degradedDocs, 10)).to.be.greaterThan( + parseInt(summaryBefore.degradedDocs, 10) + ); + + expect(parseInt(summaryAfter.size, 10)).to.be.greaterThan(parseInt(summaryBefore.size, 10)); + expect(parseInt(summaryAfter.services, 10)).to.be.greaterThan( + parseInt(summaryBefore.services, 10) + ); + expect(parseInt(summaryAfter.hosts, 10)).to.be.greaterThan(parseInt(summaryBefore.hosts, 10)); + }); + + it('shows the right number of services', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis(); + const testServices = ['test-srv-1', 'test-srv-2']; + + // Index 2 docs with different services + const timeNow = Date.now(); + await synthtrace.index( + getLogsForDataset({ + to: timeNow, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + services: testServices, + }) + ); + + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis(); + + expect(parseInt(summaryAfter.services, 10)).to.eql( + parseInt(summaryBefore.services, 10) + testServices.length + ); + }); + + it('goes to log explorer for degraded docs when show all is clicked', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const degradedDocsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.degradedDocs}`; + await testSubjects.click(degradedDocsShowAllSelector); + await browser.switchTab(1); + + // Confirm dataset selector text in observability logs explorer + const datasetSelectorText = + await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); + expect(datasetSelectorText).to.contain(apacheAccessDatasetName); + + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); + + it('goes to infra hosts for hosts when show all is clicked', async () => { + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const hostsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.hosts}`; + await testSubjects.click(hostsShowAllSelector); + await browser.switchTab(1); + + // Confirm url contains metrics/hosts + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + expect(parsedUrl.pathname).to.contain('/app/metrics/hosts'); + }); + + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); + it('Integration actions menu is present with correct actions', async () => { const apacheAccessDatasetName = 'apache.access'; const apacheAccessDatasetHumanName = 'Apache access logs'; diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts index 1a072e622f62c..c3bc9ea3145a5 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts @@ -38,7 +38,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid datasetHealthDegraded: '0', datasetHealthGood: '3', activeDatasets: '0 of 3', - estimatedData: '0 Bytes', + estimatedData: '0.0 B', }); }); diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index cd59faf3c9053..39c361c834b1f 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -34,6 +34,8 @@ type SummaryPanelKpi = Record< string >; +type FlyoutKpi = Record<'docsCountTotal' | 'size' | 'services' | 'hosts' | 'degradedDocs', string>; + export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects(['common']); const testSubjects = getService('testSubjects'); @@ -69,6 +71,8 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv datasetQualityNamespacesSelectable: 'datasetQualityNamespacesSelectable', datasetQualityNamespacesSelectableButton: 'datasetQualityNamespacesSelectableButton', datasetQualityDatasetHealthKpi: 'datasetQualityDatasetHealthKpi', + datasetQualityFlyoutKpiValue: 'datasetQualityFlyoutKpiValue', + datasetQualityFlyoutKpiLink: 'datasetQualityFlyoutKpiLink', superDatePickerToggleQuickMenuButton: 'superDatePickerToggleQuickMenuButton', superDatePickerApplyTimeButton: 'superDatePickerApplyTimeButton', @@ -112,7 +116,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv }, async waitUntilTableLoaded() { - await find.waitForDeletedByCssSelector('.euiBasicTable-loading'); + await find.waitForDeletedByCssSelector('.euiBasicTable-loading', 20 * 1000); }, async waitUntilSummaryPanelLoaded() { @@ -235,6 +239,16 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv return testSubjects.click(testSubjectSelectors.euiFlyoutCloseButton); }, + async refreshFlyout() { + const flyoutContainer: WebElementWrapper = await testSubjects.find( + testSubjectSelectors.datasetQualityFlyoutBody + ); + const refreshButton = await flyoutContainer.findByTestSubject( + testSubjectSelectors.superDatePickerApplyTimeButton + ); + return refreshButton.click(); + }, + async getFlyoutElementsByText(selector: string, text: string) { const flyoutContainer: WebElementWrapper = await testSubjects.find( testSubjectSelectors.datasetQualityFlyout @@ -270,12 +284,46 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv return elements.length > 0; }, + // `excludeKeys` needed to circumvent `_stats` not available in Serverless https://github.com/elastic/kibana/issues/178954 + // TODO: Remove `excludeKeys` when `_stats` is available in Serverless + async parseFlyoutKpis(excludeKeys: string[] = []): Promise { + const kpiTitleAndKeys = [ + { title: texts.docsCountTotal, key: 'docsCountTotal' }, + { title: texts.size, key: 'size' }, + { title: texts.services, key: 'services' }, + { title: texts.hosts, key: 'hosts' }, + { title: texts.degradedDocs, key: 'degradedDocs' }, + ].filter((item) => !excludeKeys.includes(item.key)); + + const kpiTexts = await Promise.all( + kpiTitleAndKeys.map(async ({ title, key }) => ({ + key, + value: await testSubjects.getVisibleText( + `${testSubjectSelectors.datasetQualityFlyoutKpiValue}-${title}` + ), + })) + ); + + return kpiTexts.reduce( + (acc, { key, value }) => ({ + ...acc, + [key]: value, + }), + {} as FlyoutKpi + ); + }, + async setDatePickerLastXUnits( container: WebElementWrapper, timeValue: number, unit: TimeUnitId ) { - await testSubjects.click(testSubjectSelectors.superDatePickerToggleQuickMenuButton); + // Only click the menu button found under the provided container + const datePickerToggleQuickMenuButton = await container.findByTestSubject( + testSubjectSelectors.superDatePickerToggleQuickMenuButton + ); + await datePickerToggleQuickMenuButton.click(); + const datePickerQuickMenu = await testSubjects.find( testSubjectSelectors.superDatePickerQuickMenu ); @@ -300,7 +348,9 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv await timeUnitSelect.focus(); await timeUnitSelect.type(unit); - (await datePickerQuickMenu.findByCssSelector(selectors.superDatePickerApplyButton)).click(); + await ( + await datePickerQuickMenu.findByCssSelector(selectors.superDatePickerApplyButton) + ).click(); return testSubjects.missingOrFail(testSubjectSelectors.superDatePickerQuickMenu); }, @@ -433,4 +483,9 @@ const texts = { datasetHealthGood: 'Good', activeDatasets: 'Active Datasets', estimatedData: 'Estimated Data', + docsCountTotal: 'Docs count (total)', + size: 'Size', + services: 'Services', + hosts: 'Hosts', + degradedDocs: 'Degraded docs', }; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts index def29fb09096c..9aafefdff51ce 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts @@ -11,7 +11,7 @@ import type { JobParamsCSV } from '@kbn/reporting-export-types-csv-common'; import type { Filter } from '@kbn/es-query'; import { FtrProviderContext } from '../../../ftr_provider_context'; -export default ({ getService }: FtrProviderContext) => { +export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const reportingAPI = getService('svlReportingApi'); @@ -738,4 +738,4 @@ export default ({ getService }: FtrProviderContext) => { }); }); }); -}; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/config.ts b/x-pack/test_serverless/api_integration/test_suites/observability/config.ts index 453a3b428ceff..792f1a766c1cd 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/config.ts @@ -6,7 +6,8 @@ */ import { createTestConfig } from '../../config.base'; -import { services } from './apm_api_integration/common/services'; +import { services as apmServices } from './apm_api_integration/common/services'; +import { services as datasetQualityServices } from './dataset_quality_api_integration/common/services'; export default createTestConfig({ serverlessProject: 'oblt', @@ -15,7 +16,7 @@ export default createTestConfig({ reportName: 'Serverless Observability API Integration Tests', }, suiteTags: { exclude: ['skipSvlOblt'] }, - services, + services: { ...apmServices, ...datasetQualityServices }, // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/observability/config/elasticsearch.yml diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts new file mode 100644 index 0000000000000..2cdb6ec4fd765 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts @@ -0,0 +1,129 @@ +/* + * 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 { format } from 'url'; +import supertest from 'supertest'; +import request from 'superagent'; +import type { APIClientRequestParamsOf, APIReturnType } from '@kbn/dataset-quality-plugin/common'; +import { Config, kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; +import type { APIEndpoint } from '@kbn/dataset-quality-plugin/server/routes'; +import { formatRequest } from '@kbn/server-route-repository'; +import { InheritedFtrProviderContext } from '../../../../services'; + +export function createDatasetQualityApiClient(st: supertest.SuperTest) { + return async ( + options: { + type?: 'form-data'; + endpoint: TEndpoint; + } & APIClientRequestParamsOf & { params?: { query?: { _inspect?: boolean } } } + ): Promise> => { + const { endpoint, type } = options; + + const params = 'params' in options ? (options.params as Record) : {}; + + const { method, pathname, version } = formatRequest(endpoint, params.path); + const url = format({ pathname, query: params?.query }); + + const headers: Record = { + 'kbn-xsrf': 'foo', + 'x-elastic-internal-origin': 'foo', + }; + + if (version) { + headers['Elastic-Api-Version'] = version; + } + + let res: request.Response; + if (type === 'form-data') { + const fields: Array<[string, any]> = Object.entries(params.body); + const formDataRequest = st[method](url) + .set(headers) + .set('Content-type', 'multipart/form-data'); + + for (const field of fields) { + formDataRequest.field(field[0], field[1]); + } + + res = await formDataRequest; + } else if (params.body) { + res = await st[method](url).send(params.body).set(headers); + } else { + res = await st[method](url).set(headers); + } + + // supertest doesn't throw on http errors + if (res?.status !== 200) { + throw new DatasetQualityApiError(res, endpoint); + } + + return res; + }; +} + +type ApiErrorResponse = Omit & { + body: { + statusCode: number; + error: string; + message: string; + attributes: object; + }; +}; + +export type DatasetQualityApiSupertest = ReturnType; + +export class DatasetQualityApiError extends Error { + res: ApiErrorResponse; + + constructor(res: request.Response, endpoint: string) { + super( + `Unhandled DatasetQualityApiError. + Status: "${res.status}" + Endpoint: "${endpoint}" + Body: ${JSON.stringify(res.body)} + ` + ); + + this.res = res; + } +} + +async function getDatasetQualityApiClient({ svlSharedConfig }: { svlSharedConfig: Config }) { + const kibanaServer = svlSharedConfig.get('servers.kibana'); + const cAuthorities = svlSharedConfig.get('servers.kibana.certificateAuthorities'); + + const username = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).username; + const password = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).password; + + const url = format({ + ...kibanaServer, + auth: `${username}:${password}`, + }); + + return createDatasetQualityApiClient(supertest.agent(url, { ca: cAuthorities })); +} + +export interface SupertestReturnType { + status: number; + body: APIReturnType; +} + +type DatasetQualityApiClientKey = 'slsUser'; +export type DatasetQualityApiClient = Record< + DatasetQualityApiClientKey, + Awaited> +>; + +export async function getDatasetQualityApiClientService({ + getService, +}: InheritedFtrProviderContext): Promise { + const svlSharedConfig = getService('config'); + + return { + slsUser: await getDatasetQualityApiClient({ + svlSharedConfig, + }), + }; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/services.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/services.ts new file mode 100644 index 0000000000000..3c15e7fffae04 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/services.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createLogger, LogLevel, LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { GenericFtrProviderContext } from '@kbn/test'; +import { + DatasetQualityApiClient, + getDatasetQualityApiClientService, +} from './dataset_quality_api_supertest'; +import { + InheritedServices, + InheritedFtrProviderContext, + services as inheritedServices, +} from '../../../../services'; + +export type DatasetQualityServices = InheritedServices & { + datasetQualityApiClient: ( + context: InheritedFtrProviderContext + ) => Promise; + logSynthtraceEsClient: (context: InheritedFtrProviderContext) => Promise; +}; + +export const services: DatasetQualityServices = { + ...inheritedServices, + datasetQualityApiClient: getDatasetQualityApiClientService, + logSynthtraceEsClient: async (context: InheritedFtrProviderContext) => + new LogsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }), +}; + +export type DatasetQualityFtrContextProvider = GenericFtrProviderContext; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts new file mode 100644 index 0000000000000..1a4db10f140dc --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { expectToReject } from './utils'; +import { + DatasetQualityApiClient, + DatasetQualityApiError, +} from './common/dataset_quality_api_supertest'; +import { DatasetQualityFtrContextProvider } from './common/services'; + +export default function ({ getService }: DatasetQualityFtrContextProvider) { + const datasetQualityApiClient: DatasetQualityApiClient = getService('datasetQualityApiClient'); + const synthtrace = getService('logSynthtraceEsClient'); + const start = '2023-12-11T18:00:00.000Z'; + const end = '2023-12-11T18:01:00.000Z'; + const type = 'logs'; + const dataset = 'nginx.access'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + + async function callApi(dataStream: string) { + return await datasetQualityApiClient.slsUser({ + endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/details', + params: { + path: { + dataStream, + }, + query: { + start, + end, + }, + }, + }); + } + + describe('gets the data stream details', () => { + before(async () => { + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(dataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + + it('returns error when dataStream param is not provided', async () => { + const expectedMessage = 'Data Stream name cannot be empty'; + const err = await expectToReject(() => + callApi(encodeURIComponent(' ')) + ); + expect(err.res.status).to.be(400); + expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); + }); + + it('returns {} if matching data stream is not available', async () => { + const nonExistentDataSet = 'Non-existent'; + const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; + const resp = await callApi(nonExistentDataStream); + expect(resp.body).empty(); + }); + + it('returns "sizeBytes" as null in serverless', async () => { + const resp = await callApi(`${type}-${dataset}-${namespace}`); + expect(resp.body.sizeBytes).to.be(null); + }); + + it('returns service.name and host.name correctly', async () => { + const resp = await callApi(`${type}-${dataset}-${namespace}`); + expect(resp.body.services).to.eql({ ['service.name']: [serviceName] }); + expect(resp.body.hosts?.['host.name']).to.eql([hostName]); + }); + + after(async () => { + await synthtrace.clean(); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts new file mode 100644 index 0000000000000..a0ea813a83931 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts @@ -0,0 +1,101 @@ +/* + * 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 { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { expectToReject, getDataStreamSettingsOfEarliestIndex, rolloverDataStream } from './utils'; +import { + DatasetQualityApiClient, + DatasetQualityApiError, +} from './common/dataset_quality_api_supertest'; +import { DatasetQualityFtrContextProvider } from './common/services'; + +export default function ({ getService }: DatasetQualityFtrContextProvider) { + const datasetQualityApiClient: DatasetQualityApiClient = getService('datasetQualityApiClient'); + const synthtrace = getService('logSynthtraceEsClient'); + const esClient = getService('es'); + const start = '2023-12-11T18:00:00.000Z'; + const end = '2023-12-11T18:01:00.000Z'; + const type = 'logs'; + const dataset = 'nginx.access'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + + async function callApi(dataStream: string) { + return await datasetQualityApiClient.slsUser({ + endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', + params: { + path: { + dataStream, + }, + }, + }); + } + + describe('gets the data stream settings', () => { + before(async () => { + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(dataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + + it('returns error when dataStream param is not provided', async () => { + const expectedMessage = 'Data Stream name cannot be empty'; + const err = await expectToReject(() => + callApi(encodeURIComponent(' ')) + ); + expect(err.res.status).to.be(400); + expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); + }); + + it('returns {} if matching data stream is not available', async () => { + const nonExistentDataSet = 'Non-existent'; + const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; + const resp = await callApi(nonExistentDataStream); + expect(resp.body).empty(); + }); + + it('returns "createdOn" correctly', async () => { + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + `${type}-${dataset}-${namespace}` + ); + const resp = await callApi(`${type}-${dataset}-${namespace}`); + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + }); + + it('returns "createdOn" correctly for rolled over dataStream', async () => { + await rolloverDataStream(esClient, `${type}-${dataset}-${namespace}`); + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + `${type}-${dataset}-${namespace}` + ); + const resp = await callApi(`${type}-${dataset}-${namespace}`); + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + }); + + after(async () => { + await synthtrace.clean(); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts new file mode 100644 index 0000000000000..f4022fd009833 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts @@ -0,0 +1,14 @@ +/* + * 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 { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Dataset Quality', function () { + loadTestFile(require.resolve('./data_stream_details')); + loadTestFile(require.resolve('./data_stream_settings')); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/data_stream.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/data_stream.ts new file mode 100644 index 0000000000000..bdf5187db0725 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/data_stream.ts @@ -0,0 +1,26 @@ +/* + * 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 { Client } from '@elastic/elasticsearch'; + +export async function rolloverDataStream(es: Client, name: string) { + return es.indices.rollover({ alias: name }); +} + +export async function getDataStreamSettingsOfEarliestIndex(es: Client, name: string) { + const matchingIndexesObj = await es.indices.getSettings({ index: name }); + + const matchingIndexes = Object.keys(matchingIndexesObj ?? {}); + matchingIndexes.sort((a, b) => { + return ( + Number(matchingIndexesObj[a].settings?.index?.creation_date) - + Number(matchingIndexesObj[b].settings?.index?.creation_date) + ); + }); + + return matchingIndexesObj[matchingIndexes[0]].settings; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/expect_to_reject.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/expect_to_reject.ts new file mode 100644 index 0000000000000..ae352c31d71a2 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/expect_to_reject.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export async function expectToReject(fn: () => Promise): Promise { + let res: any; + try { + res = await fn(); + } catch (e) { + return e; + } + + throw new Error(`expectToReject resolved: "${JSON.stringify(res)}"`); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/index.ts new file mode 100644 index 0000000000000..0f273a5dddd10 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/utils/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { expectToReject } from './expect_to_reject'; +export * from './data_stream'; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts index acb33e0b4901b..0d4f4ffe52814 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts @@ -19,5 +19,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./es_query_rule/es_query_rule')); loadTestFile(require.resolve('./slos')); loadTestFile(require.resolve('./synthetics')); + loadTestFile(require.resolve('./dataset_quality_api_integration')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts index 0d635bcb2b0e4..68d96070990f0 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts @@ -28,12 +28,14 @@ export function getLogsForDataset({ count = 1, isMalformed = false, namespace = defaultNamespace, + services, }: { dataset: string; to: moment.MomentInput; count?: number; isMalformed?: boolean; namespace?: string; + services?: string[]; }) { return timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') @@ -46,7 +48,9 @@ export function getLogsForDataset({ timestamp, dataset, MESSAGE_LOG_LEVELS[index % MESSAGE_LOG_LEVELS.length], - SERVICE_NAMES[index % SERVICE_NAMES.length], + services?.[index] ?? + services?.[index % services.length] ?? + SERVICE_NAMES[index % SERVICE_NAMES.length], CLUSTER[index % CLUSTER.length], CLOUD_PROVIDERS[index % CLOUD_PROVIDERS.length], CLOUD_REGION[index % CLOUD_REGION.length], diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts index cee287b9fa020..fa5243ec03ef7 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts @@ -29,9 +29,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const browser = getService('browser'); const to = '2024-01-01T12:00:00.000Z'; + const excludeKeysFromServerless = ['size']; // https://github.com/elastic/kibana/issues/178954 - // FLAKY: https://github.com/elastic/kibana/issues/180994 - describe.skip('Dataset quality flyout', () => { + describe('Dataset quality flyout', () => { before(async () => { await PageObjects.svlCommonPage.loginWithRole('admin'); await synthtrace.index(getInitialTestLogs({ to, count: 4 })); @@ -85,7 +85,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(lastActivityTextExists).to.eql(true); }); - it('reflects the breakdown field state in url', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/180994 + it.skip('reflects the breakdown field state in url', async () => { const testDatasetName = datasetNames[0]; await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); @@ -149,6 +150,149 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(datasetSelectorText).to.eql(testDatasetName); }); + it('shows summary KPIs', async () => { + await PageObjects.datasetQuality.navigateTo(); + + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summary = await PageObjects.datasetQuality.parseFlyoutKpis(excludeKeysFromServerless); + expect(summary).to.eql({ + docsCountTotal: '0', + // size: '0.0 B', // `_stats` not available on Serverless + services: '0', + hosts: '0', + degradedDocs: '0', + }); + }); + + it('shows the updated KPIs', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); + + // Set time range to 3 days ago + const flyoutBodyContainer = await testSubjects.find( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutBody + ); + await PageObjects.datasetQuality.setDatePickerLastXUnits(flyoutBodyContainer, 3, 'd'); + + // Index 2 doc 2 days ago + const time2DaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + }) + ); + + // Index 5 degraded docs 2 days ago + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 5, + dataset: apacheAccessDatasetName, + isMalformed: true, + }) + ); + + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); + + expect(parseInt(summaryAfter.docsCountTotal, 10)).to.be.greaterThan( + parseInt(summaryBefore.docsCountTotal, 10) + ); + + expect(parseInt(summaryAfter.degradedDocs, 10)).to.be.greaterThan( + parseInt(summaryBefore.degradedDocs, 10) + ); + + // `_stats` not available on Serverless so we can't compare size // https://github.com/elastic/kibana/issues/178954 + // expect(parseInt(summaryAfter.size, 10)).to.be.greaterThan(parseInt(summaryBefore.size, 10)); + + expect(parseInt(summaryAfter.services, 10)).to.be.greaterThan( + parseInt(summaryBefore.services, 10) + ); + expect(parseInt(summaryAfter.hosts, 10)).to.be.greaterThan(parseInt(summaryBefore.hosts, 10)); + }); + + it('shows the right number of services', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); + const testServices = ['test-srv-1', 'test-srv-2']; + + // Index 2 docs with different services + const timeNow = Date.now(); + await synthtrace.index( + getLogsForDataset({ + to: timeNow, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + services: testServices, + }) + ); + + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); + + expect(parseInt(summaryAfter.services, 10)).to.eql( + parseInt(summaryBefore.services, 10) + testServices.length + ); + }); + + it('goes to log explorer for degraded docs when show all is clicked', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const degradedDocsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.degradedDocs}`; + await testSubjects.click(degradedDocsShowAllSelector); + await browser.switchTab(1); + + // Confirm dataset selector text in observability logs explorer + const datasetSelectorText = + await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); + expect(datasetSelectorText).to.contain(apacheAccessDatasetName); + + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); + + it('goes to infra hosts for hosts when show all is clicked', async () => { + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const hostsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.hosts}`; + await testSubjects.click(hostsShowAllSelector); + await browser.switchTab(1); + + // Confirm url contains metrics/hosts + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + expect(parsedUrl.pathname).to.contain('/app/metrics/hosts'); + }); + + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); + it('Integration actions menu is present with correct actions', async () => { const apacheAccessDatasetName = 'apache.access'; const apacheAccessDatasetHumanName = 'Apache access logs'; diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_summary.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_summary.ts index 702b55c263a5c..f5a6fd31a25f3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_summary.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_summary.ts @@ -40,7 +40,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { datasetHealthDegraded: '0', datasetHealthGood: '3', activeDatasets: '0 of 3', - // estimatedData: '0 Bytes', https://github.com/elastic/kibana/issues/178954 + // estimatedData: '0.0 B', https://github.com/elastic/kibana/issues/178954 }); }); @@ -131,7 +131,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(updatedActiveDatasets).to.eql('3 of 3'); - // TODO: Investigate. This fails on Serverless. + // TODO: `_stats` not available on Serverless. // https://github.com/elastic/kibana/issues/178954 // expect(_updatedEstimatedData).to.not.eql(_existingEstimatedData); }); }); diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index 21f7afafd3e2e..1df208cc8b81b 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -98,5 +98,6 @@ "@kbn/es-query", "@kbn/utility-types", "@kbn/synthetics-plugin", + "@kbn/dataset-quality-plugin" ] } From 53fa8bc87124711c158dbe810855639f8ac1099c Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Wed, 24 Apr 2024 13:25:12 +0200 Subject: [PATCH 17/82] [Security Solution] Network flows query "size": 0 (#181310) ## Summary Move the `"size": 0` prop to the body in the network flow aggregation queries --- .../factory/network/dns/__mocks__/index.ts | 4 ++-- .../factory/network/dns/query.dns_network.dsl.ts | 2 +- .../factory/network/http/__mocks__/index.ts | 4 ++-- .../factory/network/http/query.http_network.dsl.ts | 2 +- .../factory/network/top_countries/__mocks__/index.ts | 4 ++-- .../top_countries/query.top_countries_network.dsl.ts | 2 +- .../factory/network/top_n_flow/__mocks__/index.ts | 8 ++++---- .../network/top_n_flow/query.top_n_flow_network.dsl.ts | 10 +++++++--- 8 files changed, 20 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/__mocks__/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/__mocks__/index.ts index 7d89aae61439e..4e5c497c06463 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/__mocks__/index.ts @@ -197,8 +197,8 @@ export const formattedSearchStrategyResponse = { format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }, null, @@ -277,7 +277,7 @@ export const expectedDsl = { format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/query.dns_network.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/query.dns_network.dsl.ts index 122bc739c7187..cce16d8a7e5bc 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/query.dns_network.dsl.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/dns/query.dns_network.dsl.ts @@ -131,8 +131,8 @@ export const buildDnsQuery = ({ format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/__mocks__/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/__mocks__/index.ts index 01ceb455b080c..b87c20c3f2810 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/__mocks__/index.ts @@ -673,8 +673,8 @@ export const formattedSearchStrategyResponse = { format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }, null, @@ -742,7 +742,7 @@ export const expectedDsl = { format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/query.http_network.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/query.http_network.dsl.ts index 4128de4c2ffbe..91b036bfcabb9 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/query.http_network.dsl.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/http/query.http_network.dsl.ts @@ -80,8 +80,8 @@ export const buildHttpQuery = ({ format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/__mocks__/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/__mocks__/index.ts index 8835a98621ea3..13c646df5a6b7 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/__mocks__/index.ts @@ -104,8 +104,8 @@ export const formattedSearchStrategyResponse = { ], }, }, + size: 0, }, - size: 0, track_total_hits: false, }, null, @@ -160,7 +160,7 @@ export const expectedDsl = { ], }, }, + size: 0, }, - size: 0, track_total_hits: false, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/query.top_countries_network.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/query.top_countries_network.dsl.ts index 72f339fb939bc..501e8122d50e0 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/query.top_countries_network.dsl.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_countries/query.top_countries_network.dsl.ts @@ -66,8 +66,8 @@ export const buildTopCountriesQuery = ({ filter, }, }, + size: 0, }, - size: 0, track_total_hits: false, }; return dslQuery; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/__mocks__/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/__mocks__/index.ts index 7df0474bb29d9..00f0924f2a80b 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/__mocks__/index.ts @@ -947,8 +947,8 @@ export const formattedSearchStrategyResponse: NetworkTopNFlowStrategyResponse = format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }, null, @@ -997,8 +997,8 @@ export const formattedCountStrategyResponse: NetworkTopNFlowCountStrategyRespons }, }, _source: false, + size: 0, }, - size: 0, track_total_hits: false, }, null, @@ -1098,8 +1098,8 @@ export const expectedDsl = { format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }; @@ -1137,7 +1137,7 @@ export const expectedCountDsl = { }, }, _source: false, + size: 0, }, - size: 0, track_total_hits: false, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/query.top_n_flow_network.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/query.top_n_flow_network.dsl.ts index 10a65e361a676..6e8154eafff9d 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/query.top_n_flow_network.dsl.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network/top_n_flow/query.top_n_flow_network.dsl.ts @@ -56,8 +56,8 @@ export const buildTopNFlowQuery = ({ format: 'strict_date_optional_time', }, ], + size: 0, }, - size: 0, track_total_hits: false, }; return dslQuery; @@ -75,8 +75,12 @@ export const buildTopNFlowCountQuery = ({ allow_no_indices: true, index: defaultIndex, ignore_unavailable: true, - body: { aggregations: getCountAgg(flowTarget), query, _source: false }, - size: 0, + body: { + aggregations: getCountAgg(flowTarget), + query, + _source: false, + size: 0, + }, track_total_hits: false, }; return dslQuery; From d4a9132ef5e174d4ccba15dcb7800d9f5b2e5302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Wed, 24 Apr 2024 13:29:13 +0200 Subject: [PATCH 18/82] [Search] Update connectors license (#181153) ## Summary Updates various connector configurations. - Box, Notion, Slack, Teams, and Zoom are set to run native. - Oracle, Outlook and Gmail are GA now. - GraphQL and OpenText Documentum added as Tech Preview connector clients. - Fixed a few tooltip issues. - Fixed a Teams `service_type` in integrations page. Note, waiting for icons for GraphQL and OpenText Documentum before merging. Screenshots below will have broken images until they are added. "Select Connector" with basic license: Screenshot 2024-04-18 at 15 33 30 Screenshot 2024-04-18 at 15 33 35 Integrations tiles: Screenshot 2024-04-18 at 14 51 28 Screenshot 2024-04-18 at 14 51 34 Native Upgrades: Screenshot 2024-04-18 at 14 50 12 Screenshot 2024-04-18 at 14 50 21 Screenshot 2024-04-18 at 14 50 32 Screenshot 2024-04-18 at 14 50 36 Screenshot 2024-04-18 at 14 50 40 ### Checklist Delete any items that are not applicable to this PR. - [x] 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 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../types/native_connectors.ts | 610 +++++++++++++++++- .../apis/custom_integration/integrations.ts | 2 +- .../search_connectors/common/connectors.ts | 57 +- .../public/assets/icons/graphql.svg | 4 + .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 7 files changed, 652 insertions(+), 24 deletions(-) create mode 100644 x-pack/plugins/search_connectors/public/assets/icons/graphql.svg diff --git a/packages/kbn-search-connectors/types/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts index 6108280478e2a..a044dd717ef4f 100644 --- a/packages/kbn-search-connectors/types/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -73,13 +73,12 @@ const ENABLE_DOCUMENT_LEVEL_SECURITY_LABEL = i18n.translate( } ); -const ENABLE_DOCUMENT_LEVEL_SECURITY_TOOLTIP = i18n.translate( - 'searchConnectors.nativeConnectors.enableDLS.tooltip', - { +const getEnableDocumentLevelSecurityTooltip = (serviceName: string) => + i18n.translate('searchConnectors.nativeConnectors.enableDLS.tooltip', { defaultMessage: - 'Document level security ensures identities and permissions set in Google Drive are maintained in Elasticsearch. This enables you to restrict and personalize read-access users and groups have to documents in this index. Access control syncs ensure this metadata is kept up to date in your Elasticsearch documents.', - } -); + 'Document level security ensures identities and permissions set in {serviceName} are maintained in Elasticsearch. This enables you to restrict and personalize read-access users and groups have to documents in this index. Access control syncs ensure this metadata is kept up to date in your Elasticsearch documents.', + values: { serviceName }, + }); const DATABASE_LABEL = i18n.translate('searchConnectors.nativeConnectors.databaseLabel', { defaultMessage: 'Database', @@ -246,6 +245,177 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record c.id === 'sample_data_all')).to.be.above( diff --git a/x-pack/plugins/search_connectors/common/connectors.ts b/x-pack/plugins/search_connectors/common/connectors.ts index 9ffb1ee82254a..dd96c11487279 100644 --- a/x-pack/plugins/search_connectors/common/connectors.ts +++ b/x-pack/plugins/search_connectors/common/connectors.ts @@ -220,6 +220,24 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }), serviceType: 'google_drive', }, + { + categories: ['enterprise_search', 'elastic_stack', 'custom', 'connector', 'connector_client'], + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.graphQL.description', + { + defaultMessage: 'Search over your content with GraphQL.', + } + ), + iconPath: 'graphql.svg', + isBeta: false, + isNative: false, + keywords: ['graphql', 'connector'], + name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.graphQL.name', { + defaultMessage: 'GraphQL', + }), + serviceType: 'graphql', + isTechPreview: true, + }, { categories: [ 'enterprise_search', @@ -317,7 +335,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ ), iconPath: 'notion.svg', isBeta: true, - isNative: false, + isNative: true, keywords: ['notion', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.notion.name', { defaultMessage: 'Notion', @@ -452,7 +470,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ } ), iconPath: 'gmail.svg', - isBeta: true, + isBeta: false, isNative: true, keywords: ['gmail', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.gmail.name', { @@ -460,6 +478,27 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }), serviceType: 'gmail', }, + { + categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], + description: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.openTextDocumentum.description', + { + defaultMessage: 'Search over your content on OpenText Documentum.', + } + ), + iconPath: 'connector.svg', + isBeta: false, + isNative: false, + isTechPreview: true, + keywords: ['opentext', 'documentum', 'connector'], + name: i18n.translate( + 'searchConnectorsPlugin.content.nativeConnectors.openTextDocumentum.name', + { + defaultMessage: 'OpenText Documentum', + } + ), + serviceType: 'opentext_documentum', + }, { categories: [ 'enterprise_search', @@ -476,7 +515,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ } ), iconPath: 'oracle.svg', - isBeta: true, + isBeta: false, isNative: true, keywords: ['oracle', 'sql', 'database', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.oracle.name', { @@ -538,7 +577,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ categories: ['enterprise_search', 'elastic_stack', 'connector', 'connector_client'], iconPath: 'slack.svg', isBeta: false, - isNative: false, + isNative: true, isTechPreview: true, keywords: ['slack', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.slack.name', { @@ -578,7 +617,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ }), iconPath: 'box.svg', isBeta: false, - isNative: false, + isNative: true, isTechPreview: true, keywords: ['cloud', 'box'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.box.name', { @@ -602,7 +641,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ 'outlook', ], iconPath: 'outlook.svg', - isBeta: true, + isBeta: false, isNative: true, keywords: ['outlook', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.outlook.name', { @@ -627,13 +666,13 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ ), iconPath: 'teams.svg', isBeta: false, - isNative: false, + isNative: true, isTechPreview: true, keywords: ['teams', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.teams.name', { defaultMessage: 'Teams', }), - serviceType: 'teams', + serviceType: 'microsoft_teams', }, { categories: [ @@ -652,7 +691,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ ), iconPath: 'zoom.svg', isBeta: false, - isNative: false, + isNative: true, isTechPreview: true, keywords: ['zoom', 'connector'], name: i18n.translate('searchConnectorsPlugin.content.nativeConnectors.zoom.name', { diff --git a/x-pack/plugins/search_connectors/public/assets/icons/graphql.svg b/x-pack/plugins/search_connectors/public/assets/icons/graphql.svg new file mode 100644 index 0000000000000..99b540ae7b5a9 --- /dev/null +++ b/x-pack/plugins/search_connectors/public/assets/icons/graphql.svg @@ -0,0 +1,4 @@ + + + + diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index d466b6de05150..38d5b7847a626 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5619,7 +5619,6 @@ "searchConnectors.nativeConnectors.databaseLabel": "Base de données", "searchConnectors.nativeConnectors.dropbox.name": "Dropbox", "searchConnectors.nativeConnectors.enableDLS.label": "Activer la sécurité au niveau du document", - "searchConnectors.nativeConnectors.enableDLS.tooltip": "La sécurité au niveau du document préserve dans Elasticsearch les identités et permissions paramétrées dans Google Drive. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", "searchConnectors.nativeConnectors.enableSSL.label": "Activer SSL", "searchConnectors.nativeConnectors.gdrive.label": "Compte de service JSON Google Drive", "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.label": "Requêtes HTTP simultanées maximales", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a2b7a4293ffc7..7fe6ca3a6fdf5 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5612,7 +5612,6 @@ "searchConnectors.nativeConnectors.databaseLabel": "データベース", "searchConnectors.nativeConnectors.dropbox.name": "Dropbox", "searchConnectors.nativeConnectors.enableDLS.label": "ドキュメントレベルのセキュリティを有効化", - "searchConnectors.nativeConnectors.enableDLS.tooltip": "ドキュメントレベルのセキュリティにより、Google Driveで設定されたIDと権限がElasticsearchでも維持されます。これにより、このインデックス内のドキュメントに対するユーザーやグループの読み取りアクセスを制限し、パーソナライズすることができます。アクセス制御の同期により、Elasticsearchドキュメント内のメタデータは常に最新の状態に保たれます。", "searchConnectors.nativeConnectors.enableSSL.label": "SSLを有効にする", "searchConnectors.nativeConnectors.gdrive.label": "Google DriveサービスアカウントJSON", "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.label": "最大同時HTTPリクエスト数", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 80c2ea8e3fe6c..d57e2b983cd87 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5623,7 +5623,6 @@ "searchConnectors.nativeConnectors.databaseLabel": "数据库", "searchConnectors.nativeConnectors.dropbox.name": "Dropbox", "searchConnectors.nativeConnectors.enableDLS.label": "启用文档级别安全性", - "searchConnectors.nativeConnectors.enableDLS.tooltip": "文档级别安全性确保在 Elasticsearch 中维护在 Google 云端硬盘中设置的身份和权限。这样,您就可以限制用户和组对此索引中的文档具有的读取访问权限并对其进行个性化。访问控制同步将确保此元数据在 Elasticsearch 文档中保持最新。", "searchConnectors.nativeConnectors.enableSSL.label": "启用 SSL", "searchConnectors.nativeConnectors.gdrive.label": "Google 云端硬盘服务帐户 JSON", "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.label": "最大并发 HTTP 请求数", From 060d99bd1bf5fc53c9c712d3baebd278c27929b8 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 24 Apr 2024 13:31:06 +0200 Subject: [PATCH 19/82] Use permanent cache for translation files on production (#181377) ## Summary Fix https://github.com/elastic/kibana/issues/83409 Use a permanent cache (`public, max-age=365d, immutable`) for translation files when in production (`dist`), similar to what we're doing for static assets. Translation files cache busting is a little tricky, because it doesn't only depend on the version (enabling or disabling a custom plugin can change the translations while not changing the build hash), so we're using a custom hash generated from the content of the current translation file (which was already used to generate the `etag` header previously). --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../i18n/core-i18n-server-internal/index.ts | 2 +- .../src/i18n_service.test.ts | 11 ++- .../src/i18n_service.ts | 36 +++++-- .../core-i18n-server-internal/src/index.ts | 1 + .../src/routes/index.ts | 14 ++- .../src/routes/translations.test.ts | 22 ++++- .../src/routes/translations.ts | 99 ++++++++++++------- .../src/i18n_service.mock.ts | 15 ++- .../core/i18n/core-i18n-server/src/types.ts | 5 + .../rendering_service.test.ts.snap | 32 +++--- .../src/rendering_service.tsx | 19 ++-- .../src/test_helpers/params.ts | 3 + .../src/types.ts | 4 + .../tsconfig.json | 3 + .../core-root-server-internal/src/server.ts | 9 +- .../api_integration/apis/core/translations.ts | 7 +- .../server_integration/http/platform/cache.ts | 2 +- .../test_suites/common/core/translations.ts | 7 +- 18 files changed, 209 insertions(+), 82 deletions(-) diff --git a/packages/core/i18n/core-i18n-server-internal/index.ts b/packages/core/i18n/core-i18n-server-internal/index.ts index dbb51964c10e5..e4709a8cd7b83 100644 --- a/packages/core/i18n/core-i18n-server-internal/index.ts +++ b/packages/core/i18n/core-i18n-server-internal/index.ts @@ -6,5 +6,5 @@ * Side Public License, v 1. */ -export type { I18nConfigType } from './src'; +export type { I18nConfigType, InternalI18nServicePreboot } from './src'; export { config, I18nService } from './src'; diff --git a/packages/core/i18n/core-i18n-server-internal/src/i18n_service.test.ts b/packages/core/i18n/core-i18n-server-internal/src/i18n_service.test.ts index 88ac8daac65e7..fe4129d8c5995 100644 --- a/packages/core/i18n/core-i18n-server-internal/src/i18n_service.test.ts +++ b/packages/core/i18n/core-i18n-server-internal/src/i18n_service.test.ts @@ -37,12 +37,13 @@ describe('I18nService', () => { let configService: ReturnType; let httpPreboot: ReturnType; let httpSetup: ReturnType; + let coreContext: ReturnType; beforeEach(() => { jest.clearAllMocks(); configService = getConfigService(); - const coreContext = mockCoreContext.create({ configService }); + coreContext = mockCoreContext.create({ configService }); service = new I18nService(coreContext); httpPreboot = httpServiceMock.createInternalPrebootContract(); @@ -73,13 +74,15 @@ describe('I18nService', () => { expect(initTranslationsMock).toHaveBeenCalledWith('en', translationFiles); }); - it('calls `registerRoutesMock` with the correct parameters', async () => { + it('calls `registerRoutes` with the correct parameters', async () => { await service.preboot({ pluginPaths: [], http: httpPreboot }); expect(registerRoutesMock).toHaveBeenCalledTimes(1); expect(registerRoutesMock).toHaveBeenCalledWith({ locale: 'en', router: expect.any(Object), + isDist: coreContext.env.packageInfo.dist, + translationHash: expect.any(String), }); }); }); @@ -114,13 +117,15 @@ describe('I18nService', () => { expect(initTranslationsMock).toHaveBeenCalledWith('en', translationFiles); }); - it('calls `registerRoutesMock` with the correct parameters', async () => { + it('calls `registerRoutes` with the correct parameters', async () => { await service.setup({ pluginPaths: [], http: httpSetup }); expect(registerRoutesMock).toHaveBeenCalledTimes(1); expect(registerRoutesMock).toHaveBeenCalledWith({ locale: 'en', router: expect.any(Object), + isDist: coreContext.env.packageInfo.dist, + translationHash: expect.any(String), }); }); diff --git a/packages/core/i18n/core-i18n-server-internal/src/i18n_service.ts b/packages/core/i18n/core-i18n-server-internal/src/i18n_service.ts index 7f48256479923..d7ff9d903680c 100644 --- a/packages/core/i18n/core-i18n-server-internal/src/i18n_service.ts +++ b/packages/core/i18n/core-i18n-server-internal/src/i18n_service.ts @@ -7,6 +7,8 @@ */ import { firstValueFrom } from 'rxjs'; +import { createHash } from 'crypto'; +import { i18n, Translation } from '@kbn/i18n'; import type { Logger } from '@kbn/logging'; import type { IConfigService } from '@kbn/config'; import type { CoreContext } from '@kbn/core-base-server-internal'; @@ -30,29 +32,42 @@ export interface SetupDeps { pluginPaths: string[]; } +export interface InternalI18nServicePreboot { + getTranslationHash(): string; +} + export class I18nService { private readonly log: Logger; private readonly configService: IConfigService; - constructor(coreContext: CoreContext) { + constructor(private readonly coreContext: CoreContext) { this.log = coreContext.logger.get('i18n'); this.configService = coreContext.configService; } - public async preboot({ pluginPaths, http }: PrebootDeps) { - const { locale } = await this.initTranslations(pluginPaths); - http.registerRoutes('', (router) => registerRoutes({ router, locale })); + public async preboot({ pluginPaths, http }: PrebootDeps): Promise { + const { locale, translationHash } = await this.initTranslations(pluginPaths); + const { dist: isDist } = this.coreContext.env.packageInfo; + http.registerRoutes('', (router) => + registerRoutes({ router, locale, isDist, translationHash }) + ); + + return { + getTranslationHash: () => translationHash, + }; } public async setup({ pluginPaths, http }: SetupDeps): Promise { - const { locale, translationFiles } = await this.initTranslations(pluginPaths); + const { locale, translationFiles, translationHash } = await this.initTranslations(pluginPaths); const router = http.createRouter(''); - registerRoutes({ router, locale }); + const { dist: isDist } = this.coreContext.env.packageInfo; + registerRoutes({ router, locale, isDist, translationHash }); return { getLocale: () => locale, getTranslationFiles: () => translationFiles, + getTranslationHash: () => translationHash, }; } @@ -69,6 +84,13 @@ export class I18nService { this.log.debug(`Using translation files: [${translationFiles.join(', ')}]`); await initTranslations(locale, translationFiles); - return { locale, translationFiles }; + const translationHash = getTranslationHash(i18n.getTranslation()); + + return { locale, translationFiles, translationHash }; } } + +const getTranslationHash = (translations: Translation) => { + const serialized = JSON.stringify(translations); + return createHash('sha256').update(serialized).digest('hex').slice(0, 12); +}; diff --git a/packages/core/i18n/core-i18n-server-internal/src/index.ts b/packages/core/i18n/core-i18n-server-internal/src/index.ts index a87d88ec28dd7..9ef1fe5c96291 100644 --- a/packages/core/i18n/core-i18n-server-internal/src/index.ts +++ b/packages/core/i18n/core-i18n-server-internal/src/index.ts @@ -9,3 +9,4 @@ export { config } from './i18n_config'; export type { I18nConfigType } from './i18n_config'; export { I18nService } from './i18n_service'; +export type { InternalI18nServicePreboot } from './i18n_service'; diff --git a/packages/core/i18n/core-i18n-server-internal/src/routes/index.ts b/packages/core/i18n/core-i18n-server-internal/src/routes/index.ts index 09d49f2f23cab..64d3a21fa81c5 100644 --- a/packages/core/i18n/core-i18n-server-internal/src/routes/index.ts +++ b/packages/core/i18n/core-i18n-server-internal/src/routes/index.ts @@ -9,6 +9,16 @@ import type { IRouter } from '@kbn/core-http-server'; import { registerTranslationsRoute } from './translations'; -export const registerRoutes = ({ router, locale }: { router: IRouter; locale: string }) => { - registerTranslationsRoute(router, locale); +export const registerRoutes = ({ + router, + locale, + isDist, + translationHash, +}: { + router: IRouter; + locale: string; + isDist: boolean; + translationHash: string; +}) => { + registerTranslationsRoute({ router, locale, isDist, translationHash }); }; diff --git a/packages/core/i18n/core-i18n-server-internal/src/routes/translations.test.ts b/packages/core/i18n/core-i18n-server-internal/src/routes/translations.test.ts index 9d9f19c381577..a0a04b16033ac 100644 --- a/packages/core/i18n/core-i18n-server-internal/src/routes/translations.test.ts +++ b/packages/core/i18n/core-i18n-server-internal/src/routes/translations.test.ts @@ -12,11 +12,27 @@ import { registerTranslationsRoute } from './translations'; describe('registerTranslationsRoute', () => { test('registers route with expected options', () => { const router = mockRouter.create(); - registerTranslationsRoute(router, 'en'); - expect(router.get).toHaveBeenCalledTimes(1); + registerTranslationsRoute({ + router, + locale: 'en', + isDist: true, + translationHash: 'XXXX', + }); + expect(router.get).toHaveBeenCalledTimes(2); expect(router.get).toHaveBeenNthCalledWith( 1, - expect.objectContaining({ options: { access: 'public', authRequired: false } }), + expect.objectContaining({ + path: '/translations/{locale}.json', + options: { access: 'public', authRequired: false }, + }), + expect.any(Function) + ); + expect(router.get).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + path: '/translations/XXXX/{locale}.json', + options: { access: 'public', authRequired: false }, + }), expect.any(Function) ); }); diff --git a/packages/core/i18n/core-i18n-server-internal/src/routes/translations.ts b/packages/core/i18n/core-i18n-server-internal/src/routes/translations.ts index 49a6779c7d3b2..369bc0c6c585f 100644 --- a/packages/core/i18n/core-i18n-server-internal/src/routes/translations.ts +++ b/packages/core/i18n/core-i18n-server-internal/src/routes/translations.ts @@ -6,54 +6,81 @@ * Side Public License, v 1. */ -import { createHash } from 'crypto'; import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core-http-server'; +const MINUTE = 60; +const HOUR = 60 * MINUTE; +const DAY = 24 * HOUR; + interface TranslationCache { translations: string; hash: string; } -export const registerTranslationsRoute = (router: IRouter, locale: string) => { +export const registerTranslationsRoute = ({ + router, + locale, + translationHash, + isDist, +}: { + router: IRouter; + locale: string; + translationHash: string; + isDist: boolean; +}) => { let translationCache: TranslationCache; - router.get( - { - path: '/translations/{locale}.json', - validate: { - params: schema.object({ - locale: schema.string(), - }), - }, - options: { - access: 'public', - authRequired: false, - }, - }, - (ctx, req, res) => { - if (req.params.locale.toLowerCase() !== locale.toLowerCase()) { - return res.notFound({ - body: `Unknown locale: ${req.params.locale}`, - }); - } - if (!translationCache) { - const translations = JSON.stringify(i18n.getTranslation()); - const hash = createHash('sha1').update(translations).digest('hex'); - translationCache = { - translations, - hash, - }; - } - return res.ok({ - headers: { - 'content-type': 'application/json', - 'cache-control': 'must-revalidate', - etag: translationCache.hash, + ['/translations/{locale}.json', `/translations/${translationHash}/{locale}.json`].forEach( + (routePath) => { + router.get( + { + path: routePath, + validate: { + params: schema.object({ + locale: schema.string(), + }), + }, + options: { + access: 'public', + authRequired: false, + }, }, - body: translationCache.translations, - }); + (ctx, req, res) => { + if (req.params.locale.toLowerCase() !== locale.toLowerCase()) { + return res.notFound({ + body: `Unknown locale: ${req.params.locale}`, + }); + } + if (!translationCache) { + const translations = JSON.stringify(i18n.getTranslation()); + translationCache = { + translations, + hash: translationHash, + }; + } + + let headers: Record; + if (isDist) { + headers = { + 'content-type': 'application/json', + 'cache-control': `public, max-age=${365 * DAY}, immutable`, + }; + } else { + headers = { + 'content-type': 'application/json', + 'cache-control': 'must-revalidate', + etag: translationCache.hash, + }; + } + + return res.ok({ + headers, + body: translationCache.translations, + }); + } + ); } ); }; diff --git a/packages/core/i18n/core-i18n-server-mocks/src/i18n_service.mock.ts b/packages/core/i18n/core-i18n-server-mocks/src/i18n_service.mock.ts index 41c6dadea85b9..bc954a93089b7 100644 --- a/packages/core/i18n/core-i18n-server-mocks/src/i18n_service.mock.ts +++ b/packages/core/i18n/core-i18n-server-mocks/src/i18n_service.mock.ts @@ -7,17 +7,29 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import type { I18nService } from '@kbn/core-i18n-server-internal'; +import type { I18nService, InternalI18nServicePreboot } from '@kbn/core-i18n-server-internal'; import type { I18nServiceSetup } from '@kbn/core-i18n-server'; const createSetupContractMock = () => { const mock: jest.Mocked = { getLocale: jest.fn(), getTranslationFiles: jest.fn(), + getTranslationHash: jest.fn(), }; mock.getLocale.mockReturnValue('en'); mock.getTranslationFiles.mockReturnValue([]); + mock.getTranslationHash.mockReturnValue('MOCK_HASH'); + + return mock; +}; + +const createInternalPrebootMock = () => { + const mock: jest.Mocked = { + getTranslationHash: jest.fn(), + }; + + mock.getTranslationHash.mockReturnValue('MOCK_HASH'); return mock; }; @@ -38,4 +50,5 @@ const createMock = () => { export const i18nServiceMock = { create: createMock, createSetupContract: createSetupContractMock, + createInternalPrebootContract: createInternalPrebootMock, }; diff --git a/packages/core/i18n/core-i18n-server/src/types.ts b/packages/core/i18n/core-i18n-server/src/types.ts index 9c640612c9034..06b72d76c46fe 100644 --- a/packages/core/i18n/core-i18n-server/src/types.ts +++ b/packages/core/i18n/core-i18n-server/src/types.ts @@ -19,4 +19,9 @@ export interface I18nServiceSetup { * Return the absolute paths to translation files currently in use. */ getTranslationFiles(): string[]; + + /** + * Returns the hash generated from the current translations. + */ + getTranslationHash(): string; } diff --git a/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap index 250073318a3ac..69f534cf837b4 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap +++ b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap @@ -37,7 +37,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -117,7 +117,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -193,7 +193,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -273,7 +273,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -349,7 +349,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -425,7 +425,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -505,7 +505,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -581,7 +581,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -662,7 +662,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -742,7 +742,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -823,7 +823,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -908,7 +908,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -984,7 +984,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -1065,7 +1065,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -1150,7 +1150,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { @@ -1231,7 +1231,7 @@ Object { ], }, "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", + "translationsUrl": "/mock-server-basepath/translations/MOCK_HASH/en.json", }, "legacyMetadata": Object { "globalUiSettings": Object { diff --git a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx index 5b8f86a96697b..cf97bad34fc60 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { renderToStaticMarkup } from 'react-dom/server'; import { firstValueFrom, of } from 'rxjs'; import { catchError, take, timeout } from 'rxjs'; -import { i18n } from '@kbn/i18n'; +import { i18n as i18nLib } from '@kbn/i18n'; import type { ThemeVersion } from '@kbn/ui-shared-deps-npm'; import type { CoreContext } from '@kbn/core-base-server-internal'; @@ -61,6 +61,7 @@ export class RenderingService { public async preboot({ http, uiPlugins, + i18n, }: RenderingPrebootDeps): Promise { http.registerRoutes('', (router) => { registerBootstrapRoute({ @@ -75,7 +76,7 @@ export class RenderingService { }); return { - render: this.render.bind(this, { http, uiPlugins }), + render: this.render.bind(this, { http, uiPlugins, i18n }), }; } @@ -86,6 +87,7 @@ export class RenderingService { uiPlugins, customBranding, userSettings, + i18n, }: RenderingSetupDeps): Promise { registerBootstrapRoute({ router: http.createRouter(''), @@ -106,6 +108,7 @@ export class RenderingService { status, customBranding, userSettings, + i18n, }), }; } @@ -119,7 +122,8 @@ export class RenderingService { }, { isAnonymousPage = false, vars, includeExposedConfigKeys }: IRenderOptions = {} ) { - const { elasticsearch, http, uiPlugins, status, customBranding, userSettings } = renderOptions; + const { elasticsearch, http, uiPlugins, status, customBranding, userSettings, i18n } = + renderOptions; const env = { mode: this.coreContext.env.mode, @@ -201,14 +205,17 @@ export class RenderingService { const loggingConfig = await getBrowserLoggingConfig(this.coreContext.configService); + const translationHash = i18n.getTranslationHash(); + const translationsUrl = `${serverBasePath}/translations/${translationHash}/${i18nLib.getLocale()}.json`; + const filteredPlugins = filterUiPlugins({ uiPlugins, isAnonymousPage }); const bootstrapScript = isAnonymousPage ? 'bootstrap-anonymous.js' : 'bootstrap.js'; const metadata: RenderingMetadata = { strictCsp: http.csp.strict, uiPublicUrl: `${staticAssetsHrefBase}/ui`, bootstrapScriptUrl: `${basePath}/${bootstrapScript}`, - i18n: i18n.translate, - locale: i18n.getLocale(), + i18n: i18nLib.translate, + locale: i18nLib.getLocale(), themeVersion, darkMode, stylesheetPaths: commonStylesheetPaths, @@ -233,7 +240,7 @@ export class RenderingService { anonymousStatusPage: status?.isStatusPageAnonymous() ?? false, i18n: { // TODO: Make this load as part of static assets! - translationsUrl: `${basePath}/translations/${i18n.getLocale()}.json`, + translationsUrl, }, theme: { darkMode, diff --git a/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts index 42c48d9e0bd21..d7b44157f4a6d 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts @@ -12,6 +12,7 @@ import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; import { statusServiceMock } from '@kbn/core-status-server-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-server-mocks'; import { userSettingsServiceMock } from '@kbn/core-user-settings-server-mocks'; +import { i18nServiceMock } from '@kbn/core-i18n-server-mocks'; const context = mockCoreContext.create(); const httpPreboot = httpServiceMock.createInternalPrebootContract(); @@ -33,6 +34,7 @@ export const mockRenderingServiceParams = context; export const mockRenderingPrebootDeps = { http: httpPreboot, uiPlugins: createUiPlugins(), + i18n: i18nServiceMock.createInternalPrebootContract(), }; export const mockRenderingSetupDeps = { elasticsearch, @@ -41,4 +43,5 @@ export const mockRenderingSetupDeps = { customBranding, status, userSettings, + i18n: i18nServiceMock.createSetupContract(), }; diff --git a/packages/core/rendering/core-rendering-server-internal/src/types.ts b/packages/core/rendering/core-rendering-server-internal/src/types.ts index e96353816e199..357f17182b2d5 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/types.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/types.ts @@ -22,6 +22,8 @@ import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import type { InternalCustomBrandingSetup } from '@kbn/core-custom-branding-server-internal'; import type { CustomBranding } from '@kbn/core-custom-branding-common'; import type { InternalUserSettingsServiceSetup } from '@kbn/core-user-settings-server-internal'; +import type { I18nServiceSetup } from '@kbn/core-i18n-server'; +import type { InternalI18nServicePreboot } from '@kbn/core-i18n-server-internal'; /** @internal */ export interface RenderingMetadata { @@ -42,6 +44,7 @@ export interface RenderingMetadata { export interface RenderingPrebootDeps { http: InternalHttpServicePreboot; uiPlugins: UiPlugins; + i18n: InternalI18nServicePreboot; } /** @internal */ @@ -52,6 +55,7 @@ export interface RenderingSetupDeps { uiPlugins: UiPlugins; customBranding: InternalCustomBrandingSetup; userSettings: InternalUserSettingsServiceSetup; + i18n: I18nServiceSetup; } /** @internal */ diff --git a/packages/core/rendering/core-rendering-server-internal/tsconfig.json b/packages/core/rendering/core-rendering-server-internal/tsconfig.json index ba9dfdd87f307..e306dca24059c 100644 --- a/packages/core/rendering/core-rendering-server-internal/tsconfig.json +++ b/packages/core/rendering/core-rendering-server-internal/tsconfig.json @@ -41,6 +41,9 @@ "@kbn/core-user-settings-server-internal", "@kbn/core-logging-common-internal", "@kbn/core-logging-server-internal", + "@kbn/core-i18n-server", + "@kbn/core-i18n-server-internal", + "@kbn/core-i18n-server-mocks", ], "exclude": [ "target/**/*", diff --git a/packages/core/root/core-root-server-internal/src/server.ts b/packages/core/root/core-root-server-internal/src/server.ts index 1439fa19cb64d..fc34e151e657f 100644 --- a/packages/core/root/core-root-server-internal/src/server.ts +++ b/packages/core/root/core-root-server-internal/src/server.ts @@ -195,7 +195,7 @@ export class Server { const httpPreboot = await this.http.preboot({ context: contextServicePreboot }); // setup i18n prior to any other service, to have translations ready - await this.i18n.preboot({ http: httpPreboot, pluginPaths }); + const i18nPreboot = await this.i18n.preboot({ http: httpPreboot, pluginPaths }); this.capabilities.preboot({ http: httpPreboot }); @@ -203,7 +203,11 @@ export class Server { await this.status.preboot({ http: httpPreboot }); - const renderingPreboot = await this.rendering.preboot({ http: httpPreboot, uiPlugins }); + const renderingPreboot = await this.rendering.preboot({ + http: httpPreboot, + uiPlugins, + i18n: i18nPreboot, + }); const httpResourcesPreboot = this.httpResources.preboot({ http: httpPreboot, @@ -328,6 +332,7 @@ export class Server { uiPlugins, customBranding: customBrandingSetup, userSettings: userSettingsServiceSetup, + i18n: i18nServiceSetup, }); const httpResourcesSetup = this.httpResources.setup({ diff --git a/test/api_integration/apis/core/translations.ts b/test/api_integration/apis/core/translations.ts index 9e492556fdd96..c29cdbf28da77 100644 --- a/test/api_integration/apis/core/translations.ts +++ b/test/api_integration/apis/core/translations.ts @@ -18,8 +18,11 @@ export default function ({ getService }: FtrProviderContext) { expect(response.body.locale).to.eql('en'); expect(response.header).to.have.property('content-type', 'application/json; charset=utf-8'); - expect(response.header).to.have.property('cache-control', 'must-revalidate'); - expect(response.header).to.have.property('etag'); + expect(response.header).to.have.property( + 'cache-control', + 'public, max-age=31536000, immutable' + ); + expect(response.header).not.to.have.property('etag'); }); }); diff --git a/test/server_integration/http/platform/cache.ts b/test/server_integration/http/platform/cache.ts index 6e1cd8ab39db0..80d0bbfebd5bd 100644 --- a/test/server_integration/http/platform/cache.ts +++ b/test/server_integration/http/platform/cache.ts @@ -22,7 +22,7 @@ export default function ({ getService }: FtrProviderContext) { it('allows translation bundles to be cached', async () => { await supertest .get('/translations/en.json') - .expect('Cache-Control', 'must-revalidate') + .expect('Cache-Control', 'public, max-age=31536000, immutable') .expect(200); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/core/translations.ts b/x-pack/test_serverless/api_integration/test_suites/common/core/translations.ts index 26b4302bf2c71..b982799f4a71b 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/core/translations.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/core/translations.ts @@ -17,8 +17,11 @@ export default function ({ getService }: FtrProviderContext) { expect(response.body.locale).to.eql('en'); expect(response.header).to.have.property('content-type', 'application/json; charset=utf-8'); - expect(response.header).to.have.property('cache-control', 'must-revalidate'); - expect(response.header).to.have.property('etag'); + expect(response.header).to.have.property( + 'cache-control', + 'public, max-age=31536000, immutable' + ); + expect(response.header).not.to.have.property('etag'); }); }); From 910e7f72523d0b015ec496aa967e76c61cf6c489 Mon Sep 17 00:00:00 2001 From: Liam Thompson <32779855+leemthompo@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:34:11 +0200 Subject: [PATCH 20/82] [Ent Search] Update Notebooks in console text (#181462) Closes https://github.com/elastic/search-docs-team/issues/100 - Update Introduction notebook to explain the what, how, and why of notebooks, clarify that available as preview (not actually runnable in our UI) currently, how to use in Colab and locally, link to Search Labs - Update notebook preview snippets to concise descriptions - Update link to search labs notebooks, update button text - General rewordings ## Before https://github.com/elastic/kibana/assets/32779855/a17d9b26-814b-4303-aac6-a8ef0a178ecf ## After https://github.com/elastic/kibana/assets/32779855/c8cfd685-c89b-4726-b89d-babcc7fbc3cf --- .../search_notebooks/common/constants.ts | 39 +++++++++++++++++-- .../components/search_labs_button_panel.tsx | 4 +- .../public/components/search_notebooks.tsx | 2 +- .../server/lib/notebook_catalog.ts | 12 +++--- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/search_notebooks/common/constants.ts b/x-pack/plugins/search_notebooks/common/constants.ts index 0a6a065751b82..46cc4b339003b 100644 --- a/x-pack/plugins/search_notebooks/common/constants.ts +++ b/x-pack/plugins/search_notebooks/common/constants.ts @@ -11,25 +11,56 @@ import { Notebook } from './types'; export const INTRODUCTION_NOTEBOOK: Notebook = { id: 'introduction', title: i18n.translate('xpack.searchNotebooks.introductionNotebook.title', { - defaultMessage: 'What are Jupyter Notebooks?', + defaultMessage: 'Jupyter notebooks', }), description: i18n.translate('xpack.searchNotebooks.introductionNotebook.description', { defaultMessage: - 'Jupyter Notebooks are an open-source document format for sharing interactive code embedded in narrative text.', + 'Learn all about Jupyter notebooks, how to preview them in the UI, and how to run them.', }), notebook: { cells: [ { cell_type: 'markdown', source: [ - '# What are Jupyter Notebooks\n', + '# What are Jupyter notebooks?\n', '\n', 'Jupyter Notebooks combine executable code and rich Markdown documentation in a single interactive document. Easy to run, edit and share, they enable collaboration in fields like data science, scientific computing, and machine learning.', + '\n', + '\n', + 'Notebooks are composed of cells, which can contain Markdown text like this, or Python code like the cell below.\n', ], }, { cell_type: 'code', - source: ['print("Hello world!!!")'], + source: ['print("Hello world!!!")\n'], + }, + { + cell_type: 'markdown', + source: [ + '\nNotebooks are a great way to test and prototype code, and share results with others. In our notebooks we use the official [Elasticsearch Python client](https://elasticsearch-py.readthedocs.io/en/latest/) to call the Elasticsearch APIs.', + ], + }, + { + cell_type: 'markdown', + source: [ + '## Elastic Jupyter notebooks\n', + '\n', + 'You can **preview** a number of our Jupyter notebooks right here in the UI. Check out the next section for how to **run** notebooks.\n', + '\nFind all of our available notebooks in the `elasticsearch-labs` [GitHub repository](https://github.com/elastic/elasticsearch-labs).', + '\n', + '## How to run notebooks\n', + '\n', + 'You can run notebooks in two ways:', + '\n', + '- **Run in Colab**: You can run all our notebooks in Google [Colab](https://colab.research.google.com), a free, zero configuration, in-browser notebook execution environment. Just click the `Open in Colab` button at the top of a notebook to test it in Colab.\n', + '- **Run locally**: You can also download the notebooks from the repository and run them locally using tools like [JupyterLab](https://jupyter.org/install).\n', + '\n', + 'ℹ️ Just make sure to copy your **Elasticsearch endpoint and API key** so the notebook can run against your deployment.\n', + '\n', + '## Learn more\n', + '\n', + 'Check out [Elastic Search Labs](https://www.elastic.co/search-labs) for all the latest advanced content for Elasticsearch users, including additional Python examples.', + ], }, ], }, diff --git a/x-pack/plugins/search_notebooks/public/components/search_labs_button_panel.tsx b/x-pack/plugins/search_notebooks/public/components/search_labs_button_panel.tsx index d0682aacd1b73..53f982e9dc371 100644 --- a/x-pack/plugins/search_notebooks/public/components/search_labs_button_panel.tsx +++ b/x-pack/plugins/search_notebooks/public/components/search_labs_button_panel.tsx @@ -13,7 +13,7 @@ export const SearchLabsButtonPanel = () => { { data-telemetry-id="console-notebooks-search-labs-btn" > {i18n.translate('xpack.searchNotebooks.searchLabsLink', { - defaultMessage: 'See more at Elastic Search Labs', + defaultMessage: 'Browse all our notebooks', })} diff --git a/x-pack/plugins/search_notebooks/public/components/search_notebooks.tsx b/x-pack/plugins/search_notebooks/public/components/search_notebooks.tsx index 312090de46755..127de94877c22 100644 --- a/x-pack/plugins/search_notebooks/public/components/search_notebooks.tsx +++ b/x-pack/plugins/search_notebooks/public/components/search_notebooks.tsx @@ -70,7 +70,7 @@ export const SearchNotebooks = () => { /> {i18n.translate('xpack.searchNotebooks.notebooksList.availableNotebooks.title', { - defaultMessage: 'Available Notebooks', + defaultMessage: 'Notebook previews', })} Date: Wed, 24 Apr 2024 13:43:58 +0200 Subject: [PATCH 21/82] [Cases] Fix failing test: `useCreateCaseModal ` (#181386) Fixes #174205 ## Summary The failing test was rendering the opened modal and not doing anything with it. I removed that block and the execution time locally went from 200+ ms to around 4. --- .../components/use_create_case_modal/index.test.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index fa7e0213166ee..ab5bd1bd10dfe 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -7,7 +7,6 @@ import React from 'react'; import { renderHook, act } from '@testing-library/react-hooks'; -import { render, act as reactAct } from '@testing-library/react'; import { useKibana } from '../../common/lib/kibana'; import type { UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; @@ -19,8 +18,7 @@ jest.mock('../../common/lib/kibana'); const useKibanaMock = useKibana as jest.Mocked; const onCaseCreated = jest.fn(); -// FLAKY: https://github.com/elastic/kibana/issues/174205 -describe.skip('useCreateCaseModal', () => { +describe('useCreateCaseModal', () => { let navigateToApp: jest.Mock; beforeEach(() => { @@ -95,14 +93,6 @@ describe.skip('useCreateCaseModal', () => { act(() => { result.current.openModal(); - }); - - await reactAct(async () => { - const modal = result.current.modal; - render({modal}); - }); - - act(() => { result.current.modal.props.onSuccess({ id: 'case-id' }); }); From 2bd49f5ae4816c75a87a371e58ca2b7ea73d4bd4 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 24 Apr 2024 13:55:03 +0200 Subject: [PATCH 22/82] [ML] AIOps: Fix query string for the metric chart (#181314) ## Summary Fixes https://github.com/elastic/kibana/issues/179814 Query string from the Unified Search query bar was applying to the change point agg request, but wasn't in sync with the query service to correctly render the chart preview. With the PR the query string is synchronized and metric charts are rendered correctly. ### Checklist - [ ] [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 --- .../change_point_detection_context.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx b/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx index eabfc277b7f9f..75f4820316e30 100644 --- a/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx +++ b/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx @@ -132,7 +132,7 @@ export const ChangePointDetectionContextProvider: FC = ({ children }) => { const { uiSettings, data: { - query: { filterManager }, + query: { filterManager, queryString }, }, } = useAiopsAppContext(); @@ -241,11 +241,18 @@ export const ChangePointDetectionContextProvider: FC = ({ children }) => { if (requestParamsFromUrl.filters) { filterManager.setFilters(requestParamsFromUrl.filters); } + if (requestParamsFromUrl.query) { + queryString.setQuery(requestParamsFromUrl.query); + } if (globalFilters) { filterManager?.addFilters(globalFilters); } + return () => { + filterManager?.removeAll(); + queryString.clearQuery(); + }; }, - [requestParamsFromUrl.filters, filterManager] + [requestParamsFromUrl.filters, requestParamsFromUrl.query, filterManager, queryString] ); const combinedQuery = useMemo(() => { From 923b10baafd81f76321a7ae1f5105c183418fac9 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 24 Apr 2024 14:35:06 +0200 Subject: [PATCH 23/82] Fix `maps` plugin async route registration (#181518) ## Summary Async registration is bad, especially when promise rejections are not caught. The PR adapts the routes registration to be synchronous --- .../server/data_indexing/indexing_routes.ts | 5 ++-- x-pack/plugins/maps/server/mvt/mvt_routes.ts | 8 +++---- x-pack/plugins/maps/server/plugin.ts | 2 +- x-pack/plugins/maps/server/routes.ts | 24 ++++++++++++++----- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts b/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts index 94fbb94165514..e7cb10427a297 100644 --- a/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts +++ b/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts @@ -26,11 +26,11 @@ import { getMatchingIndexes } from './get_indexes_matching_pattern'; export function initIndexingRoutes({ router, logger, - dataPlugin, + getDataPlugin, }: { router: IRouter; logger: Logger; - dataPlugin: DataPluginStart; + getDataPlugin: () => Promise; securityPlugin?: SecurityPluginStart; }) { router.versioned @@ -58,6 +58,7 @@ export function initIndexingRoutes({ async (context, request, response) => { const coreContext = await context.core; const { index, mappings } = request.body; + const dataPlugin = await getDataPlugin(); const indexPatternsService = await dataPlugin.indexPatterns.dataViewsServiceFactory( coreContext.savedObjects.client, coreContext.elasticsearch.client.asCurrentUser, diff --git a/x-pack/plugins/maps/server/mvt/mvt_routes.ts b/x-pack/plugins/maps/server/mvt/mvt_routes.ts index 1cd53f02f83c6..f768eb93dd9a3 100644 --- a/x-pack/plugins/maps/server/mvt/mvt_routes.ts +++ b/x-pack/plugins/maps/server/mvt/mvt_routes.ts @@ -27,11 +27,11 @@ const CACHE_TIMEOUT_SECONDS = 60 * 60; export function initMVTRoutes({ router, logger, - core, + getCore, }: { router: IRouter; logger: Logger; - core: CoreStart; + getCore: () => Promise; }) { router.versioned .get({ @@ -93,7 +93,7 @@ export function initMVTRoutes({ abortController: makeAbortController(request), body: tileRequest.body, context, - core, + core: await getCore(), executionContext: makeExecutionContext({ type: 'server', name: APP_ID, @@ -173,7 +173,7 @@ export function initMVTRoutes({ abortController: makeAbortController(request), body: tileRequest.body, context, - core, + core: await getCore(), executionContext: makeExecutionContext({ type: 'server', name: APP_ID, diff --git a/x-pack/plugins/maps/server/plugin.ts b/x-pack/plugins/maps/server/plugin.ts index dffd3e8a23aaa..8d926952d1bd0 100644 --- a/x-pack/plugins/maps/server/plugin.ts +++ b/x-pack/plugins/maps/server/plugin.ts @@ -145,7 +145,7 @@ export class MapsPlugin implements Plugin { ); } - setup(core: CoreSetup, plugins: SetupDeps) { + setup(core: CoreSetup, plugins: SetupDeps) { const getFilterMigrations = plugins.data.query.filterManager.getAllMigrations.bind( plugins.data.query.filterManager ); diff --git a/x-pack/plugins/maps/server/routes.ts b/x-pack/plugins/maps/server/routes.ts index 07bf8fefd9d14..32f7a9e6c18ea 100644 --- a/x-pack/plugins/maps/server/routes.ts +++ b/x-pack/plugins/maps/server/routes.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import fs from 'fs'; import path from 'path'; -import { CoreSetup, CoreStart, IRouter, Logger } from '@kbn/core/server'; +import { CoreSetup, IRouter, Logger } from '@kbn/core/server'; import { DataRequestHandlerContext } from '@kbn/data-plugin/server'; import { INDEX_SETTINGS_API_PATH, FONTS_API_PATH } from '../common/constants'; import { getIndexPatternSettings } from './lib/get_index_pattern_settings'; @@ -16,10 +16,8 @@ import { initMVTRoutes } from './mvt/mvt_routes'; import { initIndexingRoutes } from './data_indexing/indexing_routes'; import { StartDeps } from './types'; -export async function initRoutes(coreSetup: CoreSetup, logger: Logger): Promise { +export function initRoutes(coreSetup: CoreSetup, logger: Logger) { const router: IRouter = coreSetup.http.createRouter(); - const [coreStart, { data: dataPlugin }]: [CoreStart, StartDeps] = - (await coreSetup.getStartServices()) as unknown as [CoreStart, StartDeps]; router.versioned .get({ @@ -109,6 +107,20 @@ export async function initRoutes(coreSetup: CoreSetup, logger: Logger): Promise< } ); - initMVTRoutes({ router, logger, core: coreStart }); - initIndexingRoutes({ router, logger, dataPlugin }); + initMVTRoutes({ + router, + logger, + getCore: async () => { + const [core] = await coreSetup.getStartServices(); + return core; + }, + }); + initIndexingRoutes({ + router, + logger, + getDataPlugin: async () => { + const [, { data }] = await coreSetup.getStartServices(); + return data; + }, + }); } From 58562c95656d37ad458d204f1e1810c63b7b2456 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Wed, 24 Apr 2024 14:59:48 +0200 Subject: [PATCH 24/82] [SecuritySolutions] Fix entity analytics UI issues on dark mode (#181431) ## Summary We were using the wrong colour variables in a couple of places. These changes only impact the dark mode UI. Fixed pages: ![Screenshot 2024-04-23 at 14 55 20](https://github.com/elastic/kibana/assets/1490444/4b330c43-559d-4542-ab6b-46e98b69ce19) ![Screenshot 2024-04-23 at 14 36 12](https://github.com/elastic/kibana/assets/1490444/0b47b893-e9f2-4a54-b7c6-d055f2bb91a6) . --- .../components/file_picker_step.tsx | 2 +- .../shared/components/entity_table/columns.tsx | 6 +++--- .../components/side_panel/new_user_detail/columns.tsx | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx index efe70c77f4c8f..942b3a18c2c21 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality_file_uploader/components/file_picker_step.tsx @@ -137,7 +137,7 @@ export const AssetCriticalityFilePickerStep: React.FC( {label ?? field} diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/columns.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/columns.tsx index da4e82976d515..fc3aeb6aedd9f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/columns.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/columns.tsx @@ -7,7 +7,7 @@ import { css } from '@emotion/react'; import React from 'react'; -import { euiLightVars } from '@kbn/ui-theme'; +import { euiThemeVars } from '@kbn/ui-theme'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; import { DefaultFieldRenderer } from '../../field_renderers/field_renderers'; @@ -21,8 +21,8 @@ const fieldColumn: EuiBasicTableColumn = { render: (label: string, { field }) => ( {label ?? field} From 707ec552d9a303dae2ebb4603e8fd4ca157ff6d4 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Zahid Date: Wed, 24 Apr 2024 15:27:08 +0200 Subject: [PATCH 25/82] [Dataset quality] Pass breakdown field over to logs explorer from degraded docs chart (#181509) ## Summary The PR adds the `breakdownField` param in `LogsExplorerNavigationParams` so that when "Explorer data in Logs Explorer" is clicked on Degraded Docs chart on Dataset Quality flyout while the chart has a breakdown field selected, the field is passed over to Logs Explorer. https://github.com/elastic/kibana/assets/2748376/b380ac85-e40e-451b-983f-41c68f87ed7b --- .../observability/locators/logs_explorer.ts | 4 ++ .../common/locators/locators.test.ts | 48 +++++++++++++++++++ .../locators/utils/construct_locator_path.ts | 12 ++++- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/packages/deeplinks/observability/locators/logs_explorer.ts b/packages/deeplinks/observability/locators/logs_explorer.ts index 1442e7afe02cd..39a28f91e7c11 100644 --- a/packages/deeplinks/observability/locators/logs_explorer.ts +++ b/packages/deeplinks/observability/locators/logs_explorer.ts @@ -68,6 +68,10 @@ export interface LogsExplorerNavigationParams extends SerializableRecord { * Optionally apply curated filter controls */ filterControls?: FilterControls; + /** + * Optionally set chart's breakdown field + */ + breakdownField?: string; } export interface LogsExplorerLocatorParams extends LogsExplorerNavigationParams { diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts index cdc50af3f5471..6761953c62325 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts @@ -99,6 +99,21 @@ describe('Observability Logs Explorer Locators', () => { }); }); + it('should allow specifying breakdown field', async () => { + const params: AllDatasetsLocatorParams = { + breakdownField: 'service.name', + }; + + const { allDatasetsLocator } = await setup(); + const location = await allDatasetsLocator.getLocation(params); + + expect(location).toMatchObject({ + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, + path: '/?pageState=(breakdownField:service.name,dataSourceSelection:(selectionType:all),v:2)', + state: {}, + }); + }); + it('should allow specifying columns', async () => { const params: AllDatasetsLocatorParams = { columns: [{ field: '_source', type: 'document-field' }], @@ -211,6 +226,22 @@ describe('Observability Logs Explorer Locators', () => { }); }); + it('should allow specifying breakdown field', async () => { + const params: ObsLogsExplorerDataViewLocatorParams = { + id: 'data-view-id', + breakdownField: 'service.name', + }; + + const { dataViewLocator } = await setup(); + const location = await dataViewLocator.getLocation(params); + + expect(location).toMatchObject({ + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, + path: `/?pageState=(breakdownField:service.name,dataSourceSelection:(selection:(dataView:(dataType:unresolved,id:data-view-id)),selectionType:dataView),v:2)`, + state: {}, + }); + }); + it('should allow specifying columns', async () => { const params: ObsLogsExplorerDataViewLocatorParams = { id: 'data-view-id', @@ -331,6 +362,23 @@ describe('Observability Logs Explorer Locators', () => { }); }); + it('should allow specifying breakdown field', async () => { + const params: SingleDatasetLocatorParams = { + integration, + dataset, + breakdownField: 'service.name', + }; + + const { singleDatasetLocator } = await setup(); + const location = await singleDatasetLocator.getLocation(params); + + expect(location).toMatchObject({ + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, + path: `/?pageState=(breakdownField:service.name,dataSourceSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),v:2)`, + state: {}, + }); + }); + it('should allow specifying columns', async () => { const params: SingleDatasetLocatorParams = { integration, diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts index eb96fb81ae2f3..fd1a0249b32f8 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts @@ -35,7 +35,16 @@ interface LocatorPathConstructionParams { export const constructLocatorPath = async (params: LocatorPathConstructionParams) => { const { dataSourceSelection, - locatorParams: { filterControls, filters, query, refreshInterval, timeRange, columns, origin }, + locatorParams: { + filterControls, + filters, + query, + refreshInterval, + timeRange, + columns, + origin, + breakdownField, + }, useHash, } = params; @@ -47,6 +56,7 @@ export const constructLocatorPath = async (params: LocatorPathConstructionParams query, refreshInterval, time: timeRange, + breakdownField, columns: columns?.map((column) => { return column.type === 'smart-field' ? SMART_FALLBACK_FIELDS[column.smartField] : column; }), From 42fa118b7dd4e0ec9108ca056d5f705d6f5617e9 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Wed, 24 Apr 2024 16:38:24 +0300 Subject: [PATCH 26/82] [Cases] Populate user info from fake requests (#180671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Set a system user name when the request is fake. This is helpful to show user information to the case created by the case action. ## Testing 1. Create a rule with a case action 2. In the created case verify that the `elastic/kibana` user is shown and not the `Unknown` user Screenshot 2024-04-22 at 10 37 46 PM ### 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: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../actions_client/actions_client.mock.ts | 2 +- .../actions_authorization.mock.ts | 2 +- x-pack/plugins/actions/server/feature.ts | 2 +- x-pack/plugins/actions/tsconfig.json | 3 +- .../plugins/cases/common/constants/index.ts | 1 + .../cases/server/client/factory.test.ts | 124 ++++++++++++++++++ x-pack/plugins/cases/server/client/factory.ts | 10 +- x-pack/plugins/cases/server/client/mocks.ts | 36 ++++- x-pack/plugins/cases/server/plugin.test.ts | 4 +- x-pack/plugins/cases/tsconfig.json | 1 + 10 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 x-pack/plugins/cases/server/client/factory.test.ts diff --git a/x-pack/plugins/actions/server/actions_client/actions_client.mock.ts b/x-pack/plugins/actions/server/actions_client/actions_client.mock.ts index d58476738b9be..433e3850cae2a 100644 --- a/x-pack/plugins/actions/server/actions_client/actions_client.mock.ts +++ b/x-pack/plugins/actions/server/actions_client/actions_client.mock.ts @@ -6,7 +6,7 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { ActionsClient } from './actions_client'; +import type { ActionsClient } from './actions_client'; type ActionsClientContract = PublicMethodsOf; export type ActionsClientMock = jest.Mocked; diff --git a/x-pack/plugins/actions/server/authorization/actions_authorization.mock.ts b/x-pack/plugins/actions/server/authorization/actions_authorization.mock.ts index 20e95f1560c5a..ba106d014c28d 100644 --- a/x-pack/plugins/actions/server/authorization/actions_authorization.mock.ts +++ b/x-pack/plugins/actions/server/authorization/actions_authorization.mock.ts @@ -6,7 +6,7 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { ActionsAuthorization } from './actions_authorization'; +import type { ActionsAuthorization } from './actions_authorization'; export type ActionsAuthorizationMock = jest.Mocked>; diff --git a/x-pack/plugins/actions/server/feature.ts b/x-pack/plugins/actions/server/feature.ts index b44aaf61cad62..9fc48b705d25b 100644 --- a/x-pack/plugins/actions/server/feature.ts +++ b/x-pack/plugins/actions/server/feature.ts @@ -5,8 +5,8 @@ * 2.0. */ +import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; import { i18n } from '@kbn/i18n'; -import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { ACTION_SAVED_OBJECT_TYPE, ACTION_TASK_PARAMS_SAVED_OBJECT_TYPE, diff --git a/x-pack/plugins/actions/tsconfig.json b/x-pack/plugins/actions/tsconfig.json index 76ca916bc0ad0..d060287d24143 100644 --- a/x-pack/plugins/actions/tsconfig.json +++ b/x-pack/plugins/actions/tsconfig.json @@ -46,7 +46,8 @@ "@kbn/actions-types", "@kbn/core-http-server", "@kbn/core-test-helpers-kbn-server", - "@kbn/security-plugin-types-server" + "@kbn/security-plugin-types-server", + "@kbn/core-application-common" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/cases/common/constants/index.ts b/x-pack/plugins/cases/common/constants/index.ts index 6b6b914826b61..a8868010d2312 100644 --- a/x-pack/plugins/cases/common/constants/index.ts +++ b/x-pack/plugins/cases/common/constants/index.ts @@ -192,6 +192,7 @@ export const GET_CONNECTORS_CONFIGURE_API_TAG = 'casesGetConnectorsConfigure'; export const DEFAULT_USER_SIZE = 10; export const MAX_ASSIGNEES_PER_CASE = 10; export const NO_ASSIGNEES_FILTERING_KEYWORD = 'none'; +export const KIBANA_SYSTEM_USERNAME = 'elastic/kibana'; /** * Delays diff --git a/x-pack/plugins/cases/server/client/factory.test.ts b/x-pack/plugins/cases/server/client/factory.test.ts new file mode 100644 index 0000000000000..69147e888aeec --- /dev/null +++ b/x-pack/plugins/cases/server/client/factory.test.ts @@ -0,0 +1,124 @@ +/* + * 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 { coreMock, httpServerMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { CasesClientFactory } from './factory'; +import { createCasesClientFactoryMockArgs } from './mocks'; +import { createCasesClient } from './client'; +import type { FakeRawRequest } from '@kbn/core-http-server'; +import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; + +jest.mock('./client'); + +describe('CasesClientFactory', () => { + const coreStart = coreMock.createStart(); + const request = httpServerMock.createKibanaRequest(); + + const rawRequest: FakeRawRequest = { + headers: {}, + path: '/', + }; + + const fakeRequest = CoreKibanaRequest.from(rawRequest); + const createCasesClientMocked = createCasesClient as jest.Mock; + const logger = loggingSystemMock.createLogger(); + const args = createCasesClientFactoryMockArgs(); + let casesClientFactory: CasesClientFactory; + + args.featuresPluginStart.getKibanaFeatures.mockReturnValue([]); + + beforeEach(() => { + casesClientFactory = new CasesClientFactory(logger); + casesClientFactory.initialize(args); + jest.clearAllMocks(); + }); + + describe('user info', () => { + it('constructs the user info from user profiles', async () => { + const scopedClusterClient = coreStart.elasticsearch.client.asScoped(request).asCurrentUser; + args.securityPluginStart.userProfiles.getCurrent.mockResolvedValueOnce({ + // @ts-expect-error: not all fields are needed + user: { username: 'my_user', full_name: 'My user', email: 'elastic@elastic.co' }, + }); + + await casesClientFactory.create({ + request, + savedObjectsService: coreStart.savedObjects, + scopedClusterClient, + }); + + expect(args.securityPluginStart.userProfiles.getCurrent).toHaveBeenCalled(); + expect(args.securityPluginStart.authc.getCurrentUser).not.toHaveBeenCalled(); + expect(createCasesClientMocked.mock.calls[0][0].user).toEqual({ + username: 'my_user', + full_name: 'My user', + email: 'elastic@elastic.co', + }); + }); + + it('constructs the user info from the authc service if the user profile is not available', async () => { + const scopedClusterClient = coreStart.elasticsearch.client.asScoped(request).asCurrentUser; + // @ts-expect-error: not all fields are needed + args.securityPluginStart.authc.getCurrentUser.mockReturnValueOnce({ + username: 'my_user_2', + full_name: 'My user 2', + email: 'elastic2@elastic.co', + }); + + await casesClientFactory.create({ + request, + savedObjectsService: coreStart.savedObjects, + scopedClusterClient, + }); + + expect(args.securityPluginStart.userProfiles.getCurrent).toHaveBeenCalled(); + expect(args.securityPluginStart.authc.getCurrentUser).toHaveBeenCalled(); + expect(createCasesClientMocked.mock.calls[0][0].user).toEqual({ + username: 'my_user_2', + full_name: 'My user 2', + email: 'elastic2@elastic.co', + }); + }); + + it('constructs the user info from fake requests correctly', async () => { + const scopedClusterClient = + coreStart.elasticsearch.client.asScoped(fakeRequest).asCurrentUser; + + await casesClientFactory.create({ + request: fakeRequest, + savedObjectsService: coreStart.savedObjects, + scopedClusterClient, + }); + + expect(args.securityPluginStart.userProfiles.getCurrent).toHaveBeenCalled(); + expect(args.securityPluginStart.authc.getCurrentUser).toHaveBeenCalled(); + expect(createCasesClientMocked.mock.calls[0][0].user).toEqual({ + username: 'elastic/kibana', + full_name: null, + email: null, + }); + }); + + it('return null for all user fields if it cannot find the user info', async () => { + const scopedClusterClient = coreStart.elasticsearch.client.asScoped(request).asCurrentUser; + + await casesClientFactory.create({ + request, + savedObjectsService: coreStart.savedObjects, + scopedClusterClient, + }); + + expect(args.securityPluginStart.userProfiles.getCurrent).toHaveBeenCalled(); + expect(args.securityPluginStart.authc.getCurrentUser).toHaveBeenCalled(); + expect(createCasesClientMocked.mock.calls[0][0].user).toEqual({ + username: null, + full_name: null, + email: null, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/server/client/factory.ts b/x-pack/plugins/cases/server/client/factory.ts index 137cf69e0763a..5bb04c1da9e86 100644 --- a/x-pack/plugins/cases/server/client/factory.ts +++ b/x-pack/plugins/cases/server/client/factory.ts @@ -34,7 +34,7 @@ import type { import type { PublicMethodsOf } from '@kbn/utility-types'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import type { FilesStart } from '@kbn/files-plugin/server'; -import { SAVED_OBJECT_TYPES } from '../../common/constants'; +import { KIBANA_SYSTEM_USERNAME, SAVED_OBJECT_TYPES } from '../../common/constants'; import { Authorization } from '../authorization/authorization'; import { CaseConfigureService, @@ -286,6 +286,14 @@ export class CasesClientFactory { this.logger.debug(`Failed to retrieve user info from authc: ${error}`); } + if (request.isFakeRequest) { + return { + username: KIBANA_SYSTEM_USERNAME, + full_name: null, + email: null, + }; + } + return { username: null, full_name: null, diff --git a/x-pack/plugins/cases/server/client/mocks.ts b/x-pack/plugins/cases/server/client/mocks.ts index 608a9ae2ff510..3de350f5a3981 100644 --- a/x-pack/plugins/cases/server/client/mocks.ts +++ b/x-pack/plugins/cases/server/client/mocks.ts @@ -9,12 +9,20 @@ import type { PublicContract, PublicMethodsOf } from '@kbn/utility-types'; import { loggingSystemMock, savedObjectsClientMock } from '@kbn/core/server/mocks'; import type { ISavedObjectsSerializer } from '@kbn/core-saved-objects-server'; -import { createFileServiceMock } from '@kbn/files-plugin/server/mocks'; +import { + createFileServiceFactoryMock, + createFileServiceMock, +} from '@kbn/files-plugin/server/mocks'; import { securityMock } from '@kbn/security-plugin/server/mocks'; import { actionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; import { makeLensEmbeddableFactory } from '@kbn/lens-plugin/server/embeddable/make_lens_embeddable_factory'; import { serializerMock } from '@kbn/core-saved-objects-base-server-mocks'; - +import { spacesMock } from '@kbn/spaces-plugin/server/mocks'; +import { featuresPluginMock } from '@kbn/features-plugin/server/mocks'; +import { actionsMock } from '@kbn/actions-plugin/server/mocks'; +import { notificationsMock } from '@kbn/notifications-plugin/server/mocks'; +import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; import type { CasesSearchRequest } from '../../common/types/api'; import type { CasesClient, CasesClientInternal } from '.'; import type { AttachmentsSubClient } from './attachments/client'; @@ -214,6 +222,30 @@ export const createCasesClientMockArgs = () => { }; }; +export const createCasesClientFactoryMockArgs = () => { + return { + securityPluginSetup: securityMock.createSetup(), + securityPluginStart: securityMock.createStart(), + spacesPluginStart: spacesMock.createStart(), + featuresPluginStart: featuresPluginMock.createSetup(), + actionsPluginStart: actionsMock.createStart(), + licensingPluginStart: licensingMock.createStart(), + notifications: notificationsMock.createStart(), + ruleRegistry: { getRacClientWithRequest: jest.fn(), alerting: alertsMock.createStart() }, + filesPluginStart: { fileServiceFactory: createFileServiceFactoryMock() }, + publicBaseUrl: 'https//example.com', + lensEmbeddableFactory: jest.fn().mockReturnValue( + makeLensEmbeddableFactory( + () => ({}), + () => ({}), + {} + ) + ), + externalReferenceAttachmentTypeRegistry: createExternalReferenceAttachmentTypeRegistryMock(), + persistableStateAttachmentTypeRegistry: createPersistableStateAttachmentTypeRegistryMock(), + }; +}; + export const createCasesClientMockSearchRequest = ( overwrites?: CasesSearchRequest ): CasesSearchRequest => ({ diff --git a/x-pack/plugins/cases/server/plugin.test.ts b/x-pack/plugins/cases/server/plugin.test.ts index 8c669f6de0e68..ac328f25de391 100644 --- a/x-pack/plugins/cases/server/plugin.test.ts +++ b/x-pack/plugins/cases/server/plugin.test.ts @@ -11,7 +11,7 @@ import { coreMock } from '@kbn/core/server/mocks'; import { usageCollectionPluginMock } from '@kbn/usage-collection-plugin/server/mocks'; import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; import { featuresPluginMock } from '@kbn/features-plugin/server/mocks'; -import { createFilesSetupMock } from '@kbn/files-plugin/server/mocks'; +import { createFileServiceFactoryMock, createFilesSetupMock } from '@kbn/files-plugin/server/mocks'; import { securityMock } from '@kbn/security-plugin/server/mocks'; import { makeLensEmbeddableFactory } from '@kbn/lens-plugin/server/embeddable/make_lens_embeddable_factory'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; @@ -69,7 +69,7 @@ describe('Cases Plugin', () => { pluginsStart = { licensing: licensingMock.createStart(), actions: actionsMock.createStart(), - files: { fileServiceFactory: { asScoped: jest.fn(), asInternal: jest.fn() } }, + files: { fileServiceFactory: createFileServiceFactoryMock() }, features: featuresPluginMock.createStart(), security: securityMock.createStart(), notifications: notificationsMock.createStart(), diff --git a/x-pack/plugins/cases/tsconfig.json b/x-pack/plugins/cases/tsconfig.json index b5a426c3f9c0b..535f4e5e106dc 100644 --- a/x-pack/plugins/cases/tsconfig.json +++ b/x-pack/plugins/cases/tsconfig.json @@ -74,6 +74,7 @@ "@kbn/core-logging-server-mocks", "@kbn/core-logging-browser-mocks", "@kbn/data-views-plugin", + "@kbn/core-http-router-server-internal", ], "exclude": [ "target/**/*", From 05478009c69f5993207f8db1f93f1230f4006a96 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Wed, 24 Apr 2024 16:09:46 +0200 Subject: [PATCH 27/82] [HTTP/OAS] Support `deprecated` field (#181240) --- packages/kbn-config-schema/index.ts | 2 ++ .../kbn-config-schema/src/oas_meta_fields.ts | 1 + .../kbn-config-schema/src/types/type.test.ts | 24 ++++++++++++++----- packages/kbn-config-schema/src/types/type.ts | 14 +++++++++-- .../__snapshots__/generate_oas.test.ts.snap | 4 ++++ .../src/generate_oas.test.util.ts | 7 +++++- .../post_process_mutations/mutations/index.ts | 3 ++- .../post_process_mutations/mutations/utils.ts | 8 +++++++ 8 files changed, 53 insertions(+), 10 deletions(-) diff --git a/packages/kbn-config-schema/index.ts b/packages/kbn-config-schema/index.ts index dfb701f0a039c..c5b46932463db 100644 --- a/packages/kbn-config-schema/index.ts +++ b/packages/kbn-config-schema/index.ts @@ -246,6 +246,7 @@ export type Schema = typeof schema; import { META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_OPTIONAL, + META_FIELD_X_OAS_DEPRECATED, META_FIELD_X_OAS_MAX_LENGTH, META_FIELD_X_OAS_MIN_LENGTH, META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES, @@ -254,6 +255,7 @@ import { export const metaFields = Object.freeze({ META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_OPTIONAL, + META_FIELD_X_OAS_DEPRECATED, META_FIELD_X_OAS_MAX_LENGTH, META_FIELD_X_OAS_MIN_LENGTH, META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES, diff --git a/packages/kbn-config-schema/src/oas_meta_fields.ts b/packages/kbn-config-schema/src/oas_meta_fields.ts index 44422793558d4..ad04f9b30ef16 100644 --- a/packages/kbn-config-schema/src/oas_meta_fields.ts +++ b/packages/kbn-config-schema/src/oas_meta_fields.ts @@ -16,3 +16,4 @@ export const META_FIELD_X_OAS_MAX_LENGTH = 'x-oas-max-length' as const; export const META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES = 'x-oas-get-additional-properties' as const; export const META_FIELD_X_OAS_REF_ID = 'x-oas-ref-id' as const; +export const META_FIELD_X_OAS_DEPRECATED = 'x-oas-deprecated' as const; diff --git a/packages/kbn-config-schema/src/types/type.test.ts b/packages/kbn-config-schema/src/types/type.test.ts index 4d6636a55b9ca..a4784af2e8b62 100644 --- a/packages/kbn-config-schema/src/types/type.test.ts +++ b/packages/kbn-config-schema/src/types/type.test.ts @@ -9,7 +9,7 @@ import { get } from 'lodash'; import { internals } from '../internals'; import { Type, TypeOptions } from './type'; -import { META_FIELD_X_OAS_REF_ID } from '../oas_meta_fields'; +import { META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_DEPRECATED } from '../oas_meta_fields'; class MyType extends Type { constructor(opts: TypeOptions = {}) { @@ -17,9 +17,21 @@ class MyType extends Type { } } -test('meta', () => { - const type = new MyType({ meta: { description: 'my description', id: 'foo' } }); - const meta = type.getSchema().describe(); - expect(get(meta, 'flags.description')).toBe('my description'); - expect(get(meta, `metas[0].${META_FIELD_X_OAS_REF_ID}`)).toBe('foo'); +describe('meta', () => { + it('sets meta when provided', () => { + const type = new MyType({ + meta: { description: 'my description', id: 'foo', deprecated: true }, + }); + const meta = type.getSchema().describe(); + expect(get(meta, 'flags.description')).toBe('my description'); + expect(get(meta, `metas[0].${META_FIELD_X_OAS_REF_ID}`)).toBe('foo'); + expect(get(meta, `metas[1].${META_FIELD_X_OAS_DEPRECATED}`)).toBe(true); + }); + + it('does not set meta when no provided', () => { + const type = new MyType(); + const meta = type.getSchema().describe(); + expect(get(meta, 'flags.description')).toBeUndefined(); + expect(get(meta, 'metas')).toBeUndefined(); + }); }); diff --git a/packages/kbn-config-schema/src/types/type.ts b/packages/kbn-config-schema/src/types/type.ts index 1e312cc7adc7e..80ed3f90fdd2a 100644 --- a/packages/kbn-config-schema/src/types/type.ts +++ b/packages/kbn-config-schema/src/types/type.ts @@ -7,16 +7,23 @@ */ import type { AnySchema, CustomValidator, ErrorReport } from 'joi'; -import { META_FIELD_X_OAS_REF_ID } from '../oas_meta_fields'; +import { META_FIELD_X_OAS_DEPRECATED, META_FIELD_X_OAS_REF_ID } from '../oas_meta_fields'; import { SchemaTypeError, ValidationError } from '../errors'; import { Reference } from '../references'; -/** Meta fields used when introspecting runtime validation */ +/** + * Meta fields used when introspecting runtime validation. Most notably for + * generating OpenAPI spec. + */ export interface TypeMeta { /** * A human-friendly description of this type to be used in documentation. */ description?: string; + /** + * Whether this field is deprecated. + */ + deprecated?: boolean; /** * A string that uniquely identifies this schema. Used when generating OAS * to create refs instead of inline schemas. @@ -108,6 +115,9 @@ export abstract class Type { if (options.meta.id) { schema = schema.meta({ [META_FIELD_X_OAS_REF_ID]: options.meta.id }); } + if (options.meta.deprecated) { + schema = schema.meta({ [META_FIELD_X_OAS_DEPRECATED]: true }); + } } // Attach generic error handler only if it hasn't been attached yet since diff --git a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap index 42deee2907f43..aac31188c4985 100644 --- a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap +++ b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap @@ -155,6 +155,10 @@ Object { "schema": Object { "additionalProperties": false, "properties": Object { + "deprecatedFoo": Object { + "deprecated": true, + "type": "string", + }, "foo": Object { "type": "string", }, diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts index e435065f0089f..41a2458619000 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts @@ -79,7 +79,12 @@ const getVersionedRouterDefaults = () => ({ fn: jest.fn(), options: { validate: { - request: { body: schema.object({ foo: schema.string() }) }, + request: { + body: schema.object({ + foo: schema.string(), + deprecatedFoo: schema.maybe(schema.string({ meta: { deprecated: true } })), + }), + }, response: { [200]: { body: schema.object({ fooResponse: schema.string() }) }, }, diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts index 4f5b31030695e..e200ba7d1ec27 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts @@ -10,7 +10,7 @@ import Joi from 'joi'; import { metaFields } from '@kbn/config-schema'; import type { OpenAPIV3 } from 'openapi-types'; import { parse } from '../../parse'; -import { deleteField, stripBadDefault } from './utils'; +import { deleteField, stripBadDefault, processDeprecated } from './utils'; import { IContext } from '../context'; const { @@ -62,6 +62,7 @@ export const processMap = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void }; export const processAny = (schema: OpenAPIV3.SchemaObject): void => { + processDeprecated(schema); stripBadDefault(schema); }; diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts index 5bad28b276d10..eacc005936a28 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts @@ -7,6 +7,7 @@ */ import type { OpenAPIV3 } from 'openapi-types'; +import { metaFields } from '@kbn/config-schema'; export const stripBadDefault = (schema: OpenAPIV3.SchemaObject): void => { if (schema.default?.special === 'deep') { @@ -26,6 +27,13 @@ export const stripBadDefault = (schema: OpenAPIV3.SchemaObject): void => { } }; +export const processDeprecated = (schema: OpenAPIV3.SchemaObject): void => { + if (metaFields.META_FIELD_X_OAS_DEPRECATED in schema) { + schema.deprecated = true; + deleteField(schema, metaFields.META_FIELD_X_OAS_DEPRECATED); + } +}; + /** Just for type convenience */ export const deleteField = (schema: Record, field: string): void => { delete schema[field]; From d5999c339a615a4e7cbd23741747dffa984da678 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 24 Apr 2024 16:29:06 +0200 Subject: [PATCH 28/82] [ML] Fix responsive layout for Trained Models table (#181541) ## Summary Closes https://github.com/elastic/kibana/issues/181530 - Sets percentage width for all columns - Sets responsive breakpoint - Makes Deployment stats table responsive as well ![Apr-24-2024 12-16-48](https://github.com/elastic/kibana/assets/5236598/2a14ffb9-de15-45e9-b8bc-276e10080864) ### Checklist - [x] 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)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../nodes_overview/allocated_models.tsx | 29 ++++++++++--------- .../model_management/model_actions.tsx | 6 ++-- .../model_management/models_list.tsx | 15 +++++----- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx index f0ff64eae6445..4a31112255d92 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx @@ -41,21 +41,22 @@ export const AllocatedModels: FC = ({ const columns: Array> = [ { + width: '10%', id: 'deployment_id', field: 'deployment_id', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.deploymentIdHeader', { defaultMessage: 'ID', }), - width: '150px', sortable: true, truncateText: false, + isExpander: false, 'data-test-subj': 'mlAllocatedModelsTableDeploymentId', }, { + width: '8%', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.modelRoutingStateHeader', { defaultMessage: 'Routing state', }), - width: '100px', 'data-test-subj': 'mlAllocatedModelsTableRoutingState', render: (v: AllocatedModel) => { const { routing_state: routingState, reason } = v.node.routing_state; @@ -68,32 +69,32 @@ export const AllocatedModels: FC = ({ }, }, { + width: '8%', id: 'node_name', field: 'node.name', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.nodeNameHeader', { defaultMessage: 'Node name', }), - width: '150px', sortable: true, truncateText: false, 'data-test-subj': 'mlAllocatedModelsTableNodeName', }, { + width: '10%', id: 'model_id', field: 'model_id', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.modelNameHeader', { defaultMessage: 'Name', }), - width: '250px', sortable: true, truncateText: false, 'data-test-subj': 'mlAllocatedModelsTableName', }, { + width: '8%', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.modelSizeHeader', { defaultMessage: 'Size', }), - width: '100px', truncateText: true, 'data-test-subj': 'mlAllocatedModelsTableSize', render: (v: AllocatedModel) => { @@ -101,6 +102,7 @@ export const AllocatedModels: FC = ({ }, }, { + width: '8%', name: ( = ({ ), - width: '100px', truncateText: false, 'data-test-subj': 'mlAllocatedModelsTableAllocation', render: (v: AllocatedModel) => { @@ -129,6 +130,7 @@ export const AllocatedModels: FC = ({ }, }, { + width: '8%', name: ( = ({ ), field: 'node.throughput_last_minute', - width: '100px', truncateText: false, 'data-test-subj': 'mlAllocatedModelsTableThroughput', }, { + width: '8%', name: ( = ({ ), - width: '100px', truncateText: false, 'data-test-subj': 'mlAllocatedModelsTableAvgInferenceTime', render: (v: AllocatedModel) => { @@ -196,56 +197,56 @@ export const AllocatedModels: FC = ({ }, }, { + width: '8%', name: i18n.translate( 'xpack.ml.trainedModels.nodesList.modelsList.modelInferenceCountHeader', { defaultMessage: 'Inference count', } ), - width: '100px', 'data-test-subj': 'mlAllocatedModelsTableInferenceCount', render: (v: AllocatedModel) => { return v.node.inference_count; }, }, { + width: '12%', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.modelStartTimeHeader', { defaultMessage: 'Start time', }), - width: '200px', 'data-test-subj': 'mlAllocatedModelsTableStartedTime', render: (v: AllocatedModel) => { return dateFormatter(v.node.start_time); }, }, { + width: '12%', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.modelLastAccessHeader', { defaultMessage: 'Last access', }), - width: '200px', 'data-test-subj': 'mlAllocatedModelsTableInferenceCount', render: (v: AllocatedModel) => { return v.node.last_access ? dateFormatter(v.node.last_access) : '-'; }, }, { + width: '8%', name: i18n.translate( 'xpack.ml.trainedModels.nodesList.modelsList.modelNumberOfPendingRequestsHeader', { defaultMessage: 'Pending requests', } ), - width: '100px', 'data-test-subj': 'mlAllocatedModelsTableNumberOfPendingRequests', render: (v: AllocatedModel) => { return v.node.number_of_pending_requests; }, }, { + width: '8%', name: i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.errorCountHeader', { defaultMessage: 'Errors', }), - width: '60px', 'data-test-subj': 'mlAllocatedModelsTableErrorCount', render: (v: AllocatedModel) => { return v.node.error_count ?? 0; @@ -255,6 +256,7 @@ export const AllocatedModels: FC = ({ return ( + responsiveBreakpoint={'xl'} allowNeutralSort={false} columns={columns} items={models} @@ -264,7 +266,6 @@ export const AllocatedModels: FC = ({ })} onTableChange={() => {}} data-test-subj={'mlNodesAllocatedModels'} - css={{ overflow: 'auto' }} /> ); }; diff --git a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx index c3b726d8bd2d6..5d690a7a58fd8 100644 --- a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx +++ b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx @@ -199,9 +199,8 @@ export function useModelActions({ } ), 'data-test-subj': 'mlModelsTableRowStartDeploymentAction', - // @ts-ignore EUI has a type check issue when type "button" is combined with an icon. icon: 'play', - type: 'button', + type: 'icon', isPrimary: true, enabled: (item) => { return canStartStopTrainedModels && !isLoading && item.state !== MODEL_STATE.DOWNLOADING; @@ -409,9 +408,8 @@ export function useModelActions({ defaultMessage: 'Download', }), 'data-test-subj': 'mlModelsTableRowDownloadModelAction', - // @ts-ignore EUI has a type check issue when type "button" is combined with an icon. icon: 'download', - type: 'button', + type: 'icon', isPrimary: true, available: (item) => canCreateTrainedModels && diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index 8f4a9ae1e55f1..242db5904252d 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -486,7 +486,7 @@ export const ModelsList: FC = ({ const columns: Array> = [ { align: 'left', - width: '40px', + width: '32px', isExpander: true, render: (item: ModelItem) => { if (!item.stats) { @@ -512,7 +512,7 @@ export const ModelsList: FC = ({ }, { name: modelIdColumnName, - width: '215px', + width: '15%', sortable: ({ model_id: modelId }: ModelItem) => modelId, truncateText: false, textOnly: false, @@ -533,7 +533,6 @@ export const ModelsList: FC = ({ }, }, { - width: '300px', name: i18n.translate('xpack.ml.trainedModels.modelsList.modelDescriptionHeader', { defaultMessage: 'Description', }), @@ -567,6 +566,7 @@ export const ModelsList: FC = ({ }, }, { + width: '15%', field: ModelsTableToConfigMapping.type, name: i18n.translate('xpack.ml.trainedModels.modelsList.typeHeader', { defaultMessage: 'Type', @@ -586,9 +586,9 @@ export const ModelsList: FC = ({ ), 'data-test-subj': 'mlModelsTableColumnType', - width: '130px', }, { + width: '10%', field: 'state', name: i18n.translate('xpack.ml.trainedModels.modelsList.stateHeader', { defaultMessage: 'State', @@ -604,9 +604,9 @@ export const ModelsList: FC = ({ ) : null; }, 'data-test-subj': 'mlModelsTableColumnDeploymentState', - width: '130px', }, { + width: '20%', field: ModelsTableToConfigMapping.createdAt, name: i18n.translate('xpack.ml.trainedModels.modelsList.createdAtHeader', { defaultMessage: 'Created at', @@ -615,10 +615,9 @@ export const ModelsList: FC = ({ render: (v: number) => dateFormatter(v), sortable: true, 'data-test-subj': 'mlModelsTableColumnCreatedAt', - width: '210px', }, { - width: '150px', + width: '15%', name: i18n.translate('xpack.ml.trainedModels.modelsList.actionsHeader', { defaultMessage: 'Actions', }), @@ -768,7 +767,7 @@ export const ModelsList: FC = ({
- css={{ overflowX: 'auto' }} + responsiveBreakpoint={'xl'} allowNeutralSort={false} columns={columns} itemIdToExpandedRowMap={itemIdToExpandedRowMap} From d635c6deeba5891b548eea9e04fb7e144cc9eac5 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:14:49 +0200 Subject: [PATCH 29/82] [Fleet] allow fleet-server agent upgrade to newer than fleet-server (#181575) ## Summary Closes https://github.com/elastic/kibana/issues/181394 Allow upgrade fleet-server even if fleet-server version is older than the upgrade version. See testing steps in the linked issue. ### 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 --- .../agent_upgrade_modal/index.test.tsx | 37 +++++++++++++++++++ .../components/agent_upgrade_modal/index.tsx | 5 +++ 2 files changed, 42 insertions(+) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx index dc08d052a9152..a71329168d054 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx @@ -334,6 +334,43 @@ describe('AgentUpgradeAgentModal', () => { expect(el).not.toBeDisabled(); }); }); + + it('should enable submit button for a single fleet-server when version is greater than maxFleetServerVersion', async () => { + mockSendGetAgentsAvailableVersions.mockClear(); + mockSendGetAgentsAvailableVersions.mockResolvedValue({ + data: { + items: ['8.10.4', '8.10.2', '8.9.0', '8.8.0'], + }, + }); + mockSendAllFleetServerAgents.mockResolvedValue({ + allFleetServerAgents: [ + { id: 'fleet-server', local_metadata: { elastic: { agent: { version: '8.9.0' } } } }, + ] as any, + }); + + const { utils } = renderAgentUpgradeAgentModal({ + agents: [ + { + id: 'fleet-server', + local_metadata: { + elastic: { + agent: { version: '8.9.0', upgradeable: true }, + }, + host: { hostname: 'host00001' }, + }, + }, + ] as any, + agentCount: 1, + }); + + await waitFor(() => { + const container = utils.getByTestId('agentUpgradeModal.VersionCombobox'); + const input = within(container).getByRole('combobox'); + expect(input?.value).toEqual('8.10.2'); + const el = utils.getByTestId('confirmModalConfirmButton'); + expect(el).toBeEnabled(); + }); + }); }); describe('restart upgrade', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx index 89531c2b01181..a82cef810f9cc 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx @@ -287,6 +287,9 @@ export const AgentUpgradeAgentModal: React.FunctionComponent agent.id).includes(agents[0].id); + const isSubmitButtonDisabled = useMemo( () => isSubmitting || @@ -294,6 +297,7 @@ export const AgentUpgradeAgentModal: React.FunctionComponent Date: Wed, 24 Apr 2024 17:21:25 +0200 Subject: [PATCH 30/82] Value list UI and telemetry (#180929) ## Add telemetry and change UI copy for value list: Screenshot 2024-04-17 at 15 09 47 Screenshot 2024-04-17 at 15 09 41 Screenshot 2024-04-17 at 15 09 30 Screenshot 2024-04-17 at 15 09 24 Screenshot 2024-04-17 at 15 09 18 --------- Co-authored-by: Nastasha Solomon <79124755+nastasha-solomon@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/common/lib/telemetry/constants.ts | 7 +++++ .../translations.ts | 2 +- .../detection_engine/rules/translations.ts | 2 +- .../components/add_list_item_popover.tsx | 4 +-- .../components/delete_list_item.tsx | 2 ++ .../inline_edit_list_item_value.tsx | 2 ++ .../value_list/components/list_item_table.tsx | 2 ++ .../components/show_value_list_modal.tsx | 6 ++++- .../components/upload_list_item.tsx | 2 ++ .../public/value_list/translations.ts | 27 +++++++++---------- .../value_lists/value_list_items.cy.ts | 2 +- 11 files changed, 37 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts index 72c38f1cc69b5..052a3296d8414 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts @@ -34,6 +34,13 @@ export enum TELEMETRY_EVENT { // Landing page - dashboard DASHBOARD = 'navigate_to_dashboard', CREATE_DASHBOARD = 'create_dashboard', + + // value list + OPEN_VALUE_LIST_MODAL = 'open_value_list_modal', + CREATE_VALUE_LIST_ITEM = 'create_value_list_item', + DELETE_VALUE_LIST_ITEM = 'delete_value_list_item', + EDIT_VALUE_LIST_ITEM = 'edit_value_list_item', + ADDITIONAL_UPLOAD_VALUE_LIST_ITEM = 'additinonal_upload_value_list_item', } export enum TelemetryEventTypes { diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/translations.ts b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/translations.ts index 37fbfaf09f6d8..caea46a2417d0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_flyout/translations.ts @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; export const VALUE_LISTS_FLYOUT_TITLE = i18n.translate( 'xpack.securitySolution.lists.importValueListTitle', { - defaultMessage: 'Import value lists', + defaultMessage: 'Manage value lists', } ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index a7823f39abb70..7ceb3fa661ba6 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -23,7 +23,7 @@ export const IMPORT_RULE = i18n.translate( export const IMPORT_VALUE_LISTS = i18n.translate( 'xpack.securitySolution.lists.detectionEngine.rules.importValueListsButton', { - defaultMessage: 'Import value lists', + defaultMessage: 'Manage value lists', } ); diff --git a/x-pack/plugins/security_solution/public/value_list/components/add_list_item_popover.tsx b/x-pack/plugins/security_solution/public/value_list/components/add_list_item_popover.tsx index 6dabd24f3f8ac..1a0a41c602641 100644 --- a/x-pack/plugins/security_solution/public/value_list/components/add_list_item_popover.tsx +++ b/x-pack/plugins/security_solution/public/value_list/components/add_list_item_popover.tsx @@ -23,10 +23,10 @@ import { SUCCESSFULLY_ADDED_ITEM, VALUE_REQUIRED, VALUE_LABEL, - ADD_VALUE_LIST_PLACEHOLDER, ADDING_LIST_ITEM_BUTTON, ADD_LIST_ITEM_BUTTON, } from '../translations'; +import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../common/lib/telemetry'; export const AddListItemPopover = ({ listId }: { listId: string }) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); @@ -53,6 +53,7 @@ export const AddListItemPopover = ({ listId }: { listId: string }) => { } }, onSubmit: async (values) => { + track(METRIC_TYPE.COUNT, TELEMETRY_EVENT.CREATE_VALUE_LIST_ITEM); await createListItemMutation.mutateAsync({ listId, value: values.value, http }); setIsPopoverOpen(false); formik.resetForm(); @@ -93,7 +94,6 @@ export const AddListItemPopover = ({ listId }: { listId: string }) => { name="value" icon="listAdd" data-test-subj="value-list-item-add-input" - placeholder={ADD_VALUE_LIST_PLACEHOLDER} isInvalid={!!formik.errors.value} /> diff --git a/x-pack/plugins/security_solution/public/value_list/components/delete_list_item.tsx b/x-pack/plugins/security_solution/public/value_list/components/delete_list_item.tsx index d9ad65a60cf0b..520d9668f5ad5 100644 --- a/x-pack/plugins/security_solution/public/value_list/components/delete_list_item.tsx +++ b/x-pack/plugins/security_solution/public/value_list/components/delete_list_item.tsx @@ -11,6 +11,7 @@ import { useDeleteListItemMutation } from '@kbn/securitysolution-list-hooks'; import { useAppToasts } from '../../common/hooks/use_app_toasts'; import { useKibana } from '../../common/lib/kibana'; import { SUCCESSFULLY_DELETED_ITEM } from '../translations'; +import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../common/lib/telemetry'; const toastOptions = { toastLifeTimeMs: 5000, @@ -32,6 +33,7 @@ export const DeleteListItem = ({ id, value }: { id: string; value: string }) => }); const deleteListItem = useCallback(() => { + track(METRIC_TYPE.COUNT, TELEMETRY_EVENT.DELETE_VALUE_LIST_ITEM); deleteListItemMutation.mutate({ id, http }); }, [deleteListItemMutation, id, http]); diff --git a/x-pack/plugins/security_solution/public/value_list/components/inline_edit_list_item_value.tsx b/x-pack/plugins/security_solution/public/value_list/components/inline_edit_list_item_value.tsx index 4ef639bcdbebb..d8777a8d83d00 100644 --- a/x-pack/plugins/security_solution/public/value_list/components/inline_edit_list_item_value.tsx +++ b/x-pack/plugins/security_solution/public/value_list/components/inline_edit_list_item_value.tsx @@ -12,6 +12,7 @@ import { usePatchListItemMutation } from '@kbn/securitysolution-list-hooks'; import { useAppToasts } from '../../common/hooks/use_app_toasts'; import { useKibana } from '../../common/lib/kibana/kibana_react'; import { EDIT_TEXT_INLINE_LABEL, SUCCESSFULLY_UPDATED_LIST_ITEM } from '../translations'; +import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../common/lib/telemetry'; const toastOptions = { toastLifeTimeMs: 5000, @@ -41,6 +42,7 @@ export const InlineEditListItemValue = ({ listItem }: { listItem: ListItemSchema const onSave = useCallback( async (newValue) => { + track(METRIC_TYPE.COUNT, TELEMETRY_EVENT.EDIT_VALUE_LIST_ITEM); await patchListItemMutation.mutateAsync({ id: listItem.id, value: newValue, diff --git a/x-pack/plugins/security_solution/public/value_list/components/list_item_table.tsx b/x-pack/plugins/security_solution/public/value_list/components/list_item_table.tsx index 50226ea047acc..11ecd486aa452 100644 --- a/x-pack/plugins/security_solution/public/value_list/components/list_item_table.tsx +++ b/x-pack/plugins/security_solution/public/value_list/components/list_item_table.tsx @@ -20,6 +20,7 @@ import { FAILED_TO_FETCH_LIST_ITEM, DELETE_LIST_ITEM, DELETE_LIST_ITEM_DESCRIPTION, + NOT_FOUND_ITEMS, } from '../translations'; export const ListItemTable = ({ @@ -80,6 +81,7 @@ export const ListItemTable = ({ error={isError ? FAILED_TO_FETCH_LIST_ITEM : undefined} loading={loading} onChange={onChange} + noItemsMessage={NOT_FOUND_ITEMS} /> ); }; diff --git a/x-pack/plugins/security_solution/public/value_list/components/show_value_list_modal.tsx b/x-pack/plugins/security_solution/public/value_list/components/show_value_list_modal.tsx index 0cf0608425b2f..96ab0ab599ee4 100644 --- a/x-pack/plugins/security_solution/public/value_list/components/show_value_list_modal.tsx +++ b/x-pack/plugins/security_solution/public/value_list/components/show_value_list_modal.tsx @@ -10,6 +10,7 @@ import React, { useState, useCallback } from 'react'; import { useListsPrivileges } from '../../detections/containers/detection_engine/lists/use_lists_privileges'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { ValueListModal } from './value_list_modal'; +import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../common/lib/telemetry'; export const ShowValueListModal = ({ listId, @@ -27,7 +28,10 @@ export const ShowValueListModal = ({ ); const onCloseModal = useCallback(() => setShowModal(false), []); - const onShowModal = useCallback(() => setShowModal(true), []); + const onShowModal = useCallback(() => { + track(METRIC_TYPE.CLICK, TELEMETRY_EVENT.OPEN_VALUE_LIST_MODAL); + setShowModal(true); + }, []); if (loading) return null; diff --git a/x-pack/plugins/security_solution/public/value_list/components/upload_list_item.tsx b/x-pack/plugins/security_solution/public/value_list/components/upload_list_item.tsx index 7e43629a6578c..3fe12339fe095 100644 --- a/x-pack/plugins/security_solution/public/value_list/components/upload_list_item.tsx +++ b/x-pack/plugins/security_solution/public/value_list/components/upload_list_item.tsx @@ -20,6 +20,7 @@ import { FAILED_TO_UPLOAD_LIST_ITEM, SUCCESSFULY_UPLOAD_LIST_ITEMS, } from '../translations'; +import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../common/lib/telemetry'; const validFileTypes = ['text/csv', 'text/plain']; @@ -45,6 +46,7 @@ export const UploadListItem = ({ listId, type }: { listId: string; type: ListTyp const handleImport = useCallback(() => { if (!importState.loading && file) { ctrl.current = new AbortController(); + track(METRIC_TYPE.COUNT, TELEMETRY_EVENT.ADDITIONAL_UPLOAD_VALUE_LIST_ITEM); importList({ file, listId, diff --git a/x-pack/plugins/security_solution/public/value_list/translations.ts b/x-pack/plugins/security_solution/public/value_list/translations.ts index 62b81fa61cab2..d97ece63dbe15 100644 --- a/x-pack/plugins/security_solution/public/value_list/translations.ts +++ b/x-pack/plugins/security_solution/public/value_list/translations.ts @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; export const ADD_LIST_ITEM = i18n.translate('xpack.securitySolution.listItems.addListItem', { - defaultMessage: 'Add list item', + defaultMessage: 'Create list item', }); export const SUCCESSFULLY_ADDED_ITEM = i18n.translate( @@ -23,20 +23,13 @@ export const VALUE_REQUIRED = i18n.translate('xpack.securitySolution.listItems.v }); export const VALUE_LABEL = i18n.translate('xpack.securitySolution.listItems.valueLabel', { - defaultMessage: 'Value', + defaultMessage: 'Enter a new value for the list', }); -export const ADD_VALUE_LIST_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.listItems.addValueListPlaceholder', - { - defaultMessage: 'Add list item..', - } -); - export const ADD_LIST_ITEM_BUTTON = i18n.translate( 'xpack.securitySolution.listItems.addListItemButton', { - defaultMessage: 'Add', + defaultMessage: 'Add list item', } ); @@ -75,19 +68,19 @@ export const COLUMN_VALUE = i18n.translate('xpack.securitySolution.listItems.col export const COLUMN_UPDATED_AT = i18n.translate( 'xpack.securitySolution.listItems.columnUpdatedAt', { - defaultMessage: 'Updated At', + defaultMessage: 'Updated at', } ); export const COLUMN_UPDATED_BY = i18n.translate( 'xpack.securitySolution.listItems.columnUpdatedBy', { - defaultMessage: 'Updated By', + defaultMessage: 'Updated by', } ); export const COLUMN_ACTIONS = i18n.translate('xpack.securitySolution.listItems.columnActions', { - defaultMessage: 'Actions', + defaultMessage: 'Action', }); export const FAILED_TO_FETCH_LIST_ITEM = i18n.translate( @@ -131,7 +124,7 @@ export const FAILED_TO_UPLOAD_LIST_ITEM_TITLE = i18n.translate( ); export const UPLOAD_TOOLTIP = i18n.translate('xpack.securitySolution.listItems.uploadTooltip', { - defaultMessage: 'All items from the file will be added as new items', + defaultMessage: 'All items from the file will be added to the value list.', }); export const UPLOAD_FILE_PICKER_INITAL_PROMT_TEXT = i18n.translate( @@ -163,6 +156,10 @@ export const INFO_TOTAL_ITEMS = i18n.translate('xpack.securitySolution.listItems export const getInfoTotalItems = (listType: string) => i18n.translate('xpack.securitySolution.listItems.searchBar', { - defaultMessage: 'Filter your data using KQL syntax - {listType}:*', + defaultMessage: 'Filter your data using KQL syntax, for example: {listType}:*', values: { listType }, }); + +export const NOT_FOUND_ITEMS = i18n.translate('xpack.securitySolution.listItems.notFoundItems', { + defaultMessage: '0 list items match your search criteria.', +}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts index c8fd74fa64397..79933ea4d7f33 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/value_lists/value_list_items.cy.ts @@ -88,7 +88,7 @@ describe( getValueListItemsTableRow().should('have.length', perPage); searchValueListItemsModal('keyword:not_exists'); getValueListItemsTableRow().should('have.length', 1); - cy.get(VALUE_LIST_ITEMS_MODAL_TABLE).contains('No items found'); + cy.get(VALUE_LIST_ITEMS_MODAL_TABLE).contains('0 list items match your search criteria.'); searchValueListItemsModal('keyword:*or*'); getValueListItemsTableRow().should('have.length', 4); From f2f5ec927c8439b536e874ff04e081ec95758fad Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 24 Apr 2024 10:26:11 -0500 Subject: [PATCH 31/82] [build/serverless] Do not use spot instances (#181578) This build step doesn't support retries, if the docker image has already been uploaded once it exits early. We want to rule out spot preemptions as a cause of failure. --- .buildkite/pipelines/artifacts_container_image.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.buildkite/pipelines/artifacts_container_image.yml b/.buildkite/pipelines/artifacts_container_image.yml index 972fada9ddde2..63744d64aba92 100644 --- a/.buildkite/pipelines/artifacts_container_image.yml +++ b/.buildkite/pipelines/artifacts_container_image.yml @@ -2,9 +2,5 @@ steps: - command: .buildkite/scripts/steps/artifacts/docker_image.sh label: Build serverless container images agents: - queue: n2-16-spot + queue: c2-16 timeout_in_minutes: 60 - retry: - automatic: - - exit_status: '-1' - limit: 3 From 4cf38adac29c7a65ab142ba428cdc3ae0648f2c4 Mon Sep 17 00:00:00 2001 From: "Eyo O. Eyo" <7893459+eokoneyo@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:30:35 +0100 Subject: [PATCH 32/82] [ES|QL] Multiline query in expanded mode shows undefined for line number (#181544) ## Summary closes https://github.com/elastic/kibana/issues/180570 Thanks to @drewdaemon for the preliminary investigation to the root cause of the issue, see https://github.com/elastic/kibana/issues/180570#issuecomment-2059590022. Building off of this, I noticed there's actually a first render pass where the code editor renders just fine, but for some reason it renders again ~causing~ which in turn causes the issue to happen see Screenshot 2024-04-24 at 01 48 18 From the image above we see that the editor has it's line numbers rendered appropriately but then there's another render triggered which causes the issue, we'll notice that the dynamic overlay instance in the image above have their property of `_shouldRender` marked as false, this is because a render already happened see line 97 from the same image where said dynamic overlay is marked as rendered; Screenshot 2024-04-24 at 09 09 51 See [here](https://github.com/microsoft/vscode/blob/a3944f74adb303047355e8c7d4b401bfba4e1a0d/src/vs/editor/common/viewEventHandler.ts#L30-L32) for the definition of `onDidRender`. This then makes it such that for the next render pass the render result isn't available. My assumption is that because we are updating the layout value of the editor, on every model change without actually taking into consideration the state of the editor it causes the editor to go out of sync, see Screenshot 2024-04-24 at 09 31 45 To counteract this, this PR introduces a guard that only updates the editor height when the event received actually has a diff in `contentHeight` property. Alongside this computation of the editor height is now inferred by reading values provided by the editor itself and not the DOM element of the editor. ## Visuals https://github.com/elastic/kibana/assets/7893459/26bb60ad-9ea1-41fe-854a-5c8a7be2e29d --- .../src/text_based_languages_editor.styles.ts | 2 +- .../src/text_based_languages_editor.tsx | 45 ++++++++----------- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts b/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts index 8d8bd72eb8dcd..8e5fbb1974a55 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts @@ -12,7 +12,7 @@ export const EDITOR_INITIAL_HEIGHT_EXPANDED = 140; export const EDITOR_MIN_HEIGHT = 40; export const EDITOR_MAX_HEIGHT = 400; -export const textBasedLanguagedEditorStyles = ( +export const textBasedLanguageEditorStyles = ( euiTheme: EuiThemeComputed, isCompactFocused: boolean, editorHeight: number, diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index cf026c79fbc55..7cbf3a5a5cbf4 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -43,7 +43,7 @@ import { import { CodeEditor, CodeEditorProps } from '@kbn/code-editor'; import { - textBasedLanguagedEditorStyles, + textBasedLanguageEditorStyles, EDITOR_INITIAL_HEIGHT, EDITOR_INITIAL_HEIGHT_EXPANDED, EDITOR_MAX_HEIGHT, @@ -189,7 +189,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ kibana.services; const timeZone = core?.uiSettings?.get('dateFormat:tz'); const [code, setCode] = useState(queryString ?? ''); - const [codeOneLiner, setCodeOneLiner] = useState(''); + const [codeOneLiner, setCodeOneLiner] = useState(null); // To make server side errors less "sticky", register the state of the code when submitting const [codeWhenSubmitted, setCodeStateOnSubmission] = useState(code); const [editorHeight, setEditorHeight] = useState( @@ -273,7 +273,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ }); }); - const styles = textBasedLanguagedEditorStyles( + const styles = textBasedLanguageEditorStyles( euiTheme, isCompactFocused, editorHeight, @@ -342,34 +342,24 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ updateLinesFromModel = false; clickedOutside = true; if (editor1.current) { - const editorElement = editor1.current.getDomNode(); - if (editorElement) { - editorElement.style.height = `${EDITOR_INITIAL_HEIGHT}px`; - const contentWidth = Number(editorElement?.style.width.replace('px', '')); - calculateVisibleCode(contentWidth, true); - editor1.current.layout({ width: contentWidth, height: EDITOR_INITIAL_HEIGHT }); - } + const contentWidth = editor1.current.getLayoutInfo().width; + calculateVisibleCode(contentWidth, true); + editor1.current.layout({ width: contentWidth, height: EDITOR_INITIAL_HEIGHT }); } }; const updateHeight = useCallback((editor: monaco.editor.IStandaloneCodeEditor) => { - if (lines === 1 || clickedOutside || initialRender) return; - const editorElement = editor.getDomNode(); + if (clickedOutside || initialRender) return; const contentHeight = Math.min(MAX_COMPACT_VIEW_LENGTH, editor.getContentHeight()); - - if (editorElement) { - editorElement.style.height = `${contentHeight}px`; - } - const contentWidth = Number(editorElement?.style.width.replace('px', '')); - editor.layout({ width: contentWidth, height: contentHeight }); setEditorHeight(contentHeight); + editor.layout({ width: editor.getLayoutInfo().width, height: contentHeight }); }, []); const onEditorFocus = useCallback(() => { setIsCompactFocused(true); setIsCodeEditorExpandedFocused(true); setShowLineNumbers(true); - setCodeOneLiner(''); + setCodeOneLiner(null); clickedOutside = false; initialRender = false; updateLinesFromModel = true; @@ -598,13 +588,9 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ useEffect(() => { if (editor1.current && !isCompactFocused) { - const editorElement = editor1.current.getDomNode(); - if (editorElement) { - const contentWidth = Number(editorElement?.style.width.replace('px', '')); - if (code !== queryString) { - setCode(queryString); - calculateVisibleCode(contentWidth); - } + if (code !== queryString) { + setCode(queryString); + calculateVisibleCode(editor1.current.getLayoutInfo().width); } } }, [calculateVisibleCode, code, isCompactFocused, queryString]); @@ -944,9 +930,14 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, onQuerySubmit ); + if (!isCodeEditorExpanded) { editor.onDidContentSizeChange((e) => { - updateHeight(editor); + // @ts-expect-error the property _oldContentHeight exists on the event object received but + // is not available on the type definition + if (e.contentHeight !== e._oldContentHeight) { + updateHeight(editor); + } }); } }} From 4bfe566c18f6c6ef7e347c2a4e0d59b08da6ad51 Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 24 Apr 2024 11:53:39 -0400 Subject: [PATCH 33/82] Use internal formatErrors (#181065) --- .../src/decode_request_params.test.ts | 3 ++- .../src/decode_request_params.ts | 11 +++++------ packages/kbn-server-route-repository/tsconfig.json | 1 - .../apm_routes/register_apm_server_routes.test.ts | 3 ++- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/kbn-server-route-repository/src/decode_request_params.test.ts b/packages/kbn-server-route-repository/src/decode_request_params.test.ts index 8f7e6f421cd36..0cb8d280f28e4 100644 --- a/packages/kbn-server-route-repository/src/decode_request_params.test.ts +++ b/packages/kbn-server-route-repository/src/decode_request_params.test.ts @@ -69,7 +69,8 @@ describe('decodeRequestParams', () => { }; expect(decode).toThrowErrorMatchingInlineSnapshot(` - "Excess keys are not allowed: + "Failed to validate: + Excess keys are not allowed: path.extraKey" `); }); diff --git a/packages/kbn-server-route-repository/src/decode_request_params.ts b/packages/kbn-server-route-repository/src/decode_request_params.ts index e9b75ded73d01..0893524a3f9e9 100644 --- a/packages/kbn-server-route-repository/src/decode_request_params.ts +++ b/packages/kbn-server-route-repository/src/decode_request_params.ts @@ -5,12 +5,11 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import * as t from 'io-ts'; -import { omitBy, isPlainObject, isEmpty } from 'lodash'; -import { isLeft } from 'fp-ts/lib/Either'; import Boom from '@hapi/boom'; -import { strictKeysRt } from '@kbn/io-ts-utils'; -import { formatErrors } from '@kbn/securitysolution-io-ts-utils'; +import { formatErrors, strictKeysRt } from '@kbn/io-ts-utils'; +import { isLeft } from 'fp-ts/lib/Either'; +import * as t from 'io-ts'; +import { isEmpty, isPlainObject, omitBy } from 'lodash'; import { RouteParamsRT } from './typings'; interface KibanaRequestParams { @@ -36,7 +35,7 @@ export function decodeRequestParams( const result = strictKeysRt(paramsRt).decode(paramMap); if (isLeft(result)) { - throw Boom.badRequest(formatErrors(result.left).join('|')); + throw Boom.badRequest(formatErrors(result.left)); } return result.right; diff --git a/packages/kbn-server-route-repository/tsconfig.json b/packages/kbn-server-route-repository/tsconfig.json index f5f84f5114b7d..67a5631bca59e 100644 --- a/packages/kbn-server-route-repository/tsconfig.json +++ b/packages/kbn-server-route-repository/tsconfig.json @@ -18,7 +18,6 @@ "@kbn/core-http-server", "@kbn/core-lifecycle-server", "@kbn/logging", - "@kbn/securitysolution-io-ts-utils" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.test.ts b/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.test.ts index 47ada9ee20f4c..c5e652fa910d0 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.test.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/register_apm_server_routes.test.ts @@ -256,7 +256,8 @@ describe('createApi', () => { expect(response.custom).toHaveBeenCalledWith({ body: { attributes: { _inspect: [], data: null }, - message: 'Invalid value "1" supplied to "query,_inspect"', + message: `Failed to validate: + in /query/_inspect: 1 does not match expected type pipe(JSON, boolean)`, }, statusCode: 400, }); From ed2f63bf7e540d63229dfc32dc6d8f6a6b895485 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Wed, 24 Apr 2024 18:18:42 +0200 Subject: [PATCH 34/82] [Discover] Split functional tests in more groups (#180046) ## Summary This PR splits existing functional tests into more groups so each of them finishes running quicker. - `group1` into `group1` and `group5` - `group2` into `group2_data_grid1`, `group2_data_grid2`, `group2_data_grid3` - `group3` into `group3` and `group6` - `group4` into `group4`, `group7` and `group8` (almost empty) --------- Co-authored-by: Davis McPhee --- .buildkite/ftr_configs.yml | 8 ++++- test/functional/apps/discover/group1/index.ts | 10 ------ .../_data_grid.ts | 0 .../_data_grid_context.ts | 0 .../_data_grid_copy_to_clipboard.ts | 0 .../_data_grid_doc_navigation.ts | 0 .../_data_grid_doc_table.ts | 0 .../{group2 => group2_data_grid1}/config.ts | 0 .../{group2 => group2_data_grid1}/index.ts | 10 +----- .../_data_grid_field_data.ts | 0 .../_data_grid_field_tokens.ts | 0 .../_data_grid_footer.ts | 0 .../_data_grid_new_line.ts | 0 .../apps/discover/group2_data_grid2/config.ts | 18 ++++++++++ .../apps/discover/group2_data_grid2/index.ts | 28 +++++++++++++++ .../_data_grid_pagination.ts | 0 .../_data_grid_row_height.ts | 0 .../_data_grid_row_navigation.ts | 0 .../_data_grid_sample_size.ts | 0 .../apps/discover/group2_data_grid3/config.ts | 18 ++++++++++ .../apps/discover/group2_data_grid3/index.ts | 28 +++++++++++++++ test/functional/apps/discover/group3/index.ts | 5 --- test/functional/apps/discover/group4/index.ts | 8 ----- .../{group1 => group5}/_field_data.ts | 0 .../_field_data_with_fields_api.ts | 0 .../{group1 => group5}/_filter_editor.ts | 0 .../{group1 => group5}/_greeting_screen.ts | 0 .../discover/{group1 => group5}/_inspector.ts | 0 .../{group1 => group5}/_large_string.ts | 0 .../discover/{group1 => group5}/_no_data.ts | 0 .../{group1 => group5}/_shared_links.ts | 0 .../{group1 => group5}/_source_filters.ts | 0 .../discover/{group1 => group5}/_url_state.ts | 0 .../functional/apps/discover/group5/config.ts | 18 ++++++++++ test/functional/apps/discover/group5/index.ts | 34 +++++++++++++++++++ .../discover/{group3 => group6}/_sidebar.ts | 0 .../_sidebar_field_stats.ts | 0 .../{group3 => group6}/_time_field_column.ts | 0 .../_unsaved_changes_badge.ts | 0 .../{group3 => group6}/_view_mode_toggle.ts | 0 .../functional/apps/discover/group6/config.ts | 18 ++++++++++ test/functional/apps/discover/group6/index.ts | 29 ++++++++++++++++ .../{group4 => group7}/_huge_fields.ts | 0 .../_indexpattern_with_unmapped_fields.ts | 0 .../_indexpattern_without_timefield.ts | 0 .../{group4 => group7}/_new_search.ts | 0 .../_request_cancellation.ts | 0 .../_runtime_fields_editor.ts | 0 .../_search_on_page_load.ts | 0 .../functional/apps/discover/group7/config.ts | 18 ++++++++++ test/functional/apps/discover/group7/index.ts | 31 +++++++++++++++++ .../{group4 => group8}/_hide_announcements.ts | 0 .../functional/apps/discover/group8/config.ts | 18 ++++++++++ test/functional/apps/discover/group8/index.ts | 25 ++++++++++++++ test/functional/firefox/discover.config.ts | 8 ++++- .../common/discover/group1/index.ts | 1 - .../common/discover/group2/index.ts | 1 - .../common/discover/group3/index.ts | 2 -- .../{group2 => group4}/_adhoc_data_views.ts | 0 .../common/discover/group4/index.ts | 25 ++++++++++++++ .../discover/{group1 => group5}/_url_state.ts | 0 .../common/discover/group5/index.ts | 25 ++++++++++++++ .../discover/{group3 => group6}/_sidebar.ts | 0 .../_unsaved_changes_badge.ts | 0 .../common/discover/group6/index.ts | 26 ++++++++++++++ .../common_configs/config.group5.ts | 3 ++ .../search/common_configs/config.group5.ts | 3 ++ .../security/common_configs/config.group5.ts | 3 ++ 68 files changed, 383 insertions(+), 38 deletions(-) rename test/functional/apps/discover/{group2 => group2_data_grid1}/_data_grid.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid1}/_data_grid_context.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid1}/_data_grid_copy_to_clipboard.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid1}/_data_grid_doc_navigation.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid1}/_data_grid_doc_table.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid1}/config.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid1}/index.ts (67%) rename test/functional/apps/discover/{group2 => group2_data_grid2}/_data_grid_field_data.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid2}/_data_grid_field_tokens.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid2}/_data_grid_footer.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid2}/_data_grid_new_line.ts (100%) create mode 100644 test/functional/apps/discover/group2_data_grid2/config.ts create mode 100644 test/functional/apps/discover/group2_data_grid2/index.ts rename test/functional/apps/discover/{group2 => group2_data_grid3}/_data_grid_pagination.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid3}/_data_grid_row_height.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid3}/_data_grid_row_navigation.ts (100%) rename test/functional/apps/discover/{group2 => group2_data_grid3}/_data_grid_sample_size.ts (100%) create mode 100644 test/functional/apps/discover/group2_data_grid3/config.ts create mode 100644 test/functional/apps/discover/group2_data_grid3/index.ts rename test/functional/apps/discover/{group1 => group5}/_field_data.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_field_data_with_fields_api.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_filter_editor.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_greeting_screen.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_inspector.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_large_string.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_no_data.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_shared_links.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_source_filters.ts (100%) rename test/functional/apps/discover/{group1 => group5}/_url_state.ts (100%) create mode 100644 test/functional/apps/discover/group5/config.ts create mode 100644 test/functional/apps/discover/group5/index.ts rename test/functional/apps/discover/{group3 => group6}/_sidebar.ts (100%) rename test/functional/apps/discover/{group3 => group6}/_sidebar_field_stats.ts (100%) rename test/functional/apps/discover/{group3 => group6}/_time_field_column.ts (100%) rename test/functional/apps/discover/{group3 => group6}/_unsaved_changes_badge.ts (100%) rename test/functional/apps/discover/{group3 => group6}/_view_mode_toggle.ts (100%) create mode 100644 test/functional/apps/discover/group6/config.ts create mode 100644 test/functional/apps/discover/group6/index.ts rename test/functional/apps/discover/{group4 => group7}/_huge_fields.ts (100%) rename test/functional/apps/discover/{group4 => group7}/_indexpattern_with_unmapped_fields.ts (100%) rename test/functional/apps/discover/{group4 => group7}/_indexpattern_without_timefield.ts (100%) rename test/functional/apps/discover/{group4 => group7}/_new_search.ts (100%) rename test/functional/apps/discover/{group4 => group7}/_request_cancellation.ts (100%) rename test/functional/apps/discover/{group4 => group7}/_runtime_fields_editor.ts (100%) rename test/functional/apps/discover/{group4 => group7}/_search_on_page_load.ts (100%) create mode 100644 test/functional/apps/discover/group7/config.ts create mode 100644 test/functional/apps/discover/group7/index.ts rename test/functional/apps/discover/{group4 => group8}/_hide_announcements.ts (100%) create mode 100644 test/functional/apps/discover/group8/config.ts create mode 100644 test/functional/apps/discover/group8/index.ts rename x-pack/test_serverless/functional/test_suites/common/discover/{group2 => group4}/_adhoc_data_views.ts (100%) create mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/group4/index.ts rename x-pack/test_serverless/functional/test_suites/common/discover/{group1 => group5}/_url_state.ts (100%) create mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/group5/index.ts rename x-pack/test_serverless/functional/test_suites/common/discover/{group3 => group6}/_sidebar.ts (100%) rename x-pack/test_serverless/functional/test_suites/common/discover/{group3 => group6}/_unsaved_changes_badge.ts (100%) create mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/group6/index.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index a4c7c64762299..b17a63170f907 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -115,9 +115,15 @@ enabled: - test/functional/apps/discover/classic/config.ts - test/functional/apps/discover/embeddable/config.ts - test/functional/apps/discover/group1/config.ts - - test/functional/apps/discover/group2/config.ts + - test/functional/apps/discover/group2_data_grid1/config.ts + - test/functional/apps/discover/group2_data_grid2/config.ts + - test/functional/apps/discover/group2_data_grid3/config.ts - test/functional/apps/discover/group3/config.ts - test/functional/apps/discover/group4/config.ts + - test/functional/apps/discover/group5/config.ts + - test/functional/apps/discover/group6/config.ts + - test/functional/apps/discover/group7/config.ts + - test/functional/apps/discover/group8/config.ts - test/functional/apps/getting_started/config.ts - test/functional/apps/home/config.ts - test/functional/apps/kibana_overview/config.ts diff --git a/test/functional/apps/discover/group1/index.ts b/test/functional/apps/discover/group1/index.ts index 375954797c3ca..2ca6413a11c22 100644 --- a/test/functional/apps/discover/group1/index.ts +++ b/test/functional/apps/discover/group1/index.ts @@ -20,23 +20,13 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); }); - loadTestFile(require.resolve('./_no_data')); loadTestFile(require.resolve('./_discover')); loadTestFile(require.resolve('./_discover_accessibility')); loadTestFile(require.resolve('./_discover_histogram_breakdown')); loadTestFile(require.resolve('./_discover_histogram')); loadTestFile(require.resolve('./_doc_accessibility')); - loadTestFile(require.resolve('./_filter_editor')); loadTestFile(require.resolve('./_errors')); - loadTestFile(require.resolve('./_field_data')); - loadTestFile(require.resolve('./_field_data_with_fields_api')); - loadTestFile(require.resolve('./_shared_links')); - loadTestFile(require.resolve('./_source_filters')); - loadTestFile(require.resolve('./_large_string')); - loadTestFile(require.resolve('./_greeting_screen')); - loadTestFile(require.resolve('./_inspector')); loadTestFile(require.resolve('./_date_nanos')); loadTestFile(require.resolve('./_date_nanos_mixed')); - loadTestFile(require.resolve('./_url_state')); }); } diff --git a/test/functional/apps/discover/group2/_data_grid.ts b/test/functional/apps/discover/group2_data_grid1/_data_grid.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid.ts rename to test/functional/apps/discover/group2_data_grid1/_data_grid.ts diff --git a/test/functional/apps/discover/group2/_data_grid_context.ts b/test/functional/apps/discover/group2_data_grid1/_data_grid_context.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_context.ts rename to test/functional/apps/discover/group2_data_grid1/_data_grid_context.ts diff --git a/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts b/test/functional/apps/discover/group2_data_grid1/_data_grid_copy_to_clipboard.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts rename to test/functional/apps/discover/group2_data_grid1/_data_grid_copy_to_clipboard.ts diff --git a/test/functional/apps/discover/group2/_data_grid_doc_navigation.ts b/test/functional/apps/discover/group2_data_grid1/_data_grid_doc_navigation.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_doc_navigation.ts rename to test/functional/apps/discover/group2_data_grid1/_data_grid_doc_navigation.ts diff --git a/test/functional/apps/discover/group2/_data_grid_doc_table.ts b/test/functional/apps/discover/group2_data_grid1/_data_grid_doc_table.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_doc_table.ts rename to test/functional/apps/discover/group2_data_grid1/_data_grid_doc_table.ts diff --git a/test/functional/apps/discover/group2/config.ts b/test/functional/apps/discover/group2_data_grid1/config.ts similarity index 100% rename from test/functional/apps/discover/group2/config.ts rename to test/functional/apps/discover/group2_data_grid1/config.ts diff --git a/test/functional/apps/discover/group2/index.ts b/test/functional/apps/discover/group2_data_grid1/index.ts similarity index 67% rename from test/functional/apps/discover/group2/index.ts rename to test/functional/apps/discover/group2_data_grid1/index.ts index 2639601e12c17..c9e9e9739337a 100644 --- a/test/functional/apps/discover/group2/index.ts +++ b/test/functional/apps/discover/group2_data_grid1/index.ts @@ -11,7 +11,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - describe('discover/group2', function () { + describe('discover/group2/data_grid1', function () { before(async function () { await browser.setWindowSize(1600, 1200); }); @@ -22,16 +22,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_data_grid')); loadTestFile(require.resolve('./_data_grid_context')); - loadTestFile(require.resolve('./_data_grid_field_data')); loadTestFile(require.resolve('./_data_grid_doc_navigation')); - loadTestFile(require.resolve('./_data_grid_row_navigation')); loadTestFile(require.resolve('./_data_grid_doc_table')); loadTestFile(require.resolve('./_data_grid_copy_to_clipboard')); - loadTestFile(require.resolve('./_data_grid_row_height')); - loadTestFile(require.resolve('./_data_grid_new_line')); - loadTestFile(require.resolve('./_data_grid_sample_size')); - loadTestFile(require.resolve('./_data_grid_pagination')); - loadTestFile(require.resolve('./_data_grid_footer')); - loadTestFile(require.resolve('./_data_grid_field_tokens')); }); } diff --git a/test/functional/apps/discover/group2/_data_grid_field_data.ts b/test/functional/apps/discover/group2_data_grid2/_data_grid_field_data.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_field_data.ts rename to test/functional/apps/discover/group2_data_grid2/_data_grid_field_data.ts diff --git a/test/functional/apps/discover/group2/_data_grid_field_tokens.ts b/test/functional/apps/discover/group2_data_grid2/_data_grid_field_tokens.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_field_tokens.ts rename to test/functional/apps/discover/group2_data_grid2/_data_grid_field_tokens.ts diff --git a/test/functional/apps/discover/group2/_data_grid_footer.ts b/test/functional/apps/discover/group2_data_grid2/_data_grid_footer.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_footer.ts rename to test/functional/apps/discover/group2_data_grid2/_data_grid_footer.ts diff --git a/test/functional/apps/discover/group2/_data_grid_new_line.ts b/test/functional/apps/discover/group2_data_grid2/_data_grid_new_line.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_new_line.ts rename to test/functional/apps/discover/group2_data_grid2/_data_grid_new_line.ts diff --git a/test/functional/apps/discover/group2_data_grid2/config.ts b/test/functional/apps/discover/group2_data_grid2/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group2_data_grid2/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group2_data_grid2/index.ts b/test/functional/apps/discover/group2_data_grid2/index.ts new file mode 100644 index 0000000000000..1d3736cafe80b --- /dev/null +++ b/test/functional/apps/discover/group2_data_grid2/index.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group2/data_grid2', function () { + before(async function () { + await browser.setWindowSize(1600, 1200); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_data_grid_new_line')); + loadTestFile(require.resolve('./_data_grid_footer')); + loadTestFile(require.resolve('./_data_grid_field_data')); + loadTestFile(require.resolve('./_data_grid_field_tokens')); + }); +} diff --git a/test/functional/apps/discover/group2/_data_grid_pagination.ts b/test/functional/apps/discover/group2_data_grid3/_data_grid_pagination.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_pagination.ts rename to test/functional/apps/discover/group2_data_grid3/_data_grid_pagination.ts diff --git a/test/functional/apps/discover/group2/_data_grid_row_height.ts b/test/functional/apps/discover/group2_data_grid3/_data_grid_row_height.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_row_height.ts rename to test/functional/apps/discover/group2_data_grid3/_data_grid_row_height.ts diff --git a/test/functional/apps/discover/group2/_data_grid_row_navigation.ts b/test/functional/apps/discover/group2_data_grid3/_data_grid_row_navigation.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_row_navigation.ts rename to test/functional/apps/discover/group2_data_grid3/_data_grid_row_navigation.ts diff --git a/test/functional/apps/discover/group2/_data_grid_sample_size.ts b/test/functional/apps/discover/group2_data_grid3/_data_grid_sample_size.ts similarity index 100% rename from test/functional/apps/discover/group2/_data_grid_sample_size.ts rename to test/functional/apps/discover/group2_data_grid3/_data_grid_sample_size.ts diff --git a/test/functional/apps/discover/group2_data_grid3/config.ts b/test/functional/apps/discover/group2_data_grid3/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group2_data_grid3/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group2_data_grid3/index.ts b/test/functional/apps/discover/group2_data_grid3/index.ts new file mode 100644 index 0000000000000..7200eb1e9bf10 --- /dev/null +++ b/test/functional/apps/discover/group2_data_grid3/index.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group2/data_grid3', function () { + before(async function () { + await browser.setWindowSize(1600, 1200); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_data_grid_row_navigation')); + loadTestFile(require.resolve('./_data_grid_row_height')); + loadTestFile(require.resolve('./_data_grid_sample_size')); + loadTestFile(require.resolve('./_data_grid_pagination')); + }); +} diff --git a/test/functional/apps/discover/group3/index.ts b/test/functional/apps/discover/group3/index.ts index a80ae44e49801..582710e419a75 100644 --- a/test/functional/apps/discover/group3/index.ts +++ b/test/functional/apps/discover/group3/index.ts @@ -21,14 +21,9 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { }); loadTestFile(require.resolve('./_default_columns')); - loadTestFile(require.resolve('./_time_field_column')); loadTestFile(require.resolve('./_drag_drop')); - loadTestFile(require.resolve('./_sidebar')); - loadTestFile(require.resolve('./_sidebar_field_stats')); loadTestFile(require.resolve('./_request_counts')); loadTestFile(require.resolve('./_doc_viewer')); - loadTestFile(require.resolve('./_view_mode_toggle')); - loadTestFile(require.resolve('./_unsaved_changes_badge')); loadTestFile(require.resolve('./_panels_toggle')); loadTestFile(require.resolve('./_lens_vis')); }); diff --git a/test/functional/apps/discover/group4/index.ts b/test/functional/apps/discover/group4/index.ts index 4a145b06cf248..211b4501ed329 100644 --- a/test/functional/apps/discover/group4/index.ts +++ b/test/functional/apps/discover/group4/index.ts @@ -20,22 +20,14 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); }); - loadTestFile(require.resolve('./_indexpattern_without_timefield')); loadTestFile(require.resolve('./_discover_fields_api')); loadTestFile(require.resolve('./_adhoc_data_views')); loadTestFile(require.resolve('./_esql_view')); - loadTestFile(require.resolve('./_indexpattern_with_unmapped_fields')); - loadTestFile(require.resolve('./_runtime_fields_editor')); - loadTestFile(require.resolve('./_huge_fields')); loadTestFile(require.resolve('./_date_nested')); - loadTestFile(require.resolve('./_search_on_page_load')); loadTestFile(require.resolve('./_chart_hidden')); loadTestFile(require.resolve('./_context_encoded_url_params')); - loadTestFile(require.resolve('./_hide_announcements')); loadTestFile(require.resolve('./_data_view_edit')); loadTestFile(require.resolve('./_field_list_new_fields')); - loadTestFile(require.resolve('./_request_cancellation')); - loadTestFile(require.resolve('./_new_search')); loadTestFile(require.resolve('./_document_comparison')); }); } diff --git a/test/functional/apps/discover/group1/_field_data.ts b/test/functional/apps/discover/group5/_field_data.ts similarity index 100% rename from test/functional/apps/discover/group1/_field_data.ts rename to test/functional/apps/discover/group5/_field_data.ts diff --git a/test/functional/apps/discover/group1/_field_data_with_fields_api.ts b/test/functional/apps/discover/group5/_field_data_with_fields_api.ts similarity index 100% rename from test/functional/apps/discover/group1/_field_data_with_fields_api.ts rename to test/functional/apps/discover/group5/_field_data_with_fields_api.ts diff --git a/test/functional/apps/discover/group1/_filter_editor.ts b/test/functional/apps/discover/group5/_filter_editor.ts similarity index 100% rename from test/functional/apps/discover/group1/_filter_editor.ts rename to test/functional/apps/discover/group5/_filter_editor.ts diff --git a/test/functional/apps/discover/group1/_greeting_screen.ts b/test/functional/apps/discover/group5/_greeting_screen.ts similarity index 100% rename from test/functional/apps/discover/group1/_greeting_screen.ts rename to test/functional/apps/discover/group5/_greeting_screen.ts diff --git a/test/functional/apps/discover/group1/_inspector.ts b/test/functional/apps/discover/group5/_inspector.ts similarity index 100% rename from test/functional/apps/discover/group1/_inspector.ts rename to test/functional/apps/discover/group5/_inspector.ts diff --git a/test/functional/apps/discover/group1/_large_string.ts b/test/functional/apps/discover/group5/_large_string.ts similarity index 100% rename from test/functional/apps/discover/group1/_large_string.ts rename to test/functional/apps/discover/group5/_large_string.ts diff --git a/test/functional/apps/discover/group1/_no_data.ts b/test/functional/apps/discover/group5/_no_data.ts similarity index 100% rename from test/functional/apps/discover/group1/_no_data.ts rename to test/functional/apps/discover/group5/_no_data.ts diff --git a/test/functional/apps/discover/group1/_shared_links.ts b/test/functional/apps/discover/group5/_shared_links.ts similarity index 100% rename from test/functional/apps/discover/group1/_shared_links.ts rename to test/functional/apps/discover/group5/_shared_links.ts diff --git a/test/functional/apps/discover/group1/_source_filters.ts b/test/functional/apps/discover/group5/_source_filters.ts similarity index 100% rename from test/functional/apps/discover/group1/_source_filters.ts rename to test/functional/apps/discover/group5/_source_filters.ts diff --git a/test/functional/apps/discover/group1/_url_state.ts b/test/functional/apps/discover/group5/_url_state.ts similarity index 100% rename from test/functional/apps/discover/group1/_url_state.ts rename to test/functional/apps/discover/group5/_url_state.ts diff --git a/test/functional/apps/discover/group5/config.ts b/test/functional/apps/discover/group5/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group5/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group5/index.ts b/test/functional/apps/discover/group5/index.ts new file mode 100644 index 0000000000000..bc875494307d6 --- /dev/null +++ b/test/functional/apps/discover/group5/index.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group5', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_no_data')); + loadTestFile(require.resolve('./_filter_editor')); + loadTestFile(require.resolve('./_field_data')); + loadTestFile(require.resolve('./_field_data_with_fields_api')); + loadTestFile(require.resolve('./_shared_links')); + loadTestFile(require.resolve('./_source_filters')); + loadTestFile(require.resolve('./_large_string')); + loadTestFile(require.resolve('./_greeting_screen')); + loadTestFile(require.resolve('./_inspector')); + loadTestFile(require.resolve('./_url_state')); + }); +} diff --git a/test/functional/apps/discover/group3/_sidebar.ts b/test/functional/apps/discover/group6/_sidebar.ts similarity index 100% rename from test/functional/apps/discover/group3/_sidebar.ts rename to test/functional/apps/discover/group6/_sidebar.ts diff --git a/test/functional/apps/discover/group3/_sidebar_field_stats.ts b/test/functional/apps/discover/group6/_sidebar_field_stats.ts similarity index 100% rename from test/functional/apps/discover/group3/_sidebar_field_stats.ts rename to test/functional/apps/discover/group6/_sidebar_field_stats.ts diff --git a/test/functional/apps/discover/group3/_time_field_column.ts b/test/functional/apps/discover/group6/_time_field_column.ts similarity index 100% rename from test/functional/apps/discover/group3/_time_field_column.ts rename to test/functional/apps/discover/group6/_time_field_column.ts diff --git a/test/functional/apps/discover/group3/_unsaved_changes_badge.ts b/test/functional/apps/discover/group6/_unsaved_changes_badge.ts similarity index 100% rename from test/functional/apps/discover/group3/_unsaved_changes_badge.ts rename to test/functional/apps/discover/group6/_unsaved_changes_badge.ts diff --git a/test/functional/apps/discover/group3/_view_mode_toggle.ts b/test/functional/apps/discover/group6/_view_mode_toggle.ts similarity index 100% rename from test/functional/apps/discover/group3/_view_mode_toggle.ts rename to test/functional/apps/discover/group6/_view_mode_toggle.ts diff --git a/test/functional/apps/discover/group6/config.ts b/test/functional/apps/discover/group6/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group6/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group6/index.ts b/test/functional/apps/discover/group6/index.ts new file mode 100644 index 0000000000000..f71d96e63d2fd --- /dev/null +++ b/test/functional/apps/discover/group6/index.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group6', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_sidebar')); + loadTestFile(require.resolve('./_sidebar_field_stats')); + loadTestFile(require.resolve('./_time_field_column')); + loadTestFile(require.resolve('./_unsaved_changes_badge')); + loadTestFile(require.resolve('./_view_mode_toggle')); + }); +} diff --git a/test/functional/apps/discover/group4/_huge_fields.ts b/test/functional/apps/discover/group7/_huge_fields.ts similarity index 100% rename from test/functional/apps/discover/group4/_huge_fields.ts rename to test/functional/apps/discover/group7/_huge_fields.ts diff --git a/test/functional/apps/discover/group4/_indexpattern_with_unmapped_fields.ts b/test/functional/apps/discover/group7/_indexpattern_with_unmapped_fields.ts similarity index 100% rename from test/functional/apps/discover/group4/_indexpattern_with_unmapped_fields.ts rename to test/functional/apps/discover/group7/_indexpattern_with_unmapped_fields.ts diff --git a/test/functional/apps/discover/group4/_indexpattern_without_timefield.ts b/test/functional/apps/discover/group7/_indexpattern_without_timefield.ts similarity index 100% rename from test/functional/apps/discover/group4/_indexpattern_without_timefield.ts rename to test/functional/apps/discover/group7/_indexpattern_without_timefield.ts diff --git a/test/functional/apps/discover/group4/_new_search.ts b/test/functional/apps/discover/group7/_new_search.ts similarity index 100% rename from test/functional/apps/discover/group4/_new_search.ts rename to test/functional/apps/discover/group7/_new_search.ts diff --git a/test/functional/apps/discover/group4/_request_cancellation.ts b/test/functional/apps/discover/group7/_request_cancellation.ts similarity index 100% rename from test/functional/apps/discover/group4/_request_cancellation.ts rename to test/functional/apps/discover/group7/_request_cancellation.ts diff --git a/test/functional/apps/discover/group4/_runtime_fields_editor.ts b/test/functional/apps/discover/group7/_runtime_fields_editor.ts similarity index 100% rename from test/functional/apps/discover/group4/_runtime_fields_editor.ts rename to test/functional/apps/discover/group7/_runtime_fields_editor.ts diff --git a/test/functional/apps/discover/group4/_search_on_page_load.ts b/test/functional/apps/discover/group7/_search_on_page_load.ts similarity index 100% rename from test/functional/apps/discover/group4/_search_on_page_load.ts rename to test/functional/apps/discover/group7/_search_on_page_load.ts diff --git a/test/functional/apps/discover/group7/config.ts b/test/functional/apps/discover/group7/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group7/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group7/index.ts b/test/functional/apps/discover/group7/index.ts new file mode 100644 index 0000000000000..3abc84514f15d --- /dev/null +++ b/test/functional/apps/discover/group7/index.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group7', function () { + before(async function () { + await browser.setWindowSize(1600, 1200); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_indexpattern_without_timefield')); + loadTestFile(require.resolve('./_indexpattern_with_unmapped_fields')); + loadTestFile(require.resolve('./_runtime_fields_editor')); + loadTestFile(require.resolve('./_huge_fields')); + loadTestFile(require.resolve('./_search_on_page_load')); + loadTestFile(require.resolve('./_request_cancellation')); + loadTestFile(require.resolve('./_new_search')); + }); +} diff --git a/test/functional/apps/discover/group4/_hide_announcements.ts b/test/functional/apps/discover/group8/_hide_announcements.ts similarity index 100% rename from test/functional/apps/discover/group4/_hide_announcements.ts rename to test/functional/apps/discover/group8/_hide_announcements.ts diff --git a/test/functional/apps/discover/group8/config.ts b/test/functional/apps/discover/group8/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group8/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group8/index.ts b/test/functional/apps/discover/group8/index.ts new file mode 100644 index 0000000000000..09aaca23e8b95 --- /dev/null +++ b/test/functional/apps/discover/group8/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group8', function () { + before(async function () { + await browser.setWindowSize(1600, 1200); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_hide_announcements')); + }); +} diff --git a/test/functional/firefox/discover.config.ts b/test/functional/firefox/discover.config.ts index 8b7e7205cd434..5c9f9c0939754 100644 --- a/test/functional/firefox/discover.config.ts +++ b/test/functional/firefox/discover.config.ts @@ -19,9 +19,15 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { testFiles: [ require.resolve('../apps/discover/classic'), require.resolve('../apps/discover/group1'), - require.resolve('../apps/discover/group2'), + require.resolve('../apps/discover/group2_data_grid1'), + require.resolve('../apps/discover/group2_data_grid2'), + require.resolve('../apps/discover/group2_data_grid3'), require.resolve('../apps/discover/group3'), require.resolve('../apps/discover/group4'), + require.resolve('../apps/discover/group5'), + require.resolve('../apps/discover/group6'), + require.resolve('../apps/discover/group7'), + require.resolve('../apps/discover/group8'), ], junit: { diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts index 4ad60320df38b..9fc6d4447e8c7 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts @@ -22,6 +22,5 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_discover')); loadTestFile(require.resolve('./_discover_histogram')); - loadTestFile(require.resolve('./_url_state')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts index c579eca3bb7bd..658b92845ffca 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts @@ -22,6 +22,5 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_data_grid_doc_navigation')); loadTestFile(require.resolve('./_data_grid_doc_table')); - loadTestFile(require.resolve('./_adhoc_data_views')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts index 9f322013d986b..70d95fef41958 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts @@ -20,8 +20,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); }); - loadTestFile(require.resolve('./_sidebar')); loadTestFile(require.resolve('./_request_counts')); - loadTestFile(require.resolve('./_unsaved_changes_badge')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/_adhoc_data_views.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group4/_adhoc_data_views.ts similarity index 100% rename from x-pack/test_serverless/functional/test_suites/common/discover/group2/_adhoc_data_views.ts rename to x-pack/test_serverless/functional/test_suites/common/discover/group4/_adhoc_data_views.ts diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group4/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group4/index.ts new file mode 100644 index 0000000000000..c262798065000 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group4/index.ts @@ -0,0 +1,25 @@ +/* + * 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 { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group4', function () { + before(async function () { + await browser.setWindowSize(1600, 1200); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_adhoc_data_views')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group5/_url_state.ts similarity index 100% rename from x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts rename to x-pack/test_serverless/functional/test_suites/common/discover/group5/_url_state.ts diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group5/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group5/index.ts new file mode 100644 index 0000000000000..a38a6d4e33dd6 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group5/index.ts @@ -0,0 +1,25 @@ +/* + * 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 { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group5', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_url_state')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group6/_sidebar.ts similarity index 100% rename from x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts rename to x-pack/test_serverless/functional/test_suites/common/discover/group6/_sidebar.ts diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_unsaved_changes_badge.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group6/_unsaved_changes_badge.ts similarity index 100% rename from x-pack/test_serverless/functional/test_suites/common/discover/group3/_unsaved_changes_badge.ts rename to x-pack/test_serverless/functional/test_suites/common/discover/group6/_unsaved_changes_badge.ts diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group6/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group6/index.ts new file mode 100644 index 0000000000000..8857ebe9bf310 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group6/index.ts @@ -0,0 +1,26 @@ +/* + * 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 { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover/group6', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_sidebar')); + loadTestFile(require.resolve('./_unsaved_changes_badge')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts index 7b8fb4b072847..be3c0098d35d2 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts @@ -16,6 +16,9 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('../../common/discover/group1'), require.resolve('../../common/discover/group2'), require.resolve('../../common/discover/group3'), + require.resolve('../../common/discover/group4'), + require.resolve('../../common/discover/group5'), + require.resolve('../../common/discover/group6'), ], junit: { reportName: 'Serverless Observability Functional Tests - Common Group 5', diff --git a/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts index 70cabf59051a9..ad661b474a33d 100644 --- a/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts +++ b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts @@ -16,6 +16,9 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('../../common/discover/group1'), require.resolve('../../common/discover/group2'), require.resolve('../../common/discover/group3'), + require.resolve('../../common/discover/group4'), + require.resolve('../../common/discover/group5'), + require.resolve('../../common/discover/group6'), ], junit: { reportName: 'Serverless Search Functional Tests - Common Group 5', diff --git a/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts index d1637bf34b4fd..c65131e27e9e8 100644 --- a/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts +++ b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts @@ -16,6 +16,9 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('../../common/discover/group1'), require.resolve('../../common/discover/group2'), require.resolve('../../common/discover/group3'), + require.resolve('../../common/discover/group4'), + require.resolve('../../common/discover/group5'), + require.resolve('../../common/discover/group6'), ], junit: { reportName: 'Serverless Security Functional Tests - Common Group 5', From 1eb43c1c797a8a37f1db32e0d611b9a83bd0fb38 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:00:16 +0100 Subject: [PATCH 35/82] skip flaky suite (#170674) --- .../cypress/e2e/response_actions/document_signing.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts index b806323726018..4093581366321 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170674 +describe.skip('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From fadce7939195ef903f116752db13ddb003eaf1a6 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:01:04 -0400 Subject: [PATCH 36/82] skip failing test suite (#170674) --- .../cypress/e2e/response_actions/document_signing.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts index 4093581366321..ec41ffa31edc9 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts @@ -23,6 +23,7 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170674 +// Failing: See https://github.com/elastic/kibana/issues/170674 describe.skip('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; From 14bf23cd0e871742da31ffe4f5114ef9ed9d9dda Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:02:26 +0100 Subject: [PATCH 37/82] skip flaky suite (#170811) --- ...t_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts index 3d92528c2eee7..dfa36e67bb030 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170811 +describe.skip( 'Unenroll agent from fleet when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, () => { From 95f9163ddb6a194a1d6b9fe882e6abb2544e3744 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:03:06 -0400 Subject: [PATCH 38/82] skip failing test suite (#170811) --- ...ent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts index dfa36e67bb030..03eef1c4337c2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts @@ -23,6 +23,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170811 +// Failing: See https://github.com/elastic/kibana/issues/170811 describe.skip( 'Unenroll agent from fleet when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, From 19f6fc1d1906e7b98874f00812c58c601adba58d Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:03:37 -0400 Subject: [PATCH 39/82] skip failing test suite (#169821) --- .../e2e/response_actions/endpoints_list_response_console.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts index 75074b0d3f94a..10a8908684577 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts @@ -20,7 +20,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/169821 +describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); From fefe90889fa02b5e1c05682d3303d7fd40fc1da1 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:05:01 +0100 Subject: [PATCH 40/82] skip flaky suite (#170817) --- ...t_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts index a9508a13f719b..7ffc7b39c373b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts @@ -22,7 +22,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170817 +describe.skip( 'Unenroll agent from fleet changing when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { From 4ba1be2b306baef0329d70710df60cff181e5fcc Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:05:35 -0400 Subject: [PATCH 41/82] skip failing test suite (#170817) --- ...ent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts index 7ffc7b39c373b..b36f7eca756e2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts @@ -23,6 +23,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170817 +// Failing: See https://github.com/elastic/kibana/issues/170817 describe.skip( 'Unenroll agent from fleet changing when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, From 5f51e05ffe561524c65314e6bd6145368be4a57c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:06:23 +0100 Subject: [PATCH 42/82] skip flaky suite (#170816) --- ...nt_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts index a5654734c15e4..bacea254e34c3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts @@ -21,7 +21,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170816 +describe.skip( 'Unenroll agent from fleet changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { From f5877fada114a443f3e699c370ed4cb8a96f6c4a Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:06:59 -0400 Subject: [PATCH 43/82] skip failing test suite (#170816) --- ...gent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts index bacea254e34c3..414f18fb1fac7 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts @@ -22,6 +22,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170816 +// Failing: See https://github.com/elastic/kibana/issues/170816 describe.skip( 'Unenroll agent from fleet changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, From d11a5e77f67a05dfd5ab5cfaac683b9ee457493c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:08:17 +0100 Subject: [PATCH 44/82] skip flaky suite (#170601) --- .../tamper_protection/enabled/uninstall_agent_from_host.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts index 527566bed608b..8f45e3d70b5e6 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts @@ -22,7 +22,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170601 +describe.skip( 'Uninstall agent from host when agent tamper protection is enabled', { tags: ['@ess'] }, () => { From 8d79cebadec8e492f252b9a786507472ac5874ee Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:08:53 -0400 Subject: [PATCH 45/82] skip failing test suite (#170601) --- .../tamper_protection/enabled/uninstall_agent_from_host.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts index 8f45e3d70b5e6..7cbcaf361a38c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts @@ -23,6 +23,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170601 +// Failing: See https://github.com/elastic/kibana/issues/170601 describe.skip( 'Uninstall agent from host when agent tamper protection is enabled', { tags: ['@ess'] }, From 33c6a6b01f515be7035411171996ff1b4b896c31 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:10:51 +0100 Subject: [PATCH 46/82] skip flaky suite (#179598) --- .../cypress/e2e/response_actions/alerts_response_console.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts index 63428ec6018d2..a9b9dc0c1f1a3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts @@ -27,7 +27,8 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/179598 +describe.skip( 'Response console: From Alerts', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { From 13bf1b02118c0cd5b7a64650a88355dbbbf1e25b Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:11:25 -0400 Subject: [PATCH 47/82] skip failing test suite (#179598) --- .../cypress/e2e/response_actions/alerts_response_console.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts index a9b9dc0c1f1a3..db1477916f75a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts @@ -28,6 +28,7 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/179598 +// Failing: See https://github.com/elastic/kibana/issues/179598 describe.skip( 'Response console: From Alerts', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, From 5b92a879577149f4b35d8701b1690e87bf4da5d8 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:12:09 +0100 Subject: [PATCH 48/82] skip flaky suite (#170563) --- .../response_actions/response_console/process_operations.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts index f7c70ebf8c7e9..0f6da6fb9fad1 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts @@ -26,7 +26,8 @@ import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_ const AGENT_BEAT_FILE_PATH_SUFFIX = '/components/agentbeat'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170563 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); From 0fdc7ecaf1708a8bf2dd74ed92d26578f35f5808 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:13:25 +0100 Subject: [PATCH 49/82] skip flaky suite (#172326) --- .../e2e/response_actions/response_console/release.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts index 47d30ad96699c..d4c72699efd32 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts @@ -27,7 +27,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/172326 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From 0702f99e8ba24ad57e4cb5bd2935ffa2c8a8435b Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:14:27 -0400 Subject: [PATCH 50/82] skip failing test suite (#172326) --- .../cypress/e2e/response_actions/response_console/release.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts index d4c72699efd32..50630b8fc1b46 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts @@ -28,6 +28,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/172326 +// Failing: See https://github.com/elastic/kibana/issues/172326 describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; From c72c714ed36ff30eb65a1114c08061cc2455f639 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:16:19 +0100 Subject: [PATCH 51/82] skip flaky suite (#168340) --- .../automated_response_actions.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index adaaf9c99059a..30a961858b52c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -20,7 +20,8 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/168340 +describe.skip( 'Automated Response Actions', { tags: ['@ess', '@serverless'], From dff298da4a88d3d2b1416b38142aed417c645a47 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:16:56 -0400 Subject: [PATCH 52/82] skip failing test suite (#168340) --- .../automated_response_actions/automated_response_actions.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 30a961858b52c..c295de7dd0b3e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -21,6 +21,7 @@ import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_dat import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; // FLAKY: https://github.com/elastic/kibana/issues/168340 +// Failing: See https://github.com/elastic/kibana/issues/168340 describe.skip( 'Automated Response Actions', { From 971c08e537f52d32e6976be965230069bdc88b9a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:17:18 +0100 Subject: [PATCH 53/82] skip flaky suite (#170424) --- .../response_actions/response_console/file_operations.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts index 70b008f7eda7b..38f442dec0e63 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170424 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); From 7e4082243dffba5f958d9dc317d642c78526a97e Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:18:40 +0100 Subject: [PATCH 54/82] skip flaky suite (#169958) --- .../public/management/cypress/e2e/endpoint_alerts.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts index 06b33141bad1b..e4f913d851735 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts @@ -19,7 +19,8 @@ import { login, ROLE } from '../tasks/login'; import { EXECUTE_ROUTE } from '../../../../common/endpoint/constants'; import { waitForActionToComplete } from '../tasks/response_actions'; -describe('Endpoint generated alerts', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/169958 +describe.skip('Endpoint generated alerts', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From 0dae7073f256a5e562a1580fd447b6b52f48845c Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:20:01 -0400 Subject: [PATCH 55/82] skip failing test suite (#169958) --- .../public/management/cypress/e2e/endpoint_alerts.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts index e4f913d851735..2de94b7ca0557 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_alerts.cy.ts @@ -20,6 +20,7 @@ import { EXECUTE_ROUTE } from '../../../../common/endpoint/constants'; import { waitForActionToComplete } from '../tasks/response_actions'; // FLAKY: https://github.com/elastic/kibana/issues/169958 +// Failing: See https://github.com/elastic/kibana/issues/169958 describe.skip('Endpoint generated alerts', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; From c630c7f21b9b860930f780723a5a85dd9f372ec4 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:21:48 +0100 Subject: [PATCH 56/82] skip flaky suite (#168284) --- .../management/cypress/e2e/endpoint_list/endpoints.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts index 4396937e57228..0aeb46b32fb43 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts @@ -28,7 +28,8 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/168284 +describe.skip('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From bac14aa30bb8a590b9be3005a3018211f0d4a303 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:22:25 -0400 Subject: [PATCH 57/82] skip failing test suite (#168284) --- .../public/management/cypress/e2e/endpoint_list/endpoints.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts index 0aeb46b32fb43..c0b12f6bd700c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts @@ -29,6 +29,7 @@ import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_dat import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; // FLAKY: https://github.com/elastic/kibana/issues/168284 +// Failing: See https://github.com/elastic/kibana/issues/168284 describe.skip('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; From 55556e252bffbe9f69023c65bd9ce6144fb9a88c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:22:44 +0100 Subject: [PATCH 58/82] skip flaky suite (#170812) --- ...ent_from_host_changing_policy_from_enabled_to_enabled.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts index d8630a50a83b9..f2397225a10a1 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts @@ -23,7 +23,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170812 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { From 520f06320c362679298dab57d6c006563dfd48a6 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:23:17 -0400 Subject: [PATCH 59/82] skip failing test suite (#170812) --- ...agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts index f2397225a10a1..d0b16f5b757ff 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts @@ -24,6 +24,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170812 +// Failing: See https://github.com/elastic/kibana/issues/170812 describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, From f77d3c9b7b1adb3e7b5f7b7576391e9d005bf96d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:24:23 +0100 Subject: [PATCH 60/82] skip flaky suite (#170373) --- .../e2e/response_actions/response_console/execute.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts index dad573bb09c2b..d43037f4d7f97 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/170373 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); From fb9c906d48bd7e626ee310e8fe67e9c242d581d8 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:28:08 +0100 Subject: [PATCH 61/82] skip flaky suite (#170667) --- .../tamper_protection/disabled/uninstall_agent_from_host.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts index ed47855ac894a..34aba3fcfccf2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170667 +describe.skip( 'Uninstall agent from host when agent tamper protection is disabled', { tags: ['@ess'] }, () => { From b8e8b5ebfec650d145ec868328aedbb861e8bf1c Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:28:41 -0400 Subject: [PATCH 62/82] skip failing test suite (#170667) --- .../tamper_protection/disabled/uninstall_agent_from_host.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts index 34aba3fcfccf2..a32932e0ed508 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts @@ -22,6 +22,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170667 +// Failing: See https://github.com/elastic/kibana/issues/170667 describe.skip( 'Uninstall agent from host when agent tamper protection is disabled', { tags: ['@ess'] }, From 908a3cd3dadf9645b9e34443be83965df1b42c47 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:29:11 +0100 Subject: [PATCH 63/82] skip flaky suite (#170604) --- ...nt_from_host_changing_policy_from_enabled_to_disabled.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts index 0768c4a49ca39..f5665d830eb4a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts @@ -23,7 +23,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170604 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { From afaae2c961a457b4d60d249cc184656639c839ee Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:29:41 -0400 Subject: [PATCH 64/82] skip failing test suite (#170604) --- ...gent_from_host_changing_policy_from_enabled_to_disabled.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts index f5665d830eb4a..665e51ea56da5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts @@ -24,6 +24,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170604 +// Failing: See https://github.com/elastic/kibana/issues/170604 describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, From b9902f6f223148859f3d28173641fcb979adf3ca Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:31:13 +0100 Subject: [PATCH 65/82] skip flaky suite (#170794) --- ...nt_from_host_changing_policy_from_disabled_to_enabled.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts index bbb675cf56d5e..6e09cd0301f9b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts @@ -24,7 +24,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170794 +describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, () => { From b0962bc124494806510b2746ee81eb75f34ef0f7 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:31:45 -0400 Subject: [PATCH 66/82] skip failing test suite (#170794) --- ...gent_from_host_changing_policy_from_disabled_to_enabled.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts index 6e09cd0301f9b..d256fb2f990b3 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts @@ -25,6 +25,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170794 +// Failing: See https://github.com/elastic/kibana/issues/170794 describe.skip( 'Uninstall agent from host changing agent policy when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, From 5e9042dd9d12be582f1cb6d7dfcabe9cf43ecefe Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:32:23 +0100 Subject: [PATCH 67/82] skip flaky suite (#170814) --- .../tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts index e0b26bc2f77dd..3edf2d1327d74 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts @@ -20,7 +20,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170814 +describe.skip( 'Unenroll agent from fleet with agent tamper protection is disabled', { tags: ['@ess'] }, () => { From 0a8fcc9d8d91eed1e0ed5531c0f9ab7368facf23 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:33:13 -0400 Subject: [PATCH 68/82] skip failing test suite (#170814) --- .../tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts index 3edf2d1327d74..3a35f49d0ddcf 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts @@ -21,6 +21,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170814 +// Failing: See https://github.com/elastic/kibana/issues/170814 describe.skip( 'Unenroll agent from fleet with agent tamper protection is disabled', { tags: ['@ess'] }, From 7fd9faec4b0815f3dbd2a3f03d5b2f18cf852d58 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Apr 2024 18:33:47 +0100 Subject: [PATCH 69/82] skip flaky suite (#170706) --- .../tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts index 17cb52c2cb042..f2aef24ad5e12 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts @@ -20,7 +20,8 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170706 +describe.skip( 'Unenroll agent from fleet when agent tamper protection is enabled', { tags: ['@ess'] }, () => { From 2b2fe3903b8cc21c77b6304340285d47693f8a60 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:34:17 -0400 Subject: [PATCH 70/82] skip failing test suite (#170706) --- .../tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts index f2aef24ad5e12..61af90092c06d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts @@ -21,6 +21,7 @@ import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; // FLAKY: https://github.com/elastic/kibana/issues/170706 +// Failing: See https://github.com/elastic/kibana/issues/170706 describe.skip( 'Unenroll agent from fleet when agent tamper protection is enabled', { tags: ['@ess'] }, From 6d06a565b79249f81f868a9d494fea5cf6903989 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Wed, 24 Apr 2024 13:23:10 -0500 Subject: [PATCH 71/82] [Console] Allow persistent console to be resizable (#180985) ## Summary Updates the Persistent console to be resizable by the user using an `EuiResizableButton` at the top of the console flyout. - Persistent console now defaults to the maximum size for the window - Top of console can be dragged to resize - On resize console size is saved to local storage and used as default - Double-clicking resize border will maximize console, or set it to 50% height if currently at the max height. https://github.com/elastic/kibana/assets/1972968/46c8da24-56c8-4bda-82f9-f9498ec209a0 --- .../embeddable/_embeddable_console.scss | 47 +----- .../containers/embeddable/_variables.scss | 7 - .../embeddable/console_resize_button.tsx | 142 ++++++++++++++++++ .../containers/embeddable/console_wrapper.tsx | 14 +- .../embeddable/embeddable_console.tsx | 96 ++++++++---- .../containers/embeddable/index.tsx | 7 +- src/plugins/console/public/index.ts | 1 - src/plugins/console/public/plugin.ts | 27 +++- .../services/embeddable_console.test.ts | 31 +++- .../public/services/embeddable_console.ts | 20 +++ .../public/types/embeddable_console.ts | 12 +- .../public/types/plugin_dependencies.ts | 4 +- 12 files changed, 297 insertions(+), 111 deletions(-) create mode 100644 src/plugins/console/public/application/containers/embeddable/console_resize_button.tsx diff --git a/src/plugins/console/public/application/containers/embeddable/_embeddable_console.scss b/src/plugins/console/public/application/containers/embeddable/_embeddable_console.scss index d7fa11e89f72d..8c00712bdaadc 100644 --- a/src/plugins/console/public/application/containers/embeddable/_embeddable_console.scss +++ b/src/plugins/console/public/application/containers/embeddable/_embeddable_console.scss @@ -38,24 +38,9 @@ animation-duration: $euiAnimSpeedNormal; animation-timing-function: $euiAnimSlightResistance; animation-fill-mode: forwards; - } - - &-isOpen.embeddableConsole--large { - animation-name: embeddableConsoleOpenPanelLarge; - height: $embeddableConsoleMaxHeight; - bottom: map-get($embeddableConsoleHeights, 'l') * -1; - } - - &-isOpen.embeddableConsole--medium { - animation-name: embeddableConsoleOpenPanelMedium; - height: map-get($embeddableConsoleHeights, 'm'); - bottom: map-get($embeddableConsoleHeights, 'm') * -1; - } - - &-isOpen.embeddableConsole--small { - animation-name: embeddableConsoleOpenPanelSmall; - height: map-get($embeddableConsoleHeights, 's'); - bottom: map-get($embeddableConsoleHeights, 's') * -1; + animation-name: embeddableConsoleOpenPanel; + height: var(--embedded-console-height); + bottom: var(--embedded-console-bottom); } } @@ -80,7 +65,6 @@ &--altViewButton-container { margin-left: auto; - // padding: $euiSizeS; } } @@ -132,34 +116,13 @@ } } -@keyframes embeddableConsoleOpenPanelLarge { - 0% { - // Accounts for the initial height offset from the top - transform: translateY(calc((#{$embeddableConsoleInitialHeight} * 3) * -1)); - } - - 100% { - transform: translateY(map-get($embeddableConsoleHeights, 'l') * -1); - } -} - -@keyframes embeddableConsoleOpenPanelMedium { - 0% { - transform: translateY(-$embeddableConsoleInitialHeight); - } - - 100% { - transform: translateY(map-get($embeddableConsoleHeights, 'm') * -1); - } -} - -@keyframes embeddableConsoleOpenPanelSmall { +@keyframes embeddableConsoleOpenPanel { 0% { transform: translateY(-$embeddableConsoleInitialHeight); } 100% { - transform: translateY(map-get($embeddableConsoleHeights, 's') * -1); + transform: translateY(var(--embedded-console-bottom)); } } diff --git a/src/plugins/console/public/application/containers/embeddable/_variables.scss b/src/plugins/console/public/application/containers/embeddable/_variables.scss index 33ecd64b999c9..9623db93b4ea7 100644 --- a/src/plugins/console/public/application/containers/embeddable/_variables.scss +++ b/src/plugins/console/public/application/containers/embeddable/_variables.scss @@ -3,10 +3,3 @@ $embeddableConsoleText: lighten(makeHighContrastColor($euiColorLightestShade, $e $embeddableConsoleBorderColor: transparentize($euiColorGhost, .8); $embeddableConsoleInitialHeight: $euiSizeXXL; $embeddableConsoleMaxHeight: calc(100vh - var(--euiFixedHeadersOffset, 0)); - -// Pixel heights ensure no blurriness caused by half pixel offsets -$embeddableConsoleHeights: ( - s: $euiSize * 30, - m: $euiSize * 50, - l: 100vh, -); diff --git a/src/plugins/console/public/application/containers/embeddable/console_resize_button.tsx b/src/plugins/console/public/application/containers/embeddable/console_resize_button.tsx new file mode 100644 index 0000000000000..0b29214594440 --- /dev/null +++ b/src/plugins/console/public/application/containers/embeddable/console_resize_button.tsx @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useCallback, useEffect, useState, useRef } from 'react'; +import { EuiResizableButton, useEuiTheme, keys, EuiThemeComputed } from '@elastic/eui'; + +const CONSOLE_MIN_HEIGHT = 200; + +const getMouseOrTouchY = ( + e: TouchEvent | MouseEvent | React.MouseEvent | React.TouchEvent +): number => { + // Some Typescript fooling is needed here + const y = (e as TouchEvent).targetTouches + ? (e as TouchEvent).targetTouches[0].pageY + : (e as MouseEvent).pageY; + return y; +}; + +export interface EmbeddedConsoleResizeButtonProps { + consoleHeight: number; + setConsoleHeight: React.Dispatch>; +} + +export function getCurrentConsoleMaxSize(euiTheme: EuiThemeComputed<{}>) { + const euiBaseSize = parseInt(euiTheme.size.base, 10); + const winHeight = window.innerHeight; + const bodyStyle = getComputedStyle(document.body); + const headerOffset = parseInt(bodyStyle.getPropertyValue('--euiFixedHeadersOffset') ?? '0px', 10); + + // We leave a buffer of baseSize to allow room for the user to hover on the top border for resizing + return Math.max(winHeight - headerOffset - euiBaseSize, CONSOLE_MIN_HEIGHT); +} + +export const EmbeddedConsoleResizeButton = ({ + consoleHeight, + setConsoleHeight, +}: EmbeddedConsoleResizeButtonProps) => { + const { euiTheme } = useEuiTheme(); + const [maxConsoleHeight, setMaxConsoleHeight] = useState(800); + const initialConsoleHeight = useRef(consoleHeight); + const initialMouseY = useRef(0); + + useEffect(() => { + function handleResize() { + const newMaxConsoleHeight = getCurrentConsoleMaxSize(euiTheme); + // Calculate and save the console max height. This is the window height minus the header + // offset minuse the base size to allow a small buffer for grabbing the resize button. + if (maxConsoleHeight !== newMaxConsoleHeight) { + setMaxConsoleHeight(newMaxConsoleHeight); + } + if (consoleHeight > newMaxConsoleHeight && newMaxConsoleHeight > CONSOLE_MIN_HEIGHT) { + // When the current console height is greater than the new max height, + // we resize the console to the max height. This will ensure there is not weird + // behavior with the drag resize. + setConsoleHeight(newMaxConsoleHeight); + } + } + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [maxConsoleHeight, euiTheme, consoleHeight, setConsoleHeight]); + const onResizeMouseMove = useCallback( + (e: MouseEvent | TouchEvent) => { + const currentMouseY = getMouseOrTouchY(e); + const mouseOffset = (currentMouseY - initialMouseY.current) * -1; + const changedConsoleHeight = initialConsoleHeight.current + mouseOffset; + + const newConsoleHeight = Math.min( + Math.max(changedConsoleHeight, CONSOLE_MIN_HEIGHT), + maxConsoleHeight + ); + + setConsoleHeight(newConsoleHeight); + }, + [maxConsoleHeight, setConsoleHeight] + ); + const onResizeMouseUp = useCallback( + (e: MouseEvent | TouchEvent) => { + initialMouseY.current = 0; + + window.removeEventListener('mousemove', onResizeMouseMove); + window.removeEventListener('mouseup', onResizeMouseUp); + window.removeEventListener('touchmove', onResizeMouseMove); + window.removeEventListener('touchend', onResizeMouseUp); + }, + [onResizeMouseMove] + ); + const onResizeMouseDown = useCallback( + (e: React.MouseEvent | React.TouchEvent) => { + initialMouseY.current = getMouseOrTouchY(e); + initialConsoleHeight.current = consoleHeight; + + // Window event listeners instead of React events are used + // in case the user's mouse leaves the component + window.addEventListener('mousemove', onResizeMouseMove); + window.addEventListener('mouseup', onResizeMouseUp); + window.addEventListener('touchmove', onResizeMouseMove); + window.addEventListener('touchend', onResizeMouseUp); + }, + [consoleHeight, onResizeMouseUp, onResizeMouseMove] + ); + const onResizeKeyDown = useCallback( + (e: React.KeyboardEvent) => { + const KEYBOARD_OFFSET = 10; + + switch (e.key) { + case keys.ARROW_UP: + e.preventDefault(); // Safari+VO will screen reader navigate off the button otherwise + setConsoleHeight((height) => Math.min(height + KEYBOARD_OFFSET, maxConsoleHeight)); + break; + case keys.ARROW_DOWN: + e.preventDefault(); // Safari+VO will screen reader navigate off the button otherwise + setConsoleHeight((height) => Math.max(height - KEYBOARD_OFFSET, CONSOLE_MIN_HEIGHT)); + } + }, + [maxConsoleHeight, setConsoleHeight] + ); + const onResizeDoubleClick = useCallback(() => { + if (consoleHeight < maxConsoleHeight) { + setConsoleHeight(maxConsoleHeight); + } else { + setConsoleHeight(maxConsoleHeight / 2); + } + }, [consoleHeight, maxConsoleHeight, setConsoleHeight]); + + return ( + + ); +}; diff --git a/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx b/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx index 6429d8894d33c..53c75706b9da0 100644 --- a/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx +++ b/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx @@ -29,10 +29,9 @@ import { History, Settings, Storage, - createStorage, createHistory, createSettings, - setStorage, + getStorage, } from '../../../services'; import { createUsageTracker } from '../../../services/tracker'; import { MetricsTracker, EmbeddableConsoleDependencies } from '../../../types'; @@ -78,11 +77,7 @@ const loadDependencies = async ( await loadActiveApi(core.http); const autocompleteInfo = getAutocompleteInfo(); - const storage = createStorage({ - engine: window.localStorage, - prefix: 'sense:', - }); - setStorage(storage); + const storage = getStorage(); const history = createHistory({ storage }); const settings = createSettings({ storage }); const objectStorageClient = localStorageObjectClient.create(storage); @@ -107,7 +102,10 @@ const loadDependencies = async ( }; interface ConsoleWrapperProps - extends Omit { + extends Omit< + EmbeddableConsoleDependencies, + 'setDispatch' | 'alternateView' | 'setConsoleHeight' | 'getConsoleHeight' + > { onKeyDown: (this: Window, ev: WindowEventMap['keydown']) => any; } diff --git a/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx b/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx index 218496b9d81ab..42a6c4b0efb92 100644 --- a/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx +++ b/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { useReducer, useEffect } from 'react'; +import React, { useReducer, useEffect, useState } from 'react'; import classNames from 'classnames'; import useObservable from 'react-use/lib/useObservable'; import { @@ -14,15 +14,17 @@ import { EuiFocusTrap, EuiPortal, EuiScreenReaderOnly, + EuiThemeComputed, EuiThemeProvider, EuiWindowEvent, keys, + useEuiTheme, + useEuiThemeCSSVariables, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { dynamic } from '@kbn/shared-ux-utility'; import { - EmbeddableConsoleProps, EmbeddableConsoleDependencies, EmbeddableConsoleView, } from '../../../types/embeddable_console'; @@ -31,6 +33,7 @@ import * as store from '../../stores/embeddable_console'; import { setLoadFromParameter, removeLoadFromParameter } from '../../lib/load_from'; import './_index.scss'; +import { EmbeddedConsoleResizeButton, getCurrentConsoleMaxSize } from './console_resize_button'; const KBN_BODY_CONSOLE_CLASS = 'kbnBody--hasEmbeddableConsole'; @@ -42,14 +45,39 @@ const ConsoleWrapper = dynamic(async () => ({ default: (await import('./console_wrapper')).ConsoleWrapper, })); +const getInitialConsoleHeight = ( + getConsoleHeight: EmbeddableConsoleDependencies['getConsoleHeight'], + euiTheme: EuiThemeComputed +) => { + const lastHeight = getConsoleHeight(); + if (lastHeight) { + try { + const value = parseInt(lastHeight, 10); + if (!isNaN(value) && value > 0) { + return value; + } + } catch { + // ignore bad local storage value + } + } + return getCurrentConsoleMaxSize(euiTheme); +}; + export const EmbeddableConsole = ({ - size = 'm', core, usageCollection, setDispatch, alternateView, isMonacoEnabled, -}: EmbeddableConsoleProps & EmbeddableConsoleDependencies) => { + getConsoleHeight, + setConsoleHeight, +}: EmbeddableConsoleDependencies) => { + const { euiTheme } = useEuiTheme(); + const { setGlobalCSSVariables } = useEuiThemeCSSVariables(); + const [consoleHeight, setConsoleHeightState] = useState( + getInitialConsoleHeight(getConsoleHeight, euiTheme) + ); + const [consoleState, consoleDispatch] = useReducer( store.reducer, store.initialValue, @@ -71,6 +99,13 @@ export const EmbeddableConsole = ({ document.body.classList.add(KBN_BODY_CONSOLE_CLASS); return () => document.body.classList.remove(KBN_BODY_CONSOLE_CLASS); }, []); + useEffect(() => { + setGlobalCSSVariables({ + '--embedded-console-height': `${consoleHeight}px`, + '--embedded-console-bottom': `-${consoleHeight}px`, + }); + setConsoleHeight(consoleHeight.toString()); + }, [consoleHeight, setGlobalCSSVariables, setConsoleHeight]); const isOpen = consoleState.view !== EmbeddableConsoleView.Closed; const showConsole = @@ -105,14 +140,10 @@ export const EmbeddableConsole = ({ const classes = classNames('embeddableConsole', { 'embeddableConsole-isOpen': isOpen, - 'embeddableConsole--large': size === 'l', - 'embeddableConsole--medium': size === 'm', - 'embeddableConsole--small': size === 's', 'embeddableConsole--classicChrome': chromeStyle === 'classic', 'embeddableConsole--projectChrome': chromeStyle === 'project', 'embeddableConsole--unknownChrome': chromeStyle === undefined, 'embeddableConsole--fixed': true, - 'embeddableConsole--showOnMobile': false, }); return ( @@ -127,27 +158,36 @@ export const EmbeddableConsole = ({

{landmarkHeading}

-
- - {i18n.translate('console.embeddableConsole.title', { - defaultMessage: 'Console', - })} - - {alternateView && ( -
- -
+
+ {isOpen && ( + )} + +
+ + {i18n.translate('console.embeddableConsole.title', { + defaultMessage: 'Console', + })} + + {alternateView && ( +
+ +
+ )} +
{showConsole ? ( diff --git a/src/plugins/console/public/application/containers/embeddable/index.tsx b/src/plugins/console/public/application/containers/embeddable/index.tsx index 0563a5f445da2..0ec32dbeaac91 100644 --- a/src/plugins/console/public/application/containers/embeddable/index.tsx +++ b/src/plugins/console/public/application/containers/embeddable/index.tsx @@ -8,12 +8,9 @@ import { dynamic } from '@kbn/shared-ux-utility'; import React from 'react'; -import { - EmbeddableConsoleProps, - EmbeddableConsoleDependencies, -} from '../../../types/embeddable_console'; +import { EmbeddableConsoleDependencies } from '../../../types/embeddable_console'; -type EmbeddableConsoleInternalProps = EmbeddableConsoleProps & EmbeddableConsoleDependencies; +type EmbeddableConsoleInternalProps = EmbeddableConsoleDependencies; const Console = dynamic(async () => ({ default: (await import('./embeddable_console')).EmbeddableConsole, })); diff --git a/src/plugins/console/public/index.ts b/src/plugins/console/public/index.ts index 4e907d4329d1e..277190a1a443c 100644 --- a/src/plugins/console/public/index.ts +++ b/src/plugins/console/public/index.ts @@ -17,7 +17,6 @@ export type { ConsoleUILocatorParams, ConsolePluginSetup, ConsolePluginStart, - EmbeddableConsoleProps, EmbeddedConsoleView, EmbeddedConsoleViewButtonProps, } from './types'; diff --git a/src/plugins/console/public/plugin.ts b/src/plugins/console/public/plugin.ts index 43cedf1fa4bb0..54d8d1db97bc7 100644 --- a/src/plugins/console/public/plugin.ts +++ b/src/plugins/console/public/plugin.ts @@ -18,18 +18,30 @@ import { ConsolePluginSetup, ConsolePluginStart, ConsoleUILocatorParams, - EmbeddableConsoleProps, EmbeddedConsoleView, } from './types'; -import { AutocompleteInfo, setAutocompleteInfo, EmbeddableConsoleInfo } from './services'; +import { + AutocompleteInfo, + setAutocompleteInfo, + EmbeddableConsoleInfo, + createStorage, + setStorage, +} from './services'; export class ConsoleUIPlugin implements Plugin { private readonly autocompleteInfo = new AutocompleteInfo(); - private _embeddableConsole: EmbeddableConsoleInfo = new EmbeddableConsoleInfo(); - - constructor(private ctx: PluginInitializerContext) {} + private _embeddableConsole: EmbeddableConsoleInfo; + + constructor(private ctx: PluginInitializerContext) { + const storage = createStorage({ + engine: window.localStorage, + prefix: 'sense:', + }); + setStorage(storage); + this._embeddableConsole = new EmbeddableConsoleInfo(storage); + } public setup( { notifications, getStartServices, http }: CoreSetup, @@ -126,9 +138,8 @@ export class ConsoleUIPlugin embeddedConsoleUiSetting; if (embeddedConsoleAvailable) { - consoleStart.EmbeddableConsole = (props: EmbeddableConsoleProps) => { + consoleStart.EmbeddableConsole = (_props: {}) => { return EmbeddableConsole({ - ...props, core, usageCollection: deps.usageCollection, setDispatch: (d) => { @@ -136,6 +147,8 @@ export class ConsoleUIPlugin }, alternateView: this._embeddableConsole.alternateView, isMonacoEnabled, + getConsoleHeight: this._embeddableConsole.getConsoleHeight.bind(this._embeddableConsole), + setConsoleHeight: this._embeddableConsole.setConsoleHeight.bind(this._embeddableConsole), }); }; consoleStart.isEmbeddedConsoleAvailable = () => diff --git a/src/plugins/console/public/services/embeddable_console.test.ts b/src/plugins/console/public/services/embeddable_console.test.ts index 7df8230b6dbdf..92cc4d8450906 100644 --- a/src/plugins/console/public/services/embeddable_console.test.ts +++ b/src/plugins/console/public/services/embeddable_console.test.ts @@ -6,12 +6,17 @@ * Side Public License, v 1. */ +import { StorageMock } from './storage.mock'; import { EmbeddableConsoleInfo } from './embeddable_console'; describe('EmbeddableConsoleInfo', () => { + jest.useFakeTimers(); + let eConsole: EmbeddableConsoleInfo; + let storage: StorageMock; beforeEach(() => { - eConsole = new EmbeddableConsoleInfo(); + storage = new StorageMock({} as unknown as Storage, 'test'); + eConsole = new EmbeddableConsoleInfo(storage); }); describe('isEmbeddedConsoleAvailable', () => { it('returns true if dispatch has been set', () => { @@ -50,4 +55,28 @@ describe('EmbeddableConsoleInfo', () => { }); }); }); + describe('getConsoleHeight', () => { + it('returns value in storage when found', () => { + storage.get.mockReturnValue('201'); + expect(eConsole.getConsoleHeight()).toEqual('201'); + expect(storage.get).toHaveBeenCalledWith('embeddedConsoleHeight', undefined); + }); + it('returns undefined when not found', () => { + storage.get.mockReturnValue(undefined); + expect(eConsole.getConsoleHeight()).toEqual(undefined); + }); + }); + describe('setConsoleHeight', () => { + it('stores value in storage', () => { + // setConsoleHeight calls are debounced + eConsole.setConsoleHeight('120'); + eConsole.setConsoleHeight('110'); + eConsole.setConsoleHeight('100'); + + jest.runAllTimers(); + + expect(storage.set).toHaveBeenCalledTimes(1); + expect(storage.set).toHaveBeenCalledWith('embeddedConsoleHeight', '100'); + }); + }); }); diff --git a/src/plugins/console/public/services/embeddable_console.ts b/src/plugins/console/public/services/embeddable_console.ts index 91bf086bc3e33..f5e0197ad833b 100644 --- a/src/plugins/console/public/services/embeddable_console.ts +++ b/src/plugins/console/public/services/embeddable_console.ts @@ -6,16 +6,28 @@ * Side Public License, v 1. */ import type { Dispatch } from 'react'; +import { debounce } from 'lodash'; import { EmbeddedConsoleAction as EmbeddableConsoleAction, EmbeddedConsoleView, } from '../types/embeddable_console'; +import { Storage } from '.'; + +const CONSOLE_HEIGHT_KEY = 'embeddedConsoleHeight'; +const CONSOLE_HEIGHT_LOCAL_STORAGE_DEBOUNCE_WAIT_TIME = 500; export class EmbeddableConsoleInfo { private _dispatch: Dispatch | null = null; private _alternateView: EmbeddedConsoleView | undefined; + constructor(private readonly storage: Storage) { + this.setConsoleHeight = debounce( + this.setConsoleHeight.bind(this), + CONSOLE_HEIGHT_LOCAL_STORAGE_DEBOUNCE_WAIT_TIME + ); + } + public get alternateView(): EmbeddedConsoleView | undefined { return this._alternateView; } @@ -38,4 +50,12 @@ export class EmbeddableConsoleInfo { public registerAlternateView(view: EmbeddedConsoleView | null) { this._alternateView = view ?? undefined; } + + public getConsoleHeight(): string | undefined { + return this.storage.get(CONSOLE_HEIGHT_KEY, undefined); + } + + public setConsoleHeight(value: string) { + this.storage.set(CONSOLE_HEIGHT_KEY, value); + } } diff --git a/src/plugins/console/public/types/embeddable_console.ts b/src/plugins/console/public/types/embeddable_console.ts index 07a801c40287b..9a31e0f1cf151 100644 --- a/src/plugins/console/public/types/embeddable_console.ts +++ b/src/plugins/console/public/types/embeddable_console.ts @@ -10,22 +10,14 @@ import type { CoreStart } from '@kbn/core/public'; import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; import type { Dispatch } from 'react'; -/** - * EmbeddableConsoleProps are optional props used when rendering the embeddable developer console. - */ -export interface EmbeddableConsoleProps { - /** - * The default height of the content area. - */ - size?: 's' | 'm' | 'l'; -} - export interface EmbeddableConsoleDependencies { core: CoreStart; usageCollection?: UsageCollectionStart; setDispatch: (dispatch: Dispatch | null) => void; alternateView?: EmbeddedConsoleView; isMonacoEnabled: boolean; + getConsoleHeight: () => string | undefined; + setConsoleHeight: (value: string) => void; } export type EmbeddedConsoleAction = diff --git a/src/plugins/console/public/types/plugin_dependencies.ts b/src/plugins/console/public/types/plugin_dependencies.ts index 03db14c181be8..63446135e7f3c 100644 --- a/src/plugins/console/public/types/plugin_dependencies.ts +++ b/src/plugins/console/public/types/plugin_dependencies.ts @@ -13,7 +13,7 @@ import { UsageCollectionSetup, UsageCollectionStart } from '@kbn/usage-collectio import { SharePluginSetup, SharePluginStart, LocatorPublic } from '@kbn/share-plugin/public'; import { ConsoleUILocatorParams } from './locator'; -import { EmbeddableConsoleProps, EmbeddedConsoleView } from './embeddable_console'; +import { EmbeddedConsoleView } from './embeddable_console'; export interface AppSetupUIPluginDependencies { home?: HomePublicPluginSetup; @@ -55,7 +55,7 @@ export interface ConsolePluginStart { /** * EmbeddableConsole is a functional component used to render a portable version of the dev tools console on any page in Kibana */ - EmbeddableConsole?: FC; + EmbeddableConsole?: FC<{}>; /** * Register an alternate view for the Embedded Console * From 7d13fbadea35072d07f6a4ca39b2460ee90d1a3a Mon Sep 17 00:00:00 2001 From: Saarika Bhasi <55930906+saarikabhasi@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:26:42 -0400 Subject: [PATCH 72/82] [Serverless Search] add readOnly and writeOnly privileges button in create api key flyout (#181472) ## Summary Add ready only and write only button to show privileges in code editor in`serverless_search` plugin in API key section https://github.com/elastic/kibana/assets/55930906/1e831194-218b-471a-9fd7-7737755e2c85 ### Checklist - [ ] 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) - [ ] [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: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../api_key/security_privileges_form.tsx | 77 ++++++++++++++++++- .../page_objects/svl_search_landing_page.ts | 2 + 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx index dcc301469837a..c647471f90e71 100644 --- a/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx @@ -5,22 +5,51 @@ * 2.0. */ -import { EuiText, EuiLink, EuiSpacer } from '@elastic/eui'; +import { + EuiText, + EuiLink, + EuiSpacer, + EuiPanel, + EuiFlexItem, + EuiFlexGroup, + EuiButtonEmpty, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { CodeEditorField } from '@kbn/code-editor'; import React from 'react'; import { docLinks } from '../../../../common/doc_links'; - +const READ_ONLY_BOILERPLATE = `{ + "read-only-role": { + "cluster": [], + "indices": [ + { + "names": ["*"], + "privileges": ["read"] + } + ] + } +}`; +const WRITE_ONLY_BOILERPLATE = `{ + "write-only-role": { + "cluster": [], + "indices": [ + { + "names": ["*"], + "privileges": ["write"] + } + ] + } +}`; interface SecurityPrivilegesFormProps { - roleDescriptors: string; onChangeRoleDescriptors: (roleDescriptors: string) => void; error?: React.ReactNode | React.ReactNode[]; + roleDescriptors: string; } export const SecurityPrivilegesForm: React.FC = ({ - roleDescriptors, onChangeRoleDescriptors, error, + roleDescriptors, }) => { return (
@@ -39,6 +68,46 @@ export const SecurityPrivilegesForm: React.FC = ({

{error}

)} + + + + +

+ {i18n.translate('xpack.serverlessSearch.apiKey.privileges.boilerplate.label', { + defaultMessage: 'Replace with boilerplate:', + })} +

+
+
+ + + onChangeRoleDescriptors(READ_ONLY_BOILERPLATE)} + > + {i18n.translate( + 'xpack.serverlessSearch.apiKey.privileges.boilerplate.readOnlyLabel', + { + defaultMessage: 'Read-only', + } + )} + + + + onChangeRoleDescriptors(WRITE_ONLY_BOILERPLATE)} + > + {i18n.translate( + 'xpack.serverlessSearch.apiKey.privileges.boilerplate.writeOnlyLabel', + { + defaultMessage: 'Write-only', + } + )} + + +
+
Date: Wed, 24 Apr 2024 15:33:29 -0400 Subject: [PATCH 73/82] [APM] add filters support to apm latency, throughput, and error rate chart apis (#181359) ## Summary Rational: We'd like to embed APM visualizations across the observability solution, particularly within the SLO alert details page at this time. SLO configuration supports unified search filters. In order to ensure that the data accurately reflects the SLO configuration, API dependencies for APM visualizations must support filters. This PR adds filters support to: 1. `GET /internal/apm/services/{serviceName}/transactions/charts/latency` 2. `GET /internal/apm/services/{serviceName}/throughput` 3. `GET /internal/apm/services/{serviceName}/transactions/charts/error_rate` It is expected that consumers of the filters param send a serialized object containing a `filter` or `must_not` clause to include on the respective ES queries. Internally, it is expected that these objects are created using the `buildQueryFromFilters` helper exposed by `kbn/es-query`, passing the `Filter` object from the unified search `SearchBar` as the the parameter. ### Testing This feature is not yet available in the UI To test, I've added api integration tests for each api, as well as jest tests for any helpers introduced. --- .../get_failed_transaction_rate.ts | 8 +- .../server/routes/default_api_types.test.ts | 42 +++ .../apm/server/routes/default_api_types.ts | 30 +++ .../server/routes/services/get_throughput.ts | 6 +- .../apm/server/routes/services/route.ts | 5 +- .../get_failed_transaction_rate_periods.ts | 4 + .../transactions/get_latency_charts/index.ts | 12 +- .../apm/server/routes/transactions/route.ts | 10 +- .../tests/services/throughput.spec.ts | 245 ++++++++++++++++++ .../tests/transactions/error_rate.spec.ts | 132 ++++++++++ .../tests/transactions/latency.spec.ts | 120 +++++++++ 11 files changed, 606 insertions(+), 8 deletions(-) create mode 100644 x-pack/plugins/observability_solution/apm/server/routes/default_api_types.test.ts diff --git a/x-pack/plugins/observability_solution/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts b/x-pack/plugins/observability_solution/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts index 08448ef50dc4b..4b1ee98c48cd3 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { BoolQuery } from '@kbn/es-query'; import { kqlQuery, rangeQuery, termQuery } from '@kbn/observability-plugin/server'; import { ApmServiceTransactionDocumentType } from '../../../common/document_type'; import { SERVICE_NAME, TRANSACTION_NAME, TRANSACTION_TYPE } from '../../../common/es_fields/apm'; @@ -22,6 +22,7 @@ import { export async function getFailedTransactionRate({ environment, kuery, + filters, serviceName, transactionTypes, transactionName, @@ -35,6 +36,7 @@ export async function getFailedTransactionRate({ }: { environment: string; kuery: string; + filters?: BoolQuery; serviceName: string; transactionTypes: string[]; transactionName?: string; @@ -62,7 +64,9 @@ export async function getFailedTransactionRate({ ...rangeQuery(startWithOffset, endWithOffset), ...environmentQuery(environment), ...kqlQuery(kuery), + ...(filters?.filter || []), ]; + const mustNot = filters?.must_not || []; const outcomes = getOutcomeAggregation(documentType); @@ -73,7 +77,7 @@ export async function getFailedTransactionRate({ body: { track_total_hits: false, size: 0, - query: { bool: { filter } }, + query: { bool: { filter, must_not: mustNot } }, aggs: { ...outcomes, timeseries: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.test.ts b/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.test.ts new file mode 100644 index 0000000000000..baeda52f7fc3c --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.test.ts @@ -0,0 +1,42 @@ +/* + * 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 { isLeft } from 'fp-ts/lib/Either'; +import { filtersRt } from './default_api_types'; + +describe('filtersRt', () => { + it('should decode', () => { + const filters = + '{"must_not":[{"term":{"service.name":"myService"}}],"filter":[{"range":{"@timestamp":{"gte":1617273600000,"lte":1617277200000}}}]}'; + const result = filtersRt.decode(filters); + expect(result).toEqual({ + _tag: 'Right', + right: { + should: [], + must: [], + must_not: [{ term: { 'service.name': 'myService' } }], + filter: [{ range: { '@timestamp': { gte: 1617273600000, lte: 1617277200000 } } }], + }, + }); + }); + + it.each(['3', 'true', '{}'])('should not decode invalid filter JSON: %s', (invalidJson) => { + const filters = `{ "filter": ${invalidJson}}`; + const result = filtersRt.decode(filters); + // @ts-ignore-next-line + expect(result.left[0].message).toEqual('filters.filter is not iterable'); + expect(isLeft(result)).toEqual(true); + }); + + it.each(['3', 'true', '{}'])('should not decode invalid must_not JSON: %s', (invalidJson) => { + const filters = `{ "must_not": ${invalidJson}}`; + const result = filtersRt.decode(filters); + // @ts-ignore-next-line + expect(result.left[0].message).toEqual('filters.must_not is not iterable'); + expect(isLeft(result)).toEqual(true); + }); +}); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.ts b/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.ts index a58a5a24af7b5..42ab1b63d431e 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/default_api_types.ts @@ -7,6 +7,8 @@ import * as t from 'io-ts'; import { isoToEpochRt, toNumberRt } from '@kbn/io-ts-utils'; +import { either } from 'fp-ts/lib/Either'; +import { BoolQuery } from '@kbn/es-query'; import { ApmDocumentType } from '../../common/document_type'; import { RollupInterval } from '../../common/rollup'; @@ -48,3 +50,31 @@ export const transactionDataSourceRt = t.type({ t.literal(RollupInterval.None), ]), }); + +const BoolQueryRt = t.type({ + should: t.array(t.record(t.string, t.unknown)), + must: t.array(t.record(t.string, t.unknown)), + must_not: t.array(t.record(t.string, t.unknown)), + filter: t.array(t.record(t.string, t.unknown)), +}); + +export const filtersRt = new t.Type( + 'BoolQuery', + BoolQueryRt.is, + (input: unknown, context: t.Context) => + either.chain(t.string.validate(input, context), (value: string) => { + try { + const filters = JSON.parse(value); + const decoded = { + should: [], + must: [], + must_not: filters.must_not ? [...filters.must_not] : [], + filter: filters.filter ? [...filters.filter] : [], + }; + return t.success(decoded); + } catch (err) { + return t.failure(input, context, err.message); + } + }), + (filters: BoolQuery): string => JSON.stringify(filters) +); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/get_throughput.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/get_throughput.ts index 5d45ea28c95e5..b5c48484e1039 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/get_throughput.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/get_throughput.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { BoolQuery } from '@kbn/es-query'; import { kqlQuery, rangeQuery, termQuery } from '@kbn/observability-plugin/server'; import { ApmServiceTransactionDocumentType } from '../../../common/document_type'; import { SERVICE_NAME, TRANSACTION_NAME, TRANSACTION_TYPE } from '../../../common/es_fields/apm'; @@ -17,6 +17,7 @@ import { Maybe } from '../../../typings/common'; interface Options { environment: string; kuery: string; + filters?: BoolQuery; serviceName: string; apmEventClient: APMEventClient; transactionType: string; @@ -34,6 +35,7 @@ export type ServiceThroughputResponse = Array<{ x: number; y: Maybe }>; export async function getThroughput({ environment, kuery, + filters, serviceName, apmEventClient, transactionType, @@ -67,7 +69,9 @@ export async function getThroughput({ ...environmentQuery(environment), ...kqlQuery(kuery), ...termQuery(TRANSACTION_NAME, transactionName), + ...(filters?.filter ?? []), ], + must_not: [...(filters?.must_not ?? [])], }, }, aggs: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts index 05fdeec8fdf5d..4b0ef92450f34 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/route.ts @@ -33,6 +33,7 @@ import { withApmSpan } from '../../utils/with_apm_span'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { environmentRt, + filtersRt, kueryRt, probabilityRt, rangeRt, @@ -495,7 +496,7 @@ const serviceThroughputRoute = createApmServerRoute({ }), query: t.intersection([ t.type({ transactionType: t.string, bucketSizeInSeconds: toNumberRt }), - t.partial({ transactionName: t.string }), + t.partial({ transactionName: t.string, filters: filtersRt }), t.intersection([environmentRt, kueryRt, rangeRt, offsetRt, serviceTransactionDataSourceRt]), ]), }), @@ -512,6 +513,7 @@ const serviceThroughputRoute = createApmServerRoute({ const { environment, kuery, + filters, transactionType, transactionName, offset, @@ -525,6 +527,7 @@ const serviceThroughputRoute = createApmServerRoute({ const commonProps = { environment, kuery, + filters, serviceName, apmEventClient, transactionType, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_failed_transaction_rate_periods.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_failed_transaction_rate_periods.ts index 5b77a780bce6a..c2ba9d1014a67 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_failed_transaction_rate_periods.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_failed_transaction_rate_periods.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { BoolQuery } from '@kbn/es-query'; import { getFailedTransactionRate } from '../../lib/transaction_groups/get_failed_transaction_rate'; import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; @@ -25,6 +26,7 @@ export interface FailedTransactionRateResponse { export async function getFailedTransactionRatePeriods({ environment, kuery, + filters, serviceName, transactionType, transactionName, @@ -38,6 +40,7 @@ export async function getFailedTransactionRatePeriods({ }: { environment: string; kuery: string; + filters?: BoolQuery; serviceName: string; transactionType: string; transactionName?: string; @@ -52,6 +55,7 @@ export async function getFailedTransactionRatePeriods({ const commonProps = { environment, kuery, + filters, serviceName, transactionTypes: [transactionType], transactionName, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_latency_charts/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_latency_charts/index.ts index f05682ca047bb..70e9555af4849 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_latency_charts/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_latency_charts/index.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { BoolQuery } from '@kbn/es-query'; import { kqlQuery, rangeQuery, termQuery } from '@kbn/observability-plugin/server'; import { ApmServiceTransactionDocumentType } from '../../../../common/document_type'; import { @@ -29,6 +29,7 @@ import { getDurationFieldForTransactions } from '../../../lib/helpers/transactio function searchLatency({ environment, kuery, + filters, serviceName, transactionType, transactionName, @@ -45,6 +46,7 @@ function searchLatency({ }: { environment: string; kuery: string; + filters?: BoolQuery; serviceName: string; transactionType: string | undefined; transactionName: string | undefined; @@ -87,7 +89,9 @@ function searchLatency({ ...termQuery(TRANSACTION_NAME, transactionName), ...termQuery(TRANSACTION_TYPE, transactionType), ...termQuery(FAAS_ID, serverlessId), + ...(filters?.filter || []), ], + must_not: filters?.must_not || [], }, }, aggs: { @@ -111,6 +115,7 @@ function searchLatency({ export async function getLatencyTimeseries({ environment, kuery, + filters, serviceName, transactionType, transactionName, @@ -127,6 +132,7 @@ export async function getLatencyTimeseries({ }: { environment: string; kuery: string; + filters?: BoolQuery; serviceName: string; transactionType?: string; transactionName?: string; @@ -144,6 +150,7 @@ export async function getLatencyTimeseries({ const response = await searchLatency({ environment, kuery, + filters, serviceName, transactionType, transactionName, @@ -195,6 +202,7 @@ export async function getLatencyPeriods({ apmEventClient, latencyAggregationType, kuery, + filters, environment, start, end, @@ -210,6 +218,7 @@ export async function getLatencyPeriods({ apmEventClient: APMEventClient; latencyAggregationType: LatencyAggregationType; kuery: string; + filters?: BoolQuery; environment: string; start: number; end: number; @@ -225,6 +234,7 @@ export async function getLatencyPeriods({ transactionName, apmEventClient, kuery, + filters, environment, documentType, rollupInterval, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/route.ts index 8e6b8a654a030..816879d7cb40a 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/route.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import { jsonRt, toBooleanRt, toNumberRt } from '@kbn/io-ts-utils'; import * as t from 'io-ts'; import { offsetRt } from '../../../common/comparison_rt'; @@ -23,6 +22,7 @@ import { import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { environmentRt, + filtersRt, kueryRt, rangeRt, serviceTransactionDataSourceRt, @@ -221,7 +221,7 @@ const transactionLatencyChartsRoute = createApmServerRoute({ bucketSizeInSeconds: toNumberRt, useDurationSummary: toBooleanRt, }), - t.partial({ transactionName: t.string }), + t.partial({ transactionName: t.string, filters: filtersRt }), t.intersection([environmentRt, kueryRt, rangeRt, offsetRt]), serviceTransactionDataSourceRt, ]), @@ -235,6 +235,7 @@ const transactionLatencyChartsRoute = createApmServerRoute({ const { environment, kuery, + filters, transactionType, transactionName, latencyAggregationType, @@ -250,6 +251,7 @@ const transactionLatencyChartsRoute = createApmServerRoute({ const options = { environment, kuery, + filters, serviceName, transactionType, transactionName, @@ -372,7 +374,7 @@ const transactionChartsErrorRateRoute = createApmServerRoute({ }), query: t.intersection([ t.type({ transactionType: t.string, bucketSizeInSeconds: toNumberRt }), - t.partial({ transactionName: t.string }), + t.partial({ transactionName: t.string, filters: filtersRt }), t.intersection([environmentRt, kueryRt, rangeRt, offsetRt, serviceTransactionDataSourceRt]), ]), }), @@ -385,6 +387,7 @@ const transactionChartsErrorRateRoute = createApmServerRoute({ const { environment, kuery, + filters, transactionType, transactionName, start, @@ -398,6 +401,7 @@ const transactionChartsErrorRateRoute = createApmServerRoute({ return getFailedTransactionRatePeriods({ environment, kuery, + filters, serviceName, transactionType, transactionName, diff --git a/x-pack/test/apm_api_integration/tests/services/throughput.spec.ts b/x-pack/test/apm_api_integration/tests/services/throughput.spec.ts index ef56e61bf4f82..624706d30115a 100644 --- a/x-pack/test/apm_api_integration/tests/services/throughput.spec.ts +++ b/x-pack/test/apm_api_integration/tests/services/throughput.spec.ts @@ -7,6 +7,7 @@ import { apm, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; +import { buildQueryFromFilters } from '@kbn/es-query'; import { first, last, meanBy } from 'lodash'; import moment from 'moment'; import { isFiniteNumber } from '@kbn/apm-plugin/common/utils/is_finite_number'; @@ -285,6 +286,250 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); }); }); + + describe('handles kuery', () => { + let throughputMetrics: ThroughputReturn; + let throughputTransactions: ThroughputReturn; + + before(async () => { + const [throughputMetricsResponse, throughputTransactionsResponse] = await Promise.all([ + callApi( + { + query: { + kuery: 'transaction.name : "GET /api/product/list"', + }, + }, + 'metric' + ), + callApi( + { + query: { + kuery: 'transaction.name : "GET /api/product/list"', + }, + }, + 'transaction' + ), + ]); + throughputMetrics = throughputMetricsResponse.body; + throughputTransactions = throughputTransactionsResponse.body; + }); + + it('returns some transactions data', () => { + expect(throughputTransactions.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputTransactions.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('returns some metrics data', () => { + expect(throughputMetrics.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputMetrics.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('has same mean value for metrics and transactions data', () => { + const transactionsMean = meanBy(throughputTransactions.currentPeriod, 'y'); + const metricsMean = meanBy(throughputMetrics.currentPeriod, 'y'); + [transactionsMean, metricsMean].forEach((value) => + expect(roundNumber(value)).to.be.equal(roundNumber(GO_PROD_RATE)) + ); + }); + + it('has a bucket size of 30 seconds for transactions data', () => { + const firstTimerange = throughputTransactions.currentPeriod[0].x; + const secondTimerange = throughputTransactions.currentPeriod[1].x; + const timeIntervalAsSeconds = (secondTimerange - firstTimerange) / 1000; + expect(timeIntervalAsSeconds).to.equal(30); + }); + + it('has a bucket size of 1 minute for metrics data', () => { + const firstTimerange = throughputMetrics.currentPeriod[0].x; + const secondTimerange = throughputMetrics.currentPeriod[1].x; + const timeIntervalAsMinutes = (secondTimerange - firstTimerange) / 1000 / 60; + expect(timeIntervalAsMinutes).to.equal(1); + }); + }); + + describe('handles filters', () => { + let throughputMetrics: ThroughputReturn; + let throughputTransactions: ThroughputReturn; + const filters = [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /api/product/list', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + + before(async () => { + const [throughputMetricsResponse, throughputTransactionsResponse] = await Promise.all([ + callApi( + { + query: { + filters: serializedFilters, + }, + }, + 'metric' + ), + callApi( + { + query: { + filters: serializedFilters, + }, + }, + 'transaction' + ), + ]); + throughputMetrics = throughputMetricsResponse.body; + throughputTransactions = throughputTransactionsResponse.body; + }); + + it('returns some transactions data', () => { + expect(throughputTransactions.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputTransactions.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('returns some metrics data', () => { + expect(throughputMetrics.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputMetrics.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('has same mean value for metrics and transactions data', () => { + const transactionsMean = meanBy(throughputTransactions.currentPeriod, 'y'); + const metricsMean = meanBy(throughputMetrics.currentPeriod, 'y'); + [transactionsMean, metricsMean].forEach((value) => + expect(roundNumber(value)).to.be.equal(roundNumber(GO_PROD_RATE)) + ); + }); + + it('has a bucket size of 30 seconds for transactions data', () => { + const firstTimerange = throughputTransactions.currentPeriod[0].x; + const secondTimerange = throughputTransactions.currentPeriod[1].x; + const timeIntervalAsSeconds = (secondTimerange - firstTimerange) / 1000; + expect(timeIntervalAsSeconds).to.equal(30); + }); + + it('has a bucket size of 1 minute for metrics data', () => { + const firstTimerange = throughputMetrics.currentPeriod[0].x; + const secondTimerange = throughputMetrics.currentPeriod[1].x; + const timeIntervalAsMinutes = (secondTimerange - firstTimerange) / 1000 / 60; + expect(timeIntervalAsMinutes).to.equal(1); + }); + }); + + describe('handles negate filters', () => { + let throughputMetrics: ThroughputReturn; + let throughputTransactions: ThroughputReturn; + const filters = [ + { + meta: { + disabled: false, + negate: true, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /api/product/list', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + + before(async () => { + const [throughputMetricsResponse, throughputTransactionsResponse] = await Promise.all([ + callApi( + { + query: { + filters: serializedFilters, + }, + }, + 'metric' + ), + callApi( + { + query: { + filters: serializedFilters, + }, + }, + 'transaction' + ), + ]); + throughputMetrics = throughputMetricsResponse.body; + throughputTransactions = throughputTransactionsResponse.body; + }); + + it('returns some transactions data', () => { + expect(throughputTransactions.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputTransactions.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('returns some metrics data', () => { + expect(throughputMetrics.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputMetrics.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('has same mean value for metrics and transactions data', () => { + const transactionsMean = meanBy(throughputTransactions.currentPeriod, 'y'); + const metricsMean = meanBy(throughputMetrics.currentPeriod, 'y'); + [transactionsMean, metricsMean].forEach((value) => + expect(roundNumber(value)).to.be.equal(roundNumber(GO_DEV_RATE)) + ); + }); + + it('has a bucket size of 30 seconds for transactions data', () => { + const firstTimerange = throughputTransactions.currentPeriod[0].x; + const secondTimerange = throughputTransactions.currentPeriod[1].x; + const timeIntervalAsSeconds = (secondTimerange - firstTimerange) / 1000; + expect(timeIntervalAsSeconds).to.equal(30); + }); + + it('has a bucket size of 1 minute for metrics data', () => { + const firstTimerange = throughputMetrics.currentPeriod[0].x; + const secondTimerange = throughputMetrics.currentPeriod[1].x; + const timeIntervalAsMinutes = (secondTimerange - firstTimerange) / 1000 / 60; + expect(timeIntervalAsMinutes).to.equal(1); + }); + }); + + describe('handles bad filters request', () => { + it('throws bad request error', async () => { + try { + await callApi({ + query: { environment: 'production', filters: '{}}' }, + }); + } catch (error) { + expect(error.res.status).to.be(400); + } + }); + }); }); }); } diff --git a/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts index 996127103b090..123bb0d6d594d 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/error_rate.spec.ts @@ -6,6 +6,7 @@ */ import { apm, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; +import { buildQueryFromFilters } from '@kbn/es-query'; import { first, last } from 'lodash'; import moment from 'moment'; import { @@ -297,5 +298,136 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); }); + + describe('handles kuery', () => { + let txMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const txMetricsResponse = await fetchErrorCharts({ + query: { + kuery: 'transaction.name : "GET /pear 🍎 "', + }, + }); + txMetricsErrorRateResponse = txMetricsResponse.body; + }); + + describe('has the correct calculation for average with kuery', () => { + const expectedFailureRate = config.secondTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + }); + + describe('handles filters', () => { + const filters = [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /pear 🍎 ', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + let txMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const txMetricsResponse = await fetchErrorCharts({ + query: { + filters: serializedFilters, + }, + }); + txMetricsErrorRateResponse = txMetricsResponse.body; + }); + + describe('has the correct calculation for average with filter', () => { + const expectedFailureRate = config.secondTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + + describe('has the correct calculation for average with negate filter', () => { + const expectedFailureRate = config.secondTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + }); + + describe('handles negate filters', () => { + const filters = [ + { + meta: { + disabled: false, + negate: true, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /pear 🍎 ', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + let txMetricsErrorRateResponse: ErrorRate; + + before(async () => { + const txMetricsResponse = await fetchErrorCharts({ + query: { + filters: serializedFilters, + }, + }); + txMetricsErrorRateResponse = txMetricsResponse.body; + }); + + describe('has the correct calculation for average with filter', () => { + const expectedFailureRate = config.firstTransaction.failureRate / 100; + + it('for tx metrics', () => { + expect(txMetricsErrorRateResponse.currentPeriod.average).to.eql(expectedFailureRate); + }); + }); + }); + + describe('handles bad filters request', () => { + it('for tx metrics', async () => { + try { + await fetchErrorCharts({ + query: { + filters: '{}}}', + }, + }); + } catch (e) { + expect(e.res.status).to.eql(400); + } + }); + }); }); } diff --git a/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts index a1cea01f408ca..eb876e6e312b7 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts @@ -6,6 +6,7 @@ */ import { apm, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; +import { buildQueryFromFilters } from '@kbn/es-query'; import moment from 'moment'; import { APIClientRequestParamsOf, @@ -115,6 +116,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { ((GO_PROD_RATE * GO_PROD_DURATION + GO_DEV_RATE * GO_DEV_DURATION) / (GO_PROD_RATE + GO_DEV_RATE)) * 1000; + const expectedLatencyAvgValueProdMs = + ((GO_PROD_RATE * GO_PROD_DURATION) / GO_PROD_RATE) * 1000; + const expectedLatencyAvgValueDevMs = ((GO_DEV_RATE * GO_DEV_DURATION) / GO_DEV_RATE) * 1000; describe('average latency type', () => { it('returns average duration and timeseries', async () => { @@ -319,6 +323,122 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); }); + + describe('handles kuery', () => { + it('should return the appropriate latency values when a kuery is applied', async () => { + const response = await fetchLatencyCharts({ + query: { + latencyAggregationType: LatencyAggregationType.p95, + useDurationSummary: false, + kuery: 'transaction.name : "GET /api/product/list"', + }, + }); + + expect(response.status).to.be(200); + const latencyChartReturn = response.body as LatencyChartReturnType; + + expect(latencyChartReturn.currentPeriod.overallAvgDuration).to.be( + expectedLatencyAvgValueProdMs + ); + expect(latencyChartReturn.currentPeriod.latencyTimeseries.length).to.be.eql(15); + }); + }); + + describe('handles filters', () => { + it('should return the appropriate latency values when filters are applied', async () => { + const filters = [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /api/product/list', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + const response = await fetchLatencyCharts({ + query: { + latencyAggregationType: LatencyAggregationType.p95, + useDurationSummary: false, + filters: serializedFilters, + }, + }); + + expect(response.status).to.be(200); + const latencyChartReturn = response.body as LatencyChartReturnType; + + expect(latencyChartReturn.currentPeriod.overallAvgDuration).to.be( + expectedLatencyAvgValueProdMs + ); + expect(latencyChartReturn.currentPeriod.latencyTimeseries.length).to.be.eql(15); + }); + + it('should return the appropriate latency values when negate filters are applied', async () => { + const filters = [ + { + meta: { + disabled: false, + negate: true, + alias: null, + key: 'transaction.name', + params: ['GET /api/product/list'], + type: 'phrases', + }, + query: { + bool: { + minimum_should_match: 1, + should: { + match_phrase: { + 'transaction.name': 'GET /api/product/list', + }, + }, + }, + }, + }, + ]; + const serializedFilters = JSON.stringify(buildQueryFromFilters(filters, undefined)); + const response = await fetchLatencyCharts({ + query: { + latencyAggregationType: LatencyAggregationType.p95, + useDurationSummary: false, + filters: serializedFilters, + }, + }); + + expect(response.status).to.be(200); + const latencyChartReturn = response.body as LatencyChartReturnType; + + expect(latencyChartReturn.currentPeriod.overallAvgDuration).to.be( + expectedLatencyAvgValueDevMs + ); + expect(latencyChartReturn.currentPeriod.latencyTimeseries.length).to.be.eql(15); + }); + }); + + describe('handles bad filters request', () => { + it('throws bad request error', async () => { + try { + await fetchLatencyCharts({ + query: { environment: 'production', filters: '{}}' }, + }); + } catch (error) { + expect(error.res.status).to.be(400); + } + }); + }); } ); } From f52db83d33735f2ce0463d510e75b81f05dab6f1 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 24 Apr 2024 14:40:47 -0500 Subject: [PATCH 74/82] Revert "Enable heap snapshots for all our distributables (#181363)" This reverts commit 26b8c71730de6686fe4fe5de5f60ab5577b79902. --- config/node.options | 4 ---- .../os_packages/docker_generator/templates/base/Dockerfile | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config/node.options b/config/node.options index 2bc49f5db1f4a..abcb40a5c19d4 100644 --- a/config/node.options +++ b/config/node.options @@ -13,7 +13,3 @@ ## enable OpenSSL 3 legacy provider --openssl-legacy-provider - -# Enable capturing heap snapshots. See https://nodejs.org/api/cli.html#--heapsnapshot-signalsignal ---heapsnapshot-signal=SIGUSR2 ---diagnostic-dir=./data \ No newline at end of file diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index 2284e504229a8..1869086b51ab7 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -157,6 +157,9 @@ COPY --chown=1000:0 config/serverless.yml /usr/share/kibana/config/serverless.ym COPY --chown=1000:0 config/serverless.es.yml /usr/share/kibana/config/serverless.es.yml COPY --chown=1000:0 config/serverless.oblt.yml /usr/share/kibana/config/serverless.oblt.yml COPY --chown=1000:0 config/serverless.security.yml /usr/share/kibana/config/serverless.security.yml +# Supportability enhancement: enable capturing heap snapshots. See https://nodejs.org/api/cli.html#--heapsnapshot-signalsignal +RUN /usr/bin/echo -e '\n--heapsnapshot-signal=SIGUSR2' >> config/node.options +RUN /usr/bin/echo '--diagnostic-dir=./data' >> config/node.options ENV PROFILER_SIGNAL=SIGUSR1 {{/serverless}} {{^opensslLegacyProvider}} From 0bce10993fdf2d75bb2b1819b807654d5d5be777 Mon Sep 17 00:00:00 2001 From: christineweng <18648970+christineweng@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:58:50 -0500 Subject: [PATCH 75/82] [Security Solution][Alert Details] Fix ancestry and same source insights (#181095) ## Summary Commit f9259faa3d3f2dfbf824fe934f2a32ae1999cbe9 address https://github.com/elastic/kibana/issues/180842 - Fields like `kibana.alert.ancestors.id` and `kibana.alert.rule.parameters.index` were previously used to fetch insights, but they are specific to alerts. To enable alerts by ancestry and alerts by same source events for non-alerts, this PR adds event id and default indices as fall back. ![image](https://github.com/elastic/kibana/assets/18648970/6691f841-5906-48f6-af80-e99c03def092) Commit bf6f8b73080987067ad126056042e145c3da372b address https://github.com/elastic/kibana/issues/181237 - There are checks to guard whether we can show as least 1 insight ([here](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx#L59)). However, the guard is only checking whether we have valid parameters, there is still a possibility that 0 alert is returned. In that case, the correlations is blank. The alert flyout avoids this scenario because there is always at least 1 alert by same source - As part of the fix above, alert by same source is now always enabled. This PR ensures we show same source insight even though no alert is found. Before ![image](https://github.com/elastic/kibana/assets/18648970/f053bf11-644f-4a5a-bfeb-5e0ce574b84c) After ![image](https://github.com/elastic/kibana/assets/18648970/a7b4d568-4c1e-413a-8dc4-ecfefd9a6a74) **How to test** - Generate some events and alerts - Go to Explore -> Host -> Events table - Expand a row details, scroll down to insights -> correlations, alerts by same source and alerts by ancestry insights should be present for applicable events (if you have endpoint security rule enabled, filter by `event.kind==alert`) - Note you need premium and above to see alerts by ancestry insight. ### 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 --- .../components/correlations_details.test.tsx | 37 +++++-------------- .../left/components/correlations_details.tsx | 27 +++++--------- ...lated_alerts_by_same_source_event.test.tsx | 13 +++++-- .../related_alerts_by_same_source_event.tsx | 6 +-- .../components/correlations_overview.test.tsx | 35 +++++++----------- .../components/correlations_overview.tsx | 33 ++++++++--------- .../components/insights_section.test.tsx | 7 ++++ ...lated_alerts_by_same_source_event.test.tsx | 11 ++++-- .../related_alerts_by_same_source_event.tsx | 3 +- ...e_show_related_alerts_by_ancestry.test.tsx | 12 ------ .../use_show_related_alerts_by_ancestry.ts | 26 +------------ ...lated_alerts_by_same_source_event.test.tsx | 14 +++++-- ...how_related_alerts_by_same_source_event.ts | 15 +++++--- 13 files changed, 97 insertions(+), 142 deletions(-) diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx index aad62c152773a..a0a147d9754d5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx @@ -27,6 +27,7 @@ import { useFetchRelatedAlertsByAncestry } from '../../shared/hooks/use_fetch_re import { useFetchRelatedAlertsBySameSourceEvent } from '../../shared/hooks/use_fetch_related_alerts_by_same_source_event'; import { useFetchRelatedCases } from '../../shared/hooks/use_fetch_related_cases'; import { mockContextValue } from '../mocks/mock_context'; +import { useTimelineDataFilters } from '../../../../timelines/containers/use_timeline_data_filters'; import { EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID } from '../../../shared/components/test_ids'; jest.mock('react-router-dom', () => { @@ -43,6 +44,11 @@ jest.mock('../../shared/hooks/use_fetch_related_alerts_by_ancestry'); jest.mock('../../shared/hooks/use_fetch_related_alerts_by_same_source_event'); jest.mock('../../shared/hooks/use_fetch_related_cases'); +jest.mock('../../../../timelines/containers/use_timeline_data_filters', () => ({ + useTimelineDataFilters: jest.fn(), +})); +const mockUseTimelineDataFilters = useTimelineDataFilters as jest.Mock; + const renderCorrelationDetails = () => { return render( @@ -62,12 +68,13 @@ const NO_DATA_MESSAGE = 'No correlations data available.'; describe('CorrelationsDetails', () => { beforeEach(() => { jest.clearAllMocks(); + mockUseTimelineDataFilters.mockReturnValue({ selectedPatterns: ['index'] }); }); it('renders all sections', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, documentId: 'event-id', indices: ['index1'] }); + .mockReturnValue({ show: true, documentId: 'event-id' }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: true, originalEventId: 'originalEventId' }); @@ -115,7 +122,7 @@ describe('CorrelationsDetails', () => { it('should render no section and show error message if show values are false', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: false, documentId: 'event-id', indices: ['index1'] }); + .mockReturnValue({ show: false, documentId: 'event-id' }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: false, originalEventId: 'originalEventId' }); @@ -142,30 +149,4 @@ describe('CorrelationsDetails', () => { ).not.toBeInTheDocument(); expect(getByText(NO_DATA_MESSAGE)).toBeInTheDocument(); }); - - it('should render no section if values are null', () => { - jest - .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, documentId: 'event-id' }); - jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: true }); - jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: true }); - jest.mocked(useShowRelatedCases).mockReturnValue(false); - jest.mocked(useShowSuppressedAlerts).mockReturnValue({ show: false, alertSuppressionCount: 0 }); - - const { queryByTestId } = renderCorrelationDetails(); - - expect( - queryByTestId(CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TABLE_TEST_ID) - ).not.toBeInTheDocument(); - expect( - queryByTestId(CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TABLE_TEST_ID) - ).not.toBeInTheDocument(); - expect( - queryByTestId(CORRELATIONS_DETAILS_BY_SESSION_SECTION_TABLE_TEST_ID) - ).not.toBeInTheDocument(); - expect(queryByTestId(CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID)).not.toBeInTheDocument(); - expect( - queryByTestId(CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_TITLE_TEST_ID) - ).not.toBeInTheDocument(); - }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx index 226fbe4d7a4d6..9c5a33a04a243 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx @@ -20,6 +20,8 @@ import { useShowRelatedAlertsBySameSourceEvent } from '../../shared/hooks/use_sh import { useShowRelatedAlertsBySession } from '../../shared/hooks/use_show_related_alerts_by_session'; import { RelatedAlertsByAncestry } from './related_alerts_by_ancestry'; import { SuppressedAlerts } from './suppressed_alerts'; +import { useTimelineDataFilters } from '../../../../timelines/containers/use_timeline_data_filters'; +import { isActiveTimeline } from '../../../../helpers'; export const CORRELATIONS_TAB_ID = 'correlations'; @@ -27,27 +29,18 @@ export const CORRELATIONS_TAB_ID = 'correlations'; * Correlations displayed in the document details expandable flyout left section under the Insights tab */ export const CorrelationsDetails: React.FC = () => { - const { - dataAsNestedObject, - dataFormattedForFieldBrowser, - eventId, - getFieldsData, - scopeId, - isPreview, - } = useLeftPanelContext(); + const { dataAsNestedObject, eventId, getFieldsData, scopeId, isPreview } = useLeftPanelContext(); + + const { selectedPatterns } = useTimelineDataFilters(isActiveTimeline(scopeId)); - const { - show: showAlertsByAncestry, - indices, - documentId, - } = useShowRelatedAlertsByAncestry({ + const { show: showAlertsByAncestry, documentId } = useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview, }); const { show: showSameSourceAlerts, originalEventId } = useShowRelatedAlertsBySameSourceEvent({ + eventId, getFieldsData, }); const { show: showAlertsBySession, entityId } = useShowRelatedAlertsBySession({ getFieldsData }); @@ -80,7 +73,7 @@ export const CorrelationsDetails: React.FC = () => { )} - {showSameSourceAlerts && originalEventId && ( + {showSameSourceAlerts && ( { )} - {showAlertsByAncestry && documentId && indices && ( + {showAlertsByAncestry && ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.test.tsx index 66902bd9bda34..e8334613d1d24 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.test.tsx @@ -94,14 +94,21 @@ describe('', () => { expect(getByTestId(CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TABLE_TEST_ID)).toBeInTheDocument(); }); - it('should render null if error', () => { + it('should render no data message if error', () => { (useFetchRelatedAlertsBySameSourceEvent as jest.Mock).mockReturnValue({ loading: false, error: true, + data: [], + dataCount: 0, + }); + (usePaginatedAlerts as jest.Mock).mockReturnValue({ + loading: false, + error: false, + data: [], }); - const { container } = renderRelatedAlertsBySameSourceEvent(); - expect(container).toBeEmptyDOMElement(); + const { getByText } = renderRelatedAlertsBySameSourceEvent(); + expect(getByText('No related source events.')).toBeInTheDocument(); }); it('should render no data message', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.tsx index e3bbf48c5fe15..42c9d910d93c6 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/related_alerts_by_same_source_event.tsx @@ -34,15 +34,11 @@ export const RelatedAlertsBySameSourceEvent: React.VFC { - const { loading, error, data, dataCount } = useFetchRelatedAlertsBySameSourceEvent({ + const { loading, data, dataCount } = useFetchRelatedAlertsBySameSourceEvent({ originalEventId, scopeId, }); - if (error) { - return null; - } - return ( ({ ExpandableFlyoutProvider: ({ children }: React.PropsWithChildren<{}>) => <>{children}, })); +jest.mock('../../../../timelines/containers/use_timeline_data_filters', () => ({ + useTimelineDataFilters: jest.fn(), +})); +const mockUseTimelineDataFilters = useTimelineDataFilters as jest.Mock; + +const originalEventId = 'originalEventId'; + describe('', () => { beforeAll(() => { jest.mocked(useExpandableFlyoutApi).mockReturnValue(flyoutContextValue); + mockUseTimelineDataFilters.mockReturnValue({ selectedPatterns: ['index'] }); }); it('should render wrapper component', () => { jest .mocked(useShowRelatedAlertsByAncestry) .mockReturnValue({ show: false, documentId: 'event-id' }); - jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: false }); + jest + .mocked(useShowRelatedAlertsBySameSourceEvent) + .mockReturnValue({ show: false, originalEventId }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: false }); jest.mocked(useShowRelatedCases).mockReturnValue(false); jest.mocked(useShowSuppressedAlerts).mockReturnValue({ show: false, alertSuppressionCount: 0 }); @@ -117,7 +128,7 @@ describe('', () => { it('should show component with all rows in expandable panel', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, documentId: 'event-id', indices: ['index1'] }); + .mockReturnValue({ show: true, documentId: 'event-id' }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: true, originalEventId: 'originalEventId' }); @@ -160,7 +171,7 @@ describe('', () => { it('should hide rows and show error message if show values are false', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: false, documentId: 'event-id', indices: ['index1'] }); + .mockReturnValue({ show: false, documentId: 'event-id' }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: false, originalEventId: 'originalEventId' }); @@ -179,24 +190,6 @@ describe('', () => { expect(getByText(NO_DATA_MESSAGE)).toBeInTheDocument(); }); - it('should hide rows if values are null', () => { - jest - .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, documentId: 'event-id' }); - jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: true }); - jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: true }); - jest.mocked(useShowRelatedCases).mockReturnValue(false); - jest.mocked(useShowSuppressedAlerts).mockReturnValue({ show: false, alertSuppressionCount: 0 }); - - const { queryByTestId, queryByText } = render(renderCorrelationsOverview(panelContextValue)); - expect(queryByTestId(RELATED_ALERTS_BY_ANCESTRY_TEST_ID)).not.toBeInTheDocument(); - expect(queryByTestId(RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID)).not.toBeInTheDocument(); - expect(queryByTestId(RELATED_ALERTS_BY_SESSION_TEST_ID)).not.toBeInTheDocument(); - expect(queryByTestId(RELATED_CASES_TEST_ID)).not.toBeInTheDocument(); - expect(queryByTestId(SUPPRESSED_ALERTS_TEST_ID)).not.toBeInTheDocument(); - expect(queryByText(NO_DATA_MESSAGE)).not.toBeInTheDocument(); - }); - it('should navigate to the left section Insights tab when clicking on button', () => { const { getByTestId } = render( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx index 6d91eabd00304..e272a058bf0da 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx @@ -24,6 +24,8 @@ import { CORRELATIONS_TEST_ID } from './test_ids'; import { useRightPanelContext } from '../context'; import { DocumentDetailsLeftPanelKey, LeftPanelInsightsTab } from '../../left'; import { CORRELATIONS_TAB_ID } from '../../left/components/correlations_details'; +import { useTimelineDataFilters } from '../../../../timelines/containers/use_timeline_data_filters'; +import { isActiveTimeline } from '../../../../helpers'; /** * Correlations section under Insights section, overview tab. @@ -31,17 +33,12 @@ import { CORRELATIONS_TAB_ID } from '../../left/components/correlations_details' * and the SummaryPanel component for data rendering. */ export const CorrelationsOverview: React.FC = () => { - const { - dataAsNestedObject, - dataFormattedForFieldBrowser, - eventId, - indexName, - getFieldsData, - scopeId, - isPreview, - } = useRightPanelContext(); + const { dataAsNestedObject, eventId, indexName, getFieldsData, scopeId, isPreview } = + useRightPanelContext(); const { openLeftPanel } = useExpandableFlyoutApi(); + const { selectedPatterns } = useTimelineDataFilters(isActiveTimeline(scopeId)); + const goToCorrelationsTab = useCallback(() => { openLeftPanel({ id: DocumentDetailsLeftPanelKey, @@ -57,18 +54,14 @@ export const CorrelationsOverview: React.FC = () => { }); }, [eventId, openLeftPanel, indexName, scopeId]); - const { - show: showAlertsByAncestry, - documentId, - indices, - } = useShowRelatedAlertsByAncestry({ + const { show: showAlertsByAncestry, documentId } = useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview, }); const { show: showSameSourceAlerts, originalEventId } = useShowRelatedAlertsBySameSourceEvent({ + eventId, getFieldsData, }); const { show: showAlertsBySession, entityId } = useShowRelatedAlertsBySession({ getFieldsData }); @@ -112,14 +105,18 @@ export const CorrelationsOverview: React.FC = () => { )} {showCases && } - {showSameSourceAlerts && originalEventId && ( + {showSameSourceAlerts && ( )} {showAlertsBySession && entityId && ( )} - {showAlertsByAncestry && documentId && indices && ( - + {showAlertsByAncestry && ( + )} ) : ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx index 71897773d801e..81f9c6d54457e 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/insights_section.test.tsx @@ -28,6 +28,7 @@ import { InsightsSection } from './insights_section'; import { useAlertPrevalence } from '../../../../common/containers/alerts/use_alert_prevalence'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; import { useExpandSection } from '../hooks/use_expand_section'; +import { useTimelineDataFilters } from '../../../../timelines/containers/use_timeline_data_filters'; jest.mock('../../../../common/containers/alerts/use_alert_prevalence'); @@ -55,6 +56,11 @@ jest.mock('react-router-dom', () => { alertIds: [], }); +jest.mock('../../../../timelines/containers/use_timeline_data_filters', () => ({ + useTimelineDataFilters: jest.fn(), +})); +const mockUseTimelineDataFilters = useTimelineDataFilters as jest.Mock; + const from = '2022-04-05T12:00:00.000Z'; const to = '2022-04-08T12:00:00.;000Z'; const selectedPatterns = 'alerts'; @@ -101,6 +107,7 @@ const renderInsightsSection = (contextValue: RightPanelContext) => describe('', () => { beforeEach(() => { + mockUseTimelineDataFilters.mockReturnValue({ selectedPatterns: ['index'] }); mockUseUserDetails.mockReturnValue([false, { userDetails: null }]); mockUseRiskScore.mockReturnValue({ data: null, isAuthorized: false }); mockUseHostDetails.mockReturnValue([false, { hostDetails: null }]); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.test.tsx index 59dfb183a1338..d52d547397789 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.test.tsx @@ -79,13 +79,18 @@ describe('', () => { expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument(); }); - it('should render null if error', () => { + it('should render 0 same source alert if error', () => { (useFetchRelatedAlertsBySameSourceEvent as jest.Mock).mockReturnValue({ loading: false, error: true, + dataCount: 0, }); - const { container } = renderRelatedAlertsBySameSourceEvent(); - expect(container).toBeEmptyDOMElement(); + const { getByTestId } = renderRelatedAlertsBySameSourceEvent(); + expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); + const value = getByTestId(VALUE_TEST_ID); + expect(value).toBeInTheDocument(); + expect(value).toHaveTextContent('0 alerts related by source event'); + expect(getByTestId(VALUE_TEST_ID)).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.tsx index e309a2e4bc93a..0c1550dbb8692 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/related_alerts_by_same_source_event.tsx @@ -31,7 +31,7 @@ export const RelatedAlertsBySameSourceEvent: React.VFC { - const { loading, error, dataCount } = useFetchRelatedAlertsBySameSourceEvent({ + const { loading, dataCount } = useFetchRelatedAlertsBySameSourceEvent({ originalEventId, scopeId, }); @@ -46,7 +46,6 @@ export const RelatedAlertsBySameSourceEvent: React.VFC; const eventId = 'event-id'; const dataAsNestedObject = mockDataAsNestedObject; -const dataFormattedForFieldBrowser = mockDataFormattedForFieldBrowser; describe('useShowRelatedAlertsByAncestry', () => { let hookResult: RenderHookResult< @@ -53,7 +51,6 @@ describe('useShowRelatedAlertsByAncestry', () => { useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview: false, }) @@ -62,7 +59,6 @@ describe('useShowRelatedAlertsByAncestry', () => { expect(hookResult.result.current).toEqual({ show: false, documentId: 'event-id', - indices: ['rule-parameters-index'], }); }); @@ -74,7 +70,6 @@ describe('useShowRelatedAlertsByAncestry', () => { useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview: false, }) @@ -83,7 +78,6 @@ describe('useShowRelatedAlertsByAncestry', () => { expect(hookResult.result.current).toEqual({ show: false, documentId: 'event-id', - indices: ['rule-parameters-index'], }); }); @@ -95,7 +89,6 @@ describe('useShowRelatedAlertsByAncestry', () => { useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview: false, }) @@ -104,7 +97,6 @@ describe('useShowRelatedAlertsByAncestry', () => { expect(hookResult.result.current).toEqual({ show: false, documentId: 'event-id', - indices: ['rule-parameters-index'], }); }); @@ -117,7 +109,6 @@ describe('useShowRelatedAlertsByAncestry', () => { useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview: false, }) @@ -126,7 +117,6 @@ describe('useShowRelatedAlertsByAncestry', () => { expect(hookResult.result.current).toEqual({ show: true, documentId: 'event-id', - indices: ['rule-parameters-index'], }); }); @@ -139,7 +129,6 @@ describe('useShowRelatedAlertsByAncestry', () => { useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview: true, }) @@ -148,7 +137,6 @@ describe('useShowRelatedAlertsByAncestry', () => { expect(hookResult.result.current).toEqual({ show: true, documentId: 'ancestors-id', - indices: ['rule-parameters-index'], }); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts index 5a3f9c4f0b657..b11485f67ae6e 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts @@ -6,14 +6,11 @@ */ import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; -import { useMemo } from 'react'; -import { find } from 'lodash/fp'; -import type { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import type { GetFieldsData } from '../../../../common/hooks/use_get_fields_data'; import { useIsInvestigateInResolverActionEnabled } from '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useLicense } from '../../../../common/hooks/use_license'; -import { ANCESTOR_ID, RULE_PARAMETERS_INDEX } from '../constants/field_names'; +import { ANCESTOR_ID } from '../constants/field_names'; import { getField } from '../utils'; export interface UseShowRelatedAlertsByAncestryParams { @@ -25,10 +22,6 @@ export interface UseShowRelatedAlertsByAncestryParams { * An object with top level fields from the ECS object */ dataAsNestedObject: Ecs; - /** - * An array of field objects with category and value - */ - dataFormattedForFieldBrowser: TimelineEventsDetailsItem[]; /** * Id of the event document */ @@ -44,10 +37,6 @@ export interface UseShowRelatedAlertsByAncestryResult { * Returns true if the user has at least platinum privilege, and if the document has ancestry data */ show: boolean; - /** - * Values of the kibana.alert.rule.parameters.index field - */ - indices?: string[]; /** * Value of the document id for fetching ancestry alerts */ @@ -60,7 +49,6 @@ export interface UseShowRelatedAlertsByAncestryResult { export const useShowRelatedAlertsByAncestry = ({ getFieldsData, dataAsNestedObject, - dataFormattedForFieldBrowser, eventId, isPreview, }: UseShowRelatedAlertsByAncestryParams): UseShowRelatedAlertsByAncestryResult => { @@ -71,24 +59,14 @@ export const useShowRelatedAlertsByAncestry = ({ const ancestorId = getField(getFieldsData(ANCESTOR_ID)) ?? ''; const documentId = isPreview ? ancestorId : eventId; - // can't use getFieldsData here as the kibana.alert.rule.parameters is different and can be nested - const originalDocumentIndex = useMemo( - () => find({ category: 'kibana', field: RULE_PARAMETERS_INDEX }, dataFormattedForFieldBrowser), - [dataFormattedForFieldBrowser] - ); const hasAtLeastPlatinum = useLicense().isPlatinumPlus(); const show = - isRelatedAlertsByProcessAncestryEnabled && - hasProcessEntityInfo && - originalDocumentIndex != null && - hasAtLeastPlatinum; + isRelatedAlertsByProcessAncestryEnabled && hasProcessEntityInfo && hasAtLeastPlatinum; return { show, documentId, - ...(originalDocumentIndex && - originalDocumentIndex.values && { indices: originalDocumentIndex.values }), }; }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx index 01a014409264c..dfbfeeccc655a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx @@ -14,22 +14,28 @@ import type { } from './use_show_related_alerts_by_same_source_event'; import { useShowRelatedAlertsBySameSourceEvent } from './use_show_related_alerts_by_same_source_event'; +const eventId = 'eventId'; + describe('useShowRelatedAlertsBySameSourceEvent', () => { let hookResult: RenderHookResult< ShowRelatedAlertsBySameSourceEventParams, ShowRelatedAlertsBySameSourceEventResult >; - it('should return false if getFieldsData returns null', () => { + it('should return eventId if getFieldsData returns null', () => { const getFieldsData = () => null; - hookResult = renderHook(() => useShowRelatedAlertsBySameSourceEvent({ getFieldsData })); + hookResult = renderHook(() => + useShowRelatedAlertsBySameSourceEvent({ getFieldsData, eventId }) + ); - expect(hookResult.result.current).toEqual({ show: false }); + expect(hookResult.result.current).toEqual({ show: true, originalEventId: 'eventId' }); }); it('should return true if getFieldsData has the correct field', () => { const getFieldsData = () => 'original_event'; - hookResult = renderHook(() => useShowRelatedAlertsBySameSourceEvent({ getFieldsData })); + hookResult = renderHook(() => + useShowRelatedAlertsBySameSourceEvent({ getFieldsData, eventId }) + ); expect(hookResult.result.current).toEqual({ show: true, originalEventId: 'original_event' }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.ts index 0d510400d5efe..2f76c74b329d1 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.ts @@ -10,6 +10,10 @@ import { ANCESTOR_ID } from '../constants/field_names'; import { getField } from '../utils'; export interface ShowRelatedAlertsBySameSourceEventParams { + /** + * Id of the event document + */ + eventId: string; /** * Retrieves searchHit values for the provided field */ @@ -24,18 +28,19 @@ export interface ShowRelatedAlertsBySameSourceEventResult { /** * Value of the kibana.alert.original_event.id field */ - originalEventId?: string; + originalEventId: string; } /** - * Returns true if document has kibana.alert.original.event.id field with values + * Returns kibana.alert.ancestors.id field or default eventId */ export const useShowRelatedAlertsBySameSourceEvent = ({ + eventId, getFieldsData, }: ShowRelatedAlertsBySameSourceEventParams): ShowRelatedAlertsBySameSourceEventResult => { - const originalEventId = getField(getFieldsData(ANCESTOR_ID)); + const originalEventId = getField(getFieldsData(ANCESTOR_ID)) ?? eventId; return { - show: originalEventId != null, - ...(originalEventId && { originalEventId }), + show: true, + originalEventId, }; }; From 60ab2cfe956dc824b336f115a3a0fe91ee093a9d Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 24 Apr 2024 14:05:19 -0600 Subject: [PATCH 76/82] PresentationPanel props hidePanelChrome (#181473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Changes 1. adds `hidePanelChrome` parameter to `ReactEmbeddableRenderer`. When true, embeddable is rendered without `PresentationPanel` wrapper 2. Removes `embeddable-explorer` plugin 3. Moves Embeddable developer example into embeddable_examples plugin 4. Creates new examples that demonstrate how to use `ReactEmbeddableRenderer` Screenshot 2024-04-23 at 5 19 18 PM Follow-up work to narrow scope of this PR 1. add key concepts to embeddable overview 2. add "Register new embeddable type" tab that details how to create a new embeddable and shows how you can add embeddable examples to dashboard 3. group embeddable examples into a single item in "Add panel" menu - to show best practices of how to keep menu clean 4. remove class based example embeddables ### Test instructions 1. start kibana with `yarn start --run-examples` 5. Open kibana menu and click "Developer examples" 6. Click "Embeddables" card and run examples --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 - examples/embeddable_examples/kibana.jsonc | 3 +- .../embeddable_examples/public/app/app.tsx | 81 +++++++++++ .../public/app/overview.tsx} | 15 +- .../public/app/render_examples.tsx | 137 ++++++++++++++++++ .../public/app/setup_app.ts | 31 ++++ examples/embeddable_examples/public/plugin.ts | 39 ++--- .../search/search_embeddable_renderer.tsx | 53 +++++++ .../public/react_embeddables/search/types.ts | 3 + examples/embeddable_examples/tsconfig.json | 4 +- examples/embeddable_explorer/README.md | 10 -- examples/embeddable_explorer/kibana.jsonc | 20 --- examples/embeddable_explorer/public/app.tsx | 123 ---------------- .../public/embeddable_panel_example.tsx | 66 --------- .../public/embeddables.png | Bin 88399 -> 0 bytes .../public/hello_world_embeddable_example.tsx | 72 --------- .../public/list_container_example.tsx | 82 ----------- .../embeddable_explorer/public/plugin.tsx | 82 ----------- examples/embeddable_explorer/tsconfig.json | 25 ---- package.json | 1 - .../interfaces/fetch/fetch.ts | 22 +-- .../react_embeddable_renderer.tsx | 10 +- .../panel_component/presentation_panel.tsx | 48 ++++-- test/examples/config.js | 1 - .../embeddables/hello_world_embeddable.ts | 37 ----- test/examples/embeddables/index.ts | 29 ---- test/examples/embeddables/list_container.ts | 32 ---- tsconfig.base.json | 2 - yarn.lock | 4 - 29 files changed, 392 insertions(+), 641 deletions(-) create mode 100644 examples/embeddable_examples/public/app/app.tsx rename examples/{embeddable_explorer/public/index.ts => embeddable_examples/public/app/overview.tsx} (50%) create mode 100644 examples/embeddable_examples/public/app/render_examples.tsx create mode 100644 examples/embeddable_examples/public/app/setup_app.ts create mode 100644 examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx delete mode 100644 examples/embeddable_explorer/README.md delete mode 100644 examples/embeddable_explorer/kibana.jsonc delete mode 100644 examples/embeddable_explorer/public/app.tsx delete mode 100644 examples/embeddable_explorer/public/embeddable_panel_example.tsx delete mode 100644 examples/embeddable_explorer/public/embeddables.png delete mode 100644 examples/embeddable_explorer/public/hello_world_embeddable_example.tsx delete mode 100644 examples/embeddable_explorer/public/list_container_example.tsx delete mode 100644 examples/embeddable_explorer/public/plugin.tsx delete mode 100644 examples/embeddable_explorer/tsconfig.json delete mode 100644 test/examples/embeddables/hello_world_embeddable.ts delete mode 100644 test/examples/embeddables/index.ts delete mode 100644 test/examples/embeddables/list_container.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0c57ef0d7dc9a..0f58444069968 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -384,7 +384,6 @@ test/plugin_functional/plugins/elasticsearch_client_plugin @elastic/kibana-core x-pack/test/plugin_api_integration/plugins/elasticsearch_client @elastic/kibana-core x-pack/plugins/embeddable_enhanced @elastic/kibana-presentation examples/embeddable_examples @elastic/kibana-presentation -examples/embeddable_explorer @elastic/kibana-presentation src/plugins/embeddable @elastic/kibana-presentation x-pack/examples/embedded_lens_example @elastic/kibana-visualizations x-pack/plugins/encrypted_saved_objects @elastic/kibana-security diff --git a/examples/embeddable_examples/kibana.jsonc b/examples/embeddable_examples/kibana.jsonc index 0788268aedf3f..08e4a02360b2c 100644 --- a/examples/embeddable_examples/kibana.jsonc +++ b/examples/embeddable_examples/kibana.jsonc @@ -14,7 +14,8 @@ "dashboard", "data", "charts", - "fieldFormats" + "fieldFormats", + "developerExamples" ], "requiredBundles": ["presentationUtil"], "extraPublicDirs": ["public/hello_world"] diff --git a/examples/embeddable_examples/public/app/app.tsx b/examples/embeddable_examples/public/app/app.tsx new file mode 100644 index 0000000000000..72c5d4f11779a --- /dev/null +++ b/examples/embeddable_examples/public/app/app.tsx @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useState } from 'react'; +import ReactDOM from 'react-dom'; + +import { AppMountParameters } from '@kbn/core-application-browser'; +import { + EuiPage, + EuiPageBody, + EuiPageHeader, + EuiPageSection, + EuiPageTemplate, + EuiSpacer, + EuiTab, + EuiTabs, +} from '@elastic/eui'; +import { Overview } from './overview'; +import { RenderExamples } from './render_examples'; + +const OVERVIEW_TAB_ID = 'overview'; +const RENDER_TAB_ID = 'render'; + +const App = () => { + const [selectedTabId, setSelectedTabId] = useState(OVERVIEW_TAB_ID); + + function onSelectedTabChanged(tabId: string) { + setSelectedTabId(tabId); + } + + function renderTabContent() { + if (selectedTabId === RENDER_TAB_ID) { + return ; + } + + return ; + } + + return ( + + + + + + + + + onSelectedTabChanged(OVERVIEW_TAB_ID)} + isSelected={OVERVIEW_TAB_ID === selectedTabId} + > + Embeddables overview + + onSelectedTabChanged(RENDER_TAB_ID)} + isSelected={RENDER_TAB_ID === selectedTabId} + > + Rendering embeddables in your application + + + + + + {renderTabContent()} + + + + + ); +}; + +export const renderApp = (element: AppMountParameters['element']) => { + ReactDOM.render(, element); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/examples/embeddable_explorer/public/index.ts b/examples/embeddable_examples/public/app/overview.tsx similarity index 50% rename from examples/embeddable_explorer/public/index.ts rename to examples/embeddable_examples/public/app/overview.tsx index 7620d1daf20f6..e074cd148f77e 100644 --- a/examples/embeddable_explorer/public/index.ts +++ b/examples/embeddable_examples/public/app/overview.tsx @@ -6,6 +6,17 @@ * Side Public License, v 1. */ -import { EmbeddableExplorerPlugin } from './plugin'; +import React from 'react'; -export const plugin = () => new EmbeddableExplorerPlugin(); +import { EuiText } from '@elastic/eui'; + +export const Overview = () => { + return ( + +

+ Embeddables are React components that manage their own state, can be serialized and + deserialized, and return an API that can be used to interact with them imperatively. +

+
+ ); +}; diff --git a/examples/embeddable_examples/public/app/render_examples.tsx b/examples/embeddable_examples/public/app/render_examples.tsx new file mode 100644 index 0000000000000..c3e9b0a79a55b --- /dev/null +++ b/examples/embeddable_examples/public/app/render_examples.tsx @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useMemo, useState } from 'react'; + +import { ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; +import { + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiSuperDatePicker, + EuiSwitch, + EuiText, + OnTimeChangeProps, +} from '@elastic/eui'; +import { BehaviorSubject, Subject } from 'rxjs'; +import { TimeRange } from '@kbn/es-query'; +import { useBatchedOptionalPublishingSubjects } from '@kbn/presentation-publishing'; +import { SearchEmbeddableRenderer } from '../react_embeddables/search/search_embeddable_renderer'; +import { SEARCH_EMBEDDABLE_ID } from '../react_embeddables/search/constants'; +import type { Api, State } from '../react_embeddables/search/types'; + +export const RenderExamples = () => { + const initialState = useMemo(() => { + return { + rawState: { + timeRange: undefined, + }, + references: [], + }; + // only run onMount + }, []); + + const parentApi = useMemo(() => { + return { + reload$: new Subject(), + timeRange$: new BehaviorSubject({ + from: 'now-24h', + to: 'now', + }), + }; + // only run onMount + }, []); + + const [api, setApi] = useState(null); + const [hidePanelChrome, setHidePanelChrome] = useState(false); + const [dataLoading, timeRange] = useBatchedOptionalPublishingSubjects( + api?.dataLoading, + parentApi.timeRange$ + ); + + return ( +
+ { + parentApi.timeRange$.next({ + from: start, + to: end, + }); + }} + onRefresh={() => { + parentApi.reload$.next(); + }} + /> + + + + + + +

+ Use ReactEmbeddableRenderer to render embeddables. +

+
+ + + {` + type={SEARCH_EMBEDDABLE_ID} + state={initialState} + parentApi={parentApi} + onApiAvailable={(newApi) => { + setApi(newApi); + }} + hidePanelChrome={hidePanelChrome} +/>`} + + + + + setHidePanelChrome(e.target.checked)} + /> + + + + + key={hidePanelChrome ? 'hideChrome' : 'showChrome'} + type={SEARCH_EMBEDDABLE_ID} + state={initialState} + parentApi={parentApi} + onApiAvailable={(newApi) => { + setApi(newApi); + }} + hidePanelChrome={hidePanelChrome} + /> +
+ + + +

To avoid leaking embeddable details, wrap ReactEmbeddableRenderer in a component.

+
+ + + {``} + + + + + +
+
+
+ ); +}; diff --git a/examples/embeddable_examples/public/app/setup_app.ts b/examples/embeddable_examples/public/app/setup_app.ts new file mode 100644 index 0000000000000..c489b603c877b --- /dev/null +++ b/examples/embeddable_examples/public/app/setup_app.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { AppMountParameters, CoreSetup } from '@kbn/core/public'; +import { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; +import type { StartDeps } from '../plugin'; + +const APP_ID = 'embeddablesApp'; +const title = 'Embeddables'; + +export function setupApp(core: CoreSetup, developerExamples: DeveloperExamplesSetup) { + core.application.register({ + id: APP_ID, + title, + visibleIn: [], + async mount(params: AppMountParameters) { + const { renderApp } = await import('./app'); + return renderApp(params.element); + }, + }); + developerExamples.register({ + appId: APP_ID, + title, + description: `Learn how to create new embeddable types and use embeddables in your application.`, + }); +} diff --git a/examples/embeddable_examples/public/plugin.ts b/examples/embeddable_examples/public/plugin.ts index e3916b8b409cb..85faad072920a 100644 --- a/examples/embeddable_examples/public/plugin.ts +++ b/examples/embeddable_examples/public/plugin.ts @@ -17,6 +17,7 @@ import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { ChartsPluginStart } from '@kbn/charts-plugin/public'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; import { HelloWorldEmbeddableFactory, HELLO_WORLD_EMBEDDABLE, @@ -45,13 +46,15 @@ import { registerAddSearchPanelAction } from './react_embeddables/search/registe import { EUI_MARKDOWN_ID } from './react_embeddables/eui_markdown/constants'; import { FIELD_LIST_ID } from './react_embeddables/field_list/constants'; import { SEARCH_EMBEDDABLE_ID } from './react_embeddables/search/constants'; +import { setupApp } from './app/setup_app'; -export interface EmbeddableExamplesSetupDependencies { +export interface SetupDeps { + developerExamples: DeveloperExamplesSetup; embeddable: EmbeddableSetup; uiActions: UiActionsStart; } -export interface EmbeddableExamplesStartDependencies { +export interface StartDeps { dataViews: DataViewsPublicPluginStart; embeddable: EmbeddableStart; uiActions: UiActionsStart; @@ -67,40 +70,31 @@ interface ExampleEmbeddableFactories { getFilterDebuggerEmbeddableFactory: () => FilterDebuggerEmbeddableFactory; } -export interface EmbeddableExamplesStart { +export interface StartApi { createSampleData: () => Promise; factories: ExampleEmbeddableFactories; } -export class EmbeddableExamplesPlugin - implements - Plugin< - void, - EmbeddableExamplesStart, - EmbeddableExamplesSetupDependencies, - EmbeddableExamplesStartDependencies - > -{ +export class EmbeddableExamplesPlugin implements Plugin { private exampleEmbeddableFactories: Partial = {}; - public setup( - core: CoreSetup, - deps: EmbeddableExamplesSetupDependencies - ) { + public setup(core: CoreSetup, { embeddable, developerExamples }: SetupDeps) { + setupApp(core, developerExamples); + this.exampleEmbeddableFactories.getHelloWorldEmbeddableFactory = - deps.embeddable.registerEmbeddableFactory( + embeddable.registerEmbeddableFactory( HELLO_WORLD_EMBEDDABLE, new HelloWorldEmbeddableFactoryDefinition() ); this.exampleEmbeddableFactories.getMigrationsEmbeddableFactory = - deps.embeddable.registerEmbeddableFactory( + embeddable.registerEmbeddableFactory( SIMPLE_EMBEDDABLE, new SimpleEmbeddableFactoryDefinition() ); this.exampleEmbeddableFactories.getListContainerEmbeddableFactory = - deps.embeddable.registerEmbeddableFactory( + embeddable.registerEmbeddableFactory( LIST_CONTAINER, new ListContainerFactoryDefinition(async () => ({ embeddableServices: (await core.getStartServices())[1].embeddable, @@ -108,16 +102,13 @@ export class EmbeddableExamplesPlugin ); this.exampleEmbeddableFactories.getFilterDebuggerEmbeddableFactory = - deps.embeddable.registerEmbeddableFactory( + embeddable.registerEmbeddableFactory( FILTER_DEBUGGER_EMBEDDABLE, new FilterDebuggerEmbeddableFactoryDefinition() ); } - public start( - core: CoreStart, - deps: EmbeddableExamplesStartDependencies - ): EmbeddableExamplesStart { + public start(core: CoreStart, deps: StartDeps): StartApi { registerCreateFieldListAction(deps.uiActions); registerReactEmbeddableFactory(FIELD_LIST_ID, async () => { const { getFieldListFactory } = await import( diff --git a/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx b/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx new file mode 100644 index 0000000000000..0fa6e785b72c1 --- /dev/null +++ b/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useEffect, useMemo } from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { TimeRange } from '@kbn/es-query'; +import { ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; +import type { Api, State } from './types'; +import { SEARCH_EMBEDDABLE_ID } from './constants'; + +interface Props { + timeRange?: TimeRange; +} + +export function SearchEmbeddableRenderer(props: Props) { + const initialState = useMemo(() => { + return { + rawState: { + timeRange: undefined, + }, + references: [], + }; + // only run onMount + }, []); + + const parentApi = useMemo(() => { + return { + timeRange$: new BehaviorSubject(props.timeRange), + }; + // only run onMount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + parentApi.timeRange$.next(props.timeRange); + }, [props.timeRange, parentApi.timeRange$]); + + return ( +
+ + type={SEARCH_EMBEDDABLE_ID} + state={initialState} + parentApi={parentApi} + hidePanelChrome={true} + /> +
+ ); +} diff --git a/examples/embeddable_examples/public/react_embeddables/search/types.ts b/examples/embeddable_examples/public/react_embeddables/search/types.ts index 5ba940b2d40b0..dffe119eee7a0 100644 --- a/examples/embeddable_examples/public/react_embeddables/search/types.ts +++ b/examples/embeddable_examples/public/react_embeddables/search/types.ts @@ -19,6 +19,9 @@ import { } from '@kbn/presentation-publishing'; export interface State { + /* + * Time range only applied to this embeddable, overrides parentApi.timeRange$ + */ timeRange: TimeRange | undefined; } diff --git a/examples/embeddable_examples/tsconfig.json b/examples/embeddable_examples/tsconfig.json index 0225005262720..1165c05b189ad 100644 --- a/examples/embeddable_examples/tsconfig.json +++ b/examples/embeddable_examples/tsconfig.json @@ -29,6 +29,8 @@ "@kbn/core-lifecycle-browser", "@kbn/presentation-util-plugin", "@kbn/unified-field-list", - "@kbn/presentation-containers" + "@kbn/presentation-containers", + "@kbn/core-application-browser", + "@kbn/developer-examples-plugin" ] } diff --git a/examples/embeddable_explorer/README.md b/examples/embeddable_explorer/README.md deleted file mode 100644 index 0425790f07487..0000000000000 --- a/examples/embeddable_explorer/README.md +++ /dev/null @@ -1,10 +0,0 @@ -## Embeddable explorer - -This example app shows how to: - - Create a basic "hello world" embeddable - - Create embeddables that accept inputs and use an EmbeddableRenderer - - Nest embeddables inside a container - - Dynamically add children to embeddable containers - - Work with the EmbeddablePanel component - -To run this example, use the command `yarn start --run-examples`. diff --git a/examples/embeddable_explorer/kibana.jsonc b/examples/embeddable_explorer/kibana.jsonc deleted file mode 100644 index 3279a7ef92f51..0000000000000 --- a/examples/embeddable_explorer/kibana.jsonc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "plugin", - "id": "@kbn/embeddable-explorer-plugin", - "owner": "@elastic/kibana-presentation", - "description": "Example app that relies on registered functionality in the embeddable_examples plugin", - "plugin": { - "id": "embeddableExplorer", - "server": false, - "browser": true, - "requiredPlugins": [ - "uiActions", - "inspector", - "embeddable", - "embeddableExamples", - "developerExamples", - "dashboard", - "kibanaReact" - ] - } -} diff --git a/examples/embeddable_explorer/public/app.tsx b/examples/embeddable_explorer/public/app.tsx deleted file mode 100644 index 1d1938c8dbebd..0000000000000 --- a/examples/embeddable_explorer/public/app.tsx +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { BrowserRouter as Router, withRouter, RouteComponentProps } from 'react-router-dom'; -import { Route } from '@kbn/shared-ux-router'; -import { EuiPageTemplate, EuiSideNav } from '@elastic/eui'; -import { EmbeddableStart } from '@kbn/embeddable-plugin/public'; -import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { Start as InspectorStartContract } from '@kbn/inspector-plugin/public'; -import { AppMountParameters, CoreStart, IUiSettingsClient, OverlayStart } from '@kbn/core/public'; -import { EmbeddableExamplesStart } from '@kbn/embeddable-examples-plugin/public/plugin'; -import { HelloWorldEmbeddableExample } from './hello_world_embeddable_example'; -import { ListContainerExample } from './list_container_example'; -import { EmbeddablePanelExample } from './embeddable_panel_example'; - -interface PageDef { - title: string; - id: string; - component: React.ReactNode; -} - -type NavProps = RouteComponentProps & { - navigateToApp: CoreStart['application']['navigateToApp']; - pages: PageDef[]; -}; - -const Nav = withRouter(({ history, navigateToApp, pages }: NavProps) => { - const navItems = pages.map((page) => ({ - id: page.id, - name: page.title, - onClick: () => history.push(`/${page.id}`), - 'data-test-subj': page.id, - })); - - return ( - - ); -}); - -interface Props { - basename: string; - navigateToApp: CoreStart['application']['navigateToApp']; - embeddableApi: EmbeddableStart; - uiActionsApi: UiActionsStart; - overlays: OverlayStart; - notifications: CoreStart['notifications']; - inspector: InspectorStartContract; - uiSettingsClient: IUiSettingsClient; - embeddableExamples: EmbeddableExamplesStart; -} - -const EmbeddableExplorerApp = ({ - basename, - navigateToApp, - embeddableApi, - embeddableExamples, -}: Props) => { - const pages: PageDef[] = [ - { - title: 'Render embeddable', - id: 'helloWorldEmbeddableSection', - component: ( - - ), - }, - { - title: 'Groups of embeddables', - id: 'listContainerSection', - component: ( - - ), - }, - { - title: 'Context menu', - id: 'embeddablePanelExample', - component: ( - - ), - }, - ]; - - const routes = pages.map((page, i) => ( - page.component} /> - )); - - return ( - - - -